diff --git a/404.html b/404.html index 752e836c2..df8ceb99d 100644 --- a/404.html +++ b/404.html @@ -28,8 +28,8 @@ } LearnData-开源笔记 - - + + + diff --git a/DailyRoutine.html b/DailyRoutine.html index 88710f668..adc6af953 100644 --- a/DailyRoutine.html +++ b/DailyRoutine.html @@ -28,8 +28,8 @@ } 每日仪式 | LearnData-开源笔记 - - + + +
  • 使用 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 v3.1.2
    + diff --git a/Fitness.html b/Fitness.html index fb3ac93cb..46abb672d 100644 --- a/Fitness.html +++ b/Fitness.html @@ -28,8 +28,8 @@ } 健身计划 | LearnData-开源笔记 - - + + +
    跳至主要內容

    健身计划

    约 3159 字大约 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 v3.1.2
    + diff --git a/apps/Applist.html b/apps/Applist.html index 276250db6..c8b999895 100644 --- a/apps/Applist.html +++ b/apps/Applist.html @@ -28,8 +28,8 @@ } 必备应用 | LearnData-开源笔记 - - + + +
    跳至主要內容

    必备应用

    约 1999 字大约 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(无损放大) & 智图

    音频视频

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

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

    视频播放:Potplayeropen in new window & ZY Playeropen 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(命令行式哔哩哔哩下载器)

    影视管理:tinyMediaManageropen in new window(刮削),易影视(本地管理)

    屏幕录制

    录屏直播: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 & Thunderbird(邮箱) & 飞书 & Slack & 钉耙 & 千牛 & 阿里旺旺

    下载:Aria2open in new window & IDM & Kinhdown & FDM(不支持 ed2k、磁力) & 迅雷

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

    压缩:Bandizip & PeaZip & 好压

    PDF:Sumatra PDF & PDFelement & PDF 补丁丁open in new window(书签)& 文电通 & 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(阻止系统更新)

    低频工具

    编程工具:MobaXTermopen in new window(SSH+FTP)、GitHubDesktop、He3 工具箱、Postman、FileZilla(FTP)、DBeaver(数据库open in new window)、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]

    LittleBigMouseopen in new window:实现 Windows 多显示器鼠标平滑移动。

    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:主显示屏中,非全屏状态下,快速将窗口局部化。如何默认不全屏;应用不自动吸边?
    • TheBrain:可以把知识无限扩充,都连接在一起。但将工作流导图放入 TheBrain 后发现并不合适,比较适合更细化的内容?介绍参考善用佳软张玉新老师 · TheBrain ≠ 思维导图——运用 TheBrain 的三个阶段open in new window
    • Markdown 批量翻译:
      • GT4Topen in new window(不推荐):可进行批量文件翻译,支持 Markdown。将文件夹拖入 GT4T 文件翻译器,即可翻译该文件下及子文件夹下的所有所选类型的文件。但似乎只能商用,添加自己的 API,依然提示付费。
      • Markdown Docs Translatoropen in new window:开源免费,但使用网页版接口进行翻译,速度较慢,且很容易出现问题而中断。

    部分应用推荐来自 @vector090。


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

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/ChatGPT.html b/apps/ChatGPT.html index b2efdd4c3..f07ee408d 100644 --- a/apps/ChatGPT.html +++ b/apps/ChatGPT.html @@ -28,8 +28,8 @@ } ChatGPT | LearnData-开源笔记 - - + + +
    跳至主要內容

    ChatGPT

    约 5163 字大约 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 v3.1.2
    + diff --git a/apps/Chrome.html b/apps/Chrome.html index 2695494a7..0aea3fe1b 100644 --- a/apps/Chrome.html +++ b/apps/Chrome.html @@ -27,9 +27,9 @@ document.documentElement.setAttribute("data-theme", "dark"); } - Chrome 扩展 | LearnData-开源笔记 - - + Chrome 扩展 | LearnData-开源笔记 + + +
    跳至主要內容

    Chrome 扩展

    约 1197 字大约 4 分钟...

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

    浏览器

    标签页

    链接批量

    图片视频

    监视爬虫

    网页优化

    实用工具

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/design.html b/apps/design.html index 985a00953..4b66b24ab 100644 --- a/apps/design.html +++ b/apps/design.html @@ -28,8 +28,8 @@ } 平面设计 | LearnData-开源笔记 - - + + +
    跳至主要內容

    平面设计

    约 1629 字大约 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 功能:

    • Logseq Canvas:操作最接近为原版 Excalidraw,将 Logseq 功能内嵌入 Excalidraw。唯一的缺点是没有分组功能。

    • Obsidian Canvas:可以将图片、视频、文本、网页、文件和 Excalidraw 聚合在一起,并建立连接线和分组,类似于简化版 FigJam。(个人使用足够了)

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

    • Figma:FigJam 与其他白板类似,图样多很多,但功能差异不大,用得越来越少了。

    一些页面图标路径是隐藏的,无法在前端获取,可以使用 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

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

    • 阿里巴巴普惠体open in new window:简称「Alibaba PuHuiTi 3.0」,免费可商用,覆盖包括中英文等 178 个语种。
    • 阿里妈妈数黑体open in new window:简称「Alimama ShuHeiTi」,数黑体为中文简体字库,适用于电商、广告、品牌形象、推广物料等场景。另外,阿里妈妈东方大楷的字体非常漂亮,适合 PPT 标题。
    • 思源字体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 v3.1.2
    + diff --git a/apps/devdocs/index.html b/apps/devdocs/index.html index 880fdab60..2a4f8bc16 100644 --- a/apps/devdocs/index.html +++ b/apps/devdocs/index.html @@ -28,8 +28,8 @@ } Devdocs | LearnData-开源笔记 - - + + +
    跳至主要內容

    Devdocs

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/devdocs/json-translate.html b/apps/devdocs/json-translate.html index c99aec047..624758d39 100644 --- a/apps/devdocs/json-translate.html +++ b/apps/devdocs/json-translate.html @@ -28,8 +28,8 @@ } JsonTranslate 实用指南:怎样让你的项目说上 13 种语言? | LearnData-开源笔记 - - + + +

    目前,JsonTranslate 无法处理包含点(.)的 JSON 键名。这是因为点号在 JSONPath 中用于区分嵌套对象的键名,使得含点的键名可能被误解为多层嵌套对象。为避免这一问题,建议使用不含点的键名。

    结语

    JsonTranslate 是一款适合小型项目和个人开发者的多语言 JSON 翻译工具。它以简单直观的操作和对多种翻译 API 的支持,帮助用户高效处理多语言翻译任务。虽然不能与专业的全站自动化翻译工具如 Crowdin 相媲美,但对于那些追求便利性、面临有限资源或只需处理少量翻译任务的用户来说,JsonTranslate 提供了一种实用且易于上手的解决方案。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/index.html b/apps/index.html index 3602516db..fd27bb0d7 100644 --- a/apps/index.html +++ b/apps/index.html @@ -28,8 +28,8 @@ } Apps | LearnData-开源笔记 - - + + +
    跳至主要內容

    Apps

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/livestreaming/0_live_equipments.html b/apps/livestreaming/0_live_equipments.html index 74855cebc..f039546d8 100644 --- a/apps/livestreaming/0_live_equipments.html +++ b/apps/livestreaming/0_live_equipments.html @@ -28,8 +28,8 @@ } 直播入门攻略零 | 硬件篇:直播设备 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

    工具直播约 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 v3.1.2
    + diff --git a/apps/livestreaming/1_obs_basic.html b/apps/livestreaming/1_obs_basic.html index d8d1c242f..84eea1121 100644 --- a/apps/livestreaming/1_obs_basic.html +++ b/apps/livestreaming/1_obs_basic.html @@ -28,8 +28,8 @@ } 直播入门攻略一 | OBS 篇:OBS 30 新手指南 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

    工具OBS直播约 2739 字大约 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。
    直播输出设置

    音频

    点击「设置」>「音频」>「通用」,将声道设为单声道。除非你是歌唱主播,否则无需使用立体声。注意,如果你要使用监听或外放 OBS 声音,声道也需要使用立体声。

    视频

    点击「设置」>「视频」,按需设置直播分辨率,通常为 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 v3.1.2
    + diff --git a/apps/livestreaming/2_obs_streamfx.html b/apps/livestreaming/2_obs_streamfx.html index 457bc9663..a2b247c96 100644 --- a/apps/livestreaming/2_obs_streamfx.html +++ b/apps/livestreaming/2_obs_streamfx.html @@ -28,8 +28,8 @@ } 直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

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

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

    安装 StreamFX

    访问 StreamFX 发布页open in new window,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.mdopen in new window 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 MonoLogueChi/obs-StreamFX-buildopen in new window

    在升级插件前,请按照卸载教程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 Linear 和 Dual Filtering。建议将类型设置为「Dual Filtering(双重过滤)」,大小设为 5。应用蒙版后,可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。如果只需要对部分区域进行模糊,勾选「应用蒙版」并适量设置「羽化区域」(如 10),以避免模糊边缘显得过于突出。

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

    动态蒙版

    动态蒙版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 v3.1.2
    + diff --git a/apps/livestreaming/3_obs_plugins.html b/apps/livestreaming/3_obs_plugins.html index 9c9e8e612..976c8a38e 100644 --- a/apps/livestreaming/3_obs_plugins.html +++ b/apps/livestreaming/3_obs_plugins.html @@ -28,8 +28,8 @@ } 直播入门攻略三 | 插件篇:OBS 进阶插件 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

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

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

    插件安装与卸载

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

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

    Move

    Moveopen in new window:原名 Move transition,用来记录来源的位置和尺寸变化,生成元素移动的动画效果。比如,视频演讲时,将摄像头位置从屏幕中央移动到右下,并放大摄像头。

    Transition Table

    Transition Tableopen in new window:转场特效,设定不同场景间的动态切换效果。如果没有使用本场景,不同插件切换是特别生硬的直切,但现在可以使用延时、从左到右等切换滤镜。

    自动切换场景

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

    Scene as Transition

    Scene as Transitionopen in new window:使用场景作为过渡。

    Source Clone

    Source Cloneopen in new window:将源添加到 OBS,以便您克隆源以允许与原始源不同的过滤器。

    Aitum Vertical

    Aitum Verticalopen in new window:将直播垂直化。

    多平台直播

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

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

    StreamUP OBS Plugin

    StreamUP OBS Pluginopen in new window:用于检查 OBS 插件的更新。该插件的注册和下载过程较为繁琐,需进行两次注册。升级后的下载包是绿色版,你只需将其解压至默认路径 C:\Program Files\obs-studio 即可。

    滤镜插件

    Composite Blur

    Composite Bluropen in new window:全面的模糊插件,比 streamfx 更加强大。推荐模糊方式选择「Dual Filtering(双重过滤)」或是「Pixelate(像素化)」。

    Pixel Art

    Pixel Artopen in new window:为来源添加像素化的滤镜,非常适合复古风格。

    Gradient Source

    Gradient Sourceopen in new window:渐变色来源蒙版。

    声音滤镜

    声音滤镜通过软件方法使声音更专业。建议配置如下:[1]

    • 增益(Gain):如果麦克风音量已最大但讲话声未达黄色区末端,则用增益加强效果。
    • 噪音抑制(Noise Suppression):优先选择 N 卡效果,如无,使用内置效果。
    • 扩展效果(Expander):降低低音量部分的音量,用于减少噪声或其他不希望的低音量声音。
    • 压缩器(Compressor):降低高音量部分的音量,有助于控制音频中的峰值,使整体声音更加均衡和一致。
    • 限幅(Limiter):限制音频信号的最大音量,确保它不会超过设定的阈值。这通常用于防止音频削峰或失真,尤其是在音量非常高的情况下。默认阈值是 -6dB。
    • Own3d Pro plugin for OBSopen in new window:调整声音的高中低频,改变音色。
    • Audio Monitoropen in new window:将来源声音输出给指定设备播放,方便单独调节音量,能让主播与观众听到不同的音频效果。

    其他

    美化插件

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

    如果你使用的是 NVIDIA 显卡,推荐安装 NVIDIA Broadcastopen in new window。你还需要分别下载 Audio Effects 和 Video Effects。这样可以确保在 OBS 中直接使用各种效果滤镜,比如降噪和去背景等功能。此外,在 Windows 设置的「系统 > 显示 > 显卡 > 默认图形设置」中,务必关闭「硬件加速 GPU 计划」选项。如果不关闭,OBS 将无法显示 NVIDIA 的音效滤镜。原因是硬件加速 GPU 和 NVIDIA 音效滤镜同时启用可能会导致 OBS 崩溃。

    弃用插件

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

    更多

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


    1. Make Any Mic Sound Expensive In OBS | Mic Settings & Filters (2023)open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/livestreaming/4_live_effects.html b/apps/livestreaming/4_live_effects.html index 587c4c817..6760fada8 100644 --- a/apps/livestreaming/4_live_effects.html +++ b/apps/livestreaming/4_live_effects.html @@ -28,8 +28,8 @@ } 直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

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

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

    美颜

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

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

    使用注意

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

    变声

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

    虚拟主播

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

    FaceRig

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

    FaceRig 演示图
    FaceRig 演示图

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

    PrprLive

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

    Snap Camera(已下架)

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

    Snap Camera 效果图
    Snap Camera 效果图

    Snap Camera 不知为何已经被 Snap 从产品线中移除了,只能用 FaceRig、PrprLive 或其他插件。

    动态素材

    为了丰富直播场景,可以使用带绿幕的视频来添加动态特效,或者借助类虚拟主播技术来实现交互。例如 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 入门。另外,小葫芦软件似乎都已下架,目前是使用第三方链接。

    咩播云插件

    咩播open in new window 不仅能美化软件,现在还支持弹幕展示。该云插件仅支持 B 站、斗鱼和虎牙平台。如果在其他平台直播,则需要使用咩播应用版。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/livestreaming/5_live_platforms.html b/apps/livestreaming/5_live_platforms.html index f18b8bd98..fbb5ae00d 100644 --- a/apps/livestreaming/5_live_platforms.html +++ b/apps/livestreaming/5_live_platforms.html @@ -28,8 +28,8 @@ } 直播入门攻略五 | 平台篇:主流直播平台介绍 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

    工具直播约 1094 字大约 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 v3.1.2
    + diff --git a/apps/livestreaming/6_live_positioning.html b/apps/livestreaming/6_live_positioning.html index e5feab2dc..7f20d509e 100644 --- a/apps/livestreaming/6_live_positioning.html +++ b/apps/livestreaming/6_live_positioning.html @@ -28,8 +28,8 @@ } 直播入门攻略六 | 技巧篇:直播定位与策划 | LearnData-开源笔记 - - + + +
    跳至主要內容

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

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

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

    直播定位

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

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

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

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

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

    开播时间

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

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

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

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

    直播策划

    选题

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

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

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

    标题

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

    标题要素:

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

    预告

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

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

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

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

    环境

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

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

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

    直播互动

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

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

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

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

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

    开播锻炼

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

    总结

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

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/livestreaming/index.html b/apps/livestreaming/index.html index 610e41f75..3768529fc 100644 --- a/apps/livestreaming/index.html +++ b/apps/livestreaming/index.html @@ -28,8 +28,8 @@ } Livestreaming | LearnData-开源笔记 - - + + +
    跳至主要內容

    Livestreaming

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/toolbox.html b/apps/toolbox.html index 744ae0f1c..2d3936544 100644 --- a/apps/toolbox.html +++ b/apps/toolbox.html @@ -28,8 +28,8 @@ } 开源工具 | LearnData-开源笔记 - - + + +
    跳至主要內容

    开源工具

    约 470 字大约 2 分钟...

    开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。

    • 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:可以部署在网页的轻型客服系统?是否有其他开源选项。
    • tinyldopen in new window:一个 JS 库,用来判断一段文字是什么语言(汉语、英语、日语等等)。
    • Documateopen in new window:用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/QTTabBar.html b/apps/tutorials/QTTabBar.html index b918d1c6c..40484af1a 100644 --- a/apps/tutorials/QTTabBar.html +++ b/apps/tutorials/QTTabBar.html @@ -28,8 +28,8 @@ } QTTabBar | LearnData-开源笔记 - - + + +
    跳至主要內容

    QTTabBar

    约 795 字大约 3 分钟...

    QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBaropen in new window(闭源,更新慢),另一个是国内反编译出的开源 QTTabBaropen in new window

    目前两个版本都存在相同问题,菜单栏是灰色的选不了 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 会自动启动。

    1. Windows11 安装 qttabbaropen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/feishu.html b/apps/tutorials/feishu.html index d967b4dee..f47774fe2 100644 --- a/apps/tutorials/feishu.html +++ b/apps/tutorials/feishu.html @@ -28,8 +28,8 @@ } 飞书迁移记录 | LearnData-开源笔记 - - + + +
    跳至主要內容

    飞书迁移记录

    工具约 1704 字大约 6 分钟...

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    飞书文档

    知识库

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    表格

    相较于 Excel,飞书表格更加方便实用,同时在线文档编辑也更为便捷。例如,我的作息时间表就采用了飞书表格,并不时地进行更新。

    收集表

    在数据收集方面,飞书多维表格非常方便,而且支持嵌入网页,每月还提供 200 次的自定义推送通知。我打算继续在飞书上使用这一功能,不过机器人通知会转移到 Discord 客户端。

    飞书邮箱

    飞书邮箱简单易用且功能强大,支持设置多个别名邮箱,还能为第三方邮箱客户端生成专用密码,并统计创建和最后使用的时间。

    飞书邮箱设置
    飞书邮箱设置

    目前,我的飞书邮箱是博客和自托管服务的联系邮箱。因为这部分的使用频率较低,我设置了邮件自动转发到主力邮箱,避免需要登录查看。需要注意的是,自动转发功能需要在管理后台进行设置开启,否则该选项将不可见。

    如果你的域名邮箱不需要大量发送邮件,我仍然推荐使用飞书邮箱。毕竟,大多数国外域名邮箱需要付费,而国内其他邮箱的体验也相当一般。比如阿里邮箱,它连免费额度限制也不公开,客服回复「阿里邮箱对发件人所发邮件有一定的频率和数量上的限制,包括每分钟、每小时、每日,若超过相应的发信量限制,系统会拒发并报错。其中,以上频率或数量的限制数值属于阿里云阿里邮箱保密数据,因为安全原因无法对外提供。」

    飞书捷径

    打开飞书捷径,却发现名称显示「飞书机器人助手」,不清楚两者到底是什么关系。改版后,飞书捷径不再支持海外链接,同时对第三方服务的支持也减少了。

    不过,飞书捷径仍然支持个人免费使用。与之前的流程不同的是,你需要先建立机器人应用并发布,然后才能创建机器人指令。务必确保应用已发布,否则相关指令将无法触发。

    原计划中,我打算通过飞书捷径将国内服务的通知转发到 Discord,以实现统一的通知管理。然而,在测试中发现,飞书捷径机器人无法将群消息作为触发节点。虽然飞书群组机器人能接收通知,但捷径机器人却无法读取这些通知,从而无法继续转发。

    目前,我只能将飞书捷径用于轻量表格记录,例如,在接收通知消息后,通过触发飞书捷径的 webhook,将消息添加到飞书表格中。然而,添加这个功能时发现,只有企业版才能修改表格内容,并需要企业版管理员开通“飞书机器人助手”应用。但飞书捷径的名称不是显示为“飞书机器人助手”吗?对于个人用户来说,这个逻辑相当奇怪。

    未开通机器人助手会提示错误

    Webhook 通知

    我之前的 Webhook 通知是通过飞书群组机器人实现的。替代方法非常简单,只需将飞书的 webhook 替换为其他服务的链接即可。大多数通知机器人都支持 webhook,如 Telegram、Slack、Discord 等。

    以 Discord 通知为例,只需将链接 https://open.feishu.cn/open-apis/bot/v2/hook/******* 替换为 https://discord.com/api/webhooks/***/******

    如果你的服务器或容器不支持发送海外链接,可以使用部署在海外服务器上的 n8nopen in new window 来转接 webhook 消息。

    n8n 转接 webhook 消息
    n8n 转接 webhook 消息

    其他

    • 飞书 OKR:由于我之前使用较少,直接放弃。
    • 飞书妙记:妙计用于音视频转文字,而妙记在桌面端已经被 Whisper 替代,我偶尔还会在手机端使用它进行语音转文字。

    更多

    飞书在产品设计和体验方面表现相当不错。然而,飞书的改版使其产品逻辑全面向企业用户,要求所有接口均需企业管理员授权,导致免费和轻度企业用户流失严重。

    飞书最初依靠免费和轻度企业用户的口碑打响了名声,很难说改版会大幅改良它的营收状况。我最初完全投入飞书是从少数派社群开始的。然而,社群停止后,我对飞书的使用频率也在下降。当然,个人认为少数派飞书社群的关闭是一个双输。虽然飞书节省了免费用户的开销,但流失了大量早期用户和口碑。而自从少数派迁移到内部社群后,少数派的会员对我来说变得不那么重要,会员社区的访问也大大减少了。少数派会员的价值只剩每周一次的会员社区通讯。

    Hummer 评论称,「浪费这么多时间,还不如省下来时间多赚钱,继续用飞书提高效率」。这一观点方向上无疑没错的。然而,飞书的问题不仅在于其收费方案,而在于功能限制和不合理的功能削减。在我实际使用中,从未超出免费额度,但现在一些实用功能已被移除。想通过飞书提高效率、节约时间并增加收入,前提是这些功能需要存在。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/index.html b/apps/tutorials/index.html index 09f3d8fcb..f7d896a37 100644 --- a/apps/tutorials/index.html +++ b/apps/tutorials/index.html @@ -28,8 +28,8 @@ } Tutorials | LearnData-开源笔记 - - + + +
    跳至主要內容

    Tutorials

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/logseq.html b/apps/tutorials/logseq.html index 6524da696..3f0e3d138 100644 --- a/apps/tutorials/logseq.html +++ b/apps/tutorials/logseq.html @@ -28,8 +28,8 @@ } Logseq | LearnData-开源笔记 - - + + +
    1. How to Set Up an Automated Daily Template in Logseqopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/obsidian.html b/apps/tutorials/obsidian.html index aa30026f3..0fb7406d2 100644 --- a/apps/tutorials/obsidian.html +++ b/apps/tutorials/obsidian.html @@ -28,8 +28,8 @@ } Obsidian | LearnData-开源笔记 - - + + +

    Easy Typing

    Easy Typing 是一个 Obsidian 的书写体验增强插件,自动格式化书写,比如自动在中英文之间添加空格,英文首字母大写,标点与文本间智能空格。

    不过双拼容易出错,需要开启「行模式」。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/power-automate.html b/apps/tutorials/power-automate.html index 133c851e4..2e5202901 100644 --- a/apps/tutorials/power-automate.html +++ b/apps/tutorials/power-automate.html @@ -28,8 +28,8 @@ } Power Automate | LearnData-开源笔记 - - + + +
    跳至主要內容

    Power Automate

    约 820 字大约 3 分钟...

    Power Automateopen in new window 自动化应用,分为桌面流和云端流open in new window,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Actions。

    Automa 因为有可视化界面,所以最近很多,但在我看来它的功能太弱。

    桌面流本身并没有触发器,因此只能手动执行。付费的组织账户可以自动执行桌面流,比如:云端流调用桌面流,通过 URL 运行桌面流open in new window。Power Automate 安装有商店版和 exe 应用open in new window两种方式,各自有些 Bug。

    云端流可以自动、即时或通过计划触发自动化。登录云端流时,一开始要求用工作账户登录,但后来我开通了 Microsoft Teamsopen in new window,就可以用个人账户,暂不清楚是否有因果关系。[1]

    与个人账户相比,组织账户仅仅多了一些按钮和试用提示,并没有明显区别。简单来说,组织账户有付费的权利,其他功能都相同。

    使用技巧

    • 遇到捕获了元素但执行时却报错的情况,可以尝试自带的记录器。它比手动选择元素要死板,钉死了要点击的元素,但能确保执行成功率。

    • 使用「循环」和「等待」实现半自动执行工作流。如果某些条件并不清晰,可通过第三方网页来设置条件,如特殊网页设置的特殊文本。[2]

    报错重置

    如果遇到程序自身的报错,点击「设置」>「应用」>「应用和功能」中找到 Power Automate Desktop 应用,并点击「重置」后试试看。

    创建 Microsoft 组织账户

    微软的众多服务都需要组织账户,个人账号经常被拒绝登录。而创建微软组织账户最简单的方法是注册为微软合作伙伴open in new window

    1. 加入 Microsoft 合作伙伴网络open in new window
    2. 进入后会问「你希望如何与 Microsoft 合作」,安全起见我选择「合作伙伴」,进入下一页后点「创作工作账户」。
    3. 账户信息除手机和备用邮件外可以随便填,通过手机验证码后,点「继续」,然后等几分钟,就会收到注册成功通知,你也成为有组织的人了。

    如果你有 Azure 账户,可以直接在 Azure 中为组织创建新的租户open in new window

    管理组织用户

    若要给其他人多添加几个账号,则可以通过 Azureopen in new window 来管理。

    进入「管理 Azure Active Directory」>「用户」,添加和管理组织用户。


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

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

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/apps/tutorials/vscode.html b/apps/tutorials/vscode.html index d40d57680..70eaaaecb 100644 --- a/apps/tutorials/vscode.html +++ b/apps/tutorials/vscode.html @@ -28,8 +28,8 @@ } VS Code | LearnData-开源笔记 - - + + +
    跳至主要內容

    VS Code

    约 774 字大约 3 分钟...

    利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。

    写作辅助

    • AutoCorrect:这个插件是写作纠错的佼佼者,特别是在处理中英文混排时的空格问题,但它尚未支持中英标点符号的自动转换。
    • Pangu-Markdown:对于想在 Markdown 文档中为超链接和文本之间自动添加空格的用户来说,这个插件是个不错的选择。它也能够在中英文字符之间添加空格,从而优化 Markdown 文档的排版。但 Pangu-Markdown 需要手动唤起命令面板,并应用 Pangu Format 来格式化文本。

    Markdown 增强

    • Markdown All in One:提供了全面的 Markdown 支持,使写作变得更加高效。
    • Markdown Preview Enhanced:这个插件提供了 Markdown 文件的增强预览功能。
    • markdownlint:用于 Markdown 语法的检查和修正。通过自定义设置,例如在配置文件中添加 "markdownlint.config": { "MD034": false },可以关闭某些可能与其他项目(如 docusaurus3)冲突的特性。
    • Word Count CJK:中英文字符计数工具。

    界面美化

    • Blockman:能够突出显示代码中的嵌套块,增强代码的可读性。如果插件会报错 Error:invalid syntax,则在设置中搜索 N25,关闭 Blockman:N25 Analyze Tags[1]
    • Color Highlight:将 CSS 颜色代码直观地显示为相应的颜色。
    • indent-rainbow:通过使用四种不同颜色交替显示,对文本前的缩进进行可视化处理。
    • Prettier:使用定制规则重新格式化代码,以实现一致的代码风格。建议开启文件保存时自动格式化文本的功能。
    • Image Preview:提供文件内的图片预览功能,支持 CSS 和 SVG 格式。
    • vscode-icons:根据文件类型显示相应的图标,使文件浏览更直观。
    • File Nesting Updater:利用 VS Code 的文件嵌套功能,使文件树结构更加整洁。

    代码补全

    • Auto Rename Tag:在重命名一个标签时,自动重命名 HTML 标签的开始和结束标签。避免只修改了开始标签,而忘记修改结束标签。该扩展适用于 HTML、XML、PHP 和 JavaScript。
    • Auto Close Tag:自动输入标签的闭合,提高编码效率。
    • Code Spell Checker:在 VSCode 中检查代码拼写错误,支持变量、函数和注释等。它还允许用户添加自定义词汇,适应特定项目的需求。
    • Path Intellisense:自动补全文件路径,尤其在导入文件时,能够快速提示并完成文件名的输入。

    1. Bug: commented RegExp throws invalid syntax erroropen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/article/index.html b/article/index.html index 2f19b496f..656768749 100644 --- a/article/index.html +++ b/article/index.html @@ -28,8 +28,8 @@ } 文章 | LearnData-开源笔记 - - + + + diff --git a/assets/css/9556.styles.716cbfad.css b/assets/css/3374.styles.49ef18b2.css similarity index 100% rename from assets/css/9556.styles.716cbfad.css rename to assets/css/3374.styles.49ef18b2.css diff --git a/assets/css/100.styles.f1830dd1.css b/assets/css/4483.styles.a777bbcc.css similarity index 100% rename from assets/css/100.styles.f1830dd1.css rename to assets/css/4483.styles.a777bbcc.css diff --git a/assets/css/6336.styles.823afb19.css b/assets/css/6392.styles.d715ebea.css similarity index 100% rename from assets/css/6336.styles.823afb19.css rename to assets/css/6392.styles.d715ebea.css diff --git a/assets/css/styles.46b00e8d.css b/assets/css/styles.46b00e8d.css deleted file mode 100644 index c34410a94..000000000 --- a/assets/css/styles.46b00e8d.css +++ /dev/null @@ -1,30 +0,0 @@ -html[data-theme=dark]{--text-color:#b0aeb7;--bg-color:#252232;--bg-color-secondary:#2c293d;--bg-color-tertiary:#3a3755;--border-color:#302d28;--box-shadow:#282a32;--card-shadow:rgba(0, 0, 0, 0.3);--black:#fff;--dark-grey:#999;--light-grey:#666;--white:#000;--grey3:#bbb;--grey12:#333;--grey14:#111;--bg-color-light:#2c293d;--bg-color-back:#252232;--bg-color-float:#2c293d;--bg-color-blur:rgba(37, 34, 50, 0.9);--bg-color-float-blur:rgba(44, 41, 61, 0.9);--text-color-light:#b8b6be;--text-color-lighter:#c0bec5;--text-color-bright:#d0ced4;--border-color-light:#2e2b26;--border-color-dark:#3c3832}:root{--theme-color:#3eaf7c;--text-color:#2c3e50;--bg-color:#fff;--bg-color-secondary:#f8f8f8;--bg-color-tertiary:#efeef4;--border-color:#eaecef;--box-shadow:#f0f1f2;--card-shadow:rgba(0, 0, 0, 0.15);--black:#000;--dark-grey:#666;--light-grey:#999;--white:#fff;--grey3:#333;--grey12:#bbb;--grey14:#eee;--navbar-height:3.75rem;--navbar-horizontal-padding:1.5rem;--navbar-vertical-padding:0.7rem;--navbar-mobile-height:3.25rem;--navbar-mobile-horizontal-padding:1rem;--navbar-mobile-vertical-padding:0.5rem;--sidebar-width:18rem;--sidebar-mobile-width:16rem;--content-width:780px;--home-page-width:1160px;--font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", SimSun, sans-serif;--font-family-heading:Georgia Pro, Crimson, Georgia, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", SimSun, sans-serif;--font-family-mono:Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--line-numbers-width:2.5rem;--color-transition:0.3s ease;--transform-transition:0.3s ease;--vp-bg:var(--bg-color);--vp-bgl:var(--bg-color-light);--vp-bglt:var(--bg-color-tertiary);--vp-c:var(--text-color);--vp-cl:var(--text-color-light);--vp-clt:var(--text-color-lighter);--vp-brc:var(--border-color);--vp-brcd:var(--border-color-dark);--vp-tc:var(--theme-color);--vp-tcl:var(--theme-color-light);--vp-ct:var(--color-transition);--vp-tt:var(--transform-transition);--bg-color-light:#fff;--bg-color-back:#f8f8f8;--bg-color-float:#fff;--bg-color-blur:rgba(255, 255, 255, 0.9);--bg-color-float-blur:rgba(255, 255, 255, 0.9);--text-color-light:#3a5169;--text-color-lighter:#476582;--text-color-bright:#6a8bad;--border-color-light:#eceef1;--border-color-dark:#cfd4db;--theme-color-dark:#389e70;--theme-color-light:#4abf8a;--theme-color-mask:rgba(62, 175, 124, 0.15)} -.font-icon{display:inline-block}.theme-hope-content .font-icon{vertical-align:middle} -:root{--badge-tip-color:#42b983;--badge-warning-color:#f4cd00;--badge-danger-color:#f55;--badge-info-color:#0295ff;--badge-note-color:#666}.vp-badge{display:inline-block;vertical-align:center;height:18px;padding:0 6px;border-radius:3px;background:var(--vp-tc);color:var(--white);font-size:14px;line-height:18px;transition:background var(--vp-ct),color var(--vp-ct)}.vp-badge+.vp-badge{margin-inline-start:5px}h1 .vp-badge,h2 .vp-badge,h3 .vp-badge,h4 .vp-badge,h5 .vp-badge,h6 .vp-badge{vertical-align:top}.vp-badge.tip{background:var(--badge-tip-color)}.vp-badge.warning{background:var(--badge-warning-color)}.vp-badge.danger{background:var(--badge-danger-color)}.vp-badge.info{background:var(--badge-info-color)}.vp-badge.note{background:var(--badge-note-color)} -@media print{.bilibili-desc a{display:block}}.bilibili-iframe{margin:8px 0;border:0;border-radius:8px}@media print{.bilibili-iframe{display:none}} -media-community-skin[data-audio]{--audio-brand:var(--vp-tc);--audio-bg:var(--vp-bg);--audio-controls-color:var(--dark-grey);--audio-title-color:var(--vp-c);--audio-time-muted-color:var(--light-grey);--audio-play-button-bg:var(--vp-bglt);--audio-play-button-color:var(--black)}:where(media-community-skin[data-audio] [part~=media-ui]){box-shadow:2px 2px 10px 0 var(--card-shadow)}media-community-skin[data-video]{--video-brand:var(--vp-tc)} -@media screen{.sr-only{position:absolute;overflow:hidden;clip:rect 0,0,0,0;width:1px;height:1px;margin:-1px;padding:0;border:0}}@media print{.sr-only{display:none}} -@charset "UTF-8";.vp-catalog-wrapper{margin-top:8px;margin-bottom:8px}.vp-catalog-wrapper.index .vp-catalogs,.vp-catalog-wrapper.index ol,.vp-catalogs.deep{padding-inline-start:0}.vp-catalog-wrapper.index .vp-catalog,.vp-catalog-wrapper.index li{list-style-type:none}.vp-catalog-wrapper.index .vp-catalog-title::before{content:"§"counter(catalog-item,upper-roman)" "}.vp-catalog-wrapper.index .vp-child-catalogs{counter-reset:child-catalog}.vp-catalog-wrapper.index .vp-child-catalog{counter-increment:child-catalog}.vp-catalog-wrapper.index .vp-child-catalog .vp-catalog-title::before{content:counter(catalog-item)"."counter(child-catalog)" "}.vp-catalog-wrapper.index .vp-sub-catalogs{padding-inline-start:.5rem}.vp-catalogs{margin:0;counter-reset:catalog-item}.vp-catalogs.deep .vp-catalog{list-style-type:none}.vp-catalogs .font-icon{vertical-align:baseline;margin-inline-end:.25rem}.vp-catalog{counter-increment:catalog-item}.vp-catalog-main-title{margin-top:calc(.5rem - var(--navbar-height, 3.6rem));margin-bottom:.5rem;padding-top:var(--navbar-height, 3.6rem);font-weight:500;font-size:1.75rem}.vp-catalog-main-title:first-child{margin-bottom:.5rem!important}.vp-catalog-child-title.has-children:only-child,.vp-catalog-main-title:only-child{margin-bottom:0!important}.vp-catalog-main-title .vp-link{text-decoration:none!important}.vp-catalog-child-title{margin-bottom:.5rem!important}.vp-catalog-child-title.has-children{margin-top:calc(.5rem - var(--navbar-height, 3.6rem));padding-top:var(--navbar-height, 3.6rem);border-bottom:1px solid var(--catalog-border-color);font-weight:500;font-size:1.3rem;transition:border-color .3s}.vp-catalog-child-title .vp-link{text-decoration:none!important}.vp-catalog-sub-title{font-weight:500;font-size:1.1rem}.vp-catalog-sub-title:only-child{margin-bottom:0!important}.vp-catalog-title{color:inherit;text-decoration:none}.vp-catalog-title:hover{color:var(--catalog-active-color)}.vp-child-catalogs{margin:0}.vp-child-catalog{list-style-type:disc}.vp-sub-catalogs{counter-reset:sub-catalog}.vp-sub-catalog{counter-increment:sub-catalog}.vp-sub-catalog .vp-link::before{content:counter(catalog-item)"."counter(child-catalog)"."counter(sub-catalog)" "}.vp-sub-catalogs-wrapper{display:flex;flex-wrap:wrap}.vp-sub-catalog-link{display:inline-block;margin:4px 8px;padding:4px 8px;border-radius:6px;background-color:var(--catalog-bg-secondary-color);line-height:1.5;overflow-wrap:break-word;transition:background-color .3s,color .3s}.vp-sub-catalog-link:hover{background-color:var(--catalog-hover-color);color:var(--catalog-bg-color);text-decoration:none!important}.vp-catalog-header-anchor{font-size:.85em;float:left;margin-left:-1em;padding-right:0;margin-top:.125em;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-decoration:none;content:"¶"}@media print{.vp-catalog-header-anchor{display:none}}h2:hover .vp-catalog-header-anchor,h3:hover .vp-catalog-header-anchor{opacity:1;text-decoration:none}.vp-catalog-header-anchor:focus-visible{opacity:1}.vp-empty-catalog{font-size:1.25rem;text-align:center} -:root{--catalog-bg-color:#fff;--catalog-bg-secondary-color:#f8f8f8;--catalog-border-color:#e5e5e5;--catalog-active-color:#3eaf7c;--catalog-hover-color:#71cda3} -.vp-back-to-top-button{position:fixed!important;bottom:4rem;inset-inline-end:1rem;z-index:100;width:3rem;height:3rem;padding:.5rem;border-width:0;border-radius:50%;background:var(--back-to-top-bg-color);color:var(--back-to-top-color);box-shadow:2px 2px 10px 4px var(--back-to-top-shadow);cursor:pointer}@media (max-width:959px){.vp-back-to-top-button{width:2.5rem;height:2.5rem}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-color-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:100%;height:100%;background:currentcolor;border-radius:50%;-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;right:-2px;bottom:-2px;width:calc(100% + 4px);height:calc(100% + 4px)}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;fill:none;stroke:currentColor;transform:rotate(-90deg);transform-origin:50% 50%;r:22;stroke-dasharray:0% 314.1593%;stroke-width:3px}@media (max-width:959px){.vp-scroll-progress circle{r:18}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0} -:root{--back-to-top-z-index:5;--back-to-top-icon:url(/assets/img/back-to-top.bdc03142.svg);--back-to-top-bg-color:#fff;--back-to-top-color:#3eaf7c;--back-to-top-color-hover:#71cda3;--back-to-top-shadow:rgb(0 0 0 / 20%)} -:root{--external-link-icon-color:#aaa} -.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}@media print{.external-link-icon{display:none}}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none} -:root{--nprogress-color:#29d;--nprogress-z-index:1031} -#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px} -:root{--waline-font-size:1rem;--waline-white:#fff;--waline-light-grey:#999;--waline-dark-grey:#666;--waline-theme-color:#27ae60;--waline-active-color:#2ecc71;--waline-color:#444;--waline-bg-color:#fff;--waline-bg-color-light:#f8f8f8;--waline-bg-color-hover:#f0f0f0;--waline-border-color:#ddd;--waline-disable-bg-color:#f8f8f8;--waline-disable-color:#000;--waline-code-bg-color:#282c34;--waline-bq-color:#f0f0f0;--waline-avatar-size:3.25rem;--waline-m-avatar-size:calc(var(--waline-avatar-size) * 9 / 13);--waline-badge-color:#3498db;--waline-badge-font-size:0.75em;--waline-info-bg-color:#f8f8f8;--waline-info-color:#999;--waline-info-font-size:0.625em;--waline-border:1px solid var(--waline-border-color);--waline-avatar-radius:50%;--waline-box-shadow:none}[data-waline]{font-size:var(--waline-font-size);text-align:start}[dir=rtl] [data-waline]{direction:rtl}[data-waline] *{box-sizing:content-box;line-height:1.75}[data-waline] p{color:var(--waline-color)}[data-waline] a{position:relative;display:inline-block;color:var(--waline-theme-color);text-decoration:none;word-break:break-word;cursor:pointer}[data-waline] a:hover{color:var(--waline-active-color)}[data-waline] img{max-width:100%;max-height:400px;border:0}[data-waline] hr{margin:.825em 0;border-style:dashed;border-color:var(--waline-bg-color-light)}[data-waline] code,[data-waline] pre{margin:0;padding:.2em .4em;border-radius:3px;background:var(--waline-bg-color-light);font-size:85%}[data-waline] pre{overflow:auto;padding:10px;line-height:1.45}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar,[data-waline] pre::-webkit-scrollbar{width:6px;height:6px}[data-waline] pre::-webkit-scrollbar-track-piece:horizontal{border-radius:6px;background:rgba(0,0,0,.1)}[data-waline] pre::-webkit-scrollbar-thumb:horizontal{width:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-btn,[data-waline] pre code{background:0 0;color:var(--waline-color)}[data-waline] pre code{padding:0;white-space:pre-wrap;word-break:keep-all}[data-waline] blockquote{margin:.5em 0;padding:.5em 0 .5em 1em;border-inline-start:8px solid var(--waline-bq-color);color:var(--waline-dark-grey)}[data-waline] blockquote>p{margin:0}[data-waline] ol,[data-waline] ul{margin-inline-start:1.25em;padding:0}[data-waline] input[type=checkbox],[data-waline] input[type=radio]{display:inline-block;vertical-align:middle;margin-top:-2px}.wl-btn{display:inline-block;vertical-align:middle;min-width:2.5em;margin-bottom:0;padding:.5em 1em;border:1px solid var(--waline-border-color);border-radius:.5em;font-weight:400;font-size:.75em;line-height:1.5;text-align:center;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition-duration:.4s;touch-action:manipulation}.wl-btn:active,.wl-btn:hover{border-color:var(--waline-theme-color);color:var(--waline-theme-color)}.wl-btn:disabled{border-color:var(--waline-border-color);background:var(--waline-disable-bg-color);color:var(--waline-disable-color);cursor:not-allowed}.wl-btn.primary{border-color:var(--waline-theme-color);background:var(--waline-theme-color);color:var(--waline-white)}.wl-btn.primary:active,.wl-btn.primary:hover{border-color:var(--waline-active-color);background:var(--waline-active-color);color:var(--waline-white)}.wl-btn.primary:disabled{border-color:var(--waline-border-color);background:var(--waline-disable-bg-color);color:var(--waline-disable-color);cursor:not-allowed}.wl-content p.wl-tex,.wl-header label,.wl-loading{text-align:center}.wl-loading svg{margin:0 auto}.wl-comment{position:relative;display:flex;margin-bottom:.75em}.wl-close{position:absolute;top:-4px;inset-inline-end:-4px;padding:0;border:0;background:0 0;line-height:1;cursor:pointer}.wl-login-info{max-width:80px;margin-top:.75em;text-align:center}.wl-logout-btn{position:absolute;top:-10px;inset-inline-end:-10px;padding:3px;border:0;background:0 0;line-height:0;cursor:pointer}.wl-avatar,.wl-avatar img{border-radius:var(--waline-avatar-radius)}.wl-avatar{position:relative;width:var(--waline-avatar-size);height:var(--waline-avatar-size);margin:0 auto;border:var(--waline-border)}@media (max-width:720px){.wl-avatar{width:var(--waline-m-avatar-size);height:var(--waline-m-avatar-size)}}.wl-avatar img{width:100%;height:100%}.wl-login-nick{display:block;color:var(--waline-theme-color);font-size:.75em;word-break:break-all}.wl-panel{position:relative;flex-shrink:1;width:100%;margin:.5em;border:var(--waline-border);border-radius:.75em;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow)}.wl-header{display:flex;overflow:hidden;padding:0 4px;border-bottom:2px dashed var(--waline-border-color);border-top-left-radius:.75em;border-top-right-radius:.75em}@media (max-width:580px){.wl-header{display:block}}.wl-header label{min-width:40px;padding:.75em .5em;color:var(--waline-color);font-size:.75em}.wl-header input{flex:1;width:0;padding:.5em;background:0 0;font-size:.625em;resize:none}.wl-header-item{display:flex;flex:1}@media (max-width:580px){.wl-header-item:not(:last-child){border-bottom:2px dashed var(--waline-border-color)}}.wl-header-1 .wl-header-item{width:100%}.wl-header-2 .wl-header-item{width:50%}@media (max-width:580px){.wl-header-2 .wl-header-item{flex:0;width:100%}}.wl-header-3 .wl-header-item{width:33.33%}@media (max-width:580px){.wl-header-3 .wl-header-item{width:100%}}.wl-editor{position:relative;width:calc(100% - 1em);min-height:8.75em;margin:.75em .5em;border-radius:.5em;background:0 0;font-size:.875em;resize:vertical}.wl-editor,.wl-input{max-width:100%;border:0;color:var(--waline-color);outline:0;transition:all .25s ease}.wl-editor:focus,.wl-input:focus{background:var(--waline-bg-color-light)}.wl-preview{padding:0 .5em .5em}.wl-preview h4{margin:.25em;font-weight:700;font-size:.9375em}.wl-preview .wl-content{min-height:1.25em;padding:.25em;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.wl-preview .wl-content>:first-child{margin-top:0}.wl-preview .wl-content>:last-child{margin-bottom:0}.wl-footer{position:relative;display:flex;flex-wrap:wrap;margin:.5em .75em}.wl-actions{display:flex;flex:2;align-items:center}.wl-action{display:inline-flex;align-items:center;justify-content:center;width:1.5em;height:1.5em;margin:2px;padding:0;border:0;background:0 0;color:var(--waline-color);font-size:16px;cursor:pointer}.wl-action:hover{color:var(--waline-theme-color)}.wl-action.active{color:var(--waline-active-color)}#wl-image-upload{display:none}#wl-image-upload:focus+label{color:var(--waline-color)}#wl-image-upload:focus-visible+label{outline:-webkit-focus-ring-color auto 1px}.wl-info{display:flex;flex:3;align-items:center;justify-content:flex-end}.wl-info .wl-text-number{color:var(--waline-info-color);font-size:.75em}.wl-info .wl-text-number .illegal{color:red}.wl-info button{margin-inline-start:.75em}.wl-info button svg{display:block;margin:0 auto;line-height:18px}.wl-emoji-popup{position:absolute;top:100%;inset-inline-start:1.25em;z-index:10;display:none;max-width:526px;border:var(--waline-border);border-radius:6px;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow)}.wl-emoji-popup.display{display:block}.wl-emoji-popup button{display:inline-block;vertical-align:middle;width:2em;margin:.125em;padding:0;border-width:0;background:0 0;font-size:inherit;line-height:2;text-align:center;cursor:pointer}.wl-emoji-popup button:hover{background:var(--waline-bg-color-hover)}.wl-emoji-popup .wl-emoji{display:inline-block;vertical-align:middle;max-width:1.5em;max-height:1.5em}.wl-emoji-popup .wl-tab-wrapper{overflow-y:auto;max-height:145px;padding:.5em}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar-track-piece:vertical{border-radius:6px;background:rgba(0,0,0,.1)}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar-thumb:vertical{width:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-emoji-popup .wl-tabs{position:relative;overflow-x:auto;padding:0 6px;white-space:nowrap}.wl-emoji-popup .wl-tabs::before{content:" ";position:absolute;top:0;right:0;left:0;z-index:2;height:1px;background:var(--waline-border-color)}.wl-emoji-popup .wl-tabs::-webkit-scrollbar{width:6px;height:6px}.wl-emoji-popup .wl-tabs::-webkit-scrollbar-track-piece:horizontal{border-radius:6px;background:rgba(0,0,0,.1)}.wl-emoji-popup .wl-tabs::-webkit-scrollbar-thumb:horizontal{height:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-emoji-popup .wl-tab{position:relative;margin:0;padding:0 .5em}.wl-emoji-popup .wl-tab.active{z-index:3;border:1px solid var(--waline-border-color);border-top-width:0;border-bottom-right-radius:6px;border-bottom-left-radius:6px;background:var(--waline-bg-color)}.wl-gif-popup{position:absolute;top:100%;inset-inline-start:1.25em;z-index:10;width:calc(100% - 3em);padding:.75em .75em .25em;border:var(--waline-border);border-radius:6px;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow);opacity:0;visibility:hidden;transition:transform .2s ease-out,opacity .2s ease-out;transform:scale(.9,.9);transform-origin:0 0}.wl-gif-popup.display{opacity:1;visibility:visible;transform:none}.wl-gif-popup input{box-sizing:border-box;width:100%;margin-bottom:10px;padding:3px 5px;border:var(--waline-border)}.wl-gif-popup img{display:block;box-sizing:border-box;width:100%;border-width:2px;border-style:solid;border-color:#fff;cursor:pointer}.wl-gif-popup img:hover{border-color:var(--waline-theme-color);border-radius:2px}.wl-gallery{display:flex;overflow-y:auto;max-height:80vh}.wl-gallery-column{display:flex;flex:1;flex-direction:column;height:max-content}.wl-cards .wl-user{--avatar-size:var(--waline-avatar-size);position:relative;margin-inline-end:.75em}@media (max-width:720px){.wl-cards .wl-user{--avatar-size:var(--waline-m-avatar-size)}}.wl-cards .wl-user .wl-user-avatar{width:var(--avatar-size);height:var(--avatar-size);border-radius:var(--waline-avatar-radius);box-shadow:var(--waline-box-shadow)}.wl-cards .wl-user .verified-icon{position:absolute;top:calc(var(--avatar-size)*3/4);inset-inline-start:calc(var(--avatar-size)*3/4);border-radius:50%;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow)}.wl-card-item{position:relative;display:flex;padding:.5em}.wl-card-item .wl-card-item{padding-inline-end:0}.wl-card{flex:1;width:0;padding-bottom:.5em;border-bottom:1px dashed var(--waline-border-color)}.wl-card:first-child{margin-inline-start:1em}.wl-card-item:last-child>.wl-card{border-bottom:none}.wl-card .wl-nick svg{position:relative;bottom:-.125em;line-height:1}.wl-card .wl-head{overflow:hidden;line-height:1.5}.wl-card .wl-head .wl-nick{position:relative;display:inline-block;margin-inline-end:.5em;font-weight:700;font-size:.875em;line-height:1;text-decoration:none}.wl-card span.wl-nick{color:var(--waline-dark-grey)}.wl-card .wl-badge{display:inline-block;margin-inline-end:1em;padding:0 .3em;border:1px solid var(--waline-badge-color);border-radius:4px;color:var(--waline-badge-color);font-size:var(--waline-badge-font-size)}.wl-card .wl-time{margin-inline-end:.875em;color:var(--waline-info-color);font-size:.75em}.wl-card .wl-meta{position:relative;line-height:1}.wl-card .wl-meta>span{display:inline-block;margin-inline-end:.25em;padding:2px 4px;border-radius:.2em;background:var(--waline-info-bg-color);color:var(--waline-info-color);font-size:var(--waline-info-font-size);line-height:1.5}.wl-card .wl-meta>span:empty{display:none}.wl-card .wl-comment-actions{float:right;line-height:1}[dir=rtl] .wl-card .wl-comment-actions{float:left}.wl-card .wl-delete,.wl-card .wl-edit,.wl-card .wl-like,.wl-card .wl-reply{display:inline-flex;align-items:center;border:0;background:0 0;color:var(--waline-color);line-height:1;cursor:pointer;transition:color .2s ease}.wl-card .wl-delete:hover,.wl-card .wl-edit:hover,.wl-card .wl-like:hover,.wl-card .wl-reply:hover,.wl-sort li.active{color:var(--waline-theme-color)}.wl-card .wl-delete.active,.wl-card .wl-edit.active,.wl-card .wl-like.active,.wl-card .wl-reply.active{color:var(--waline-active-color)}.wl-card .wl-content{position:relative;margin-bottom:.75em;padding-top:.625em;font-size:.875em;line-height:2;word-wrap:break-word}.wl-card .wl-content.expand{overflow:hidden;max-height:8em;cursor:pointer}.wl-card .wl-content.expand::after,.wl-card .wl-content.expand::before{position:absolute;inset-inline-start:0;z-index:999;display:block;width:100%}.wl-card .wl-content.expand::before{content:"";top:0;bottom:3.15em;background:linear-gradient(180deg,#000,rgba(255,255,255,.9))}.wl-card .wl-content.expand::after{content:attr(data-expand);bottom:0;height:3.15em;background:rgba(255,255,255,.9);color:#828586;line-height:3.15em;text-align:center}.wl-card .wl-content>:first-child{margin-top:0}.wl-card .wl-content>:last-child{margin-bottom:0}.wl-card .wl-admin-actions{margin:8px 0;font-size:12px;text-align:right}.wl-card .wl-comment-status{margin:0 8px}.wl-card .wl-comment-status .wl-btn{border-radius:0}.wl-card .wl-comment-status .wl-btn:first-child{border-inline-end:0;border-radius:.5em 0 0 .5em}.wl-card .wl-comment-status .wl-btn:last-child{border-inline-start:0;border-radius:0 .5em .5em 0}.wl-card .wl-quote{border-inline-start:1px dashed rgba(237,237,237,.5)}.wl-card .wl-quote .wl-user{--avatar-size:var(--waline-m-avatar-size)}.wl-close-icon{color:var(--waline-border-color)}.wl-content .vemoji,.wl-content .wl-emoji{display:inline-block;vertical-align:baseline;height:1.25em;margin:-.125em .25em}.wl-content .wl-tex{background:var(--waline-info-bg-color);color:var(--waline-info-color)}.wl-content span.wl-tex{display:inline-block;margin-inline-end:.25em;padding:2px 4px;border-radius:.2em;font-size:var(--waline-info-font-size);line-height:1.5}.wl-content .katex-display{overflow:auto hidden;-webkit-overflow-scrolling:touch;padding-top:.2em;padding-bottom:.2em}.wl-content .katex-display::-webkit-scrollbar{height:3px}.wl-content .katex-error{color:red}.wl-count{flex:1;font-weight:700;font-size:1.25em}.wl-empty{overflow:auto;padding:1.25em;color:var(--waline-color)}.wl-empty,.wl-operation{text-align:center}.wl-operation button{margin:1em 0}.wl-power{padding:.5em 0;color:var(--waline-light-grey);font-size:var(--waline-info-font-size);text-align:end}.wl-meta-head{display:flex;flex-direction:row;align-items:center;padding:.375em}.wl-sort{margin:0;list-style-type:none}.wl-sort li{display:inline-block;color:var(--waline-info-color);font-size:.75em;cursor:pointer}.wl-sort li+li{margin-inline-start:1em}.wl-reaction{overflow:auto hidden;margin-bottom:1.75em;text-align:center}.wl-reaction img{width:100%;height:100%;transition:all 250ms ease-in-out}.wl-reaction-title{margin:16px auto;font-weight:700;font-size:18px}.wl-reaction-list{display:flex;flex-direction:row;gap:16px;justify-content:center;margin:0;padding:8px;list-style-type:none}@media (max-width:580px){.wl-reaction-list{gap:12px}}[data-waline] .wl-reaction-list{margin-inline-start:0}.wl-reaction-item{display:flex;flex-direction:column;align-items:center;cursor:pointer}.wl-reaction-item.active img,.wl-reaction-item:hover img{transform:scale(1.15)}.wl-reaction-img{position:relative;width:42px;height:42px}@media (max-width:580px){.wl-reaction-img{width:32px;height:32px}}.wl-reaction-loading,.wl-reaction-votes{position:absolute;color:var(--waline-theme-color)}.wl-reaction-loading{top:-4px;inset-inline-end:-5px;width:18px;height:18px}.wl-reaction-votes{top:-9px;inset-inline-end:-9px;min-width:1em;padding:2px;border:1px solid var(--waline-theme-color);border-radius:1em;background:var(--waline-bg-color);font-weight:700;font-size:.75em;line-height:1}.wl-reaction-item.active .wl-reaction-votes{background:var(--waline-theme-color);color:var(--waline-bg-color)}.wl-reaction-text{font-size:.875em}.wl-reaction-item.active .wl-reaction-text{color:var(--waline-theme-color)}.wl-content pre,.wl-content pre[class*=language-]{margin:.75rem 0;padding:1rem 1.25rem;border-radius:6px;background:var(--waline-code-bg-color);line-height:1.4;overflow:auto}.wl-content pre code,.wl-content pre[class*=language-] code{padding:0;border-radius:0;background:0 0!important;color:#bbb;direction:ltr}.wl-content code[class*=language-],.wl-content pre[class*=language-]{background:0 0;color:#ccc;font-size:1em;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;tab-size:4;-webkit-hyphens:none;hyphens:none}.wl-content :not(pre)>code[class*=language-],.wl-content pre[class*=language-]{background:#2d2d2d}.wl-content :not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.wl-content .token.block-comment,.wl-content .token.cdata,.wl-content .token.comment,.wl-content .token.doctype,.wl-content .token.prolog{color:#999}.wl-content .token.punctuation{color:#ccc}.wl-content .token.attr-name,.wl-content .token.deleted,.wl-content .token.namespace,.wl-content .token.tag{color:#e2777a}.wl-content .token.function-name{color:#6196cc}.wl-content .token.boolean,.wl-content .token.function,.wl-content .token.number{color:#f08d49}.wl-content .token.class-name,.wl-content .token.constant,.wl-content .token.property,.wl-content .token.symbol{color:#f8c555}.wl-content .token.atrule,.wl-content .token.builtin,.wl-content .token.important,.wl-content .token.keyword,.wl-content .token.selector{color:#cc99cd}.wl-content .token.attr-value,.wl-content .token.char,.wl-content .token.regex,.wl-content .token.string,.wl-content .token.variable{color:#7ec699}.wl-content .token.entity,.wl-content .token.operator,.wl-content .token.url{color:#67cdcc}.wl-content .token.bold,.wl-content .token.important{font-weight:700}.wl-content .token.italic{font-style:italic}.wl-content .token.entity{cursor:help}.wl-content .token.inserted{color:green}.wl-recent-item p{display:inline}.wl-user-list,.wl-user-wall{padding:0;list-style:none}.wl-user-list a,.wl-user-list a:hover,.wl-user-list a:visited{color:var(--waline-color);text-decoration:none}.wl-user-list .wl-user-avatar{position:relative;display:inline-block;overflow:hidden;margin-inline-end:10px;border-radius:4px;line-height:0}.wl-user-list .wl-user-avatar>img,.wl-user-wall .wl-user-item img{width:var(--waline-user-avatar-size, 48px);height:var(--waline-user-avatar-size, 48px)}.wl-user-list .wl-user-badge{position:absolute;bottom:0;inset-inline-end:0;min-width:.7em;height:1.5em;padding:0 .4em;border-radius:4px;background:var(--waline-info-bg-color);color:var(--waline-info-color);font-weight:700;font-size:10px;line-height:1.5em;text-align:center}.wl-user-list .wl-user-item{margin:10px 0}.wl-user-list .wl-user-item:nth-child(1) .wl-user-badge{background:var(--waline-rank-gold-bg-color, #fa3939);color:var(--waline-white);font-weight:700}.wl-user-list .wl-user-item:nth-child(2) .wl-user-badge{background:var(--waline-rank-silver-bg-color, #fb811c);color:var(--waline-white);font-weight:700}.wl-user-list .wl-user-item:nth-child(3) .wl-user-badge{background:var(--waline-rank-copper-bg-color, #feb207);color:var(--waline-white)}.wl-user-list .wl-user-meta{display:inline-block;vertical-align:top}.wl-user-list .wl-badge{display:inline-block;vertical-align:text-top;margin-inline-start:.5em;padding:0 .3em;border:1px solid var(--waline-badge-color);border-radius:4px;color:var(--waline-badge-color);font-size:var(--waline-badge-font-size)}.wl-user-wall .wl-user-badge,.wl-user-wall .wl-user-meta{display:none}.wl-user-wall .wl-user-item{position:relative;display:inline-block;transition:transform ease-in-out .2s}.wl-user-wall .wl-user-item::after,.wl-user-wall .wl-user-item::before{position:absolute;bottom:100%;left:50%;z-index:10;opacity:0;pointer-events:none;transition:all .18s ease-out .18s;transform:translate(-50%,4px);transform-origin:top}.wl-user-wall .wl-user-item::before{content:"";width:0;height:0;border:5px solid transparent;border-top-color:rgba(16,16,16,.95)}.wl-user-wall .wl-user-item::after{content:attr(aria-label);margin-bottom:10px;padding:.5em 1em;border-radius:2px;background:rgba(16,16,16,.95);color:#fff;font-size:12px;white-space:nowrap}.wl-user-wall .wl-user-item:hover{transform:scale(1.1)}.wl-user-wall .wl-user-item:hover::after,.wl-user-wall .wl-user-item:hover::before{opacity:1;pointer-events:none;transform:translate(-50%,0)} -.waline-wrapper{--waline-theme-color:var(--vp-tc);--waline-text-color:var(--vp-c);--waline-active-color:var(--vp-tcl);--waline-border:1px solid var(--vp-brc);--waline-border-color:var(--vp-brc);--waline-bgcolor:var(--vp-bg);--waline-bgcolor-light:var(--vp-bgl);max-width:var(--content-width, 740px);margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.waline-wrapper{padding:1.5rem}}@media (max-width:419px){.waline-wrapper{padding:1rem 1.5rem}}@media print{.waline-wrapper{max-width:unset;display:none!important}} -div[class*=language-]:hover::before{display:none}div[class*=language-]:hover .vp-copy-code-button{opacity:1}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:0 0;outline:0;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button.copied,.vp-copy-code-button:focus{opacity:1}.vp-copy-code-button.copied,.vp-copy-code-button:hover{background:var(--copy-code-hover)}.vp-copy-code-button.copied .vp-copy-icon{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied::after,.vp-copy-icon{height:1.25rem;padding:.625rem;color:var(--copy-code-color)}.vp-copy-code-button.copied::after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;border-radius:.5rem;background:var(--copy-code-hover);font-weight:500;line-height:1.25rem;white-space:nowrap}.vp-copy-icon{width:1.25rem;background:currentcolor;font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:1em;mask-size:1em} -:root{--code-copy-icon:url(/assets/img/copy-button.45f8803e.svg);--code-copied-icon:url(/assets/img/copied-button.9f175e5f.svg);--copy-code-color:var(--code-ln-color, #9e9e9e);--copy-code-hover:var(--code-hl-bg-color, rgb(0 0 0 / 66%))} -.theme-hope-content figure{position:relative;display:flex;flex-direction:column;width:auto;margin:1rem auto;text-align:center;transition:transform var(--vp-tt)}.theme-hope-content figure img{overflow:hidden;margin:0 auto;border-radius:8px}.theme-hope-content figure img[tabindex]:focus,.theme-hope-content figure img[tabindex]:hover{box-shadow:2px 2px 10px 0 var(--card-shadow)}@media print{.theme-hope-content figure>a[href^="http://"]::after,.theme-hope-content figure>a[href^="https://"]::after{content:""}}.theme-hope-content figure>a .external-link-icon{display:none}.theme-hope-content figure figcaption{display:inline-block;margin:6px auto;font-size:.8rem} -.footnote-item{margin-top:calc(0rem - var(--navbar-height, 3.6rem));padding-top:calc(var(--navbar-height, 3.6rem) + .5rem)}.footnote-item>p{margin-bottom:0}.footnote-ref{position:relative}.footnote-anchor{position:absolute;top:calc(-.5rem - var(--navbar-height, 3.6rem))} -:root{--important-title-color:#230555;--important-bg-color:#f4eefe;--important-border-color:#a371f7;--important-code-bg-color:rgb(163 113 247 / 10%);--info-title-color:#193c47;--info-bg-color:#eef9fd;--info-border-color:#4cb3d4;--info-code-bg-color:rgb(76 179 212 / 10%);--note-title-color:#474748;--note-bg-color:#fdfdfe;--note-border-color:#ccc;--note-code-bg-color:rgb(212 213 216 / 20%);--tip-title-color:#003100;--tip-bg-color:#e6f6e6;--tip-border-color:#009400;--tip-code-bg-color:rgb(0 148 0 / 15%);--warning-title-color:#4d3800;--warning-bg-color:#fff8e6;--warning-border-color:#e6a700;--warning-code-bg-color:rgb(230 167 0 / 15%);--caution-title-color:#4b1113;--caution-bg-color:#ffebec;--caution-border-color:#e13238;--caution-code-bg-color:rgb(225 50 56 / 15%);--detail-bg-color:#eee;--detail-text-color:inherit;--detail-code-bg-color:rgb(127 127 127 / 15%)}html[data-theme=dark]{--important-title-color:#f4eefe;--important-bg-color:#230555;--info-title-color:#eef9fd;--info-bg-color:#193c47;--note-title-color:#fdfdfe;--note-bg-color:#474748;--tip-title-color:#e6f6e6;--tip-bg-color:#003100;--warning-title-color:#fff8e6;--warning-bg-color:#4d3800;--caution-title-color:#ffebec;--caution-bg-color:#4b1113;--detail-bg-color:#333;--detail-text-color:#a8a8a8}.hint-container{position:relative;transition:background var(--vp-ct),border-color var(--vp-ct),color var(--vp-ct)}@media print{.hint-container{page-break-inside:avoid}}.hint-container .hint-container-title{position:relative;font-weight:600;line-height:1.25}.hint-container.caution,.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning{margin:1rem 0;padding:.25rem 1rem;border-inline-start-width:.3rem;border-inline-start-style:solid;border-radius:.5rem;color:inherit}@media (max-width:419px){.hint-container.caution,.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning{margin-inline:-.75rem}}.hint-container.caution .hint-container-title,.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title{padding-inline-start:1.75rem}@media print{.hint-container.caution .hint-container-title,.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title{padding-inline-start:0}}.hint-container.caution .hint-container-title::before,.hint-container.important .hint-container-title::before,.hint-container.info .hint-container-title::before,.hint-container.note .hint-container-title::before,.hint-container.tip .hint-container-title::before,.hint-container.warning .hint-container-title::before{content:" ";position:absolute;top:calc(50% - .6125em);inset-inline-start:0;width:1.25em;height:1.25em;background-position:left;background-repeat:no-repeat}@media print{.hint-container.caution .hint-container-title::before,.hint-container.important .hint-container-title::before,.hint-container.info .hint-container-title::before,.hint-container.note .hint-container-title::before,.hint-container.tip .hint-container-title::before,.hint-container.warning .hint-container-title::before{display:none}}.hint-container.caution p,.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p{line-height:1.5}.hint-container.caution a,.hint-container.details a,.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a{color:var(--vp-tc)}.hint-container.important{border-color:var(--important-border-color);background:var(--important-bg-color)}.hint-container.important>.hint-container-title{color:var(--important-title-color)}.hint-container.important>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 1024 1024%27%3E%3Cpath d=%27M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z%27 fill=%27%23a371f7%27/%3E%3C/svg%3E")}.hint-container.important code{background:var(--important-code-bg-color)}.hint-container.info{border-color:var(--info-border-color);background:var(--info-bg-color)}.hint-container.info>.hint-container-title{color:var(--info-title-color)}.hint-container.info>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath d=%27M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z%27 fill=%27%234cb3d4%27/%3E%3C/svg%3E")}.hint-container.info code{background:var(--info-code-bg-color)}.hint-container.note{border-color:var(--note-border-color);background:var(--note-bg-color)}.hint-container.note>.hint-container-title{color:var(--note-title-color)}.hint-container.note>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath d=%27M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z%27 fill=%27%23ccc%27/%3E%3C/svg%3E")}.hint-container.note code{background:var(--note-code-bg-color)}.hint-container.tip{border-color:var(--tip-border-color);background:var(--tip-bg-color)}.hint-container.tip>.hint-container-title{color:var(--tip-title-color)}.hint-container.tip>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23009400%27 d=%27M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z%27/%3E%3C/svg%3E")}.hint-container.tip code{background:var(--tip-code-bg-color)}.hint-container.warning{border-color:var(--warning-border-color);background:var(--warning-bg-color)}.hint-container.warning>.hint-container-title{color:var(--warning-title-color)}.hint-container.warning>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 1024 1024%27%3E%3Cpath d=%27M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z%27 fill=%27%23e6a700%27/%3E%3C/svg%3E")}.hint-container.warning code{background:var(--warning-code-bg-color)}.hint-container.caution{border-color:var(--caution-border-color);background:var(--caution-bg-color)}.hint-container.caution>.hint-container-title{color:var(--caution-title-color)}.hint-container.caution>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath d=%27M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z%27 fill=%27%23e13238%27/%3E%3C/svg%3E")}.hint-container.caution code{background:var(--caution-code-bg-color)}.hint-container.details{position:relative;display:block;margin:1rem 0;padding:1.5rem;border-radius:.5rem;background:var(--detail-bg-color);color:var(--detail-text-color);transition:background var(--vp-tt),color var(--vp-tt)}@media (max-width:419px){.hint-container.details{margin-inline:-.75rem}}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details code{background:var(--detail-code-bg-color)}.hint-container.details summary{position:relative;margin:-1.5rem;padding-block:1.5rem;padding-inline:4rem 1.5rem;list-style:none;cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:transparent;font-size:0}.hint-container.details summary::after,.hint-container.details summary::before{content:" ";position:absolute;top:calc(50% - .75rem);inset-inline-start:1.5rem;width:1.5rem;height:1.5rem}.hint-container.details summary::before{border-radius:50%;background:#ccc;transition:background var(--vp-ct),transform var(--vp-tt)}html[data-theme=dark] .hint-container.details summary::before{background:#555}.hint-container.details summary::after{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");line-height:normal;transition:transform var(--vp-tt);transform:rotate(90deg)}html[data-theme=dark] .hint-container.details summary::after{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary::after{transform:rotate(180deg)} -.task-list-container{padding-inline-start:0;list-style-position:inside}.task-list-container .task-list-container{padding-inline-start:1.5em}.task-list-item{list-style:none}.task-list-item-checkbox{position:relative;cursor:pointer}.task-list-item-checkbox::after{content:" ";position:absolute;top:0;display:inline-block;box-sizing:border-box;width:1em;height:1em;padding-inline-start:0;border:1px solid #ddd;border-radius:2px;background:#fff;text-align:center;visibility:visible;transition:background var(--vp-ct),border-color var(--vp-ct)}@media print{.task-list-item-checkbox::after{border-color:var(--vp-c)}}html[data-theme=dark] .task-list-item-checkbox::after{border-color:#666;background:#333}.task-list-item-checkbox:checked::after{content:"";border-color:var(--vp-tc);background:var(--vp-tc)}@media print{.task-list-item-checkbox:checked::after{border-color:var(--vp-c);background:0 0}}html[data-theme=dark] .task-list-item-checkbox:checked::after{border-color:var(--vp-tc);background:var(--vp-tc)}.task-list-item-checkbox:checked::before{content:"";position:absolute;top:.1em;inset-inline-start:.4em;z-index:1;width:.2em;height:.5em;border:solid var(--white);border-width:0 .15em .15em 0;transform:rotate(45deg)}@media print{.task-list-item-checkbox:checked::before{border-color:var(--vp-c)}} -/*! PhotoSwipe main CSS by Dmytro Semenov | photoswipe.com */ -@keyframes pswp-clockwise{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}.pswp{--pswp-bg:#000;--pswp-placeholder-bg:#222;--pswp-root-z-index:100000;--pswp-preloader-color:rgba(79, 79, 79, 0.4);--pswp-preloader-color-secondary:rgba(255, 255, 255, 0.9);--pswp-icon-color:#fff;--pswp-icon-color-secondary:#4f4f4f;--pswp-icon-stroke-color:#4f4f4f;--pswp-icon-stroke-width:2px;--pswp-error-text-color:var(--pswp-icon-color);position:fixed;top:0;left:0;width:100%;height:100%;z-index:var(--pswp-root-z-index);display:none;touch-action:none;outline:0;opacity:.003;contain:layout style size;-webkit-tap-highlight-color:transparent}.pswp:focus{outline:0}.pswp *{box-sizing:border-box}.pswp img{max-width:none}.pswp--open{display:block}.pswp,.pswp__bg{transform:translateZ(0);will-change:opacity}.pswp__bg{opacity:.005;background:var(--pswp-bg)}.pswp,.pswp__scroll-wrap{overflow:hidden}.pswp__bg,.pswp__container,.pswp__content,.pswp__img,.pswp__item,.pswp__scroll-wrap,.pswp__zoom-wrap{position:absolute;top:0;left:0;width:100%;height:100%}.pswp__img,.pswp__zoom-wrap{width:auto;height:auto}.pswp--click-to-zoom.pswp--zoom-allowed .pswp__img{cursor:zoom-in}.pswp--click-to-zoom.pswp--zoomed-in .pswp__img{cursor:move;cursor:grab}.pswp--click-to-zoom.pswp--zoomed-in .pswp__img:active{cursor:grabbing}.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img,.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img:active,.pswp__img{cursor:zoom-out}.pswp__button,.pswp__container,.pswp__counter,.pswp__img{-webkit-user-select:none;-moz-user-select:none;user-select:none}.pswp__item{z-index:1;overflow:hidden}.pswp__hidden{display:none!important}.pswp__content{pointer-events:none}.pswp__content>*{pointer-events:auto}.pswp__error-msg-container{display:grid}.pswp__error-msg{margin:auto;font-size:1em;line-height:1;color:var(--pswp-error-text-color)}.pswp .pswp__hide-on-close{opacity:.005;will-change:opacity;transition:opacity var(--pswp-transition-duration) cubic-bezier(.4,0,.22,1);z-index:10;pointer-events:none}.pswp--ui-visible .pswp__hide-on-close{opacity:1;pointer-events:auto}.pswp__button{position:relative;display:block;width:50px;height:60px;padding:0;margin:0;overflow:hidden;cursor:pointer;background:0 0;border:0;box-shadow:none;opacity:.85;-webkit-appearance:none;-webkit-touch-callout:none}.pswp__button:active,.pswp__button:focus,.pswp__button:hover{transition:none;padding:0;background:0 0;border:0;box-shadow:none;opacity:1}.pswp__button:disabled{opacity:.3;cursor:auto}.pswp__icn{fill:var(--pswp-icon-color);color:var(--pswp-icon-color-secondary);position:absolute;top:14px;left:9px;width:32px;height:32px;overflow:hidden;pointer-events:none}.pswp__icn-shadow{stroke:var(--pswp-icon-stroke-color);stroke-width:var(--pswp-icon-stroke-width);fill:none}.pswp__icn:focus{outline:0}.pswp__img--with-bg,div.pswp__img--placeholder{background:var(--pswp-placeholder-bg)}.pswp__top-bar{position:absolute;left:0;top:0;width:100%;height:60px;display:flex;flex-direction:row;justify-content:flex-end;z-index:10;pointer-events:none!important}.pswp__top-bar>*{pointer-events:auto;will-change:opacity}.pswp__button--close{margin-right:6px}.pswp__button--arrow{position:absolute;width:75px;height:100px;top:50%;margin-top:-50px}.pswp__button--arrow:disabled{display:none;cursor:default}.pswp__button--arrow .pswp__icn{top:50%;margin-top:-30px;width:60px;height:60px;background:0 0;border-radius:0}.pswp--one-slide .pswp__button--arrow{display:none}.pswp--touch .pswp__button--arrow{visibility:hidden}.pswp--has_mouse .pswp__button--arrow{visibility:visible}.pswp__button--arrow--prev{right:auto;left:0}.pswp__button--arrow--next{right:0}.pswp__button--arrow--next .pswp__icn{left:auto;right:14px;transform:scale(-1,1)}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__zoom-icn-bar-v,.pswp__button--zoom{display:none}.pswp__preloader{position:relative;overflow:hidden;width:50px;height:60px;margin-right:auto}.pswp__preloader .pswp__icn{opacity:0;transition:opacity .2s linear;animation:pswp-clockwise 600ms linear infinite}.pswp__preloader--active .pswp__icn{opacity:.85}.pswp__counter{height:30px;margin-top:15px;margin-inline-start:20px;font-size:14px;line-height:30px;color:var(--pswp-icon-color);text-shadow:1px 1px 3px var(--pswp-icon-color-secondary);opacity:.85}.pswp--one-slide .pswp__counter{display:none} -.photo-swipe-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.photo-swipe-bullets-indicator{position:absolute;bottom:30px;left:50%;display:flex;flex-direction:row;align-items:center;transform:translate(-50%,0)}.photo-swipe-bullet{width:12px;height:6px;margin:0 5px;border-radius:3px;background:#fff;transition:width var(--vp-tt),color var(--vp-ct)}.photo-swipe-bullet.active{width:30px;background:var(--vp-tc)} - -:root{--balloon-border-radius:2px;--balloon-color:rgba(16, 16, 16, 0.95);--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{position:relative;cursor:pointer}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;transition:all .18s ease-out .18s;position:absolute;z-index:10}[aria-label][data-balloon-pos]:after{text-indent:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-weight:400;font-style:normal;text-shadow:none;font-size:var(--balloon-font-size);background:var(--balloon-color);border-radius:2px;color:var(--balloon-text-color);border-radius:var(--balloon-border-radius);content:attr(aria-label);padding:.5em 1em;white-space:nowrap}[aria-label][data-balloon-pos]:before{width:0;height:0;border:5px solid transparent;border-top-color:var(--balloon-color);content:""}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%,0)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0,0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform-origin:top;transform:translate(0,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translate(0,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{width:0;height:0;border:5px solid transparent;border-bottom-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translate(0,-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{width:0;height:0;border:5px solid transparent;border-left-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{width:0;height:0;border:5px solid transparent;border-right-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%} -@keyframes message-move-in{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes message-move-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}#message-container{position:fixed;inset:calc(var(--navbar-height, 3.6rem) + 1rem)0 auto;z-index:75;text-align:center}#message-container .message{display:inline-block;padding:8px 10px;border-radius:3px;background:var(--vp-bg);color:var(--vp-c);box-shadow:0 0 10px 0 var(--box-shadow, #f0f1f2);font-size:14px}#message-container .message.move-in{animation:message-move-in .3s ease-in-out}#message-container .message.move-out{animation:message-move-out .3s ease-in-out;animation-fill-mode:forwards}#message-container .message svg{position:relative;bottom:-.125em;margin-inline-end:5px} -@keyframes bounce-down{0%{transform:translateY(-5px)}to{transform:translateY(5px)}}.vp-article-wrapper{position:relative;box-sizing:border-box;width:100%;margin:0 auto 1.25rem;text-align:start;overflow-wrap:break-word}@media (max-width:959px){.vp-article-wrapper{margin:0 auto 1rem}}.vp-article-wrapper:last-child{margin-bottom:0}.vp-article-item{display:block;padding:.75rem 1.25rem;border-radius:.4rem;background:var(--bg-color-float);color:inherit;box-shadow:0 1px 3px 1px var(--card-shadow);transition:background var(--color-transition),box-shadow var(--color-transition)}@media (max-width:959px){.vp-article-item{padding:.75rem 1rem}}@media (max-width:419px){.vp-article-item{border-radius:0}}.vp-article-item:hover{box-shadow:0 2px 6px 2px var(--card-shadow)}.vp-article-item .sticky-icon{position:absolute;top:0;inset-inline-end:0;width:1.5rem;height:1.5rem;color:var(--theme-color)}.vp-article-item .page-info>span{display:flex;flex-shrink:0;align-items:center;margin-inline-end:.5em;line-height:1.8}.vp-article-item .page-info>span::after{--balloon-font-size:8px;padding:.3em .6em!important}.vp-article-hr{margin-block:.375em .375em}.vp-article-title{position:relative;display:inline-block;color:var(--text-color);font-size:1.25rem;font-family:var(--font-family-heading);line-height:1.6;cursor:pointer}.vp-article-title::after{content:"";position:absolute;inset:auto 0 0;height:2px;background:var(--theme-color);visibility:hidden;transition:transform .3s ease-in-out;transform:scaleX(0)}.vp-article-title:hover{cursor:pointer}.vp-article-title:hover::after{visibility:visible;transform:scaleX(1)}.vp-article-title a{color:inherit;font-weight:600}.vp-article-title .lock-icon,.vp-article-title .slides-icon{position:relative;bottom:-.125em;display:inline-block;vertical-align:baseline;width:1em;height:1em;margin-inline-end:.25em;color:var(--theme-color)}.vp-article-title>span{word-break:break-word}.vp-article-cover{width:calc(100% + 2.5rem);margin:-.75rem -1.25rem .75rem;border-top-left-radius:.4rem;border-top-right-radius:.4rem}@media (max-width:959px){.vp-article-cover{width:calc(100% + 2rem);margin:-.75rem -1rem .75rem}}@media (max-width:419px){.vp-article-cover{border-radius:0}}.vp-article-excerpt{overflow:hidden;line-height:1.6;cursor:default}@media (max-width:959px){.vp-article-excerpt{font-size:15px}}@media (max-width:419px){.vp-article-excerpt{font-size:14px}}.vp-article-excerpt .code-demo-wrapper,.vp-article-excerpt .external-link-icon,.vp-article-excerpt .footnote-anchor,.vp-article-excerpt h1,.vp-article-excerpt section.footnotes,html[data-theme=dark] .vp-blog-mask.light{display:none}.vp-article-excerpt h2{font-size:1.4em}.vp-article-excerpt h3{font-size:1.2em}.vp-article-excerpt h1,.vp-article-excerpt h2,.vp-article-excerpt h3,.vp-article-excerpt h4,.vp-article-excerpt h5,.vp-article-excerpt h6{margin-top:.5em;margin-bottom:.5em}.vp-article-excerpt h1+p{margin-top:.5em}.vp-article-excerpt p:first-child{margin-top:.5em}.vp-article-excerpt p:last-child{margin-bottom:.5em}.vp-article-excerpt div[class*=language-]{overflow:auto hidden}.vp-article-excerpt div[class*=language-] pre{margin:.85rem 0;line-height:1.375}.vp-article-excerpt div[class*=language-] pre code{padding:0;background:0 0}.vp-article-excerpt div[class*=language-].line-numbers-mode .line-numbers{padding:.85rem 0}.vp-article-excerpt img{max-width:100%}.vp-article-excerpt figure{display:flex;flex-direction:column;width:auto;margin:1rem auto;text-align:center;transition:transform var(--transform-transition)}.vp-article-excerpt figure img{overflow:hidden;margin:0 auto;border-radius:8px}.vp-article-excerpt figure figcaption{display:inline-block;margin:6px auto;font-size:.8rem}.vp-article-excerpt figure figcaption:only-child{display:none}.vp-article-list{margin-top:calc(-.5rem - var(--navbar-height));padding-top:calc(var(--navbar-height) + .5rem);text-align:center}.vp-article-list:first-child{margin-top:calc(0rem - var(--navbar-height))}.vp-article-list .empty{max-width:560px;margin:0 auto;text-align:center}.vp-article-type-wrapper{position:relative;z-index:2;display:flex;align-items:center;justify-content:center;padding-inline-start:0;list-style:none;font-weight:600;font-size:18px}@media (max-width:419px){.vp-article-type-wrapper{font-size:16px}}.vp-article-type{vertical-align:middle;margin:.3em .8em;line-height:1.2;cursor:pointer}.vp-article-type::after{content:" ";position:absolute;inset:auto 50% -6px;height:2px;border-radius:1px;background:var(--theme-color);visibility:hidden;transition:inset .2s ease-in-out}.vp-article-type a{display:inline-block;color:inherit;transition:all .3s ease-in-out}.timeline-wrapper .timeline-year-title span,.vp-article-type,.vp-article-type.active,.vp-blog-hero{position:relative}.vp-article-type.active a{color:var(--theme-color);transform:scale(1.1,1.1)}.vp-article-type.active::after,.vp-article-type:hover::after{inset:auto calc(50% - 8px) -6px;visibility:visible}.vp-blog-hero{display:flex;flex-direction:column;justify-content:center;height:450px;margin-bottom:1rem;color:#eee;font-family:var(--font-family-heading)}@media (max-width:719px){.vp-blog-hero{height:350px}}@media (max-width:419px){.vp-blog-hero{margin:0 0 1rem}}.vp-blog-hero.no-bg{color:var(--text-color)}.vp-blog-hero>:not(.vp-blog-mask){position:relative;z-index:2}.vp-blog-hero .slide-down-button{border-width:0;background:0 0;cursor:pointer;position:absolute;bottom:0;left:calc(50vw - 30px);display:none;width:60px;height:60px;padding:10px}.vp-blog-hero .slide-down-button .icon{width:30px;margin:-15px 0;animation-name:bounce-down;animation-duration:1.5s;animation-timing-function:linear;animation-iteration-count:infinite;animation-direction:alternate}.vp-blog-hero .slide-down-button .icon:first-child{color:rgba(255,255,255,.15)}.vp-blog-hero .slide-down-button .icon:last-child{color:rgba(255,255,255,.5)}.vp-blog-hero.fullscreen{height:calc(100vh - var(--navbar-height))!important}.vp-blog-hero.fullscreen .vp-blog-mask{background-position-y:top!important}.vp-blog-hero.fullscreen .slide-down-button,.vp-blog-mask.light,html[data-theme=dark] .vp-blog-mask.dark{display:block}.vp-blog-mask,.vp-blog-mask::after{position:absolute;inset:0}.vp-blog-mask::after{content:" ";z-index:1;display:block;background:var(--light-grey);opacity:.2}.vp-blog-mask.dark,html[data-theme=dark] .vp-blog-hero-image.light{display:none}.vp-blog-hero-title{margin:.5rem auto;font-weight:700;font-size:2rem}@media (min-width:1440px){.vp-blog-hero-title{font-size:2.25rem}}@media (max-width:719px){.vp-blog-hero-title{font-size:1.75rem}}.vp-blog-hero-image{display:block;max-width:100%;max-height:15rem;margin:1.5rem auto}@media (max-width:719px){.vp-blog-hero-image{max-height:12rem}}.vp-blog-hero-image.light,html[data-theme=dark] .vp-blog-hero-image.dark{display:block}.vp-blog-hero-image.dark,.vp-sidebar .vp-blogger-info.mobile,.vp-sidebar .vp-blogger-info.mobile+hr{display:none}.vp-blog-hero-image+.vp-blog-hero-title{margin:0 auto}.vp-blog-hero-description{margin:1.2rem auto 0;font-size:1.5rem}@media (max-width:719px){.vp-blog-hero-description{font-size:1.25rem}}.vp-blogger-info{padding:.5rem;font-family:var(--font-family-heading);overflow-wrap:break-word}.vp-page .vp-blogger-info{background:var(--bg-color-float);transition:background var(--color-transition)}@media (max-width:719px){.vp-sidebar .vp-blogger-info.mobile{display:block}}@media (max-width:719px){.vp-sidebar .vp-blogger-info.mobile+hr{display:block;margin-top:1rem}}.vp-blogger{padding:.5rem;text-align:center}.vp-blogger-avatar{width:8rem;height:8rem;margin:0 auto}.vp-blogger-avatar.round{border-radius:50%}.vp-blogger-name{margin:1rem auto;font-size:22px}.vp-blogger-description{margin:1rem auto;font-size:14px}.vp-blog-counts{display:flex;width:80%;margin:0 auto 1rem}.vp-blog-count{display:block;width:25%;color:inherit;font-size:13px;text-align:center;cursor:pointer;transition:color var(--color-transition)}.vp-blog-count:hover,.vp-star-article:hover a{color:var(--theme-color)}.vp-blog-count .count{position:relative;margin-bottom:.5rem;font-weight:600;font-size:20px}.vp-category-list{position:relative;z-index:2;padding-inline-start:0;list-style:none;font-size:14px}.vp-category{display:inline-block;vertical-align:middle;overflow:hidden;margin:.3rem .6rem .8rem;padding:.4rem .8rem;border-radius:.25rem;color:var(--dark-grey);box-shadow:0 1px 4px 0 var(--card-shadow);word-break:break-word;cursor:pointer;transition:background var(--color-transition),color var(--color-transition)}@media (max-width:419px){.vp-category{font-size:.9rem}}.tag-list-wrapper a,.vp-category a,.vp-star-article a{color:inherit}.vp-category .count{display:inline-block;min-width:1rem;height:1.2rem;margin-inline-start:.2em;padding:0 .1rem;border-radius:.6rem;color:var(--white);font-size:.7rem;line-height:1.2rem;text-align:center}.vp-category0{background:#fde5e7;color:#ba111f}html[data-theme=dark] .vp-category0{background:#340509;color:#ec2f3e}.vp-category0:hover{background:#f9bec3}html[data-theme=dark] .vp-category0:hover{background:#53080e}.vp-category0.active{background:#cf1322;color:#fff}html[data-theme=dark] .vp-category0.active{background:#a60f1b;color:var(--bg-color)}.vp-category0.active .count{background:var(--bg-color);color:#cf1322}.vp-category0 .count{background:#cf1322}.vp-category1{background:#ffeee8;color:#f54205}html[data-theme=dark] .vp-category1{background:#441201;color:#fb7649}.vp-category1:hover{background:#fed4c6}html[data-theme=dark] .vp-category1:hover{background:#6d1d02}.vp-category1.active{background:#fa541c;color:#fff}html[data-theme=dark] .vp-category1.active{background:#da3a05;color:var(--bg-color)}.vp-category1.active .count{background:var(--bg-color);color:#fa541c}.vp-category1 .count{background:#fa541c}.vp-category2{background:#fef5e7;color:#e08e0b}html[data-theme=dark] .vp-category2{background:#3e2703;color:#f5b041}.vp-category2:hover{background:#fce6c4}html[data-theme=dark] .vp-category2:hover{background:#633f05}.vp-category2.active{background:#f39c12;color:#fff}html[data-theme=dark] .vp-category2.active{background:#c77e0a;color:var(--bg-color)}.vp-category2.active .count{background:var(--bg-color);color:#f39c12}.vp-category2 .count{background:#f39c12}.vp-category3{background:#eafaf1;color:#29b866}html[data-theme=dark] .vp-category3{background:#0c331c;color:#55d98d}.vp-category3:hover{background:#caf3db}html[data-theme=dark] .vp-category3:hover{background:#12522d}.vp-category3.active{background:#2ecc71;color:#fff}html[data-theme=dark] .vp-category3.active{background:#25a35a;color:var(--bg-color)}.vp-category3.active .count{background:var(--bg-color);color:#2ecc71}.vp-category3 .count{background:#2ecc71}.vp-category4{background:#e6f9ee;color:#219552}html[data-theme=dark] .vp-category4{background:#092917;color:#36d278}.vp-category4:hover{background:#c0f1d5}html[data-theme=dark] .vp-category4:hover{background:#0f4224}.vp-category4.active{background:#25a55b;color:#fff}html[data-theme=dark] .vp-category4.active{background:#1e8449;color:var(--bg-color)}.vp-category4.active .count{background:var(--bg-color);color:#25a55b}.vp-category4 .count{background:#25a55b}.vp-category5{background:#e1fcfc;color:#0e9595}html[data-theme=dark] .vp-category5{background:#042929;color:#16e1e1}.vp-category5:hover{background:#b4f8f8}html[data-theme=dark] .vp-category5:hover{background:#064242}.vp-category5.active{background:#10a5a5;color:#fff}html[data-theme=dark] .vp-category5.active{background:#0d8484;color:var(--bg-color)}.vp-category5.active .count{background:var(--bg-color);color:#10a5a5}.vp-category5 .count{background:#10a5a5}.vp-category6{background:#e4f0fe;color:#0862c3}html[data-theme=dark] .vp-category6{background:#021b36;color:#2589f6}.vp-category6:hover{background:#bbdafc}html[data-theme=dark] .vp-category6:hover{background:#042c57}.vp-category6.active{background:#096dd9;color:#fff}html[data-theme=dark] .vp-category6.active{background:#0757ae;color:var(--bg-color)}.vp-category6.active .count{background:var(--bg-color);color:#096dd9}.vp-category6 .count{background:#096dd9}.vp-category7{background:#f7f1fd;color:#9851e4}html[data-theme=dark] .vp-category7{background:#2a0b4b;color:#bb8ced}.vp-category7:hover{background:#eadbfa}html[data-theme=dark] .vp-category7:hover{background:#431277}.vp-category7.active{background:#aa6fe9;color:#fff}html[data-theme=dark] .vp-category7.active{background:#8733e0;color:var(--bg-color)}.vp-category7.active .count{background:var(--bg-color);color:#aa6fe9}.vp-category7 .count{background:#aa6fe9}.vp-category8{background:#fdeaf5;color:#e81689}html[data-theme=dark] .vp-category8{background:#400626;color:#ef59ab}.vp-category8:hover{background:#facbe5}html[data-theme=dark] .vp-category8:hover{background:#670a3d}.vp-category8.active{background:#eb2f96;color:#fff}html[data-theme=dark] .vp-category8.active{background:#ce147a;color:var(--bg-color)}.vp-category8.active .count{background:var(--bg-color);color:#eb2f96}.vp-category8 .count{background:#eb2f96}html[data-theme=dark] .empty-icon g.people{opacity:.8}html[data-theme=dark] .empty-icon g:not(.people){filter:invert(80%)}.vp-page.vp-blog .vp-blog-home{flex:1;width:0;max-width:780px}.vp-page.vp-blog .theme-hope-content:empty{padding:0}.vp-blog-infos{margin:8px auto;padding:8px 16px}.vp-page .vp-blog-infos{border-radius:6px;background:var(--bg-color-float);box-shadow:0 1px 3px 1px var(--card-shadow);transition:background var(--color-transition),box-shadow var(--color-transition)}.vp-page .vp-blog-infos:hover{box-shadow:0 2px 6px 2px var(--card-shadow)}.vp-blog-infos .timeline-list-wrapper .content{max-height:60vh}.vp-blog-type-switcher{display:flex;justify-content:center;margin-bottom:8px}.vp-blog-type-button{border-width:0;background:0 0;cursor:pointer;width:44px;height:44px;margin:0 8px;padding:4px;color:var(--grey3);transition:color var(--color-transition)}.vp-blog-type-button:focus{outline:0}.vp-blog-type-button .icon-wrapper{width:20px;height:20px;padding:8px;border-radius:50%;background:rgba(127,127,127,.15);transition:background var(--color-transition)}html[data-theme=dark] .vp-blog-type-button .icon-wrapper{background:rgba(255,255,255,.15)}.vp-blog-type-button .icon-wrapper:hover{cursor:pointer}.vp-blog-type-button .icon-wrapper.active{background:var(--theme-color-light)}html[data-theme=dark] .vp-blog-type-button .icon-wrapper.active{background:var(--theme-color-dark)}.vp-blog-type-button .icon{width:100%;height:100%}.vp-sidebar.hide-icon .vp-blog-type-button .icon{display:block!important}.vp-category-wrapper,.vp-star-article-wrapper,.vp-tag-wrapper{padding:8px 0}.vp-category-wrapper .title,.vp-star-article-wrapper .title,.vp-star-article:hover,.vp-tag-wrapper .title{cursor:pointer}.vp-category-wrapper .title .icon,.vp-star-article-wrapper .title .icon,.vp-tag-wrapper .title .icon{position:relative;bottom:-.125rem;width:16px;height:16px;margin:0 6px}.vp-category-wrapper .title .num,.vp-star-article-wrapper .title .num,.vp-tag-wrapper .title .num{position:relative;margin:0 2px;font-size:22px;font-family:var(--font-family-heading)}.vp-star-articles{overflow-y:auto;max-height:80vh;margin:8px auto;line-height:1.5}.vp-star-article{padding:12px 8px 4px;border-bottom:1px dashed var(--grey);transition:border-color var(--color-transition),color var(--color-transition)}.vp-category-wrapper .category-list-wrapper,.vp-tag-wrapper .tag-list-wrapper{overflow-y:auto;max-height:80vh;margin:8px auto}.vp-sidebar .vp-blog-info-wrapper .vp-blogger-info{display:none}.vp-page .vp-blog-info-wrapper{position:sticky;top:calc(var(--navbar-height) + .75rem);flex:0 0 300px;box-sizing:border-box;width:300px;height:auto;margin-top:.75rem;margin-bottom:.75rem;margin-inline-start:1rem;transition:all .3s}@media (max-width:719px){.vp-page .vp-blog-info-wrapper{display:none}}.vp-page .vp-blog-info-wrapper .vp-blogger-info{margin-bottom:16px;padding:8px 0;border-radius:8px;box-shadow:0 1px 3px 1px var(--card-shadow)}.vp-page .vp-blog-info-wrapper .vp-blogger-info:hover{box-shadow:0 2px 6px 2px var(--card-shadow)}.theme-container .vp-page.vp-blog{display:flex;flex-direction:column;justify-content:space-between;box-sizing:border-box;padding-top:var(--navbar-height);padding-bottom:2rem;background:var(--bg-color-back);transition:background var(--color-transition)}@media (min-width:1440px){.theme-container.has-toc .vp-page.vp-blog{padding-inline-end:0}}.blog-page-wrapper{display:flex;align-items:flex-start;justify-content:center;box-sizing:border-box;width:100%;margin:0 auto;padding:0 2rem}@media (max-width:959px){.blog-page-wrapper{padding:0 1rem}}@media (max-width:419px){.blog-page-wrapper{padding:0}}.vp-blog-main{flex:1;width:0;max-width:780px}.vp-pagination{margin:1.25rem 0 .75rem;font-weight:600;font-size:15px;line-height:2}.vp-pagination-list{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vp-pagination-number{display:flex;align-items:stretch;overflow:hidden;height:30px;margin:0 .5rem;border:1px solid var(--border-color);border-radius:.25rem}.vp-pagination-number div{position:relative;padding:0 .5rem;background:var(--bg-color);color:var(--theme-color);cursor:pointer}.vp-pagination-number div::before{content:" ";position:absolute;top:0;bottom:0;inset-inline-start:0;width:1px;background:var(--border-color)}.vp-pagination-number div:first-child::before{background:0 0}.vp-pagination-button:hover,.vp-pagination-number div:hover{color:var(--theme-color-light)}.vp-pagination-number div.active{background:var(--theme-color);color:var(--white)}.vp-pagination-number div.active+div::before,.vp-pagination-number div.active::before{background:var(--theme-color)}.vp-pagination-number div.next,.vp-pagination-number div.prev{font-size:13px;line-height:30px}.vp-pagination-number div.active,.vp-pagination-number div.ellipsis{cursor:default}.vp-pagination-nav{display:flex;align-items:center;justify-content:center;margin:.5rem}.vp-pagination-button,.vp-pagination-nav input{border:1px solid var(--border-color);border-radius:.25em;background:var(--bg-color);outline:0;line-height:2}.vp-pagination-nav input{width:3.5rem;margin:6px 5px;color:var(--text-color);text-align:center}.vp-pagination-button{overflow:hidden;padding:0 .75em;color:var(--theme-color);font-weight:600;font-size:15px;cursor:pointer}.vp-project-panel{position:relative;z-index:2;display:flex;flex-wrap:wrap;align-items:stretch;place-content:stretch flex-start;margin-bottom:12px}.vp-project-panel:empty{margin-bottom:0}.vp-project-card{position:relative;width:calc(33% - 40px);margin:6px 8px;padding:12px;border-radius:8px;background:var(--bg-color-float);transition:background var(--color-transition),transform var(--transform-transition)}@media (max-width:959px){.vp-project-card{width:calc(50% - 40px)}}@media (min-width:1440px){.vp-project-card{width:calc(25% - 40px)}}.vp-project-card:hover{cursor:pointer;transform:scale(.98,.98)}.vp-project-card .icon{position:relative;z-index:2;float:right;width:20px;height:20px}html[dir=rtl] .vp-project-card .icon,html[dir=rtl] .vp-project-image{float:left}.vp-project-card.project0{background:#fde5e7}.vp-project-card.project0:hover{background:#f9bec3}html[data-theme=dark] .vp-project-card.project0{background:#340509}html[data-theme=dark] .vp-project-card.project0:hover{background:#53080e}.vp-project-card.project1{background:#ffeee8}.vp-project-card.project1:hover{background:#fed4c6}html[data-theme=dark] .vp-project-card.project1{background:#441201}html[data-theme=dark] .vp-project-card.project1:hover{background:#6d1d02}.vp-project-card.project2{background:#fef5e7}.vp-project-card.project2:hover{background:#fce6c4}html[data-theme=dark] .vp-project-card.project2{background:#3e2703}html[data-theme=dark] .vp-project-card.project2:hover{background:#633f05}.vp-project-card.project3{background:#eafaf1}.vp-project-card.project3:hover{background:#caf3db}html[data-theme=dark] .vp-project-card.project3{background:#0c331c}html[data-theme=dark] .vp-project-card.project3:hover{background:#12522d}.vp-project-card.project4{background:#e6f9ee}.vp-project-card.project4:hover{background:#c0f1d5}html[data-theme=dark] .vp-project-card.project4{background:#092917}html[data-theme=dark] .vp-project-card.project4:hover{background:#0f4224}.vp-project-card.project5{background:#e1fcfc}.vp-project-card.project5:hover{background:#b4f8f8}html[data-theme=dark] .vp-project-card.project5{background:#042929}html[data-theme=dark] .vp-project-card.project5:hover{background:#064242}.vp-project-card.project6{background:#e4f0fe}.vp-project-card.project6:hover{background:#bbdafc}html[data-theme=dark] .vp-project-card.project6{background:#021b36}html[data-theme=dark] .vp-project-card.project6:hover{background:#042c57}.vp-project-card.project7{background:#f7f1fd}.vp-project-card.project7:hover{background:#eadbfa}html[data-theme=dark] .vp-project-card.project7{background:#2a0b4b}html[data-theme=dark] .vp-project-card.project7:hover{background:#431277}.vp-project-card.project8{background:#fdeaf5}.vp-project-card.project8:hover{background:#facbe5}html[data-theme=dark] .vp-project-card.project8{background:#400626}html[data-theme=dark] .vp-project-card.project8:hover{background:#670a3d}.vp-project-name{position:relative;z-index:2;color:var(--grey3);font-weight:500;font-size:16px;transition:color var(--color-transition)}.vp-project-desc{position:relative;z-index:2;margin:6px 0;color:var(--dark-grey);font-size:13px}.vp-project-image{position:relative;z-index:2;float:right;width:40px;height:40px}.vp-social-medias{display:flex;flex-wrap:wrap;justify-content:center;margin:8px auto}.vp-social-media{width:26px;height:26px;margin:4px;transition:transform .18s ease-out .18s;transform:scale(1,1)}.vp-social-media:hover{cursor:pointer;transform:scale(1.2,1.2)}.vp-social-media::after{--balloon-font-size:8px;padding:.3em .6em}.vp-social-media .icon{width:100%;height:100%}.tag-list-wrapper{position:relative;z-index:2;display:flex;flex-wrap:wrap;justify-content:flex-start;padding-inline-start:0;list-style:none}.tag-list-wrapper .tag{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;min-width:24px;margin:4px 6px;padding:3px 8px;border-radius:8px;color:var(--white);box-shadow:0 1px 6px 0 var(--box-shadow);font-size:12px;text-align:center;word-break:break-word;cursor:pointer;transition:background var(--color-transition),box-shadow var(--color-transition),transform var(--color-transition)}.tag-list-wrapper .tag:hover{cursor:pointer}.tag-list-wrapper .tag.active{transform:scale(1.1,1.1)}.tag-list-wrapper .tag-num{margin-inline-start:.5em}.tag-list-wrapper .tag0,html[data-theme=dark] .tag-list-wrapper .tag0.active,html[data-theme=dark] .tag-list-wrapper .tag0:hover{background:#e91526}.tag-list-wrapper .tag0.active,.tag-list-wrapper .tag0:hover,html[data-theme=dark] .tag-list-wrapper .tag0{background:#c51220}.tag-list-wrapper .tag1,html[data-theme=dark] .tag-list-wrapper .tag1.active,html[data-theme=dark] .tag-list-wrapper .tag1:hover{background:#fb6533}.tag-list-wrapper .tag1.active,.tag-list-wrapper .tag1:hover,html[data-theme=dark] .tag-list-wrapper .tag1{background:#fa4a0e}.tag-list-wrapper .tag2,html[data-theme=dark] .tag-list-wrapper .tag2.active,html[data-theme=dark] .tag-list-wrapper .tag2:hover{background:#f4a62a}.tag-list-wrapper .tag2.active,.tag-list-wrapper .tag2:hover,html[data-theme=dark] .tag-list-wrapper .tag2{background:#ec950c}.tag-list-wrapper .tag3,html[data-theme=dark] .tag-list-wrapper .tag3.active,html[data-theme=dark] .tag-list-wrapper .tag3:hover{background:#40d47f}.tag-list-wrapper .tag3.active,.tag-list-wrapper .tag3:hover,html[data-theme=dark] .tag-list-wrapper .tag3{background:#2cc26b}.tag-list-wrapper .tag4,html[data-theme=dark] .tag-list-wrapper .tag4.active,html[data-theme=dark] .tag-list-wrapper .tag4:hover{background:#2bbe69}.tag-list-wrapper .tag4.active,.tag-list-wrapper .tag4:hover,html[data-theme=dark] .tag-list-wrapper .tag4{background:#239d56}.tag-list-wrapper .tag5,html[data-theme=dark] .tag-list-wrapper .tag5.active,html[data-theme=dark] .tag-list-wrapper .tag5:hover{background:#13c3c3}.tag-list-wrapper .tag5.active,.tag-list-wrapper .tag5:hover,html[data-theme=dark] .tag-list-wrapper .tag5{background:#0f9d9d}.tag-list-wrapper .tag6,html[data-theme=dark] .tag-list-wrapper .tag6.active,html[data-theme=dark] .tag-list-wrapper .tag6:hover{background:#0a7bf4}.tag-list-wrapper .tag6.active,.tag-list-wrapper .tag6:hover,html[data-theme=dark] .tag-list-wrapper .tag6{background:#0968ce}.tag-list-wrapper .tag7,html[data-theme=dark] .tag-list-wrapper .tag7.active,html[data-theme=dark] .tag-list-wrapper .tag7:hover{background:#b37deb}.tag-list-wrapper .tag7.active,.tag-list-wrapper .tag7:hover,html[data-theme=dark] .tag-list-wrapper .tag7{background:#a160e7}.tag-list-wrapper .tag8,html[data-theme=dark] .tag-list-wrapper .tag8.active,html[data-theme=dark] .tag-list-wrapper .tag8:hover{background:#ed44a1}.tag-list-wrapper .tag8.active,.tag-list-wrapper .tag8:hover,html[data-theme=dark] .tag-list-wrapper .tag8{background:#ea2290}.timeline-wrapper{--dot-color:#fff;--dot-bar-color:#eaecef;--dot-border-color:#ddd;max-width:740px;margin:0 auto;padding:40px 0}@media (max-width:719px){.timeline-wrapper{margin:0 1.2rem}}html[data-theme=dark] .timeline-wrapper{--dot-color:#444;--dot-bar-color:#333;--dot-border-color:#555}.timeline-wrapper #toc{inset-inline:unset 0;min-width:0}.timeline-wrapper .toc-wrapper{position:relative;z-index:10}.timeline-wrapper .timeline-content{position:relative;box-sizing:border-box;padding-inline-start:76px;list-style:none}.timeline-wrapper .timeline-content::after{content:" ";position:absolute;top:14px;inset-inline-start:64px;z-index:-1;width:4px;height:calc(100% - 38px);margin-inline-end:-2px;background:var(--dot-bar-color);transition:background var(--color-transition)}.timeline-wrapper .motto{position:relative;color:var(--text-color);font-size:18px;transition:color var(--color-transition)}@media (min-width:1280px){.timeline-wrapper .motto{font-size:20px}}.timeline-wrapper .motto::before,.timeline-wrapper .timeline-date::before,.timeline-wrapper .timeline-year-title span::before{content:" ";position:absolute;top:50%;z-index:2;margin-top:-6px;margin-inline-start:-6px;border:2px solid var(--dot-border-color);border-radius:50%;background:var(--dot-color);transition:background var(--color-transition),border-color var(--color-transition)}.timeline-wrapper .motto::before,.timeline-wrapper .timeline-year-title span::before{inset-inline-start:-10px;width:8px;height:8px}.timeline-wrapper .timeline-year-title{margin-top:calc(3rem - var(--navbar-height));margin-bottom:.5rem;padding-top:var(--navbar-height);color:var(--text-color);font-weight:700;font-size:26px;font-family:var(--font-family-heading);transition:color var(--color-transition)}.timeline-wrapper .timeline-year-wrapper{padding-inline-start:0!important}.timeline-wrapper .timeline-date{position:absolute;inset-inline-end:calc(100% + 24px);width:50px;font-size:14px;line-height:30px;text-align:end}.timeline-wrapper .timeline-date::before{inset-inline-end:-19px;width:6px;height:6px}.timeline-wrapper .timeline-title{position:relative;display:block;color:inherit;font-size:16px;line-height:30px;transition:color var(--color-transition),font-size var(--transform-transition)}.timeline-wrapper .timeline-item{position:relative;z-index:3;display:flex;padding:30px 0 10px;border-bottom:1px dashed var(--border-color);list-style:none;transition:border-color var(--color-transition)}.timeline-list-wrapper .timeline-list-title,.timeline-wrapper .timeline-item:hover{cursor:pointer}.timeline-wrapper .timeline-item:hover .timeline-date{font-size:16px;transition:border-color var(--color-transition),color var(--color-transition),font-size var(--transform-transition)}.timeline-wrapper .timeline-item:hover .timeline-date::before{border-color:var(--theme-color);background:var(--bg-color-secondary)}.timeline-wrapper .timeline-item:hover .timeline-title{color:var(--theme-color);font-size:18px}.timeline-list-wrapper{--dot-color:#fff;--dot-bar-color:#eaecef;--dot-border-color:#ddd;padding:8px 0}html[data-theme=dark] .timeline-list-wrapper{--dot-color:#444;--dot-bar-color:#333;--dot-border-color:#555}.timeline-list-wrapper .timeline-list-title .icon{position:relative;bottom:-.125rem;width:16px;height:16px;margin:0 6px}.timeline-list-wrapper .timeline-list-title .num{position:relative;margin:0 2px;font-size:22px}.timeline-list-wrapper .timeline-content{overflow-y:auto;max-height:80vh}.timeline-list-wrapper .timeline-content::-webkit-scrollbar-track-piece{background:0 0}.timeline-list-wrapper .timeline-list{position:relative;box-sizing:border-box;margin:0 8px;list-style:none}.timeline-list-wrapper .timeline-list::after{content:" ";position:absolute;top:14px;inset-inline-start:0;z-index:-1;width:4px;height:calc(100% - 14px);margin-inline-start:-2px;background:var(--dot-bar-color);transition:background var(--color-transition)}.timeline-list-wrapper .timeline-year{position:relative;margin:20px 0 0;color:var(--text-color);font-weight:700;font-size:20px}.timeline-list-wrapper .timeline-date::before,.timeline-list-wrapper .timeline-year::before{content:" ";position:absolute;z-index:2;border:1px solid var(--dot-border-color);border-radius:50%;background:var(--dot-color);transition:background var(--color-transition),border-color var(--color-transition);margin-inline-start:-4px}.timeline-list-wrapper .timeline-year::before{top:50%;inset-inline-start:-20px;width:8px;height:8px;margin-top:-4px}.timeline-list-wrapper .timeline-year-wrapper{padding-inline-start:0!important}.timeline-list-wrapper .timeline-date{display:inline-block;vertical-align:bottom;width:36px;font-size:12px;line-height:32px;transition:color var(--color-transition)}.timeline-list-wrapper .timeline-date::before{top:24px;inset-inline-start:-19px;width:6px;height:6px}.timeline-list-wrapper .timeline-title{color:inherit;font-size:14px;line-height:32px;cursor:pointer;transition:color var(--color-transition)}.timeline-list-wrapper .timeline-item{position:relative;display:flex;padding:12px 0 4px;border-bottom:1px dashed var(--border-color);list-style:none;transition:border-color var(--color-transition)}.timeline-list-wrapper .timeline-item:hover .timeline-date,.timeline-list-wrapper .timeline-item:hover .timeline-title{color:var(--theme-color)}.timeline-list-wrapper .timeline-item:hover .timeline-date::before{border-color:var(--dot-color);background:var(--theme-color)} -:root{--navbar-bg-color:var(--bg-color-float-blur);--sidebar-bg-color:var(--bg-color-blur)}html[data-theme=dark]{--navbar-bg-color:var(--bg-color-blur);--sidebar-bg-color:var(--bg-color-blur);color-scheme:dark}#app{--code-hl-bg-color:var(--code-highlight-line-color);--code-ln-color:var(--code-line-color);--code-ln-wrapper-width:var(--line-numbers-width);--code-tabs-nav-text-color:var(--code-color);--code-tabs-nav-bg-color:var(--code-border-color);--code-tabs-nav-hover-color:var(--code-highlight-line-color);--sidebar-space:var(--sidebar-width)}@media (max-width:959px){#app{--navbar-height:var(--navbar-mobile-height);--navbar-vertical-padding:var(--navbar-mobile-vertical-padding);--navbar-horizontal-padding:var(--navbar-mobile-horizontal-padding);--sidebar-width:var(--sidebar-mobile-width)}}@media (min-width:1440px){#app{--sidebar-space:clamp( var(--sidebar-width), calc(max(0px, calc((100vw - var(--content-width)) / 2 - 2rem))), 100vw )}}.DocSearch,.DocSearch-Button{--docsearch-primary-color:var(--vp-tc);--docsearch-text-color:var(--vp-c);--docsearch-highlight-color:var(--vp-tc);--docsearch-muted-color:var(--light-grey);--docsearch-container-background:rgb(9 10 17 / 80%);--docsearch-modal-background:var(--bg-color-float);--docsearch-searchbox-background:var(--bg-color-secondary);--docsearch-searchbox-focus-background:var(--vp-bg);--docsearch-searchbox-shadow:inset 0 0 0 2px var(--vp-tc);--docsearch-hit-color:var(--vp-cl);--docsearch-hit-active-color:var(--vp-bg);--docsearch-hit-background:var(--vp-bg);--docsearch-hit-shadow:0 1px 3px 0 var(--border-color);--docsearch-footer-background:var(--vp-bg)}html[data-theme=dark] .DocSearch,html[data-theme=dark] .DocSearch-Button{--docsearch-logo-color:var(--vp-c);--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow:inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgb(3 4 9 / 30%);--docsearch-key-gradient:linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow:inset 0 1px 0 0 rgb(73 76 106 / 50%), 0 -4px 8px 0 rgb(0 0 0 / 20%)}#nprogress{--nprogress-color:var(--vp-tc)}.search-box{--search-bg-color:var(--vp-bg);--search-accent-color:var(--vp-tc);--search-text-color:var(--vp-c);--search-border-color:var(--border-color);--search-item-text-color:var(--vp-clt);--search-item-focus-bg-color:var(--bg-color-secondary)}.external-link-icon{--external-link-icon-color:var(--light-grey)}body,html{margin:0;padding:0;background:#fff}html{font-size:16px;font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent}@media print{html{font-size:12pt}}body{min-height:100vh;color:#2c3e50}a,p a code{color:#3eaf7c}a{font-weight:500;text-decoration:none}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid #eee;border-radius:.25em;box-shadow:1px 1px 4px 0 rgba(0,0,0,.15);line-height:1;letter-spacing:-.1em;text-align:center;border-color:var(--border-color-dark);background:var(--bg-color-secondary)}a,code,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}code,kbd{font-family:var(--font-family-mono)}code{margin:0;padding:.2rem .4rem;border-radius:5px;background:rgba(127,127,127,.12);font-size:.85em;transition:background var(--color-transition),color var(--color-transition)}table code{padding:.1rem .4rem}p a code{font-weight:400}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.25}a.header-anchor:focus-visible,h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:0}h1{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid #eaecef;font-size:1.65rem}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{position:relative;color:inherit}a.header-anchor:hover::before{content:"¶";position:absolute;bottom:0;left:-.75em;color:var(--c-brand);font-size:.75em}a.header-anchor:focus-visible::before{content:"¶";position:absolute;left:-.75em;color:var(--c-brand);outline:auto}blockquote,ol,p,ul{overflow-wrap:break-word}ol,p,ul{line-height:1.6}@media print{ol,p,ul{line-height:1.5}}ol,ul{padding-inline-start:1.2em}blockquote{margin:1rem 0;padding:.25rem 0 .25rem 1rem;border-inline-start:.2rem solid #ddd;font-size:1rem}blockquote>p{margin:0}hr{border:0;border-top:1px solid #eaecef;border-color:var(--border-color);transition:border-top-color var(--color-transition)}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tr:nth-child(odd){background:#f6f8fa;background:var(--bg-color-secondary)}td,th{padding:.6em 1em;border:1px solid #dfe2e5;border-color:var(--border-color-dark)}pre{direction:ltr}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,::after,::before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a[href^="http://"]::after,a[href^="https://"]::after{content:" ("attr(href)") "}abbr[title]::after{content:" ("attr(title)")"}pre{border:1px solid #eee}pre,pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}canvas,img,tr{page-break-inside:avoid}}@font-face{font-weight:400;font-style:normal;font-family:Crimson;src:url(data:font/truetype;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTYr5mwEAAAyMAAAAHEdERUYAKQATAAAMbAAAAB5PUy8yVsJ0MgAAAVgAAABgY21hcBiKDzgAAAHcAAABWGdhc3D//wADAAAMZAAAAAhnbHlmr+DBdQAAA1AAAAdsaGVhZBZwt+8AAADcAAAANmhoZWEFawEuAAABFAAAACRobXR4BksA9gAAAbgAAAAibG9jYQlsC24AAAM0AAAAHG1heHAAEQBZAAABOAAAACBuYW1lLaFDVAAACrwAAAFrcG9zdAC1AHoAAAwoAAAAPAABAAAAAQAAqBd2H18PPPUACwQAAAAAANqqufwAAAAA2qq5/AAb/9wB4QMeAAAACAACAAAAAAAAAAEAAAMs/ywAXAH9AAAAAAHhAAEAAAAAAAAAAAAAAAAAAAAEAAEAAAANAFkAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAH1AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAIABgMAAAAAAAAAAAABEAAAAAAAAAAAAAAAUGZFZADAADAAOQMs/ywAXAMsANQAAAABAAAAAAMYAAAAAAAgAAEBpwAfAAAAAAFVAAAB/QAfAH0ALQA+ABsAPgAyACgAPgAxAAAAAAADAAAAAwAAABwAAQAAAAAAUgADAAEAAAAcAAQANgAAAAQABAABAAAAOf//AAAAL///AAAAAQAEAAAAAAADAAQABQAGAAcACAAJAAoACwAMAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwQFBgcICQoLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAJgAmAGIAwAEeAZIBzgJAApYC2gNiA7YAAQAf/9wBhwMeABIAAAEGBwYHATAXFjM2NzY3ASYnJjcBgxwLCgH+zgMECxIKCgIBLgEDAwMDHhQFBgP85wMEAQgJBgMOAwMDEwAAAAIAH//9Ad0CkAAQACEAABMWFxYXNjc2NzQnJicGBwYHNyY3NjcWFxYXFAcGByYnJjcfATo6amo7OQE5OmxrOjkBXQIlJEE5IyIBIyJEOSQjAgFOkV5eBAReXoqJXl4EBF5eggJ0UlEDA09Qe3xVVgMDU1OEAAAAAAEAff/9AYACkQA+AAA3FAcGBwYHBiMGFQYXNjc2MzIXFhc2JzQnIicmJyY1JjURNjc2MSYnJicjBgcGBwYVFBUUFxYXNjc2NzIXFhXkAQEEBRgYDAMBBB4ZGhweGxofBAEDDBgZBQQBAQMEAQIDBAIFNTZCAgMDBA0XFw0LBQV3GBMVDAgEBAUKCgUCAQICAQIFCgoFBAQIDBUTGAGnLxkbBAYFAQIZGh4BAgECBQUEAwUHBwEICRYAAAAAAQAtAAAB0QKRADoAADcGFxYXITY3NjcmJyYjIgcGBwYHBisBNjc2NzY3NjUmJyYnBgcGBxQXFhc2NzY3FhcWFxYHBgcGBwYHLgEEAwMBYwURERADBwYFBAMDAg8VEx/LJkBAOhsQDwIxMkxSMjIHCAYGCSYmPTIfHwEBCgoeLkJBQg8EBQQCETAwKQICAgEBBCgUEylJSUYhJicsRDIzAgY1NRoEBQYBEyEhAwEjIjYlJCQtQlBQSAAAAAABAD7/+wG+ApEASgAANwYXFhcWFxYzNjc2NyYnJic2NzY3JicmIwYHBgcUFxYXNjc2NxYXFhcGBwYHBgcUFRQXNjc2NxYXFhcGBwYnIicmJyYnJiciBwYXPwEIBwUaHB0VZU5NBAMvLi8eIB4DAywsKzwrKxgEAwUIHR4wLRscAQMvLz8BAQYKEhEQNSYmAgImJSsWExQPCw0NFREMDQE7DgsLBQwFBgE8PWpMKSoGECQkMkAiIQIdHyUHBwcBCRscAwEbGSpCIyUOAgMCAwwIAwUEAQEoKD9XJSQBBQYODg8PAQ0NFQAAAgAb//oB4QKTACIAJQAANxQXFhchFRQXFjMyNzYjNTM2NzY1NCcmJyMRNCcmIwYHBgcBExEbAgMFASEJCRIdCAkBRgIBAQUEBTwFAwgHCQkG/vjmxgUGBgOwBQIBAwKzAgQDCBAMDQEBlAYGBgEICQf+cwEs/tQAAQA+//sBvgKTAEoAADcGFxYXFhcWMzY3NjcmJyYnIgcGBzY3NjczMjc2NzY3NjU0JyYnBgcGByMGBwYHFBcWMzY3NjMWFxYHBgcGJyInJicmJyYnIgcGFz8BCAcFGhwdFWVOTQQBMjJbFx8gFwoJCQlWKB0dFQ4JCAQDBQMdHSKXCREQEgMCBA4bGhNYJyUBAiYlKxYTFA8LDQ0VEQwNATsOCwsFDAUGATw9akU2NwMFBggrMC8uAgICExcZBgQCAgMBAwQBMVNUWAUFBAYFBAMxMTNZIyQBBQYODg8PAQ0NFQAAAgAy//oBzQKXACAAMwAANxQXFhc2NzY3NicmJyIHBgc2NzY3NCcmJwYHBgcGBwYXNyY3Njc2FxYXFgcGBwYHJicmNzM1NV5aOTsCAioqahoiIRsnWFhFAwIHQ0tMOTAZGQFbBAQaGxkXRB8fAQEfIDE9Hh4E511FRwQDPT1ZPEJBBQwLF4Y9PRMGCwwBEiwsPDZFRkkTHyAbCAcBAjAwREYsLQEFREVQAAAAAAEAKP/7AdUCiwApAAATFhcWMzI3Njc2NzYzIQYHBgcWFxYzMjcBNjc2NzQnJiMiBwYjIQYHBgcoAwYHAwYDAwELEBEdAQUJYWJXAQ8PDgcDAQ4LCQgBAQEEBhUVFv7JBgsNDAH6DQMCAQEFKRITFMjHjQcFBgMCPxYSEwoEAgMBAhkrKiAAAAADAD7/9wG/ApIAKABBAFgAADcGFxYXNjc2NyYnJicmJzQ3Njc2NyYnJiMGBwYHFhcWFxYVFAcGBwYHNyY3Njc2MzIzMhcyFxYXFhcGBwYHIicmNxMmNzY3FhcWFRQHBgcGByIjIicmJyY3PwE1M1ZQODgDAykpMQIBAyYlJQMCMC9HRjExAgIiIiMCAiMvLwNTBBQTKgEBAQECAQIBEjU1CAEdHjMrISICGAMYGSYvGxoTEx8CAQIBBAMfJCQBoU8tLQECMjFPOC4uGwIBAgEWJiU7SCYoAjEwQzopKhMBAgECEykpQAQsIiEbAQEBBywsQjUeHQEiI0QBZSMhIAECJiYvKh8gFAEBAhAfIEYAAAIAMf/6AcsClwAgADMAABMGFxYXMjc2NwYHBgcUFxYXNjc2NzY3NjUmJyYnBgcGBzcmNzY3FhcWFRQHBgcGJyYnJjc0AyopahoiIRsoV1hFAwIHQ0tMODEZGQE2NF5ZOjoBWgMfHzE9Hh4EGhoaF0QeHwUBy0dBQgUMCxeFPj0SBwsLAREsLD01RkVPV0dFBQQ8PU8UPCwtAQVFRUklIRsHCAECMDBPAAAADACWAAEAAAAAAAEABwAQAAEAAAAAAAIABwAoAAEAAAAAAAMABwBAAAEAAAAAAAQABwBYAAEAAAAAAAUAHgCeAAEAAAAAAAYABwDNAAMAAQQJAAEADgAAAAMAAQQJAAIADgAYAAMAAQQJAAMADgAwAAMAAQQJAAQADgBIAAMAAQQJAAUAPABgAAMAAQQJAAYADgC9AEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAFYAZQByAHMAaQBvAG4AIAAxAC4AMAA7ACAARgBvAG4AdABFAGQAaQB0AG8AcgAgACgAdgAxAC4AMAApAABWZXJzaW9uIDEuMDsgRm9udEVkaXRvciAodjEuMCkAAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAAACAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAABAAIAEwAUABUAFgAXABgAGQAaABsAHAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAwAAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA2qq5/AAAAADaqrn8)format("truetype")}body,html{background:var(--bg-color);transition:background var(--color-transition)}:root{color-scheme:light}body{color:var(--text-color);font-family:var(--font-family)}@media (min-width:1440px){body{font-size:17px}}#toc .toc-item:hover>.toc-link,.page-info a:active,.page-info a:hover,.vp-breadcrumb a:hover,a,p a code{color:var(--theme-color)}html[data-theme=dark] code{background:#333}blockquote{border-color:#eee;color:#666;transition:border-color var(--color-transition),color var(--color-transition)}html[data-theme=dark] blockquote{border-color:#333}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-heading)}@media (max-width:419px){h1{font-size:1.9rem}}h2{border-color:var(--border-color);transition:border-bottom-color var(--color-transition)}@media print{@page{--text-color:#000!important;--bg-color:#fff!important}div[class*=language-]{position:relative!important}}.theme-hope-content:not(.custom)>:first-child{margin-top:0}.vp-breadcrumb{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;position:relative;z-index:2;padding-top:1rem;font-size:15px}@media (max-width:959px){.vp-breadcrumb{padding-inline:1.5rem}}@media print{.vp-breadcrumb{max-width:unset}}@media (max-width:959px){.vp-breadcrumb{font-size:14px}}@media (max-width:419px){.vp-breadcrumb{padding-top:.5rem;font-size:12.8px}}@media print{.vp-breadcrumb{display:none}}.vp-breadcrumb .icon{margin-inline-end:.25em;font-size:1em}#nav-screen img.icon,.vp-breadcrumb img.icon,.vp-highlight-title img.icon,.vp-navbar .nav-link img.icon,.vp-page-nav .next img.icon,.vp-page-nav .prev img.icon,.vp-page-title h1 img.icon,.vp-sidebar img.icon{vertical-align:-.125em;height:1em}.vp-breadcrumb a{display:inline-block;padding:0 .5em}.vp-breadcrumb a::before{position:relative;bottom:.125rem;margin-inline-end:.25em}.vp-breadcrumb ol{margin:0;padding-inline-start:0;list-style:none}.vp-breadcrumb li{display:inline-block;line-height:1.5}.vp-breadcrumb li:first-child a{padding-inline-start:0}.vp-breadcrumb li:last-child a{padding-inline-end:0}.vp-breadcrumb li.is-active a{color:var(--light-grey);cursor:default;pointer-events:none}.vp-breadcrumb li+li::before{content:"/";color:var(--light-grey)}.toggle-sidebar-wrapper{position:fixed;top:var(--navbar-height);bottom:0;inset-inline-start:var(--sidebar-space);z-index:100;display:flex;align-items:center;justify-content:center;font-size:2rem;transition:inset-inline-start var(--transform-transition)}@media (max-width:719px){.toggle-sidebar-wrapper{display:none}}@media (min-width:1440px){.toggle-sidebar-wrapper{display:none}}.toggle-sidebar-wrapper:hover{background:rgba(127,127,127,.05);cursor:pointer}.toggle-sidebar-wrapper .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}html[data-theme=dark] .toggle-sidebar-wrapper .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.toggle-sidebar-wrapper .arrow.down{transform:rotate(180deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.down,html[dir=rtl] .vp-page-nav .nav-link .arrow.down{transform:rotate(-180deg)}.toggle-sidebar-wrapper .arrow.end{transform:rotate(90deg)}.toggle-sidebar-wrapper .arrow.start,html[dir=rtl] .toggle-sidebar-wrapper .arrow.end,html[dir=rtl] .vp-page-nav .nav-link .arrow.end{transform:rotate(-90deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.start{transform:rotate(90deg)}.theme-container{display:flex;flex-direction:column;justify-content:space-between;min-height:100vh}.theme-container .vp-page{padding-top:var(--navbar-height);padding-inline-start:calc(var(--sidebar-space) + 2rem)}@media (max-width:719px){.theme-container .vp-page{padding-inline:0}}@media (min-width:1440px){.theme-container .vp-page{padding-inline-end:calc(100vw - var(--content-width) - var(--sidebar-space) - 6rem)}}.theme-container .vp-sidebar{top:var(--navbar-height)}.theme-container.no-navbar .vp-page{padding-top:0}.theme-container.no-navbar .vp-sidebar{top:0}@media (max-width:719px){.theme-container.hide-navbar .vp-sidebar,.theme-container.no-navbar .vp-sidebar{top:0}}.theme-container.sidebar-collapsed .vp-page{padding-inline-start:0}.theme-container.sidebar-collapsed .vp-sidebar{box-shadow:none;transform:translateX(-100%)}html[dir=rtl] .theme-container.sidebar-collapsed .vp-sidebar{transform:translateX(100%)}.theme-container.sidebar-collapsed .toggle-sidebar-wrapper{inset-inline-start:0}.theme-container.no-sidebar .vp-page{padding-inline:0}@media (min-width:1440px){.theme-container.no-sidebar.has-toc .vp-page{padding-inline-end:16rem}}.theme-container.no-sidebar .toggle-sidebar-wrapper,.theme-container.no-sidebar .vp-sidebar,.theme-container.no-sidebar .vp-toggle-sidebar-button{display:none}.theme-container.sidebar-open .vp-sidebar{box-shadow:2px 0 8px var(--card-shadow);transform:translateX(0)}.fade-slide-y-enter-active{transition:all .3s ease!important}.fade-slide-y-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)!important}.fade-slide-y-enter-from,.fade-slide-y-leave-to{opacity:0;transform:translateY(10px)}.vp-feature-wrapper{position:relative}.vp-feature-bg{position:absolute;inset:0;z-index:0;background-attachment:fixed;background-position:50%;background-size:cover}.vp-feature-bg.light{display:inline-block}.vp-feature-bg.dark,html[data-theme=dark] .vp-feature-bg.light{display:none}html[data-theme=dark] .vp-feature-bg.dark{display:inline-block}.vp-feature{position:relative;z-index:1;margin:0 auto;padding:1.5rem 1rem;color:var(--text-color-lighter);text-align:center}.vp-feature-bg+.vp-feature{color:#222}html[data-theme=dark] .vp-feature-bg+.vp-feature,html[data-theme=dark] .vp-highlight{color:#eee}.page-info a,.vp-feature-bg+.vp-feature .icon{color:inherit}.vp-feature-image{height:10rem;margin:0 auto}@media (max-width:959px){.vp-feature-image{height:8rem}}.vp-feature-image.light{display:inline-block}.vp-feature-image.dark,html[data-theme=dark] .vp-feature-image.light{display:none}html[data-theme=dark] .vp-feature-image.dark{display:inline-block}.vp-feature-header{margin-bottom:1.5rem;border-bottom:none;font-size:3rem;font-family:var(--font-family);text-align:center}@media (max-width:959px){.vp-feature-header{font-size:2.5rem}}@media (max-width:719px){.vp-feature-header{font-size:2.25rem}}@media (max-width:419px){.vp-feature-header{font-size:2rem}}.vp-feature-description{font-size:1.125rem}.vp-features{z-index:1;display:flex;flex-wrap:wrap;align-items:stretch;place-content:stretch center;margin:1rem 0;text-align:start}@media print{.vp-features{display:block}}.vp-features:first-child{border-top:1px solid var(--border-color);transition:border-color var(--color-transition)}.vp-feature-item{position:relative;display:block;flex-basis:calc(33% - 3rem);margin:.5rem;padding:1rem;border-radius:.5rem;color:inherit;transition:background var(--color-transition),box-shadow var(--color-transition),transform var(--transform-transition)}@media (min-width:1440px){.vp-feature-item{flex-basis:calc(25% - 3rem)}}@media (max-width:959px){.vp-feature-item{flex-basis:calc(50% - 3rem)}}@media (max-width:719px){.vp-feature-item{flex-basis:100%;font-size:.95rem}}@media (max-width:419px){.vp-feature-item{margin:.5rem 0;font-size:.9rem}}.vp-feature-item.link{cursor:pointer}@media print{.vp-feature-item.link{text-decoration:none}}.vp-feature-item .icon{display:inline-block;height:1.1em;margin-inline-end:.5rem;color:var(--theme-color);font-weight:400;font-size:1.1em}.vp-feature-item:hover{background-color:var(--bg-color-secondary);box-shadow:0 2px 12px 0 var(--card-shadow);transform:translate(-2px,-2px);transform:scale(1.05)}.vp-feature-bg+.vp-feature .vp-feature-item:hover{background-color:transparent}.vp-feature-item:only-child{flex-basis:100%}.vp-feature-item:first-child:nth-last-child(2),.vp-feature-item:nth-child(2):last-child{flex-basis:calc(50% - 3rem)}@media (max-width:719px){.vp-feature-item:first-child:nth-last-child(2),.vp-feature-item:nth-child(2):last-child{flex-basis:100%}}.vp-feature-title{margin:.25rem 0 .5rem;font-weight:700;font-size:1.3rem;font-family:var(--font-family)}@media (max-width:419px){.vp-feature-title{font-size:1.2rem}}.vp-feature-details{margin:0;line-height:1.4}.vp-footer-wrapper{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly;padding-block:.75rem;padding-inline:calc(var(--sidebar-space) + 2rem) 2rem;border-top:1px solid var(--border-color);background:var(--bg-color);color:var(--dark-grey);text-align:center;transition:border-top-color var(--color-transition),background var(--color-transition),padding var(--transform-transition)}@media (max-width:719px){.vp-footer-wrapper{padding-inline-start:2rem}}@media (min-width:1440px){.vp-footer-wrapper{z-index:50;padding-inline-start:2rem}}@media print{.vp-footer-wrapper{margin:0!important;padding:0!important}}@media (max-width:419px){.vp-footer-wrapper{display:block}}.no-sidebar .vp-footer-wrapper,.sidebar-collapsed .vp-footer-wrapper{padding-inline-start:2rem}.vp-footer{margin:.5rem 1rem;font-size:14px}@media print{.vp-footer{display:none}}.vp-copyright{margin:6px 0;font-size:13px}.vp-page:not(.not-found)+.vp-footer-wrapper{margin-top:-2rem}.vp-hero-info-wrapper{position:relative;display:flex;align-items:center;justify-content:center;margin-inline:auto}.vp-hero-info-wrapper.fullscreen{height:calc(100vh - var(--navbar-height))!important}.vp-hero-info{z-index:1;width:100%;padding-inline:2.5rem}@media (max-width:959px){.vp-hero-info{padding-inline:1.5rem}}@media (min-width:959px){.vp-hero-info{display:flex;align-items:center;justify-content:space-evenly}}.vp-hero-mask{position:absolute;inset:0;z-index:0;background-position:50%;background-size:cover}.vp-hero-mask::after{content:" ";position:absolute;inset:0;z-index:1;display:block}.vp-hero-mask.light{display:block}.vp-hero-mask.dark,html[data-theme=dark] .vp-hero-mask.light{display:none}.vp-hero-image.light,html[data-theme=dark] .vp-hero-mask.dark{display:block}.vp-hero-infos{z-index:1;margin:0 .5rem}.vp-hero-image{display:block;max-width:100%;max-height:18rem;margin:1rem}@media (max-width:959px){.vp-hero-image{margin:2rem auto}}@media (max-width:719px){.vp-hero-image{max-height:16rem;margin:1.5rem auto}}@media (max-width:419px){.vp-hero-image{max-height:14rem}}.vp-hero-image.dark,html[data-theme=dark] .vp-hero-image.light{display:none}html[data-theme=dark] .vp-hero-image.dark{display:block}#main-title{margin:.5rem 0;background:linear-gradient(120deg,var(--theme-color-light),var(--theme-color) 30%,#3e71af 100%);-webkit-background-clip:text;background-clip:text;font-weight:700;font-size:3.6rem;font-family:var(--font-family);line-height:1.5;-webkit-text-fill-color:transparent}@media (max-width:719px){#main-title{margin:0}}@media (max-width:959px){#main-title{font-size:2.5rem;text-align:center}}@media (max-width:719px){#main-title{font-size:2.25rem;text-align:center}}@media (max-width:419px){#main-title{margin:0 auto;font-size:2rem}}#main-description,.vp-hero-actions{margin:1.8rem 0}@media (max-width:719px){#main-description,.vp-hero-actions{margin:1.5rem 0}}@media (max-width:959px){#main-description,.vp-hero-actions{margin:1.5rem auto;text-align:center}}@media (max-width:419px){#main-description,.vp-hero-actions{margin:1.2rem 0}}#main-description{max-width:35rem;color:var(--text-color-light);font-weight:500;font-size:1.6rem;line-height:1.3}@media (max-width:719px){#main-description{font-size:1.4rem}}@media (max-width:419px){#main-description{font-size:1.2rem}}.vp-hero-action{display:inline-block;overflow:hidden;min-width:4rem;margin:.5rem;padding:.5em 1.5rem;border-radius:2rem;background:var(--bg-color-secondary);color:var(--text-color);font-size:1.2rem;text-align:center;transition:color var(--color-transition),color var(--color-transition),transform var(--transform-transition)}@media (max-width:719px){.vp-hero-action{padding:.5rem 1rem;font-size:1.1rem}}@media (max-width:419px){.vp-hero-action{font-size:1rem}}@media print{.vp-hero-action{text-decoration:none}}.vp-hero-action:hover{background:var(--bg-color-tertiary)}.vp-hero-action.primary{border-color:var(--theme-color);background:var(--theme-color);color:var(--white)}.vp-hero-action.primary:hover{border-color:var(--theme-color-light);background:var(--theme-color-light)}.vp-project-home:not(.pure) .vp-hero-action:active{transform:scale(.96)}.vp-hero-action .icon{margin-inline-end:.25em}.vp-highlight-wrapper{position:relative;display:flex;align-items:center;justify-content:center}.vp-highlight-wrapper:nth-child(odd) .vp-highlight{flex-direction:row-reverse}.vp-highlight{z-index:1;display:flex;flex:1;align-items:center;justify-content:flex-end;max-width:var(--home-page-width);margin:0 auto;padding:1.5rem 2.5rem;color:#222}@media (max-width:719px){.vp-highlight{display:block;padding-inline:1.5rem;text-align:center}}.vp-highlight-bg{position:absolute;inset:0;z-index:0;background-attachment:fixed;background-position:50%;background-size:cover}.vp-highlight-bg.light{display:inline-block}.vp-highlight-bg.dark,html[data-theme=dark] .vp-highlight-bg.light{display:none}.vp-highlight-image.light,html[data-theme=dark] .vp-highlight-bg.dark{display:inline-block}.vp-highlight-image{width:12rem;margin:2rem 4rem}@media (max-width:959px){.vp-highlight-image{width:10rem}}@media (max-width:719px){.vp-highlight-image{width:8rem;margin:0 auto}}.vp-highlight-image.dark,html[data-theme=dark] .vp-highlight-image.light{display:none}html[data-theme=dark] .vp-highlight-image.dark{display:inline-block}.vp-highlight-info-wrapper{display:flex;flex:1;justify-content:center;padding:2rem}@media (max-width:719px){.vp-highlight-info-wrapper{padding:1rem 0}}.vp-highlight-info-wrapper:only-child{flex:1 0 100%}.vp-highlight-info{text-align:start}.vp-highlight-header{margin-bottom:1.5rem;border-bottom:none;font-size:3rem;font-family:var(--font-family)}@media (max-width:959px){.vp-highlight-header{font-size:2.5rem}}@media (max-width:719px){.vp-highlight-header{font-size:2.25rem;text-align:center}}@media (max-width:419px){.vp-highlight-header{font-size:2rem}}.vp-highlight-description{font-size:1.125rem}.vp-highlights{margin-inline-start:-1.25em;padding-inline-start:0}.vp-highlight-item-wrapper{padding:.5em .5em .5em 1.75em;border-radius:.5rem;list-style:none}.vp-highlight-item-wrapper.link{cursor:pointer}.vp-highlight-item-wrapper:hover{background-color:var(--bg-color-secondary);box-shadow:0 2px 12px 0 var(--card-shadow);transition:transform var(--transform-transition);transform:translate(-2px,-2px)}.vp-highlight-bg+.vp-highlight .vp-highlight-item-wrapper:hover{background-color:transparent}.vp-highlight-item-wrapper::marker{font-weight:700}.vp-highlight-item{display:list-item;color:inherit;list-style:initial}@media print{.vp-highlight-item{text-decoration:none}}.vp-highlight-title{margin:0;font-weight:600;font-size:1.125rem;font-family:var(--font-family)}.vp-highlight-title .icon{margin-inline-end:.25em;font-size:1em}.vp-highlight-details{margin:.5rem 0 0}.vp-project-home{--content-width:var(--home-page-width);display:block;flex:1;padding-top:var(--navbar-height)}@media screen{.vp-project-home .vp-hero-info-wrapper:not(.fullscreen) .vp-hero-info{max-width:var(--home-page-width)}.vp-project-home .vp-feature{max-width:var(--home-page-width)}}.vp-project-home .theme-hope-content{padding-bottom:1.5rem!important}.vp-project-home .theme-hope-content:empty{padding:0!important}.not-found-hint{padding:2rem}.not-found-hint .error-code{margin:0;font-weight:700;font-size:4rem;line-height:4rem}.not-found-hint .error-title{font-weight:700}.not-found-hint .error-hint{margin:0;padding:12px 0;font-weight:600;font-size:20px;line-height:20px;letter-spacing:2px}.vp-page.not-found{display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;width:100vw;max-width:var(--home-page-width);margin:0 auto;padding:calc(var(--navbar-height) + 1rem) 1rem 1rem!important;text-align:center}.vp-page.not-found .action-button{display:inline-block;box-sizing:border-box;margin:.25rem;padding:.75rem 1rem;border-width:0;border-bottom:1px solid var(--theme-color-dark);border-radius:3rem;background:var(--theme-color);color:var(--white);outline:0;font-size:1rem;transition:background .1s ease}.vp-page.not-found .action-button:hover{background:var(--theme-color-light);cursor:pointer}.vp-page-nav{display:flex;flex-wrap:wrap;min-height:2rem;margin-top:0;padding-block:.5rem;padding-inline:2rem;border-top:1px solid var(--border-color);transition:border-top var(--color-transition)}@media (max-width:959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .nav-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--border-color);border-radius:.25rem}.vp-page-nav .nav-link:hover{background:var(--bg-color-secondary)}.vp-page-nav .nav-link .hint{color:var(--light-grey);font-size:.875rem;line-height:2}.vp-page-nav .nav-link .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s;font-size:.75rem}html[data-theme=dark] .vp-page-nav .nav-link .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.vp-page-nav .nav-link .arrow.down{transform:rotate(180deg)}.vp-page-nav .nav-link .arrow.end,html[dir=rtl] .vp-page-nav .nav-link .arrow.start{transform:rotate(90deg)}.vp-page-nav .nav-link .arrow.start{transform:rotate(-90deg)}.vp-page-nav .prev{text-align:start}.vp-page-nav .prev .icon{margin-inline-end:.25em;font-size:1em}.vp-page-nav .next{text-align:end}.vp-page-nav .next .icon{margin-inline-start:.25em;font-size:1em}.vp-page-title{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;position:relative;z-index:1;padding-top:1rem;padding-bottom:0}@media (max-width:959px){.vp-page-title{padding-inline:1.5rem}}@media print{.vp-page-title{max-width:unset;padding-inline:0!important}}@media (max-width:959px){.vp-page-title{padding-top:.5rem}}.vp-page-title h1{margin-top:calc(0px - var(--navbar-height))!important;margin-bottom:1rem;padding-top:var(--navbar-height)!important;font-size:2.2rem}@media (max-width:959px){.vp-page-title h1{margin-bottom:.5rem}}.vp-page-title h1 .icon{margin-inline-end:.25em;color:var(--theme-color);font-size:.9em}.theme-hope-content:not(.custom){padding-top:0!important}.theme-hope-content:not(.custom) h1:first-child,.theme-hope-content:not(.custom) h2:first-child,.theme-hope-content:not(.custom) h3:first-child,.theme-hope-content:not(.custom) h4:first-child,.theme-hope-content:not(.custom) h5:first-child,.theme-hope-content:not(.custom) h6:first-child{margin-top:calc(.5rem - var(--navbar-height))!important;padding-top:var(--navbar-height)!important}.theme-hope-content:not(.custom)>h1:first-child{display:none}.vp-page{display:block;flex-grow:1;padding-bottom:2rem;transition:padding var(--transform-transition)}@media print{.vp-page{min-height:auto!important;margin:0!important;padding:0!important}}.page-cover{width:var(--content-width);margin-inline:auto}@media (max-width:719px){.page-cover{width:100%}}.page-cover img{-o-object-fit:cover;object-fit:cover;width:100%;max-height:25vh;border-radius:.5rem}@media (max-width:719px){.page-cover img{border-radius:0}}.vp-skip-link{top:.25rem;inset-inline-start:.25rem;z-index:999;padding:.65rem 1.5rem;border-radius:.5rem;background:var(--bg-color);color:var(--theme-color);box-shadow:var(--card-shadow);font-weight:700;font-size:.9em;text-decoration:none}@media print{.vp-skip-link{display:none}}.vp-skip-link:focus{clip:auto;width:auto;height:auto;-webkit-clip-path:none;clip-path:none}.theme-hope-content pre{overflow:auto;margin:.85rem 0;padding:1rem;border-radius:6px;line-height:1.375}.theme-hope-content pre code{padding:0;border-radius:0;background:0 0!important;color:var(--code-color);font-family:var(--font-family-mono);text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-webkit-hyphens:none;hyphens:none;transition:color var(--color-transition);-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media print{.theme-hope-content pre code{white-space:pre-wrap}}.theme-hope-content .line-number{font-family:var(--font-family-mono)}div[class*=language-]{position:relative;border-radius:6px;background:var(--code-bg-color);font-size:16px;transition:background var(--color-transition)}@media (max-width:419px){.theme-hope-content>div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}div[class*=language-]::before{content:attr(data-title);position:absolute;top:0;right:1em;z-index:3;color:var(--code-line-color);font-size:.75rem;transition:color var(--color-transition)}div[class*=language-] pre{position:relative;z-index:1;scrollbar-gutter:stable}div[class*=language-] .highlight-lines{position:absolute;top:0;bottom:0;left:0;width:100%;padding:1rem 0;line-height:1.375;-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-] .highlight-line{background:var(--code-highlight-line-color);transition:background var(--color-transition)}div[class*=language-].line-numbers-mode::after{content:"";position:absolute;top:0;bottom:0;left:0;z-index:2;width:var(--line-numbers-width);border-right:1px solid var(--code-highlight-line-color);border-radius:6px 0 0 6px;transition:border-color var(--color-transition)}@media (max-width:419px){div[class*=language-].line-numbers-mode::after{border-radius:0}}@media print{div[class*=language-].line-numbers-mode::after{display:none}}div[class*=language-].line-numbers-mode .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-line::before{content:" ";position:absolute;top:0;left:0;z-index:3;display:block;width:var(--line-numbers-width);height:100%}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--line-numbers-width);padding-left:.5rem}@media print{div[class*=language-].line-numbers-mode pre{margin-left:0;padding-left:1rem}}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;bottom:0;left:0;display:flex;flex-direction:column;width:var(--line-numbers-width);padding:1rem 0;color:var(--code-line-color);counter-reset:line-number;text-align:center;transition:color var(--color-transition)}@media print{div[class*=language-].line-numbers-mode .line-numbers{display:none}}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:4;display:flex;flex:1;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number::before{content:counter(line-number);display:block;font-size:.8em;line-height:1;counter-increment:line-number}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}html[data-theme=light] #app{--code-color:#383a42;--code-line-color:rgba(56, 58, 66, 0.67);--code-bg-color:#ecf4fa;--code-border-color:#c3def3;--code-highlight-line-color:#d8e9f6}html[data-theme=light] code[class*=language-],html[data-theme=light] pre[class*=language-]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}html[data-theme=light] code[class*=language-] ::-moz-selection,html[data-theme=light] code[class*=language-]::-moz-selection,html[data-theme=light] pre[class*=language-] ::-moz-selection,html[data-theme=light] pre[class*=language-]::-moz-selection{background:#e5e5e6;color:inherit}html[data-theme=light] code[class*=language-] ::selection,html[data-theme=light] code[class*=language-]::selection,html[data-theme=light] pre[class*=language-] ::selection,html[data-theme=light] pre[class*=language-]::selection{background:#e5e5e6;color:inherit}html[data-theme=light] .token.cdata,html[data-theme=light] .token.comment,html[data-theme=light] .token.prolog{color:#a0a1a7}html[data-theme=light] .token.attr-value>.token.punctuation.attr-equals,html[data-theme=light] .token.doctype,html[data-theme=light] .token.entity,html[data-theme=light] .token.punctuation,html[data-theme=light] .token.special-attr>.token.attr-value>.token.value.css{color:#383a42}html[data-theme=light] .token.atrule,html[data-theme=light] .token.attr-name,html[data-theme=light] .token.boolean,html[data-theme=light] .token.class-name,html[data-theme=light] .token.constant,html[data-theme=light] .token.number{color:#b76b01}html[data-theme=light] .token.keyword{color:#a626a4}html[data-theme=light] .language-css .token.selector,html[data-theme=light] .token.deleted,html[data-theme=light] .token.important,html[data-theme=light] .token.property,html[data-theme=light] .token.symbol,html[data-theme=light] .token.tag{color:#e45649}html[data-theme=light] .language-css .token.url>.token.string.url,html[data-theme=light] .token.attr-value,html[data-theme=light] .token.attr-value>.token.punctuation,html[data-theme=light] .token.builtin,html[data-theme=light] .token.char,html[data-theme=light] .token.inserted,html[data-theme=light] .token.regex,html[data-theme=light] .token.selector,html[data-theme=light] .token.string{color:#50a14f}html[data-theme=light] .token.function,html[data-theme=light] .token.operator,html[data-theme=light] .token.variable{color:#4078f2}html[data-theme=light] .language-css .token.property{color:#383a42}html[data-theme=light] .language-css .token.function,html[data-theme=light] .language-css .token.url>.token.function,html[data-theme=light] .token.url{color:#0184bc}html[data-theme=light] .language-css .token.atrule .token.rule,html[data-theme=light] .language-css .token.important,html[data-theme=light] .language-javascript .token.operator{color:#a626a4}html[data-theme=light] .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation{color:#ca1243}html[data-theme=light] .language-json .token.operator,html[data-theme=light] .language-markdown .token.url,html[data-theme=light] .language-markdown .token.url-reference.url>.token.string,html[data-theme=light] .language-markdown .token.url>.token.operator{color:#383a42}html[data-theme=light] .language-json .token.null.keyword{color:#b76b01}html[data-theme=light] .language-markdown .token.url>.token.content{color:#4078f2}html[data-theme=light] .language-markdown .token.url-reference.url,html[data-theme=light] .language-markdown .token.url>.token.url{color:#0184bc}html[data-theme=light] .language-markdown .token.blockquote.punctuation,html[data-theme=light] .language-markdown .token.hr.punctuation{color:#a0a1a7;font-style:italic}html[data-theme=light] .language-markdown .token.code-snippet{color:#50a14f}html[data-theme=light] .language-markdown .token.bold .token.content{color:#b76b01}html[data-theme=light] .language-markdown .token.italic .token.content{color:#a626a4}html[data-theme=light] .language-markdown .token.list.punctuation,html[data-theme=light] .language-markdown .token.strike .token.content,html[data-theme=light] .language-markdown .token.strike .token.punctuation,html[data-theme=light] .language-markdown .token.title.important>.token.punctuation{color:#e45649}html[data-theme=light] .token.bold{font-weight:700}html[data-theme=light] .token.comment,html[data-theme=light] .token.italic{font-style:italic}html[data-theme=light] .token.entity{cursor:help}html[data-theme=light] .token.namespace{opacity:.8}html[data-theme=dark] #app{--code-color:#abb2bf;--code-line-color:rgba(171, 178, 191, 0.67);--code-bg-color:#282c34;--code-border-color:#343e51;--code-highlight-line-color:#2f3542}html[data-theme=dark] code[class*=language-],html[data-theme=dark] pre[class*=language-]{text-shadow:0 1px rgba(0,0,0,.3);-moz-tab-size:2;-o-tab-size:2;tab-size:2}@media print{html[data-theme=dark] code[class*=language-],html[data-theme=dark] pre[class*=language-]{text-shadow:none}}html[data-theme=dark] code[class*=language-] ::-moz-selection,html[data-theme=dark] code[class*=language-]::-moz-selection,html[data-theme=dark] pre[class*=language-] ::-moz-selection,html[data-theme=dark] pre[class*=language-]::-moz-selection{background:#3e4451;color:inherit;text-shadow:none}html[data-theme=dark] code[class*=language-] ::selection,html[data-theme=dark] code[class*=language-]::selection,html[data-theme=dark] pre[class*=language-] ::selection,html[data-theme=dark] pre[class*=language-]::selection{background:#3e4451;color:inherit;text-shadow:none}html[data-theme=dark] .token.cdata,html[data-theme=dark] .token.comment,html[data-theme=dark] .token.prolog{color:#5c6370}html[data-theme=dark] .token.attr-value>.token.punctuation.attr-equals,html[data-theme=dark] .token.doctype,html[data-theme=dark] .token.entity,html[data-theme=dark] .token.punctuation,html[data-theme=dark] .token.special-attr>.token.attr-value>.token.value.css{color:#abb2bf}html[data-theme=dark] .token.atrule,html[data-theme=dark] .token.attr-name,html[data-theme=dark] .token.boolean,html[data-theme=dark] .token.class-name,html[data-theme=dark] .token.constant,html[data-theme=dark] .token.number{color:#d19a66}html[data-theme=dark] .token.keyword{color:#c678dd}html[data-theme=dark] .language-css .token.selector,html[data-theme=dark] .token.deleted,html[data-theme=dark] .token.important,html[data-theme=dark] .token.property,html[data-theme=dark] .token.symbol,html[data-theme=dark] .token.tag{color:#e06c75}html[data-theme=dark] .language-css .token.url>.token.string.url,html[data-theme=dark] .token.attr-value,html[data-theme=dark] .token.attr-value>.token.punctuation,html[data-theme=dark] .token.builtin,html[data-theme=dark] .token.char,html[data-theme=dark] .token.inserted,html[data-theme=dark] .token.regex,html[data-theme=dark] .token.selector,html[data-theme=dark] .token.string{color:#98c379}html[data-theme=dark] .token.function,html[data-theme=dark] .token.operator,html[data-theme=dark] .token.variable{color:#61afef}html[data-theme=dark] .language-css .token.property{color:#abb2bf}html[data-theme=dark] .language-css .token.function,html[data-theme=dark] .language-css .token.url>.token.function,html[data-theme=dark] .token.url{color:#56b6c2}html[data-theme=dark] .language-css .token.atrule .token.rule,html[data-theme=dark] .language-css .token.important,html[data-theme=dark] .language-javascript .token.operator{color:#c678dd}html[data-theme=dark] .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation{color:#be5046}html[data-theme=dark] .language-json .token.operator,html[data-theme=dark] .language-markdown .token.url,html[data-theme=dark] .language-markdown .token.url-reference.url>.token.string,html[data-theme=dark] .language-markdown .token.url>.token.operator{color:#abb2bf}html[data-theme=dark] .language-json .token.null.keyword{color:#d19a66}html[data-theme=dark] .language-markdown .token.url>.token.content{color:#61afef}html[data-theme=dark] .language-markdown .token.url-reference.url,html[data-theme=dark] .language-markdown .token.url>.token.url{color:#56b6c2}html[data-theme=dark] .language-markdown .token.blockquote.punctuation,html[data-theme=dark] .language-markdown .token.hr.punctuation{color:#5c6370;font-style:italic}html[data-theme=dark] .language-markdown .token.code-snippet{color:#98c379}html[data-theme=dark] .language-markdown .token.bold .token.content{color:#d19a66}html[data-theme=dark] .language-markdown .token.italic .token.content{color:#c678dd}html[data-theme=dark] .language-markdown .token.list.punctuation,html[data-theme=dark] .language-markdown .token.strike .token.content,html[data-theme=dark] .language-markdown .token.strike .token.punctuation,html[data-theme=dark] .language-markdown .token.title.important>.token.punctuation{color:#e06c75}html[data-theme=dark] .token.bold{font-weight:700}html[data-theme=dark] .token.comment,html[data-theme=dark] .token.italic{font-style:italic}html[data-theme=dark] .token.entity{cursor:help}html[data-theme=dark] .token.namespace{opacity:.8}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border-width:0;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media print{.theme-hope-content{margin:0!important;padding-inline:0!important}}.theme-hope-content.custom{margin:0;padding:0}.theme-hope-content:not(.custom){max-width:var(--content-width, 740px);margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-hope-content:not(.custom){padding:1.5rem}}@media (max-width:419px){.theme-hope-content:not(.custom){padding:1rem 1.5rem}}@media print{.theme-hope-content:not(.custom){max-width:unset}}.theme-hope-content:not(.custom)>h1,.theme-hope-content:not(.custom)>h2,.theme-hope-content:not(.custom)>h3,.theme-hope-content:not(.custom)>h4,.theme-hope-content:not(.custom)>h5,.theme-hope-content:not(.custom)>h6{margin-top:calc(.5rem - var(--navbar-height));margin-bottom:.5rem;padding-top:calc(1rem + var(--navbar-height));outline:0}.theme-container.no-navbar .theme-hope-content:not(.custom)>h1,.theme-container.no-navbar .theme-hope-content:not(.custom)>h2,.theme-container.no-navbar .theme-hope-content:not(.custom)>h3,.theme-container.no-navbar .theme-hope-content:not(.custom)>h4,.theme-container.no-navbar .theme-hope-content:not(.custom)>h5,.theme-container.no-navbar .theme-hope-content:not(.custom)>h6{margin-top:1.5rem;padding-top:0}.theme-hope-content:not(.custom)>ol p,.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p{text-align:justify;overflow-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}@media (max-width:419px){.theme-hope-content:not(.custom)>ol p,.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p{text-align:start}}@media print{.theme-hope-content:not(.custom)>ol p,.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p{text-align:start}}.theme-hope-content a:not(.header-anchor):hover{text-decoration:underline}.theme-hope-content img{max-width:100%}::view-transition-new(root),::view-transition-old(root){animation:none;mix-blend-mode:normal}html[data-theme=dark]::view-transition-new(root),html[data-theme=light]::view-transition-old(root){z-index:1}html[data-theme=dark]::view-transition-old(root),html[data-theme=light]::view-transition-new(root){z-index:99999}@media (min-width:1280px){.chart-wrapper::-webkit-scrollbar,.flowchart-wrapper::-webkit-scrollbar,.mermaid-wrapper::-webkit-scrollbar{width:8px;height:8px}.chart-wrapper::-webkit-scrollbar-track-piece,.flowchart-wrapper::-webkit-scrollbar-track-piece,.mermaid-wrapper::-webkit-scrollbar-track-piece{border-radius:8px;background:rgba(0,0,0,.1)}}html[dir=rtl] a.header-anchor::before{right:-.75em}.vp-back-to-top-button{--back-to-top-color:var(--vp-tc);--back-to-top-color-hover:var(--vp-tcl);--back-to-top-bg-color:var(--vp-bg)}#docsearch-container{min-width:145.7px!important}@media (max-width:959px){#docsearch-container{min-width:36px!important}}.DocSearch.DocSearch-Button{margin-left:0}@media (max-width:959px){.DocSearch.DocSearch-Button{min-width:36px!important}}.DocSearch .DocSearch-Button-Placeholder{display:inline-block;padding:4px 12px 4px 6px;font-size:14px}@media (max-width:719px){.DocSearch .DocSearch-Button-Placeholder{display:none}}.DocSearch .DocSearch-Search-Icon{width:1.25em;height:1.25em}@media (max-width:959px){.DocSearch .DocSearch-Button-Keys{display:none}}.DocSearch .DocSearch-Button-Key{background:var(--bg-color);box-shadow:none}:root{scrollbar-width:thin}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track-piece{border-radius:6px;background:rgba(0,0,0,.1)}::-webkit-scrollbar-thumb{border-radius:6px;background:var(--theme-color)}::-webkit-scrollbar-thumb:active{background:var(--theme-color-light)}@media (max-width:719px){.hide-in-mobile{display:none!important}}@media (max-width:959px){.hide-in-pad{display:none!important}}.page-author-item{display:inline-block;margin:0 4px;font-weight:400;overflow-wrap:break-word}.page-category-info{flex-wrap:wrap}.page-category-item{display:inline-block;margin:.125em .25em;padding:0 .25em;border-radius:.25em;background:var(--bg-color-secondary);color:var(--text-color-light);font-weight:700;font-size:.75rem;line-height:2;transition:background var(--color-transition),color var(--color-transition)}@media print{.page-category-item{padding:0;font-weight:400}.page-category-item::after{content:", "}.page-category-item:last-of-type::after{content:""}}.page-category-item.clickable>span:hover{color:var(--theme-color);cursor:pointer}.page-category-item.category0{background:#fde5e7;color:#ec2f3e}html[data-theme=dark] .page-category-item.category0{background:#340509;color:#ba111f}.page-category-item.category0:hover{background:#f9bec3}html[data-theme=dark] .page-category-item.category0:hover{background:#53080e}.page-category-item.category1{background:#ffeee8;color:#fb7649}html[data-theme=dark] .page-category-item.category1{background:#441201;color:#f54205}.page-category-item.category1:hover{background:#fed4c6}html[data-theme=dark] .page-category-item.category1:hover{background:#6d1d02}.page-category-item.category2{background:#fef5e7;color:#f5b041}html[data-theme=dark] .page-category-item.category2{background:#3e2703;color:#e08e0b}.page-category-item.category2:hover{background:#fce6c4}html[data-theme=dark] .page-category-item.category2:hover{background:#633f05}.page-category-item.category3{background:#eafaf1;color:#55d98d}html[data-theme=dark] .page-category-item.category3{background:#0c331c;color:#29b866}.page-category-item.category3:hover{background:#caf3db}html[data-theme=dark] .page-category-item.category3:hover{background:#12522d}.page-category-item.category4{background:#e6f9ee;color:#36d278}html[data-theme=dark] .page-category-item.category4{background:#092917;color:#219552}.page-category-item.category4:hover{background:#c0f1d5}html[data-theme=dark] .page-category-item.category4:hover{background:#0f4224}.page-category-item.category5{background:#e1fcfc;color:#16e1e1}html[data-theme=dark] .page-category-item.category5{background:#042929;color:#0e9595}.page-category-item.category5:hover{background:#b4f8f8}html[data-theme=dark] .page-category-item.category5:hover{background:#064242}.page-category-item.category6{background:#e4f0fe;color:#2589f6}html[data-theme=dark] .page-category-item.category6{background:#021b36;color:#0862c3}.page-category-item.category6:hover{background:#bbdafc}html[data-theme=dark] .page-category-item.category6:hover{background:#042c57}.page-category-item.category7{background:#f7f1fd;color:#bb8ced}html[data-theme=dark] .page-category-item.category7{background:#2a0b4b;color:#9851e4}.page-category-item.category7:hover{background:#eadbfa}html[data-theme=dark] .page-category-item.category7:hover{background:#431277}.page-category-item.category8{background:#fdeaf5;color:#ef59ab}html[data-theme=dark] .page-category-item.category8{background:#400626;color:#e81689}.page-category-item.category8:hover{background:#facbe5}html[data-theme=dark] .page-category-item.category8:hover{background:#670a3d}.page-info .icon,.page-original-info{position:relative;display:inline-block;vertical-align:middle}.page-original-info{overflow:hidden;padding:0 .5em;border:.5px solid var(--dark-grey);border-radius:.75em;background:var(--bg-color);font-size:.75em;line-height:1.5!important}.page-info,.page-info>span{display:flex;align-items:center}.page-info{flex-wrap:wrap;place-content:stretch flex-start;color:var(--dark-grey);font-size:14px}@media print{.page-info{display:flex!important}}.page-info>span{max-width:100%;margin-inline-end:.5em;line-height:2}@media (min-width:1440px){.page-info>span{font-size:1.1em}}@media (max-width:419px){.page-info>span{margin-inline-end:.3em;font-size:.875em}}@media print{.page-info>span{display:flex!important}}.page-info .icon{width:1em;height:1em;margin-inline-end:.25em}.page-meta{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media (max-width:959px){.page-meta{padding-inline:1.5rem}}@media print{.page-meta{max-width:unset;margin:0!important;padding-inline:0!important}}@media (max-width:719px){.page-meta{display:block}}.page-meta .meta-item{flex-grow:1}.page-meta .meta-item .label{font-weight:500}.page-meta .meta-item .label:not(a){color:var(--text-color-lighter)}.page-meta .meta-item .info{color:var(--dark-grey);font-weight:400}.page-meta .git-info{text-align:end}.page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:14px}@media print{.page-meta .edit-link{display:none}}.page-meta .edit-link .icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.page-meta .contributors,.page-meta .update-time{margin-top:.25rem;margin-bottom:.25rem;font-size:14px}@media (max-width:719px){.page-meta .contributors,.page-meta .update-time{font-size:13px;text-align:start}}.print-button{border-width:0;background:0 0;cursor:pointer;box-sizing:content-box;width:1rem;height:1rem;padding:.5rem;border-radius:.25em;color:inherit;font-size:1rem;transform:translateY(.25rem)}@media print{.print-button{display:none}}.page-tag-info{flex-wrap:wrap}.page-tag-item{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;min-width:1.5rem;margin:.125rem;padding:.125rem .25rem .125rem .625rem;background:var(--bg-color-secondary);background:linear-gradient(135deg,transparent .75em,var(--bg-color-secondary)0) top,linear-gradient(45deg,transparent .75em,var(--bg-color-secondary)0) bottom;background-size:100% 52%!important;background-repeat:no-repeat!important;color:var(--text-color-light);font-weight:700;font-size:.625rem;line-height:1.5;text-align:center;transition:background var(--color-transition),color var(--color-transition)}@media print{.page-tag-item{padding:0;font-weight:400}.page-tag-item::after{content:", "}.page-tag-item:last-of-type::after{content:""}}.page-tag-item.clickable:hover{cursor:pointer}.page-tag-item.tag0{background:#fde5e7;background:linear-gradient(135deg,transparent .75em,#fde5e7 0) top,linear-gradient(45deg,transparent .75em,#fde5e7 0) bottom;color:#ec2f3e}html[data-theme=dark] .page-tag-item.tag0{background:#340509;background:linear-gradient(135deg,transparent .75em,#340509 0) top,linear-gradient(45deg,transparent .75em,#340509 0) bottom;color:#ba111f}.page-tag-item.tag0.clickable:hover{background:#f9bec3;background:linear-gradient(135deg,transparent .75em,#f9bec3 0) top,linear-gradient(45deg,transparent .75em,#f9bec3 0) bottom}html[data-theme=dark] .page-tag-item.tag0.clickable:hover{background:#53080e;background:linear-gradient(135deg,transparent .75em,#53080e 0) top,linear-gradient(45deg,transparent .75em,#53080e 0) bottom}.page-tag-item.tag1{background:#ffeee8;background:linear-gradient(135deg,transparent .75em,#ffeee8 0) top,linear-gradient(45deg,transparent .75em,#ffeee8 0) bottom;color:#fb7649}html[data-theme=dark] .page-tag-item.tag1{background:#441201;background:linear-gradient(135deg,transparent .75em,#441201 0) top,linear-gradient(45deg,transparent .75em,#441201 0) bottom;color:#f54205}.page-tag-item.tag1.clickable:hover{background:#fed4c6;background:linear-gradient(135deg,transparent .75em,#fed4c6 0) top,linear-gradient(45deg,transparent .75em,#fed4c6 0) bottom}html[data-theme=dark] .page-tag-item.tag1.clickable:hover{background:#6d1d02;background:linear-gradient(135deg,transparent .75em,#6d1d02 0) top,linear-gradient(45deg,transparent .75em,#6d1d02 0) bottom}.page-tag-item.tag2{background:#fef5e7;background:linear-gradient(135deg,transparent .75em,#fef5e7 0) top,linear-gradient(45deg,transparent .75em,#fef5e7 0) bottom;color:#f5b041}html[data-theme=dark] .page-tag-item.tag2{background:#3e2703;background:linear-gradient(135deg,transparent .75em,#3e2703 0) top,linear-gradient(45deg,transparent .75em,#3e2703 0) bottom;color:#e08e0b}.page-tag-item.tag2.clickable:hover{background:#fce6c4;background:linear-gradient(135deg,transparent .75em,#fce6c4 0) top,linear-gradient(45deg,transparent .75em,#fce6c4 0) bottom}html[data-theme=dark] .page-tag-item.tag2.clickable:hover{background:#633f05;background:linear-gradient(135deg,transparent .75em,#633f05 0) top,linear-gradient(45deg,transparent .75em,#633f05 0) bottom}.page-tag-item.tag3{background:#eafaf1;background:linear-gradient(135deg,transparent .75em,#eafaf1 0) top,linear-gradient(45deg,transparent .75em,#eafaf1 0) bottom;color:#55d98d}html[data-theme=dark] .page-tag-item.tag3{background:#0c331c;background:linear-gradient(135deg,transparent .75em,#0c331c 0) top,linear-gradient(45deg,transparent .75em,#0c331c 0) bottom;color:#29b866}.page-tag-item.tag3.clickable:hover{background:#caf3db;background:linear-gradient(135deg,transparent .75em,#caf3db 0) top,linear-gradient(45deg,transparent .75em,#caf3db 0) bottom}html[data-theme=dark] .page-tag-item.tag3.clickable:hover{background:#12522d;background:linear-gradient(135deg,transparent .75em,#12522d 0) top,linear-gradient(45deg,transparent .75em,#12522d 0) bottom}.page-tag-item.tag4{background:#e6f9ee;background:linear-gradient(135deg,transparent .75em,#e6f9ee 0) top,linear-gradient(45deg,transparent .75em,#e6f9ee 0) bottom;color:#36d278}html[data-theme=dark] .page-tag-item.tag4{background:#092917;background:linear-gradient(135deg,transparent .75em,#092917 0) top,linear-gradient(45deg,transparent .75em,#092917 0) bottom;color:#219552}.page-tag-item.tag4.clickable:hover{background:#c0f1d5;background:linear-gradient(135deg,transparent .75em,#c0f1d5 0) top,linear-gradient(45deg,transparent .75em,#c0f1d5 0) bottom}html[data-theme=dark] .page-tag-item.tag4.clickable:hover{background:#0f4224;background:linear-gradient(135deg,transparent .75em,#0f4224 0) top,linear-gradient(45deg,transparent .75em,#0f4224 0) bottom}.page-tag-item.tag5{background:#e1fcfc;background:linear-gradient(135deg,transparent .75em,#e1fcfc 0) top,linear-gradient(45deg,transparent .75em,#e1fcfc 0) bottom;color:#16e1e1}html[data-theme=dark] .page-tag-item.tag5{background:#042929;background:linear-gradient(135deg,transparent .75em,#042929 0) top,linear-gradient(45deg,transparent .75em,#042929 0) bottom;color:#0e9595}.page-tag-item.tag5.clickable:hover{background:#b4f8f8;background:linear-gradient(135deg,transparent .75em,#b4f8f8 0) top,linear-gradient(45deg,transparent .75em,#b4f8f8 0) bottom}html[data-theme=dark] .page-tag-item.tag5.clickable:hover{background:#064242;background:linear-gradient(135deg,transparent .75em,#064242 0) top,linear-gradient(45deg,transparent .75em,#064242 0) bottom}.page-tag-item.tag6{background:#e4f0fe;background:linear-gradient(135deg,transparent .75em,#e4f0fe 0) top,linear-gradient(45deg,transparent .75em,#e4f0fe 0) bottom;color:#2589f6}html[data-theme=dark] .page-tag-item.tag6{background:#021b36;background:linear-gradient(135deg,transparent .75em,#021b36 0) top,linear-gradient(45deg,transparent .75em,#021b36 0) bottom;color:#0862c3}.page-tag-item.tag6.clickable:hover{background:#bbdafc;background:linear-gradient(135deg,transparent .75em,#bbdafc 0) top,linear-gradient(45deg,transparent .75em,#bbdafc 0) bottom}html[data-theme=dark] .page-tag-item.tag6.clickable:hover{background:#042c57;background:linear-gradient(135deg,transparent .75em,#042c57 0) top,linear-gradient(45deg,transparent .75em,#042c57 0) bottom}.page-tag-item.tag7{background:#f7f1fd;background:linear-gradient(135deg,transparent .75em,#f7f1fd 0) top,linear-gradient(45deg,transparent .75em,#f7f1fd 0) bottom;color:#bb8ced}html[data-theme=dark] .page-tag-item.tag7{background:#2a0b4b;background:linear-gradient(135deg,transparent .75em,#2a0b4b 0) top,linear-gradient(45deg,transparent .75em,#2a0b4b 0) bottom;color:#9851e4}.page-tag-item.tag7.clickable:hover{background:#eadbfa;background:linear-gradient(135deg,transparent .75em,#eadbfa 0) top,linear-gradient(45deg,transparent .75em,#eadbfa 0) bottom}html[data-theme=dark] .page-tag-item.tag7.clickable:hover{background:#431277;background:linear-gradient(135deg,transparent .75em,#431277 0) top,linear-gradient(45deg,transparent .75em,#431277 0) bottom}.page-tag-item.tag8{background:#fdeaf5;background:linear-gradient(135deg,transparent .75em,#fdeaf5 0) top,linear-gradient(45deg,transparent .75em,#fdeaf5 0) bottom;color:#ef59ab}html[data-theme=dark] .page-tag-item.tag8{background:#400626;background:linear-gradient(135deg,transparent .75em,#400626 0) top,linear-gradient(45deg,transparent .75em,#400626 0) bottom;color:#e81689}.page-tag-item.tag8.clickable:hover{background:#facbe5;background:linear-gradient(135deg,transparent .75em,#facbe5 0) top,linear-gradient(45deg,transparent .75em,#facbe5 0) bottom}html[data-theme=dark] .page-tag-item.tag8.clickable:hover{background:#670a3d;background:linear-gradient(135deg,transparent .75em,#670a3d 0) top,linear-gradient(45deg,transparent .75em,#670a3d 0) bottom}.toc-place-holder{margin-inline:auto;padding-inline:2.5rem;position:sticky;z-index:99;max-width:var(--content-width, 740px)}@media (max-width:959px){.toc-place-holder{padding-inline:1.5rem}}@media print{.toc-place-holder{max-width:unset}}.toc-place-holder+.theme-hope-content:not(.custom){padding-top:0}#toc{position:absolute;inset-inline-start:calc(100% + 1rem);display:none;min-width:10rem;max-width:15rem}@media (min-width:1440px){.has-toc #toc{display:block}}@media print{#toc{display:none!important}}#toc .toc-header{margin-bottom:.75rem;margin-inline-start:.5rem;font-weight:600;font-size:.875rem}#toc .toc-wrapper{position:relative;overflow:hidden auto;max-height:75vh;margin:0 .5rem;padding-inline-start:8px;text-overflow:ellipsis;white-space:nowrap;scroll-behavior:smooth}#toc .toc-wrapper::-webkit-scrollbar-track-piece{background:0 0}#toc .toc-wrapper::-webkit-scrollbar{width:3px}#toc .toc-wrapper::-webkit-scrollbar-thumb:vertical{background:#ddd}html[data-theme=dark] #toc .toc-wrapper::-webkit-scrollbar-thumb:vertical{background:#333}#toc .toc-wrapper::before{bottom:0;inset-inline-start:0;z-index:-1;background:var(--border-color)}#toc .toc-list{position:relative;margin:0;padding:0}#toc .toc-marker,#toc .toc-wrapper::before{content:" ";position:absolute;top:0;width:2px}#toc .toc-marker{inset-inline-start:-8px;z-index:2;height:1.7rem;background:var(--theme-color);transition:top var(--vp-tt)}#toc .toc-link{position:relative;display:block;overflow:hidden;max-width:100%;color:var(--light-grey);line-height:inherit;text-overflow:ellipsis;white-space:nowrap}#toc .toc-link.level2{padding-inline-start:0;font-size:14px}#toc .toc-link.level3{padding-inline-start:8px;font-size:13px}#toc .toc-link.level4{padding-inline-start:16px;font-size:12px}#toc .toc-link.level5{padding-inline-start:24px;font-size:11px}#toc .toc-link.level6{padding-inline-start:32px;font-size:10px}#toc .toc-item{position:relative;box-sizing:border-box;height:1.7rem;padding:0 .5rem;list-style:none;line-height:1.7rem}#toc .toc-item.active>.toc-link{color:var(--theme-color);font-weight:700}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper:not(:hover) .arrow{transform:rotate(-180deg)}.dropdown-wrapper .dropdown-title{border-width:0;background:0 0;cursor:pointer;padding:0 .25rem;color:var(--dark-grey);font-weight:500;font-size:inherit;font-family:inherit;line-height:inherit;cursor:inherit}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .icon{margin-inline-end:.25em;font-size:1em}.dropdown-wrapper .dropdown-title .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s;font-size:1.2em}html[data-theme=dark] .dropdown-wrapper .dropdown-title .arrow,html[data-theme=dark] .nav-screen-dropdown-title .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.dropdown-wrapper .dropdown-title .arrow.down{transform:rotate(180deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.down,html[dir=rtl] .nav-screen-dropdown-title .arrow.down{transform:rotate(-180deg)}.dropdown-wrapper .dropdown-title .arrow.end{transform:rotate(90deg)}.dropdown-wrapper .dropdown-title .arrow.start,html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.end,html[dir=rtl] .nav-screen-dropdown-title .arrow.end{transform:rotate(-90deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.start{transform:rotate(90deg)}.dropdown-wrapper ul{margin:0;padding:0;list-style-type:none}.dropdown-wrapper .nav-dropdown{position:absolute;top:100%;inset-inline-end:0;overflow-y:auto;box-sizing:border-box;min-width:6rem;max-height:calc(100vh - var(--navbar-height));margin:0;padding:.5rem .75rem;border:1px solid var(--grey14);border-radius:.5rem;background:var(--bg-color);box-shadow:2px 2px 10px var(--card-shadow);text-align:start;white-space:nowrap;opacity:0;visibility:hidden;transition:all .18s ease-out;transform:scale(.9)}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{z-index:2;opacity:1;visibility:visible;transform:none}.dropdown-wrapper .nav-link{position:relative;display:block;margin-bottom:0;border-bottom:none;color:var(--dark-grey);font-weight:400;font-size:.875rem;line-height:1.7rem;transition:color var(--color-transition)}.dropdown-wrapper .nav-link.active,.dropdown-wrapper .nav-link:hover{color:var(--theme-color)}.dropdown-wrapper .dropdown-subtitle{margin:0;padding:.5rem .25rem 0;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;text-transform:uppercase;transition:color var(--color-transition)}.dropdown-wrapper .dropdown-subitem-wrapper{padding:0 0 .25rem}.dropdown-wrapper .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .dropdown-item:last-child .dropdown-subtitle{padding-top:0}.dropdown-wrapper .dropdown-item:last-child .dropdown-subitem-wrapper{padding-bottom:0}.nav-screen-dropdown-title{border-width:0;background:0 0;position:relative;display:flex;align-items:center;width:100%;padding:0;color:var(--dark-grey);font-size:inherit;font-family:inherit;text-align:start;cursor:pointer}.nav-screen-dropdown-title.active,.nav-screen-dropdown-title:hover{color:var(--text-color)}.nav-screen-dropdown-title .title{flex:1}.nav-screen-dropdown-title .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}.nav-screen-dropdown-title .arrow.down{transform:rotate(180deg)}.nav-screen-dropdown-title .arrow.end,html[dir=rtl] .nav-screen-dropdown-title .arrow.start{transform:rotate(90deg)}.nav-screen-dropdown-title .arrow.start{transform:rotate(-90deg)}.nav-screen-dropdown{overflow:hidden;margin:.5rem 0 0;padding:0;list-style:none;transition:transform .1s ease-out;transform:scaleY(1);transform-origin:top}.nav-screen-dropdown.hide{height:0;margin:0;transform:scaleY(0)}.nav-screen-dropdown .nav-link{position:relative;display:block;padding-inline-start:.5rem;font-weight:400;line-height:2}.nav-screen-dropdown .nav-link.active,.nav-screen-dropdown .nav-link:hover{color:var(--theme-color)}.nav-screen-dropdown .nav-link .icon{font-size:1em}.nav-screen-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.nav-screen-dropdown .dropdown-subtitle{margin:0;padding-inline-start:.25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;text-transform:uppercase;transition:color var(--color-transition)}.nav-screen-dropdown .dropdown-subtitle .nav-link{padding:0}.nav-screen-dropdown .dropdown-subitem-wrapper{margin:0;padding:0;list-style:none}.nav-screen-dropdown .dropdown-subitem{padding-inline-start:.5rem;font-size:.9em}.nav-screen-links{display:none;padding-bottom:.75rem}@media (max-width:719px){.nav-screen-links{display:block}}.nav-screen-links .navbar-links-item{position:relative;display:block;padding:12px 4px 11px 0;border-bottom:1px solid var(--border-color);font-size:16px;line-height:1.5rem;transition:border-bottom-color var(--color-transition)}.nav-screen-links .nav-link{display:inline-block;width:100%;color:var(--dark-grey);font-weight:400}.nav-screen-links .nav-link:hover{color:var(--text-color)}.nav-screen-links .nav-link.active,.vp-brand:hover .vp-site-name,.vp-navbar .nav-item>.nav-link.active{color:var(--theme-color)}.vp-nav-screen-container{max-width:320px;margin:0 auto;padding:2rem 0 4rem}#nav-screen{position:fixed;inset:var(--navbar-height)0 0 0;z-index:150;display:none;overflow-y:auto;padding:0 2rem;background:var(--bg-color);transition:background .5s}@media (max-width:719px){#nav-screen{display:block}}#nav-screen.fade-enter-active,#nav-screen.fade-leave-active{transition:opacity .25s}#nav-screen.fade-enter-active .vp-nav-screen-container,#nav-screen.fade-leave-active .vp-nav-screen-container{transition:transform .25s ease}#nav-screen.fade-enter-from,#nav-screen.fade-leave-to{opacity:0}#nav-screen.fade-enter-from .vp-nav-screen-container,#nav-screen.fade-leave-to .vp-nav-screen-container{transform:translateY(-8px)}#nav-screen .icon{margin-inline-end:.25em;font-size:1em}.vp-outlook-wrapper{display:flex;justify-content:space-around}.vp-nav-logo{vertical-align:top;height:var(--navbar-line-height);margin-inline-end:.8rem}.vp-nav-logo.light{display:inline-block}.vp-nav-logo.dark,html[data-theme=dark] .vp-nav-logo.light{display:none}html[data-theme=dark] .vp-nav-logo.dark{display:inline-block}.vp-site-name{position:relative;color:var(--text-color);font-size:1.25rem}@media (max-width:719px){.vp-site-name{overflow:hidden;width:calc(100vw - 9.4rem);text-overflow:ellipsis;white-space:nowrap}}.vp-navbar .vp-nav-links{display:flex;align-items:center;font-size:.875rem}.vp-navbar .nav-item{position:relative;margin:0 .25rem;line-height:2rem}.vp-navbar .nav-item:first-child{margin-inline-start:0}.vp-navbar .nav-item:last-child{margin-inline-end:0}.vp-navbar .nav-item>.nav-link,.vp-navbar .nav-link{color:var(--dark-grey)}.vp-navbar .nav-item>.nav-link::after{content:" ";position:absolute;inset:auto 50%0;height:2px;border-radius:1px;background:var(--theme-color-light);visibility:hidden;transition:inset .2s ease-in-out}.vp-navbar .nav-item>.nav-link.active::after,.vp-navbar .nav-item>.nav-link:hover::after{inset:auto 0 0;visibility:visible}.vp-navbar{--navbar-line-height:calc( var(--navbar-height) - var(--navbar-vertical-padding) * 2 );position:fixed;inset:0 0 auto;z-index:175;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-vertical-padding) var(--navbar-horizontal-padding);background:var(--navbar-bg-color);box-shadow:0 2px 8px var(--card-shadow);line-height:var(--navbar-line-height);white-space:nowrap;transition:transform ease-in-out .3s,background var(--color-transition),box-shadow var(--color-transition);-webkit-backdrop-filter:saturate(150%) blur(12px);backdrop-filter:saturate(150%) blur(12px)}@media print{.vp-navbar{display:none}}.hide-navbar .vp-navbar.auto-hide{transform:translateY(-100%)}.vp-navbar .nav-link{padding:0 .25rem}.vp-navbar .nav-link.active{color:var(--theme-color)}.vp-navbar .nav-link .icon{margin-inline-end:.25em;font-size:1em}.vp-navbar.hide-icon .vp-nav-links .icon{display:none!important}.vp-navbar-center,.vp-navbar-end,.vp-navbar-start{display:flex;flex:1;align-items:center}.vp-navbar-center>*,.vp-navbar-end>*,.vp-navbar-start>*{position:relative;margin:0 .25rem!important}.vp-navbar-center>:first-child,.vp-navbar-end>:first-child,.vp-navbar-start>:first-child{margin-inline-start:0!important}.vp-navbar-center>:last-child,.vp-navbar-end>:last-child,.vp-navbar-start>:last-child{margin-inline-end:0!important}.vp-navbar-start{justify-content:start}.vp-navbar-center{justify-content:center}.vp-navbar-end{justify-content:end}.vp-navbar .vp-repo{margin:0!important}.vp-navbar .vp-repo-link{display:inline-block;margin:auto;padding:6px;color:var(--dark-grey);line-height:1}#appearance-switch:hover,.vp-navbar .vp-repo-link:active,.vp-navbar .vp-repo-link:hover{color:var(--theme-color)}.vp-toggle-navbar-button{border-width:0;background:0 0;cursor:pointer;position:relative;display:none;align-items:center;justify-content:center;padding:6px}@media screen and (max-width:719px){.vp-toggle-navbar-button{display:flex}}.vp-toggle-navbar-button>span{position:relative;overflow:hidden;width:16px;height:14px}.vp-toggle-navbar-button .vp-bottom,.vp-toggle-navbar-button .vp-middle,.vp-toggle-navbar-button .vp-top{position:absolute;width:16px;height:2px;background:var(--dark-grey);transition:top .25s,background .5s,transform .25s}.vp-toggle-navbar-button .vp-top{top:0;left:0;transform:translateX(0)}.vp-toggle-navbar-button .vp-middle{top:6px;left:0;transform:translateX(8px)}.vp-toggle-navbar-button .vp-bottom{top:12px;left:0;transform:translateX(4px)}.vp-toggle-navbar-button:hover .vp-top{top:0;left:0;transform:translateX(4px)}.vp-toggle-navbar-button:hover .vp-middle{top:6;left:0;transform:translateX(0)}.vp-toggle-navbar-button:hover .vp-bottom{top:12px;left:0;transform:translateX(8px)}.vp-toggle-navbar-button.is-active .vp-top{top:6px;transform:translateX(0) rotate(225deg)}.vp-toggle-navbar-button.is-active .vp-middle{top:6px;transform:translateX(16px)}.vp-toggle-navbar-button.is-active .vp-bottom{top:6px;transform:translateX(0) rotate(135deg)}.vp-toggle-navbar-button.is-active:hover .vp-bottom,.vp-toggle-navbar-button.is-active:hover .vp-middle,.vp-toggle-navbar-button.is-active:hover .vp-top{background:var(--theme-color);transition:top .25s,background .25s,transform .25s}.vp-toggle-sidebar-button{border-width:0;background:0 0;cursor:pointer;display:none;vertical-align:middle;box-sizing:content-box;width:1rem;height:1rem;padding:.5rem;font:unset;transition:transform .2s ease-in-out}@media screen and (max-width:719px){.vp-toggle-sidebar-button{display:block;padding-inline-end:var(--navbar-mobile-horizontal-padding)}}.vp-toggle-sidebar-button .icon,.vp-toggle-sidebar-button::after,.vp-toggle-sidebar-button::before{display:block;width:100%;height:2px;border-radius:.05em;background:var(--dark-grey);transition:transform .2s ease-in-out}.vp-toggle-sidebar-button::before{content:" ";margin-top:.125em}.sidebar-open .vp-toggle-sidebar-button::before{transform:translateY(.34rem) rotate(135deg)}.vp-toggle-sidebar-button::after{content:" ";margin-bottom:.125em}.sidebar-open .vp-toggle-sidebar-button::after{transform:translateY(-.34rem) rotate(-135deg)}.vp-toggle-sidebar-button .icon{margin:.2em 0}.sidebar-open .vp-toggle-sidebar-button .icon{transform:scale(0)}.appearance-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}#appearance-switch,.outlook-button{border-width:0;background:0 0;cursor:pointer;color:var(--dark-grey)}#appearance-switch{padding:6px;transition:color var(--color-transition)}#appearance-switch .icon,.outlook-button .icon{width:1.25rem;height:1.25rem}.outlook-button{position:relative;padding:.375rem}#appearance-switch,.outlook-button .icon{vertical-align:middle}.outlook-dropdown{position:absolute;top:100%;inset-inline-end:0;overflow-y:auto;box-sizing:border-box;min-width:100px;margin:0;padding:.5rem .75rem;border:1px solid var(--grey14);border-radius:.25rem;background:var(--bg-color);box-shadow:2px 2px 10px var(--card-shadow);text-align:start;white-space:nowrap;opacity:0;visibility:hidden;transition:all .18s ease-out;transform:scale(.8)}.outlook-dropdown>:not(:last-child){padding-bottom:.5rem;border-bottom:1px solid var(--grey14)}.outlook-button.open .outlook-dropdown,.outlook-button:hover .outlook-dropdown{z-index:2;opacity:1;visibility:visible;transform:scale(1)}.theme-color-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}#theme-color-picker{display:flex;margin:0;padding:0;list-style-type:none;font-size:14px}#theme-color-picker li span{display:inline-block;vertical-align:middle;width:15px;height:15px;margin:0 2px;border-radius:2px}#theme-color-picker li span.theme-color,#theme-color-picker li span.theme-color html[data-theme=dark]{background:#3eaf7c}@media print{.full-screen-wrapper{display:none}}.full-screen-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}.cancel-full-screen,.full-screen{border-width:0;background:0 0;vertical-align:middle;padding:.375rem;color:var(--dark-grey);cursor:pointer}.cancel-full-screen:hover,.full-screen:hover{color:var(--theme-color)}.cancel-full-screen .icon,.full-screen .icon{width:1.25rem;height:1.25rem}.cancel-fullscreen-icon,.enter-fullscreen-icon:hover{color:var(--theme-color)}.cancel-fullscreen-icon:hover{color:var(--dark-grey)}.vp-sidebar-heading,.vp-sidebar-link{box-sizing:border-box;width:calc(100% - 1rem);margin-inline:.5rem;padding:.25rem .5rem;border-radius:.375rem;color:var(--text-color);line-height:1.5}.vp-sidebar-heading{display:flex;align-items:center;overflow:hidden;margin:0;border-width:0;background:0 0;font-size:1.1em;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:color .15s ease;transform:rotate(0)}.vp-sidebar-heading.clickable.exact a,.vp-sidebar-heading.open{color:inherit}.vp-sidebar-heading.clickable:hover{background:var(--bg-color-secondary)}.vp-sidebar-heading.clickable.exact{border-inline-start-color:var(--theme-color);color:var(--theme-color)}.vp-sidebar-heading .vp-sidebar-title{flex:1}.vp-sidebar-heading .vp-arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s;font-size:1.5em}html[data-theme=dark] .vp-sidebar-heading .vp-arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.vp-sidebar-heading .vp-arrow.down{transform:rotate(180deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.down{transform:rotate(-180deg)}.vp-sidebar-heading .vp-arrow.end{transform:rotate(90deg)}.vp-sidebar-heading .vp-arrow.start,html[dir=rtl] .vp-sidebar-heading .vp-arrow.end{transform:rotate(-90deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.start{transform:rotate(90deg)}button.vp-sidebar-heading{outline:0;font-weight:inherit;font-family:inherit;line-height:inherit;text-align:start;cursor:pointer}.vp-sidebar-link{display:inline-block;font-weight:400;font-size:1em}.vp-sidebar-link:hover{background:var(--bg-color-secondary)}.vp-sidebar-link.active{background:var(--theme-color-mask);font-weight:500}.vp-sidebar-link.active,.vp-sidebar-link.active .icon{color:var(--theme-color)}.vp-sidebar-sub-headers .vp-sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-inline-start:none}.vp-sidebar-sub-headers .vp-sidebar-link.active{background:0 0;font-weight:500}.vp-sidebar-group:not(.collapsible) .vp-sidebar-heading:not(.clickable){color:inherit;cursor:auto}.vp-sidebar-group .vp-sidebar-group{padding-inline-start:.75rem}.vp-sidebar-group .vp-sidebar-group .vp-sidebar-heading{font-size:1em}.vp-sidebar-group .vp-sidebar-link{padding-inline-start:1.25rem}.vp-sidebar-links,.vp-sidebar-links ul{margin:0;padding:0}.vp-sidebar-links ul.vp-sidebar-sub-headers{padding-inline-start:.75rem;font-size:.95em}@media (min-width:1440px){.has-toc .vp-sidebar-links ul.vp-sidebar-sub-headers{display:none}}.vp-sidebar-links li{list-style-type:none}.vp-sidebar>.vp-sidebar-links{padding:1.5rem 0}@media (max-width:719px){.vp-sidebar>.vp-sidebar-links{padding:1rem 0}}.vp-sidebar>.vp-sidebar-links>li>.vp-sidebar-link{font-size:1.1em}.vp-sidebar>.vp-sidebar-links>li:not(:first-child){margin-top:.5rem}.vp-sidebar{position:fixed;top:0;bottom:0;inset-inline-start:0;z-index:1;overflow-y:auto;width:var(--sidebar-width);margin:0;padding-inline-start:calc(var(--sidebar-space) - var(--sidebar-width));background:var(--sidebar-bg-color);box-shadow:2px 0 8px var(--card-shadow);font-size:.94rem;transition:background var(--color-transition),box-shadow var(--color-transition),padding var(--transform-transition),transform var(--transform-transition);-webkit-backdrop-filter:saturate(150%) blur(12px);backdrop-filter:saturate(150%) blur(12px);scrollbar-color:var(--theme-color) var(--border-color);scrollbar-width:thin}@media (max-width:959px){.vp-sidebar{font-size:.86em}}@media (max-width:719px){.vp-sidebar{z-index:125;box-shadow:none;transform:translateX(-100%)}html[dir=rtl] .vp-sidebar{transform:translateX(100%)}}@media (min-width:1440px){.vp-sidebar{padding-bottom:3rem;box-shadow:none;font-size:1rem}}@media print{.vp-sidebar{display:none}}.vp-sidebar a{display:inline-block;color:var(--text-color);font-weight:400}.vp-sidebar .icon{margin-inline-end:.25em;font-size:1em}.vp-sidebar.hide-icon .icon{display:none!important}.vp-sidebar-mask{position:fixed;inset:0;z-index:9;background:rgba(0,0,0,.15)}.vp-sidebar-mask.fade-enter-active,.vp-sidebar-mask.fade-leave-active{transition:opacity .25s}.vp-sidebar-mask.fade-enter-from,.vp-sidebar-mask.fade-leave-to{opacity:0}.toc-place-holder{top:calc(var(--navbar-height) + 5rem)} diff --git a/assets/css/styles.8a5c32f3.css b/assets/css/styles.8a5c32f3.css new file mode 100644 index 000000000..148214f28 --- /dev/null +++ b/assets/css/styles.8a5c32f3.css @@ -0,0 +1,31 @@ +html[data-theme=dark]{--text-color:#b0aeb7;--bg-color:#252232;--bg-color-secondary:#2c293d;--bg-color-tertiary:#3a3755;--border-color:#302d28;--box-shadow:#282a32;--card-shadow:rgba(0, 0, 0, 0.3);--black:#fff;--dark-grey:#999;--light-grey:#666;--white:#000;--grey3:#bbb;--grey12:#333;--grey14:#111;--bg-color-light:#2c293d;--bg-color-back:#252232;--bg-color-float:#2c293d;--bg-color-blur:rgba(37, 34, 50, 0.9);--bg-color-float-blur:rgba(44, 41, 61, 0.9);--text-color-light:#b8b6be;--text-color-lighter:#c0bec5;--text-color-bright:#d0ced4;--border-color-light:#2e2b26;--border-color-dark:#3c3832}:root{--theme-color:#3eaf7c;--text-color:#2c3e50;--bg-color:#fff;--bg-color-secondary:#f8f8f8;--bg-color-tertiary:#efeef4;--border-color:#eaecef;--box-shadow:#f0f1f2;--card-shadow:rgba(0, 0, 0, 0.15);--black:#000;--dark-grey:#666;--light-grey:#999;--white:#fff;--grey3:#333;--grey12:#bbb;--grey14:#eee;--navbar-height:3.75rem;--navbar-horizontal-padding:1.5rem;--navbar-vertical-padding:0.7rem;--navbar-mobile-height:3.25rem;--navbar-mobile-horizontal-padding:1rem;--navbar-mobile-vertical-padding:0.5rem;--sidebar-width:18rem;--sidebar-mobile-width:16rem;--content-width:780px;--home-page-width:1160px;--font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", SimSun, sans-serif;--font-family-heading:Georgia Pro, Crimson, Georgia, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", SimSun, sans-serif;--font-family-mono:Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--line-numbers-width:2.5rem;--color-transition:0.3s ease;--transform-transition:0.3s ease;--vp-bg:var(--bg-color);--vp-bgl:var(--bg-color-light);--vp-bglt:var(--bg-color-tertiary);--vp-c:var(--text-color);--vp-cl:var(--text-color-light);--vp-clt:var(--text-color-lighter);--vp-brc:var(--border-color);--vp-brcd:var(--border-color-dark);--vp-tc:var(--theme-color);--vp-tcl:var(--theme-color-light);--vp-ct:var(--color-transition);--vp-tt:var(--transform-transition);--bg-color-light:#fff;--bg-color-back:#f8f8f8;--bg-color-float:#fff;--bg-color-blur:rgba(255, 255, 255, 0.9);--bg-color-float-blur:rgba(255, 255, 255, 0.9);--text-color-light:#3a5169;--text-color-lighter:#476582;--text-color-bright:#6a8bad;--border-color-light:#eceef1;--border-color-dark:#cfd4db;--theme-color-dark:#389e70;--theme-color-light:#4abf8a;--theme-color-mask:rgba(62, 175, 124, 0.15)} +.font-icon{display:inline-block}.theme-hope-content .font-icon{vertical-align:middle} +:root{--badge-tip-color:#42b983;--badge-warning-color:#f4cd00;--badge-danger-color:#f55;--badge-info-color:#0295ff;--badge-note-color:#666}.vp-badge{display:inline-block;vertical-align:center;height:18px;padding:0 6px;border-radius:3px;background:var(--vp-tc);color:var(--white);font-size:14px;line-height:18px;transition:background var(--vp-ct),color var(--vp-ct)}.vp-badge+.vp-badge{margin-inline-start:5px}h1 .vp-badge,h2 .vp-badge,h3 .vp-badge,h4 .vp-badge,h5 .vp-badge,h6 .vp-badge{vertical-align:top}.vp-badge.tip{background:var(--badge-tip-color)}.vp-badge.warning{background:var(--badge-warning-color)}.vp-badge.danger{background:var(--badge-danger-color)}.vp-badge.info{background:var(--badge-info-color)}.vp-badge.note{background:var(--badge-note-color)} +@media print{.bilibili-desc a{display:block}}.bilibili-iframe{margin:8px 0;border:0;border-radius:8px}@media print{.bilibili-iframe{display:none}} +media-community-skin[data-audio]{--audio-brand:var(--vp-tc);--audio-bg:var(--vp-bg);--audio-controls-color:var(--dark-grey);--audio-title-color:var(--vp-c);--audio-time-muted-color:var(--light-grey);--audio-play-button-bg:var(--vp-bglt);--audio-play-button-color:var(--black)}:where(media-community-skin[data-audio] [part~=media-ui]){box-shadow:2px 2px 10px 0 var(--card-shadow)}media-community-skin[data-video]{--video-brand:var(--vp-tc)} +@media screen{.sr-only{position:absolute;overflow:hidden;clip:rect 0,0,0,0;width:1px;height:1px;margin:-1px;padding:0;border:0}}@media print{.sr-only{display:none}} +@charset "UTF-8";.vp-catalog-wrapper{margin-top:8px;margin-bottom:8px}.vp-catalog-wrapper.index .vp-catalogs,.vp-catalog-wrapper.index ol,.vp-catalogs.deep{padding-inline-start:0}.vp-catalog-wrapper.index .vp-catalog,.vp-catalog-wrapper.index li{list-style-type:none}.vp-catalog-wrapper.index .vp-catalog-title::before{content:"§"counter(catalog-item,upper-roman)" "}.vp-catalog-wrapper.index .vp-child-catalogs{counter-reset:child-catalog}.vp-catalog-wrapper.index .vp-child-catalog{counter-increment:child-catalog}.vp-catalog-wrapper.index .vp-child-catalog .vp-catalog-title::before{content:counter(catalog-item)"."counter(child-catalog)" "}.vp-catalog-wrapper.index .vp-sub-catalogs{padding-inline-start:.5rem}.vp-catalogs{margin:0;counter-reset:catalog-item}.vp-catalogs.deep .vp-catalog{list-style-type:none}.vp-catalogs .font-icon{vertical-align:baseline;margin-inline-end:.25rem}.vp-catalog{counter-increment:catalog-item}.vp-catalog-main-title{margin-top:calc(.5rem - var(--navbar-height, 3.6rem));margin-bottom:.5rem;padding-top:var(--navbar-height, 3.6rem);font-weight:500;font-size:1.75rem}.vp-catalog-main-title:first-child{margin-bottom:.5rem!important}.vp-catalog-child-title.has-children:only-child,.vp-catalog-main-title:only-child{margin-bottom:0!important}.vp-catalog-main-title .vp-link{text-decoration:none!important}.vp-catalog-child-title{margin-bottom:.5rem!important}.vp-catalog-child-title.has-children{margin-top:calc(.5rem - var(--navbar-height, 3.6rem));padding-top:var(--navbar-height, 3.6rem);border-bottom:1px solid var(--catalog-border-color);font-weight:500;font-size:1.3rem;transition:border-color .3s}.vp-catalog-child-title .vp-link{text-decoration:none!important}.vp-catalog-sub-title{font-weight:500;font-size:1.1rem}.vp-catalog-sub-title:only-child{margin-bottom:0!important}.vp-catalog-title{color:inherit;text-decoration:none}.vp-catalog-title:hover{color:var(--catalog-active-color)}.vp-child-catalogs{margin:0}.vp-child-catalog{list-style-type:disc}.vp-sub-catalogs{counter-reset:sub-catalog}.vp-sub-catalog{counter-increment:sub-catalog}.vp-sub-catalog .vp-link::before{content:counter(catalog-item)"."counter(child-catalog)"."counter(sub-catalog)" "}.vp-sub-catalogs-wrapper{display:flex;flex-wrap:wrap}.vp-sub-catalog-link{display:inline-block;margin:4px 8px;padding:4px 8px;border-radius:6px;background-color:var(--catalog-bg-secondary-color);line-height:1.5;overflow-wrap:break-word;transition:background-color .3s,color .3s}.vp-sub-catalog-link:hover{background-color:var(--catalog-hover-color);color:var(--catalog-bg-color);text-decoration:none!important}.vp-catalog-header-anchor{font-size:.85em;float:left;margin-left:-1em;padding-right:0;margin-top:.125em;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-decoration:none;content:"¶"}@media print{.vp-catalog-header-anchor{display:none}}h2:hover .vp-catalog-header-anchor,h3:hover .vp-catalog-header-anchor{opacity:1;text-decoration:none}.vp-catalog-header-anchor:focus-visible{opacity:1}.vp-empty-catalog{font-size:1.25rem;text-align:center} +:root{--catalog-bg-color:#fff;--catalog-bg-secondary-color:#f8f8f8;--catalog-border-color:#e5e5e5;--catalog-active-color:#3eaf7c;--catalog-hover-color:#71cda3} +.vp-back-to-top-button{position:fixed!important;bottom:4rem;inset-inline-end:1rem;z-index:100;width:3rem;height:3rem;padding:.5rem;border-width:0;border-radius:50%;background:var(--back-to-top-bg-color);color:var(--back-to-top-color);box-shadow:2px 2px 10px 4px var(--back-to-top-shadow);cursor:pointer}@media (max-width:959px){.vp-back-to-top-button{width:2.5rem;height:2.5rem}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-color-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:100%;height:100%;background:currentcolor;border-radius:50%;-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;right:-2px;bottom:-2px;width:calc(100% + 4px);height:calc(100% + 4px)}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;fill:none;stroke:currentColor;transform:rotate(-90deg);transform-origin:50% 50%;r:22;stroke-dasharray:0% 314.1593%;stroke-width:3px}@media (max-width:959px){.vp-scroll-progress circle{r:18}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0} +:root{--back-to-top-z-index:5;--back-to-top-icon:url(/assets/img/back-to-top.bdc03142.svg);--back-to-top-bg-color:#fff;--back-to-top-color:#3eaf7c;--back-to-top-color-hover:#71cda3;--back-to-top-shadow:rgb(0 0 0 / 20%)} +:root{--external-link-icon-color:#aaa} +.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}@media print{.external-link-icon{display:none}}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none} +:root{--nprogress-color:#29d;--nprogress-z-index:1031} +#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px} +:root{--waline-font-size:1rem;--waline-white:#fff;--waline-light-grey:#999;--waline-dark-grey:#666;--waline-theme-color:#27ae60;--waline-active-color:#2ecc71;--waline-color:#444;--waline-bg-color:#fff;--waline-bg-color-light:#f8f8f8;--waline-bg-color-hover:#f0f0f0;--waline-border-color:#ddd;--waline-disable-bg-color:#f8f8f8;--waline-disable-color:#000;--waline-code-bg-color:#282c34;--waline-bq-color:#f0f0f0;--waline-avatar-size:3.25rem;--waline-m-avatar-size:calc(var(--waline-avatar-size) * 9 / 13);--waline-badge-color:#3498db;--waline-badge-font-size:0.75em;--waline-info-bg-color:#f8f8f8;--waline-info-color:#999;--waline-info-font-size:0.625em;--waline-border:1px solid var(--waline-border-color);--waline-avatar-radius:50%;--waline-box-shadow:none}[data-waline]{font-size:var(--waline-font-size);text-align:start}[dir=rtl] [data-waline]{direction:rtl}[data-waline] *{box-sizing:content-box;line-height:1.75}[data-waline] p{color:var(--waline-color)}[data-waline] a{position:relative;display:inline-block;color:var(--waline-theme-color);text-decoration:none;word-break:break-word;cursor:pointer}[data-waline] a:hover{color:var(--waline-active-color)}[data-waline] img{max-width:100%;max-height:400px;border:0}[data-waline] hr{margin:.825em 0;border-style:dashed;border-color:var(--waline-bg-color-light)}[data-waline] code,[data-waline] pre{margin:0;padding:.2em .4em;border-radius:3px;background:var(--waline-bg-color-light);font-size:85%}[data-waline] pre{overflow:auto;padding:10px;line-height:1.45}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar,[data-waline] pre::-webkit-scrollbar{width:6px;height:6px}[data-waline] pre::-webkit-scrollbar-track-piece:horizontal{border-radius:6px;background:rgba(0,0,0,.1)}[data-waline] pre::-webkit-scrollbar-thumb:horizontal{width:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-btn,[data-waline] pre code{background:0 0;color:var(--waline-color)}[data-waline] pre code{padding:0;white-space:pre-wrap;word-break:keep-all}[data-waline] blockquote{margin:.5em 0;padding:.5em 0 .5em 1em;border-inline-start:8px solid var(--waline-bq-color);color:var(--waline-dark-grey)}[data-waline] blockquote>p{margin:0}[data-waline] ol,[data-waline] ul{margin-inline-start:1.25em;padding:0}[data-waline] input[type=checkbox],[data-waline] input[type=radio]{display:inline-block;vertical-align:middle;margin-top:-2px}.wl-btn{display:inline-block;vertical-align:middle;min-width:2.5em;margin-bottom:0;padding:.5em 1em;border:1px solid var(--waline-border-color);border-radius:.5em;font-weight:400;font-size:.75em;line-height:1.5;text-align:center;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition-duration:.4s;touch-action:manipulation}.wl-btn:active,.wl-btn:hover{border-color:var(--waline-theme-color);color:var(--waline-theme-color)}.wl-btn:disabled{border-color:var(--waline-border-color);background:var(--waline-disable-bg-color);color:var(--waline-disable-color);cursor:not-allowed}.wl-btn.primary{border-color:var(--waline-theme-color);background:var(--waline-theme-color);color:var(--waline-white)}.wl-btn.primary:active,.wl-btn.primary:hover{border-color:var(--waline-active-color);background:var(--waline-active-color);color:var(--waline-white)}.wl-btn.primary:disabled{border-color:var(--waline-border-color);background:var(--waline-disable-bg-color);color:var(--waline-disable-color);cursor:not-allowed}.wl-content p.wl-tex,.wl-header label,.wl-loading{text-align:center}.wl-loading svg{margin:0 auto}.wl-comment{position:relative;display:flex;margin-bottom:.75em}.wl-close{position:absolute;top:-4px;inset-inline-end:-4px;padding:0;border:0;background:0 0;line-height:1;cursor:pointer}.wl-login-info{max-width:80px;margin-top:.75em;text-align:center}.wl-logout-btn{position:absolute;top:-10px;inset-inline-end:-10px;padding:3px;border:0;background:0 0;line-height:0;cursor:pointer}.wl-avatar,.wl-avatar img{border-radius:var(--waline-avatar-radius)}.wl-avatar{position:relative;width:var(--waline-avatar-size);height:var(--waline-avatar-size);margin:0 auto;border:var(--waline-border)}@media (max-width:720px){.wl-avatar{width:var(--waline-m-avatar-size);height:var(--waline-m-avatar-size)}}.wl-avatar img{width:100%;height:100%}.wl-login-nick{display:block;color:var(--waline-theme-color);font-size:.75em;word-break:break-all}.wl-panel{position:relative;flex-shrink:1;width:100%;margin:.5em;border:var(--waline-border);border-radius:.75em;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow)}.wl-header{display:flex;overflow:hidden;padding:0 4px;border-bottom:2px dashed var(--waline-border-color);border-top-left-radius:.75em;border-top-right-radius:.75em}@media (max-width:580px){.wl-header{display:block}}.wl-header label{min-width:40px;padding:.75em .5em;color:var(--waline-color);font-size:.75em}.wl-header input{flex:1;width:0;padding:.5em;background:0 0;font-size:.625em;resize:none}.wl-header-item{display:flex;flex:1}@media (max-width:580px){.wl-header-item:not(:last-child){border-bottom:2px dashed var(--waline-border-color)}}.wl-header-1 .wl-header-item{width:100%}.wl-header-2 .wl-header-item{width:50%}@media (max-width:580px){.wl-header-2 .wl-header-item{flex:0;width:100%}}.wl-header-3 .wl-header-item{width:33.33%}@media (max-width:580px){.wl-header-3 .wl-header-item{width:100%}}.wl-editor{position:relative;width:calc(100% - 1em);min-height:8.75em;margin:.75em .5em;border-radius:.5em;background:0 0;font-size:.875em;resize:vertical}.wl-editor,.wl-input{max-width:100%;border:0;color:var(--waline-color);outline:0;transition:all .25s ease}.wl-editor:focus,.wl-input:focus{background:var(--waline-bg-color-light)}.wl-preview{padding:0 .5em .5em}.wl-preview h4{margin:.25em;font-weight:700;font-size:.9375em}.wl-preview .wl-content{min-height:1.25em;padding:.25em;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.wl-preview .wl-content>:first-child{margin-top:0}.wl-preview .wl-content>:last-child{margin-bottom:0}.wl-footer{position:relative;display:flex;flex-wrap:wrap;margin:.5em .75em}.wl-actions{display:flex;flex:2;align-items:center}.wl-action{display:inline-flex;align-items:center;justify-content:center;width:1.5em;height:1.5em;margin:2px;padding:0;border:0;background:0 0;color:var(--waline-color);font-size:16px;cursor:pointer}.wl-action:hover{color:var(--waline-theme-color)}.wl-action.active{color:var(--waline-active-color)}#wl-image-upload{display:none}#wl-image-upload:focus+label{color:var(--waline-color)}#wl-image-upload:focus-visible+label{outline:-webkit-focus-ring-color auto 1px}.wl-info{display:flex;flex:3;align-items:center;justify-content:flex-end}.wl-info .wl-text-number{color:var(--waline-info-color);font-size:.75em}.wl-info .wl-text-number .illegal{color:red}.wl-info button{margin-inline-start:.75em}.wl-info button svg{display:block;margin:0 auto;line-height:18px}.wl-emoji-popup{position:absolute;top:100%;inset-inline-start:1.25em;z-index:10;display:none;width:100%;max-width:526px;border:var(--waline-border);border-radius:6px;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow)}.wl-emoji-popup.display{display:block}.wl-emoji-popup button{display:inline-block;vertical-align:middle;width:2em;margin:.125em;padding:0;border-width:0;background:0 0;font-size:inherit;line-height:2;text-align:center;cursor:pointer}.wl-emoji-popup button:hover{background:var(--waline-bg-color-hover)}.wl-emoji-popup .wl-emoji{display:inline-block;vertical-align:middle;max-width:1.5em;max-height:1.5em}.wl-emoji-popup .wl-tab-wrapper{overflow-y:auto;max-height:145px;padding:.5em}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar-track-piece:vertical{border-radius:6px;background:rgba(0,0,0,.1)}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar-thumb:vertical{width:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-emoji-popup .wl-tabs{position:relative;overflow-x:auto;padding:0 6px;white-space:nowrap}.wl-emoji-popup .wl-tabs::before{content:" ";position:absolute;top:0;right:0;left:0;z-index:2;height:1px;background:var(--waline-border-color)}.wl-emoji-popup .wl-tabs::-webkit-scrollbar{width:6px;height:6px}.wl-emoji-popup .wl-tabs::-webkit-scrollbar-track-piece:horizontal{border-radius:6px;background:rgba(0,0,0,.1)}.wl-emoji-popup .wl-tabs::-webkit-scrollbar-thumb:horizontal{height:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-emoji-popup .wl-tab{position:relative;margin:0;padding:0 .5em}.wl-emoji-popup .wl-tab.active{z-index:3;border:1px solid var(--waline-border-color);border-top-width:0;border-bottom-right-radius:6px;border-bottom-left-radius:6px;background:var(--waline-bg-color)}.wl-gif-popup{position:absolute;top:100%;inset-inline-start:1.25em;z-index:10;width:calc(100% - 3em);padding:.75em .75em .25em;border:var(--waline-border);border-radius:6px;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow);opacity:0;visibility:hidden;transition:transform .2s ease-out,opacity .2s ease-out;transform:scale(.9,.9);transform-origin:0 0}.wl-gif-popup.display{opacity:1;visibility:visible;transform:none}.wl-gif-popup input{box-sizing:border-box;width:100%;margin-bottom:10px;padding:3px 5px;border:var(--waline-border)}.wl-gif-popup img{display:block;box-sizing:border-box;width:100%;border-width:2px;border-style:solid;border-color:#fff;cursor:pointer}.wl-gif-popup img:hover{border-color:var(--waline-theme-color);border-radius:2px}.wl-gallery{display:flex;overflow-y:auto;max-height:80vh}.wl-gallery-column{display:flex;flex:1;flex-direction:column;height:max-content}.wl-cards .wl-user{--avatar-size:var(--waline-avatar-size);position:relative;margin-inline-end:.75em}@media (max-width:720px){.wl-cards .wl-user{--avatar-size:var(--waline-m-avatar-size)}}.wl-cards .wl-user .wl-user-avatar{width:var(--avatar-size);height:var(--avatar-size);border-radius:var(--waline-avatar-radius);box-shadow:var(--waline-box-shadow)}.wl-cards .wl-user .verified-icon{position:absolute;top:calc(var(--avatar-size)*3/4);inset-inline-start:calc(var(--avatar-size)*3/4);border-radius:50%;background:var(--waline-bg-color);box-shadow:var(--waline-box-shadow)}.wl-card-item{position:relative;display:flex;padding:.5em}.wl-card-item .wl-card-item{padding-inline-end:0}.wl-card{flex:1;width:0;padding-bottom:.5em;border-bottom:1px dashed var(--waline-border-color)}.wl-card:first-child{margin-inline-start:1em}.wl-card-item:last-child>.wl-card{border-bottom:none}.wl-card .wl-nick svg{position:relative;bottom:-.125em;line-height:1}.wl-card .wl-head{overflow:hidden;line-height:1.5}.wl-card .wl-head .wl-nick{position:relative;display:inline-block;margin-inline-end:.5em;font-weight:700;font-size:.875em;line-height:1;text-decoration:none}.wl-card span.wl-nick{color:var(--waline-dark-grey)}.wl-card .wl-badge{display:inline-block;margin-inline-end:1em;padding:0 .3em;border:1px solid var(--waline-badge-color);border-radius:4px;color:var(--waline-badge-color);font-size:var(--waline-badge-font-size)}.wl-card .wl-time{margin-inline-end:.875em;color:var(--waline-info-color);font-size:.75em}.wl-card .wl-meta{position:relative;line-height:1}.wl-card .wl-meta>span{display:inline-block;margin-inline-end:.25em;padding:2px 4px;border-radius:.2em;background:var(--waline-info-bg-color);color:var(--waline-info-color);font-size:var(--waline-info-font-size);line-height:1.5}.wl-card .wl-meta>span:empty{display:none}.wl-card .wl-comment-actions{float:right;line-height:1}[dir=rtl] .wl-card .wl-comment-actions{float:left}.wl-card .wl-delete,.wl-card .wl-edit,.wl-card .wl-like,.wl-card .wl-reply{display:inline-flex;align-items:center;border:0;background:0 0;color:var(--waline-color);line-height:1;cursor:pointer;transition:color .2s ease}.wl-card .wl-delete:hover,.wl-card .wl-edit:hover,.wl-card .wl-like:hover,.wl-card .wl-reply:hover,.wl-sort li.active{color:var(--waline-theme-color)}.wl-card .wl-delete.active,.wl-card .wl-edit.active,.wl-card .wl-like.active,.wl-card .wl-reply.active{color:var(--waline-active-color)}.wl-card .wl-content{position:relative;margin-bottom:.75em;padding-top:.625em;font-size:.875em;line-height:2;word-wrap:break-word}.wl-card .wl-content.expand{overflow:hidden;max-height:8em;cursor:pointer}.wl-card .wl-content.expand::after,.wl-card .wl-content.expand::before{position:absolute;inset-inline-start:0;z-index:999;display:block;width:100%}.wl-card .wl-content.expand::before{content:"";top:0;bottom:3.15em;background:linear-gradient(180deg,#000,rgba(255,255,255,.9))}.wl-card .wl-content.expand::after{content:attr(data-expand);bottom:0;height:3.15em;background:rgba(255,255,255,.9);color:#828586;line-height:3.15em;text-align:center}.wl-card .wl-content>:first-child{margin-top:0}.wl-card .wl-content>:last-child{margin-bottom:0}.wl-card .wl-admin-actions{margin:8px 0;font-size:12px;text-align:right}.wl-card .wl-comment-status{margin:0 8px}.wl-card .wl-comment-status .wl-btn{border-radius:0}.wl-card .wl-comment-status .wl-btn:first-child{border-inline-end:0;border-radius:.5em 0 0 .5em}.wl-card .wl-comment-status .wl-btn:last-child{border-inline-start:0;border-radius:0 .5em .5em 0}.wl-card .wl-quote{border-inline-start:1px dashed rgba(237,237,237,.5)}.wl-card .wl-quote .wl-user{--avatar-size:var(--waline-m-avatar-size)}.wl-close-icon{color:var(--waline-border-color)}.wl-content .vemoji,.wl-content .wl-emoji{display:inline-block;vertical-align:baseline;height:1.25em;margin:-.125em .25em}.wl-content .wl-tex{background:var(--waline-info-bg-color);color:var(--waline-info-color)}.wl-content span.wl-tex{display:inline-block;margin-inline-end:.25em;padding:2px 4px;border-radius:.2em;font-size:var(--waline-info-font-size);line-height:1.5}.wl-content .katex-display{overflow:auto hidden;-webkit-overflow-scrolling:touch;padding-top:.2em;padding-bottom:.2em}.wl-content .katex-display::-webkit-scrollbar{height:3px}.wl-content .katex-error{color:red}.wl-count{flex:1;font-weight:700;font-size:1.25em}.wl-empty{overflow:auto;padding:1.25em;color:var(--waline-color)}.wl-empty,.wl-operation{text-align:center}.wl-operation button{margin:1em 0}.wl-power{padding:.5em 0;color:var(--waline-light-grey);font-size:var(--waline-info-font-size);text-align:end}.wl-meta-head{display:flex;flex-direction:row;align-items:center;padding:.375em}.wl-sort{margin:0;list-style-type:none}.wl-sort li{display:inline-block;color:var(--waline-info-color);font-size:.75em;cursor:pointer}.wl-sort li+li{margin-inline-start:1em}.wl-reaction{overflow:auto hidden;margin-bottom:1.75em;text-align:center}.wl-reaction img{width:100%;height:100%;transition:all 250ms ease-in-out}.wl-reaction-title{margin:16px auto;font-weight:700;font-size:18px}.wl-reaction-list{display:flex;flex-direction:row;gap:16px;justify-content:center;margin:0;padding:8px;list-style-type:none}@media (max-width:580px){.wl-reaction-list{gap:12px}}[data-waline] .wl-reaction-list{margin-inline-start:0}.wl-reaction-item{display:flex;flex-direction:column;align-items:center;cursor:pointer}.wl-reaction-item.active img,.wl-reaction-item:hover img{transform:scale(1.15)}.wl-reaction-img{position:relative;width:42px;height:42px}@media (max-width:580px){.wl-reaction-img{width:32px;height:32px}}.wl-reaction-loading,.wl-reaction-votes{position:absolute;color:var(--waline-theme-color)}.wl-reaction-loading{top:-4px;inset-inline-end:-5px;width:18px;height:18px}.wl-reaction-votes{top:-9px;inset-inline-end:-9px;min-width:1em;padding:2px;border:1px solid var(--waline-theme-color);border-radius:1em;background:var(--waline-bg-color);font-weight:700;font-size:.75em;line-height:1}.wl-reaction-item.active .wl-reaction-votes{background:var(--waline-theme-color);color:var(--waline-bg-color)}.wl-reaction-text{font-size:.875em}.wl-reaction-item.active .wl-reaction-text{color:var(--waline-theme-color)}.wl-content pre,.wl-content pre[class*=language-]{margin:.75rem 0;padding:1rem 1.25rem;border-radius:6px;background:var(--waline-code-bg-color);line-height:1.4;overflow:auto}.wl-content pre code,.wl-content pre[class*=language-] code{padding:0;border-radius:0;background:0 0!important;color:#bbb;direction:ltr}.wl-content code[class*=language-],.wl-content pre[class*=language-]{background:0 0;color:#ccc;font-size:1em;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;tab-size:4;-webkit-hyphens:none;hyphens:none}.wl-content :not(pre)>code[class*=language-],.wl-content pre[class*=language-]{background:#2d2d2d}.wl-content :not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.wl-content .token.block-comment,.wl-content .token.cdata,.wl-content .token.comment,.wl-content .token.doctype,.wl-content .token.prolog{color:#999}.wl-content .token.punctuation{color:#ccc}.wl-content .token.attr-name,.wl-content .token.deleted,.wl-content .token.namespace,.wl-content .token.tag{color:#e2777a}.wl-content .token.function-name{color:#6196cc}.wl-content .token.boolean,.wl-content .token.function,.wl-content .token.number{color:#f08d49}.wl-content .token.class-name,.wl-content .token.constant,.wl-content .token.property,.wl-content .token.symbol{color:#f8c555}.wl-content .token.atrule,.wl-content .token.builtin,.wl-content .token.important,.wl-content .token.keyword,.wl-content .token.selector{color:#cc99cd}.wl-content .token.attr-value,.wl-content .token.char,.wl-content .token.regex,.wl-content .token.string,.wl-content .token.variable{color:#7ec699}.wl-content .token.entity,.wl-content .token.operator,.wl-content .token.url{color:#67cdcc}.wl-content .token.bold,.wl-content .token.important{font-weight:700}.wl-content .token.italic{font-style:italic}.wl-content .token.entity{cursor:help}.wl-content .token.inserted{color:green}.wl-recent-item p{display:inline}.wl-user-list,.wl-user-wall{padding:0;list-style:none}.wl-user-list a,.wl-user-list a:hover,.wl-user-list a:visited{color:var(--waline-color);text-decoration:none}.wl-user-list .wl-user-avatar{position:relative;display:inline-block;overflow:hidden;margin-inline-end:10px;border-radius:4px;line-height:0}.wl-user-list .wl-user-avatar>img,.wl-user-wall .wl-user-item img{width:var(--waline-user-avatar-size, 48px);height:var(--waline-user-avatar-size, 48px)}.wl-user-list .wl-user-badge{position:absolute;bottom:0;inset-inline-end:0;min-width:.7em;height:1.5em;padding:0 .4em;border-radius:4px;background:var(--waline-info-bg-color);color:var(--waline-info-color);font-weight:700;font-size:10px;line-height:1.5em;text-align:center}.wl-user-list .wl-user-item{margin:10px 0}.wl-user-list .wl-user-item:nth-child(1) .wl-user-badge{background:var(--waline-rank-gold-bg-color, #fa3939);color:var(--waline-white);font-weight:700}.wl-user-list .wl-user-item:nth-child(2) .wl-user-badge{background:var(--waline-rank-silver-bg-color, #fb811c);color:var(--waline-white);font-weight:700}.wl-user-list .wl-user-item:nth-child(3) .wl-user-badge{background:var(--waline-rank-copper-bg-color, #feb207);color:var(--waline-white)}.wl-user-list .wl-user-meta{display:inline-block;vertical-align:top}.wl-user-list .wl-badge{display:inline-block;vertical-align:text-top;margin-inline-start:.5em;padding:0 .3em;border:1px solid var(--waline-badge-color);border-radius:4px;color:var(--waline-badge-color);font-size:var(--waline-badge-font-size)}.wl-user-wall .wl-user-badge,.wl-user-wall .wl-user-meta{display:none}.wl-user-wall .wl-user-item{position:relative;display:inline-block;transition:transform ease-in-out .2s}.wl-user-wall .wl-user-item::after,.wl-user-wall .wl-user-item::before{position:absolute;bottom:100%;left:50%;z-index:10;opacity:0;pointer-events:none;transition:all .18s ease-out .18s;transform:translate(-50%,4px);transform-origin:top}.wl-user-wall .wl-user-item::before{content:"";width:0;height:0;border:5px solid transparent;border-top-color:rgba(16,16,16,.95)}.wl-user-wall .wl-user-item::after{content:attr(aria-label);margin-bottom:10px;padding:.5em 1em;border-radius:2px;background:rgba(16,16,16,.95);color:#fff;font-size:12px;white-space:nowrap}.wl-user-wall .wl-user-item:hover{transform:scale(1.1)}.wl-user-wall .wl-user-item:hover::after,.wl-user-wall .wl-user-item:hover::before{opacity:1;pointer-events:none;transform:translate(-50%,0)} +.waline-wrapper{--waline-theme-color:var(--vp-tc);--waline-text-color:var(--vp-c);--waline-active-color:var(--vp-tcl);--waline-border:1px solid var(--vp-brc);--waline-border-color:var(--vp-brc);--waline-bgcolor:var(--vp-bg);--waline-bgcolor-light:var(--vp-bgl);max-width:var(--content-width, 740px);margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.waline-wrapper{padding:1.5rem}}@media (max-width:419px){.waline-wrapper{padding:1rem 1.5rem}}@media print{.waline-wrapper{max-width:unset;display:none!important}} +div[class*=language-]:hover::before{display:none}div[class*=language-]:hover .vp-copy-code-button{opacity:1}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:0 0;outline:0;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button.copied,.vp-copy-code-button:focus{opacity:1}.vp-copy-code-button.copied,.vp-copy-code-button:hover{background:var(--copy-code-hover)}.vp-copy-code-button.copied .vp-copy-icon{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied::after,.vp-copy-icon{height:1.25rem;padding:.625rem;color:var(--copy-code-color)}.vp-copy-code-button.copied::after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;border-radius:.5rem;background:var(--copy-code-hover);font-weight:500;line-height:1.25rem;white-space:nowrap}.vp-copy-icon{width:1.25rem;background:currentcolor;font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:1em;mask-size:1em} +:root{--code-copy-icon:url(/assets/img/copy-button.45f8803e.svg);--code-copied-icon:url(/assets/img/copied-button.9f175e5f.svg);--copy-code-color:#9e9e9e;--copy-code-hover:rgb(0 0 0 / 50%)} +.theme-hope-content figure{position:relative;display:flex;flex-direction:column;width:auto;margin:1rem auto;text-align:center;transition:transform var(--vp-tt)}.theme-hope-content figure img{overflow:hidden;margin:0 auto;border-radius:8px}.theme-hope-content figure img[tabindex]:focus,.theme-hope-content figure img[tabindex]:hover{box-shadow:2px 2px 10px 0 var(--card-shadow)}@media print{.theme-hope-content figure>a[href^="http://"]::after,.theme-hope-content figure>a[href^="https://"]::after{content:""}}.theme-hope-content figure>a .external-link-icon{display:none}.theme-hope-content figure figcaption{display:inline-block;margin:6px auto;font-size:.8rem} +.footnote-item{margin-top:calc(0rem - var(--navbar-height, 3.6rem));padding-top:calc(var(--navbar-height, 3.6rem) + .5rem)}.footnote-item>p{margin-bottom:0}.footnote-ref{position:relative}.footnote-anchor{position:absolute;top:calc(-.5rem - var(--navbar-height, 3.6rem))} +:root{--important-title-color:#230555;--important-bg-color:#f4eefe;--important-border-color:#a371f7;--important-code-bg-color:rgb(163 113 247 / 10%);--info-title-color:#193c47;--info-bg-color:#eef9fd;--info-border-color:#4cb3d4;--info-code-bg-color:rgb(76 179 212 / 10%);--note-title-color:#474748;--note-bg-color:#fdfdfe;--note-border-color:#ccc;--note-code-bg-color:rgb(212 213 216 / 20%);--tip-title-color:#003100;--tip-bg-color:#e6f6e6;--tip-border-color:#009400;--tip-code-bg-color:rgb(0 148 0 / 15%);--warning-title-color:#4d3800;--warning-bg-color:#fff8e6;--warning-border-color:#e6a700;--warning-code-bg-color:rgb(230 167 0 / 15%);--caution-title-color:#4b1113;--caution-bg-color:#ffebec;--caution-border-color:#e13238;--caution-code-bg-color:rgb(225 50 56 / 15%);--detail-bg-color:#eee;--detail-text-color:inherit;--detail-code-bg-color:rgb(127 127 127 / 15%)}html[data-theme=dark]{--important-title-color:#f4eefe;--important-bg-color:#230555;--info-title-color:#eef9fd;--info-bg-color:#193c47;--note-title-color:#fdfdfe;--note-bg-color:#474748;--tip-title-color:#e6f6e6;--tip-bg-color:#003100;--warning-title-color:#fff8e6;--warning-bg-color:#4d3800;--caution-title-color:#ffebec;--caution-bg-color:#4b1113;--detail-bg-color:#333;--detail-text-color:#a8a8a8}.hint-container{position:relative;transition:background var(--vp-ct),border-color var(--vp-ct),color var(--vp-ct)}@media print{.hint-container{page-break-inside:avoid}}.hint-container .hint-container-title{position:relative;font-weight:600;line-height:1.25}.hint-container.caution,.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning{margin:1rem 0;padding:.25rem 1rem;border-inline-start-width:.3rem;border-inline-start-style:solid;border-radius:.5rem;color:inherit}@media (max-width:419px){.hint-container.caution,.hint-container.important,.hint-container.info,.hint-container.note,.hint-container.tip,.hint-container.warning{margin-inline:-.75rem}}.hint-container.caution .hint-container-title,.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title{padding-inline-start:1.75rem}@media print{.hint-container.caution .hint-container-title,.hint-container.important .hint-container-title,.hint-container.info .hint-container-title,.hint-container.note .hint-container-title,.hint-container.tip .hint-container-title,.hint-container.warning .hint-container-title{padding-inline-start:0}}.hint-container.caution .hint-container-title::before,.hint-container.important .hint-container-title::before,.hint-container.info .hint-container-title::before,.hint-container.note .hint-container-title::before,.hint-container.tip .hint-container-title::before,.hint-container.warning .hint-container-title::before{content:" ";position:absolute;top:calc(50% - .6125em);inset-inline-start:0;width:1.25em;height:1.25em;background-position:left;background-repeat:no-repeat}@media print{.hint-container.caution .hint-container-title::before,.hint-container.important .hint-container-title::before,.hint-container.info .hint-container-title::before,.hint-container.note .hint-container-title::before,.hint-container.tip .hint-container-title::before,.hint-container.warning .hint-container-title::before{display:none}}.hint-container.caution p,.hint-container.important p,.hint-container.info p,.hint-container.note p,.hint-container.tip p,.hint-container.warning p{line-height:1.5}.hint-container.caution a,.hint-container.details a,.hint-container.important a,.hint-container.info a,.hint-container.note a,.hint-container.tip a,.hint-container.warning a{color:var(--vp-tc)}.hint-container.important{border-color:var(--important-border-color);background:var(--important-bg-color)}.hint-container.important>.hint-container-title{color:var(--important-title-color)}.hint-container.important>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 1024 1024%27%3E%3Cpath d=%27M512 981.333a84.992 84.992 0 0 1-84.907-84.906h169.814A84.992 84.992 0 0 1 512 981.333zm384-128H128v-42.666l85.333-85.334v-256A298.325 298.325 0 0 1 448 177.92V128a64 64 0 0 1 128 0v49.92a298.325 298.325 0 0 1 234.667 291.413v256L896 810.667v42.666zm-426.667-256v85.334h85.334v-85.334h-85.334zm0-256V512h85.334V341.333h-85.334z%27 fill=%27%23a371f7%27/%3E%3C/svg%3E")}.hint-container.important code{background:var(--important-code-bg-color)}.hint-container.info{border-color:var(--info-border-color);background:var(--info-bg-color)}.hint-container.info>.hint-container-title{color:var(--info-title-color)}.hint-container.info>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath d=%27M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z%27 fill=%27%234cb3d4%27/%3E%3C/svg%3E")}.hint-container.info code{background:var(--info-code-bg-color)}.hint-container.note{border-color:var(--note-border-color);background:var(--note-bg-color)}.hint-container.note>.hint-container-title{color:var(--note-title-color)}.hint-container.note>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath d=%27M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z%27 fill=%27%23ccc%27/%3E%3C/svg%3E")}.hint-container.note code{background:var(--note-code-bg-color)}.hint-container.tip{border-color:var(--tip-border-color);background:var(--tip-bg-color)}.hint-container.tip>.hint-container-title{color:var(--tip-title-color)}.hint-container.tip>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23009400%27 d=%27M7.941 18c-.297-1.273-1.637-2.314-2.187-3a8 8 0 1 1 12.49.002c-.55.685-1.888 1.726-2.185 2.998H7.94zM16 20v1a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-1h8zm-3-9.995V6l-4.5 6.005H11v4l4.5-6H13z%27/%3E%3C/svg%3E")}.hint-container.tip code{background:var(--tip-code-bg-color)}.hint-container.warning{border-color:var(--warning-border-color);background:var(--warning-bg-color)}.hint-container.warning>.hint-container-title{color:var(--warning-title-color)}.hint-container.warning>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 1024 1024%27%3E%3Cpath d=%27M576.286 752.57v-95.425q0-7.031-4.771-11.802t-11.3-4.772h-96.43q-6.528 0-11.3 4.772t-4.77 11.802v95.424q0 7.031 4.77 11.803t11.3 4.77h96.43q6.528 0 11.3-4.77t4.77-11.803zm-1.005-187.836 9.04-230.524q0-6.027-5.022-9.543-6.529-5.524-12.053-5.524H456.754q-5.524 0-12.053 5.524-5.022 3.516-5.022 10.547l8.538 229.52q0 5.023 5.022 8.287t12.053 3.265h92.913q7.032 0 11.803-3.265t5.273-8.287zM568.25 95.65l385.714 707.142q17.578 31.641-1.004 63.282-8.538 14.564-23.354 23.102t-31.892 8.538H126.286q-17.076 0-31.892-8.538T71.04 866.074q-18.582-31.641-1.004-63.282L455.75 95.65q8.538-15.57 23.605-24.61T512 62t32.645 9.04 23.605 24.61z%27 fill=%27%23e6a700%27/%3E%3C/svg%3E")}.hint-container.warning code{background:var(--warning-code-bg-color)}.hint-container.caution{border-color:var(--caution-border-color);background:var(--caution-bg-color)}.hint-container.caution>.hint-container-title{color:var(--caution-title-color)}.hint-container.caution>.hint-container-title::before{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath d=%27M12 2c5.523 0 10 4.477 10 10v3.764a2 2 0 0 1-1.106 1.789L18 19v1a3 3 0 0 1-2.824 2.995L14.95 23a2.5 2.5 0 0 0 .044-.33L15 22.5V22a2 2 0 0 0-1.85-1.995L13 20h-2a2 2 0 0 0-1.995 1.85L9 22v.5c0 .171.017.339.05.5H9a3 3 0 0 1-3-3v-1l-2.894-1.447A2 2 0 0 1 2 15.763V12C2 6.477 6.477 2 12 2zm-4 9a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm8 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4z%27 fill=%27%23e13238%27/%3E%3C/svg%3E")}.hint-container.caution code{background:var(--caution-code-bg-color)}.hint-container.details{position:relative;display:block;margin:1rem 0;padding:1.5rem;border-radius:.5rem;background:var(--detail-bg-color);color:var(--detail-text-color);transition:background var(--vp-tt),color var(--vp-tt)}@media (max-width:419px){.hint-container.details{margin-inline:-.75rem}}.hint-container.details h4{margin-top:0}.hint-container.details figure:last-child,.hint-container.details p:last-child{margin-bottom:0;padding-bottom:0}.hint-container.details code{background:var(--detail-code-bg-color)}.hint-container.details summary{position:relative;margin:-1.5rem;padding-block:1.5rem;padding-inline:4rem 1.5rem;list-style:none;cursor:pointer}.hint-container.details summary::-webkit-details-marker{display:none}.hint-container.details summary::marker{color:transparent;font-size:0}.hint-container.details summary::after,.hint-container.details summary::before{content:" ";position:absolute;top:calc(50% - .75rem);inset-inline-start:1.5rem;width:1.5rem;height:1.5rem}.hint-container.details summary::before{border-radius:50%;background:#ccc;transition:background var(--vp-ct),transform var(--vp-tt)}html[data-theme=dark] .hint-container.details summary::before{background:#555}.hint-container.details summary::after{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");line-height:normal;transition:transform var(--vp-tt);transform:rotate(90deg)}html[data-theme=dark] .hint-container.details summary::after{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.hint-container.details[open]>summary{margin-bottom:.5em}.hint-container.details[open]>summary::after{transform:rotate(180deg)} +.task-list-container{padding-inline-start:0;list-style-position:inside}.task-list-container .task-list-container{padding-inline-start:1.5em}.task-list-item{list-style:none}.task-list-item-checkbox{position:relative;cursor:pointer}.task-list-item-checkbox::after{content:" ";position:absolute;top:0;display:inline-block;box-sizing:border-box;width:1em;height:1em;padding-inline-start:0;border:1px solid #ddd;border-radius:2px;background:#fff;text-align:center;visibility:visible;transition:background var(--vp-ct),border-color var(--vp-ct)}@media print{.task-list-item-checkbox::after{border-color:var(--vp-c)}}html[data-theme=dark] .task-list-item-checkbox::after{border-color:#666;background:#333}.task-list-item-checkbox:checked::after{content:"";border-color:var(--vp-tc);background:var(--vp-tc)}@media print{.task-list-item-checkbox:checked::after{border-color:var(--vp-c);background:0 0}}html[data-theme=dark] .task-list-item-checkbox:checked::after{border-color:var(--vp-tc);background:var(--vp-tc)}.task-list-item-checkbox:checked::before{content:"";position:absolute;top:.1em;inset-inline-start:.4em;z-index:1;width:.2em;height:.5em;border:solid var(--white);border-width:0 .15em .15em 0;transform:rotate(45deg)}@media print{.task-list-item-checkbox:checked::before{border-color:var(--vp-c)}} +/*! PhotoSwipe main CSS by Dmytro Semenov | photoswipe.com */ +@keyframes pswp-clockwise{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}.pswp{--pswp-bg:#000;--pswp-placeholder-bg:#222;--pswp-root-z-index:100000;--pswp-preloader-color:rgba(79, 79, 79, 0.4);--pswp-preloader-color-secondary:rgba(255, 255, 255, 0.9);--pswp-icon-color:#fff;--pswp-icon-color-secondary:#4f4f4f;--pswp-icon-stroke-color:#4f4f4f;--pswp-icon-stroke-width:2px;--pswp-error-text-color:var(--pswp-icon-color);position:fixed;top:0;left:0;width:100%;height:100%;z-index:var(--pswp-root-z-index);display:none;touch-action:none;outline:0;opacity:.003;contain:layout style size;-webkit-tap-highlight-color:transparent}.pswp:focus{outline:0}.pswp *{box-sizing:border-box}.pswp img{max-width:none}.pswp--open{display:block}.pswp,.pswp__bg{transform:translateZ(0);will-change:opacity}.pswp__bg{opacity:.005;background:var(--pswp-bg)}.pswp,.pswp__scroll-wrap{overflow:hidden}.pswp__bg,.pswp__container,.pswp__content,.pswp__img,.pswp__item,.pswp__scroll-wrap,.pswp__zoom-wrap{position:absolute;top:0;left:0;width:100%;height:100%}.pswp__img,.pswp__zoom-wrap{width:auto;height:auto}.pswp--click-to-zoom.pswp--zoom-allowed .pswp__img{cursor:zoom-in}.pswp--click-to-zoom.pswp--zoomed-in .pswp__img{cursor:move;cursor:grab}.pswp--click-to-zoom.pswp--zoomed-in .pswp__img:active{cursor:grabbing}.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img,.pswp--no-mouse-drag.pswp--zoomed-in .pswp__img:active,.pswp__img{cursor:zoom-out}.pswp__button,.pswp__container,.pswp__counter,.pswp__img{-webkit-user-select:none;-moz-user-select:none;user-select:none}.pswp__item{z-index:1;overflow:hidden}.pswp__hidden{display:none!important}.pswp__content{pointer-events:none}.pswp__content>*{pointer-events:auto}.pswp__error-msg-container{display:grid}.pswp__error-msg{margin:auto;font-size:1em;line-height:1;color:var(--pswp-error-text-color)}.pswp .pswp__hide-on-close{opacity:.005;will-change:opacity;transition:opacity var(--pswp-transition-duration) cubic-bezier(.4,0,.22,1);z-index:10;pointer-events:none}.pswp--ui-visible .pswp__hide-on-close{opacity:1;pointer-events:auto}.pswp__button{position:relative;display:block;width:50px;height:60px;padding:0;margin:0;overflow:hidden;cursor:pointer;background:0 0;border:0;box-shadow:none;opacity:.85;-webkit-appearance:none;-webkit-touch-callout:none}.pswp__button:active,.pswp__button:focus,.pswp__button:hover{transition:none;padding:0;background:0 0;border:0;box-shadow:none;opacity:1}.pswp__button:disabled{opacity:.3;cursor:auto}.pswp__icn{fill:var(--pswp-icon-color);color:var(--pswp-icon-color-secondary);position:absolute;top:14px;left:9px;width:32px;height:32px;overflow:hidden;pointer-events:none}.pswp__icn-shadow{stroke:var(--pswp-icon-stroke-color);stroke-width:var(--pswp-icon-stroke-width);fill:none}.pswp__icn:focus{outline:0}.pswp__img--with-bg,div.pswp__img--placeholder{background:var(--pswp-placeholder-bg)}.pswp__top-bar{position:absolute;left:0;top:0;width:100%;height:60px;display:flex;flex-direction:row;justify-content:flex-end;z-index:10;pointer-events:none!important}.pswp__top-bar>*{pointer-events:auto;will-change:opacity}.pswp__button--close{margin-right:6px}.pswp__button--arrow{position:absolute;width:75px;height:100px;top:50%;margin-top:-50px}.pswp__button--arrow:disabled{display:none;cursor:default}.pswp__button--arrow .pswp__icn{top:50%;margin-top:-30px;width:60px;height:60px;background:0 0;border-radius:0}.pswp--one-slide .pswp__button--arrow{display:none}.pswp--touch .pswp__button--arrow{visibility:hidden}.pswp--has_mouse .pswp__button--arrow{visibility:visible}.pswp__button--arrow--prev{right:auto;left:0}.pswp__button--arrow--next{right:0}.pswp__button--arrow--next .pswp__icn{left:auto;right:14px;transform:scale(-1,1)}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__zoom-icn-bar-v,.pswp__button--zoom{display:none}.pswp__preloader{position:relative;overflow:hidden;width:50px;height:60px;margin-right:auto}.pswp__preloader .pswp__icn{opacity:0;transition:opacity .2s linear;animation:pswp-clockwise 600ms linear infinite}.pswp__preloader--active .pswp__icn{opacity:.85}.pswp__counter{height:30px;margin-top:15px;margin-inline-start:20px;font-size:14px;line-height:30px;color:var(--pswp-icon-color);text-shadow:1px 1px 3px var(--pswp-icon-color-secondary);opacity:.85}.pswp--one-slide .pswp__counter{display:none} +.photo-swipe-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.photo-swipe-bullets-indicator{position:absolute;bottom:30px;left:50%;display:flex;flex-direction:row;align-items:center;transform:translate(-50%,0)}.photo-swipe-bullet{width:12px;height:6px;margin:0 5px;border-radius:3px;background:var(--photo-swipe-bullet);transition:width .3s,color .3s}.photo-swipe-bullet.active{width:30px;background:var(--photo-swipe-bullet-active)} +:root{--photo-swipe-bullet:#fff;--photo-swipe-bullet-active:#3eaf7c} + +:root{--balloon-border-radius:2px;--balloon-color:rgba(16, 16, 16, 0.95);--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{position:relative;cursor:pointer}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;transition:all .18s ease-out .18s;position:absolute;z-index:10}[aria-label][data-balloon-pos]:after{text-indent:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-weight:400;font-style:normal;text-shadow:none;font-size:var(--balloon-font-size);background:var(--balloon-color);border-radius:2px;color:var(--balloon-text-color);border-radius:var(--balloon-border-radius);content:attr(aria-label);padding:.5em 1em;white-space:nowrap}[aria-label][data-balloon-pos]:before{width:0;height:0;border:5px solid transparent;border-top-color:var(--balloon-color);content:""}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%,0)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0,0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform-origin:top;transform:translate(0,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translate(0,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{width:0;height:0;border:5px solid transparent;border-bottom-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translate(0,-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{width:0;height:0;border:5px solid transparent;border-left-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{width:0;height:0;border:5px solid transparent;border-right-color:var(--balloon-color)}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%} +@keyframes message-move-in{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes message-move-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}#message-container{position:fixed;inset:calc(var(--navbar-height, 3.6rem) + 1rem)0 auto;z-index:75;text-align:center}#message-container .message{display:inline-block;padding:8px 10px;border-radius:3px;background:var(--vp-bg);color:var(--vp-c);box-shadow:0 0 10px 0 var(--box-shadow, #f0f1f2);font-size:14px}#message-container .message.move-in{animation:message-move-in .3s ease-in-out}#message-container .message.move-out{animation:message-move-out .3s ease-in-out;animation-fill-mode:forwards}#message-container .message svg{position:relative;bottom:-.125em;margin-inline-end:5px} +@keyframes bounce-down{0%{transform:translateY(-5px)}to{transform:translateY(5px)}}.vp-article-wrapper{position:relative;box-sizing:border-box;width:100%;margin:0 auto 1.25rem;text-align:start;overflow-wrap:break-word}@media (max-width:959px){.vp-article-wrapper{margin:0 auto 1rem}}.vp-article-wrapper:last-child{margin-bottom:0}.vp-article-item{display:block;padding:.75rem 1.25rem;border-radius:.4rem;background:var(--bg-color-float);color:inherit;box-shadow:0 1px 3px 1px var(--card-shadow);transition:background var(--color-transition),box-shadow var(--color-transition)}@media (max-width:959px){.vp-article-item{padding:.75rem 1rem}}@media (max-width:419px){.vp-article-item{border-radius:0}}.vp-article-item:hover{box-shadow:0 2px 6px 2px var(--card-shadow)}.vp-article-item .sticky-icon{position:absolute;top:0;inset-inline-end:0;width:1.5rem;height:1.5rem;color:var(--theme-color)}.vp-article-item .page-info>span{display:flex;flex-shrink:0;align-items:center;margin-inline-end:.5em;line-height:1.8}.vp-article-item .page-info>span::after{--balloon-font-size:8px;padding:.3em .6em!important}.vp-article-hr{margin-block:.375em .375em}.vp-article-title{position:relative;display:inline-block;color:var(--text-color);font-size:1.25rem;font-family:var(--font-family-heading);line-height:1.6;cursor:pointer}.vp-article-title::after{content:"";position:absolute;inset:auto 0 0;height:2px;background:var(--theme-color);visibility:hidden;transition:transform .3s ease-in-out;transform:scaleX(0)}.vp-article-title:hover{cursor:pointer}.vp-article-title:hover::after{visibility:visible;transform:scaleX(1)}.vp-article-title a{color:inherit;font-weight:600}.vp-article-title .lock-icon,.vp-article-title .slides-icon{position:relative;bottom:-.125em;display:inline-block;vertical-align:baseline;width:1em;height:1em;margin-inline-end:.25em;color:var(--theme-color)}.vp-article-title>span{word-break:break-word}.vp-article-cover{width:calc(100% + 2.5rem);margin:-.75rem -1.25rem .75rem;border-top-left-radius:.4rem;border-top-right-radius:.4rem}@media (max-width:959px){.vp-article-cover{width:calc(100% + 2rem);margin:-.75rem -1rem .75rem}}@media (max-width:419px){.vp-article-cover{border-radius:0}}.vp-article-excerpt{overflow:hidden;line-height:1.6;cursor:default}@media (max-width:959px){.vp-article-excerpt{font-size:15px}}@media (max-width:419px){.vp-article-excerpt{font-size:14px}}.vp-article-excerpt .code-demo-wrapper,.vp-article-excerpt .external-link-icon,.vp-article-excerpt .footnote-anchor,.vp-article-excerpt h1,.vp-article-excerpt section.footnotes,html[data-theme=dark] .vp-blog-mask.light{display:none}.vp-article-excerpt h2{font-size:1.4em}.vp-article-excerpt h3{font-size:1.2em}.vp-article-excerpt h1,.vp-article-excerpt h2,.vp-article-excerpt h3,.vp-article-excerpt h4,.vp-article-excerpt h5,.vp-article-excerpt h6{margin-top:.5em;margin-bottom:.5em}.vp-article-excerpt h1+p{margin-top:.5em}.vp-article-excerpt p:first-child{margin-top:.5em}.vp-article-excerpt p:last-child{margin-bottom:.5em}.vp-article-excerpt div[class*=language-]{overflow:auto hidden}.vp-article-excerpt div[class*=language-] pre{margin:.85rem 0;line-height:1.375}.vp-article-excerpt div[class*=language-] pre code{padding:0;background:0 0}.vp-article-excerpt div[class*=language-].line-numbers-mode .line-numbers{padding:.85rem 0}.vp-article-excerpt img{max-width:100%}.vp-article-excerpt figure{display:flex;flex-direction:column;width:auto;margin:1rem auto;text-align:center;transition:transform var(--transform-transition)}.vp-article-excerpt figure img{overflow:hidden;margin:0 auto;border-radius:8px}.vp-article-excerpt figure figcaption{display:inline-block;margin:6px auto;font-size:.8rem}.vp-article-excerpt figure figcaption:only-child{display:none}.vp-article-list{margin-top:calc(-.5rem - var(--navbar-height));padding-top:calc(var(--navbar-height) + .5rem);text-align:center}.vp-article-list:first-child{margin-top:calc(0rem - var(--navbar-height))}.vp-article-list .empty{max-width:560px;margin:0 auto;text-align:center}.vp-article-type-wrapper{position:relative;z-index:2;display:flex;align-items:center;justify-content:center;padding-inline-start:0;list-style:none;font-weight:600;font-size:18px}@media (max-width:419px){.vp-article-type-wrapper{font-size:16px}}.vp-article-type{vertical-align:middle;margin:.3em .8em;line-height:1.2;cursor:pointer}.vp-article-type::after{content:" ";position:absolute;inset:auto 50% -6px;height:2px;border-radius:1px;background:var(--theme-color);visibility:hidden;transition:inset .2s ease-in-out}.vp-article-type a{display:inline-block;color:inherit;transition:all .3s ease-in-out}.timeline-wrapper .timeline-year-title span,.vp-article-type,.vp-article-type.active,.vp-blog-hero{position:relative}.vp-article-type.active a{color:var(--theme-color);transform:scale(1.1,1.1)}.vp-article-type.active::after,.vp-article-type:hover::after{inset:auto calc(50% - 8px) -6px;visibility:visible}.vp-blog-hero{display:flex;flex-direction:column;justify-content:center;height:450px;margin-bottom:1rem;color:#eee;font-family:var(--font-family-heading)}@media (max-width:719px){.vp-blog-hero{height:350px}}@media (max-width:419px){.vp-blog-hero{margin:0 0 1rem}}.vp-blog-hero.no-bg{color:var(--text-color)}.vp-blog-hero>:not(.vp-blog-mask){position:relative;z-index:2}.vp-blog-hero .slide-down-button{border-width:0;background:0 0;cursor:pointer;position:absolute;bottom:0;left:calc(50vw - 30px);display:none;width:60px;height:60px;padding:10px}.vp-blog-hero .slide-down-button .icon{width:30px;margin:-15px 0;animation-name:bounce-down;animation-duration:1.5s;animation-timing-function:linear;animation-iteration-count:infinite;animation-direction:alternate}.vp-blog-hero .slide-down-button .icon:first-child{color:rgba(255,255,255,.15)}.vp-blog-hero .slide-down-button .icon:last-child{color:rgba(255,255,255,.5)}.vp-blog-hero.fullscreen{height:calc(100vh - var(--navbar-height))!important}.vp-blog-hero.fullscreen .vp-blog-mask{background-position-y:top!important}.vp-blog-hero.fullscreen .slide-down-button,.vp-blog-mask.light,html[data-theme=dark] .vp-blog-mask.dark{display:block}.vp-blog-mask,.vp-blog-mask::after{position:absolute;inset:0}.vp-blog-mask::after{content:" ";z-index:1;display:block;background:var(--light-grey);opacity:.2}.vp-blog-mask.dark,html[data-theme=dark] .vp-blog-hero-image.light{display:none}.vp-blog-hero-title{margin:.5rem auto;font-weight:700;font-size:2rem}@media (min-width:1440px){.vp-blog-hero-title{font-size:2.25rem}}@media (max-width:719px){.vp-blog-hero-title{font-size:1.75rem}}.vp-blog-hero-image{display:block;max-width:100%;max-height:15rem;margin:1.5rem auto}@media (max-width:719px){.vp-blog-hero-image{max-height:12rem}}.vp-blog-hero-image.light,html[data-theme=dark] .vp-blog-hero-image.dark{display:block}.vp-blog-hero-image.dark,.vp-sidebar .vp-blogger-info.mobile,.vp-sidebar .vp-blogger-info.mobile+hr{display:none}.vp-blog-hero-image+.vp-blog-hero-title{margin:0 auto}.vp-blog-hero-description{margin:1.2rem auto 0;font-size:1.5rem}@media (max-width:719px){.vp-blog-hero-description{font-size:1.25rem}}.vp-blogger-info{padding:.5rem;font-family:var(--font-family-heading);overflow-wrap:break-word}.vp-page .vp-blogger-info{background:var(--bg-color-float);transition:background var(--color-transition)}@media (max-width:719px){.vp-sidebar .vp-blogger-info.mobile{display:block}}@media (max-width:719px){.vp-sidebar .vp-blogger-info.mobile+hr{display:block;margin-top:1rem}}.vp-blogger{padding:.5rem;text-align:center}.vp-blogger-avatar{width:8rem;height:8rem;margin:0 auto}.vp-blogger-avatar.round{border-radius:50%}.vp-blogger-name{margin:1rem auto;font-size:22px}.vp-blogger-description{margin:1rem auto;font-size:14px}.vp-blog-counts{display:flex;width:80%;margin:0 auto 1rem}.vp-blog-count{display:block;width:25%;color:inherit;font-size:13px;text-align:center;cursor:pointer;transition:color var(--color-transition)}.vp-blog-count:hover,.vp-star-article:hover a{color:var(--theme-color)}.vp-blog-count .count{position:relative;margin-bottom:.5rem;font-weight:600;font-size:20px}.vp-category-list{position:relative;z-index:2;padding-inline-start:0;list-style:none;font-size:14px}.vp-category{display:inline-block;vertical-align:middle;overflow:hidden;margin:.3rem .6rem .8rem;padding:.4rem .8rem;border-radius:.25rem;color:var(--dark-grey);box-shadow:0 1px 4px 0 var(--card-shadow);word-break:break-word;cursor:pointer;transition:background var(--color-transition),color var(--color-transition)}@media (max-width:419px){.vp-category{font-size:.9rem}}.tag-list-wrapper a,.vp-category a,.vp-star-article a{color:inherit}.vp-category .count{display:inline-block;min-width:1rem;height:1.2rem;margin-inline-start:.2em;padding:0 .1rem;border-radius:.6rem;color:var(--white);font-size:.7rem;line-height:1.2rem;text-align:center}.vp-category0{background:#fde5e7;color:#ba111f}html[data-theme=dark] .vp-category0{background:#340509;color:#ec2f3e}.vp-category0:hover{background:#f9bec3}html[data-theme=dark] .vp-category0:hover{background:#53080e}.vp-category0.active{background:#cf1322;color:#fff}html[data-theme=dark] .vp-category0.active{background:#a60f1b;color:var(--bg-color)}.vp-category0.active .count{background:var(--bg-color);color:#cf1322}.vp-category0 .count{background:#cf1322}.vp-category1{background:#ffeee8;color:#f54205}html[data-theme=dark] .vp-category1{background:#441201;color:#fb7649}.vp-category1:hover{background:#fed4c6}html[data-theme=dark] .vp-category1:hover{background:#6d1d02}.vp-category1.active{background:#fa541c;color:#fff}html[data-theme=dark] .vp-category1.active{background:#da3a05;color:var(--bg-color)}.vp-category1.active .count{background:var(--bg-color);color:#fa541c}.vp-category1 .count{background:#fa541c}.vp-category2{background:#fef5e7;color:#e08e0b}html[data-theme=dark] .vp-category2{background:#3e2703;color:#f5b041}.vp-category2:hover{background:#fce6c4}html[data-theme=dark] .vp-category2:hover{background:#633f05}.vp-category2.active{background:#f39c12;color:#fff}html[data-theme=dark] .vp-category2.active{background:#c77e0a;color:var(--bg-color)}.vp-category2.active .count{background:var(--bg-color);color:#f39c12}.vp-category2 .count{background:#f39c12}.vp-category3{background:#eafaf1;color:#29b866}html[data-theme=dark] .vp-category3{background:#0c331c;color:#55d98d}.vp-category3:hover{background:#caf3db}html[data-theme=dark] .vp-category3:hover{background:#12522d}.vp-category3.active{background:#2ecc71;color:#fff}html[data-theme=dark] .vp-category3.active{background:#25a35a;color:var(--bg-color)}.vp-category3.active .count{background:var(--bg-color);color:#2ecc71}.vp-category3 .count{background:#2ecc71}.vp-category4{background:#e6f9ee;color:#219552}html[data-theme=dark] .vp-category4{background:#092917;color:#36d278}.vp-category4:hover{background:#c0f1d5}html[data-theme=dark] .vp-category4:hover{background:#0f4224}.vp-category4.active{background:#25a55b;color:#fff}html[data-theme=dark] .vp-category4.active{background:#1e8449;color:var(--bg-color)}.vp-category4.active .count{background:var(--bg-color);color:#25a55b}.vp-category4 .count{background:#25a55b}.vp-category5{background:#e1fcfc;color:#0e9595}html[data-theme=dark] .vp-category5{background:#042929;color:#16e1e1}.vp-category5:hover{background:#b4f8f8}html[data-theme=dark] .vp-category5:hover{background:#064242}.vp-category5.active{background:#10a5a5;color:#fff}html[data-theme=dark] .vp-category5.active{background:#0d8484;color:var(--bg-color)}.vp-category5.active .count{background:var(--bg-color);color:#10a5a5}.vp-category5 .count{background:#10a5a5}.vp-category6{background:#e4f0fe;color:#0862c3}html[data-theme=dark] .vp-category6{background:#021b36;color:#2589f6}.vp-category6:hover{background:#bbdafc}html[data-theme=dark] .vp-category6:hover{background:#042c57}.vp-category6.active{background:#096dd9;color:#fff}html[data-theme=dark] .vp-category6.active{background:#0757ae;color:var(--bg-color)}.vp-category6.active .count{background:var(--bg-color);color:#096dd9}.vp-category6 .count{background:#096dd9}.vp-category7{background:#f7f1fd;color:#9851e4}html[data-theme=dark] .vp-category7{background:#2a0b4b;color:#bb8ced}.vp-category7:hover{background:#eadbfa}html[data-theme=dark] .vp-category7:hover{background:#431277}.vp-category7.active{background:#aa6fe9;color:#fff}html[data-theme=dark] .vp-category7.active{background:#8733e0;color:var(--bg-color)}.vp-category7.active .count{background:var(--bg-color);color:#aa6fe9}.vp-category7 .count{background:#aa6fe9}.vp-category8{background:#fdeaf5;color:#e81689}html[data-theme=dark] .vp-category8{background:#400626;color:#ef59ab}.vp-category8:hover{background:#facbe5}html[data-theme=dark] .vp-category8:hover{background:#670a3d}.vp-category8.active{background:#eb2f96;color:#fff}html[data-theme=dark] .vp-category8.active{background:#ce147a;color:var(--bg-color)}.vp-category8.active .count{background:var(--bg-color);color:#eb2f96}.vp-category8 .count{background:#eb2f96}html[data-theme=dark] .empty-icon g.people{opacity:.8}html[data-theme=dark] .empty-icon g:not(.people){filter:invert(80%)}.vp-page.vp-blog .vp-blog-home{flex:1;width:0;max-width:780px}.vp-page.vp-blog .theme-hope-content:empty{padding:0}.vp-blog-infos{margin:8px auto;padding:8px 16px}.vp-page .vp-blog-infos{border-radius:6px;background:var(--bg-color-float);box-shadow:0 1px 3px 1px var(--card-shadow);transition:background var(--color-transition),box-shadow var(--color-transition)}.vp-page .vp-blog-infos:hover{box-shadow:0 2px 6px 2px var(--card-shadow)}.vp-blog-infos .timeline-list-wrapper .content{max-height:60vh}.vp-blog-type-switcher{display:flex;justify-content:center;margin-bottom:8px}.vp-blog-type-button{border-width:0;background:0 0;cursor:pointer;width:44px;height:44px;margin:0 8px;padding:4px;color:var(--grey3);transition:color var(--color-transition)}.vp-blog-type-button:focus{outline:0}.vp-blog-type-button .icon-wrapper{width:20px;height:20px;padding:8px;border-radius:50%;background:rgba(127,127,127,.15);transition:background var(--color-transition)}html[data-theme=dark] .vp-blog-type-button .icon-wrapper{background:rgba(255,255,255,.15)}.vp-blog-type-button .icon-wrapper:hover{cursor:pointer}.vp-blog-type-button .icon-wrapper.active{background:var(--theme-color-light)}html[data-theme=dark] .vp-blog-type-button .icon-wrapper.active{background:var(--theme-color-dark)}.vp-blog-type-button .icon{width:100%;height:100%}.vp-sidebar.hide-icon .vp-blog-type-button .icon{display:block!important}.vp-category-wrapper,.vp-star-article-wrapper,.vp-tag-wrapper{padding:8px 0}.vp-category-wrapper .title,.vp-star-article-wrapper .title,.vp-star-article:hover,.vp-tag-wrapper .title{cursor:pointer}.vp-category-wrapper .title .icon,.vp-star-article-wrapper .title .icon,.vp-tag-wrapper .title .icon{position:relative;bottom:-.125rem;width:16px;height:16px;margin:0 6px}.vp-category-wrapper .title .num,.vp-star-article-wrapper .title .num,.vp-tag-wrapper .title .num{position:relative;margin:0 2px;font-size:22px;font-family:var(--font-family-heading)}.vp-star-articles{overflow-y:auto;max-height:80vh;margin:8px auto;line-height:1.5}.vp-star-article{padding:12px 8px 4px;border-bottom:1px dashed var(--grey);transition:border-color var(--color-transition),color var(--color-transition)}.vp-category-wrapper .category-list-wrapper,.vp-tag-wrapper .tag-list-wrapper{overflow-y:auto;max-height:80vh;margin:8px auto}.vp-sidebar .vp-blog-info-wrapper .vp-blogger-info{display:none}.vp-page .vp-blog-info-wrapper{position:sticky;top:calc(var(--navbar-height) + .75rem);flex:0 0 300px;box-sizing:border-box;width:300px;height:auto;margin-top:.75rem;margin-bottom:.75rem;margin-inline-start:1rem;transition:all .3s}@media (max-width:719px){.vp-page .vp-blog-info-wrapper{display:none}}.vp-page .vp-blog-info-wrapper .vp-blogger-info{margin-bottom:16px;padding:8px 0;border-radius:8px;box-shadow:0 1px 3px 1px var(--card-shadow)}.vp-page .vp-blog-info-wrapper .vp-blogger-info:hover{box-shadow:0 2px 6px 2px var(--card-shadow)}.theme-container .vp-page.vp-blog{display:flex;flex-direction:column;justify-content:space-between;box-sizing:border-box;padding-top:var(--navbar-height);padding-bottom:2rem;background:var(--bg-color-back);transition:background var(--color-transition)}@media (min-width:1440px){.theme-container.has-toc .vp-page.vp-blog{padding-inline-end:0}}.blog-page-wrapper{display:flex;align-items:flex-start;justify-content:center;box-sizing:border-box;width:100%;margin:0 auto;padding:0 2rem}@media (max-width:959px){.blog-page-wrapper{padding:0 1rem}}@media (max-width:419px){.blog-page-wrapper{padding:0}}.vp-blog-main{flex:1;width:0;max-width:780px}.vp-pagination{margin:1.25rem 0 .75rem;font-weight:600;font-size:15px;line-height:2}.vp-pagination-list{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vp-pagination-number{display:flex;align-items:stretch;overflow:hidden;height:30px;margin:0 .5rem;border:1px solid var(--border-color);border-radius:.25rem}.vp-pagination-number div{position:relative;padding:0 .5rem;background:var(--bg-color);color:var(--theme-color);cursor:pointer}.vp-pagination-number div::before{content:" ";position:absolute;top:0;bottom:0;inset-inline-start:0;width:1px;background:var(--border-color)}.vp-pagination-number div:first-child::before{background:0 0}.vp-pagination-button:hover,.vp-pagination-number div:hover{color:var(--theme-color-light)}.vp-pagination-number div.active{background:var(--theme-color);color:var(--white)}.vp-pagination-number div.active+div::before,.vp-pagination-number div.active::before{background:var(--theme-color)}.vp-pagination-number div.next,.vp-pagination-number div.prev{font-size:13px;line-height:30px}.vp-pagination-number div.active,.vp-pagination-number div.ellipsis{cursor:default}.vp-pagination-nav{display:flex;align-items:center;justify-content:center;margin:.5rem}.vp-pagination-button,.vp-pagination-nav input{border:1px solid var(--border-color);border-radius:.25em;background:var(--bg-color);outline:0;line-height:2}.vp-pagination-nav input{width:3.5rem;margin:6px 5px;color:var(--text-color);text-align:center}.vp-pagination-button{overflow:hidden;padding:0 .75em;color:var(--theme-color);font-weight:600;font-size:15px;cursor:pointer}.vp-project-panel{position:relative;z-index:2;display:flex;flex-wrap:wrap;align-items:stretch;place-content:stretch flex-start;margin-bottom:12px}.vp-project-panel:empty{margin-bottom:0}.vp-project-card{position:relative;width:calc(33% - 40px);margin:6px 8px;padding:12px;border-radius:8px;background:var(--bg-color-float);transition:background var(--color-transition),transform var(--transform-transition)}@media (max-width:959px){.vp-project-card{width:calc(50% - 40px)}}@media (min-width:1440px){.vp-project-card{width:calc(25% - 40px)}}.vp-project-card:hover{cursor:pointer;transform:scale(.98,.98)}.vp-project-card .icon{position:relative;z-index:2;float:right;width:20px;height:20px}html[dir=rtl] .vp-project-card .icon,html[dir=rtl] .vp-project-image{float:left}.vp-project-card.project0{background:#fde5e7}.vp-project-card.project0:hover{background:#f9bec3}html[data-theme=dark] .vp-project-card.project0{background:#340509}html[data-theme=dark] .vp-project-card.project0:hover{background:#53080e}.vp-project-card.project1{background:#ffeee8}.vp-project-card.project1:hover{background:#fed4c6}html[data-theme=dark] .vp-project-card.project1{background:#441201}html[data-theme=dark] .vp-project-card.project1:hover{background:#6d1d02}.vp-project-card.project2{background:#fef5e7}.vp-project-card.project2:hover{background:#fce6c4}html[data-theme=dark] .vp-project-card.project2{background:#3e2703}html[data-theme=dark] .vp-project-card.project2:hover{background:#633f05}.vp-project-card.project3{background:#eafaf1}.vp-project-card.project3:hover{background:#caf3db}html[data-theme=dark] .vp-project-card.project3{background:#0c331c}html[data-theme=dark] .vp-project-card.project3:hover{background:#12522d}.vp-project-card.project4{background:#e6f9ee}.vp-project-card.project4:hover{background:#c0f1d5}html[data-theme=dark] .vp-project-card.project4{background:#092917}html[data-theme=dark] .vp-project-card.project4:hover{background:#0f4224}.vp-project-card.project5{background:#e1fcfc}.vp-project-card.project5:hover{background:#b4f8f8}html[data-theme=dark] .vp-project-card.project5{background:#042929}html[data-theme=dark] .vp-project-card.project5:hover{background:#064242}.vp-project-card.project6{background:#e4f0fe}.vp-project-card.project6:hover{background:#bbdafc}html[data-theme=dark] .vp-project-card.project6{background:#021b36}html[data-theme=dark] .vp-project-card.project6:hover{background:#042c57}.vp-project-card.project7{background:#f7f1fd}.vp-project-card.project7:hover{background:#eadbfa}html[data-theme=dark] .vp-project-card.project7{background:#2a0b4b}html[data-theme=dark] .vp-project-card.project7:hover{background:#431277}.vp-project-card.project8{background:#fdeaf5}.vp-project-card.project8:hover{background:#facbe5}html[data-theme=dark] .vp-project-card.project8{background:#400626}html[data-theme=dark] .vp-project-card.project8:hover{background:#670a3d}.vp-project-name{position:relative;z-index:2;color:var(--grey3);font-weight:500;font-size:16px;transition:color var(--color-transition)}.vp-project-desc{position:relative;z-index:2;margin:6px 0;color:var(--dark-grey);font-size:13px}.vp-project-image{position:relative;z-index:2;float:right;width:40px;height:40px}.vp-social-medias{display:flex;flex-wrap:wrap;justify-content:center;margin:8px auto}.vp-social-media{width:26px;height:26px;margin:4px;transition:transform .18s ease-out .18s;transform:scale(1,1)}.vp-social-media:hover{cursor:pointer;transform:scale(1.2,1.2)}.vp-social-media::after{--balloon-font-size:8px;padding:.3em .6em}.vp-social-media .icon{width:100%;height:100%}.tag-list-wrapper{position:relative;z-index:2;display:flex;flex-wrap:wrap;justify-content:flex-start;padding-inline-start:0;list-style:none}.tag-list-wrapper .tag{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;min-width:24px;margin:4px 6px;padding:3px 8px;border-radius:8px;color:var(--white);box-shadow:0 1px 6px 0 var(--box-shadow);font-size:12px;text-align:center;word-break:break-word;cursor:pointer;transition:background var(--color-transition),box-shadow var(--color-transition),transform var(--color-transition)}.tag-list-wrapper .tag:hover{cursor:pointer}.tag-list-wrapper .tag.active{transform:scale(1.1,1.1)}.tag-list-wrapper .tag-num{margin-inline-start:.5em}.tag-list-wrapper .tag0,html[data-theme=dark] .tag-list-wrapper .tag0.active,html[data-theme=dark] .tag-list-wrapper .tag0:hover{background:#e91526}.tag-list-wrapper .tag0.active,.tag-list-wrapper .tag0:hover,html[data-theme=dark] .tag-list-wrapper .tag0{background:#c51220}.tag-list-wrapper .tag1,html[data-theme=dark] .tag-list-wrapper .tag1.active,html[data-theme=dark] .tag-list-wrapper .tag1:hover{background:#fb6533}.tag-list-wrapper .tag1.active,.tag-list-wrapper .tag1:hover,html[data-theme=dark] .tag-list-wrapper .tag1{background:#fa4a0e}.tag-list-wrapper .tag2,html[data-theme=dark] .tag-list-wrapper .tag2.active,html[data-theme=dark] .tag-list-wrapper .tag2:hover{background:#f4a62a}.tag-list-wrapper .tag2.active,.tag-list-wrapper .tag2:hover,html[data-theme=dark] .tag-list-wrapper .tag2{background:#ec950c}.tag-list-wrapper .tag3,html[data-theme=dark] .tag-list-wrapper .tag3.active,html[data-theme=dark] .tag-list-wrapper .tag3:hover{background:#40d47f}.tag-list-wrapper .tag3.active,.tag-list-wrapper .tag3:hover,html[data-theme=dark] .tag-list-wrapper .tag3{background:#2cc26b}.tag-list-wrapper .tag4,html[data-theme=dark] .tag-list-wrapper .tag4.active,html[data-theme=dark] .tag-list-wrapper .tag4:hover{background:#2bbe69}.tag-list-wrapper .tag4.active,.tag-list-wrapper .tag4:hover,html[data-theme=dark] .tag-list-wrapper .tag4{background:#239d56}.tag-list-wrapper .tag5,html[data-theme=dark] .tag-list-wrapper .tag5.active,html[data-theme=dark] .tag-list-wrapper .tag5:hover{background:#13c3c3}.tag-list-wrapper .tag5.active,.tag-list-wrapper .tag5:hover,html[data-theme=dark] .tag-list-wrapper .tag5{background:#0f9d9d}.tag-list-wrapper .tag6,html[data-theme=dark] .tag-list-wrapper .tag6.active,html[data-theme=dark] .tag-list-wrapper .tag6:hover{background:#0a7bf4}.tag-list-wrapper .tag6.active,.tag-list-wrapper .tag6:hover,html[data-theme=dark] .tag-list-wrapper .tag6{background:#0968ce}.tag-list-wrapper .tag7,html[data-theme=dark] .tag-list-wrapper .tag7.active,html[data-theme=dark] .tag-list-wrapper .tag7:hover{background:#b37deb}.tag-list-wrapper .tag7.active,.tag-list-wrapper .tag7:hover,html[data-theme=dark] .tag-list-wrapper .tag7{background:#a160e7}.tag-list-wrapper .tag8,html[data-theme=dark] .tag-list-wrapper .tag8.active,html[data-theme=dark] .tag-list-wrapper .tag8:hover{background:#ed44a1}.tag-list-wrapper .tag8.active,.tag-list-wrapper .tag8:hover,html[data-theme=dark] .tag-list-wrapper .tag8{background:#ea2290}.timeline-wrapper{--dot-color:#fff;--dot-bar-color:#eaecef;--dot-border-color:#ddd;max-width:740px;margin:0 auto;padding:40px 0}@media (max-width:719px){.timeline-wrapper{margin:0 1.2rem}}html[data-theme=dark] .timeline-wrapper{--dot-color:#444;--dot-bar-color:#333;--dot-border-color:#555}.timeline-wrapper #toc{inset-inline:unset 0;min-width:0}.timeline-wrapper .toc-wrapper{position:relative;z-index:10}.timeline-wrapper .timeline-content{position:relative;box-sizing:border-box;padding-inline-start:76px;list-style:none}.timeline-wrapper .timeline-content::after{content:" ";position:absolute;top:14px;inset-inline-start:64px;z-index:-1;width:4px;height:calc(100% - 38px);margin-inline-end:-2px;background:var(--dot-bar-color);transition:background var(--color-transition)}.timeline-wrapper .motto{position:relative;color:var(--text-color);font-size:18px;transition:color var(--color-transition)}@media (min-width:1280px){.timeline-wrapper .motto{font-size:20px}}.timeline-wrapper .motto::before,.timeline-wrapper .timeline-date::before,.timeline-wrapper .timeline-year-title span::before{content:" ";position:absolute;top:50%;z-index:2;margin-top:-6px;margin-inline-start:-6px;border:2px solid var(--dot-border-color);border-radius:50%;background:var(--dot-color);transition:background var(--color-transition),border-color var(--color-transition)}.timeline-wrapper .motto::before,.timeline-wrapper .timeline-year-title span::before{inset-inline-start:-10px;width:8px;height:8px}.timeline-wrapper .timeline-year-title{margin-top:calc(3rem - var(--navbar-height));margin-bottom:.5rem;padding-top:var(--navbar-height);color:var(--text-color);font-weight:700;font-size:26px;font-family:var(--font-family-heading);transition:color var(--color-transition)}.timeline-wrapper .timeline-year-wrapper{padding-inline-start:0!important}.timeline-wrapper .timeline-date{position:absolute;inset-inline-end:calc(100% + 24px);width:50px;font-size:14px;line-height:30px;text-align:end}.timeline-wrapper .timeline-date::before{inset-inline-end:-19px;width:6px;height:6px}.timeline-wrapper .timeline-title{position:relative;display:block;color:inherit;font-size:16px;line-height:30px;transition:color var(--color-transition),font-size var(--transform-transition)}.timeline-wrapper .timeline-item{position:relative;z-index:3;display:flex;padding:30px 0 10px;border-bottom:1px dashed var(--border-color);list-style:none;transition:border-color var(--color-transition)}.timeline-list-wrapper .timeline-list-title,.timeline-wrapper .timeline-item:hover{cursor:pointer}.timeline-wrapper .timeline-item:hover .timeline-date{font-size:16px;transition:border-color var(--color-transition),color var(--color-transition),font-size var(--transform-transition)}.timeline-wrapper .timeline-item:hover .timeline-date::before{border-color:var(--theme-color);background:var(--bg-color-secondary)}.timeline-wrapper .timeline-item:hover .timeline-title{color:var(--theme-color);font-size:18px}.timeline-list-wrapper{--dot-color:#fff;--dot-bar-color:#eaecef;--dot-border-color:#ddd;padding:8px 0}html[data-theme=dark] .timeline-list-wrapper{--dot-color:#444;--dot-bar-color:#333;--dot-border-color:#555}.timeline-list-wrapper .timeline-list-title .icon{position:relative;bottom:-.125rem;width:16px;height:16px;margin:0 6px}.timeline-list-wrapper .timeline-list-title .num{position:relative;margin:0 2px;font-size:22px}.timeline-list-wrapper .timeline-content{overflow-y:auto;max-height:80vh}.timeline-list-wrapper .timeline-content::-webkit-scrollbar-track-piece{background:0 0}.timeline-list-wrapper .timeline-list{position:relative;box-sizing:border-box;margin:0 8px;list-style:none}.timeline-list-wrapper .timeline-list::after{content:" ";position:absolute;top:14px;inset-inline-start:0;z-index:-1;width:4px;height:calc(100% - 14px);margin-inline-start:-2px;background:var(--dot-bar-color);transition:background var(--color-transition)}.timeline-list-wrapper .timeline-year{position:relative;margin:20px 0 0;color:var(--text-color);font-weight:700;font-size:20px}.timeline-list-wrapper .timeline-date::before,.timeline-list-wrapper .timeline-year::before{content:" ";position:absolute;z-index:2;border:1px solid var(--dot-border-color);border-radius:50%;background:var(--dot-color);transition:background var(--color-transition),border-color var(--color-transition);margin-inline-start:-4px}.timeline-list-wrapper .timeline-year::before{top:50%;inset-inline-start:-20px;width:8px;height:8px;margin-top:-4px}.timeline-list-wrapper .timeline-year-wrapper{padding-inline-start:0!important}.timeline-list-wrapper .timeline-date{display:inline-block;vertical-align:bottom;width:36px;font-size:12px;line-height:32px;transition:color var(--color-transition)}.timeline-list-wrapper .timeline-date::before{top:24px;inset-inline-start:-19px;width:6px;height:6px}.timeline-list-wrapper .timeline-title{color:inherit;font-size:14px;line-height:32px;cursor:pointer;transition:color var(--color-transition)}.timeline-list-wrapper .timeline-item{position:relative;display:flex;padding:12px 0 4px;border-bottom:1px dashed var(--border-color);list-style:none;transition:border-color var(--color-transition)}.timeline-list-wrapper .timeline-item:hover .timeline-date,.timeline-list-wrapper .timeline-item:hover .timeline-title{color:var(--theme-color)}.timeline-list-wrapper .timeline-item:hover .timeline-date::before{border-color:var(--dot-color);background:var(--theme-color)} +:root{--navbar-bg-color:var(--bg-color-float-blur);--sidebar-bg-color:var(--bg-color-blur)}html[data-theme=dark]{--navbar-bg-color:var(--bg-color-blur);--sidebar-bg-color:var(--bg-color-blur);color-scheme:dark}#app{--code-hl-bg-color:var(--code-highlight-line-color);--code-ln-color:var(--code-line-color);--code-ln-wrapper-width:var(--line-numbers-width);--code-tabs-nav-text-color:var(--code-color);--code-tabs-nav-bg-color:var(--code-border-color);--code-tabs-nav-hover-color:var(--code-highlight-line-color);--sidebar-space:var(--sidebar-width)}@media (max-width:959px){#app{--navbar-height:var(--navbar-mobile-height);--navbar-vertical-padding:var(--navbar-mobile-vertical-padding);--navbar-horizontal-padding:var(--navbar-mobile-horizontal-padding);--sidebar-width:var(--sidebar-mobile-width)}}@media (min-width:1440px){#app{--sidebar-space:clamp( var(--sidebar-width), calc(max(0px, calc((100vw - var(--content-width)) / 2 - 2rem))), 100vw )}}.vp-copy-code-button{--copy-code-color:var(--code-ln-color);--copy-code-hover:var(--code-hl-bg-color)}.DocSearch,.DocSearch-Button{--docsearch-primary-color:var(--vp-tc);--docsearch-text-color:var(--vp-c);--docsearch-highlight-color:var(--vp-tc);--docsearch-muted-color:var(--light-grey);--docsearch-container-background:rgb(9 10 17 / 80%);--docsearch-modal-background:var(--bg-color-float);--docsearch-searchbox-background:var(--bg-color-secondary);--docsearch-searchbox-focus-background:var(--vp-bg);--docsearch-searchbox-shadow:inset 0 0 0 2px var(--vp-tc);--docsearch-hit-color:var(--vp-cl);--docsearch-hit-active-color:var(--vp-bg);--docsearch-hit-background:var(--vp-bg);--docsearch-hit-shadow:0 1px 3px 0 var(--border-color);--docsearch-footer-background:var(--vp-bg)}html[data-theme=dark] .DocSearch,html[data-theme=dark] .DocSearch-Button{--docsearch-logo-color:var(--vp-c);--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow:inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgb(3 4 9 / 30%);--docsearch-key-gradient:linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow:inset 0 1px 0 0 rgb(73 76 106 / 50%), 0 -4px 8px 0 rgb(0 0 0 / 20%)}.vp-back-to-top-button{--back-to-top-color:var(--vp-tc);--back-to-top-color-hover:var(--vp-tcl);--back-to-top-bg-color:var(--vp-bg)}.vp-catalog-wrapper{--catalog-bg-color:var(--vp-bg);--catalog-bg-secondary-color:var(--vp-bgl);--catalog-border-color:var(--vp-brc);--catalog-active-color:var(--vp-tc);--catalog-hover-color:var(--vp-tcl)}.external-link-icon{--external-link-icon-color:var(--light-grey)}#nprogress{--nprogress-color:var(--vp-tc)}body{--photo-swipe-bullet:var(--white);--photo-swipe-bullet-active:var(--vp-tc);--pwa-text-color:var(--vp-c);--pwa-bg-color:var(--vp-bg);--pwa-border-color:var(--vp-brc);--pwa-btn-text-color:var(--vp-bg);--pwa-btn-bg-color:var(--vp-tc);--pwa-btn-hover-bg-color:var(--vp-tcl);--pwa-shadow-color:var(--card-shadow);--pwa-content-color:var(--grey3);--pwa-content-light-color:var(--dark-grey)}.language-modal-mask{--redirect-bg-color:var(--vp-bg);--redirect-bg-color-light:var(--vp-bgl);--redirect-bg-color-lighter:var(--vp-bglt);--redirect-text-color:var(--vp-c);--redirect-primary-bg-color:var(--vp-tc);--redirect-primary-hover-bg-color:var(--vp-tcl);--redirect-primary-text-color:var(--white)}.search-box{--search-bg-color:var(--vp-bg);--search-accent-color:var(--vp-tc);--search-text-color:var(--vp-c);--search-border-color:var(--border-color);--search-item-text-color:var(--vp-clt);--search-item-focus-bg-color:var(--bg-color-secondary)}body,html{margin:0;padding:0;background:#fff}html{font-size:16px;font-display:optional;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent}@media print{html{font-size:12pt}}body{min-height:100vh;color:#2c3e50}a,p a code{color:#3eaf7c}a{font-weight:500;text-decoration:none}kbd{display:inline-block;min-width:1em;margin-inline:.125rem;padding:.25em;border:1px solid #eee;border-radius:.25em;box-shadow:1px 1px 4px 0 rgba(0,0,0,.15);line-height:1;letter-spacing:-.1em;text-align:center;border-color:var(--border-color-dark);background:var(--bg-color-secondary)}a,code,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}code,kbd{font-family:var(--font-family-mono)}code{margin:0;padding:.2rem .4rem;border-radius:5px;background:rgba(127,127,127,.12);font-size:.85em;transition:background var(--color-transition),color var(--color-transition)}table code{padding:.1rem .4rem}p a code{font-weight:400}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.25}a.header-anchor:focus-visible,h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:0}h1{font-size:2rem}h2{padding-bottom:.3rem;border-bottom:1px solid #eaecef;font-size:1.65rem}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{position:relative;color:inherit}a.header-anchor:hover::before{content:"¶";position:absolute;bottom:0;left:-.75em;color:var(--c-brand);font-size:.75em}a.header-anchor:focus-visible::before{content:"¶";position:absolute;left:-.75em;color:var(--c-brand);outline:auto}blockquote,ol,p,ul{overflow-wrap:break-word}ol,p,ul{line-height:1.6}@media print{ol,p,ul{line-height:1.5}}ol,ul{padding-inline-start:1.2em}blockquote{margin:1rem 0;padding:.25rem 0 .25rem 1rem;border-inline-start:.2rem solid #ddd;font-size:1rem}blockquote>p{margin:0}hr{border:0;border-top:1px solid #eaecef;border-color:var(--border-color);transition:border-top-color var(--color-transition)}table{display:block;overflow-x:auto;margin:1rem 0;border-collapse:collapse}tr:nth-child(odd){background:#f6f8fa;background:var(--bg-color-secondary)}td,th{padding:.6em 1em;border:1px solid #dfe2e5;border-color:var(--border-color-dark)}pre{direction:ltr}@page{margin:2cm;font-size:12pt;size:a4}@media print{*,::after,::before{box-shadow:none!important;text-shadow:none!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}a{color:inherit;font-weight:inherit!important;font-size:inherit!important;text-decoration:underline}a[href^="http://"]::after,a[href^="https://"]::after{content:" ("attr(href)") "}abbr[title]::after{content:" ("attr(title)")"}pre{border:1px solid #eee}pre,pre>code{white-space:pre-wrap!important}blockquote{border-inline-start:.2rem solid #ddd;color:inherit}blockquote,pre{orphans:5;widows:5}canvas,img,tr{page-break-inside:avoid}}@font-face{font-weight:400;font-style:normal;font-family:Crimson;src:url(data:font/truetype;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTYr5mwEAAAyMAAAAHEdERUYAKQATAAAMbAAAAB5PUy8yVsJ0MgAAAVgAAABgY21hcBiKDzgAAAHcAAABWGdhc3D//wADAAAMZAAAAAhnbHlmr+DBdQAAA1AAAAdsaGVhZBZwt+8AAADcAAAANmhoZWEFawEuAAABFAAAACRobXR4BksA9gAAAbgAAAAibG9jYQlsC24AAAM0AAAAHG1heHAAEQBZAAABOAAAACBuYW1lLaFDVAAACrwAAAFrcG9zdAC1AHoAAAwoAAAAPAABAAAAAQAAqBd2H18PPPUACwQAAAAAANqqufwAAAAA2qq5/AAb/9wB4QMeAAAACAACAAAAAAAAAAEAAAMs/ywAXAH9AAAAAAHhAAEAAAAAAAAAAAAAAAAAAAAEAAEAAAANAFkAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAH1AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAIABgMAAAAAAAAAAAABEAAAAAAAAAAAAAAAUGZFZADAADAAOQMs/ywAXAMsANQAAAABAAAAAAMYAAAAAAAgAAEBpwAfAAAAAAFVAAAB/QAfAH0ALQA+ABsAPgAyACgAPgAxAAAAAAADAAAAAwAAABwAAQAAAAAAUgADAAEAAAAcAAQANgAAAAQABAABAAAAOf//AAAAL///AAAAAQAEAAAAAAADAAQABQAGAAcACAAJAAoACwAMAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwQFBgcICQoLDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAJgAmAGIAwAEeAZIBzgJAApYC2gNiA7YAAQAf/9wBhwMeABIAAAEGBwYHATAXFjM2NzY3ASYnJjcBgxwLCgH+zgMECxIKCgIBLgEDAwMDHhQFBgP85wMEAQgJBgMOAwMDEwAAAAIAH//9Ad0CkAAQACEAABMWFxYXNjc2NzQnJicGBwYHNyY3NjcWFxYXFAcGByYnJjcfATo6amo7OQE5OmxrOjkBXQIlJEE5IyIBIyJEOSQjAgFOkV5eBAReXoqJXl4EBF5eggJ0UlEDA09Qe3xVVgMDU1OEAAAAAAEAff/9AYACkQA+AAA3FAcGBwYHBiMGFQYXNjc2MzIXFhc2JzQnIicmJyY1JjURNjc2MSYnJicjBgcGBwYVFBUUFxYXNjc2NzIXFhXkAQEEBRgYDAMBBB4ZGhweGxofBAEDDBgZBQQBAQMEAQIDBAIFNTZCAgMDBA0XFw0LBQV3GBMVDAgEBAUKCgUCAQICAQIFCgoFBAQIDBUTGAGnLxkbBAYFAQIZGh4BAgECBQUEAwUHBwEICRYAAAAAAQAtAAAB0QKRADoAADcGFxYXITY3NjcmJyYjIgcGBwYHBisBNjc2NzY3NjUmJyYnBgcGBxQXFhc2NzY3FhcWFxYHBgcGBwYHLgEEAwMBYwURERADBwYFBAMDAg8VEx/LJkBAOhsQDwIxMkxSMjIHCAYGCSYmPTIfHwEBCgoeLkJBQg8EBQQCETAwKQICAgEBBCgUEylJSUYhJicsRDIzAgY1NRoEBQYBEyEhAwEjIjYlJCQtQlBQSAAAAAABAD7/+wG+ApEASgAANwYXFhcWFxYzNjc2NyYnJic2NzY3JicmIwYHBgcUFxYXNjc2NxYXFhcGBwYHBgcUFRQXNjc2NxYXFhcGBwYnIicmJyYnJiciBwYXPwEIBwUaHB0VZU5NBAMvLi8eIB4DAywsKzwrKxgEAwUIHR4wLRscAQMvLz8BAQYKEhEQNSYmAgImJSsWExQPCw0NFREMDQE7DgsLBQwFBgE8PWpMKSoGECQkMkAiIQIdHyUHBwcBCRscAwEbGSpCIyUOAgMCAwwIAwUEAQEoKD9XJSQBBQYODg8PAQ0NFQAAAgAb//oB4QKTACIAJQAANxQXFhchFRQXFjMyNzYjNTM2NzY1NCcmJyMRNCcmIwYHBgcBExEbAgMFASEJCRIdCAkBRgIBAQUEBTwFAwgHCQkG/vjmxgUGBgOwBQIBAwKzAgQDCBAMDQEBlAYGBgEICQf+cwEs/tQAAQA+//sBvgKTAEoAADcGFxYXFhcWMzY3NjcmJyYnIgcGBzY3NjczMjc2NzY3NjU0JyYnBgcGByMGBwYHFBcWMzY3NjMWFxYHBgcGJyInJicmJyYnIgcGFz8BCAcFGhwdFWVOTQQBMjJbFx8gFwoJCQlWKB0dFQ4JCAQDBQMdHSKXCREQEgMCBA4bGhNYJyUBAiYlKxYTFA8LDQ0VEQwNATsOCwsFDAUGATw9akU2NwMFBggrMC8uAgICExcZBgQCAgMBAwQBMVNUWAUFBAYFBAMxMTNZIyQBBQYODg8PAQ0NFQAAAgAy//oBzQKXACAAMwAANxQXFhc2NzY3NicmJyIHBgc2NzY3NCcmJwYHBgcGBwYXNyY3Njc2FxYXFgcGBwYHJicmNzM1NV5aOTsCAioqahoiIRsnWFhFAwIHQ0tMOTAZGQFbBAQaGxkXRB8fAQEfIDE9Hh4E511FRwQDPT1ZPEJBBQwLF4Y9PRMGCwwBEiwsPDZFRkkTHyAbCAcBAjAwREYsLQEFREVQAAAAAAEAKP/7AdUCiwApAAATFhcWMzI3Njc2NzYzIQYHBgcWFxYzMjcBNjc2NzQnJiMiBwYjIQYHBgcoAwYHAwYDAwELEBEdAQUJYWJXAQ8PDgcDAQ4LCQgBAQEEBhUVFv7JBgsNDAH6DQMCAQEFKRITFMjHjQcFBgMCPxYSEwoEAgMBAhkrKiAAAAADAD7/9wG/ApIAKABBAFgAADcGFxYXNjc2NyYnJicmJzQ3Njc2NyYnJiMGBwYHFhcWFxYVFAcGBwYHNyY3Njc2MzIzMhcyFxYXFhcGBwYHIicmNxMmNzY3FhcWFRQHBgcGByIjIicmJyY3PwE1M1ZQODgDAykpMQIBAyYlJQMCMC9HRjExAgIiIiMCAiMvLwNTBBQTKgEBAQECAQIBEjU1CAEdHjMrISICGAMYGSYvGxoTEx8CAQIBBAMfJCQBoU8tLQECMjFPOC4uGwIBAgEWJiU7SCYoAjEwQzopKhMBAgECEykpQAQsIiEbAQEBBywsQjUeHQEiI0QBZSMhIAECJiYvKh8gFAEBAhAfIEYAAAIAMf/6AcsClwAgADMAABMGFxYXMjc2NwYHBgcUFxYXNjc2NzY3NjUmJyYnBgcGBzcmNzY3FhcWFRQHBgcGJyYnJjc0AyopahoiIRsoV1hFAwIHQ0tMODEZGQE2NF5ZOjoBWgMfHzE9Hh4EGhoaF0QeHwUBy0dBQgUMCxeFPj0SBwsLAREsLD01RkVPV0dFBQQ8PU8UPCwtAQVFRUklIRsHCAECMDBPAAAADACWAAEAAAAAAAEABwAQAAEAAAAAAAIABwAoAAEAAAAAAAMABwBAAAEAAAAAAAQABwBYAAEAAAAAAAUAHgCeAAEAAAAAAAYABwDNAAMAAQQJAAEADgAAAAMAAQQJAAIADgAYAAMAAQQJAAMADgAwAAMAAQQJAAQADgBIAAMAAQQJAAUAPABgAAMAAQQJAAYADgC9AEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAFYAZQByAHMAaQBvAG4AIAAxAC4AMAA7ACAARgBvAG4AdABFAGQAaQB0AG8AcgAgACgAdgAxAC4AMAApAABWZXJzaW9uIDEuMDsgRm9udEVkaXRvciAodjEuMCkAAEMAcgBpAG0AcwBvAG4AAENyaW1zb24AAAACAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAABAAIAEwAUABUAFgAXABgAGQAaABsAHAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAwAAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA2qq5/AAAAADaqrn8)format("truetype")}body,html{background:var(--bg-color);transition:background var(--color-transition)}:root{color-scheme:light}body{color:var(--text-color);font-family:var(--font-family)}@media (min-width:1440px){body{font-size:17px}}#toc .toc-item:hover>.toc-link,.page-info a:active,.page-info a:hover,.vp-breadcrumb a:hover,a,p a code{color:var(--theme-color)}html[data-theme=dark] code{background:#333}blockquote{border-color:#eee;color:#666;transition:border-color var(--color-transition),color var(--color-transition)}html[data-theme=dark] blockquote{border-color:#333}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-heading)}@media (max-width:419px){h1{font-size:1.9rem}}h2{border-color:var(--border-color);transition:border-bottom-color var(--color-transition)}@media print{@page{--text-color:#000!important;--bg-color:#fff!important}div[class*=language-]{position:relative!important}}.theme-hope-content:not(.custom)>:first-child{margin-top:0}.vp-breadcrumb{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;position:relative;z-index:2;padding-top:1rem;font-size:15px}@media (max-width:959px){.vp-breadcrumb{padding-inline:1.5rem}}@media print{.vp-breadcrumb{max-width:unset}}@media (max-width:959px){.vp-breadcrumb{font-size:14px}}@media (max-width:419px){.vp-breadcrumb{padding-top:.5rem;font-size:12.8px}}@media print{.vp-breadcrumb{display:none}}.vp-breadcrumb .icon{margin-inline-end:.25em;font-size:1em}#nav-screen img.icon,.vp-breadcrumb img.icon,.vp-highlight-title img.icon,.vp-navbar .nav-link img.icon,.vp-page-nav .next img.icon,.vp-page-nav .prev img.icon,.vp-page-title h1 img.icon,.vp-sidebar img.icon{vertical-align:-.125em;height:1em}.vp-breadcrumb a{display:inline-block;padding:0 .5em}.vp-breadcrumb a::before{position:relative;bottom:.125rem;margin-inline-end:.25em}.vp-breadcrumb ol{margin:0;padding-inline-start:0;list-style:none}.vp-breadcrumb li{display:inline-block;line-height:1.5}.vp-breadcrumb li:first-child a{padding-inline-start:0}.vp-breadcrumb li:last-child a{padding-inline-end:0}.vp-breadcrumb li.is-active a{color:var(--light-grey);cursor:default;pointer-events:none}.vp-breadcrumb li+li::before{content:"/";color:var(--light-grey)}.toggle-sidebar-wrapper{position:fixed;top:var(--navbar-height);bottom:0;inset-inline-start:var(--sidebar-space);z-index:100;display:flex;align-items:center;justify-content:center;font-size:2rem;transition:inset-inline-start var(--transform-transition)}@media (max-width:719px){.toggle-sidebar-wrapper{display:none}}@media (min-width:1440px){.toggle-sidebar-wrapper{display:none}}.toggle-sidebar-wrapper:hover{background:rgba(127,127,127,.05);cursor:pointer}.toggle-sidebar-wrapper .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}html[data-theme=dark] .toggle-sidebar-wrapper .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.toggle-sidebar-wrapper .arrow.down{transform:rotate(180deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.down,html[dir=rtl] .vp-page-nav .nav-link .arrow.down{transform:rotate(-180deg)}.toggle-sidebar-wrapper .arrow.end{transform:rotate(90deg)}.toggle-sidebar-wrapper .arrow.start,html[dir=rtl] .toggle-sidebar-wrapper .arrow.end,html[dir=rtl] .vp-page-nav .nav-link .arrow.end{transform:rotate(-90deg)}html[dir=rtl] .toggle-sidebar-wrapper .arrow.start{transform:rotate(90deg)}.theme-container{display:flex;flex-direction:column;justify-content:space-between;min-height:100vh}.theme-container .vp-page{padding-top:var(--navbar-height);padding-inline-start:calc(var(--sidebar-space) + 2rem)}@media (max-width:719px){.theme-container .vp-page{padding-inline:0}}@media (min-width:1440px){.theme-container .vp-page{padding-inline-end:calc(100vw - var(--content-width) - var(--sidebar-space) - 6rem)}}.theme-container .vp-sidebar{top:var(--navbar-height)}.theme-container.no-navbar .vp-page{padding-top:0}.theme-container.no-navbar .vp-sidebar{top:0}@media (max-width:719px){.theme-container.hide-navbar .vp-sidebar,.theme-container.no-navbar .vp-sidebar{top:0}}.theme-container.sidebar-collapsed .vp-page{padding-inline-start:0}.theme-container.sidebar-collapsed .vp-sidebar{box-shadow:none;transform:translateX(-100%)}html[dir=rtl] .theme-container.sidebar-collapsed .vp-sidebar{transform:translateX(100%)}.theme-container.sidebar-collapsed .toggle-sidebar-wrapper{inset-inline-start:0}.theme-container.no-sidebar .vp-page{padding-inline:0}@media (min-width:1440px){.theme-container.no-sidebar.has-toc .vp-page{padding-inline-end:16rem}}.theme-container.no-sidebar .toggle-sidebar-wrapper,.theme-container.no-sidebar .vp-sidebar,.theme-container.no-sidebar .vp-toggle-sidebar-button{display:none}.theme-container.sidebar-open .vp-sidebar{box-shadow:2px 0 8px var(--card-shadow);transform:translateX(0)}.fade-slide-y-enter-active{transition:all .3s ease!important}.fade-slide-y-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)!important}.fade-slide-y-enter-from,.fade-slide-y-leave-to{opacity:0;transform:translateY(10px)}.vp-feature-wrapper{position:relative}.vp-feature-bg{position:absolute;inset:0;z-index:0;background-attachment:fixed;background-position:50%;background-size:cover}.vp-feature-bg.light{display:inline-block}.vp-feature-bg.dark,html[data-theme=dark] .vp-feature-bg.light{display:none}html[data-theme=dark] .vp-feature-bg.dark{display:inline-block}.vp-feature{position:relative;z-index:1;margin:0 auto;padding:1.5rem 1rem;color:var(--text-color-lighter);text-align:center}.vp-feature-bg+.vp-feature{color:#222}html[data-theme=dark] .vp-feature-bg+.vp-feature,html[data-theme=dark] .vp-highlight{color:#eee}.page-info a,.vp-feature-bg+.vp-feature .icon{color:inherit}.vp-feature-image{height:10rem;margin:0 auto}@media (max-width:959px){.vp-feature-image{height:8rem}}.vp-feature-image.light{display:inline-block}.vp-feature-image.dark,html[data-theme=dark] .vp-feature-image.light{display:none}html[data-theme=dark] .vp-feature-image.dark{display:inline-block}.vp-feature-header{margin-bottom:1.5rem;border-bottom:none;font-size:3rem;font-family:var(--font-family);text-align:center}@media (max-width:959px){.vp-feature-header{font-size:2.5rem}}@media (max-width:719px){.vp-feature-header{font-size:2.25rem}}@media (max-width:419px){.vp-feature-header{font-size:2rem}}.vp-feature-description{font-size:1.125rem}.vp-features{z-index:1;display:flex;flex-wrap:wrap;align-items:stretch;place-content:stretch center;margin:1rem 0;text-align:start}@media print{.vp-features{display:block}}.vp-features:first-child{border-top:1px solid var(--border-color);transition:border-color var(--color-transition)}.vp-feature-item{position:relative;display:block;flex-basis:calc(33% - 3rem);margin:.5rem;padding:1rem;border-radius:.5rem;color:inherit;transition:background var(--color-transition),box-shadow var(--color-transition),transform var(--transform-transition)}@media (min-width:1440px){.vp-feature-item{flex-basis:calc(25% - 3rem)}}@media (max-width:959px){.vp-feature-item{flex-basis:calc(50% - 3rem)}}@media (max-width:719px){.vp-feature-item{flex-basis:100%;font-size:.95rem}}@media (max-width:419px){.vp-feature-item{margin:.5rem 0;font-size:.9rem}}.vp-feature-item.link{cursor:pointer}@media print{.vp-feature-item.link{text-decoration:none}}.vp-feature-item .icon{display:inline-block;height:1.1em;margin-inline-end:.5rem;color:var(--theme-color);font-weight:400;font-size:1.1em}.vp-feature-item:hover{background-color:var(--bg-color-secondary);box-shadow:0 2px 12px 0 var(--card-shadow);transform:translate(-2px,-2px);transform:scale(1.05)}.vp-feature-bg+.vp-feature .vp-feature-item:hover{background-color:transparent}.vp-feature-item:only-child{flex-basis:100%}.vp-feature-item:first-child:nth-last-child(2),.vp-feature-item:nth-child(2):last-child{flex-basis:calc(50% - 3rem)}@media (max-width:719px){.vp-feature-item:first-child:nth-last-child(2),.vp-feature-item:nth-child(2):last-child{flex-basis:100%}}.vp-feature-title{margin:.25rem 0 .5rem;font-weight:700;font-size:1.3rem;font-family:var(--font-family)}@media (max-width:419px){.vp-feature-title{font-size:1.2rem}}.vp-feature-details{margin:0;line-height:1.4}.vp-footer-wrapper{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly;padding-block:.75rem;padding-inline:calc(var(--sidebar-space) + 2rem) 2rem;border-top:1px solid var(--border-color);background:var(--bg-color);color:var(--dark-grey);text-align:center;transition:border-top-color var(--color-transition),background var(--color-transition),padding var(--transform-transition)}@media (max-width:719px){.vp-footer-wrapper{padding-inline-start:2rem}}@media (min-width:1440px){.vp-footer-wrapper{z-index:50;padding-inline-start:2rem}}@media print{.vp-footer-wrapper{margin:0!important;padding:0!important}}@media (max-width:419px){.vp-footer-wrapper{display:block}}.no-sidebar .vp-footer-wrapper,.sidebar-collapsed .vp-footer-wrapper{padding-inline-start:2rem}.vp-footer{margin:.5rem 1rem;font-size:14px}@media print{.vp-footer{display:none}}.vp-copyright{margin:6px 0;font-size:13px}.vp-page:not(.not-found)+.vp-footer-wrapper{margin-top:-2rem}.vp-hero-info-wrapper{position:relative;display:flex;align-items:center;justify-content:center;margin-inline:auto}.vp-hero-info-wrapper.fullscreen{height:calc(100vh - var(--navbar-height))!important}.vp-hero-info{z-index:1;width:100%;padding-inline:2.5rem}@media (max-width:959px){.vp-hero-info{padding-inline:1.5rem}}@media (min-width:959px){.vp-hero-info{display:flex;align-items:center;justify-content:space-evenly}}.vp-hero-mask{position:absolute;inset:0;z-index:0;background-position:50%;background-size:cover}.vp-hero-mask::after{content:" ";position:absolute;inset:0;z-index:1;display:block}.vp-hero-mask.light{display:block}.vp-hero-mask.dark,html[data-theme=dark] .vp-hero-mask.light{display:none}.vp-hero-image.light,html[data-theme=dark] .vp-hero-mask.dark{display:block}.vp-hero-infos{z-index:1;margin:0 .5rem}.vp-hero-image{display:block;max-width:100%;max-height:18rem;margin:1rem}@media (max-width:959px){.vp-hero-image{margin:2rem auto}}@media (max-width:719px){.vp-hero-image{max-height:16rem;margin:1.5rem auto}}@media (max-width:419px){.vp-hero-image{max-height:14rem}}.vp-hero-image.dark,html[data-theme=dark] .vp-hero-image.light{display:none}html[data-theme=dark] .vp-hero-image.dark{display:block}#main-title{margin:.5rem 0;background:linear-gradient(120deg,var(--theme-color-light),var(--theme-color) 30%,#3e71af 100%);-webkit-background-clip:text;background-clip:text;font-weight:700;font-size:3.6rem;font-family:var(--font-family);line-height:1.5;-webkit-text-fill-color:transparent}@media (max-width:719px){#main-title{margin:0}}@media (max-width:959px){#main-title{font-size:2.5rem;text-align:center}}@media (max-width:719px){#main-title{font-size:2.25rem;text-align:center}}@media (max-width:419px){#main-title{margin:0 auto;font-size:2rem}}#main-description,.vp-hero-actions{margin:1.8rem 0}@media (max-width:719px){#main-description,.vp-hero-actions{margin:1.5rem 0}}@media (max-width:959px){#main-description,.vp-hero-actions{margin:1.5rem auto;text-align:center}}@media (max-width:419px){#main-description,.vp-hero-actions{margin:1.2rem 0}}#main-description{max-width:35rem;color:var(--text-color-light);font-weight:500;font-size:1.6rem;line-height:1.3}@media (max-width:719px){#main-description{font-size:1.4rem}}@media (max-width:419px){#main-description{font-size:1.2rem}}.vp-hero-action{display:inline-block;overflow:hidden;min-width:4rem;margin:.5rem;padding:.5em 1.5rem;border-radius:2rem;background:var(--bg-color-secondary);color:var(--text-color);font-size:1.2rem;text-align:center;transition:color var(--color-transition),color var(--color-transition),transform var(--transform-transition)}@media (max-width:719px){.vp-hero-action{padding:.5rem 1rem;font-size:1.1rem}}@media (max-width:419px){.vp-hero-action{font-size:1rem}}@media print{.vp-hero-action{text-decoration:none}}.vp-hero-action:hover{background:var(--bg-color-tertiary)}.vp-hero-action.primary{border-color:var(--theme-color);background:var(--theme-color);color:var(--white)}.vp-hero-action.primary:hover{border-color:var(--theme-color-light);background:var(--theme-color-light)}.vp-project-home:not(.pure) .vp-hero-action:active{transform:scale(.96)}.vp-hero-action .icon{margin-inline-end:.25em}.vp-highlight-wrapper{position:relative;display:flex;align-items:center;justify-content:center}.vp-highlight-wrapper:nth-child(odd) .vp-highlight{flex-direction:row-reverse}.vp-highlight{z-index:1;display:flex;flex:1;align-items:center;justify-content:flex-end;max-width:var(--home-page-width);margin:0 auto;padding:1.5rem 2.5rem;color:#222}@media (max-width:719px){.vp-highlight{display:block;padding-inline:1.5rem;text-align:center}}.vp-highlight-bg{position:absolute;inset:0;z-index:0;background-attachment:fixed;background-position:50%;background-size:cover}.vp-highlight-bg.light{display:inline-block}.vp-highlight-bg.dark,html[data-theme=dark] .vp-highlight-bg.light{display:none}.vp-highlight-image.light,html[data-theme=dark] .vp-highlight-bg.dark{display:inline-block}.vp-highlight-image{width:12rem;margin:2rem 4rem}@media (max-width:959px){.vp-highlight-image{width:10rem}}@media (max-width:719px){.vp-highlight-image{width:8rem;margin:0 auto}}.vp-highlight-image.dark,html[data-theme=dark] .vp-highlight-image.light{display:none}html[data-theme=dark] .vp-highlight-image.dark{display:inline-block}.vp-highlight-info-wrapper{display:flex;flex:1;justify-content:center;padding:2rem}@media (max-width:719px){.vp-highlight-info-wrapper{padding:1rem 0}}.vp-highlight-info-wrapper:only-child{flex:1 0 100%}.vp-highlight-info{text-align:start}.vp-highlight-header{margin-bottom:1.5rem;border-bottom:none;font-size:3rem;font-family:var(--font-family)}@media (max-width:959px){.vp-highlight-header{font-size:2.5rem}}@media (max-width:719px){.vp-highlight-header{font-size:2.25rem;text-align:center}}@media (max-width:419px){.vp-highlight-header{font-size:2rem}}.vp-highlight-description{font-size:1.125rem}.vp-highlights{margin-inline-start:-1.25em;padding-inline-start:0}.vp-highlight-item-wrapper{padding:.5em .5em .5em 1.75em;border-radius:.5rem;list-style:none}.vp-highlight-item-wrapper.link{cursor:pointer}.vp-highlight-item-wrapper:hover{background-color:var(--bg-color-secondary);box-shadow:0 2px 12px 0 var(--card-shadow);transition:transform var(--transform-transition);transform:translate(-2px,-2px)}.vp-highlight-bg+.vp-highlight .vp-highlight-item-wrapper:hover{background-color:transparent}.vp-highlight-item-wrapper::marker{font-weight:700}.vp-highlight-item{display:list-item;color:inherit;list-style:initial}@media print{.vp-highlight-item{text-decoration:none}}.vp-highlight-title{margin:0;font-weight:600;font-size:1.125rem;font-family:var(--font-family)}.vp-highlight-title .icon{margin-inline-end:.25em;font-size:1em}.vp-highlight-details{margin:.5rem 0 0}.vp-project-home{--content-width:var(--home-page-width);display:block;flex:1;padding-top:var(--navbar-height)}@media screen{.vp-project-home .vp-hero-info-wrapper:not(.fullscreen) .vp-hero-info{max-width:var(--home-page-width)}.vp-project-home .vp-feature{max-width:var(--home-page-width)}}.vp-project-home .theme-hope-content{padding-bottom:1.5rem!important}.vp-project-home .theme-hope-content:empty{padding:0!important}.not-found-hint{padding:2rem}.not-found-hint .error-code{margin:0;font-weight:700;font-size:4rem;line-height:4rem}.not-found-hint .error-title{font-weight:700}.not-found-hint .error-hint{margin:0;padding:12px 0;font-weight:600;font-size:20px;line-height:20px;letter-spacing:2px}.vp-page.not-found{display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;width:100vw;max-width:var(--home-page-width);margin:0 auto;padding:calc(var(--navbar-height) + 1rem) 1rem 1rem!important;text-align:center}.vp-page.not-found .action-button{display:inline-block;box-sizing:border-box;margin:.25rem;padding:.75rem 1rem;border-width:0;border-bottom:1px solid var(--theme-color-dark);border-radius:3rem;background:var(--theme-color);color:var(--white);outline:0;font-size:1rem;transition:background .1s ease}.vp-page.not-found .action-button:hover{background:var(--theme-color-light);cursor:pointer}.vp-page-nav{display:flex;flex-wrap:wrap;min-height:2rem;margin-top:0;padding-block:.5rem;padding-inline:2rem;border-top:1px solid var(--border-color);transition:border-top var(--color-transition)}@media (max-width:959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .nav-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--border-color);border-radius:.25rem}.vp-page-nav .nav-link:hover{background:var(--bg-color-secondary)}.vp-page-nav .nav-link .hint{color:var(--light-grey);font-size:.875rem;line-height:2}.vp-page-nav .nav-link .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s;font-size:.75rem}html[data-theme=dark] .vp-page-nav .nav-link .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.vp-page-nav .nav-link .arrow.down{transform:rotate(180deg)}.vp-page-nav .nav-link .arrow.end,html[dir=rtl] .vp-page-nav .nav-link .arrow.start{transform:rotate(90deg)}.vp-page-nav .nav-link .arrow.start{transform:rotate(-90deg)}.vp-page-nav .prev{text-align:start}.vp-page-nav .prev .icon{margin-inline-end:.25em;font-size:1em}.vp-page-nav .next{text-align:end}.vp-page-nav .next .icon{margin-inline-start:.25em;font-size:1em}.vp-page-title{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;position:relative;z-index:1;padding-top:1rem;padding-bottom:0}@media (max-width:959px){.vp-page-title{padding-inline:1.5rem}}@media print{.vp-page-title{max-width:unset;padding-inline:0!important}}@media (max-width:959px){.vp-page-title{padding-top:.5rem}}.vp-page-title h1{margin-top:calc(0px - var(--navbar-height))!important;margin-bottom:1rem;padding-top:var(--navbar-height)!important;font-size:2.2rem}@media (max-width:959px){.vp-page-title h1{margin-bottom:.5rem}}.vp-page-title h1 .icon{margin-inline-end:.25em;color:var(--theme-color);font-size:.9em}.theme-hope-content:not(.custom){padding-top:0!important}.theme-hope-content:not(.custom) h1:first-child,.theme-hope-content:not(.custom) h2:first-child,.theme-hope-content:not(.custom) h3:first-child,.theme-hope-content:not(.custom) h4:first-child,.theme-hope-content:not(.custom) h5:first-child,.theme-hope-content:not(.custom) h6:first-child{margin-top:calc(.5rem - var(--navbar-height))!important;padding-top:var(--navbar-height)!important}.theme-hope-content:not(.custom)>h1:first-child{display:none}.vp-page{display:block;flex-grow:1;padding-bottom:2rem;transition:padding var(--transform-transition)}@media print{.vp-page{min-height:auto!important;margin:0!important;padding:0!important}}.page-cover{width:var(--content-width);margin-inline:auto}@media (max-width:719px){.page-cover{width:100%}}.page-cover img{-o-object-fit:cover;object-fit:cover;width:100%;max-height:25vh;border-radius:.5rem}@media (max-width:719px){.page-cover img{border-radius:0}}.vp-skip-link{top:.25rem;inset-inline-start:.25rem;z-index:999;padding:.65rem 1.5rem;border-radius:.5rem;background:var(--bg-color);color:var(--theme-color);box-shadow:var(--card-shadow);font-weight:700;font-size:.9em;text-decoration:none}@media print{.vp-skip-link{display:none}}.vp-skip-link:focus{clip:auto;width:auto;height:auto;-webkit-clip-path:none;clip-path:none}.theme-hope-content pre{overflow:auto;margin:.85rem 0;padding:1rem;border-radius:6px;line-height:1.375}.theme-hope-content pre code{padding:0;border-radius:0;background:0 0!important;color:var(--code-color);font-family:var(--font-family-mono);text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;overflow-wrap:unset;-webkit-hyphens:none;hyphens:none;transition:color var(--color-transition);-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media print{.theme-hope-content pre code{white-space:pre-wrap}}.theme-hope-content .line-number{font-family:var(--font-family-mono)}div[class*=language-]{position:relative;border-radius:6px;background:var(--code-bg-color);font-size:16px;transition:background var(--color-transition)}@media (max-width:419px){.theme-hope-content>div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}div[class*=language-]::before{content:attr(data-title);position:absolute;top:0;right:1em;z-index:3;color:var(--code-line-color);font-size:.75rem;transition:color var(--color-transition)}div[class*=language-] pre{position:relative;z-index:1;scrollbar-gutter:stable}div[class*=language-] .highlight-lines{position:absolute;top:0;bottom:0;left:0;width:100%;padding:1rem 0;line-height:1.375;-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-] .highlight-line{background:var(--code-highlight-line-color);transition:background var(--color-transition)}div[class*=language-].line-numbers-mode::after{content:"";position:absolute;top:0;bottom:0;left:0;z-index:2;width:var(--line-numbers-width);border-right:1px solid var(--code-highlight-line-color);border-radius:6px 0 0 6px;transition:border-color var(--color-transition)}@media (max-width:419px){div[class*=language-].line-numbers-mode::after{border-radius:0}}@media print{div[class*=language-].line-numbers-mode::after{display:none}}div[class*=language-].line-numbers-mode .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-line::before{content:" ";position:absolute;top:0;left:0;z-index:3;display:block;width:var(--line-numbers-width);height:100%}div[class*=language-].line-numbers-mode pre{vertical-align:middle;margin-left:var(--line-numbers-width);padding-left:.5rem}@media print{div[class*=language-].line-numbers-mode pre{margin-left:0;padding-left:1rem}}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;bottom:0;left:0;display:flex;flex-direction:column;width:var(--line-numbers-width);padding:1rem 0;color:var(--code-line-color);counter-reset:line-number;text-align:center;transition:color var(--color-transition)}@media print{div[class*=language-].line-numbers-mode .line-numbers{display:none}}div[class*=language-].line-numbers-mode .line-number{position:relative;z-index:4;display:flex;flex:1;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-number::before{content:counter(line-number);display:block;font-size:.8em;line-height:1;counter-increment:line-number}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}html[data-theme=light] #app{--code-color:#383a42;--code-line-color:rgba(56, 58, 66, 0.67);--code-bg-color:#ecf4fa;--code-border-color:#c3def3;--code-highlight-line-color:#d8e9f6}html[data-theme=light] code[class*=language-],html[data-theme=light] pre[class*=language-]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}html[data-theme=light] code[class*=language-] ::-moz-selection,html[data-theme=light] code[class*=language-]::-moz-selection,html[data-theme=light] pre[class*=language-] ::-moz-selection,html[data-theme=light] pre[class*=language-]::-moz-selection{background:#e5e5e6;color:inherit}html[data-theme=light] code[class*=language-] ::selection,html[data-theme=light] code[class*=language-]::selection,html[data-theme=light] pre[class*=language-] ::selection,html[data-theme=light] pre[class*=language-]::selection{background:#e5e5e6;color:inherit}html[data-theme=light] .token.cdata,html[data-theme=light] .token.comment,html[data-theme=light] .token.prolog{color:#a0a1a7}html[data-theme=light] .token.attr-value>.token.punctuation.attr-equals,html[data-theme=light] .token.doctype,html[data-theme=light] .token.entity,html[data-theme=light] .token.punctuation,html[data-theme=light] .token.special-attr>.token.attr-value>.token.value.css{color:#383a42}html[data-theme=light] .token.atrule,html[data-theme=light] .token.attr-name,html[data-theme=light] .token.boolean,html[data-theme=light] .token.class-name,html[data-theme=light] .token.constant,html[data-theme=light] .token.number{color:#b76b01}html[data-theme=light] .token.keyword{color:#a626a4}html[data-theme=light] .language-css .token.selector,html[data-theme=light] .token.deleted,html[data-theme=light] .token.important,html[data-theme=light] .token.property,html[data-theme=light] .token.symbol,html[data-theme=light] .token.tag{color:#e45649}html[data-theme=light] .language-css .token.url>.token.string.url,html[data-theme=light] .token.attr-value,html[data-theme=light] .token.attr-value>.token.punctuation,html[data-theme=light] .token.builtin,html[data-theme=light] .token.char,html[data-theme=light] .token.inserted,html[data-theme=light] .token.regex,html[data-theme=light] .token.selector,html[data-theme=light] .token.string{color:#50a14f}html[data-theme=light] .token.function,html[data-theme=light] .token.operator,html[data-theme=light] .token.variable{color:#4078f2}html[data-theme=light] .language-css .token.property{color:#383a42}html[data-theme=light] .language-css .token.function,html[data-theme=light] .language-css .token.url>.token.function,html[data-theme=light] .token.url{color:#0184bc}html[data-theme=light] .language-css .token.atrule .token.rule,html[data-theme=light] .language-css .token.important,html[data-theme=light] .language-javascript .token.operator{color:#a626a4}html[data-theme=light] .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation{color:#ca1243}html[data-theme=light] .language-json .token.operator,html[data-theme=light] .language-markdown .token.url,html[data-theme=light] .language-markdown .token.url-reference.url>.token.string,html[data-theme=light] .language-markdown .token.url>.token.operator{color:#383a42}html[data-theme=light] .language-json .token.null.keyword{color:#b76b01}html[data-theme=light] .language-markdown .token.url>.token.content{color:#4078f2}html[data-theme=light] .language-markdown .token.url-reference.url,html[data-theme=light] .language-markdown .token.url>.token.url{color:#0184bc}html[data-theme=light] .language-markdown .token.blockquote.punctuation,html[data-theme=light] .language-markdown .token.hr.punctuation{color:#a0a1a7;font-style:italic}html[data-theme=light] .language-markdown .token.code-snippet{color:#50a14f}html[data-theme=light] .language-markdown .token.bold .token.content{color:#b76b01}html[data-theme=light] .language-markdown .token.italic .token.content{color:#a626a4}html[data-theme=light] .language-markdown .token.list.punctuation,html[data-theme=light] .language-markdown .token.strike .token.content,html[data-theme=light] .language-markdown .token.strike .token.punctuation,html[data-theme=light] .language-markdown .token.title.important>.token.punctuation{color:#e45649}html[data-theme=light] .token.bold{font-weight:700}html[data-theme=light] .token.comment,html[data-theme=light] .token.italic{font-style:italic}html[data-theme=light] .token.entity{cursor:help}html[data-theme=light] .token.namespace{opacity:.8}html[data-theme=dark] #app{--code-color:#abb2bf;--code-line-color:rgba(171, 178, 191, 0.67);--code-bg-color:#282c34;--code-border-color:#343e51;--code-highlight-line-color:#2f3542}html[data-theme=dark] code[class*=language-],html[data-theme=dark] pre[class*=language-]{text-shadow:0 1px rgba(0,0,0,.3);-moz-tab-size:2;-o-tab-size:2;tab-size:2}@media print{html[data-theme=dark] code[class*=language-],html[data-theme=dark] pre[class*=language-]{text-shadow:none}}html[data-theme=dark] code[class*=language-] ::-moz-selection,html[data-theme=dark] code[class*=language-]::-moz-selection,html[data-theme=dark] pre[class*=language-] ::-moz-selection,html[data-theme=dark] pre[class*=language-]::-moz-selection{background:#3e4451;color:inherit;text-shadow:none}html[data-theme=dark] code[class*=language-] ::selection,html[data-theme=dark] code[class*=language-]::selection,html[data-theme=dark] pre[class*=language-] ::selection,html[data-theme=dark] pre[class*=language-]::selection{background:#3e4451;color:inherit;text-shadow:none}html[data-theme=dark] .token.cdata,html[data-theme=dark] .token.comment,html[data-theme=dark] .token.prolog{color:#5c6370}html[data-theme=dark] .token.attr-value>.token.punctuation.attr-equals,html[data-theme=dark] .token.doctype,html[data-theme=dark] .token.entity,html[data-theme=dark] .token.punctuation,html[data-theme=dark] .token.special-attr>.token.attr-value>.token.value.css{color:#abb2bf}html[data-theme=dark] .token.atrule,html[data-theme=dark] .token.attr-name,html[data-theme=dark] .token.boolean,html[data-theme=dark] .token.class-name,html[data-theme=dark] .token.constant,html[data-theme=dark] .token.number{color:#d19a66}html[data-theme=dark] .token.keyword{color:#c678dd}html[data-theme=dark] .language-css .token.selector,html[data-theme=dark] .token.deleted,html[data-theme=dark] .token.important,html[data-theme=dark] .token.property,html[data-theme=dark] .token.symbol,html[data-theme=dark] .token.tag{color:#e06c75}html[data-theme=dark] .language-css .token.url>.token.string.url,html[data-theme=dark] .token.attr-value,html[data-theme=dark] .token.attr-value>.token.punctuation,html[data-theme=dark] .token.builtin,html[data-theme=dark] .token.char,html[data-theme=dark] .token.inserted,html[data-theme=dark] .token.regex,html[data-theme=dark] .token.selector,html[data-theme=dark] .token.string{color:#98c379}html[data-theme=dark] .token.function,html[data-theme=dark] .token.operator,html[data-theme=dark] .token.variable{color:#61afef}html[data-theme=dark] .language-css .token.property{color:#abb2bf}html[data-theme=dark] .language-css .token.function,html[data-theme=dark] .language-css .token.url>.token.function,html[data-theme=dark] .token.url{color:#56b6c2}html[data-theme=dark] .language-css .token.atrule .token.rule,html[data-theme=dark] .language-css .token.important,html[data-theme=dark] .language-javascript .token.operator{color:#c678dd}html[data-theme=dark] .language-javascript .token.template-string>.token.interpolation>.token.interpolation-punctuation.punctuation{color:#be5046}html[data-theme=dark] .language-json .token.operator,html[data-theme=dark] .language-markdown .token.url,html[data-theme=dark] .language-markdown .token.url-reference.url>.token.string,html[data-theme=dark] .language-markdown .token.url>.token.operator{color:#abb2bf}html[data-theme=dark] .language-json .token.null.keyword{color:#d19a66}html[data-theme=dark] .language-markdown .token.url>.token.content{color:#61afef}html[data-theme=dark] .language-markdown .token.url-reference.url,html[data-theme=dark] .language-markdown .token.url>.token.url{color:#56b6c2}html[data-theme=dark] .language-markdown .token.blockquote.punctuation,html[data-theme=dark] .language-markdown .token.hr.punctuation{color:#5c6370;font-style:italic}html[data-theme=dark] .language-markdown .token.code-snippet{color:#98c379}html[data-theme=dark] .language-markdown .token.bold .token.content{color:#d19a66}html[data-theme=dark] .language-markdown .token.italic .token.content{color:#c678dd}html[data-theme=dark] .language-markdown .token.list.punctuation,html[data-theme=dark] .language-markdown .token.strike .token.content,html[data-theme=dark] .language-markdown .token.strike .token.punctuation,html[data-theme=dark] .language-markdown .token.title.important>.token.punctuation{color:#e06c75}html[data-theme=dark] .token.bold{font-weight:700}html[data-theme=dark] .token.comment,html[data-theme=dark] .token.italic{font-style:italic}html[data-theme=dark] .token.entity{cursor:help}html[data-theme=dark] .token.namespace{opacity:.8}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border-width:0;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media print{.theme-hope-content{margin:0!important;padding-inline:0!important}}.theme-hope-content.custom{margin:0;padding:0}.theme-hope-content:not(.custom){max-width:var(--content-width, 740px);margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-hope-content:not(.custom){padding:1.5rem}}@media (max-width:419px){.theme-hope-content:not(.custom){padding:1rem 1.5rem}}@media print{.theme-hope-content:not(.custom){max-width:unset}}.theme-hope-content:not(.custom)>h1,.theme-hope-content:not(.custom)>h2,.theme-hope-content:not(.custom)>h3,.theme-hope-content:not(.custom)>h4,.theme-hope-content:not(.custom)>h5,.theme-hope-content:not(.custom)>h6{margin-top:calc(.5rem - var(--navbar-height));margin-bottom:.5rem;padding-top:calc(1rem + var(--navbar-height));outline:0}.theme-container.no-navbar .theme-hope-content:not(.custom)>h1,.theme-container.no-navbar .theme-hope-content:not(.custom)>h2,.theme-container.no-navbar .theme-hope-content:not(.custom)>h3,.theme-container.no-navbar .theme-hope-content:not(.custom)>h4,.theme-container.no-navbar .theme-hope-content:not(.custom)>h5,.theme-container.no-navbar .theme-hope-content:not(.custom)>h6{margin-top:1.5rem;padding-top:0}.theme-hope-content:not(.custom)>ol p,.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p{text-align:justify;overflow-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}@media (max-width:419px){.theme-hope-content:not(.custom)>ol p,.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p{text-align:start}}@media print{.theme-hope-content:not(.custom)>ol p,.theme-hope-content:not(.custom)>p,.theme-hope-content:not(.custom)>ul p{text-align:start}}.theme-hope-content a:not(.header-anchor):hover{text-decoration:underline}.theme-hope-content img{max-width:100%}::view-transition-new(root),::view-transition-old(root){animation:none;mix-blend-mode:normal}html[data-theme=dark]::view-transition-new(root),html[data-theme=light]::view-transition-old(root){z-index:1}html[data-theme=dark]::view-transition-old(root),html[data-theme=light]::view-transition-new(root){z-index:99999}@media (min-width:1280px){.chart-wrapper::-webkit-scrollbar,.flowchart-wrapper::-webkit-scrollbar,.mermaid-wrapper::-webkit-scrollbar{width:8px;height:8px}.chart-wrapper::-webkit-scrollbar-track-piece,.flowchart-wrapper::-webkit-scrollbar-track-piece,.mermaid-wrapper::-webkit-scrollbar-track-piece{border-radius:8px;background:rgba(0,0,0,.1)}}html[dir=rtl] a.header-anchor::before{right:-.75em}#docsearch-container{min-width:145.7px!important}@media (max-width:959px){#docsearch-container{min-width:36px!important}}.DocSearch.DocSearch-Button{margin-left:0}@media (max-width:959px){.DocSearch.DocSearch-Button{min-width:36px!important}}.DocSearch .DocSearch-Button-Placeholder{display:inline-block;padding:4px 12px 4px 6px;font-size:14px}@media (max-width:719px){.DocSearch .DocSearch-Button-Placeholder{display:none}}.DocSearch .DocSearch-Search-Icon{width:1.25em;height:1.25em}@media (max-width:959px){.DocSearch .DocSearch-Button-Keys{display:none}}.DocSearch .DocSearch-Button-Key{background:var(--bg-color);box-shadow:none}:root{scrollbar-width:thin}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track-piece{border-radius:6px;background:rgba(0,0,0,.1)}::-webkit-scrollbar-thumb{border-radius:6px;background:var(--theme-color)}::-webkit-scrollbar-thumb:active{background:var(--theme-color-light)}@media (max-width:719px){.hide-in-mobile{display:none!important}}@media (max-width:959px){.hide-in-pad{display:none!important}}.page-author-item{display:inline-block;margin:0 4px;font-weight:400;overflow-wrap:break-word}.page-category-info{flex-wrap:wrap}.page-category-item{display:inline-block;margin:.125em .25em;padding:0 .25em;border-radius:.25em;background:var(--bg-color-secondary);color:var(--text-color-light);font-weight:700;font-size:.75rem;line-height:2;transition:background var(--color-transition),color var(--color-transition)}@media print{.page-category-item{padding:0;font-weight:400}.page-category-item::after{content:", "}.page-category-item:last-of-type::after{content:""}}.page-category-item.clickable>span:hover{color:var(--theme-color);cursor:pointer}.page-category-item.category0{background:#fde5e7;color:#ec2f3e}html[data-theme=dark] .page-category-item.category0{background:#340509;color:#ba111f}.page-category-item.category0:hover{background:#f9bec3}html[data-theme=dark] .page-category-item.category0:hover{background:#53080e}.page-category-item.category1{background:#ffeee8;color:#fb7649}html[data-theme=dark] .page-category-item.category1{background:#441201;color:#f54205}.page-category-item.category1:hover{background:#fed4c6}html[data-theme=dark] .page-category-item.category1:hover{background:#6d1d02}.page-category-item.category2{background:#fef5e7;color:#f5b041}html[data-theme=dark] .page-category-item.category2{background:#3e2703;color:#e08e0b}.page-category-item.category2:hover{background:#fce6c4}html[data-theme=dark] .page-category-item.category2:hover{background:#633f05}.page-category-item.category3{background:#eafaf1;color:#55d98d}html[data-theme=dark] .page-category-item.category3{background:#0c331c;color:#29b866}.page-category-item.category3:hover{background:#caf3db}html[data-theme=dark] .page-category-item.category3:hover{background:#12522d}.page-category-item.category4{background:#e6f9ee;color:#36d278}html[data-theme=dark] .page-category-item.category4{background:#092917;color:#219552}.page-category-item.category4:hover{background:#c0f1d5}html[data-theme=dark] .page-category-item.category4:hover{background:#0f4224}.page-category-item.category5{background:#e1fcfc;color:#16e1e1}html[data-theme=dark] .page-category-item.category5{background:#042929;color:#0e9595}.page-category-item.category5:hover{background:#b4f8f8}html[data-theme=dark] .page-category-item.category5:hover{background:#064242}.page-category-item.category6{background:#e4f0fe;color:#2589f6}html[data-theme=dark] .page-category-item.category6{background:#021b36;color:#0862c3}.page-category-item.category6:hover{background:#bbdafc}html[data-theme=dark] .page-category-item.category6:hover{background:#042c57}.page-category-item.category7{background:#f7f1fd;color:#bb8ced}html[data-theme=dark] .page-category-item.category7{background:#2a0b4b;color:#9851e4}.page-category-item.category7:hover{background:#eadbfa}html[data-theme=dark] .page-category-item.category7:hover{background:#431277}.page-category-item.category8{background:#fdeaf5;color:#ef59ab}html[data-theme=dark] .page-category-item.category8{background:#400626;color:#e81689}.page-category-item.category8:hover{background:#facbe5}html[data-theme=dark] .page-category-item.category8:hover{background:#670a3d}.page-info .icon,.page-original-info{position:relative;display:inline-block;vertical-align:middle}.page-original-info{overflow:hidden;padding:0 .5em;border:.5px solid var(--dark-grey);border-radius:.75em;background:var(--bg-color);font-size:.75em;line-height:1.5!important}.page-info,.page-info>span{display:flex;align-items:center}.page-info{flex-wrap:wrap;place-content:stretch flex-start;color:var(--dark-grey);font-size:14px}@media print{.page-info{display:flex!important}}.page-info>span{max-width:100%;margin-inline-end:.5em;line-height:2}@media (min-width:1440px){.page-info>span{font-size:1.1em}}@media (max-width:419px){.page-info>span{margin-inline-end:.3em;font-size:.875em}}@media print{.page-info>span{display:flex!important}}.page-info .icon{width:1em;height:1em;margin-inline-end:.25em}.page-meta{max-width:var(--content-width, 740px);margin-inline:auto;padding-inline:2.5rem;display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding-top:.75rem;padding-bottom:.75rem}@media (max-width:959px){.page-meta{padding-inline:1.5rem}}@media print{.page-meta{max-width:unset;margin:0!important;padding-inline:0!important}}@media (max-width:719px){.page-meta{display:block}}.page-meta .meta-item{flex-grow:1}.page-meta .meta-item .label{font-weight:500}.page-meta .meta-item .label:not(a){color:var(--text-color-lighter)}.page-meta .meta-item .info{color:var(--dark-grey);font-weight:400}.page-meta .git-info{text-align:end}.page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:14px}@media print{.page-meta .edit-link{display:none}}.page-meta .edit-link .icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.page-meta .contributors,.page-meta .update-time{margin-top:.25rem;margin-bottom:.25rem;font-size:14px}@media (max-width:719px){.page-meta .contributors,.page-meta .update-time{font-size:13px;text-align:start}}.print-button{border-width:0;background:0 0;cursor:pointer;box-sizing:content-box;width:1rem;height:1rem;padding:.5rem;border-radius:.25em;color:inherit;font-size:1rem;transform:translateY(.25rem)}@media print{.print-button{display:none}}.page-tag-info{flex-wrap:wrap}.page-tag-item{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;min-width:1.5rem;margin:.125rem;padding:.125rem .25rem .125rem .625rem;background:var(--bg-color-secondary);background:linear-gradient(135deg,transparent .75em,var(--bg-color-secondary)0) top,linear-gradient(45deg,transparent .75em,var(--bg-color-secondary)0) bottom;background-size:100% 52%!important;background-repeat:no-repeat!important;color:var(--text-color-light);font-weight:700;font-size:.625rem;line-height:1.5;text-align:center;transition:background var(--color-transition),color var(--color-transition)}@media print{.page-tag-item{padding:0;font-weight:400}.page-tag-item::after{content:", "}.page-tag-item:last-of-type::after{content:""}}.page-tag-item.clickable:hover{cursor:pointer}.page-tag-item.tag0{background:#fde5e7;background:linear-gradient(135deg,transparent .75em,#fde5e7 0) top,linear-gradient(45deg,transparent .75em,#fde5e7 0) bottom;color:#ec2f3e}html[data-theme=dark] .page-tag-item.tag0{background:#340509;background:linear-gradient(135deg,transparent .75em,#340509 0) top,linear-gradient(45deg,transparent .75em,#340509 0) bottom;color:#ba111f}.page-tag-item.tag0.clickable:hover{background:#f9bec3;background:linear-gradient(135deg,transparent .75em,#f9bec3 0) top,linear-gradient(45deg,transparent .75em,#f9bec3 0) bottom}html[data-theme=dark] .page-tag-item.tag0.clickable:hover{background:#53080e;background:linear-gradient(135deg,transparent .75em,#53080e 0) top,linear-gradient(45deg,transparent .75em,#53080e 0) bottom}.page-tag-item.tag1{background:#ffeee8;background:linear-gradient(135deg,transparent .75em,#ffeee8 0) top,linear-gradient(45deg,transparent .75em,#ffeee8 0) bottom;color:#fb7649}html[data-theme=dark] .page-tag-item.tag1{background:#441201;background:linear-gradient(135deg,transparent .75em,#441201 0) top,linear-gradient(45deg,transparent .75em,#441201 0) bottom;color:#f54205}.page-tag-item.tag1.clickable:hover{background:#fed4c6;background:linear-gradient(135deg,transparent .75em,#fed4c6 0) top,linear-gradient(45deg,transparent .75em,#fed4c6 0) bottom}html[data-theme=dark] .page-tag-item.tag1.clickable:hover{background:#6d1d02;background:linear-gradient(135deg,transparent .75em,#6d1d02 0) top,linear-gradient(45deg,transparent .75em,#6d1d02 0) bottom}.page-tag-item.tag2{background:#fef5e7;background:linear-gradient(135deg,transparent .75em,#fef5e7 0) top,linear-gradient(45deg,transparent .75em,#fef5e7 0) bottom;color:#f5b041}html[data-theme=dark] .page-tag-item.tag2{background:#3e2703;background:linear-gradient(135deg,transparent .75em,#3e2703 0) top,linear-gradient(45deg,transparent .75em,#3e2703 0) bottom;color:#e08e0b}.page-tag-item.tag2.clickable:hover{background:#fce6c4;background:linear-gradient(135deg,transparent .75em,#fce6c4 0) top,linear-gradient(45deg,transparent .75em,#fce6c4 0) bottom}html[data-theme=dark] .page-tag-item.tag2.clickable:hover{background:#633f05;background:linear-gradient(135deg,transparent .75em,#633f05 0) top,linear-gradient(45deg,transparent .75em,#633f05 0) bottom}.page-tag-item.tag3{background:#eafaf1;background:linear-gradient(135deg,transparent .75em,#eafaf1 0) top,linear-gradient(45deg,transparent .75em,#eafaf1 0) bottom;color:#55d98d}html[data-theme=dark] .page-tag-item.tag3{background:#0c331c;background:linear-gradient(135deg,transparent .75em,#0c331c 0) top,linear-gradient(45deg,transparent .75em,#0c331c 0) bottom;color:#29b866}.page-tag-item.tag3.clickable:hover{background:#caf3db;background:linear-gradient(135deg,transparent .75em,#caf3db 0) top,linear-gradient(45deg,transparent .75em,#caf3db 0) bottom}html[data-theme=dark] .page-tag-item.tag3.clickable:hover{background:#12522d;background:linear-gradient(135deg,transparent .75em,#12522d 0) top,linear-gradient(45deg,transparent .75em,#12522d 0) bottom}.page-tag-item.tag4{background:#e6f9ee;background:linear-gradient(135deg,transparent .75em,#e6f9ee 0) top,linear-gradient(45deg,transparent .75em,#e6f9ee 0) bottom;color:#36d278}html[data-theme=dark] .page-tag-item.tag4{background:#092917;background:linear-gradient(135deg,transparent .75em,#092917 0) top,linear-gradient(45deg,transparent .75em,#092917 0) bottom;color:#219552}.page-tag-item.tag4.clickable:hover{background:#c0f1d5;background:linear-gradient(135deg,transparent .75em,#c0f1d5 0) top,linear-gradient(45deg,transparent .75em,#c0f1d5 0) bottom}html[data-theme=dark] .page-tag-item.tag4.clickable:hover{background:#0f4224;background:linear-gradient(135deg,transparent .75em,#0f4224 0) top,linear-gradient(45deg,transparent .75em,#0f4224 0) bottom}.page-tag-item.tag5{background:#e1fcfc;background:linear-gradient(135deg,transparent .75em,#e1fcfc 0) top,linear-gradient(45deg,transparent .75em,#e1fcfc 0) bottom;color:#16e1e1}html[data-theme=dark] .page-tag-item.tag5{background:#042929;background:linear-gradient(135deg,transparent .75em,#042929 0) top,linear-gradient(45deg,transparent .75em,#042929 0) bottom;color:#0e9595}.page-tag-item.tag5.clickable:hover{background:#b4f8f8;background:linear-gradient(135deg,transparent .75em,#b4f8f8 0) top,linear-gradient(45deg,transparent .75em,#b4f8f8 0) bottom}html[data-theme=dark] .page-tag-item.tag5.clickable:hover{background:#064242;background:linear-gradient(135deg,transparent .75em,#064242 0) top,linear-gradient(45deg,transparent .75em,#064242 0) bottom}.page-tag-item.tag6{background:#e4f0fe;background:linear-gradient(135deg,transparent .75em,#e4f0fe 0) top,linear-gradient(45deg,transparent .75em,#e4f0fe 0) bottom;color:#2589f6}html[data-theme=dark] .page-tag-item.tag6{background:#021b36;background:linear-gradient(135deg,transparent .75em,#021b36 0) top,linear-gradient(45deg,transparent .75em,#021b36 0) bottom;color:#0862c3}.page-tag-item.tag6.clickable:hover{background:#bbdafc;background:linear-gradient(135deg,transparent .75em,#bbdafc 0) top,linear-gradient(45deg,transparent .75em,#bbdafc 0) bottom}html[data-theme=dark] .page-tag-item.tag6.clickable:hover{background:#042c57;background:linear-gradient(135deg,transparent .75em,#042c57 0) top,linear-gradient(45deg,transparent .75em,#042c57 0) bottom}.page-tag-item.tag7{background:#f7f1fd;background:linear-gradient(135deg,transparent .75em,#f7f1fd 0) top,linear-gradient(45deg,transparent .75em,#f7f1fd 0) bottom;color:#bb8ced}html[data-theme=dark] .page-tag-item.tag7{background:#2a0b4b;background:linear-gradient(135deg,transparent .75em,#2a0b4b 0) top,linear-gradient(45deg,transparent .75em,#2a0b4b 0) bottom;color:#9851e4}.page-tag-item.tag7.clickable:hover{background:#eadbfa;background:linear-gradient(135deg,transparent .75em,#eadbfa 0) top,linear-gradient(45deg,transparent .75em,#eadbfa 0) bottom}html[data-theme=dark] .page-tag-item.tag7.clickable:hover{background:#431277;background:linear-gradient(135deg,transparent .75em,#431277 0) top,linear-gradient(45deg,transparent .75em,#431277 0) bottom}.page-tag-item.tag8{background:#fdeaf5;background:linear-gradient(135deg,transparent .75em,#fdeaf5 0) top,linear-gradient(45deg,transparent .75em,#fdeaf5 0) bottom;color:#ef59ab}html[data-theme=dark] .page-tag-item.tag8{background:#400626;background:linear-gradient(135deg,transparent .75em,#400626 0) top,linear-gradient(45deg,transparent .75em,#400626 0) bottom;color:#e81689}.page-tag-item.tag8.clickable:hover{background:#facbe5;background:linear-gradient(135deg,transparent .75em,#facbe5 0) top,linear-gradient(45deg,transparent .75em,#facbe5 0) bottom}html[data-theme=dark] .page-tag-item.tag8.clickable:hover{background:#670a3d;background:linear-gradient(135deg,transparent .75em,#670a3d 0) top,linear-gradient(45deg,transparent .75em,#670a3d 0) bottom}.toc-place-holder{margin-inline:auto;padding-inline:2.5rem;position:sticky;z-index:99;max-width:var(--content-width, 740px)}@media (max-width:959px){.toc-place-holder{padding-inline:1.5rem}}@media print{.toc-place-holder{max-width:unset}}.toc-place-holder+.theme-hope-content:not(.custom){padding-top:0}#toc{position:absolute;inset-inline-start:calc(100% + 1rem);display:none;min-width:10rem;max-width:15rem}@media (min-width:1440px){.has-toc #toc{display:block}}@media print{#toc{display:none!important}}#toc .toc-header{margin-bottom:.75rem;margin-inline-start:.5rem;font-weight:600;font-size:.875rem}#toc .toc-wrapper{position:relative;overflow:hidden auto;max-height:75vh;margin:0 .5rem;padding-inline-start:8px;text-overflow:ellipsis;white-space:nowrap;scroll-behavior:smooth}#toc .toc-wrapper::-webkit-scrollbar-track-piece{background:0 0}#toc .toc-wrapper::-webkit-scrollbar{width:3px}#toc .toc-wrapper::-webkit-scrollbar-thumb:vertical{background:#ddd}html[data-theme=dark] #toc .toc-wrapper::-webkit-scrollbar-thumb:vertical{background:#333}#toc .toc-wrapper::before{bottom:0;inset-inline-start:0;z-index:-1;background:var(--border-color)}#toc .toc-list{position:relative;margin:0;padding:0}#toc .toc-marker,#toc .toc-wrapper::before{content:" ";position:absolute;top:0;width:2px}#toc .toc-marker{inset-inline-start:-8px;z-index:2;height:1.7rem;background:var(--theme-color);transition:top var(--vp-tt)}#toc .toc-link{position:relative;display:block;overflow:hidden;max-width:100%;color:var(--light-grey);line-height:inherit;text-overflow:ellipsis;white-space:nowrap}#toc .toc-link.level2{padding-inline-start:0;font-size:14px}#toc .toc-link.level3{padding-inline-start:8px;font-size:13px}#toc .toc-link.level4{padding-inline-start:16px;font-size:12px}#toc .toc-link.level5{padding-inline-start:24px;font-size:11px}#toc .toc-link.level6{padding-inline-start:32px;font-size:10px}#toc .toc-item{position:relative;box-sizing:border-box;height:1.7rem;padding:0 .5rem;list-style:none;line-height:1.7rem}#toc .toc-item.active>.toc-link{color:var(--theme-color);font-weight:700}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper:not(:hover) .arrow{transform:rotate(-180deg)}.dropdown-wrapper .dropdown-title{border-width:0;background:0 0;cursor:pointer;padding:0 .25rem;color:var(--dark-grey);font-weight:500;font-size:inherit;font-family:inherit;line-height:inherit;cursor:inherit}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .icon{margin-inline-end:.25em;font-size:1em}.dropdown-wrapper .dropdown-title .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s;font-size:1.2em}html[data-theme=dark] .dropdown-wrapper .dropdown-title .arrow,html[data-theme=dark] .nav-screen-dropdown-title .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.dropdown-wrapper .dropdown-title .arrow.down{transform:rotate(180deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.down,html[dir=rtl] .nav-screen-dropdown-title .arrow.down{transform:rotate(-180deg)}.dropdown-wrapper .dropdown-title .arrow.end{transform:rotate(90deg)}.dropdown-wrapper .dropdown-title .arrow.start,html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.end,html[dir=rtl] .nav-screen-dropdown-title .arrow.end{transform:rotate(-90deg)}html[dir=rtl] .dropdown-wrapper .dropdown-title .arrow.start{transform:rotate(90deg)}.dropdown-wrapper ul{margin:0;padding:0;list-style-type:none}.dropdown-wrapper .nav-dropdown{position:absolute;top:100%;inset-inline-end:0;overflow-y:auto;box-sizing:border-box;min-width:6rem;max-height:calc(100vh - var(--navbar-height));margin:0;padding:.5rem .75rem;border:1px solid var(--grey14);border-radius:.5rem;background:var(--bg-color);box-shadow:2px 2px 10px var(--card-shadow);text-align:start;white-space:nowrap;opacity:0;visibility:hidden;transition:all .18s ease-out;transform:scale(.9)}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{z-index:2;opacity:1;visibility:visible;transform:none}.dropdown-wrapper .nav-link{position:relative;display:block;margin-bottom:0;border-bottom:none;color:var(--dark-grey);font-weight:400;font-size:.875rem;line-height:1.7rem;transition:color var(--color-transition)}.dropdown-wrapper .nav-link.active,.dropdown-wrapper .nav-link:hover{color:var(--theme-color)}.dropdown-wrapper .dropdown-subtitle{margin:0;padding:.5rem .25rem 0;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;text-transform:uppercase;transition:color var(--color-transition)}.dropdown-wrapper .dropdown-subitem-wrapper{padding:0 0 .25rem}.dropdown-wrapper .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .dropdown-item:last-child .dropdown-subtitle{padding-top:0}.dropdown-wrapper .dropdown-item:last-child .dropdown-subitem-wrapper{padding-bottom:0}.nav-screen-dropdown-title{border-width:0;background:0 0;position:relative;display:flex;align-items:center;width:100%;padding:0;color:var(--dark-grey);font-size:inherit;font-family:inherit;text-align:start;cursor:pointer}.nav-screen-dropdown-title.active,.nav-screen-dropdown-title:hover{color:var(--text-color)}.nav-screen-dropdown-title .title{flex:1}.nav-screen-dropdown-title .arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}.nav-screen-dropdown-title .arrow.down{transform:rotate(180deg)}.nav-screen-dropdown-title .arrow.end,html[dir=rtl] .nav-screen-dropdown-title .arrow.start{transform:rotate(90deg)}.nav-screen-dropdown-title .arrow.start{transform:rotate(-90deg)}.nav-screen-dropdown{overflow:hidden;margin:.5rem 0 0;padding:0;list-style:none;transition:transform .1s ease-out;transform:scaleY(1);transform-origin:top}.nav-screen-dropdown.hide{height:0;margin:0;transform:scaleY(0)}.nav-screen-dropdown .nav-link{position:relative;display:block;padding-inline-start:.5rem;font-weight:400;line-height:2}.nav-screen-dropdown .nav-link.active,.nav-screen-dropdown .nav-link:hover{color:var(--theme-color)}.nav-screen-dropdown .nav-link .icon{font-size:1em}.nav-screen-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.nav-screen-dropdown .dropdown-subtitle{margin:0;padding-inline-start:.25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;text-transform:uppercase;transition:color var(--color-transition)}.nav-screen-dropdown .dropdown-subtitle .nav-link{padding:0}.nav-screen-dropdown .dropdown-subitem-wrapper{margin:0;padding:0;list-style:none}.nav-screen-dropdown .dropdown-subitem{padding-inline-start:.5rem;font-size:.9em}.nav-screen-links{display:none;padding-bottom:.75rem}@media (max-width:719px){.nav-screen-links{display:block}}.nav-screen-links .navbar-links-item{position:relative;display:block;padding:12px 4px 11px 0;border-bottom:1px solid var(--border-color);font-size:16px;line-height:1.5rem;transition:border-bottom-color var(--color-transition)}.nav-screen-links .nav-link{display:inline-block;width:100%;color:var(--dark-grey);font-weight:400}.nav-screen-links .nav-link:hover{color:var(--text-color)}.nav-screen-links .nav-link.active,.vp-brand:hover .vp-site-name,.vp-navbar .nav-item>.nav-link.active{color:var(--theme-color)}.vp-nav-screen-container{max-width:320px;margin:0 auto;padding:2rem 0 4rem}#nav-screen{position:fixed;inset:var(--navbar-height)0 0 0;z-index:150;display:none;overflow-y:auto;padding:0 2rem;background:var(--bg-color);transition:background .5s}@media (max-width:719px){#nav-screen{display:block}}#nav-screen.fade-enter-active,#nav-screen.fade-leave-active{transition:opacity .25s}#nav-screen.fade-enter-active .vp-nav-screen-container,#nav-screen.fade-leave-active .vp-nav-screen-container{transition:transform .25s ease}#nav-screen.fade-enter-from,#nav-screen.fade-leave-to{opacity:0}#nav-screen.fade-enter-from .vp-nav-screen-container,#nav-screen.fade-leave-to .vp-nav-screen-container{transform:translateY(-8px)}#nav-screen .icon{margin-inline-end:.25em;font-size:1em}.vp-outlook-wrapper{display:flex;justify-content:space-around}.vp-nav-logo{vertical-align:top;height:var(--navbar-line-height);margin-inline-end:.8rem}.vp-nav-logo.light{display:inline-block}.vp-nav-logo.dark,html[data-theme=dark] .vp-nav-logo.light{display:none}html[data-theme=dark] .vp-nav-logo.dark{display:inline-block}.vp-site-name{position:relative;color:var(--text-color);font-size:1.25rem}@media (max-width:719px){.vp-site-name{overflow:hidden;width:calc(100vw - 9.4rem);text-overflow:ellipsis;white-space:nowrap}}.vp-navbar .vp-nav-links{display:flex;align-items:center;font-size:.875rem}.vp-navbar .nav-item{position:relative;margin:0 .25rem;line-height:2rem}.vp-navbar .nav-item:first-child{margin-inline-start:0}.vp-navbar .nav-item:last-child{margin-inline-end:0}.vp-navbar .nav-item>.nav-link,.vp-navbar .nav-link{color:var(--dark-grey)}.vp-navbar .nav-item>.nav-link::after{content:" ";position:absolute;inset:auto 50%0;height:2px;border-radius:1px;background:var(--theme-color-light);visibility:hidden;transition:inset .2s ease-in-out}.vp-navbar .nav-item>.nav-link.active::after,.vp-navbar .nav-item>.nav-link:hover::after{inset:auto 0 0;visibility:visible}.vp-navbar{--navbar-line-height:calc( var(--navbar-height) - var(--navbar-vertical-padding) * 2 );position:fixed;inset:0 0 auto;z-index:175;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box;height:var(--navbar-height);padding:var(--navbar-vertical-padding) var(--navbar-horizontal-padding);background:var(--navbar-bg-color);box-shadow:0 2px 8px var(--card-shadow);line-height:var(--navbar-line-height);white-space:nowrap;transition:transform ease-in-out .3s,background var(--color-transition),box-shadow var(--color-transition);-webkit-backdrop-filter:saturate(150%) blur(12px);backdrop-filter:saturate(150%) blur(12px)}@media print{.vp-navbar{display:none}}.hide-navbar .vp-navbar.auto-hide{transform:translateY(-100%)}.vp-navbar .nav-link{padding:0 .25rem}.vp-navbar .nav-link.active{color:var(--theme-color)}.vp-navbar .nav-link .icon{margin-inline-end:.25em;font-size:1em}.vp-navbar.hide-icon .vp-nav-links .icon{display:none!important}.vp-navbar-center,.vp-navbar-end,.vp-navbar-start{display:flex;flex:1;align-items:center}.vp-navbar-center>*,.vp-navbar-end>*,.vp-navbar-start>*{position:relative;margin:0 .25rem!important}.vp-navbar-center>:first-child,.vp-navbar-end>:first-child,.vp-navbar-start>:first-child{margin-inline-start:0!important}.vp-navbar-center>:last-child,.vp-navbar-end>:last-child,.vp-navbar-start>:last-child{margin-inline-end:0!important}.vp-navbar-start{justify-content:start}.vp-navbar-center{justify-content:center}.vp-navbar-end{justify-content:end}.vp-navbar .vp-repo{margin:0!important}.vp-navbar .vp-repo-link{display:inline-block;margin:auto;padding:6px;color:var(--dark-grey);line-height:1}#appearance-switch:hover,.vp-navbar .vp-repo-link:active,.vp-navbar .vp-repo-link:hover{color:var(--theme-color)}.vp-toggle-navbar-button{border-width:0;background:0 0;cursor:pointer;position:relative;display:none;align-items:center;justify-content:center;padding:6px}@media screen and (max-width:719px){.vp-toggle-navbar-button{display:flex}}.vp-toggle-navbar-button>span{position:relative;overflow:hidden;width:16px;height:14px}.vp-toggle-navbar-button .vp-bottom,.vp-toggle-navbar-button .vp-middle,.vp-toggle-navbar-button .vp-top{position:absolute;width:16px;height:2px;background:var(--dark-grey);transition:top .25s,background .5s,transform .25s}.vp-toggle-navbar-button .vp-top{top:0;left:0;transform:translateX(0)}.vp-toggle-navbar-button .vp-middle{top:6px;left:0;transform:translateX(8px)}.vp-toggle-navbar-button .vp-bottom{top:12px;left:0;transform:translateX(4px)}.vp-toggle-navbar-button:hover .vp-top{top:0;left:0;transform:translateX(4px)}.vp-toggle-navbar-button:hover .vp-middle{top:6;left:0;transform:translateX(0)}.vp-toggle-navbar-button:hover .vp-bottom{top:12px;left:0;transform:translateX(8px)}.vp-toggle-navbar-button.is-active .vp-top{top:6px;transform:translateX(0) rotate(225deg)}.vp-toggle-navbar-button.is-active .vp-middle{top:6px;transform:translateX(16px)}.vp-toggle-navbar-button.is-active .vp-bottom{top:6px;transform:translateX(0) rotate(135deg)}.vp-toggle-navbar-button.is-active:hover .vp-bottom,.vp-toggle-navbar-button.is-active:hover .vp-middle,.vp-toggle-navbar-button.is-active:hover .vp-top{background:var(--theme-color);transition:top .25s,background .25s,transform .25s}.vp-toggle-sidebar-button{border-width:0;background:0 0;cursor:pointer;display:none;vertical-align:middle;box-sizing:content-box;width:1rem;height:1rem;padding:.5rem;font:unset;transition:transform .2s ease-in-out}@media screen and (max-width:719px){.vp-toggle-sidebar-button{display:block;padding-inline-end:var(--navbar-mobile-horizontal-padding)}}.vp-toggle-sidebar-button .icon,.vp-toggle-sidebar-button::after,.vp-toggle-sidebar-button::before{display:block;width:100%;height:2px;border-radius:.05em;background:var(--dark-grey);transition:transform .2s ease-in-out}.vp-toggle-sidebar-button::before{content:" ";margin-top:.125em}.sidebar-open .vp-toggle-sidebar-button::before{transform:translateY(.34rem) rotate(135deg)}.vp-toggle-sidebar-button::after{content:" ";margin-bottom:.125em}.sidebar-open .vp-toggle-sidebar-button::after{transform:translateY(-.34rem) rotate(-135deg)}.vp-toggle-sidebar-button .icon{margin:.2em 0}.sidebar-open .vp-toggle-sidebar-button .icon{transform:scale(0)}.appearance-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}#appearance-switch,.outlook-button{border-width:0;background:0 0;cursor:pointer;color:var(--dark-grey)}#appearance-switch{padding:6px;transition:color var(--color-transition)}#appearance-switch .icon,.outlook-button .icon{width:1.25rem;height:1.25rem}.outlook-button{position:relative;padding:.375rem}#appearance-switch,.outlook-button .icon{vertical-align:middle}.outlook-dropdown{position:absolute;top:100%;inset-inline-end:0;overflow-y:auto;box-sizing:border-box;min-width:100px;margin:0;padding:.5rem .75rem;border:1px solid var(--grey14);border-radius:.25rem;background:var(--bg-color);box-shadow:2px 2px 10px var(--card-shadow);text-align:start;white-space:nowrap;opacity:0;visibility:hidden;transition:all .18s ease-out;transform:scale(.8)}.outlook-dropdown>:not(:last-child){padding-bottom:.5rem;border-bottom:1px solid var(--grey14)}.outlook-button.open .outlook-dropdown,.outlook-button:hover .outlook-dropdown{z-index:2;opacity:1;visibility:visible;transform:scale(1)}.theme-color-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}#theme-color-picker{display:flex;margin:0;padding:0;list-style-type:none;font-size:14px}#theme-color-picker li span{display:inline-block;vertical-align:middle;width:15px;height:15px;margin:0 2px;border-radius:2px}#theme-color-picker li span.theme-color,#theme-color-picker li span.theme-color html[data-theme=dark]{background:#3eaf7c}@media print{.full-screen-wrapper{display:none}}.full-screen-title{display:block;margin:0;padding:0 .25rem;color:var(--light-grey);font-weight:600;font-size:.75rem;line-height:2;transition:color var(--color-transition)}.cancel-full-screen,.full-screen{border-width:0;background:0 0;vertical-align:middle;padding:.375rem;color:var(--dark-grey);cursor:pointer}.cancel-full-screen:hover,.full-screen:hover{color:var(--theme-color)}.cancel-full-screen .icon,.full-screen .icon{width:1.25rem;height:1.25rem}.cancel-fullscreen-icon,.enter-fullscreen-icon:hover{color:var(--theme-color)}.cancel-fullscreen-icon:hover{color:var(--dark-grey)}.vp-sidebar-heading,.vp-sidebar-link{box-sizing:border-box;width:calc(100% - 1rem);margin-inline:.5rem;padding:.25rem .5rem;border-radius:.375rem;color:var(--text-color);line-height:1.5}.vp-sidebar-heading{display:flex;align-items:center;overflow:hidden;margin:0;border-width:0;background:0 0;font-size:1.1em;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:color .15s ease;transform:rotate(0)}.vp-sidebar-heading.clickable.exact a,.vp-sidebar-heading.open{color:inherit}.vp-sidebar-heading.clickable:hover{background:var(--bg-color-secondary)}.vp-sidebar-heading.clickable.exact{border-inline-start-color:var(--theme-color);color:var(--theme-color)}.vp-sidebar-heading .vp-sidebar-title{flex:1}.vp-sidebar-heading .vp-arrow{display:inline-block;vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s;font-size:1.5em}html[data-theme=dark] .vp-sidebar-heading .vp-arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.vp-sidebar-heading .vp-arrow.down{transform:rotate(180deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.down{transform:rotate(-180deg)}.vp-sidebar-heading .vp-arrow.end{transform:rotate(90deg)}.vp-sidebar-heading .vp-arrow.start,html[dir=rtl] .vp-sidebar-heading .vp-arrow.end{transform:rotate(-90deg)}html[dir=rtl] .vp-sidebar-heading .vp-arrow.start{transform:rotate(90deg)}button.vp-sidebar-heading{outline:0;font-weight:inherit;font-family:inherit;line-height:inherit;text-align:start;cursor:pointer}.vp-sidebar-link{display:inline-block;font-weight:400;font-size:1em}.vp-sidebar-link:hover{background:var(--bg-color-secondary)}.vp-sidebar-link.active{background:var(--theme-color-mask);font-weight:500}.vp-sidebar-link.active,.vp-sidebar-link.active .icon{color:var(--theme-color)}.vp-sidebar-sub-headers .vp-sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-inline-start:none}.vp-sidebar-sub-headers .vp-sidebar-link.active{background:0 0;font-weight:500}.vp-sidebar-group:not(.collapsible) .vp-sidebar-heading:not(.clickable){color:inherit;cursor:auto}.vp-sidebar-group .vp-sidebar-group{padding-inline-start:.75rem}.vp-sidebar-group .vp-sidebar-group .vp-sidebar-heading{font-size:1em}.vp-sidebar-group .vp-sidebar-link{padding-inline-start:1.25rem}.vp-sidebar-links,.vp-sidebar-links ul{margin:0;padding:0}.vp-sidebar-links ul.vp-sidebar-sub-headers{padding-inline-start:.75rem;font-size:.95em}@media (min-width:1440px){.has-toc .vp-sidebar-links ul.vp-sidebar-sub-headers{display:none}}.vp-sidebar-links li{list-style-type:none}.vp-sidebar>.vp-sidebar-links{padding:1.5rem 0}@media (max-width:719px){.vp-sidebar>.vp-sidebar-links{padding:1rem 0}}.vp-sidebar>.vp-sidebar-links>li>.vp-sidebar-link{font-size:1.1em}.vp-sidebar>.vp-sidebar-links>li:not(:first-child){margin-top:.5rem}.vp-sidebar{position:fixed;top:0;bottom:0;inset-inline-start:0;z-index:1;overflow-y:auto;width:var(--sidebar-width);margin:0;padding-inline-start:calc(var(--sidebar-space) - var(--sidebar-width));background:var(--sidebar-bg-color);box-shadow:2px 0 8px var(--card-shadow);font-size:.94rem;transition:background var(--color-transition),box-shadow var(--color-transition),padding var(--transform-transition),transform var(--transform-transition);-webkit-backdrop-filter:saturate(150%) blur(12px);backdrop-filter:saturate(150%) blur(12px);scrollbar-color:var(--theme-color) var(--border-color);scrollbar-width:thin}@media (max-width:959px){.vp-sidebar{font-size:.86em}}@media (max-width:719px){.vp-sidebar{z-index:125;box-shadow:none;transform:translateX(-100%)}html[dir=rtl] .vp-sidebar{transform:translateX(100%)}}@media (min-width:1440px){.vp-sidebar{padding-bottom:3rem;box-shadow:none;font-size:1rem}}@media print{.vp-sidebar{display:none}}.vp-sidebar a{display:inline-block;color:var(--text-color);font-weight:400}.vp-sidebar .icon{margin-inline-end:.25em;font-size:1em}.vp-sidebar.hide-icon .icon{display:none!important}.vp-sidebar-mask{position:fixed;inset:0;z-index:9;background:rgba(0,0,0,.15)}.vp-sidebar-mask.fade-enter-active,.vp-sidebar-mask.fade-leave-active{transition:opacity .25s}.vp-sidebar-mask.fade-enter-from,.vp-sidebar-mask.fade-leave-to{opacity:0}.toc-place-holder{top:calc(var(--navbar-height) + 5rem)} diff --git a/assets/js/v-68effba0.67be698e.js b/assets/js/0_live_equipments.html.2a489b00.js similarity index 90% rename from assets/js/v-68effba0.67be698e.js rename to assets/js/0_live_equipments.html.2a489b00.js index f7e2c7aa7..df589fc7f 100644 --- a/assets/js/v-68effba0.67be698e.js +++ b/assets/js/0_live_equipments.html.2a489b00.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7364],{9720:(e,a)=>{a.c=(e,a)=>{const t=e.__vccOpts||e;for(const[e,n]of a)t[e]=n;return t}},8320:(e,a,t)=>{t.r(a),t.d(a,{comp:()=>m,data:()=>g});var n=t(3968);const l=(0,n.IL)('

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

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

    电脑

    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),r={href:"https://apps.apple.com/app/reincubate-camo/id1514199064?platform=iphone",target:"_blank",rel:"noopener noreferrer"},p=(0,n.QD)("h3",{id:"ndi",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#ndi"},[(0,n.QD)("span",null,"NDI")])],-1),i={href:"https://wwe.lanzoup.com/iQCMh00b946b",target:"_blank",rel:"noopener noreferrer"},o=(0,n.QD)("h3",{id:"ip-webcam",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#ip-webcam"},[(0,n.QD)("span",null,"IP Webcam")])],-1),c={href:"https://play.google.com/store/apps/details?id=com.pas.webcam",target:"_blank",rel:"noopener noreferrer"},s={href:"https://wwva.lanzouq.com/iQAFF1dic4qf",target:"_blank",rel:"noopener noreferrer"},h=(0,n.IL)('

    以下是 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),d={},m=(0,t(9720).c)(d,[["render",function(e,a){const t=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[l,(0,n.QD)("p",null,[(0,n.QD)("a",r,[(0,n.mY)("Camo"),(0,n.K2)(t)]),(0,n.mY)(" 专用于 iOS 设备,连接数据线后可将 iPhone 或 iPad 变为直播摄像头。")]),p,(0,n.QD)("p",null,[(0,n.mY)("NDI 是最稳定的,可自由调节拍摄参数。打开 NDI 应用后,需等待 NDI 界面周边出现绿框或红框,OBS 才可以识别到摄像头。不过 NDI 是收费应用,安卓用户可使用 "),(0,n.QD)("a",i,[(0,n.mY)("NDI 调试 APK"),(0,n.K2)(t)]),(0,n.mY)("。")]),o,(0,n.QD)("p",null,[(0,n.QD)("a",c,[(0,n.mY)("IP Webcam"),(0,n.K2)(t)]),(0,n.mY)(" 在推流稳定性方面表现一般,偶尔出现丢帧,但对于个人直播使用来说,免费版本已经足够。你可以在 Google Play 上安装它,或使用"),(0,n.QD)("a",s,[(0,n.mY)("国内的备用下载链接"),(0,n.K2)(t)]),(0,n.mY)("。")]),h])}]]),g=JSON.parse('{"path":"/apps/livestreaming/0_live_equipments.html","title":"直播入门攻略零 | 硬件篇:直播设备","lang":"zh-CN","frontmatter":{"title":"直播入门攻略零 | 硬件篇:直播设备","subtitle":"新手如何开直播?直播新手攻略:从小白入门到网红达人","category":["工具"],"tag":["直播"],"order":0.1,"description":"直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。 本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。 电脑...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/0_live_equipments.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略零 | 硬件篇:直播设备"}],["meta",{"property":"og:description","content":"直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。 本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。 电脑..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-06T02:43:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-11-06T02:43:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略零 | 硬件篇:直播设备\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2023-11-06T02:43:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"电脑","slug":"电脑","link":"#电脑","children":[]},{"level":2,"title":"补光灯","slug":"补光灯","link":"#补光灯","children":[]},{"level":2,"title":"三脚架","slug":"三脚架","link":"#三脚架","children":[]},{"level":2,"title":"音频采集","slug":"音频采集","link":"#音频采集","children":[]},{"level":2,"title":"视频采集","slug":"视频采集","link":"#视频采集","children":[{"level":3,"title":"摄像头","slug":"摄像头","link":"#摄像头","children":[]},{"level":3,"title":"手机","slug":"手机","link":"#手机","children":[]},{"level":3,"title":"相机","slug":"相机","link":"#相机","children":[]}]},{"level":2,"title":"手机作摄像头","slug":"手机作摄像头","link":"#手机作摄像头","children":[{"level":3,"title":"Camo","slug":"camo","link":"#camo","children":[]},{"level":3,"title":"NDI","slug":"ndi","link":"#ndi","children":[]},{"level":3,"title":"IP Webcam","slug":"ip-webcam","link":"#ip-webcam","children":[]},{"level":3,"title":"其他","slug":"其他","link":"#其他","children":[]}]}],"git":{"createdTime":1673542527000,"updatedTime":1699238582000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":5.37,"words":1611},"filePathRelative":"apps/livestreaming/0_live_equipments.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

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

    \\n

    电脑

    \\n

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

    \\n

    补光灯

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1871],{3671:(e,a)=>{a.A=(e,a)=>{const t=e.__vccOpts||e;for(const[e,n]of a)t[e]=n;return t}},8528:(e,a,t)=>{t.r(a),t.d(a,{comp:()=>m,data:()=>g});var n=t(7847);const l=(0,n.Fv)('

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

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

    电脑

    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),r={href:"https://apps.apple.com/app/reincubate-camo/id1514199064?platform=iphone",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Lk)("h3",{id:"ndi",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#ndi"},[(0,n.Lk)("span",null,"NDI")])],-1),i={href:"https://wwe.lanzoup.com/iQCMh00b946b",target:"_blank",rel:"noopener noreferrer"},o=(0,n.Lk)("h3",{id:"ip-webcam",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#ip-webcam"},[(0,n.Lk)("span",null,"IP Webcam")])],-1),c={href:"https://play.google.com/store/apps/details?id=com.pas.webcam",target:"_blank",rel:"noopener noreferrer"},s={href:"https://wwva.lanzouq.com/iQAFF1dic4qf",target:"_blank",rel:"noopener noreferrer"},h=(0,n.Fv)('

    以下是 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),d={},m=(0,t(3671).A)(d,[["render",function(e,a){const t=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[l,(0,n.Lk)("p",null,[(0,n.Lk)("a",r,[(0,n.eW)("Camo"),(0,n.bF)(t)]),(0,n.eW)(" 专用于 iOS 设备,连接数据线后可将 iPhone 或 iPad 变为直播摄像头。")]),p,(0,n.Lk)("p",null,[(0,n.eW)("NDI 是最稳定的,可自由调节拍摄参数。打开 NDI 应用后,需等待 NDI 界面周边出现绿框或红框,OBS 才可以识别到摄像头。不过 NDI 是收费应用,安卓用户可使用 "),(0,n.Lk)("a",i,[(0,n.eW)("NDI 调试 APK"),(0,n.bF)(t)]),(0,n.eW)("。")]),o,(0,n.Lk)("p",null,[(0,n.Lk)("a",c,[(0,n.eW)("IP Webcam"),(0,n.bF)(t)]),(0,n.eW)(" 在推流稳定性方面表现一般,偶尔出现丢帧,但对于个人直播使用来说,免费版本已经足够。你可以在 Google Play 上安装它,或使用"),(0,n.Lk)("a",s,[(0,n.eW)("国内的备用下载链接"),(0,n.bF)(t)]),(0,n.eW)("。")]),h])}]]),g=JSON.parse('{"path":"/apps/livestreaming/0_live_equipments.html","title":"直播入门攻略零 | 硬件篇:直播设备","lang":"zh-CN","frontmatter":{"title":"直播入门攻略零 | 硬件篇:直播设备","subtitle":"新手如何开直播?直播新手攻略:从小白入门到网红达人","category":["工具"],"tag":["直播"],"order":0.1,"description":"直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。 本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。 电脑...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/0_live_equipments.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略零 | 硬件篇:直播设备"}],["meta",{"property":"og:description","content":"直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。 本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。 电脑..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-06T02:43:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-11-06T02:43:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略零 | 硬件篇:直播设备\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2023-11-06T02:43:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"电脑","slug":"电脑","link":"#电脑","children":[]},{"level":2,"title":"补光灯","slug":"补光灯","link":"#补光灯","children":[]},{"level":2,"title":"三脚架","slug":"三脚架","link":"#三脚架","children":[]},{"level":2,"title":"音频采集","slug":"音频采集","link":"#音频采集","children":[]},{"level":2,"title":"视频采集","slug":"视频采集","link":"#视频采集","children":[{"level":3,"title":"摄像头","slug":"摄像头","link":"#摄像头","children":[]},{"level":3,"title":"手机","slug":"手机","link":"#手机","children":[]},{"level":3,"title":"相机","slug":"相机","link":"#相机","children":[]}]},{"level":2,"title":"手机作摄像头","slug":"手机作摄像头","link":"#手机作摄像头","children":[{"level":3,"title":"Camo","slug":"camo","link":"#camo","children":[]},{"level":3,"title":"NDI","slug":"ndi","link":"#ndi","children":[]},{"level":3,"title":"IP Webcam","slug":"ip-webcam","link":"#ip-webcam","children":[]},{"level":3,"title":"其他","slug":"其他","link":"#其他","children":[]}]}],"git":{"createdTime":1673542527000,"updatedTime":1699238582000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":5.37,"words":1611},"filePathRelative":"apps/livestreaming/0_live_equipments.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

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

    \\n

    电脑

    \\n

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

    \\n

    补光灯

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/1264.428a569a.js b/assets/js/1264.428a569a.js deleted file mode 100644 index db1fe8d08..000000000 --- a/assets/js/1264.428a569a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1264],{1264:(t,e,i)=>{i.r(e),i.d(e,{CaptionsRenderer:()=>s.C,ParseError:()=>s.P,ParseErrorCode:()=>s.c,TextCue:()=>s.T,VTTCue:()=>s.b,VTTRegion:()=>s.h,createVTTCueTemplate:()=>s.i,parseByteStream:()=>s.e,parseResponse:()=>s.d,parseText:()=>s.f,parseTextStream:()=>s.g,parseVTTTimestamp:()=>s.p,renderVTTCueString:()=>s.r,renderVTTTokensString:()=>s.j,tokenizeVTTCue:()=>s.t,updateTimedVTTCueNodes:()=>s.u});var s=i(6632)},6632:(t,e,i)=>{i.d(e,{C:()=>ft,P:()=>n,T:()=>d,V:()=>z,a:()=>$,b:()=>g,c:()=>s,d:()=>h,e:()=>u,f:()=>l,g:()=>c,h:()=>m,i:()=>D,j:()=>J,p:()=>M,r:()=>G,t:()=>W,u:()=>K});const s={LoadFail:0,BadSignature:1,BadTimestamp:2,BadSettingValue:3,BadFormat:4,UnknownSetting:5};class n extends Error{code;line;constructor(t){super(t.reason),this.code=t.code,this.line=t.line}}const r=/\r?\n|\r/gm;class o{writable;readable;constructor(t){const e=new a(t);this.writable=new WritableStream({write(t){e.transform(t)},close(){e.close()}}),this.readable=new ReadableStream({start(t){e.onLine=e=>t.enqueue(e),e.onClose=()=>t.close()}})}}class a{x="";y;onLine;onClose;constructor(t){this.y=new TextDecoder(t)}transform(t){this.x+=this.y.decode(t,{stream:!0});const e=this.x.split(r);this.x=e.pop()||"";for(let t=0;t=0&&e<=100?e:null}function v(t){if(!t.includes(","))return null;const[e,i]=t.split(",").map(y);return null!==e&&null!==i?[e,i]:null}function T(t){const e=parseFloat(t);return Number.isNaN(e)?null:e}const x=/[:=]/,k=/^[\s\t]*(region|vertical|line|position|size|align)[:=]/,A=/^REGION:?[\s\t]+/,C=/[\s\t]+/,E=/[\s\t]*-->[\s\t]+/,N=/start|center|end|left|right/,j=/start|center|end/,L=/line-(?:left|right)|center|auto/,S=/^(?:(\d{1,2}):)?(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;var $=(t=>(t[t.None=0]="None",t[t.Header=1]="Header",t[t.Cue=2]="Cue",t[t.Region=3]="Region",t[t.Note=4]="Note",t))($||{});class z{f;c=0;g={};h={};j=[];a=null;b=null;k=[];d;l="";async init(t){this.f=t,t.strict&&(this.c=1),t.errors&&(this.d=(await i.e(1256).then(i.bind(i,1256))).ParseErrorBuilder)}parse(t,e){if(""===t)this.a?(this.j.push(this.a),this.f.onCue?.(this.a),this.a=null):this.b?(this.h[this.b.id]=this.b,this.f.onRegion?.(this.b),this.b=null):1===this.c&&(this.i(t,e),this.f.onHeaderMetadata?.(this.g)),this.c=0;else if(this.c)switch(this.c){case 1:this.i(t,e);break;case 2:if(this.a){const i=this.a.text.length>0;!i&&k.test(t)?this.m(t.split(C),e):this.a.text+=(i?"\n":"")+t}break;case 3:this.n(t.split(C),e)}else if(t.startsWith("NOTE"))this.c=4;else if(t.startsWith("REGION"))this.c=3,this.b=new m,this.n(t.replace(A,"").split(C),e);else if(t.includes("--\x3e")){const i=this.o(t,e);i&&(this.a=new g(i[0],i[1],""),this.a.id=this.l,this.m(i[2],e)),this.c=2}else 1===e&&this.i(t,e);this.l=t}done(){return{metadata:this.g,cues:this.j,regions:Object.values(this.h),errors:this.k}}i(t,e){if(e>1){if(x.test(t)){const[e,i]=t.split(x);e&&(this.g[e]=(i||"").replace(C,""))}}else t.startsWith("WEBVTT")?this.c=1:this.e(this.d?.p())}o(t,e){const[i,s=""]=t.split(E),[n,...r]=s.split(C),o=M(i),a=M(n);if(null!==o&&null!==a&&a>o)return[o,a,r];null===o&&this.e(this.d?.q(i,e)),null===a&&this.e(this.d?.r(n,e)),null!=o&&null!==a&&a>o&&this.e(this.d?.s(o,a,e))}n(t,e){let i;for(let s=0;s59||n>59?null:3600*i+60*s+n+r/1e3}var V=Object.freeze({__proto__:null,VTTBlock:$,VTTParser:z,default:function(){return new z},parseVTTTimestamp:M});const B=/[0-9]/,H=/[\s\t]+/,R={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span",timestamp:"span"},F={"&":"&","<":"<",">":">",""":'"',"'":"'"," ":" ","‎":"‎","‏":"‏"},I=/&(?:amp|lt|gt|quot|#(0+)?39|nbsp|lrm|rlm);/g,O=new Set(["white","lime","cyan","red","yellow","magenta","blue","black"]),P=new Set(Object.keys(R));function W(t){let e,i="",s=1,n=[],r=[];for(let n=0;n":o(),s=1;break;default:!i&&B.test(c)&&(s=6),i+=c}break;case 3:switch(c){case"\t":case" ":case"\n":a(),e&&e.class?.trim(),s=4;break;case".":a();break;case">":a(),e&&e.class?.trim(),s=1;break;default:i+=c}break;case 4:">"===c?(i=i.replace(H," "),"v"===e?.type?e.voice=q(i):"lang"===e?.type&&(e.lang=q(i)),i="",s=1):i+=c;break;case 5:">"===c&&(i="",e=r.pop(),s=1);break;case 6:if(">"===c){const n=M(i);null!==n&&n>=t.startTime&&n<=t.endTime&&(i="timestamp",o(),e.time=n),i="",s=1}else i+=c}}function o(){if(P.has(i)){const s=e;e={tagName:R[t=i],type:t,children:[]},s?(r[r.length-1]!==s&&r.push(s),s.children.push(e)):n.push(e)}var t;i="",s=1}function a(){if(e&&i){const t=i.replace("bg_","");O.has(t)?e[i.startsWith("bg_")?"bgColor":"color"]=t:e.class=e.class?e.class+" "+i:i}i=""}function l(){if(!i)return;const t={type:"text",data:q(i)};e?e.children.push(t):n.push(t),i=""}return 1===s&&l(),n}function q(t){return t.replace(I,(t=>F[t]||"'"))}function _(t,e,i){t.style.setProperty(`--${e}`,i+"")}function X(t,e,i=!0){t.setAttribute(`data-${e}`,!0===i?"":i+"")}function Y(t,e){t.setAttribute("data-part",e)}function D(t){if(f)throw Error("[media-captions] called `createVTTCueTemplate` on the server - use `renderVTTCueString`");const e=document.createElement("template");return e.innerHTML=G(t),{cue:t,content:e.content}}function G(t,e=0){return J(W(t),e)}function J(t,e=0){let i,s="";for(const n of t)if("text"===n.type)s+=n.data;else{const t="timestamp"===n.type;i={},i.class=n.class,i.title="v"===n.type&&n.voice,i.lang="lang"===n.type&&n.lang,i["data-part"]="v"===n.type&&"voice",t&&(i["data-part"]="timed",i["data-time"]=n.time,i["data-future"]=n.time>e,i["data-past"]=n.timet[1])).map((t=>`${t[0]}="${!0===t[1]?"":t[1]}"`)).join(" ");s+=`<${n.tagName}${r?" "+r:""}>${J(n.children)}`}return s}function K(t,e){if(!f)for(const i of t.querySelectorAll('[data-part="timed"]')){const t=Number(i.getAttribute("data-time"));Number.isNaN(t)||(t>e?X(i,"future"):i.removeAttribute("data-future"),t=s.left&&i.top<=s.bottom&&i.bottom>=s.top)return e[n];var i,s;return null}function et(t,e){return e.top>=0&&e.bottom<=t.height&&e.left>=0&&e.right<=t.width}function it(t,e,i){switch(i){case"+x":return e.left<0;case"-x":return e.right>t.width;case"+y":return e.top<0;case"-y":return e.bottom>t.height}}function st(t,e){return Math.max(0,Math.min(t.width,e.right)-Math.max(0,e.left))*Math.max(0,Math.min(t.height,e.bottom)-Math.max(0,e.top))/(t.height*t.width)}function nt(t,e){return{top:e.top/t.height,left:e.left/t.width,right:(t.width-e.right)/t.width,bottom:(t.height-e.bottom)/t.height}}function rt(t,e){return e.top=e.top*t.height,e.left=e.left*t.width,e.right=t.width-e.right*t.width,e.bottom=t.height-e.bottom*t.height,e}const ot=["top","left","right","bottom"];function at(t,e,i,s){const n=nt(e,i);for(const e of ot)_(t,`${s}-${e}`,100*n[e]+"%")}function lt(t,e,i,s){let n,r=1,o={...e};for(let a=0;al&&(n={...e},r=l),e={...o}}return n||o}const ct=Symbol(0);function ht(t,e,i,s){let n,r=i.firstElementChild,o=function(t){return"auto"===t.line?t.snapToLines?-1:100:t.line}(e),a=[];if(i[U]||(i[U]=function(t,e){const i=Q(e),s=function(t){const e={};for(const i of ot)e[i]=parseFloat(t.style.getPropertyValue(`--cue-${i}`));return e}(e);if(e[ct]=!1,s.top&&(i.top=s.top,i.bottom=s.top+i.height,e[ct]="top"),s.bottom){const n=t.height-s.bottom;i.top=n-i.height,i.bottom=n,e[ct]="bottom"}return s.left&&(i.left=s.left),s.right&&(i.right=t.width-s.right),nt(t,i)}(t,i)),n=rt(t,{...i[U]}),i[ct])a=["top"===i[ct]?"+y":"-y","+x","-x"];else if(e.snapToLines){let i;switch(e.vertical){case"":a=["+y","-y"],i="height";break;case"rl":a=["+x","-x"],i="width";break;case"lr":a=["-x","+x"],i="width"}let s=parseFloat(getComputedStyle(r).lineHeight)||0,l=s*Math.round(o),c=t[i]+s,h=a[0];Math.abs(l)>c&&(l=l<0?-1:1,l*=Math.ceil(c/s)*s),o<0&&(l+=""===e.vertical?t.height:t.width,a=a.reverse()),Z(n,h,l)}else{const i=""===e.vertical,s=i?"+y":"+x",r=i?n.height:n.width;Z(n,s,(i?t.height:t.width)*o/100),Z(n,s,"center"===e.lineAlign?r/2:"end"===e.lineAlign?r:0),a=i?["-y","+y","-x","+x"]:["-x","+x","-y","+y"]}return n=lt(t,n,s,a),at(i,t,n,"cue"),n}const ut=["-y","+y","-x","+x"];function dt(t,e,i,s){let n=Array.from(i.querySelectorAll('[data-part="cue-display"]')),r=0,o=Math.max(0,n.length-e.lines);for(let t=n.length-1;t>=o;t--)r+=n[t].offsetHeight;_(i,"region-height",r+"px"),i[U]||(i[U]=nt(t,Q(i)));let a={...i[U]};return a=rt(t,a),a.width=i.clientWidth,a.height=r,a.right=a.left+a.width,a.bottom=a.top+r,a=lt(t,a,s,ut),at(i,t,a,"region"),a}class ft{overlay;z;A=0;C="ltr";B=[];D=!1;E;h=new Map;j=new Map;get dir(){return this.C}set dir(t){this.C=t,X(this.overlay,"dir",t)}get currentTime(){return this.A}set currentTime(t){this.A=t,this.update()}constructor(t,e){this.overlay=t,this.dir=e?.dir??"ltr",t.setAttribute("translate","yes"),t.setAttribute("aria-live","off"),t.setAttribute("aria-atomic","true"),Y(t,"captions"),this.G(),this.E=new ResizeObserver(this.I.bind(this)),this.E.observe(t)}changeTrack({regions:t,cues:e}){this.reset(),this.J(t);for(const t of e)this.j.set(t,null);this.update()}addCue(t){this.j.set(t,null),this.update()}removeCue(t){this.j.delete(t),this.update()}update(t=!1){this.H(t)}reset(){this.j.clear(),this.h.clear(),this.B=[],this.overlay.textContent=""}destroy(){this.reset(),this.E.disconnect()}I(){this.D=!0,this.K()}K=function(t,e){let i,s=null;function n(){r(),t(...i),i=void 0}function r(){clearTimeout(s),s=null}return function(){i=[].slice.call(arguments),r(),s=setTimeout(n,50)}}((()=>{this.D=!1,this.G();for(const t of this.h.values())t[U]=null;for(const t of this.j.values())t&&(t[U]=null);this.H(!0)}));G(){this.z=Q(this.overlay),_(this.overlay,"overlay-width",this.z.width+"px"),_(this.overlay,"overlay-height",this.z.height+"px")}H(t=!1){if(!this.j.size||this.D)return;let e,i=[...this.j.keys()].filter((t=>this.A>=t.startTime&&this.A<=t.endTime)).sort(((t,e)=>t.startTime!==e.startTime?t.startTime-e.startTime:t.endTime-e.endTime)),s=i.map((t=>t.region));for(let n=0;nX(r,"active"))),t=!0),n.isConnected||((r||this.overlay).append(n),t=!0)}if(t){const t=[],s=new Set;for(let n=i.length-1;n>=0;n--){if(e=i[n],s.has(e.region||e))continue;const r=this.F(e),o=r?this.h.get(e.region.id):this.j.get(e);r?t.push(dt(this.z,e.region,o,t)):t.push(ht(this.z,e,o,t)),s.add(r?e.region:e)}}K(this.overlay,this.A),this.B=i}J(t){if(t)for(const e of t){const t=this.M(e);this.h.set(e.id,t),this.overlay.append(t)}}M(t){const e=document.createElement("div");return Y(e,"region"),X(e,"id",t.id),X(e,"scroll",t.scroll),_(e,"region-width",t.width+"%"),_(e,"region-anchor-x",t.regionAnchorX),_(e,"region-anchor-y",t.regionAnchorY),_(e,"region-viewport-anchor-x",t.viewportAnchorX),_(e,"region-viewport-anchor-y",t.viewportAnchorY),_(e,"region-lines",t.lines),e}L(t){const e=document.createElement("div"),i=function(t){if("auto"===t.position)switch(t.align){case"start":case"left":return 0;case"right":case"end":return 100;default:return 50}return t.position}(t),s=function(t,e){if("auto"===t.positionAlign)switch(t.align){case"start":return"ltr"===e?"line-left":"line-right";case"end":return"ltr"===e?"line-right":"line-left";case"center":return"center";default:return`line-${t.align}`}return t.positionAlign}(t,this.C);if(Y(e,"cue-display"),""!==t.vertical&&X(e,"vertical"),_(e,"cue-text-align",t.align),t.style)for(const i of Object.keys(t.style))e.style.setProperty(i,t.style[i]);if(this.F(t))_(e,"cue-offset",i-("line-right"===s?100:"center"===s?50:0)+"%");else if(_(e,"cue-writing-mode",""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl"),!t.style?.["--cue-width"]){let n=i;"line-left"===s?n=100-i:"center"===s&&i<=50?n=2*i:"center"===s&&i>50&&(n=2*(100-i));const r=t.size{t.AJ=void 0;var l=n(9200);Object.defineProperty(t,"AJ",{enumerable:!0,get:function(){return l.load}});n(6184)},6184:function(e,t){var n=this&&this.__awaiter||function(e,t,n,l){return new(n||(n=Promise))((function(r,i){function a(e){try{o(l.next(e))}catch(e){i(e)}}function s(e){try{o(l.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}o((l=l.apply(e,t||[])).next())}))},l=this&&this.__generator||function(e,t){var n,l,r,i,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,l&&(r=2&i[0]?l.return:i[0]?l.throw||((r=l.return)&&r.call(l),0):l.next)&&!(r=r.call(l,i[1])).done)return r;switch(l=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,l=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((r=(r=a.trys).length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]{Object.defineProperty(t,"__esModule",{value:!0}),t.getInstance=t.load=void 0;var l,r=n(6184);!function(e){e[e.NOT_LOADED=0]="NOT_LOADED",e[e.LOADING=1]="LOADING",e[e.LOADED=2]="LOADED"}(l||(l={}));var i=function(){function e(){}return e.load=function(t,n){if(void 0===n&&(n={}),"undefined"==typeof document)return Promise.reject(new Error("This is a library for the browser!"));if(e.getLoadingState()===l.LOADED)return e.instance.getSiteKey()===t?Promise.resolve(e.instance):Promise.reject(new Error("reCAPTCHA already loaded with different site key!"));if(e.getLoadingState()===l.LOADING)return t!==e.instanceSiteKey?Promise.reject(new Error("reCAPTCHA already loaded with different site key!")):new Promise((function(t,n){e.successfulLoadingConsumers.push((function(e){return t(e)})),e.errorLoadingRunnable.push((function(e){return n(e)}))}));e.instanceSiteKey=t,e.setLoadingState(l.LOADING);var i=new e;return new Promise((function(a,s){i.loadScript(t,n.useRecaptchaNet||!1,n.useEnterprise||!1,n.renderParameters?n.renderParameters:{},n.customUrl).then((function(){e.setLoadingState(l.LOADED);var s=i.doExplicitRender(grecaptcha,t,n.explicitRenderParameters?n.explicitRenderParameters:{},n.useEnterprise||!1),o=new r.ReCaptchaInstance(t,s,grecaptcha);e.successfulLoadingConsumers.forEach((function(e){return e(o)})),e.successfulLoadingConsumers=[],n.autoHideBadge&&o.hideBadge(),e.instance=o,a(o)})).catch((function(t){e.errorLoadingRunnable.forEach((function(e){return e(t)})),e.errorLoadingRunnable=[],s(t)}))}))},e.getInstance=function(){return e.instance},e.setLoadingState=function(t){e.loadingState=t},e.getLoadingState=function(){return null===e.loadingState?l.NOT_LOADED:e.loadingState},e.prototype.loadScript=function(t,n,r,i,a){var s=this;void 0===n&&(n=!1),void 0===r&&(r=!1),void 0===i&&(i={}),void 0===a&&(a="");var o=document.createElement("script");o.setAttribute("recaptcha-v3-script","");var c="https://www.google.com/recaptcha/api.js";n&&(c=r?"https://recaptcha.net/recaptcha/enterprise.js":"https://recaptcha.net/recaptcha/api.js"),r&&(c="https://www.google.com/recaptcha/enterprise.js"),a&&(c=a),i.render&&(i.render=void 0);var u=this.buildQueryString(i);return o.src=c+"?render=explicit"+u,new Promise((function(t,n){o.addEventListener("load",s.waitForScriptToLoad((function(){t(o)}),r),!1),o.onerror=function(t){e.setLoadingState(l.NOT_LOADED),n(t)},document.head.appendChild(o)}))},e.prototype.buildQueryString=function(e){return Object.keys(e).length<1?"":"&"+Object.keys(e).filter((function(t){return!!e[t]})).map((function(t){return t+"="+e[t]})).join("&")},e.prototype.waitForScriptToLoad=function(t,n){var l=this;return function(){void 0===window.grecaptcha?setTimeout((function(){l.waitForScriptToLoad(t,n)}),e.SCRIPT_LOAD_DELAY):n?window.grecaptcha.enterprise.ready((function(){t()})):window.grecaptcha.ready((function(){t()}))}},e.prototype.doExplicitRender=function(e,t,n,l){var r={sitekey:t,badge:n.badge,size:n.size,tabindex:n.tabindex};return n.container?l?e.enterprise.render(n.container,r):e.render(n.container,r):l?e.enterprise.render(r):e.render(r)},e.loadingState=null,e.instance=null,e.instanceSiteKey=null,e.successfulLoadingConsumers=[],e.errorLoadingRunnable=[],e.SCRIPT_LOAD_DELAY=25,e}();t.load=i.load,t.getInstance=i.getInstance},1600:(e,t,n)=>{n.r(t),n.d(t,{Waline:()=>Sl,version:()=>gl});var l=n(3968),r=n(6432),i=n(4256),a=n(2920),s=n(1804),o=n(8890);const c={"Content-Type":"application/json"},u=e=>`${e.replace(/\/?$/,"/")}api/`,h=(e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},p=({serverURL:e,lang:t,path:n,type:l,action:r})=>fetch(`${u(e)}article?lang=${t}`,{method:"POST",headers:c,body:JSON.stringify({path:n,type:l,action:r})}).then((e=>e.json())).then((e=>h(e,"Update counter").data)),d=({serverURL:e,lang:t,token:n,objectId:l,comment:r})=>fetch(`${u(e)}comment/${l}?lang=${t}`,{method:"PUT",headers:{...c,Authorization:`Bearer ${n}`},body:JSON.stringify(r)}).then((e=>e.json())).then((e=>h(e,"Update comment")));var g=new Map;function m(e){var t=g.get(e);t&&t.destroy()}function f(e){var t=g.get(e);t&&t.update()}var v=null;"undefined"==typeof window?((v=function(e){return e}).destroy=function(e){return e},v.update=function(e){return e}):((v=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],(function(e){return function(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!g.has(e)){var t,n=null,l=window.getComputedStyle(e),r=(t=e.value,function(){a({testForHeightReduction:""===t||!e.value.startsWith(t),restoreTextAlign:null}),t=e.value}),i=function(t){e.removeEventListener("autosize:destroy",i),e.removeEventListener("autosize:update",s),e.removeEventListener("input",r),window.removeEventListener("resize",s),Object.keys(t).forEach((function(n){return e.style[n]=t[n]})),g.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",i),e.addEventListener("autosize:update",s),e.addEventListener("input",r),window.addEventListener("resize",s),e.style.overflowX="hidden",e.style.wordWrap="break-word",g.set(e,{destroy:i,update:s}),s()}function a(t){var r,i,s=t.restoreTextAlign,o=void 0===s?null:s,c=t.testForHeightReduction,u=void 0===c||c,h=l.overflowY;if(0!==e.scrollHeight&&("vertical"===l.resize?e.style.resize="none":"both"===l.resize&&(e.style.resize="horizontal"),u&&(r=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push([e.parentNode,e.parentNode.scrollTop]),e=e.parentNode;return function(){return t.forEach((function(e){var t=e[0],n=e[1];t.style.scrollBehavior="auto",t.scrollTop=n,t.style.scrollBehavior=null}))}}(e),e.style.height=""),i="content-box"===l.boxSizing?e.scrollHeight-(parseFloat(l.paddingTop)+parseFloat(l.paddingBottom)):e.scrollHeight+parseFloat(l.borderTopWidth)+parseFloat(l.borderBottomWidth),"none"!==l.maxHeight&&i>parseFloat(l.maxHeight)?("hidden"===l.overflowY&&(e.style.overflow="scroll"),i=parseFloat(l.maxHeight)):"hidden"!==l.overflowY&&(e.style.overflow="hidden"),e.style.height=i+"px",o&&(e.style.textAlign=o),r&&r(),n!==i&&(e.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),n=i),h!==l.overflow&&!o)){var p=l.textAlign;"hidden"===l.overflow&&(e.style.textAlign="start"===p?"end":"start"),a({restoreTextAlign:p,testForHeightReduction:!0})}}function s(){a({testForHeightReduction:!0,restoreTextAlign:null})}}(e)})),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],m),e},v.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],f),e});const k=v;let w={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};function y(e){w=e}const b=/[&<>"']/,x=new RegExp(b.source,"g"),A=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,z=new RegExp(A.source,"g"),$={"&":"&","<":"<",">":">",'"':""","'":"'"},C=e=>$[e];function L(e,t){if(t){if(b.test(e))return e.replace(x,C)}else if(A.test(e))return e.replace(z,C);return e}const I=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function R(e){return e.replace(I,((e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}const E=/(^|[^\[])\^/g;function S(e,t){let n="string"==typeof e?e:e.source;t=t||"";const l={replace:(e,t)=>{let r="string"==typeof t?t:t.source;return r=r.replace(E,"$1"),n=n.replace(e,r),l},getRegex:()=>new RegExp(n,t)};return l}function W(e){try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return null}return e}const _={exec:()=>null};function T(e,t){const n=e.replace(/\|/g,((e,t,n)=>{let l=!1,r=t;for(;--r>=0&&"\\"===n[r];)l=!l;return l?"|":" |"})).split(/ \|/);let l=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:D(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t){const n=e.match(/^(\s+)(?:```)/);if(null===n)return t;const l=n[1];return t.split("\n").map((e=>{const t=e.match(/^\s+/);if(null===t)return e;const[n]=t;return n.length>=l.length?e.slice(l.length):e})).join("\n")}(e,t[3]||"");return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){const t=D(e,"#");this.options.pedantic?e=t.trim():t&&!/ $/.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){const e=D(t[0].replace(/^ *>[ \t]?/gm,""),"\n"),n=this.lexer.state.top;this.lexer.state.top=!0;const l=this.lexer.blockTokens(e);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:l,text:e}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim();const l=n.length>1,r={type:"list",raw:"",ordered:l,start:l?+n.slice(0,-1):"",loose:!1,items:[]};n=l?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=l?n:"[*+-]");const i=new RegExp(`^( {0,3}${n})((?:[\t ][^\\n]*)?(?:\\n|$))`);let a="",s="",o=!1;for(;e;){let n=!1;if(!(t=i.exec(e)))break;if(this.rules.block.hr.test(e))break;a=t[0],e=e.substring(a.length);let l=t[2].split("\n",1)[0].replace(/^\t+/,(e=>" ".repeat(3*e.length))),c=e.split("\n",1)[0],u=0;this.options.pedantic?(u=2,s=l.trimStart()):(u=t[2].search(/[^ ]/),u=u>4?1:u,s=l.slice(u),u+=t[1].length);let h=!1;if(!l&&/^ *$/.test(c)&&(a+=c+"\n",e=e.substring(c.length+1),n=!0),!n){const t=new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),n=new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),r=new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\`\`\`|~~~)`),i=new RegExp(`^ {0,${Math.min(3,u-1)}}#`);for(;e;){const o=e.split("\n",1)[0];if(c=o,this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),r.test(c))break;if(i.test(c))break;if(t.test(c))break;if(n.test(e))break;if(c.search(/[^ ]/)>=u||!c.trim())s+="\n"+c.slice(u);else{if(h)break;if(l.search(/[^ ]/)>=4)break;if(r.test(l))break;if(i.test(l))break;if(n.test(l))break;s+="\n"+c}h||c.trim()||(h=!0),a+=o+"\n",e=e.substring(o.length+1),l=c.slice(u)}}r.loose||(o?r.loose=!0:/\n *\n *$/.test(a)&&(o=!0));let p,d=null;this.options.gfm&&(d=/^\[[ xX]\] /.exec(s),d&&(p="[ ] "!==d[0],s=s.replace(/^\[[ xX]\] +/,""))),r.items.push({type:"list_item",raw:a,task:!!d,checked:p,loose:!1,text:s,tokens:[]}),r.raw+=a}r.items[r.items.length-1].raw=a.trimEnd(),r.items[r.items.length-1].text=s.trimEnd(),r.raw=r.raw.trimEnd();for(let e=0;e"space"===e.type)),n=t.length>0&&t.some((e=>/\n.*\n/.test(e.raw)));r.loose=n}if(r.loose)for(let e=0;e$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",l=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:l}}}table(e){const t=this.rules.block.table.exec(e);if(!t)return;if(!/[:|]/.test(t[2]))return;const n=T(t[1]),l=t[2].replace(/^\||\| *$/g,"").split("|"),r=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[],i={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===l.length){for(const e of l)/^ *-+: *$/.test(e)?i.align.push("right"):/^ *:-+: *$/.test(e)?i.align.push("center"):/^ *:-+ *$/.test(e)?i.align.push("left"):i.align.push(null);for(const e of n)i.header.push({text:e,tokens:this.lexer.inline(e)});for(const e of r)i.rows.push(T(e,i.header.length).map((e=>({text:e,tokens:this.lexer.inline(e)}))));return i}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const e="\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:L(t[1])}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;const t=D(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let l=0;l-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],l="";if(this.options.pedantic){const e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],l=e[3])}else l=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^$/.test(e)?n.slice(1):n.slice(1,-1)),j(t,{href:n?n.replace(this.rules.inline.anyPunctuation,"$1"):n,title:l?l.replace(this.rules.inline.anyPunctuation,"$1"):l},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const e=t[(n[2]||n[1]).replace(/\s+/g," ").toLowerCase()];if(!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return j(n,e,n[0],this.lexer)}}emStrong(e,t,n=""){let l=this.rules.inline.emStrongLDelim.exec(e);if(l&&(!l[3]||!n.match(/[\p{L}\p{N}]/u))&&(!l[1]&&!l[2]||!n||this.rules.inline.punctuation.exec(n))){const n=[...l[0]].length-1;let r,i,a=n,s=0;const o="*"===l[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(o.lastIndex=0,t=t.slice(-1*e.length+n);null!=(l=o.exec(t));){if(r=l[1]||l[2]||l[3]||l[4]||l[5]||l[6],!r)continue;if(i=[...r].length,l[3]||l[4]){a+=i;continue}if((l[5]||l[6])&&n%3&&!((n+i)%3)){s+=i;continue}if(a-=i,a>0)continue;i=Math.min(i,i+a+s);const t=[...l[0]][0].length,o=e.slice(0,n+l.index+t+i);if(Math.min(n,i)%2){const e=o.slice(1,-1);return{type:"em",raw:o,text:e,tokens:this.lexer.inlineTokens(e)}}const c=o.slice(2,-2);return{type:"strong",raw:o,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g," ");const n=/[^ ]/.test(e),l=/^ /.test(e)&&/ $/.test(e);return n&&l&&(e=e.substring(1,e.length-1)),e=L(e,!0),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=L(t[1]),n="mailto:"+e):(e=L(t[1]),n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=L(t[0]),n="mailto:"+e;else{let l;do{l=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??""}while(l!==t[0]);e=L(t[0]),n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){let e;return e=this.lexer.state.inRawBlock?t[0]:L(t[0]),{type:"text",raw:t[0],text:e}}}}const V=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,U=/(?:[*+-]|\d{1,9}[.)])/,K=S(/^(?!bull )((?:.|\n(?!\s*?\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,U).getRegex(),P=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,H=/(?!\s*\])(?:\\.|[^\[\]\\])+/,Q=S(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",H).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),N=S(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,U).getRegex(),O="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",B=/|$)/,q=S("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",B).replace("tag",O).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),F=S(P).replace("hr",V).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",O).getRegex(),Z={blockquote:S(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",F).getRegex(),code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,def:Q,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:V,html:q,lheading:K,list:N,newline:/^(?: *(?:\n|$))+/,paragraph:F,table:_,text:/^[^\n]+/},Y=S("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",V).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",O).getRegex(),G={...Z,table:Y,paragraph:S(P).replace("hr",V).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Y).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",O).getRegex()},X={...Z,html:S("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",B).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:_,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:S(P).replace("hr",V).replace("heading"," *#{1,6} *[^\n]").replace("lheading",K).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},J=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ee=/^( {2,}|\\)\n(?!\s*$)/,te="\\p{P}$+<=>`^|~",ne=S(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,te).getRegex(),le=S(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,te).getRegex(),re=S("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,te).getRegex(),ie=S("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,te).getRegex(),ae=S(/\\([punct])/,"gu").replace(/punct/g,te).getRegex(),se=S(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),oe=S(B).replace("(?:--\x3e|$)","--\x3e").getRegex(),ce=S("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",oe).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ue=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,he=S(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",ue).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),pe=S(/^!?\[(label)\]\[(ref)\]/).replace("label",ue).replace("ref",H).getRegex(),de=S(/^!?\[(ref)\](?:\[\])?/).replace("ref",H).getRegex(),ge={_backpedal:_,anyPunctuation:ae,autolink:se,blockSkip:/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,br:ee,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:_,emStrongLDelim:le,emStrongRDelimAst:re,emStrongRDelimUnd:ie,escape:J,link:he,nolink:de,punctuation:ne,reflink:pe,reflinkSearch:S("reflink|nolink(?!\\()","g").replace("reflink",pe).replace("nolink",de).getRegex(),tag:ce,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\t+" ".repeat(n.length)));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((l=>!!(n=l.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.space(e))e=e.substring(n.raw.length),1===n.raw.length&&t.length>0?t[t.length-1].raw+="\n":t.push(n);else if(n=this.tokenizer.code(e))e=e.substring(n.raw.length),l=t[t.length-1],!l||"paragraph"!==l.type&&"text"!==l.type?t.push(n):(l.raw+="\n"+n.raw,l.text+="\n"+n.text,this.inlineQueue[this.inlineQueue.length-1].src=l.text);else if(n=this.tokenizer.fences(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.heading(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.hr(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.blockquote(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.list(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.html(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.def(e))e=e.substring(n.raw.length),l=t[t.length-1],!l||"paragraph"!==l.type&&"text"!==l.type?this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title}):(l.raw+="\n"+n.raw,l.text+="\n"+n.raw,this.inlineQueue[this.inlineQueue.length-1].src=l.text);else if(n=this.tokenizer.table(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.lheading(e))e=e.substring(n.raw.length),t.push(n);else{if(r=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let l;this.options.extensions.startBlock.forEach((e=>{l=e.call({lexer:this},n),"number"==typeof l&&l>=0&&(t=Math.min(t,l))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(this.state.top&&(n=this.tokenizer.paragraph(r)))l=t[t.length-1],i&&"paragraph"===l.type?(l.raw+="\n"+n.raw,l.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=l.text):t.push(n),i=r.length!==e.length,e=e.substring(n.raw.length);else if(n=this.tokenizer.text(e))e=e.substring(n.raw.length),l=t[t.length-1],l&&"text"===l.type?(l.raw+="\n"+n.raw,l.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=l.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,l,r,i,a,s,o=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(o));)e.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(o=o.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(o));)o=o.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.anyPunctuation.exec(o));)o=o.slice(0,i.index)+"++"+o.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(a||(s=""),a=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((l=>!!(n=l.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),l=t[t.length-1],l&&"text"===n.type&&"text"===l.type?(l.raw+=n.raw,l.text+=n.text):t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),l=t[t.length-1],l&&"text"===n.type&&"text"===l.type?(l.raw+=n.raw,l.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,o,s))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e))){if(r=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let l;this.options.extensions.startInline.forEach((e=>{l=e.call({lexer:this},n),"number"==typeof l&&l>=0&&(t=Math.min(t,l))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(r))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(s=n.raw.slice(-1)),a=!0,l=t[t.length-1],l&&"text"===l.type?(l.raw+=n.raw,l.text+=n.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(n.raw.length),t.push(n);return t}}class be{options;constructor(e){this.options=e||w}code(e,t,n){const l=(t||"").match(/^\S*/)?.[0];return e=e.replace(/\n$/,"")+"\n",l?'
    '+(n?e:L(e,!0))+"
    \n":"
    "+(n?e:L(e,!0))+"
    \n"}blockquote(e){return`
    \n${e}
    \n`}html(e,t){return e}heading(e,t,n){return`${e}\n`}hr(){return"
    \n"}list(e,t,n){const l=t?"ol":"ul";return"<"+l+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"}listitem(e,t,n){return`
  • ${e}
  • \n`}checkbox(e){return"'}paragraph(e){return`

    ${e}

    \n`}table(e,t){return t&&(t=`${t}`),"\n\n"+e+"\n"+t+"
    \n"}tablerow(e){return`\n${e}\n`}tablecell(e,t){const n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`\n`}strong(e){return`${e}`}em(e){return`${e}`}codespan(e){return`${e}`}br(){return"
    "}del(e){return`${e}`}link(e,t,n){const l=W(e);if(null===l)return n;let r='
    ",r}image(e,t,n){const l=W(e);if(null===l)return n;let r=`${n}0&&"paragraph"===n.tokens[0].type?(n.tokens[0].text=e+" "+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&"text"===n.tokens[0].tokens[0].type&&(n.tokens[0].tokens[0].text=e+" "+n.tokens[0].tokens[0].text)):n.tokens.unshift({type:"text",text:e+" "}):s+=e+" "}s+=this.parse(n.tokens,i),a+=this.renderer.listitem(s,r,!!l)}n+=this.renderer.list(a,t,l);continue}case"html":{const e=r;n+=this.renderer.html(e.text,e.block);continue}case"paragraph":{const e=r;n+=this.renderer.paragraph(this.parseInline(e.tokens));continue}case"text":{let i=r,a=i.tokens?this.parseInline(i.tokens):i.text;for(;l+1{const r=e[l].flat(1/0);n=n.concat(this.walkTokens(r,t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{const n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){const n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let l=e.renderer.apply(this,t);return!1===l&&(l=n.apply(this,t)),l}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");const n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){const t=this.defaults.renderer||new be(this.defaults);for(const n in e.renderer){if(!(n in t))throw new Error(`renderer '${n}' does not exist`);if("options"===n)continue;const l=n,r=e.renderer[l],i=t[l];t[l]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){const t=this.defaults.tokenizer||new M(this.defaults);for(const n in e.tokenizer){if(!(n in t))throw new Error(`tokenizer '${n}' does not exist`);if(["options","rules","lexer"].includes(n))continue;const l=n,r=e.tokenizer[l],i=t[l];t[l]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){const t=this.defaults.hooks||new ze;for(const n in e.hooks){if(!(n in t))throw new Error(`hook '${n}' does not exist`);if("options"===n)continue;const l=n,r=e.hooks[l],i=t[l];ze.passThroughHooks.has(n)?t[l]=e=>{if(this.defaults.async)return Promise.resolve(r.call(t,e)).then((e=>i.call(t,e)));const n=r.call(t,e);return i.call(t,n)}:t[l]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){const t=this.defaults.walkTokens,l=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(l.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ye.lex(e,t??this.defaults)}parser(e,t){return Ae.parse(e,t??this.defaults)}#e(e,t){return(n,l)=>{const r={...l},i={...this.defaults,...r};!0===this.defaults.async&&!1===r.async&&(i.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),i.async=!0);const a=this.#t(!!i.silent,!!i.async);if(null==n)return a(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof n)return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(i.hooks&&(i.hooks.options=i),i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(n):n).then((t=>e(t,i))).then((e=>i.hooks?i.hooks.processAllTokens(e):e)).then((e=>i.walkTokens?Promise.all(this.walkTokens(e,i.walkTokens)).then((()=>e)):e)).then((e=>t(e,i))).then((e=>i.hooks?i.hooks.postprocess(e):e)).catch(a);try{i.hooks&&(n=i.hooks.preprocess(n));let l=e(n,i);i.hooks&&(l=i.hooks.processAllTokens(l)),i.walkTokens&&this.walkTokens(l,i.walkTokens);let r=t(l,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}#t(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="

    An error occurred:

    "+L(n.message+"",!0)+"
    ";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}}const Ce=new $e;function Le(e,t){return Ce.parse(e,t)}function Ie(e){return(e||"").match(/\S*/)[0]}function Re(e){return t=>{"string"==typeof t&&t!==e.text&&(e.escaped=!0,e.text=t)}}Le.options=Le.setOptions=function(e){return Ce.setOptions(e),Le.defaults=Ce.defaults,y(Le.defaults),Le},Le.getDefaults=function(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}},Le.defaults=w,Le.use=function(...e){return Ce.use(...e),Le.defaults=Ce.defaults,y(Le.defaults),Le},Le.walkTokens=function(e,t){return Ce.walkTokens(e,t)},Le.parseInline=Ce.parseInline,Le.Parser=Ae,Le.parser=Ae.parse,Le.Renderer=be,Le.TextRenderer=xe,Le.Lexer=ye,Le.lexer=ye.lex,Le.Tokenizer=M,Le.Hooks=ze,Le.parse=Le,Le.options,Le.setOptions,Le.use,Le.walkTokens,Le.parseInline,Ae.parse,ye.lex;const Ee=/[&<>"']/,Se=new RegExp(Ee.source,"g"),We=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,_e=new RegExp(We.source,"g"),Te={"&":"&","<":"<",">":">",'"':""","'":"'"},De=e=>Te[e];function je(e,t){if(t){if(Ee.test(e))return e.replace(Se,De)}else if(We.test(e))return e.replace(_e,De);return e}var Me=n(4348);const Ve=({size:e})=>(0,l.h)("svg",{class:"wl-close-icon",viewBox:"0 0 1024 1024",width:e,height:e},[(0,l.h)("path",{d:"M697.173 85.333h-369.92c-144.64 0-241.92 101.547-241.92 252.587v348.587c0 150.613 97.28 252.16 241.92 252.16h369.92c144.64 0 241.494-101.547 241.494-252.16V337.92c0-151.04-96.854-252.587-241.494-252.587z",fill:"currentColor"}),(0,l.h)("path",{d:"m640.683 587.52-75.947-75.861 75.904-75.862a37.29 37.29 0 0 0 0-52.778 37.205 37.205 0 0 0-52.779 0l-75.946 75.818-75.862-75.946a37.419 37.419 0 0 0-52.821 0 37.419 37.419 0 0 0 0 52.821l75.947 75.947-75.776 75.733a37.29 37.29 0 1 0 52.778 52.821l75.776-75.776 75.947 75.947a37.376 37.376 0 0 0 52.779-52.821z",fill:"#888"})]),Ue=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"m341.013 394.667 27.755 393.45h271.83l27.733-393.45h64.106l-28.01 397.952a64 64 0 0 1-63.83 59.498H368.768a64 64 0 0 1-63.83-59.52l-28.053-397.93h64.128zm139.307 19.818v298.667h-64V414.485h64zm117.013 0v298.667h-64V414.485h64zM181.333 288h640v64h-640v-64zm453.483-106.667v64h-256v-64h256z",fill:"red"})),Ke=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"M563.2 463.3 677 540c1.7 1.2 3.7 1.8 5.8 1.8.7 0 1.4-.1 2-.2 2.7-.5 5.1-2.1 6.6-4.4l25.3-37.8c1.5-2.3 2.1-5.1 1.6-7.8s-2.1-5.1-4.4-6.6l-73.6-49.1 73.6-49.1c2.3-1.5 3.9-3.9 4.4-6.6.5-2.7 0-5.5-1.6-7.8l-25.3-37.8a10.1 10.1 0 0 0-6.6-4.4c-.7-.1-1.3-.2-2-.2-2.1 0-4.1.6-5.8 1.8l-113.8 76.6c-9.2 6.2-14.7 16.4-14.7 27.5.1 11 5.5 21.3 14.7 27.4zM387 348.8h-45.5c-5.7 0-10.4 4.7-10.4 10.4v153.3c0 5.7 4.7 10.4 10.4 10.4H387c5.7 0 10.4-4.7 10.4-10.4V359.2c0-5.7-4.7-10.4-10.4-10.4zm333.8 241.3-41-20a10.3 10.3 0 0 0-8.1-.5c-2.6.9-4.8 2.9-5.9 5.4-30.1 64.9-93.1 109.1-164.4 115.2-5.7.5-9.9 5.5-9.5 11.2l3.9 45.5c.5 5.3 5 9.5 10.3 9.5h.9c94.8-8 178.5-66.5 218.6-152.7 2.4-5 .3-11.2-4.8-13.6zm186-186.1c-11.9-42-30.5-81.4-55.2-117.1-24.1-34.9-53.5-65.6-87.5-91.2-33.9-25.6-71.5-45.5-111.6-59.2-41.2-14-84.1-21.1-127.8-21.1h-1.2c-75.4 0-148.8 21.4-212.5 61.7-63.7 40.3-114.3 97.6-146.5 165.8-32.2 68.1-44.3 143.6-35.1 218.4 9.3 74.8 39.4 145 87.3 203.3.1.2.3.3.4.5l36.2 38.4c1.1 1.2 2.5 2.1 3.9 2.6 73.3 66.7 168.2 103.5 267.5 103.5 73.3 0 145.2-20.3 207.7-58.7 37.3-22.9 70.3-51.5 98.1-85 27.1-32.7 48.7-69.5 64.2-109.1 15.5-39.7 24.4-81.3 26.6-123.8 2.4-43.6-2.5-87-14.5-129zm-60.5 181.1c-8.3 37-22.8 72-43 104-19.7 31.1-44.3 58.6-73.1 81.7-28.8 23.1-61 41-95.7 53.4-35.6 12.7-72.9 19.1-110.9 19.1-82.6 0-161.7-30.6-222.8-86.2l-34.1-35.8c-23.9-29.3-42.4-62.2-55.1-97.7-12.4-34.7-18.8-71-19.2-107.9-.4-36.9 5.4-73.3 17.1-108.2 12-35.8 30-69.2 53.4-99.1 31.7-40.4 71.1-72 117.2-94.1 44.5-21.3 94-32.6 143.4-32.6 49.3 0 97 10.8 141.8 32 34.3 16.3 65.3 38.1 92 64.8 26.1 26 47.5 56 63.6 89.2 16.2 33.2 26.6 68.5 31 105.1 4.6 37.5 2.7 75.3-5.6 112.3z",fill:"currentColor"})),Pe=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[(0,l.h)("path",{d:"M784 112H240c-88 0-160 72-160 160v480c0 88 72 160 160 160h544c88 0 160-72 160-160V272c0-88-72-160-160-160zm96 640c0 52.8-43.2 96-96 96H240c-52.8 0-96-43.2-96-96V272c0-52.8 43.2-96 96-96h544c52.8 0 96 43.2 96 96v480z",fill:"currentColor"}),(0,l.h)("path",{d:"M352 480c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96zm0-128c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32zm462.4 379.2-3.2-3.2-177.6-177.6c-25.6-25.6-65.6-25.6-91.2 0l-80 80-36.8-36.8c-25.6-25.6-65.6-25.6-91.2 0L200 728c-4.8 6.4-8 14.4-8 24 0 17.6 14.4 32 32 32 9.6 0 16-3.2 22.4-9.6L380.8 640l134.4 134.4c6.4 6.4 14.4 9.6 24 9.6 17.6 0 32-14.4 32-32 0-9.6-4.8-17.6-9.6-24l-52.8-52.8 80-80L769.6 776c6.4 4.8 12.8 8 20.8 8 17.6 0 32-14.4 32-32 0-8-3.2-16-8-20.8z",fill:"currentColor"})]),He=({active:e=!1})=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[(0,l.h)("path",{d:"M850.654 323.804c-11.042-25.625-26.862-48.532-46.885-68.225-20.022-19.61-43.258-34.936-69.213-45.73-26.78-11.124-55.124-16.727-84.375-16.727-40.622 0-80.256 11.123-114.698 32.135A214.79 214.79 0 0 0 512 241.819a214.79 214.79 0 0 0-23.483-16.562c-34.442-21.012-74.076-32.135-114.698-32.135-29.25 0-57.595 5.603-84.375 16.727-25.872 10.711-49.19 26.12-69.213 45.73-20.105 19.693-35.843 42.6-46.885 68.225-11.453 26.615-17.303 54.877-17.303 83.963 0 27.439 5.603 56.03 16.727 85.117 9.31 24.307 22.659 49.52 39.715 74.981 27.027 40.293 64.188 82.316 110.33 124.915 76.465 70.615 152.189 119.394 155.402 121.371l19.528 12.525c8.652 5.52 19.776 5.52 28.427 0l19.529-12.525c3.213-2.06 78.854-50.756 155.401-121.371 46.143-42.6 83.304-84.622 110.33-124.915 17.057-25.46 30.487-50.674 39.716-74.981 11.124-29.087 16.727-57.678 16.727-85.117.082-29.086-5.768-57.348-17.221-83.963z"+(e?"":"M512 761.5S218.665 573.55 218.665 407.767c0-83.963 69.461-152.023 155.154-152.023 60.233 0 112.473 33.618 138.181 82.727 25.708-49.109 77.948-82.727 138.18-82.727 85.694 0 155.155 68.06 155.155 152.023C805.335 573.551 512 761.5 512 761.5z"),fill:e?"red":"currentColor"})]),Qe=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[(0,l.h)("path",{d:"M710.816 654.301c70.323-96.639 61.084-230.578-23.705-314.843-46.098-46.098-107.183-71.109-172.28-71.109-65.008 0-126.092 25.444-172.28 71.109-45.227 46.098-70.756 107.183-70.756 172.106 0 64.923 25.444 126.007 71.194 172.106 46.099 46.098 107.184 71.109 172.28 71.109 51.414 0 100.648-16.212 142.824-47.404l126.53 126.006c7.058 7.06 16.297 10.979 26.406 10.979 10.105 0 19.343-3.919 26.402-10.979 14.467-14.467 14.467-38.172 0-52.723L710.816 654.301zm-315.107-23.265c-65.88-65.88-65.88-172.54 0-238.42 32.069-32.07 74.245-49.149 119.471-49.149 45.227 0 87.407 17.603 119.472 49.149 65.88 65.879 65.88 172.539 0 238.42-63.612 63.178-175.242 63.178-238.943 0zm0 0",fill:"currentColor"}),(0,l.h)("path",{d:"M703.319 121.603H321.03c-109.8 0-199.469 89.146-199.469 199.38v382.034c0 109.796 89.236 199.38 199.469 199.38h207.397c20.653 0 37.384-16.645 37.384-37.299 0-20.649-16.731-37.296-37.384-37.296H321.03c-68.582 0-124.352-55.77-124.352-124.267V321.421c0-68.496 55.77-124.267 124.352-124.267h382.289c68.582 0 124.352 55.771 124.352 124.267V524.72c0 20.654 16.736 37.299 37.385 37.299 20.654 0 37.384-16.645 37.384-37.299V320.549c-.085-109.8-89.321-198.946-199.121-198.946zm0 0",fill:"currentColor"})]),Ne=()=>(0,l.h)("svg",{width:"16",height:"16",ariaHidden:"true"},(0,l.h)("path",{d:"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z",fill:"currentColor"})),Oe=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"M810.667 213.333a64 64 0 0 1 64 64V704a64 64 0 0 1-64 64H478.336l-146.645 96.107a21.333 21.333 0 0 1-33.024-17.856V768h-85.334a64 64 0 0 1-64-64V277.333a64 64 0 0 1 64-64h597.334zm0 64H213.333V704h149.334v63.296L459.243 704h351.424V277.333zm-271.36 213.334v64h-176.64v-64h176.64zm122.026-128v64H362.667v-64h298.666z",fill:"currentColor"})),Be=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"M813.039 318.772L480.53 651.278H360.718V531.463L693.227 198.961C697.904 194.284 704.027 192 710.157 192C716.302 192 722.436 194.284 727.114 198.961L813.039 284.88C817.72 289.561 820 295.684 820 301.825C820 307.95 817.72 314.093 813.039 318.772ZM710.172 261.888L420.624 551.431V591.376H460.561L750.109 301.825L710.172 261.888ZM490.517 291.845H240.906V771.09H720.156V521.479C720.156 504.947 733.559 491.529 750.109 491.529C766.653 491.529 780.063 504.947 780.063 521.479V791.059C780.063 813.118 762.18 831 740.125 831H220.937C198.882 831 181 813.118 181 791.059V271.872C181 249.817 198.882 231.935 220.937 231.935H490.517C507.06 231.935 520.47 245.352 520.47 261.888C520.47 278.424 507.06 291.845 490.517 291.845Z",fill:"currentColor"})),qe=()=>(0,l.h)("svg",{class:"verified-icon",viewBox:"0 0 1024 1024",width:"14",height:"14"},(0,l.h)("path",{d:"m894.4 461.56-54.4-63.2c-10.4-12-18.8-34.4-18.8-50.4v-68c0-42.4-34.8-77.2-77.2-77.2h-68c-15.6 0-38.4-8.4-50.4-18.8l-63.2-54.4c-27.6-23.6-72.8-23.6-100.8 0l-62.8 54.8c-12 10-34.8 18.4-50.4 18.4h-69.2c-42.4 0-77.2 34.8-77.2 77.2v68.4c0 15.6-8.4 38-18.4 50l-54 63.6c-23.2 27.6-23.2 72.4 0 100l54 63.6c10 12 18.4 34.4 18.4 50v68.4c0 42.4 34.8 77.2 77.2 77.2h69.2c15.6 0 38.4 8.4 50.4 18.8l63.2 54.4c27.6 23.6 72.8 23.6 100.8 0l63.2-54.4c12-10.4 34.4-18.8 50.4-18.8h68c42.4 0 77.2-34.8 77.2-77.2v-68c0-15.6 8.4-38.4 18.8-50.4l54.4-63.2c23.2-27.6 23.2-73.2-.4-100.8zm-216-25.2-193.2 193.2a30 30 0 0 1-42.4 0l-96.8-96.8a30.16 30.16 0 0 1 0-42.4c11.6-11.6 30.8-11.6 42.4 0l75.6 75.6 172-172c11.6-11.6 30.8-11.6 42.4 0 11.6 11.6 11.6 30.8 0 42.4z",fill:"#27ae60"})),Fe=({size:e=100})=>(0,l.h)("svg",{width:e,height:e,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},(0,l.h)("circle",{cx:50,cy:50,fill:"none",stroke:"currentColor",strokeWidth:"4",r:"40","stroke-dasharray":"85 30"},(0,l.h)("animateTransform",{attributeName:"transform",type:"rotate",repeatCount:"indefinite",dur:"1s",values:"0 50 50;360 50 50",keyTimes:"0;1"}))),Ze=()=>(0,l.h)("svg",{width:24,height:24,fill:"currentcolor",viewBox:"0 0 24 24"},[(0,l.h)("path",{style:"transform: translateY(0.5px)",d:"M18.968 10.5H15.968V11.484H17.984V12.984H15.968V15H14.468V9H18.968V10.5V10.5ZM8.984 9C9.26533 9 9.49967 9.09367 9.687 9.281C9.87433 9.46833 9.968 9.70267 9.968 9.984V10.5H6.499V13.5H8.468V12H9.968V14.016C9.968 14.2973 9.87433 14.5317 9.687 14.719C9.49967 14.9063 9.26533 15 8.984 15H5.984C5.70267 15 5.46833 14.9063 5.281 14.719C5.09367 14.5317 5 14.2973 5 14.016V9.985C5 9.70367 5.09367 9.46933 5.281 9.282C5.46833 9.09467 5.70267 9.001 5.984 9.001H8.984V9ZM11.468 9H12.968V15H11.468V9V9Z"}),(0,l.h)("path",{d:"M18.5 3H5.75C3.6875 3 2 4.6875 2 6.75V18C2 20.0625 3.6875 21.75 5.75 21.75H18.5C20.5625 21.75 22.25 20.0625 22.25 18V6.75C22.25 4.6875 20.5625 3 18.5 3ZM20.75 18C20.75 19.2375 19.7375 20.25 18.5 20.25H5.75C4.5125 20.25 3.5 19.2375 3.5 18V6.75C3.5 5.5125 4.5125 4.5 5.75 4.5H18.5C19.7375 4.5 20.75 5.5125 20.75 6.75V18Z"})]);let Ye=null;const Ge=()=>Ye||(Ye=(0,s.Udq)("WALINE_LIKE",[]));let Xe=null;const Je={};let et=null;const tt=()=>et??(et=(0,s.Udq)("WALINE_USER",{})),nt={key:0,class:"wl-reaction"},lt=["textContent"],rt={class:"wl-reaction-list"},it=["onClick"],at={class:"wl-reaction-img"},st=["src","alt"],ot=["textContent"],ct=["textContent"];var ut=(0,l._M)({__name:"ArticleReaction",setup(e,{expose:t}){t();const n=Xe??(Xe=(0,s.Udq)("WALINE_REACTION",{})),a=(0,l.uU)("config"),o=(0,r.IL)(-1),c=(0,r.IL)([]),h=(0,l.S6)((()=>a.value.locale)),d=(0,l.S6)((()=>a.value.reaction.length>0)),g=(0,l.S6)((()=>{const{reaction:e,path:t}=a.value;return e.map(((e,l)=>({icon:e,desc:h.value[`reaction${l}`],active:n.value[t]===l})))}));let m;const f=async e=>{if(-1===o.value){const{serverURL:t,lang:l,path:r}=a.value,i=n.value[r];o.value=e,void 0!==i&&(await p({serverURL:t,lang:l,path:r,type:`reaction${i}`,action:"desc"}),c.value[i]=Math.max(c.value[i]-1,0)),i!==e&&(await p({serverURL:t,lang:l,path:r,type:`reaction${e}`}),c.value[e]=(c.value[e]||0)+1),i===e?delete n.value[r]:n.value[r]=e,o.value=-1}};return(0,l.u2)((()=>{(0,l.Kg)((()=>[a.value.serverURL,a.value.path]),(()=>{(async()=>{if(d.value){const{serverURL:e,lang:t,path:n,reaction:l}=a.value,r=new AbortController;m=r.abort.bind(r);const i=await(({serverURL:e,lang:t,paths:n,type:l,signal:r})=>fetch(`${u(e)}article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(l.join(","))}&lang=${t}`,{signal:r}).then((e=>e.json())))({serverURL:e,lang:t,paths:[n],type:l.map(((e,t)=>`reaction${t}`)),signal:r.signal});if(Array.isArray(i)||"number"==typeof i)return;c.value=l.map(((e,t)=>i[`reaction${t}`]))}})()}),{immediate:!0})})),(0,l.wx)((()=>null==m?void 0:m())),(e,t)=>g.value.length?((0,l.Wz)(),(0,l.An)("div",nt,[(0,l.QD)("div",{class:"wl-reaction-title",textContent:(0,i.WA)(h.value.reactionTitle)},null,8,lt),(0,l.QD)("ul",rt,[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(g.value,(({active:e,icon:t,desc:n},a)=>((0,l.Wz)(),(0,l.An)("li",{key:a,class:(0,i.WN)(["wl-reaction-item",{active:e}]),onClick:e=>f(a)},[(0,l.QD)("div",at,[(0,l.QD)("img",{src:t,alt:n},null,8,st),o.value===a?((0,l.Wz)(),(0,l.Az)((0,r.KV)(Fe),{key:0,class:"wl-reaction-loading"})):((0,l.Wz)(),(0,l.An)("div",{key:1,class:"wl-reaction-votes",textContent:(0,i.WA)(c.value[a]||0)},null,8,ot))]),(0,l.QD)("div",{class:"wl-reaction-text",textContent:(0,i.WA)(n)},null,8,ct)],10,it)))),128))])])):(0,l.g1)("v-if",!0)}}),ht=(e,t)=>{const n=e.__vccOpts||e;for(const[e,l]of t)n[e]=l;return n},pt=ht(ut,[["__file","ArticleReaction.vue"]]);const dt=["data-index"],gt=["src","title","onClick"];var mt=(0,l._M)({__name:"ImageWall",props:{items:{default:()=>[]},columnWidth:{default:300},gap:{default:0}},emits:["insert"],setup(e,{expose:t}){const n=e;t();let a=null;const s=(0,r.IL)(null),o=(0,r.IL)({}),c=(0,r.IL)([]),u=()=>{const e=Math.floor((s.value.getBoundingClientRect().width+n.gap)/(n.columnWidth+n.gap));return e>0?e:1},h=async e=>{var t;if(e>=n.items.length)return;await(0,l.o$)();const r=Array.from((null==(t=s.value)?void 0:t.children)||[]).reduce(((e,t)=>t.getBoundingClientRect().height{if(c.value.length===u()&&!e)return;c.value=(e=>new Array(e).fill(null).map((()=>[])))(u());const t=window.scrollY;await h(0),window.scrollTo({top:t})},d=e=>{o.value[e.target.src]=!0};return(0,l.u2)((()=>{p(!0),a=new ResizeObserver((()=>{p()})),a.observe(s.value),(0,l.Kg)((()=>[n.items]),(()=>{o.value={},p(!0)})),(0,l.Kg)((()=>[n.columnWidth,n.gap]),(()=>{p()}))})),(0,l.GE)((()=>a.unobserve(s.value))),(e,t)=>((0,l.Wz)(),(0,l.An)("div",{ref_key:"wall",ref:s,class:"wl-gallery",style:(0,i.MN)({gap:`${e.gap}px`})},[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(c.value,((t,n)=>((0,l.Wz)(),(0,l.An)("div",{key:n,class:"wl-gallery-column","data-index":n,style:(0,i.MN)({gap:`${e.gap}px`})},[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(t,(t=>((0,l.Wz)(),(0,l.An)(l.ae,{key:t},[o.value[e.items[t].src]?(0,l.g1)("v-if",!0):((0,l.Wz)(),(0,l.Az)((0,r.KV)(Fe),{key:0,size:36,style:{margin:"20px auto"}})),(0,l.QD)("img",{class:"wl-gallery-item",src:e.items[t].src,title:e.items[t].title,loading:"lazy",onLoad:d,onClick:n=>e.$emit("insert",`![](${e.items[t].src})`)},null,40,gt)],64)))),128))],12,dt)))),128))],4))}}),ft=ht(mt,[["__file","ImageWall.vue"]]);const vt=e=>{try{e=decodeURI(e)}catch{}return e},kt=(e="")=>e.replace(/\/$/u,""),wt=e=>/^(https?:)?\/\//.test(e),yt=["nick","mail","link"],bt=e=>e.filter((e=>yt.includes(e))),xt=["//unpkg.com/@waline/emojis@1.1.0/weibo"],At=["//unpkg.com/@waline/emojis/tieba/tieba_agree.png","//unpkg.com/@waline/emojis/tieba/tieba_look_down.png","//unpkg.com/@waline/emojis/tieba/tieba_sunglasses.png","//unpkg.com/@waline/emojis/tieba/tieba_pick_nose.png","//unpkg.com/@waline/emojis/tieba/tieba_awkward.png","//unpkg.com/@waline/emojis/tieba/tieba_sleep.png"],zt=e=>new Promise(((t,n)=>{if(e.size>128e3)return n(new Error("File too large! File size limit 128KB"));const l=new FileReader;l.readAsDataURL(e),l.onload=()=>{var e;return t((null==(e=l.result)?void 0:e.toString())||"")},l.onerror=n})),$t=e=>!0===e?'

    TeX is not available in preview

    ':'TeX is not available in preview',Ct=e=>{const t=async(t,n={})=>fetch(`https://api.giphy.com/v1/gifs/${t}?${new URLSearchParams({lang:e,limit:"20",rating:"g",api_key:"6CIMLkNMMOhRcXPoMCPkFy4Ybk2XUiMp",...n}).toString()}`).then((e=>e.json())).then((({data:e})=>e.map((e=>({title:e.title,src:e.images.downsized_medium.url})))));return{search:e=>t("search",{q:e,offset:"0"}),default:()=>t("trending",{}),more:(e,n=0)=>t("search",{q:e,offset:n.toString()})}},Lt=new RegExp(`(${/[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af\u0400-\u04FF]+|\w+/.source}|${/{let t=0;return e.replace(Lt,((e,n,l)=>{if(l)return`${l}`;if("<"===n)return"<";let r;Rt[n]?r=Rt[n]:(r=It[t],Rt[n]=r);const i=`${n}`;return t=++t%It.length,i}))},St=["nick","nickError","mail","mailError","link","optional","placeholder","sofa","submit","like","cancelLike","reply","cancelReply","comment","refresh","more","preview","emoji","uploadImage","seconds","minutes","hours","days","now","uploading","login","logout","admin","sticky","word","wordHint","anonymous","level0","level1","level2","level3","level4","level5","gif","gifSearchPlaceholder","profile","approved","waiting","spam","unsticky","oldest","latest","hottest","reactionTitle"],Wt=e=>Object.fromEntries(e.map(((e,t)=>[St[t],e])));var _t=Wt(["NickName","NickName cannot be less than 3 bytes.","E-Mail","Please confirm your email address.","Website","Optional","Comment here...","No comment yet.","Submit","Like","Cancel like","Reply","Cancel reply","Comments","Refresh","Load More...","Preview","Emoji","Upload Image","seconds ago","minutes ago","hours ago","days ago","just now","Uploading","Login","logout","Admin","Sticky","Words","Please input comments between $0 and $1 words!\n Current word number: $2","Anonymous","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Search GIF","Profile","Approved","Waiting","Spam","Unsticky","Oldest","Latest","Hottest","What do you think?"]),Tt=Wt(["Pseudo","Le pseudo ne peut pas faire moins de 3 octets.","E-mail","Veuillez confirmer votre adresse e-mail.","Site Web","Optionnel","Commentez ici...","Aucun commentaire pour l'instant.","Envoyer","J'aime","Annuler le j'aime","Répondre","Annuler la réponse","Commentaires","Actualiser","Charger plus...","Aperçu","Emoji","Télécharger une image","Il y a quelques secondes","Il y a quelques minutes","Il y a quelques heures","Il y a quelques jours","À l'instant","Téléchargement en cours","Connexion","Déconnexion","Admin","Épinglé","Mots","Veuillez saisir des commentaires entre $0 et $1 mots !\n Nombre actuel de mots : $2","Anonyme","Nains","Hobbits","Ents","Mages","Elfes","Maïar","GIF","Rechercher un GIF","Profil","Approuvé","En attente","Indésirable","Détacher","Le plus ancien","Dernier","Le plus populaire","Qu'en pensez-vous ?"]),Dt=Wt(["ニックネーム","3バイト以上のニックネームをご入力ください.","メールアドレス","メールアドレスをご確認ください.","サイト","オプション","ここにコメント","コメントしましょう~","提出する","Like","Cancel like","返信する","キャンセル","コメント","更新","さらに読み込む","プレビュー","絵文字","画像をアップロード","秒前","分前","時間前","日前","たっだ今","アップロード","ログインする","ログアウト","管理者","トップに置く","ワード","コメントは $0 から $1 ワードの間でなければなりません!\n 現在の単語番号: $2","匿名","うえにん","なかにん","しもおし","特にしもおし","かげ","なぬし","GIF","探す GIF","個人情報","承認済み","待っている","スパム","べたつかない","逆順","正順","人気順","どう思いますか?"]),jt=Wt(["Apelido","Apelido não pode ser menor que 3 bytes.","E-Mail","Por favor, confirme seu endereço de e-mail.","Website","Opcional","Comente aqui...","Nenhum comentário, ainda.","Enviar","Like","Cancel like","Responder","Cancelar resposta","Comentários","Refrescar","Carregar Mais...","Visualizar","Emoji","Enviar Imagem","segundos atrás","minutos atrás","horas atrás","dias atrás","agora mesmo","Enviando","Entrar","Sair","Admin","Sticky","Palavras","Favor enviar comentário com $0 a $1 palavras!\n Número de palavras atuais: $2","Anônimo","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Pesquisar GIF","informação pessoal","Aprovado","Espera","Spam","Unsticky","Mais velho","Mais recentes","Mais quente","O que você acha?"]),Mt=Wt(["Псевдоним","Никнейм не может быть меньше 3 байт.","Эл. адрес","Пожалуйста, подтвердите адрес вашей электронной почты.","Веб-сайт","Необязательный","Комментарий здесь...","Пока нет комментариев.","Отправить","Like","Cancel like","Отвечать","Отменить ответ","Комментарии","Обновить","Загрузи больше...","Превью","эмодзи","Загрузить изображение","секунд назад","несколько минут назад","несколько часов назад","дней назад","прямо сейчас","Загрузка","Авторизоваться","Выход из системы","Админ","Липкий","Слова","Пожалуйста, введите комментарии от $0 до $1 слов!\nНомер текущего слова: $2","Анонимный","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Поиск GIF","Персональные данные","Одобренный","Ожидающий","Спам","Нелипкий","самый старый","последний","самый горячий","Что вы думаете?"]),Vt=Wt(["昵称","昵称不能少于3个字符","邮箱","请填写正确的邮件地址","网址","可选","欢迎评论","来发评论吧~","提交","喜欢","取消喜欢","回复","取消回复","评论","刷新","加载更多...","预览","表情","上传图片","秒前","分钟前","小时前","天前","刚刚","正在上传","登录","退出","博主","置顶","字","评论字数应在 $0 到 $1 字之间!\n当前字数:$2","匿名","潜水","冒泡","吐槽","活跃","话痨","传说","表情包","搜索表情包","个人资料","通过","待审核","垃圾","取消置顶","按倒序","按正序","按热度","你认为这篇文章怎么样?"]),Ut=Wt(["暱稱","暱稱不能少於3個字元","郵箱","請填寫正確的郵件地址","網址","可選","歡迎留言","來發留言吧~","送出","喜歡","取消喜歡","回覆","取消回覆","留言","重整","載入更多...","預覽","表情","上傳圖片","秒前","分鐘前","小時前","天前","剛剛","正在上傳","登入","登出","管理者","置頂","字","留言字數應在 $0 到 $1 字之間!\n目前字數:$2","匿名","潛水","冒泡","吐槽","活躍","多話","傳說","表情包","搜尋表情包","個人資料","通過","待審核","垃圾","取消置頂","最早","最新","熱門","你認為這篇文章怎麼樣?"]);const Kt="en-US",Pt={zh:Vt,"zh-cn":Vt,"zh-tw":Ut,en:_t,"en-us":_t,fr:Tt,"fr-fr":Tt,jp:Dt,"jp-jp":Dt,"pt-br":jt,ru:Mt,"ru-ru":Mt},Ht=e=>Pt[e.toLowerCase()]||Pt[Kt],Qt=e=>Object.keys(Pt).includes(e.toLowerCase())?e:Kt,Nt=e=>{const t=kt(e);return wt(t)?t:`https://${t}`},Ot=e=>Array.isArray(e)?e:!!e&&[0,e],Bt=(e,t)=>"function"==typeof e?e:!1!==e&&t,qt=e=>"string"==typeof e,Ft="{--waline-white:#000;--waline-light-grey:#666;--waline-dark-grey:#999;--waline-color:#888;--waline-bg-color:#1e1e1e;--waline-bg-color-light:#272727;--waline-bg-color-hover: #444;--waline-border-color:#333;--waline-disable-bg-color:#444;--waline-disable-color:#272727;--waline-bq-color:#272727;--waline-info-bg-color:#272727;--waline-info-color:#666}",Zt=(e,t)=>{let n=e.toString();for(;n.length`${t?`${t}/`:""}${n}${e}${l?`.${l}`:""}`,Xt=e=>e.type.includes("image"),Jt=e=>{const t=Array.from(e).find(Xt);return t?t.getAsFile():null},en=/\$.*?\$/,tn=/^\$(.*?)\$/,nn=/^(?:\s{0,3})\$\$((?:[^\n]|\n[^\n])+?)\n{0,1}\$\$/,ln=(e="",t={})=>e.replace(/:(.+?):/g,((e,n)=>t[n]?`${n}`:e)),rn={class:"wl-comment"},an={key:0,class:"wl-login-info"},sn={class:"wl-avatar"},on=["title"],cn=["title"],un=["src"],hn=["title","textContent"],pn={class:"wl-panel"},dn=["for","textContent"],gn=["id","onUpdate:modelValue","name","type"],mn=["placeholder"],fn={class:"wl-preview"},vn=(0,l.QD)("hr",null,null,-1),kn=["innerHTML"],wn={class:"wl-footer"},yn={class:"wl-actions"},bn={href:"https://guides.github.com/features/mastering-markdown/",title:"Markdown Guide","aria-label":"Markdown is supported",class:"wl-action",target:"_blank",rel:"noopener noreferrer"},xn=["title"],An=["title"],zn=["title"],$n=["title"],Cn={class:"wl-info"},Ln=(0,l.QD)("div",{class:"wl-captcha-container"},null,-1),In={class:"wl-text-number"},Rn={key:0},En=["textContent"],Sn=["textContent"],Wn=["disabled"],_n=["placeholder"],Tn={key:1,class:"wl-loading"},Dn={key:0,class:"wl-tab-wrapper"},jn=["title","onClick"],Mn=["src","alt"],Vn={key:0,class:"wl-tabs"},Un=["onClick"],Kn=["src","alt","title"],Pn=["title"];var Hn=(0,l._M)({__name:"CommentBox",props:{edit:{default:null},rootId:{default:""},replyId:{default:""},replyUser:{default:""}},emits:["log","cancelEdit","cancelReply","submit"],setup(e,{expose:t,emit:n}){const c=e,h=n;t();const p=(0,l.uU)("config"),g=(0,s.Udq)("WALINE_COMMENT_BOX_EDITOR",""),m=(0,s.Udq)("WALINE_USER_META",{nick:"",mail:"",link:""}),f=tt(),v=(0,r.IL)({}),w=(0,r.IL)(null),y=(0,r.IL)(null),b=(0,r.IL)(null),x=(0,r.IL)(null),A=(0,r.IL)(null),z=(0,r.IL)(null),$=(0,r.IL)(null),C=(0,r.IL)({tabs:[],map:{}}),L=(0,r.IL)(0),I=(0,r.IL)(!1),R=(0,r.IL)(!1),E=(0,r.IL)(!1),S=(0,r.IL)(""),W=(0,r.IL)(0),_=(0,r.cB)({loading:!0,list:[]}),T=(0,r.IL)(0),D=(0,r.IL)(!1),j=(0,r.IL)(""),M=(0,r.IL)(!1),V=(0,r.IL)(!1),U=(0,l.S6)((()=>p.value.locale)),K=(0,l.S6)((()=>{var e;return!(null==(e=f.value)||!e.token)})),P=(0,l.S6)((()=>!1!==p.value.imageUploader)),H=e=>{const t=w.value,n=t.selectionStart,l=t.selectionEnd||0,r=t.scrollTop;g.value=t.value.substring(0,n)+e+t.value.substring(l,t.value.length),t.focus(),t.selectionStart=n+e.length,t.selectionEnd=n+e.length,t.scrollTop=r},Q=e=>{const t=e.key;(e.ctrlKey||e.metaKey)&&"Enter"===t&&F()},N=e=>{const t=`![${p.value.locale.uploading} ${e.name}]()`;return H(t),M.value=!0,Promise.resolve().then((()=>p.value.imageUploader(e))).then((n=>{g.value=g.value.replace(t,`\r\n![${e.name}](${n})`)})).catch((e=>{alert(e.message),g.value=g.value.replace(t,"")})).then((()=>{M.value=!1}))},O=e=>{var t;if(null!=(t=e.dataTransfer)&&t.items){const t=Jt(e.dataTransfer.items);t&&P.value&&(N(t),e.preventDefault())}},B=e=>{if(e.clipboardData){const t=Jt(e.clipboardData.items);t&&P.value&&N(t)}},q=()=>{const e=y.value;e.files&&P.value&&N(e.files[0]).then((()=>{e.value=""}))},F=async()=>{var e,t,n,l,r,i;const{serverURL:a,lang:o,login:k,wordLimit:y,requiredMeta:b,recaptchaV3Key:x,turnstileKey:A}=p.value,z=await(async()=>{if(!navigator)return"";const{userAgentData:e}=navigator;let t=navigator.userAgent;if(!e||"Windows"!==e.platform)return t;const{platformVersion:n}=await e.getHighEntropyValues(["platformVersion"]);return n&&parseInt(n.split(".")[0])>=13&&(t=t.replace("Windows NT 10.0","Windows NT 11.0")),t})(),$={comment:j.value,nick:m.value.nick,mail:m.value.mail,link:m.value.link,url:p.value.path,ua:z};if(null!=(e=f.value)&&e.token)$.nick=f.value.display_name,$.mail=f.value.email,$.link=f.value.url;else{if("force"===k)return;if(b.indexOf("nick")>-1&&!$.nick)return null==(t=v.value.nick)||t.focus(),alert(U.value.nickError);if(b.indexOf("mail")>-1&&!$.mail||$.mail&&!(e=>Yt.test(e))($.mail))return null==(n=v.value.mail)||n.focus(),alert(U.value.mailError);$.nick||($.nick=U.value.anonymous)}if($.comment){if(!D.value)return alert(U.value.wordHint.replace("$0",y[0].toString()).replace("$1",y[1].toString()).replace("$2",W.value.toString()));$.comment=ln($.comment,C.value.map),c.replyId&&c.rootId&&($.pid=c.replyId,$.rid=c.rootId,$.at=c.replyUser),M.value=!0;try{x&&($.recaptchaV3=await(e=>{const t=Je[e]??(Je[e]=(0,Me.AJ)(e,{useRecaptchaNet:!0,autoHideBadge:!0}));return{execute:e=>t.then((t=>t.execute(e)))}})(x).execute("social")),A&&($.turnstile=await(e=>({execute:async t=>{const{load:n}=(0,s.OQt)("https://challenges.cloudflare.com/turnstile/v0/api.js",void 0,{async:!1});await n();const l=null==window?void 0:window.turnstile;return new Promise((n=>{null==l||l.ready((()=>{null==l||l.render(".wl-captcha-container",{sitekey:e,action:t,size:"compact",callback:n})}))}))}}))(A).execute("social"));const e={serverURL:a,lang:o,token:null==(r=f.value)?void 0:r.token,comment:$},t=await(c.edit?d({objectId:c.edit.objectId,...e}):(({serverURL:e,lang:t,token:n,comment:l})=>{const r={"Content-Type":"application/json"};return n&&(r.Authorization=`Bearer ${n}`),fetch(`${u(e)}comment?lang=${t}`,{method:"POST",headers:r,body:JSON.stringify(l)}).then((e=>e.json()))})(e));if(M.value=!1,t.errmsg)return alert(t.errmsg);h("submit",t.data),g.value="",S.value="",c.replyId&&h("cancelReply"),null!=(i=c.edit)&&i.objectId&&h("cancelEdit")}catch(e){M.value=!1,alert(e.message)}}else null==(l=w.value)||l.focus()},Z=e=>{e.preventDefault();const{lang:t,serverURL:n}=p.value;(({lang:e,serverURL:t})=>{const n=(window.innerWidth-450)/2,l=(window.innerHeight-450)/2,r=window.open(`${t.replace(/\/$/,"")}/ui/login?lng=${encodeURIComponent(e)}`,"_blank",`width=450,height=450,left=${n},top=${l},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return r?.postMessage({type:"TOKEN",data:null},"*"),new Promise((e=>{const t=({data:n})=>{!n||"object"!=typeof n||"userInfo"!==n.type||n.data.token&&(r?.close(),window.removeEventListener("message",t),e(n.data))};window.addEventListener("message",t)}))})({serverURL:n,lang:t}).then((e=>{f.value=e,(e.remember?localStorage:sessionStorage).setItem("WALINE_USER",JSON.stringify(e)),h("log")}))},Y=()=>{f.value={},localStorage.setItem("WALINE_USER","null"),sessionStorage.setItem("WALINE_USER","null"),h("log")},G=e=>{e.preventDefault();const{lang:t,serverURL:n}=p.value,l=(window.innerWidth-800)/2,r=(window.innerHeight-800)/2,i=new URLSearchParams({lng:t,token:f.value.token}),a=window.open(`${n}/ui/profile?${i.toString()}`,"_blank",`width=800,height=800,left=${l},top=${r},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);null==a||a.postMessage({type:"TOKEN",data:f.value.token},"*")},X=e=>{var t,n,l,r;null!=(t=b.value)&&t.contains(e.target)||null!=(n=x.value)&&n.contains(e.target)||(I.value=!1),null!=(l=A.value)&&l.contains(e.target)||null!=(r=z.value)&&r.contains(e.target)||(R.value=!1)},J=async e=>{var t;const{scrollTop:n,clientHeight:l,scrollHeight:r}=e.target,i=(l+n)/r,a=p.value.search,s=(null==(t=$.value)?void 0:t.value)||"";i<.9||_.loading||V.value||(_.loading=!0,(a.more&&_.list.length?await a.more(s,_.list.length):await a.search(s)).length?_.list=[..._.list,...a.more&&_.list.length?await a.more(s,_.list.length):await a.search(s)]:V.value=!0,_.loading=!1,setTimeout((()=>{e.target.scrollTop=n}),50))},ee=(0,o.ui)((e=>{_.list=[],V.value=!1,J(e)}),300);(0,l.Kg)([p,W],(([e,t])=>{const{wordLimit:n}=e;n?tn[1]?(T.value=n[1],D.value=!1):(T.value=n[1],D.value=!0):(T.value=0,D.value=!0)}),{immediate:!0});const te=({data:e})=>{!e||"profile"!==e.type||(f.value={...f.value,...e.data},[localStorage,sessionStorage].filter((e=>e.getItem("WALINE_USER"))).forEach((e=>e.setItem("WALINE_USER",JSON.stringify(f)))))};return(0,l.u2)((()=>{var e;document.body.addEventListener("click",X),window.addEventListener("message",te),null!=(e=c.edit)&&e.objectId&&(g.value=c.edit.orig),(0,l.Kg)(R,(async e=>{if(!e)return;const t=p.value.search;$.value&&($.value.value=""),_.loading=!0,_.list=t.default?await t.default():await t.search(""),_.loading=!1})),(0,l.Kg)((()=>g.value),(e=>{const{highlighter:t,texRenderer:n}=p.value;j.value=e,S.value=((e,{emojiMap:t,highlighter:n,texRenderer:l})=>{const r=new $e;if(r.setOptions({breaks:!0}),n&&r.use(function(e){if("function"==typeof e&&(e={highlight:e}),!e||"function"!=typeof e.highlight)throw new Error("Must provide highlight function");return"string"!=typeof e.langPrefix&&(e.langPrefix="language-"),{async:!!e.async,walkTokens(t){if("code"!==t.type)return;const n=Ie(t.lang);if(e.async)return Promise.resolve(e.highlight(t.text,n,t.lang||"")).then(Re(t));const l=e.highlight(t.text,n,t.lang||"");if(l instanceof Promise)throw new Error("markedHighlight is not set to async but the highlight function is async. Set the async option to true on markedHighlight to await the async highlight function.");Re(t)(l)},renderer:{code(t,n,l){const r=Ie(n),i=r?` class="${e.langPrefix}${je(r)}"`:"";return t=t.replace(/\n$/,""),`
    ${l?t:je(t,!0)}\n
    `}}}}({highlight:n})),l){const e=(e=>[{name:"blockMath",level:"block",tokenizer(t){const n=nn.exec(t);if(null!==n)return{type:"html",raw:n[0],text:e(!0,n[1])}}},{name:"inlineMath",level:"inline",start(e){const t=e.search(en);return-1!==t?t:e.length},tokenizer(t){const n=tn.exec(t);if(null!==n)return{type:"html",raw:n[0],text:e(!1,n[1])}}}])(l);r.use({extensions:e})}return r.parse(ln(e,t))})(e,{emojiMap:C.value.map,highlighter:t,texRenderer:n}),W.value=(e=>{var t,n;return((null==(t=(e=>e.match(/[\w\d\s,.\u00C0-\u024F\u0400-\u04FF]+/giu))(e))?void 0:t.reduce(((e,t)=>e+(["",",","."].includes(t.trim())?0:t.trim().split(/\s+/u).length)),0))||0)+((null==(n=(e=>e.match(/[\u4E00-\u9FD5]/gu))(e))?void 0:n.length)||0)})(e),e?k(w.value):k.destroy(w.value)}),{immediate:!0}),(0,l.Kg)((()=>p.value.emoji),(e=>(e=>Promise.all(e.map((e=>qt(e)?(e=>{const t=(0,s.Udq)("WALINE_EMOJI",{}),n=(e=>!!/@[0-9]+\.[0-9]+\.[0-9]+/.test(e))(e);if(n){const n=t.value[e];if(n)return Promise.resolve(n)}return fetch(`${e}/info.json`).then((e=>e.json())).then((l=>{const r={folder:e,...l};return n&&(t.value[e]=r),r}))})(kt(e)):Promise.resolve(e)))).then((e=>{const t={tabs:[],map:{}};return e.forEach((e=>{const{name:n,folder:l,icon:r,prefix:i,type:a,items:s}=e;t.tabs.push({name:n,icon:Gt(r,l,i,a),items:s.map((e=>{const n=`${i||""}${e}`;return t.map[n]=Gt(e,l,i,a),n}))})})),t})))(e).then((e=>{C.value=e}))),{immediate:!0})})),(0,l.wx)((()=>{document.body.removeEventListener("click",X),window.removeEventListener("message",te)})),(e,t)=>{var n,s;return(0,l.Wz)(),(0,l.An)("div",rn,["disable"===(0,r.KV)(p).login||!K.value||null!=(n=e.edit)&&n.objectId?(0,l.g1)("v-if",!0):((0,l.Wz)(),(0,l.An)("div",an,[(0,l.QD)("div",sn,[(0,l.QD)("button",{type:"submit",class:"wl-logout-btn",title:U.value.logout,onClick:Y},[(0,l.K2)((0,r.KV)(Ve),{size:14})],8,on),(0,l.QD)("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:U.value.profile,onClick:G},[(0,l.QD)("img",{src:(0,r.KV)(f).avatar,alt:"avatar"},null,8,un)],8,cn)]),(0,l.QD)("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:U.value.profile,onClick:G,textContent:(0,i.WA)((0,r.KV)(f).display_name)},null,8,hn)])),(0,l.QD)("div",pn,["force"!==(0,r.KV)(p).login&&(0,r.KV)(p).meta.length&&!K.value?((0,l.Wz)(),(0,l.An)("div",{key:0,class:(0,i.WN)(["wl-header",`item${(0,r.KV)(p).meta.length}`])},[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)((0,r.KV)(p).meta,(e=>((0,l.Wz)(),(0,l.An)("div",{key:e,class:"wl-header-item"},[(0,l.QD)("label",{for:`wl-${e}`,textContent:(0,i.WA)(U.value[e]+((0,r.KV)(p).requiredMeta.includes(e)||!(0,r.KV)(p).requiredMeta.length?"":`(${U.value.optional})`))},null,8,dn),(0,l.wt)((0,l.QD)("input",{id:`wl-${e}`,ref_for:!0,ref:t=>{t&&(v.value[e]=t)},"onUpdate:modelValue":t=>(0,r.KV)(m)[e]=t,class:(0,i.WN)(["wl-input",`wl-${e}`]),name:e,type:"mail"===e?"email":"text"},null,10,gn),[[a.Ah,(0,r.KV)(m)[e]]])])))),128))],2)):(0,l.g1)("v-if",!0),(0,l.wt)((0,l.QD)("textarea",{id:"wl-edit",ref_key:"editorRef",ref:w,"onUpdate:modelValue":t[0]||(t[0]=e=>(0,r.Ir)(g)?g.value=e:null),class:"wl-editor",placeholder:e.replyUser?`@${e.replyUser}`:U.value.placeholder,onKeydown:Q,onDrop:O,onPaste:B},null,40,mn),[[a.Og,(0,r.KV)(g)]]),(0,l.wt)((0,l.QD)("div",fn,[vn,(0,l.QD)("h4",null,(0,i.WA)(U.value.preview)+":",1),(0,l.QD)("div",{class:"wl-content",innerHTML:S.value},null,8,kn)],512),[[a.Ub,E.value]]),(0,l.QD)("div",wn,[(0,l.QD)("div",yn,[(0,l.QD)("a",bn,[(0,l.K2)((0,r.KV)(Ne))]),(0,l.wt)((0,l.QD)("button",{ref_key:"emojiButtonRef",ref:b,type:"button",class:(0,i.WN)(["wl-action",{active:I.value}]),title:U.value.emoji,onClick:t[1]||(t[1]=e=>I.value=!I.value)},[(0,l.K2)((0,r.KV)(Ke))],10,xn),[[a.Ub,C.value.tabs.length]]),(0,r.KV)(p).search?((0,l.Wz)(),(0,l.An)("button",{key:0,ref_key:"gifButtonRef",ref:A,type:"button",class:(0,i.WN)(["wl-action",{active:R.value}]),title:U.value.gif,onClick:t[2]||(t[2]=e=>R.value=!R.value)},[(0,l.K2)((0,r.KV)(Ze))],10,An)):(0,l.g1)("v-if",!0),(0,l.QD)("input",{id:"wl-image-upload",ref_key:"imageUploadRef",ref:y,class:"upload",type:"file",accept:".png,.jpg,.jpeg,.webp,.bmp,.gif",onChange:q},null,544),P.value?((0,l.Wz)(),(0,l.An)("label",{key:1,for:"wl-image-upload",class:"wl-action",title:U.value.uploadImage},[(0,l.K2)((0,r.KV)(Pe))],8,zn)):(0,l.g1)("v-if",!0),(0,l.QD)("button",{type:"button",class:(0,i.WN)(["wl-action",{active:E.value}]),title:U.value.preview,onClick:t[3]||(t[3]=e=>E.value=!E.value)},[(0,l.K2)((0,r.KV)(Qe))],10,$n)]),(0,l.QD)("div",Cn,[Ln,(0,l.QD)("div",In,[(0,l.mY)((0,i.WA)(W.value)+" ",1),(0,r.KV)(p).wordLimit?((0,l.Wz)(),(0,l.An)("span",Rn,[(0,l.mY)("  /  "),(0,l.QD)("span",{class:(0,i.WN)({illegal:!D.value}),textContent:(0,i.WA)(T.value)},null,10,En)])):(0,l.g1)("v-if",!0),(0,l.mY)("  "+(0,i.WA)(U.value.word),1)]),"disable"===(0,r.KV)(p).login||K.value?(0,l.g1)("v-if",!0):((0,l.Wz)(),(0,l.An)("button",{key:0,type:"button",class:"wl-btn",onClick:Z,textContent:(0,i.WA)(U.value.login)},null,8,Sn)),"force"!==(0,r.KV)(p).login||K.value?((0,l.Wz)(),(0,l.An)("button",{key:1,type:"submit",class:"primary wl-btn",title:"Cmd|Ctrl + Enter",disabled:M.value,onClick:F},[M.value?((0,l.Wz)(),(0,l.Az)((0,r.KV)(Fe),{key:0,size:16})):((0,l.Wz)(),(0,l.An)(l.ae,{key:1},[(0,l.mY)((0,i.WA)(U.value.submit),1)],64))],8,Wn)):(0,l.g1)("v-if",!0)]),(0,l.QD)("div",{ref_key:"gifPopupRef",ref:z,class:(0,i.WN)(["wl-gif-popup",{display:R.value}])},[(0,l.QD)("input",{ref_key:"gifSearchInputRef",ref:$,type:"text",placeholder:U.value.gifSearchPlaceholder,onInput:t[4]||(t[4]=(...e)=>(0,r.KV)(ee)&&(0,r.KV)(ee)(...e))},null,40,_n),_.list.length?((0,l.Wz)(),(0,l.Az)(ft,{key:0,items:_.list,"column-width":200,gap:6,onInsert:t[5]||(t[5]=e=>H(e)),onScroll:J},null,8,["items"])):(0,l.g1)("v-if",!0),_.loading?((0,l.Wz)(),(0,l.An)("div",Tn,[(0,l.K2)((0,r.KV)(Fe),{size:30})])):(0,l.g1)("v-if",!0)],2),(0,l.QD)("div",{ref_key:"emojiPopupRef",ref:x,class:(0,i.WN)(["wl-emoji-popup",{display:I.value}])},[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(C.value.tabs,((e,t)=>((0,l.Wz)(),(0,l.An)(l.ae,{key:e.name},[t===L.value?((0,l.Wz)(),(0,l.An)("div",Dn,[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(e.items,(e=>((0,l.Wz)(),(0,l.An)("button",{key:e,type:"button",title:e,onClick:t=>H(`:${e}:`)},[I.value?((0,l.Wz)(),(0,l.An)("img",{key:0,class:"wl-emoji",src:C.value.map[e],alt:e,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Mn)):(0,l.g1)("v-if",!0)],8,jn)))),128))])):(0,l.g1)("v-if",!0)],64)))),128)),C.value.tabs.length>1?((0,l.Wz)(),(0,l.An)("div",Vn,[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(C.value.tabs,((e,t)=>((0,l.Wz)(),(0,l.An)("button",{key:e.name,type:"button",class:(0,i.WN)(["wl-tab",{active:L.value===t}]),onClick:e=>L.value=t},[(0,l.QD)("img",{class:"wl-emoji",src:e.icon,alt:e.name,title:e.name,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Kn)],10,Un)))),128))])):(0,l.g1)("v-if",!0)],2)])]),e.replyId||null!=(s=e.edit)&&s.objectId?((0,l.Wz)(),(0,l.An)("button",{key:1,type:"button",class:"wl-close",title:U.value.cancelReply,onClick:t[6]||(t[6]=t=>e.$emit(e.replyId?"cancelReply":"cancelEdit"))},[(0,l.K2)((0,r.KV)(Ve),{size:24})],8,Pn)):(0,l.g1)("v-if",!0)])}}}),Qn=ht(Hn,[["__file","CommentBox.vue"]]);const Nn=["id"],On={class:"wl-user","aria-hidden":"true"},Bn=["src"],qn={class:"wl-card"},Fn={class:"wl-head"},Zn=["href"],Yn={key:1,class:"wl-nick"},Gn=["textContent"],Xn=["textContent"],Jn=["textContent"],el=["textContent"],tl=["textContent"],nl={class:"wl-comment-actions"},ll=["title"],rl=["title"],il={class:"wl-meta","aria-hidden":"true"},al=["data-value","textContent"],sl=["innerHTML"],ol={key:1,class:"wl-admin-actions"},cl={class:"wl-comment-status"},ul=["disabled","onClick","textContent"],hl={key:3,class:"wl-quote"};var pl=(0,l._M)({__name:"CommentCard",props:{comment:{},edit:{default:null},rootId:{},reply:{default:null}},emits:["log","submit","delete","edit","like","status","sticky","reply"],setup(e,{emit:t}){const n=e,a=t,o=["approved","waiting","spam"],c=(0,l.uU)("config"),u=Ge(),h=(0,s.O8g)(),p=tt(),d=(0,l.S6)((()=>c.value.locale)),g=(0,l.S6)((()=>{const{link:e}=n.comment;return e?wt(e)?e:`https://${e}`:""})),m=(0,l.S6)((()=>u.value.includes(n.comment.objectId))),f=(0,l.S6)((()=>((e,t,n)=>{if(!e)return"";const l=qt(e)?new Date(-1!==e.indexOf(" ")?e.replace(/-/g,"/"):e):e,r=t.getTime()-l.getTime(),i=Math.floor(r/864e5);if(0===i){const e=r%864e5,t=Math.floor(e/36e5);if(0===t){const t=e%36e5,l=Math.floor(t/6e4);if(0===l){const e=t%6e4;return`${Math.round(e/1e3)} ${n.seconds}`}return`${l} ${n.minutes}`}return`${t} ${n.hours}`}return i<0?n.now:i<8?`${i} ${n.days}`:(e=>{const t=Zt(e.getDate(),2),n=Zt(e.getMonth()+1,2);return`${Zt(e.getFullYear(),2)}-${n}-${t}`})(l)})(new Date(n.comment.time),h.value,d.value))),v=(0,l.S6)((()=>"administrator"===p.value.type)),k=(0,l.S6)((()=>n.comment.user_id&&p.value.objectId===n.comment.user_id)),w=(0,l.S6)((()=>{var e;return n.comment.objectId===(null==(e=n.reply)?void 0:e.objectId)})),y=(0,l.S6)((()=>{var e;return n.comment.objectId===(null==(e=n.edit)?void 0:e.objectId)}));return(e,t)=>{var n;const s=(0,l.E1)("CommentCard",!0);return(0,l.Wz)(),(0,l.An)("div",{id:e.comment.objectId,class:"wl-card-item"},[(0,l.QD)("div",On,[e.comment.avatar?((0,l.Wz)(),(0,l.An)("img",{key:0,class:"wl-user-avatar",src:e.comment.avatar},null,8,Bn)):(0,l.g1)("v-if",!0),e.comment.type?((0,l.Wz)(),(0,l.Az)((0,r.KV)(qe),{key:1})):(0,l.g1)("v-if",!0)]),(0,l.QD)("div",qn,[(0,l.QD)("div",Fn,[g.value?((0,l.Wz)(),(0,l.An)("a",{key:0,class:"wl-nick",href:g.value,target:"_blank",rel:"nofollow noopener noreferrer"},(0,i.WA)(e.comment.nick),9,Zn)):((0,l.Wz)(),(0,l.An)("span",Yn,(0,i.WA)(e.comment.nick),1)),"administrator"===e.comment.type?((0,l.Wz)(),(0,l.An)("span",{key:2,class:"wl-badge",textContent:(0,i.WA)(d.value.admin)},null,8,Gn)):(0,l.g1)("v-if",!0),e.comment.label?((0,l.Wz)(),(0,l.An)("span",{key:3,class:"wl-badge",textContent:(0,i.WA)(e.comment.label)},null,8,Xn)):(0,l.g1)("v-if",!0),e.comment.sticky?((0,l.Wz)(),(0,l.An)("span",{key:4,class:"wl-badge",textContent:(0,i.WA)(d.value.sticky)},null,8,Jn)):(0,l.g1)("v-if",!0),"number"==typeof e.comment.level?((0,l.Wz)(),(0,l.An)("span",{key:5,class:(0,i.WN)(`wl-badge level${e.comment.level}`),textContent:(0,i.WA)(d.value[`level${e.comment.level}`]||`Level ${e.comment.level}`)},null,10,el)):(0,l.g1)("v-if",!0),(0,l.QD)("span",{class:"wl-time",textContent:(0,i.WA)(f.value)},null,8,tl),(0,l.QD)("div",nl,[v.value||k.value?((0,l.Wz)(),(0,l.An)(l.ae,{key:0},[(0,l.QD)("button",{type:"button",class:"wl-edit",onClick:t[0]||(t[0]=t=>a("edit",e.comment))},[(0,l.K2)((0,r.KV)(Be))]),(0,l.QD)("button",{type:"button",class:"wl-delete",onClick:t[1]||(t[1]=t=>a("delete",e.comment))},[(0,l.K2)((0,r.KV)(Ue))])],64)):(0,l.g1)("v-if",!0),(0,l.QD)("button",{type:"button",class:"wl-like",title:m.value?d.value.cancelLike:d.value.like,onClick:t[2]||(t[2]=t=>a("like",e.comment))},[(0,l.K2)((0,r.KV)(He),{active:m.value},null,8,["active"]),(0,l.mY)(" "+(0,i.WA)("like"in e.comment?e.comment.like:""),1)],8,ll),(0,l.QD)("button",{type:"button",class:(0,i.WN)(["wl-reply",{active:w.value}]),title:w.value?d.value.cancelReply:d.value.reply,onClick:t[3]||(t[3]=t=>a("reply",w.value?null:e.comment))},[(0,l.K2)((0,r.KV)(Oe))],10,rl)])]),(0,l.QD)("div",il,[((0,l.Wz)(),(0,l.An)(l.ae,null,(0,l.mi)(["addr","browser","os"],(t=>((0,l.Wz)(),(0,l.An)(l.ae,null,[e.comment[t]?((0,l.Wz)(),(0,l.An)("span",{key:t,class:(0,i.WN)(`wl-${t}`),"data-value":e.comment[t],textContent:(0,i.WA)(e.comment[t])},null,10,al)):(0,l.g1)("v-if",!0)],64)))),64))]),y.value?(0,l.g1)("v-if",!0):((0,l.Wz)(),(0,l.An)("div",{key:0,class:"wl-content",innerHTML:e.comment.comment},null,8,sl)),v.value&&!y.value?((0,l.Wz)(),(0,l.An)("div",ol,[(0,l.QD)("span",cl,[((0,l.Wz)(),(0,l.An)(l.ae,null,(0,l.mi)(o,(t=>(0,l.QD)("button",{key:t,type:"submit",class:(0,i.WN)(`wl-btn wl-${t}`),disabled:e.comment.status===t,onClick:n=>a("status",{status:t,comment:e.comment}),textContent:(0,i.WA)(d.value[t])},null,10,ul))),64))]),v.value&&!("rid"in e.comment)?((0,l.Wz)(),(0,l.An)("button",{key:0,type:"submit",class:"wl-btn wl-sticky",onClick:t[4]||(t[4]=t=>a("sticky",e.comment))},(0,i.WA)(e.comment.sticky?d.value.unsticky:d.value.sticky),1)):(0,l.g1)("v-if",!0)])):(0,l.g1)("v-if",!0),w.value||y.value?((0,l.Wz)(),(0,l.An)("div",{key:2,class:(0,i.WN)({"wl-reply-wrapper":w.value,"wl-edit-wrapper":y.value})},[(0,l.K2)(Qn,{edit:e.edit,"reply-id":null==(n=e.reply)?void 0:n.objectId,"reply-user":e.comment.nick,"root-id":e.rootId,onLog:t[5]||(t[5]=e=>a("log")),onCancelReply:t[6]||(t[6]=e=>a("reply",null)),onCancelEdit:t[7]||(t[7]=e=>a("edit",null)),onSubmit:t[8]||(t[8]=e=>a("submit",e))},null,8,["edit","reply-id","reply-user","root-id"])],2)):(0,l.g1)("v-if",!0),"children"in e.comment?((0,l.Wz)(),(0,l.An)("div",hl,[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(e.comment.children,(n=>((0,l.Wz)(),(0,l.Az)(s,{key:n.objectId,comment:n,reply:e.reply,edit:e.edit,"root-id":e.rootId,onLog:t[9]||(t[9]=e=>a("log")),onDelete:t[10]||(t[10]=e=>a("delete",e)),onEdit:t[11]||(t[11]=e=>a("edit",e)),onLike:t[12]||(t[12]=e=>a("like",e)),onReply:t[13]||(t[13]=e=>a("reply",e)),onStatus:t[14]||(t[14]=e=>a("status",e)),onSticky:t[15]||(t[15]=e=>a("sticky",e)),onSubmit:t[16]||(t[16]=e=>a("submit",e))},null,8,["comment","reply","edit","root-id"])))),128))])):(0,l.g1)("v-if",!0)])],8,Nn)}}}),dl=ht(pl,[["__file","CommentCard.vue"]]);const gl="3.0.0-alpha.11",ml={"data-waline":""},fl={class:"wl-meta-head"},vl={class:"wl-count"},kl=["textContent"],wl={class:"wl-sort"},yl=["onClick"],bl={class:"wl-cards"},xl={key:1,class:"wl-operation"},Al=["textContent"],zl={key:2,class:"wl-loading"},$l=["textContent"],Cl={key:4,class:"wl-operation"},Ll=["textContent"],Il={key:5,class:"wl-power"},Rl=(0,l.QD)("a",{href:"https://github.com/walinejs/waline",target:"_blank",rel:"noopener noreferrer"}," Waline ",-1);var El=(0,l._M)({__name:"WalineComment",props:["serverURL","path","meta","requiredMeta","dark","commentSorting","lang","locale","pageSize","wordLimit","emoji","login","highlighter","texRenderer","imageUploader","search","copyright","recaptchaV3Key","turnstileKey","reaction"],setup(e){const t=e,n={latest:"insertedAt_desc",oldest:"insertedAt_asc",hottest:"like_desc"},a=Object.keys(n),o=tt(),c=Ge(),p=(0,r.IL)("loading"),g=(0,r.IL)(0),m=(0,r.IL)(1),f=(0,r.IL)(0),v=(0,l.S6)((()=>(({serverURL:e,path:t=location.pathname,lang:n=(typeof navigator>"u"?"en-US":navigator.language),locale:l,emoji:r=xt,meta:i=["nick","mail","link"],requiredMeta:a=[],dark:s=!1,pageSize:o=10,wordLimit:c,imageUploader:u,highlighter:h,texRenderer:p,copyright:d=!0,login:g="enable",search:m,reaction:f,recaptchaV3Key:v="",turnstileKey:k="",commentSorting:w="latest",...y})=>({serverURL:Nt(e),path:vt(t),lang:Qt(n),locale:{...Ht(n),..."object"==typeof l?l:{}},wordLimit:Ot(c),meta:bt(i),requiredMeta:bt(a),imageUploader:Bt(u,zt),highlighter:Bt(h,Et),texRenderer:Bt(p,$t),dark:s,emoji:"boolean"==typeof r?r?xt:[]:r,pageSize:o,login:g,copyright:d,search:!1!==m&&("object"==typeof m?m:Ct(n)),recaptchaV3Key:v,turnstileKey:k,reaction:Array.isArray(f)?f:!0===f?At:[],commentSorting:w,...y}))(t))),k=(0,r.IL)(v.value.commentSorting),w=(0,r.IL)([]),y=(0,r.IL)(null),b=(0,r.IL)(null),x=(0,l.S6)((()=>(e=>qt(e)?"auto"===e?`@media(prefers-color-scheme:dark){body${Ft}}`:`${e}${Ft}`:!0===e?`:root${Ft}`:"")(v.value.dark))),A=(0,l.S6)((()=>v.value.locale));let z;(0,s.eSL)(x,{id:"waline-darkmode"});const $=e=>{var t;const{serverURL:l,path:r,pageSize:i}=v.value,a=new AbortController;p.value="loading",null==z||z(),(({serverURL:e,lang:t,path:n,page:l,pageSize:r,sortBy:i,signal:a,token:s})=>{const o={};return s&&(o.Authorization=`Bearer ${s}`),fetch(`${u(e)}comment?path=${encodeURIComponent(n)}&pageSize=${r}&page=${l}&lang=${t}&sortBy=${i}`,{signal:a,headers:o}).then((e=>e.json())).then((e=>h(e,"Get comment data").data))})({serverURL:l,lang:v.value.lang,path:r,pageSize:i,sortBy:n[k.value],page:e,signal:a.signal,token:null==(t=o.value)?void 0:t.token}).then((t=>{p.value="success",g.value=t.count,w.value.push(...t.data),m.value=e,f.value=t.totalPages})).catch((e=>{"AbortError"!==e.name&&(console.error(e.message),p.value="error")})),z=a.abort.bind(a)},C=()=>$(m.value+1),L=()=>{g.value=0,w.value=[],$(1)},I=e=>{y.value=e},R=e=>{b.value=e},E=e=>{if(b.value)b.value.comment=e.comment,b.value.orig=e.orig;else if("rid"in e){const t=w.value.find((({objectId:t})=>t===e.rid));if(!t)return;Array.isArray(t.children)||(t.children=[]),t.children.push(e)}else w.value.unshift(e),g.value+=1},S=async({comment:e,status:t})=>{var n;if(e.status===t)return;const{serverURL:l,lang:r}=v.value;await d({serverURL:l,lang:r,token:null==(n=o.value)?void 0:n.token,objectId:e.objectId,comment:{status:t}}),e.status=t},W=async e=>{var t;if("rid"in e)return;const{serverURL:n,lang:l}=v.value;await d({serverURL:n,lang:l,token:null==(t=o.value)?void 0:t.token,objectId:e.objectId,comment:{sticky:e.sticky?0:1}}),e.sticky=!e.sticky},_=async({objectId:e})=>{var t;if(!confirm("Are you sure you want to delete this comment?"))return;const{serverURL:n,lang:l}=v.value;await(({serverURL:e,lang:t,token:n,objectId:l})=>fetch(`${u(e)}comment/${l}?lang=${t}`,{method:"DELETE",headers:{Authorization:`Bearer ${n}`}}).then((e=>e.json())).then((e=>h(e,"Delete comment"))))({serverURL:n,lang:l,token:null==(t=o.value)?void 0:t.token,objectId:e}),w.value.some(((t,n)=>t.objectId===e?(w.value=w.value.filter(((e,t)=>t!==n)),!0):t.children.some(((l,r)=>l.objectId===e&&(w.value[n].children=t.children.filter(((e,t)=>t!==r)),!0)))))},T=async e=>{var t;const{serverURL:n,lang:l}=v.value,{objectId:r}=e,i=c.value.includes(r);await d({serverURL:n,lang:l,objectId:r,token:null==(t=o.value)?void 0:t.token,comment:{like:!i}}),i?c.value=c.value.filter((e=>e!==r)):(c.value=[...c.value,r],c.value.length>50&&(c.value=c.value.slice(-50))),e.like=(e.like||0)+(i?-1:1)};return(0,l.Zl)("config",v),(0,l.u2)((()=>{(0,l.Kg)((()=>[t.serverURL,t.path]),(()=>L()),{immediate:!0})})),(0,l.wx)((()=>null==z?void 0:z())),(e,t)=>((0,l.Wz)(),(0,l.An)("div",ml,[(0,l.K2)(pt),y.value?(0,l.g1)("v-if",!0):((0,l.Wz)(),(0,l.Az)(Qn,{key:0,onLog:L,onSubmit:E})),(0,l.QD)("div",fl,[(0,l.QD)("div",vl,[g.value?((0,l.Wz)(),(0,l.An)("span",{key:0,class:"wl-num",textContent:(0,i.WA)(g.value)},null,8,kl)):(0,l.g1)("v-if",!0),(0,l.mY)(" "+(0,i.WA)(A.value.comment),1)]),(0,l.QD)("ul",wl,[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)((0,r.KV)(a),(e=>((0,l.Wz)(),(0,l.An)("li",{key:e,class:(0,i.WN)([e===k.value?"active":""]),onClick:t=>(e=>{k.value!==e&&(k.value=e,L())})(e)},(0,i.WA)(A.value[e]),11,yl)))),128))])]),(0,l.QD)("div",bl,[((0,l.Wz)(!0),(0,l.An)(l.ae,null,(0,l.mi)(w.value,(e=>((0,l.Wz)(),(0,l.Az)(dl,{key:e.objectId,"root-id":e.objectId,comment:e,reply:y.value,edit:b.value,onLog:L,onReply:I,onEdit:R,onSubmit:E,onStatus:S,onDelete:_,onSticky:W,onLike:T},null,8,["root-id","comment","reply","edit"])))),128))]),"error"===p.value?((0,l.Wz)(),(0,l.An)("div",xl,[(0,l.QD)("button",{type:"button",class:"wl-btn",onClick:L,textContent:(0,i.WA)(A.value.refresh)},null,8,Al)])):"loading"===p.value?((0,l.Wz)(),(0,l.An)("div",zl,[(0,l.K2)((0,r.KV)(Fe),{size:30})])):w.value.length?m.value{t.Hh=void 0;var l=n(2364);Object.defineProperty(t,"Hh",{enumerable:!0,get:function(){return l.load}});n(7756)},7756:function(e,t){var n=this&&this.__awaiter||function(e,t,n,l){return new(n||(n=Promise))((function(r,i){function a(e){try{o(l.next(e))}catch(e){i(e)}}function s(e){try{o(l.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}o((l=l.apply(e,t||[])).next())}))},l=this&&this.__generator||function(e,t){var n,l,r,i,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,l&&(r=2&i[0]?l.return:i[0]?l.throw||((r=l.return)&&r.call(l),0):l.next)&&!(r=r.call(l,i[1])).done)return r;switch(l=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,l=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((r=(r=a.trys).length>0&&r[r.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]{Object.defineProperty(t,"__esModule",{value:!0}),t.getInstance=t.load=void 0;var l,r=n(7756);!function(e){e[e.NOT_LOADED=0]="NOT_LOADED",e[e.LOADING=1]="LOADING",e[e.LOADED=2]="LOADED"}(l||(l={}));var i=function(){function e(){}return e.load=function(t,n){if(void 0===n&&(n={}),"undefined"==typeof document)return Promise.reject(new Error("This is a library for the browser!"));if(e.getLoadingState()===l.LOADED)return e.instance.getSiteKey()===t?Promise.resolve(e.instance):Promise.reject(new Error("reCAPTCHA already loaded with different site key!"));if(e.getLoadingState()===l.LOADING)return t!==e.instanceSiteKey?Promise.reject(new Error("reCAPTCHA already loaded with different site key!")):new Promise((function(t,n){e.successfulLoadingConsumers.push((function(e){return t(e)})),e.errorLoadingRunnable.push((function(e){return n(e)}))}));e.instanceSiteKey=t,e.setLoadingState(l.LOADING);var i=new e;return new Promise((function(a,s){i.loadScript(t,n.useRecaptchaNet||!1,n.useEnterprise||!1,n.renderParameters?n.renderParameters:{},n.customUrl).then((function(){e.setLoadingState(l.LOADED);var s=i.doExplicitRender(grecaptcha,t,n.explicitRenderParameters?n.explicitRenderParameters:{},n.useEnterprise||!1),o=new r.ReCaptchaInstance(t,s,grecaptcha);e.successfulLoadingConsumers.forEach((function(e){return e(o)})),e.successfulLoadingConsumers=[],n.autoHideBadge&&o.hideBadge(),e.instance=o,a(o)})).catch((function(t){e.errorLoadingRunnable.forEach((function(e){return e(t)})),e.errorLoadingRunnable=[],s(t)}))}))},e.getInstance=function(){return e.instance},e.setLoadingState=function(t){e.loadingState=t},e.getLoadingState=function(){return null===e.loadingState?l.NOT_LOADED:e.loadingState},e.prototype.loadScript=function(t,n,r,i,a){var s=this;void 0===n&&(n=!1),void 0===r&&(r=!1),void 0===i&&(i={}),void 0===a&&(a="");var o=document.createElement("script");o.setAttribute("recaptcha-v3-script","");var c="https://www.google.com/recaptcha/api.js";n&&(c=r?"https://recaptcha.net/recaptcha/enterprise.js":"https://recaptcha.net/recaptcha/api.js"),r&&(c="https://www.google.com/recaptcha/enterprise.js"),a&&(c=a),i.render&&(i.render=void 0);var u=this.buildQueryString(i);return o.src=c+"?render=explicit"+u,new Promise((function(t,n){o.addEventListener("load",s.waitForScriptToLoad((function(){t(o)}),r),!1),o.onerror=function(t){e.setLoadingState(l.NOT_LOADED),n(t)},document.head.appendChild(o)}))},e.prototype.buildQueryString=function(e){return Object.keys(e).length<1?"":"&"+Object.keys(e).filter((function(t){return!!e[t]})).map((function(t){return t+"="+e[t]})).join("&")},e.prototype.waitForScriptToLoad=function(t,n){var l=this;return function(){void 0===window.grecaptcha?setTimeout((function(){l.waitForScriptToLoad(t,n)}),e.SCRIPT_LOAD_DELAY):n?window.grecaptcha.enterprise.ready((function(){t()})):window.grecaptcha.ready((function(){t()}))}},e.prototype.doExplicitRender=function(e,t,n,l){var r={sitekey:t,badge:n.badge,size:n.size,tabindex:n.tabindex};return n.container?l?e.enterprise.render(n.container,r):e.render(n.container,r):l?e.enterprise.render(r):e.render(r)},e.loadingState=null,e.instance=null,e.instanceSiteKey=null,e.successfulLoadingConsumers=[],e.errorLoadingRunnable=[],e.SCRIPT_LOAD_DELAY=25,e}();t.load=i.load,t.getInstance=i.getInstance},1798:(e,t,n)=>{n.r(t),n.d(t,{Waline:()=>Sl,version:()=>ml});var l=n(7847),r=n(6719),i=n(4094),a=n(6476),s=n(5670),o=n(2930);const c={"Content-Type":"application/json"},u=e=>`${e.replace(/\/?$/,"/")}api/`,h=(e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},p=({serverURL:e,lang:t,path:n,type:l,action:r})=>fetch(`${u(e)}article?lang=${t}`,{method:"POST",headers:c,body:JSON.stringify({path:n,type:l,action:r})}).then((e=>e.json())).then((e=>h(e,"Update counter").data)),d=({serverURL:e,lang:t,token:n,objectId:l,comment:r})=>fetch(`${u(e)}comment/${l}?lang=${t}`,{method:"PUT",headers:{...c,Authorization:`Bearer ${n}`},body:JSON.stringify(r)}).then((e=>e.json())).then((e=>h(e,"Update comment")));var g=new Map;function m(e){var t=g.get(e);t&&t.destroy()}function f(e){var t=g.get(e);t&&t.update()}var v=null;"undefined"==typeof window?((v=function(e){return e}).destroy=function(e){return e},v.update=function(e){return e}):((v=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],(function(e){return function(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!g.has(e)){var t,n=null,l=window.getComputedStyle(e),r=(t=e.value,function(){a({testForHeightReduction:""===t||!e.value.startsWith(t),restoreTextAlign:null}),t=e.value}),i=function(t){e.removeEventListener("autosize:destroy",i),e.removeEventListener("autosize:update",s),e.removeEventListener("input",r),window.removeEventListener("resize",s),Object.keys(t).forEach((function(n){return e.style[n]=t[n]})),g.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",i),e.addEventListener("autosize:update",s),e.addEventListener("input",r),window.addEventListener("resize",s),e.style.overflowX="hidden",e.style.wordWrap="break-word",g.set(e,{destroy:i,update:s}),s()}function a(t){var r,i,s=t.restoreTextAlign,o=void 0===s?null:s,c=t.testForHeightReduction,u=void 0===c||c,h=l.overflowY;if(0!==e.scrollHeight&&("vertical"===l.resize?e.style.resize="none":"both"===l.resize&&(e.style.resize="horizontal"),u&&(r=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push([e.parentNode,e.parentNode.scrollTop]),e=e.parentNode;return function(){return t.forEach((function(e){var t=e[0],n=e[1];t.style.scrollBehavior="auto",t.scrollTop=n,t.style.scrollBehavior=null}))}}(e),e.style.height=""),i="content-box"===l.boxSizing?e.scrollHeight-(parseFloat(l.paddingTop)+parseFloat(l.paddingBottom)):e.scrollHeight+parseFloat(l.borderTopWidth)+parseFloat(l.borderBottomWidth),"none"!==l.maxHeight&&i>parseFloat(l.maxHeight)?("hidden"===l.overflowY&&(e.style.overflow="scroll"),i=parseFloat(l.maxHeight)):"hidden"!==l.overflowY&&(e.style.overflow="hidden"),e.style.height=i+"px",o&&(e.style.textAlign=o),r&&r(),n!==i&&(e.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),n=i),h!==l.overflow&&!o)){var p=l.textAlign;"hidden"===l.overflow&&(e.style.textAlign="start"===p?"end":"start"),a({restoreTextAlign:p,testForHeightReduction:!0})}}function s(){a({testForHeightReduction:!0,restoreTextAlign:null})}}(e)})),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],m),e},v.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],f),e});const k=v;let w={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};function y(e){w=e}const b=/[&<>"']/,x=new RegExp(b.source,"g"),C=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,$=new RegExp(C.source,"g"),E={"&":"&","<":"<",">":">",'"':""","'":"'"},R=e=>E[e];function L(e,t){if(t){if(b.test(e))return e.replace(x,R)}else if(C.test(e))return e.replace($,R);return e}const z=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function _(e){return e.replace(z,((e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}const I=/(^|[^\[])\^/g;function A(e,t){let n="string"==typeof e?e:e.source;t=t||"";const l={replace:(e,t)=>{let r="string"==typeof t?t:t.source;return r=r.replace(I,"$1"),n=n.replace(e,r),l},getRegex:()=>new RegExp(n,t)};return l}function S(e){try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return null}return e}const T={exec:()=>null};function j(e,t){const n=e.replace(/\|/g,((e,t,n)=>{let l=!1,r=t;for(;--r>=0&&"\\"===n[r];)l=!l;return l?"|":" |"})).split(/ \|/);let l=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:M(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t){const n=e.match(/^(\s+)(?:```)/);if(null===n)return t;const l=n[1];return t.split("\n").map((e=>{const t=e.match(/^\s+/);if(null===t)return e;const[n]=t;return n.length>=l.length?e.slice(l.length):e})).join("\n")}(e,t[3]||"");return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){const t=M(e,"#");this.options.pedantic?e=t.trim():t&&!/ $/.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){const e=M(t[0].replace(/^ *>[ \t]?/gm,""),"\n"),n=this.lexer.state.top;this.lexer.state.top=!0;const l=this.lexer.blockTokens(e);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:l,text:e}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim();const l=n.length>1,r={type:"list",raw:"",ordered:l,start:l?+n.slice(0,-1):"",loose:!1,items:[]};n=l?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=l?n:"[*+-]");const i=new RegExp(`^( {0,3}${n})((?:[\t ][^\\n]*)?(?:\\n|$))`);let a="",s="",o=!1;for(;e;){let n=!1;if(!(t=i.exec(e)))break;if(this.rules.block.hr.test(e))break;a=t[0],e=e.substring(a.length);let l=t[2].split("\n",1)[0].replace(/^\t+/,(e=>" ".repeat(3*e.length))),c=e.split("\n",1)[0],u=0;this.options.pedantic?(u=2,s=l.trimStart()):(u=t[2].search(/[^ ]/),u=u>4?1:u,s=l.slice(u),u+=t[1].length);let h=!1;if(!l&&/^ *$/.test(c)&&(a+=c+"\n",e=e.substring(c.length+1),n=!0),!n){const t=new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),n=new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),r=new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\`\`\`|~~~)`),i=new RegExp(`^ {0,${Math.min(3,u-1)}}#`);for(;e;){const o=e.split("\n",1)[0];if(c=o,this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),r.test(c))break;if(i.test(c))break;if(t.test(c))break;if(n.test(e))break;if(c.search(/[^ ]/)>=u||!c.trim())s+="\n"+c.slice(u);else{if(h)break;if(l.search(/[^ ]/)>=4)break;if(r.test(l))break;if(i.test(l))break;if(n.test(l))break;s+="\n"+c}h||c.trim()||(h=!0),a+=o+"\n",e=e.substring(o.length+1),l=c.slice(u)}}r.loose||(o?r.loose=!0:/\n *\n *$/.test(a)&&(o=!0));let p,d=null;this.options.gfm&&(d=/^\[[ xX]\] /.exec(s),d&&(p="[ ] "!==d[0],s=s.replace(/^\[[ xX]\] +/,""))),r.items.push({type:"list_item",raw:a,task:!!d,checked:p,loose:!1,text:s,tokens:[]}),r.raw+=a}r.items[r.items.length-1].raw=a.trimEnd(),r.items[r.items.length-1].text=s.trimEnd(),r.raw=r.raw.trimEnd();for(let e=0;e"space"===e.type)),n=t.length>0&&t.some((e=>/\n.*\n/.test(e.raw)));r.loose=n}if(r.loose)for(let e=0;e$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",l=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:l}}}table(e){const t=this.rules.block.table.exec(e);if(!t)return;if(!/[:|]/.test(t[2]))return;const n=j(t[1]),l=t[2].replace(/^\||\| *$/g,"").split("|"),r=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[],i={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===l.length){for(const e of l)/^ *-+: *$/.test(e)?i.align.push("right"):/^ *:-+: *$/.test(e)?i.align.push("center"):/^ *:-+ *$/.test(e)?i.align.push("left"):i.align.push(null);for(const e of n)i.header.push({text:e,tokens:this.lexer.inline(e)});for(const e of r)i.rows.push(j(e,i.header.length).map((e=>({text:e,tokens:this.lexer.inline(e)}))));return i}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const e="\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:L(t[1])}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^
    /i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;const t=M(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let l=0;l-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],l="";if(this.options.pedantic){const e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],l=e[3])}else l=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^$/.test(e)?n.slice(1):n.slice(1,-1)),X(t,{href:n?n.replace(this.rules.inline.anyPunctuation,"$1"):n,title:l?l.replace(this.rules.inline.anyPunctuation,"$1"):l},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const e=t[(n[2]||n[1]).replace(/\s+/g," ").toLowerCase()];if(!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return X(n,e,n[0],this.lexer)}}emStrong(e,t,n=""){let l=this.rules.inline.emStrongLDelim.exec(e);if(l&&(!l[3]||!n.match(/[\p{L}\p{N}]/u))&&(!l[1]&&!l[2]||!n||this.rules.inline.punctuation.exec(n))){const n=[...l[0]].length-1;let r,i,a=n,s=0;const o="*"===l[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(o.lastIndex=0,t=t.slice(-1*e.length+n);null!=(l=o.exec(t));){if(r=l[1]||l[2]||l[3]||l[4]||l[5]||l[6],!r)continue;if(i=[...r].length,l[3]||l[4]){a+=i;continue}if((l[5]||l[6])&&n%3&&!((n+i)%3)){s+=i;continue}if(a-=i,a>0)continue;i=Math.min(i,i+a+s);const t=[...l[0]][0].length,o=e.slice(0,n+l.index+t+i);if(Math.min(n,i)%2){const e=o.slice(1,-1);return{type:"em",raw:o,text:e,tokens:this.lexer.inlineTokens(e)}}const c=o.slice(2,-2);return{type:"strong",raw:o,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g," ");const n=/[^ ]/.test(e),l=/^ /.test(e)&&/ $/.test(e);return n&&l&&(e=e.substring(1,e.length-1)),e=L(e,!0),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=L(t[1]),n="mailto:"+e):(e=L(t[1]),n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=L(t[0]),n="mailto:"+e;else{let l;do{l=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??""}while(l!==t[0]);e=L(t[0]),n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){let e;return e=this.lexer.state.inRawBlock?t[0]:L(t[0]),{type:"text",raw:t[0],text:e}}}}const W=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,H=/(?:[*+-]|\d{1,9}[.)])/,P=A(/^(?!bull )((?:.|\n(?!\s*?\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,H).getRegex(),K=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,U=/(?!\s*\])(?:\\.|[^\[\]\\])+/,B=A(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",U).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),O=A(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,H).getRegex(),V="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",D=/|$))/,Q=A("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",D).replace("tag",V).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),N=A(K).replace("hr",W).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",V).getRegex(),q={blockquote:A(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",N).getRegex(),code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,def:B,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:W,html:Q,lheading:P,list:O,newline:/^(?: *(?:\n|$))+/,paragraph:N,table:T,text:/^[^\n]+/},Z=A("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",W).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",V).getRegex(),G={...q,table:Z,paragraph:A(K).replace("hr",W).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Z).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",V).getRegex()},Y={...q,html:A("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",D).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:T,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:A(K).replace("hr",W).replace("heading"," *#{1,6} *[^\n]").replace("lheading",P).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},J=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ee=/^( {2,}|\\)\n(?!\s*$)/,te="\\p{P}\\p{S}",ne=A(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,te).getRegex(),le=A(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,te).getRegex(),re=A("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,te).getRegex(),ie=A("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,te).getRegex(),ae=A(/\\([punct])/,"gu").replace(/punct/g,te).getRegex(),se=A(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),oe=A(D).replace("(?:--\x3e|$)","--\x3e").getRegex(),ce=A("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",oe).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ue=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,he=A(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",ue).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),pe=A(/^!?\[(label)\]\[(ref)\]/).replace("label",ue).replace("ref",U).getRegex(),de=A(/^!?\[(ref)\](?:\[\])?/).replace("ref",U).getRegex(),ge={_backpedal:T,anyPunctuation:ae,autolink:se,blockSkip:/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,br:ee,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:T,emStrongLDelim:le,emStrongRDelimAst:re,emStrongRDelimUnd:ie,escape:J,link:he,nolink:de,punctuation:ne,reflink:pe,reflinkSearch:A("reflink|nolink(?!\\()","g").replace("reflink",pe).replace("nolink",de).getRegex(),tag:ce,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\t+" ".repeat(n.length)));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((l=>!!(n=l.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.space(e))e=e.substring(n.raw.length),1===n.raw.length&&t.length>0?t[t.length-1].raw+="\n":t.push(n);else if(n=this.tokenizer.code(e))e=e.substring(n.raw.length),l=t[t.length-1],!l||"paragraph"!==l.type&&"text"!==l.type?t.push(n):(l.raw+="\n"+n.raw,l.text+="\n"+n.text,this.inlineQueue[this.inlineQueue.length-1].src=l.text);else if(n=this.tokenizer.fences(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.heading(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.hr(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.blockquote(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.list(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.html(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.def(e))e=e.substring(n.raw.length),l=t[t.length-1],!l||"paragraph"!==l.type&&"text"!==l.type?this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title}):(l.raw+="\n"+n.raw,l.text+="\n"+n.raw,this.inlineQueue[this.inlineQueue.length-1].src=l.text);else if(n=this.tokenizer.table(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.lheading(e))e=e.substring(n.raw.length),t.push(n);else{if(r=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let l;this.options.extensions.startBlock.forEach((e=>{l=e.call({lexer:this},n),"number"==typeof l&&l>=0&&(t=Math.min(t,l))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(this.state.top&&(n=this.tokenizer.paragraph(r)))l=t[t.length-1],i&&"paragraph"===l.type?(l.raw+="\n"+n.raw,l.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=l.text):t.push(n),i=r.length!==e.length,e=e.substring(n.raw.length);else if(n=this.tokenizer.text(e))e=e.substring(n.raw.length),l=t[t.length-1],l&&"text"===l.type?(l.raw+="\n"+n.raw,l.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=l.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,l,r,i,a,s,o=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(o));)e.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(o=o.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(o));)o=o.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.anyPunctuation.exec(o));)o=o.slice(0,i.index)+"++"+o.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(a||(s=""),a=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((l=>!!(n=l.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),l=t[t.length-1],l&&"text"===n.type&&"text"===l.type?(l.raw+=n.raw,l.text+=n.text):t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),l=t[t.length-1],l&&"text"===n.type&&"text"===l.type?(l.raw+=n.raw,l.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,o,s))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e))){if(r=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let l;this.options.extensions.startInline.forEach((e=>{l=e.call({lexer:this},n),"number"==typeof l&&l>=0&&(t=Math.min(t,l))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(r))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(s=n.raw.slice(-1)),a=!0,l=t[t.length-1],l&&"text"===l.type?(l.raw+=n.raw,l.text+=n.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(n.raw.length),t.push(n);return t}}class be{options;constructor(e){this.options=e||w}code(e,t,n){const l=(t||"").match(/^\S*/)?.[0];return e=e.replace(/\n$/,"")+"\n",l?'
    '+(n?e:L(e,!0))+"
    \n":"
    "+(n?e:L(e,!0))+"
    \n"}blockquote(e){return`
    \n${e}
    \n`}html(e,t){return e}heading(e,t,n){return`${e}\n`}hr(){return"
    \n"}list(e,t,n){const l=t?"ol":"ul";return"<"+l+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"}listitem(e,t,n){return`
  • ${e}
  • \n`}checkbox(e){return"'}paragraph(e){return`

    ${e}

    \n`}table(e,t){return t&&(t=`${t}`),"\n\n"+e+"\n"+t+"
    \n"}tablerow(e){return`\n${e}\n`}tablecell(e,t){const n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`\n`}strong(e){return`${e}`}em(e){return`${e}`}codespan(e){return`${e}`}br(){return"
    "}del(e){return`${e}`}link(e,t,n){const l=S(e);if(null===l)return n;let r='
    ",r}image(e,t,n){const l=S(e);if(null===l)return n;let r=`${n}0&&"paragraph"===n.tokens[0].type?(n.tokens[0].text=e+" "+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&"text"===n.tokens[0].tokens[0].type&&(n.tokens[0].tokens[0].text=e+" "+n.tokens[0].tokens[0].text)):n.tokens.unshift({type:"text",text:e+" "}):s+=e+" "}s+=this.parse(n.tokens,i),a+=this.renderer.listitem(s,r,!!l)}n+=this.renderer.list(a,t,l);continue}case"html":{const e=r;n+=this.renderer.html(e.text,e.block);continue}case"paragraph":{const e=r;n+=this.renderer.paragraph(this.parseInline(e.tokens));continue}case"text":{let i=r,a=i.tokens?this.parseInline(i.tokens):i.text;for(;l+1{const r=e[l].flat(1/0);n=n.concat(this.walkTokens(r,t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{const n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){const n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let l=e.renderer.apply(this,t);return!1===l&&(l=n.apply(this,t)),l}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");const n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){const t=this.defaults.renderer||new be(this.defaults);for(const n in e.renderer){if(!(n in t))throw new Error(`renderer '${n}' does not exist`);if("options"===n)continue;const l=n,r=e.renderer[l],i=t[l];t[l]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){const t=this.defaults.tokenizer||new F(this.defaults);for(const n in e.tokenizer){if(!(n in t))throw new Error(`tokenizer '${n}' does not exist`);if(["options","rules","lexer"].includes(n))continue;const l=n,r=e.tokenizer[l],i=t[l];t[l]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){const t=this.defaults.hooks||new $e;for(const n in e.hooks){if(!(n in t))throw new Error(`hook '${n}' does not exist`);if("options"===n)continue;const l=n,r=e.hooks[l],i=t[l];$e.passThroughHooks.has(n)?t[l]=e=>{if(this.defaults.async)return Promise.resolve(r.call(t,e)).then((e=>i.call(t,e)));const n=r.call(t,e);return i.call(t,n)}:t[l]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){const t=this.defaults.walkTokens,l=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(l.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ye.lex(e,t??this.defaults)}parser(e,t){return Ce.parse(e,t??this.defaults)}#e(e,t){return(n,l)=>{const r={...l},i={...this.defaults,...r};!0===this.defaults.async&&!1===r.async&&(i.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),i.async=!0);const a=this.#t(!!i.silent,!!i.async);if(null==n)return a(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof n)return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(i.hooks&&(i.hooks.options=i),i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(n):n).then((t=>e(t,i))).then((e=>i.hooks?i.hooks.processAllTokens(e):e)).then((e=>i.walkTokens?Promise.all(this.walkTokens(e,i.walkTokens)).then((()=>e)):e)).then((e=>t(e,i))).then((e=>i.hooks?i.hooks.postprocess(e):e)).catch(a);try{i.hooks&&(n=i.hooks.preprocess(n));let l=e(n,i);i.hooks&&(l=i.hooks.processAllTokens(l)),i.walkTokens&&this.walkTokens(l,i.walkTokens);let r=t(l,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}#t(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="

    An error occurred:

    "+L(n.message+"",!0)+"
    ";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}}const Re=new Ee;function Le(e,t){return Re.parse(e,t)}function ze(e){return(e||"").match(/\S*/)[0]}function _e(e){return t=>{"string"==typeof t&&t!==e.text&&(e.escaped=!0,e.text=t)}}Le.options=Le.setOptions=function(e){return Re.setOptions(e),Le.defaults=Re.defaults,y(Le.defaults),Le},Le.getDefaults=function(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}},Le.defaults=w,Le.use=function(...e){return Re.use(...e),Le.defaults=Re.defaults,y(Le.defaults),Le},Le.walkTokens=function(e,t){return Re.walkTokens(e,t)},Le.parseInline=Re.parseInline,Le.Parser=Ce,Le.parser=Ce.parse,Le.Renderer=be,Le.TextRenderer=xe,Le.Lexer=ye,Le.lexer=ye.lex,Le.Tokenizer=F,Le.Hooks=$e,Le.parse=Le,Le.options,Le.setOptions,Le.use,Le.walkTokens,Le.parseInline,Ce.parse,ye.lex;const Ie=/[&<>"']/,Ae=new RegExp(Ie.source,"g"),Se=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Te=new RegExp(Se.source,"g"),je={"&":"&","<":"<",">":">",'"':""","'":"'"},Me=e=>je[e];function Xe(e,t){if(t){if(Ie.test(e))return e.replace(Ae,Me)}else if(Se.test(e))return e.replace(Te,Me);return e}var Fe=n(9179);const We=({size:e})=>(0,l.h)("svg",{class:"wl-close-icon",viewBox:"0 0 1024 1024",width:e,height:e},[(0,l.h)("path",{d:"M697.173 85.333h-369.92c-144.64 0-241.92 101.547-241.92 252.587v348.587c0 150.613 97.28 252.16 241.92 252.16h369.92c144.64 0 241.494-101.547 241.494-252.16V337.92c0-151.04-96.854-252.587-241.494-252.587z",fill:"currentColor"}),(0,l.h)("path",{d:"m640.683 587.52-75.947-75.861 75.904-75.862a37.29 37.29 0 0 0 0-52.778 37.205 37.205 0 0 0-52.779 0l-75.946 75.818-75.862-75.946a37.419 37.419 0 0 0-52.821 0 37.419 37.419 0 0 0 0 52.821l75.947 75.947-75.776 75.733a37.29 37.29 0 1 0 52.778 52.821l75.776-75.776 75.947 75.947a37.376 37.376 0 0 0 52.779-52.821z",fill:"#888"})]),He=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"m341.013 394.667 27.755 393.45h271.83l27.733-393.45h64.106l-28.01 397.952a64 64 0 0 1-63.83 59.498H368.768a64 64 0 0 1-63.83-59.52l-28.053-397.93h64.128zm139.307 19.818v298.667h-64V414.485h64zm117.013 0v298.667h-64V414.485h64zM181.333 288h640v64h-640v-64zm453.483-106.667v64h-256v-64h256z",fill:"red"})),Pe=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"M563.2 463.3 677 540c1.7 1.2 3.7 1.8 5.8 1.8.7 0 1.4-.1 2-.2 2.7-.5 5.1-2.1 6.6-4.4l25.3-37.8c1.5-2.3 2.1-5.1 1.6-7.8s-2.1-5.1-4.4-6.6l-73.6-49.1 73.6-49.1c2.3-1.5 3.9-3.9 4.4-6.6.5-2.7 0-5.5-1.6-7.8l-25.3-37.8a10.1 10.1 0 0 0-6.6-4.4c-.7-.1-1.3-.2-2-.2-2.1 0-4.1.6-5.8 1.8l-113.8 76.6c-9.2 6.2-14.7 16.4-14.7 27.5.1 11 5.5 21.3 14.7 27.4zM387 348.8h-45.5c-5.7 0-10.4 4.7-10.4 10.4v153.3c0 5.7 4.7 10.4 10.4 10.4H387c5.7 0 10.4-4.7 10.4-10.4V359.2c0-5.7-4.7-10.4-10.4-10.4zm333.8 241.3-41-20a10.3 10.3 0 0 0-8.1-.5c-2.6.9-4.8 2.9-5.9 5.4-30.1 64.9-93.1 109.1-164.4 115.2-5.7.5-9.9 5.5-9.5 11.2l3.9 45.5c.5 5.3 5 9.5 10.3 9.5h.9c94.8-8 178.5-66.5 218.6-152.7 2.4-5 .3-11.2-4.8-13.6zm186-186.1c-11.9-42-30.5-81.4-55.2-117.1-24.1-34.9-53.5-65.6-87.5-91.2-33.9-25.6-71.5-45.5-111.6-59.2-41.2-14-84.1-21.1-127.8-21.1h-1.2c-75.4 0-148.8 21.4-212.5 61.7-63.7 40.3-114.3 97.6-146.5 165.8-32.2 68.1-44.3 143.6-35.1 218.4 9.3 74.8 39.4 145 87.3 203.3.1.2.3.3.4.5l36.2 38.4c1.1 1.2 2.5 2.1 3.9 2.6 73.3 66.7 168.2 103.5 267.5 103.5 73.3 0 145.2-20.3 207.7-58.7 37.3-22.9 70.3-51.5 98.1-85 27.1-32.7 48.7-69.5 64.2-109.1 15.5-39.7 24.4-81.3 26.6-123.8 2.4-43.6-2.5-87-14.5-129zm-60.5 181.1c-8.3 37-22.8 72-43 104-19.7 31.1-44.3 58.6-73.1 81.7-28.8 23.1-61 41-95.7 53.4-35.6 12.7-72.9 19.1-110.9 19.1-82.6 0-161.7-30.6-222.8-86.2l-34.1-35.8c-23.9-29.3-42.4-62.2-55.1-97.7-12.4-34.7-18.8-71-19.2-107.9-.4-36.9 5.4-73.3 17.1-108.2 12-35.8 30-69.2 53.4-99.1 31.7-40.4 71.1-72 117.2-94.1 44.5-21.3 94-32.6 143.4-32.6 49.3 0 97 10.8 141.8 32 34.3 16.3 65.3 38.1 92 64.8 26.1 26 47.5 56 63.6 89.2 16.2 33.2 26.6 68.5 31 105.1 4.6 37.5 2.7 75.3-5.6 112.3z",fill:"currentColor"})),Ke=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[(0,l.h)("path",{d:"M784 112H240c-88 0-160 72-160 160v480c0 88 72 160 160 160h544c88 0 160-72 160-160V272c0-88-72-160-160-160zm96 640c0 52.8-43.2 96-96 96H240c-52.8 0-96-43.2-96-96V272c0-52.8 43.2-96 96-96h544c52.8 0 96 43.2 96 96v480z",fill:"currentColor"}),(0,l.h)("path",{d:"M352 480c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96zm0-128c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32zm462.4 379.2-3.2-3.2-177.6-177.6c-25.6-25.6-65.6-25.6-91.2 0l-80 80-36.8-36.8c-25.6-25.6-65.6-25.6-91.2 0L200 728c-4.8 6.4-8 14.4-8 24 0 17.6 14.4 32 32 32 9.6 0 16-3.2 22.4-9.6L380.8 640l134.4 134.4c6.4 6.4 14.4 9.6 24 9.6 17.6 0 32-14.4 32-32 0-9.6-4.8-17.6-9.6-24l-52.8-52.8 80-80L769.6 776c6.4 4.8 12.8 8 20.8 8 17.6 0 32-14.4 32-32 0-8-3.2-16-8-20.8z",fill:"currentColor"})]),Ue=({active:e=!1})=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[(0,l.h)("path",{d:"M850.654 323.804c-11.042-25.625-26.862-48.532-46.885-68.225-20.022-19.61-43.258-34.936-69.213-45.73-26.78-11.124-55.124-16.727-84.375-16.727-40.622 0-80.256 11.123-114.698 32.135A214.79 214.79 0 0 0 512 241.819a214.79 214.79 0 0 0-23.483-16.562c-34.442-21.012-74.076-32.135-114.698-32.135-29.25 0-57.595 5.603-84.375 16.727-25.872 10.711-49.19 26.12-69.213 45.73-20.105 19.693-35.843 42.6-46.885 68.225-11.453 26.615-17.303 54.877-17.303 83.963 0 27.439 5.603 56.03 16.727 85.117 9.31 24.307 22.659 49.52 39.715 74.981 27.027 40.293 64.188 82.316 110.33 124.915 76.465 70.615 152.189 119.394 155.402 121.371l19.528 12.525c8.652 5.52 19.776 5.52 28.427 0l19.529-12.525c3.213-2.06 78.854-50.756 155.401-121.371 46.143-42.6 83.304-84.622 110.33-124.915 17.057-25.46 30.487-50.674 39.716-74.981 11.124-29.087 16.727-57.678 16.727-85.117.082-29.086-5.768-57.348-17.221-83.963z"+(e?"":"M512 761.5S218.665 573.55 218.665 407.767c0-83.963 69.461-152.023 155.154-152.023 60.233 0 112.473 33.618 138.181 82.727 25.708-49.109 77.948-82.727 138.18-82.727 85.694 0 155.155 68.06 155.155 152.023C805.335 573.551 512 761.5 512 761.5z"),fill:e?"red":"currentColor"})]),Be=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[(0,l.h)("path",{d:"M710.816 654.301c70.323-96.639 61.084-230.578-23.705-314.843-46.098-46.098-107.183-71.109-172.28-71.109-65.008 0-126.092 25.444-172.28 71.109-45.227 46.098-70.756 107.183-70.756 172.106 0 64.923 25.444 126.007 71.194 172.106 46.099 46.098 107.184 71.109 172.28 71.109 51.414 0 100.648-16.212 142.824-47.404l126.53 126.006c7.058 7.06 16.297 10.979 26.406 10.979 10.105 0 19.343-3.919 26.402-10.979 14.467-14.467 14.467-38.172 0-52.723L710.816 654.301zm-315.107-23.265c-65.88-65.88-65.88-172.54 0-238.42 32.069-32.07 74.245-49.149 119.471-49.149 45.227 0 87.407 17.603 119.472 49.149 65.88 65.879 65.88 172.539 0 238.42-63.612 63.178-175.242 63.178-238.943 0zm0 0",fill:"currentColor"}),(0,l.h)("path",{d:"M703.319 121.603H321.03c-109.8 0-199.469 89.146-199.469 199.38v382.034c0 109.796 89.236 199.38 199.469 199.38h207.397c20.653 0 37.384-16.645 37.384-37.299 0-20.649-16.731-37.296-37.384-37.296H321.03c-68.582 0-124.352-55.77-124.352-124.267V321.421c0-68.496 55.77-124.267 124.352-124.267h382.289c68.582 0 124.352 55.771 124.352 124.267V524.72c0 20.654 16.736 37.299 37.385 37.299 20.654 0 37.384-16.645 37.384-37.299V320.549c-.085-109.8-89.321-198.946-199.121-198.946zm0 0",fill:"currentColor"})]),Oe=()=>(0,l.h)("svg",{width:"16",height:"16",ariaHidden:"true"},(0,l.h)("path",{d:"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z",fill:"currentColor"})),Ve=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"M810.667 213.333a64 64 0 0 1 64 64V704a64 64 0 0 1-64 64H478.336l-146.645 96.107a21.333 21.333 0 0 1-33.024-17.856V768h-85.334a64 64 0 0 1-64-64V277.333a64 64 0 0 1 64-64h597.334zm0 64H213.333V704h149.334v63.296L459.243 704h351.424V277.333zm-271.36 213.334v64h-176.64v-64h176.64zm122.026-128v64H362.667v-64h298.666z",fill:"currentColor"})),De=()=>(0,l.h)("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},(0,l.h)("path",{d:"M813.039 318.772L480.53 651.278H360.718V531.463L693.227 198.961C697.904 194.284 704.027 192 710.157 192C716.302 192 722.436 194.284 727.114 198.961L813.039 284.88C817.72 289.561 820 295.684 820 301.825C820 307.95 817.72 314.093 813.039 318.772ZM710.172 261.888L420.624 551.431V591.376H460.561L750.109 301.825L710.172 261.888ZM490.517 291.845H240.906V771.09H720.156V521.479C720.156 504.947 733.559 491.529 750.109 491.529C766.653 491.529 780.063 504.947 780.063 521.479V791.059C780.063 813.118 762.18 831 740.125 831H220.937C198.882 831 181 813.118 181 791.059V271.872C181 249.817 198.882 231.935 220.937 231.935H490.517C507.06 231.935 520.47 245.352 520.47 261.888C520.47 278.424 507.06 291.845 490.517 291.845Z",fill:"currentColor"})),Qe=()=>(0,l.h)("svg",{class:"verified-icon",viewBox:"0 0 1024 1024",width:"14",height:"14"},(0,l.h)("path",{d:"m894.4 461.56-54.4-63.2c-10.4-12-18.8-34.4-18.8-50.4v-68c0-42.4-34.8-77.2-77.2-77.2h-68c-15.6 0-38.4-8.4-50.4-18.8l-63.2-54.4c-27.6-23.6-72.8-23.6-100.8 0l-62.8 54.8c-12 10-34.8 18.4-50.4 18.4h-69.2c-42.4 0-77.2 34.8-77.2 77.2v68.4c0 15.6-8.4 38-18.4 50l-54 63.6c-23.2 27.6-23.2 72.4 0 100l54 63.6c10 12 18.4 34.4 18.4 50v68.4c0 42.4 34.8 77.2 77.2 77.2h69.2c15.6 0 38.4 8.4 50.4 18.8l63.2 54.4c27.6 23.6 72.8 23.6 100.8 0l63.2-54.4c12-10.4 34.4-18.8 50.4-18.8h68c42.4 0 77.2-34.8 77.2-77.2v-68c0-15.6 8.4-38.4 18.8-50.4l54.4-63.2c23.2-27.6 23.2-73.2-.4-100.8zm-216-25.2-193.2 193.2a30 30 0 0 1-42.4 0l-96.8-96.8a30.16 30.16 0 0 1 0-42.4c11.6-11.6 30.8-11.6 42.4 0l75.6 75.6 172-172c11.6-11.6 30.8-11.6 42.4 0 11.6 11.6 11.6 30.8 0 42.4z",fill:"#27ae60"})),Ne=({size:e=100})=>(0,l.h)("svg",{width:e,height:e,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},(0,l.h)("circle",{cx:50,cy:50,fill:"none",stroke:"currentColor",strokeWidth:"4",r:"40","stroke-dasharray":"85 30"},(0,l.h)("animateTransform",{attributeName:"transform",type:"rotate",repeatCount:"indefinite",dur:"1s",values:"0 50 50;360 50 50",keyTimes:"0;1"}))),qe=()=>(0,l.h)("svg",{width:24,height:24,fill:"currentcolor",viewBox:"0 0 24 24"},[(0,l.h)("path",{style:"transform: translateY(0.5px)",d:"M18.968 10.5H15.968V11.484H17.984V12.984H15.968V15H14.468V9H18.968V10.5V10.5ZM8.984 9C9.26533 9 9.49967 9.09367 9.687 9.281C9.87433 9.46833 9.968 9.70267 9.968 9.984V10.5H6.499V13.5H8.468V12H9.968V14.016C9.968 14.2973 9.87433 14.5317 9.687 14.719C9.49967 14.9063 9.26533 15 8.984 15H5.984C5.70267 15 5.46833 14.9063 5.281 14.719C5.09367 14.5317 5 14.2973 5 14.016V9.985C5 9.70367 5.09367 9.46933 5.281 9.282C5.46833 9.09467 5.70267 9.001 5.984 9.001H8.984V9ZM11.468 9H12.968V15H11.468V9V9Z"}),(0,l.h)("path",{d:"M18.5 3H5.75C3.6875 3 2 4.6875 2 6.75V18C2 20.0625 3.6875 21.75 5.75 21.75H18.5C20.5625 21.75 22.25 20.0625 22.25 18V6.75C22.25 4.6875 20.5625 3 18.5 3ZM20.75 18C20.75 19.2375 19.7375 20.25 18.5 20.25H5.75C4.5125 20.25 3.5 19.2375 3.5 18V6.75C3.5 5.5125 4.5125 4.5 5.75 4.5H18.5C19.7375 4.5 20.75 5.5125 20.75 6.75V18Z"})]);let Ze=null;const Ge=()=>Ze||(Ze=(0,s.rXt)("WALINE_LIKE",[]));let Ye=null;const Je={};let et=null;const tt=()=>et??(et=(0,s.rXt)("WALINE_USER",{})),nt={key:0,class:"wl-reaction"},lt=["textContent"],rt={class:"wl-reaction-list"},it=["onClick"],at={class:"wl-reaction-img"},st=["src","alt"],ot=["textContent"],ct=["textContent"];var ut=(0,l.pM)({__name:"ArticleReaction",setup(e,{expose:t}){t();const n=Ye??(Ye=(0,s.rXt)("WALINE_REACTION",{})),a=(0,l.WQ)("config"),o=(0,r.KR)(-1),c=(0,r.KR)([]),d=(0,l.EW)((()=>a.value.locale)),g=(0,l.EW)((()=>a.value.reaction.length>0)),m=(0,l.EW)((()=>{const{reaction:e,path:t}=a.value;return e.map(((e,l)=>({icon:e,desc:d.value[`reaction${l}`],active:n.value[t]===l})))}));let f;const v=async e=>{if(-1===o.value){const{serverURL:t,lang:l,path:r}=a.value,i=n.value[r];o.value=e,void 0!==i&&(await p({serverURL:t,lang:l,path:r,type:`reaction${i}`,action:"desc"}),c.value[i]=Math.max(c.value[i]-1,0)),i!==e&&(await p({serverURL:t,lang:l,path:r,type:`reaction${e}`}),c.value[e]=(c.value[e]||0)+1),i===e?delete n.value[r]:n.value[r]=e,o.value=-1}};return(0,l.sV)((()=>{(0,l.wB)((()=>[a.value.serverURL,a.value.path]),(()=>{(async()=>{if(g.value){const{serverURL:e,lang:t,path:n,reaction:l}=a.value,r=new AbortController;f=r.abort.bind(r);const i=await(({serverURL:e,lang:t,paths:n,type:l,signal:r})=>fetch(`${u(e)}article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(l.join(","))}&lang=${t}`,{signal:r}).then((e=>e.json())).then((e=>h(e,"Get counter").data)))({serverURL:e,lang:t,paths:[n],type:l.map(((e,t)=>`reaction${t}`)),signal:r.signal});if(Array.isArray(i)||"number"==typeof i)return;c.value=l.map(((e,t)=>i[`reaction${t}`]))}})()}),{immediate:!0})})),(0,l.hi)((()=>null==f?void 0:f())),(e,t)=>m.value.length?((0,l.uX)(),(0,l.CE)("div",nt,[(0,l.Lk)("div",{class:"wl-reaction-title",textContent:(0,i.v_)(d.value.reactionTitle)},null,8,lt),(0,l.Lk)("ul",rt,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(m.value,(({active:e,icon:t,desc:n},a)=>((0,l.uX)(),(0,l.CE)("li",{key:a,class:(0,i.C4)(["wl-reaction-item",{active:e}]),onClick:e=>v(a)},[(0,l.Lk)("div",at,[(0,l.Lk)("img",{src:t,alt:n},null,8,st),o.value===a?((0,l.uX)(),(0,l.Wv)((0,r.R1)(Ne),{key:0,class:"wl-reaction-loading"})):((0,l.uX)(),(0,l.CE)("div",{key:1,class:"wl-reaction-votes",textContent:(0,i.v_)(c.value[a]||0)},null,8,ot))]),(0,l.Lk)("div",{class:"wl-reaction-text",textContent:(0,i.v_)(n)},null,8,ct)],10,it)))),128))])])):(0,l.Q3)("v-if",!0)}}),ht=(e,t)=>{const n=e.__vccOpts||e;for(const[e,l]of t)n[e]=l;return n},pt=ht(ut,[["__file","ArticleReaction.vue"]]);const dt=["data-index"],gt=["src","title","onClick"];var mt=(0,l.pM)({__name:"ImageWall",props:{items:{default:()=>[]},columnWidth:{default:300},gap:{default:0}},emits:["insert"],setup(e,{expose:t}){const n=e;t();let a=null;const s=(0,r.KR)(null),o=(0,r.KR)({}),c=(0,r.KR)([]),u=()=>{const e=Math.floor((s.value.getBoundingClientRect().width+n.gap)/(n.columnWidth+n.gap));return e>0?e:1},h=async e=>{var t;if(e>=n.items.length)return;await(0,l.dY)();const r=Array.from((null==(t=s.value)?void 0:t.children)||[]).reduce(((e,t)=>t.getBoundingClientRect().height{if(c.value.length===u()&&!e)return;c.value=(e=>new Array(e).fill(null).map((()=>[])))(u());const t=window.scrollY;await h(0),window.scrollTo({top:t})},d=e=>{o.value[e.target.src]=!0};return(0,l.sV)((()=>{p(!0),a=new ResizeObserver((()=>{p()})),a.observe(s.value),(0,l.wB)((()=>[n.items]),(()=>{o.value={},p(!0)})),(0,l.wB)((()=>[n.columnWidth,n.gap]),(()=>{p()}))})),(0,l.xo)((()=>a.unobserve(s.value))),(e,t)=>((0,l.uX)(),(0,l.CE)("div",{ref_key:"wall",ref:s,class:"wl-gallery",style:(0,i.Tr)({gap:`${e.gap}px`})},[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(c.value,((t,n)=>((0,l.uX)(),(0,l.CE)("div",{key:n,class:"wl-gallery-column","data-index":n,style:(0,i.Tr)({gap:`${e.gap}px`})},[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(t,(t=>((0,l.uX)(),(0,l.CE)(l.FK,{key:t},[o.value[e.items[t].src]?(0,l.Q3)("v-if",!0):((0,l.uX)(),(0,l.Wv)((0,r.R1)(Ne),{key:0,size:36,style:{margin:"20px auto"}})),(0,l.Lk)("img",{class:"wl-gallery-item",src:e.items[t].src,title:e.items[t].title,loading:"lazy",onLoad:d,onClick:n=>e.$emit("insert",`![](${e.items[t].src})`)},null,40,gt)],64)))),128))],12,dt)))),128))],4))}}),ft=ht(mt,[["__file","ImageWall.vue"]]);const vt=e=>{try{e=decodeURI(e)}catch{}return e},kt=(e="")=>e.replace(/\/$/u,""),wt=e=>/^(https?:)?\/\//.test(e),yt=["nick","mail","link"],bt=e=>e.filter((e=>yt.includes(e))),xt=["//unpkg.com/@waline/emojis@1.1.0/weibo"],Ct=["//unpkg.com/@waline/emojis/tieba/tieba_agree.png","//unpkg.com/@waline/emojis/tieba/tieba_look_down.png","//unpkg.com/@waline/emojis/tieba/tieba_sunglasses.png","//unpkg.com/@waline/emojis/tieba/tieba_pick_nose.png","//unpkg.com/@waline/emojis/tieba/tieba_awkward.png","//unpkg.com/@waline/emojis/tieba/tieba_sleep.png"],$t=e=>new Promise(((t,n)=>{if(e.size>128e3)return n(new Error("File too large! File size limit 128KB"));const l=new FileReader;l.readAsDataURL(e),l.onload=()=>{var e;return t((null==(e=l.result)?void 0:e.toString())||"")},l.onerror=n})),Et=e=>!0===e?'

    TeX is not available in preview

    ':'TeX is not available in preview',Rt=e=>{const t=async(t,n={})=>fetch(`https://api.giphy.com/v1/gifs/${t}?${new URLSearchParams({lang:e,limit:"20",rating:"g",api_key:"6CIMLkNMMOhRcXPoMCPkFy4Ybk2XUiMp",...n}).toString()}`).then((e=>e.json())).then((({data:e})=>e.map((e=>({title:e.title,src:e.images.downsized_medium.url})))));return{search:e=>t("search",{q:e,offset:"0"}),default:()=>t("trending",{}),more:(e,n=0)=>t("search",{q:e,offset:n.toString()})}},Lt=new RegExp(`(${/[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af\u0400-\u04FF]+|\w+/.source}|${/{let t=0;return e.replace(Lt,((e,n,l)=>{if(l)return`${l}`;if("<"===n)return"<";let r;_t[n]?r=_t[n]:(r=zt[t],_t[n]=r);const i=`${n}`;return t=++t%zt.length,i}))},At=["nick","nickError","mail","mailError","link","optional","placeholder","sofa","submit","like","cancelLike","reply","cancelReply","comment","refresh","more","preview","emoji","uploadImage","seconds","minutes","hours","days","now","uploading","login","logout","admin","sticky","word","wordHint","anonymous","level0","level1","level2","level3","level4","level5","gif","gifSearchPlaceholder","profile","approved","waiting","spam","unsticky","oldest","latest","hottest","reactionTitle"],St=e=>Object.fromEntries(e.map(((e,t)=>[At[t],e])));var Tt=St(["NickName","NickName cannot be less than 3 bytes.","E-Mail","Please confirm your email address.","Website","Optional","Comment here...","No comment yet.","Submit","Like","Cancel like","Reply","Cancel reply","Comments","Refresh","Load More...","Preview","Emoji","Upload Image","seconds ago","minutes ago","hours ago","days ago","just now","Uploading","Login","logout","Admin","Sticky","Words","Please input comments between $0 and $1 words!\n Current word number: $2","Anonymous","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Search GIF","Profile","Approved","Waiting","Spam","Unsticky","Oldest","Latest","Hottest","What do you think?"]),jt=St(["Pseudo","Le pseudo ne peut pas faire moins de 3 octets.","E-mail","Veuillez confirmer votre adresse e-mail.","Site Web","Optionnel","Commentez ici...","Aucun commentaire pour l'instant.","Envoyer","J'aime","Annuler le j'aime","Répondre","Annuler la réponse","Commentaires","Actualiser","Charger plus...","Aperçu","Emoji","Télécharger une image","Il y a quelques secondes","Il y a quelques minutes","Il y a quelques heures","Il y a quelques jours","À l'instant","Téléchargement en cours","Connexion","Déconnexion","Admin","Épinglé","Mots","Veuillez saisir des commentaires entre $0 et $1 mots !\n Nombre actuel de mots : $2","Anonyme","Nains","Hobbits","Ents","Mages","Elfes","Maïar","GIF","Rechercher un GIF","Profil","Approuvé","En attente","Indésirable","Détacher","Le plus ancien","Dernier","Le plus populaire","Qu'en pensez-vous ?"]),Mt=St(["ニックネーム","3バイト以上のニックネームをご入力ください.","メールアドレス","メールアドレスをご確認ください.","サイト","オプション","ここにコメント","コメントしましょう~","提出する","Like","Cancel like","返信する","キャンセル","コメント","更新","さらに読み込む","プレビュー","絵文字","画像をアップロード","秒前","分前","時間前","日前","たっだ今","アップロード","ログインする","ログアウト","管理者","トップに置く","ワード","コメントは $0 から $1 ワードの間でなければなりません!\n 現在の単語番号: $2","匿名","うえにん","なかにん","しもおし","特にしもおし","かげ","なぬし","GIF","探す GIF","個人情報","承認済み","待っている","スパム","べたつかない","逆順","正順","人気順","どう思いますか?"]),Xt=St(["Apelido","Apelido não pode ser menor que 3 bytes.","E-Mail","Por favor, confirme seu endereço de e-mail.","Website","Opcional","Comente aqui...","Nenhum comentário, ainda.","Enviar","Like","Cancel like","Responder","Cancelar resposta","Comentários","Refrescar","Carregar Mais...","Visualizar","Emoji","Enviar Imagem","segundos atrás","minutos atrás","horas atrás","dias atrás","agora mesmo","Enviando","Entrar","Sair","Admin","Sticky","Palavras","Favor enviar comentário com $0 a $1 palavras!\n Número de palavras atuais: $2","Anônimo","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Pesquisar GIF","informação pessoal","Aprovado","Espera","Spam","Unsticky","Mais velho","Mais recentes","Mais quente","O que você acha?"]),Ft=St(["Псевдоним","Никнейм не может быть меньше 3 байт.","Эл. адрес","Пожалуйста, подтвердите адрес вашей электронной почты.","Веб-сайт","Необязательный","Комментарий здесь...","Пока нет комментариев.","Отправить","Like","Cancel like","Отвечать","Отменить ответ","Комментарии","Обновить","Загрузи больше...","Превью","эмодзи","Загрузить изображение","секунд назад","несколько минут назад","несколько часов назад","дней назад","прямо сейчас","Загрузка","Авторизоваться","Выход из системы","Админ","Липкий","Слова","Пожалуйста, введите комментарии от $0 до $1 слов!\nНомер текущего слова: $2","Анонимный","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Поиск GIF","Персональные данные","Одобренный","Ожидающий","Спам","Нелипкий","самый старый","последний","самый горячий","Что вы думаете?"]),Wt=St(["Tên","Tên không được nhỏ hơn 3 ký tự.","E-Mail","Vui lòng xác nhập địa chỉ email của bạn.","Website","Tùy chọn","Hãy bình luận có văn hoá!","Chưa có bình luận","Gửi","Thích","Bỏ thích","Trả lời","Hủy bỏ","bình luận","Làm mới","Tải thêm...","Xem trước","Emoji","Tải lên hình ảnh","giây trước","phút trước","giờ trước","ngày trước","Vừa xong","Đang tải lên","Đăng nhập","đăng xuất","Quản trị viên","Dính","từ","Bình luận phải có độ dài giữa $0 và $1 từ!\n Số từ hiện tại: $2","Vô danh","Người lùn","Người tí hon","Thần rừng","Pháp sư","Tiên tộc","Maiar","Ảnh GIF","Tìm kiếm ảnh GIF","thông tin cá nhân","Đã được phê duyệt","Đang chờ đợi","Thư rác","Không dính","lâu đời nhất","muộn nhất","nóng nhất","What do you think?"]),Ht=St(["昵称","昵称不能少于3个字符","邮箱","请填写正确的邮件地址","网址","可选","欢迎评论","来发评论吧~","提交","喜欢","取消喜欢","回复","取消回复","评论","刷新","加载更多...","预览","表情","上传图片","秒前","分钟前","小时前","天前","刚刚","正在上传","登录","退出","博主","置顶","字","评论字数应在 $0 到 $1 字之间!\n当前字数:$2","匿名","潜水","冒泡","吐槽","活跃","话痨","传说","表情包","搜索表情包","个人资料","通过","待审核","垃圾","取消置顶","按倒序","按正序","按热度","你认为这篇文章怎么样?"]),Pt=St(["暱稱","暱稱不能少於3個字元","郵箱","請填寫正確的郵件地址","網址","可選","歡迎留言","來發留言吧~","送出","喜歡","取消喜歡","回覆","取消回覆","留言","重整","載入更多...","預覽","表情","上傳圖片","秒前","分鐘前","小時前","天前","剛剛","正在上傳","登入","登出","管理者","置頂","字","留言字數應在 $0 到 $1 字之間!\n目前字數:$2","匿名","潛水","冒泡","吐槽","活躍","多話","傳說","表情包","搜尋表情包","個人資料","通過","待審核","垃圾","取消置頂","最早","最新","熱門","你認為這篇文章怎麼樣?"]);const Kt="en-US",Ut={zh:Ht,"zh-cn":Ht,"zh-tw":Pt,en:Tt,"en-us":Tt,fr:jt,"fr-fr":jt,jp:Mt,"jp-jp":Mt,"pt-br":Xt,ru:Ft,"ru-ru":Ft,vi:Wt,"vi-vn":Wt},Bt=e=>Ut[e.toLowerCase()]||Ut[Kt],Ot=e=>Object.keys(Ut).includes(e.toLowerCase())?e:Kt,Vt=e=>{const t=kt(e);return wt(t)?t:`https://${t}`},Dt=e=>Array.isArray(e)?e:!!e&&[0,e],Qt=(e,t)=>"function"==typeof e?e:!1!==e&&t,Nt=e=>"string"==typeof e,qt="{--waline-white:#000;--waline-light-grey:#666;--waline-dark-grey:#999;--waline-color:#888;--waline-bg-color:#1e1e1e;--waline-bg-color-light:#272727;--waline-bg-color-hover: #444;--waline-border-color:#333;--waline-disable-bg-color:#444;--waline-disable-color:#272727;--waline-bq-color:#272727;--waline-info-bg-color:#272727;--waline-info-color:#666}",Zt=(e,t)=>{let n=e.toString();for(;n.length`${t?`${t}/`:""}${n}${e}${l?`.${l}`:""}`,Jt=e=>e.type.includes("image"),en=e=>{const t=Array.from(e).find(Jt);return t?t.getAsFile():null},tn=/\$.*?\$/,nn=/^\$(.*?)\$/,ln=/^(?:\s{0,3})\$\$((?:[^\n]|\n[^\n])+?)\n{0,1}\$\$/,rn=(e="",t={})=>e.replace(/:(.+?):/g,((e,n)=>t[n]?`${n}`:e)),an={class:"wl-comment"},sn={key:0,class:"wl-login-info"},on={class:"wl-avatar"},cn=["title"],un=["title"],hn=["src"],pn=["title","textContent"],dn={class:"wl-panel"},gn=["for","textContent"],mn=["id","onUpdate:modelValue","name","type"],fn=["placeholder"],vn={class:"wl-preview"},kn=(0,l.Lk)("hr",null,null,-1),wn=["innerHTML"],yn={class:"wl-footer"},bn={class:"wl-actions"},xn={href:"https://guides.github.com/features/mastering-markdown/",title:"Markdown Guide","aria-label":"Markdown is supported",class:"wl-action",target:"_blank",rel:"noopener noreferrer"},Cn=["title"],$n=["title"],En=["title"],Rn=["title"],Ln={class:"wl-info"},zn=(0,l.Lk)("div",{class:"wl-captcha-container"},null,-1),_n={class:"wl-text-number"},In={key:0},An=["textContent"],Sn=["textContent"],Tn=["disabled"],jn=["placeholder"],Mn={key:1,class:"wl-loading"},Xn={key:0,class:"wl-tab-wrapper"},Fn=["title","onClick"],Wn=["src","alt"],Hn={key:0,class:"wl-tabs"},Pn=["onClick"],Kn=["src","alt","title"],Un=["title"];var Bn=(0,l.pM)({__name:"CommentBox",props:{edit:{default:null},rootId:{default:""},replyId:{default:""},replyUser:{default:""}},emits:["log","cancelEdit","cancelReply","submit"],setup(e,{expose:t,emit:n}){const c=e,h=n;t();const p=(0,l.WQ)("config"),g=(0,s.rXt)("WALINE_COMMENT_BOX_EDITOR",""),m=(0,s.rXt)("WALINE_USER_META",{nick:"",mail:"",link:""}),f=tt(),v=(0,r.KR)({}),w=(0,r.KR)(null),y=(0,r.KR)(null),b=(0,r.KR)(null),x=(0,r.KR)(null),C=(0,r.KR)(null),$=(0,r.KR)(null),E=(0,r.KR)(null),R=(0,r.KR)({tabs:[],map:{}}),L=(0,r.KR)(0),z=(0,r.KR)(!1),_=(0,r.KR)(!1),I=(0,r.KR)(!1),A=(0,r.KR)(""),S=(0,r.KR)(0),T=(0,r.Kh)({loading:!0,list:[]}),j=(0,r.KR)(0),M=(0,r.KR)(!1),X=(0,r.KR)(""),F=(0,r.KR)(!1),W=(0,r.KR)(!1),H=(0,l.EW)((()=>p.value.locale)),P=(0,l.EW)((()=>{var e;return!(null==(e=f.value)||!e.token)})),K=(0,l.EW)((()=>!1!==p.value.imageUploader)),U=e=>{const t=w.value,n=t.selectionStart,l=t.selectionEnd||0,r=t.scrollTop;g.value=t.value.substring(0,n)+e+t.value.substring(l,t.value.length),t.focus(),t.selectionStart=n+e.length,t.selectionEnd=n+e.length,t.scrollTop=r},B=e=>{const t=e.key;(e.ctrlKey||e.metaKey)&&"Enter"===t&&N()},O=e=>{const t=`![${p.value.locale.uploading} ${e.name}]()`;return U(t),F.value=!0,Promise.resolve().then((()=>p.value.imageUploader(e))).then((n=>{g.value=g.value.replace(t,`\r\n![${e.name}](${n})`)})).catch((e=>{alert(e.message),g.value=g.value.replace(t,"")})).then((()=>{F.value=!1}))},V=e=>{var t;if(null!=(t=e.dataTransfer)&&t.items){const t=en(e.dataTransfer.items);t&&K.value&&(O(t),e.preventDefault())}},D=e=>{if(e.clipboardData){const t=en(e.clipboardData.items);t&&K.value&&O(t)}},Q=()=>{const e=y.value;e.files&&K.value&&O(e.files[0]).then((()=>{e.value=""}))},N=async()=>{var e,t,n,l,r,i;const{serverURL:a,lang:o,login:k,wordLimit:y,requiredMeta:b,recaptchaV3Key:x,turnstileKey:C}=p.value,$=await(async()=>{if(!navigator)return"";const{userAgentData:e}=navigator;let t=navigator.userAgent;if(!e||"Windows"!==e.platform)return t;const{platformVersion:n}=await e.getHighEntropyValues(["platformVersion"]);return n&&parseInt(n.split(".")[0])>=13&&(t=t.replace("Windows NT 10.0","Windows NT 11.0")),t})(),E={comment:X.value,nick:m.value.nick,mail:m.value.mail,link:m.value.link,url:p.value.path,ua:$};if(null!=(e=f.value)&&e.token&&!c.edit)E.nick=f.value.display_name,E.mail=f.value.email,E.link=f.value.url;else{if("force"===k)return;if(b.indexOf("nick")>-1&&!E.nick)return null==(t=v.value.nick)||t.focus(),alert(H.value.nickError);if(b.indexOf("mail")>-1&&!E.mail||E.mail&&!(e=>Gt.test(e))(E.mail))return null==(n=v.value.mail)||n.focus(),alert(H.value.mailError);E.nick||(E.nick=H.value.anonymous)}if(E.comment){if(!M.value)return alert(H.value.wordHint.replace("$0",y[0].toString()).replace("$1",y[1].toString()).replace("$2",S.value.toString()));E.comment=rn(E.comment,R.value.map),c.replyId&&c.rootId&&(E.pid=c.replyId,E.rid=c.rootId,E.at=c.replyUser),F.value=!0;try{x&&(E.recaptchaV3=await(e=>{const t=Je[e]??(Je[e]=(0,Fe.Hh)(e,{useRecaptchaNet:!0,autoHideBadge:!0}));return{execute:e=>t.then((t=>t.execute(e)))}})(x).execute("social")),C&&(E.turnstile=await(e=>({execute:async t=>{const{load:n}=(0,s.r9V)("https://challenges.cloudflare.com/turnstile/v0/api.js",void 0,{async:!1});await n();const l=null==window?void 0:window.turnstile;return new Promise((n=>{null==l||l.ready((()=>{null==l||l.render(".wl-captcha-container",{sitekey:e,action:t,size:"compact",callback:n})}))}))}}))(C).execute("social"));const e={serverURL:a,lang:o,token:null==(r=f.value)?void 0:r.token,comment:E},t=await(c.edit?d({objectId:c.edit.objectId,...e}):(({serverURL:e,lang:t,token:n,comment:l})=>{const r={"Content-Type":"application/json"};return n&&(r.Authorization=`Bearer ${n}`),fetch(`${u(e)}comment?lang=${t}`,{method:"POST",headers:r,body:JSON.stringify(l)}).then((e=>e.json()))})(e));if(F.value=!1,t.errmsg)return alert(t.errmsg);h("submit",t.data),g.value="",A.value="",c.replyId&&h("cancelReply"),null!=(i=c.edit)&&i.objectId&&h("cancelEdit")}catch(e){F.value=!1,alert(e.message)}}else null==(l=w.value)||l.focus()},q=e=>{e.preventDefault();const{lang:t,serverURL:n}=p.value;(({lang:e,serverURL:t})=>{const n=(window.innerWidth-450)/2,l=(window.innerHeight-450)/2,r=window.open(`${t.replace(/\/$/,"")}/ui/login?lng=${encodeURIComponent(e)}`,"_blank",`width=450,height=450,left=${n},top=${l},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return r?.postMessage({type:"TOKEN",data:null},"*"),new Promise((e=>{const t=({data:n})=>{!n||"object"!=typeof n||"userInfo"!==n.type||n.data.token&&(r?.close(),window.removeEventListener("message",t),e(n.data))};window.addEventListener("message",t)}))})({serverURL:n,lang:t}).then((e=>{f.value=e,(e.remember?localStorage:sessionStorage).setItem("WALINE_USER",JSON.stringify(e)),h("log")}))},Z=()=>{f.value={},localStorage.setItem("WALINE_USER","null"),sessionStorage.setItem("WALINE_USER","null"),h("log")},G=e=>{e.preventDefault();const{lang:t,serverURL:n}=p.value,l=(window.innerWidth-800)/2,r=(window.innerHeight-800)/2,i=new URLSearchParams({lng:t,token:f.value.token}),a=window.open(`${n}/ui/profile?${i.toString()}`,"_blank",`width=800,height=800,left=${l},top=${r},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);null==a||a.postMessage({type:"TOKEN",data:f.value.token},"*")},Y=e=>{var t,n,l,r;null!=(t=b.value)&&t.contains(e.target)||null!=(n=x.value)&&n.contains(e.target)||(z.value=!1),null!=(l=C.value)&&l.contains(e.target)||null!=(r=$.value)&&r.contains(e.target)||(_.value=!1)},J=async e=>{var t;const{scrollTop:n,clientHeight:l,scrollHeight:r}=e.target,i=(l+n)/r,a=p.value.search,s=(null==(t=E.value)?void 0:t.value)||"";i<.9||T.loading||W.value||(T.loading=!0,(a.more&&T.list.length?await a.more(s,T.list.length):await a.search(s)).length?T.list=[...T.list,...a.more&&T.list.length?await a.more(s,T.list.length):await a.search(s)]:W.value=!0,T.loading=!1,setTimeout((()=>{e.target.scrollTop=n}),50))},ee=(0,o.Q0)((e=>{T.list=[],W.value=!1,J(e)}),300);(0,l.wB)([p,S],(([e,t])=>{const{wordLimit:n}=e;n?tn[1]?(j.value=n[1],M.value=!1):(j.value=n[1],M.value=!0):(j.value=0,M.value=!0)}),{immediate:!0});const te=({data:e})=>{!e||"profile"!==e.type||(f.value={...f.value,...e.data},[localStorage,sessionStorage].filter((e=>e.getItem("WALINE_USER"))).forEach((e=>e.setItem("WALINE_USER",JSON.stringify(f)))))};return(0,l.sV)((()=>{var e;document.body.addEventListener("click",Y),window.addEventListener("message",te),null!=(e=c.edit)&&e.objectId&&(g.value=c.edit.orig),(0,l.wB)(_,(async e=>{if(!e)return;const t=p.value.search;E.value&&(E.value.value=""),T.loading=!0,T.list=t.default?await t.default():await t.search(""),T.loading=!1})),(0,l.wB)((()=>g.value),(e=>{const{highlighter:t,texRenderer:n}=p.value;X.value=e,A.value=((e,{emojiMap:t,highlighter:n,texRenderer:l})=>{const r=new Ee;if(r.setOptions({breaks:!0}),n&&r.use(function(e){if("function"==typeof e&&(e={highlight:e}),!e||"function"!=typeof e.highlight)throw new Error("Must provide highlight function");return"string"!=typeof e.langPrefix&&(e.langPrefix="language-"),{async:!!e.async,walkTokens(t){if("code"!==t.type)return;const n=ze(t.lang);if(e.async)return Promise.resolve(e.highlight(t.text,n,t.lang||"")).then(_e(t));const l=e.highlight(t.text,n,t.lang||"");if(l instanceof Promise)throw new Error("markedHighlight is not set to async but the highlight function is async. Set the async option to true on markedHighlight to await the async highlight function.");_e(t)(l)},renderer:{code(t,n,l){const r=ze(n),i=r?` class="${e.langPrefix}${Xe(r)}"`:"";return t=t.replace(/\n$/,""),`
    ${l?t:Xe(t,!0)}\n
    `}}}}({highlight:n})),l){const e=(e=>[{name:"blockMath",level:"block",tokenizer(t){const n=ln.exec(t);if(null!==n)return{type:"html",raw:n[0],text:e(!0,n[1])}}},{name:"inlineMath",level:"inline",start(e){const t=e.search(tn);return-1!==t?t:e.length},tokenizer(t){const n=nn.exec(t);if(null!==n)return{type:"html",raw:n[0],text:e(!1,n[1])}}}])(l);r.use({extensions:e})}return r.parse(rn(e,t))})(e,{emojiMap:R.value.map,highlighter:t,texRenderer:n}),S.value=(e=>{var t,n;return((null==(t=(e=>e.match(/[\w\d\s,.\u00C0-\u024F\u0400-\u04FF]+/giu))(e))?void 0:t.reduce(((e,t)=>e+(["",",","."].includes(t.trim())?0:t.trim().split(/\s+/u).length)),0))||0)+((null==(n=(e=>e.match(/[\u4E00-\u9FD5]/gu))(e))?void 0:n.length)||0)})(e),e?k(w.value):k.destroy(w.value)}),{immediate:!0}),(0,l.wB)((()=>p.value.emoji),(e=>(e=>Promise.all(e.map((e=>Nt(e)?(e=>{const t=(0,s.rXt)("WALINE_EMOJI",{}),n=(e=>!!/@[0-9]+\.[0-9]+\.[0-9]+/.test(e))(e);if(n){const n=t.value[e];if(n)return Promise.resolve(n)}return fetch(`${e}/info.json`).then((e=>e.json())).then((l=>{const r={folder:e,...l};return n&&(t.value[e]=r),r}))})(kt(e)):Promise.resolve(e)))).then((e=>{const t={tabs:[],map:{}};return e.forEach((e=>{const{name:n,folder:l,icon:r,prefix:i,type:a,items:s}=e;t.tabs.push({name:n,icon:Yt(r,l,i,a),items:s.map((e=>{const n=`${i||""}${e}`;return t.map[n]=Yt(e,l,i,a),n}))})})),t})))(e).then((e=>{R.value=e}))),{immediate:!0})})),(0,l.hi)((()=>{document.body.removeEventListener("click",Y),window.removeEventListener("message",te)})),(e,t)=>{var n,s;return(0,l.uX)(),(0,l.CE)("div",an,["disable"===(0,r.R1)(p).login||!P.value||null!=(n=e.edit)&&n.objectId?(0,l.Q3)("v-if",!0):((0,l.uX)(),(0,l.CE)("div",sn,[(0,l.Lk)("div",on,[(0,l.Lk)("button",{type:"submit",class:"wl-logout-btn",title:H.value.logout,onClick:Z},[(0,l.bF)((0,r.R1)(We),{size:14})],8,cn),(0,l.Lk)("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:H.value.profile,onClick:G},[(0,l.Lk)("img",{src:(0,r.R1)(f).avatar,alt:"avatar"},null,8,hn)],8,un)]),(0,l.Lk)("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:H.value.profile,onClick:G,textContent:(0,i.v_)((0,r.R1)(f).display_name)},null,8,pn)])),(0,l.Lk)("div",dn,["force"!==(0,r.R1)(p).login&&(0,r.R1)(p).meta.length&&!P.value?((0,l.uX)(),(0,l.CE)("div",{key:0,class:(0,i.C4)(["wl-header",`item${(0,r.R1)(p).meta.length}`])},[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)((0,r.R1)(p).meta,(e=>((0,l.uX)(),(0,l.CE)("div",{key:e,class:"wl-header-item"},[(0,l.Lk)("label",{for:`wl-${e}`,textContent:(0,i.v_)(H.value[e]+((0,r.R1)(p).requiredMeta.includes(e)||!(0,r.R1)(p).requiredMeta.length?"":`(${H.value.optional})`))},null,8,gn),(0,l.bo)((0,l.Lk)("input",{id:`wl-${e}`,ref_for:!0,ref:t=>{t&&(v.value[e]=t)},"onUpdate:modelValue":t=>(0,r.R1)(m)[e]=t,class:(0,i.C4)(["wl-input",`wl-${e}`]),name:e,type:"mail"===e?"email":"text"},null,10,mn),[[a.hp,(0,r.R1)(m)[e]]])])))),128))],2)):(0,l.Q3)("v-if",!0),(0,l.bo)((0,l.Lk)("textarea",{id:"wl-edit",ref_key:"editorRef",ref:w,"onUpdate:modelValue":t[0]||(t[0]=e=>(0,r.i9)(g)?g.value=e:null),class:"wl-editor",placeholder:e.replyUser?`@${e.replyUser}`:H.value.placeholder,onKeydown:B,onDrop:V,onPaste:D},null,40,fn),[[a.Jo,(0,r.R1)(g)]]),(0,l.bo)((0,l.Lk)("div",vn,[kn,(0,l.Lk)("h4",null,(0,i.v_)(H.value.preview)+":",1),(0,l.Lk)("div",{class:"wl-content",innerHTML:A.value},null,8,wn)],512),[[a.aG,I.value]]),(0,l.Lk)("div",yn,[(0,l.Lk)("div",bn,[(0,l.Lk)("a",xn,[(0,l.bF)((0,r.R1)(Oe))]),(0,l.bo)((0,l.Lk)("button",{ref_key:"emojiButtonRef",ref:b,type:"button",class:(0,i.C4)(["wl-action",{active:z.value}]),title:H.value.emoji,onClick:t[1]||(t[1]=e=>z.value=!z.value)},[(0,l.bF)((0,r.R1)(Pe))],10,Cn),[[a.aG,R.value.tabs.length]]),(0,r.R1)(p).search?((0,l.uX)(),(0,l.CE)("button",{key:0,ref_key:"gifButtonRef",ref:C,type:"button",class:(0,i.C4)(["wl-action",{active:_.value}]),title:H.value.gif,onClick:t[2]||(t[2]=e=>_.value=!_.value)},[(0,l.bF)((0,r.R1)(qe))],10,$n)):(0,l.Q3)("v-if",!0),(0,l.Lk)("input",{id:"wl-image-upload",ref_key:"imageUploadRef",ref:y,class:"upload",type:"file",accept:".png,.jpg,.jpeg,.webp,.bmp,.gif",onChange:Q},null,544),K.value?((0,l.uX)(),(0,l.CE)("label",{key:1,for:"wl-image-upload",class:"wl-action",title:H.value.uploadImage},[(0,l.bF)((0,r.R1)(Ke))],8,En)):(0,l.Q3)("v-if",!0),(0,l.Lk)("button",{type:"button",class:(0,i.C4)(["wl-action",{active:I.value}]),title:H.value.preview,onClick:t[3]||(t[3]=e=>I.value=!I.value)},[(0,l.bF)((0,r.R1)(Be))],10,Rn)]),(0,l.Lk)("div",Ln,[zn,(0,l.Lk)("div",_n,[(0,l.eW)((0,i.v_)(S.value)+" ",1),(0,r.R1)(p).wordLimit?((0,l.uX)(),(0,l.CE)("span",In,[(0,l.eW)("  /  "),(0,l.Lk)("span",{class:(0,i.C4)({illegal:!M.value}),textContent:(0,i.v_)(j.value)},null,10,An)])):(0,l.Q3)("v-if",!0),(0,l.eW)("  "+(0,i.v_)(H.value.word),1)]),"disable"===(0,r.R1)(p).login||P.value?(0,l.Q3)("v-if",!0):((0,l.uX)(),(0,l.CE)("button",{key:0,type:"button",class:"wl-btn",onClick:q,textContent:(0,i.v_)(H.value.login)},null,8,Sn)),"force"!==(0,r.R1)(p).login||P.value?((0,l.uX)(),(0,l.CE)("button",{key:1,type:"submit",class:"primary wl-btn",title:"Cmd|Ctrl + Enter",disabled:F.value,onClick:N},[F.value?((0,l.uX)(),(0,l.Wv)((0,r.R1)(Ne),{key:0,size:16})):((0,l.uX)(),(0,l.CE)(l.FK,{key:1},[(0,l.eW)((0,i.v_)(H.value.submit),1)],64))],8,Tn)):(0,l.Q3)("v-if",!0)]),(0,l.Lk)("div",{ref_key:"gifPopupRef",ref:$,class:(0,i.C4)(["wl-gif-popup",{display:_.value}])},[(0,l.Lk)("input",{ref_key:"gifSearchInputRef",ref:E,type:"text",placeholder:H.value.gifSearchPlaceholder,onInput:t[4]||(t[4]=(...e)=>(0,r.R1)(ee)&&(0,r.R1)(ee)(...e))},null,40,jn),T.list.length?((0,l.uX)(),(0,l.Wv)(ft,{key:0,items:T.list,"column-width":200,gap:6,onInsert:t[5]||(t[5]=e=>U(e)),onScroll:J},null,8,["items"])):(0,l.Q3)("v-if",!0),T.loading?((0,l.uX)(),(0,l.CE)("div",Mn,[(0,l.bF)((0,r.R1)(Ne),{size:30})])):(0,l.Q3)("v-if",!0)],2),(0,l.Lk)("div",{ref_key:"emojiPopupRef",ref:x,class:(0,i.C4)(["wl-emoji-popup",{display:z.value}])},[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(R.value.tabs,((e,t)=>((0,l.uX)(),(0,l.CE)(l.FK,{key:e.name},[t===L.value?((0,l.uX)(),(0,l.CE)("div",Xn,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(e.items,(e=>((0,l.uX)(),(0,l.CE)("button",{key:e,type:"button",title:e,onClick:t=>U(`:${e}:`)},[z.value?((0,l.uX)(),(0,l.CE)("img",{key:0,class:"wl-emoji",src:R.value.map[e],alt:e,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Wn)):(0,l.Q3)("v-if",!0)],8,Fn)))),128))])):(0,l.Q3)("v-if",!0)],64)))),128)),R.value.tabs.length>1?((0,l.uX)(),(0,l.CE)("div",Hn,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(R.value.tabs,((e,t)=>((0,l.uX)(),(0,l.CE)("button",{key:e.name,type:"button",class:(0,i.C4)(["wl-tab",{active:L.value===t}]),onClick:e=>L.value=t},[(0,l.Lk)("img",{class:"wl-emoji",src:e.icon,alt:e.name,title:e.name,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Kn)],10,Pn)))),128))])):(0,l.Q3)("v-if",!0)],2)])]),e.replyId||null!=(s=e.edit)&&s.objectId?((0,l.uX)(),(0,l.CE)("button",{key:1,type:"button",class:"wl-close",title:H.value.cancelReply,onClick:t[6]||(t[6]=t=>e.$emit(e.replyId?"cancelReply":"cancelEdit"))},[(0,l.bF)((0,r.R1)(We),{size:24})],8,Un)):(0,l.Q3)("v-if",!0)])}}}),On=ht(Bn,[["__file","CommentBox.vue"]]);const Vn=["id"],Dn={class:"wl-user","aria-hidden":"true"},Qn=["src"],Nn={class:"wl-card"},qn={class:"wl-head"},Zn=["href"],Gn={key:1,class:"wl-nick"},Yn=["textContent"],Jn=["textContent"],el=["textContent"],tl=["textContent"],nl=["textContent"],ll={class:"wl-comment-actions"},rl=["title"],il=["title"],al={class:"wl-meta","aria-hidden":"true"},sl=["data-value","textContent"],ol=["innerHTML"],cl={key:1,class:"wl-admin-actions"},ul={class:"wl-comment-status"},hl=["disabled","onClick","textContent"],pl={key:3,class:"wl-quote"};var dl=(0,l.pM)({__name:"CommentCard",props:{comment:{},edit:{default:null},rootId:{},reply:{default:null}},emits:["log","submit","delete","edit","like","status","sticky","reply"],setup(e,{emit:t}){const n=e,a=t,o=["approved","waiting","spam"],c=(0,l.WQ)("config"),u=Ge(),h=(0,s.cBR)(),p=tt(),d=(0,l.EW)((()=>c.value.locale)),g=(0,l.EW)((()=>{const{link:e}=n.comment;return e?wt(e)?e:`https://${e}`:""})),m=(0,l.EW)((()=>u.value.includes(n.comment.objectId))),f=(0,l.EW)((()=>((e,t,n)=>{if(!e)return"";const l=Nt(e)?new Date(-1!==e.indexOf(" ")?e.replace(/-/g,"/"):e):e,r=t.getTime()-l.getTime(),i=Math.floor(r/864e5);if(0===i){const e=r%864e5,t=Math.floor(e/36e5);if(0===t){const t=e%36e5,l=Math.floor(t/6e4);if(0===l){const e=t%6e4;return`${Math.round(e/1e3)} ${n.seconds}`}return`${l} ${n.minutes}`}return`${t} ${n.hours}`}return i<0?n.now:i<8?`${i} ${n.days}`:(e=>{const t=Zt(e.getDate(),2),n=Zt(e.getMonth()+1,2);return`${Zt(e.getFullYear(),2)}-${n}-${t}`})(l)})(new Date(n.comment.time),h.value,d.value))),v=(0,l.EW)((()=>"administrator"===p.value.type)),k=(0,l.EW)((()=>n.comment.user_id&&p.value.objectId===n.comment.user_id)),w=(0,l.EW)((()=>{var e;return n.comment.objectId===(null==(e=n.reply)?void 0:e.objectId)})),y=(0,l.EW)((()=>{var e;return n.comment.objectId===(null==(e=n.edit)?void 0:e.objectId)}));return(e,t)=>{var n;const s=(0,l.g2)("CommentCard",!0);return(0,l.uX)(),(0,l.CE)("div",{id:e.comment.objectId,class:"wl-card-item"},[(0,l.Lk)("div",Dn,[e.comment.avatar?((0,l.uX)(),(0,l.CE)("img",{key:0,class:"wl-user-avatar",src:e.comment.avatar},null,8,Qn)):(0,l.Q3)("v-if",!0),e.comment.type?((0,l.uX)(),(0,l.Wv)((0,r.R1)(Qe),{key:1})):(0,l.Q3)("v-if",!0)]),(0,l.Lk)("div",Nn,[(0,l.Lk)("div",qn,[g.value?((0,l.uX)(),(0,l.CE)("a",{key:0,class:"wl-nick",href:g.value,target:"_blank",rel:"nofollow noopener noreferrer"},(0,i.v_)(e.comment.nick),9,Zn)):((0,l.uX)(),(0,l.CE)("span",Gn,(0,i.v_)(e.comment.nick),1)),"administrator"===e.comment.type?((0,l.uX)(),(0,l.CE)("span",{key:2,class:"wl-badge",textContent:(0,i.v_)(d.value.admin)},null,8,Yn)):(0,l.Q3)("v-if",!0),e.comment.label?((0,l.uX)(),(0,l.CE)("span",{key:3,class:"wl-badge",textContent:(0,i.v_)(e.comment.label)},null,8,Jn)):(0,l.Q3)("v-if",!0),e.comment.sticky?((0,l.uX)(),(0,l.CE)("span",{key:4,class:"wl-badge",textContent:(0,i.v_)(d.value.sticky)},null,8,el)):(0,l.Q3)("v-if",!0),"number"==typeof e.comment.level?((0,l.uX)(),(0,l.CE)("span",{key:5,class:(0,i.C4)(`wl-badge level${e.comment.level}`),textContent:(0,i.v_)(d.value[`level${e.comment.level}`]||`Level ${e.comment.level}`)},null,10,tl)):(0,l.Q3)("v-if",!0),(0,l.Lk)("span",{class:"wl-time",textContent:(0,i.v_)(f.value)},null,8,nl),(0,l.Lk)("div",ll,[v.value||k.value?((0,l.uX)(),(0,l.CE)(l.FK,{key:0},[(0,l.Lk)("button",{type:"button",class:"wl-edit",onClick:t[0]||(t[0]=t=>a("edit",e.comment))},[(0,l.bF)((0,r.R1)(De))]),(0,l.Lk)("button",{type:"button",class:"wl-delete",onClick:t[1]||(t[1]=t=>a("delete",e.comment))},[(0,l.bF)((0,r.R1)(He))])],64)):(0,l.Q3)("v-if",!0),(0,l.Lk)("button",{type:"button",class:"wl-like",title:m.value?d.value.cancelLike:d.value.like,onClick:t[2]||(t[2]=t=>a("like",e.comment))},[(0,l.bF)((0,r.R1)(Ue),{active:m.value},null,8,["active"]),(0,l.eW)(" "+(0,i.v_)("like"in e.comment?e.comment.like:""),1)],8,rl),(0,l.Lk)("button",{type:"button",class:(0,i.C4)(["wl-reply",{active:w.value}]),title:w.value?d.value.cancelReply:d.value.reply,onClick:t[3]||(t[3]=t=>a("reply",w.value?null:e.comment))},[(0,l.bF)((0,r.R1)(Ve))],10,il)])]),(0,l.Lk)("div",al,[((0,l.uX)(),(0,l.CE)(l.FK,null,(0,l.pI)(["addr","browser","os"],(t=>((0,l.uX)(),(0,l.CE)(l.FK,null,[e.comment[t]?((0,l.uX)(),(0,l.CE)("span",{key:t,class:(0,i.C4)(`wl-${t}`),"data-value":e.comment[t],textContent:(0,i.v_)(e.comment[t])},null,10,sl)):(0,l.Q3)("v-if",!0)],64)))),64))]),y.value?(0,l.Q3)("v-if",!0):((0,l.uX)(),(0,l.CE)("div",{key:0,class:"wl-content",innerHTML:e.comment.comment},null,8,ol)),v.value&&!y.value?((0,l.uX)(),(0,l.CE)("div",cl,[(0,l.Lk)("span",ul,[((0,l.uX)(),(0,l.CE)(l.FK,null,(0,l.pI)(o,(t=>(0,l.Lk)("button",{key:t,type:"submit",class:(0,i.C4)(`wl-btn wl-${t}`),disabled:e.comment.status===t,onClick:n=>a("status",{status:t,comment:e.comment}),textContent:(0,i.v_)(d.value[t])},null,10,hl))),64))]),v.value&&!("rid"in e.comment)?((0,l.uX)(),(0,l.CE)("button",{key:0,type:"submit",class:"wl-btn wl-sticky",onClick:t[4]||(t[4]=t=>a("sticky",e.comment))},(0,i.v_)(e.comment.sticky?d.value.unsticky:d.value.sticky),1)):(0,l.Q3)("v-if",!0)])):(0,l.Q3)("v-if",!0),w.value||y.value?((0,l.uX)(),(0,l.CE)("div",{key:2,class:(0,i.C4)({"wl-reply-wrapper":w.value,"wl-edit-wrapper":y.value})},[(0,l.bF)(On,{edit:e.edit,"reply-id":null==(n=e.reply)?void 0:n.objectId,"reply-user":e.comment.nick,"root-id":e.rootId,onLog:t[5]||(t[5]=e=>a("log")),onCancelReply:t[6]||(t[6]=e=>a("reply",null)),onCancelEdit:t[7]||(t[7]=e=>a("edit",null)),onSubmit:t[8]||(t[8]=e=>a("submit",e))},null,8,["edit","reply-id","reply-user","root-id"])],2)):(0,l.Q3)("v-if",!0),"children"in e.comment?((0,l.uX)(),(0,l.CE)("div",pl,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(e.comment.children,(n=>((0,l.uX)(),(0,l.Wv)(s,{key:n.objectId,comment:n,reply:e.reply,edit:e.edit,"root-id":e.rootId,onLog:t[9]||(t[9]=e=>a("log")),onDelete:t[10]||(t[10]=e=>a("delete",e)),onEdit:t[11]||(t[11]=e=>a("edit",e)),onLike:t[12]||(t[12]=e=>a("like",e)),onReply:t[13]||(t[13]=e=>a("reply",e)),onStatus:t[14]||(t[14]=e=>a("status",e)),onSticky:t[15]||(t[15]=e=>a("sticky",e)),onSubmit:t[16]||(t[16]=e=>a("submit",e))},null,8,["comment","reply","edit","root-id"])))),128))])):(0,l.Q3)("v-if",!0)])],8,Vn)}}}),gl=ht(dl,[["__file","CommentCard.vue"]]);const ml="3.1.2",fl={"data-waline":""},vl={class:"wl-meta-head"},kl={class:"wl-count"},wl=["textContent"],yl={class:"wl-sort"},bl=["onClick"],xl={class:"wl-cards"},Cl={key:1,class:"wl-operation"},$l=["textContent"],El={key:2,class:"wl-loading"},Rl=["textContent"],Ll={key:4,class:"wl-operation"},zl=["textContent"],_l={key:5,class:"wl-power"},Il=(0,l.Lk)("a",{href:"https://github.com/walinejs/waline",target:"_blank",rel:"noopener noreferrer"}," Waline ",-1);var Al=(0,l.pM)({__name:"WalineComment",props:["serverURL","path","meta","requiredMeta","dark","commentSorting","lang","locale","pageSize","wordLimit","emoji","login","highlighter","texRenderer","imageUploader","search","copyright","recaptchaV3Key","turnstileKey","reaction"],setup(e){const t=e,n={latest:"insertedAt_desc",oldest:"insertedAt_asc",hottest:"like_desc"},a=Object.keys(n),o=tt(),c=Ge(),p=(0,r.KR)("loading"),g=(0,r.KR)(0),m=(0,r.KR)(1),f=(0,r.KR)(0),v=(0,l.EW)((()=>(({serverURL:e,path:t=location.pathname,lang:n=(typeof navigator>"u"?"en-US":navigator.language),locale:l,emoji:r=xt,meta:i=["nick","mail","link"],requiredMeta:a=[],dark:s=!1,pageSize:o=10,wordLimit:c,imageUploader:u,highlighter:h,texRenderer:p,copyright:d=!0,login:g="enable",search:m,reaction:f,recaptchaV3Key:v="",turnstileKey:k="",commentSorting:w="latest",...y})=>({serverURL:Vt(e),path:vt(t),lang:Ot(n),locale:{...Bt(n),..."object"==typeof l?l:{}},wordLimit:Dt(c),meta:bt(i),requiredMeta:bt(a),imageUploader:Qt(u,$t),highlighter:Qt(h,It),texRenderer:Qt(p,Et),dark:s,emoji:"boolean"==typeof r?r?xt:[]:r,pageSize:o,login:g,copyright:d,search:!1!==m&&("object"==typeof m?m:Rt(n)),recaptchaV3Key:v,turnstileKey:k,reaction:Array.isArray(f)?f:!0===f?Ct:[],commentSorting:w,...y}))(t))),k=(0,r.KR)(v.value.commentSorting),w=(0,r.KR)([]),y=(0,r.KR)(null),b=(0,r.KR)(null),x=(0,l.EW)((()=>(e=>Nt(e)?"auto"===e?`@media(prefers-color-scheme:dark){body${qt}}`:`${e}${qt}`:!0===e?`:root${qt}`:"")(v.value.dark))),C=(0,l.EW)((()=>v.value.locale));let $;(0,s.vCw)(x,{id:"waline-darkmode"});const E=e=>{var t;const{serverURL:l,path:r,pageSize:i}=v.value,a=new AbortController;p.value="loading",null==$||$(),(({serverURL:e,lang:t,path:n,page:l,pageSize:r,sortBy:i,signal:a,token:s})=>{const o={};return s&&(o.Authorization=`Bearer ${s}`),fetch(`${u(e)}comment?path=${encodeURIComponent(n)}&pageSize=${r}&page=${l}&lang=${t}&sortBy=${i}`,{signal:a,headers:o}).then((e=>e.json())).then((e=>h(e,"Get comment data").data))})({serverURL:l,lang:v.value.lang,path:r,pageSize:i,sortBy:n[k.value],page:e,signal:a.signal,token:null==(t=o.value)?void 0:t.token}).then((t=>{p.value="success",g.value=t.count,w.value.push(...t.data),m.value=e,f.value=t.totalPages})).catch((e=>{"AbortError"!==e.name&&(console.error(e.message),p.value="error")})),$=a.abort.bind(a)},R=()=>E(m.value+1),L=()=>{g.value=0,w.value=[],E(1)},z=e=>{y.value=e},_=e=>{b.value=e},I=e=>{if(b.value)b.value.comment=e.comment,b.value.orig=e.orig;else if("rid"in e){const t=w.value.find((({objectId:t})=>t===e.rid));if(!t)return;Array.isArray(t.children)||(t.children=[]),t.children.push(e)}else w.value.unshift(e),g.value+=1},A=async({comment:e,status:t})=>{var n;if(e.status===t)return;const{serverURL:l,lang:r}=v.value;await d({serverURL:l,lang:r,token:null==(n=o.value)?void 0:n.token,objectId:e.objectId,comment:{status:t}}),e.status=t},S=async e=>{var t;if("rid"in e)return;const{serverURL:n,lang:l}=v.value;await d({serverURL:n,lang:l,token:null==(t=o.value)?void 0:t.token,objectId:e.objectId,comment:{sticky:e.sticky?0:1}}),e.sticky=!e.sticky},T=async({objectId:e})=>{var t;if(!confirm("Are you sure you want to delete this comment?"))return;const{serverURL:n,lang:l}=v.value;await(({serverURL:e,lang:t,token:n,objectId:l})=>fetch(`${u(e)}comment/${l}?lang=${t}`,{method:"DELETE",headers:{Authorization:`Bearer ${n}`}}).then((e=>e.json())).then((e=>h(e,"Delete comment"))))({serverURL:n,lang:l,token:null==(t=o.value)?void 0:t.token,objectId:e}),w.value.some(((t,n)=>t.objectId===e?(w.value=w.value.filter(((e,t)=>t!==n)),!0):t.children.some(((l,r)=>l.objectId===e&&(w.value[n].children=t.children.filter(((e,t)=>t!==r)),!0)))))},j=async e=>{var t;const{serverURL:n,lang:l}=v.value,{objectId:r}=e,i=c.value.includes(r);await d({serverURL:n,lang:l,objectId:r,token:null==(t=o.value)?void 0:t.token,comment:{like:!i}}),i?c.value=c.value.filter((e=>e!==r)):(c.value=[...c.value,r],c.value.length>50&&(c.value=c.value.slice(-50))),e.like=(e.like||0)+(i?-1:1)};return(0,l.Gt)("config",v),(0,l.sV)((()=>{(0,l.wB)((()=>[t.serverURL,t.path]),(()=>L()),{immediate:!0})})),(0,l.hi)((()=>null==$?void 0:$())),(e,t)=>((0,l.uX)(),(0,l.CE)("div",fl,[(0,l.bF)(pt),y.value?(0,l.Q3)("v-if",!0):((0,l.uX)(),(0,l.Wv)(On,{key:0,onLog:L,onSubmit:I})),(0,l.Lk)("div",vl,[(0,l.Lk)("div",kl,[g.value?((0,l.uX)(),(0,l.CE)("span",{key:0,class:"wl-num",textContent:(0,i.v_)(g.value)},null,8,wl)):(0,l.Q3)("v-if",!0),(0,l.eW)(" "+(0,i.v_)(C.value.comment),1)]),(0,l.Lk)("ul",yl,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)((0,r.R1)(a),(e=>((0,l.uX)(),(0,l.CE)("li",{key:e,class:(0,i.C4)([e===k.value?"active":""]),onClick:t=>(e=>{k.value!==e&&(k.value=e,L())})(e)},(0,i.v_)(C.value[e]),11,bl)))),128))])]),(0,l.Lk)("div",xl,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(w.value,(e=>((0,l.uX)(),(0,l.Wv)(gl,{key:e.objectId,"root-id":e.objectId,comment:e,reply:y.value,edit:b.value,onLog:L,onReply:z,onEdit:_,onSubmit:I,onStatus:A,onDelete:T,onSticky:S,onLike:j},null,8,["root-id","comment","reply","edit"])))),128))]),"error"===p.value?((0,l.uX)(),(0,l.CE)("div",Cl,[(0,l.Lk)("button",{type:"button",class:"wl-btn",onClick:L,textContent:(0,i.v_)(C.value.refresh)},null,8,$l)])):"loading"===p.value?((0,l.uX)(),(0,l.CE)("div",El,[(0,l.bF)((0,r.R1)(Ne),{size:30})])):w.value.length?m.value{s.d(e,{E:()=>c,t:()=>a});var i=s(348),o=s(352);function a(t,e=3e3){const s=(0,i.v)();return setTimeout((()=>{const e=t();e&&s.reject(e)}),e),s}class c{constructor(t){this.db=t,this.cb=(0,i.m)(""),this.referrerPolicy=null,t.setAttribute("frameBorder","0"),t.setAttribute("allow","autoplay; fullscreen; encrypted-media; picture-in-picture; accelerometer; gyroscope"),null!==this.referrerPolicy&&t.setAttribute("referrerpolicy",this.referrerPolicy)}get iframe(){return this.db}setup(t){(0,i.e)(this.fd.bind(this)),(0,i.l)(window,"message",this.Lg.bind(this)),(0,i.l)(this.db,"load",this.lc.bind(this))}fd(){const t=this.cb();if(!t.length)return void this.db.setAttribute("src","");const e=(0,i.p)((()=>this.Te()));this.db.setAttribute("src",(0,o.a)(t,e))}gd(t,e){this.db.contentWindow?.postMessage(JSON.stringify(t),e??"*")}Lg(t){const e=this.eb();if(t.source===this.db?.contentWindow&&(!(0,i.r)(e)||e===t.origin)){try{const e=JSON.parse(t.data);return void(e&&this.hd(e,t))}catch(t){}t.data&&this.hd(t.data,t)}}}},9488:(t,e,s)=>{s.r(e),s.d(e,{YouTubeProvider:()=>n});var i=s(348),o=s(7224),a=s(352),c=s(9115);class n extends c.E{constructor(){super(...arguments),this.$$PROVIDER_TYPE="YOUTUBE",this.scope=(0,i.q)(),this.N=(0,i.m)(""),this.mc=-1,this.nc=-1,this.Fa=0,this.Ga=new o.T(0,0),this.V=null,this.E=null,this.G=null,this.language="en",this.color="red",this.cookies=!1}static{this.jd=/(?:youtu\.be|youtube|youtube\.com|youtube-nocookie\.com)\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=|)((?:\w|-){11})/}static{this.We=new Map}get c(){return this.b.delegate.c}get currentSrc(){return this.V}get type(){return"youtube"}get videoId(){return this.N()}preconnect(){const t=[this.eb(),"https://www.google.com","https://i.ytimg.com","https://googleads.g.doubleclick.net","https://static.doubleclick.net"];for(const e of t)(0,a.p)(e,"preconnect")}setup(t){this.b=t,super.setup(t),(0,i.e)(this.kd.bind(this)),(0,i.e)(this.ld.bind(this)),this.c("provider-setup",this)}async play(){const{paused:t}=this.b.$state;if((0,i.p)(t))return this.E||(this.E=(0,c.t)((()=>{if(this.E=null,t())return"Timed out."})),this.q("playVideo")),this.E.promise}async pause(){const{paused:t}=this.b.$state;if(!(0,i.p)(t))return this.G||(this.G=(0,c.t)((()=>{this.G=null,t()})),this.q("pauseVideo")),this.G.promise}setMuted(t){t?this.q("mute"):this.q("unMute")}setCurrentTime(t){this.q("seekTo",t)}setVolume(t){this.q("setVolume",100*t)}setPlaybackRate(t){this.q("setPlaybackRate",t)}async loadSource(t){if(!(0,i.r)(t.src))return this.V=null,void this.N.set("");const e=t.src.match(n.jd)?.[1];this.N.set(e??""),this.V=t}eb(){return this.cookies?"https://www.youtube.com":"https://www.youtube-nocookie.com"}kd(){this.H();const t=this.N();t?this.cb.set(`${this.eb()}/embed/${t}`):this.cb.set("")}ld(){const t=this.N(),e=n.We;if(!t)return;if(e.has(t)){const s=e.get(t);return void this.c("poster-change",s)}const s=new AbortController;return this.Pg(t,s),()=>{s.abort()}}async Pg(t,e){try{const s=["maxresdefault","sddefault","hqdefault"];for(const i of s)for(const s of[!0,!1]){const o=this.Qg(t,i,s);if((await fetch(o,{mode:"no-cors",signal:e.signal})).status<400)return n.We.set(t,o),void this.c("poster-change",o)}}catch(t){}this.c("poster-change","")}Qg(t,e,s){return`https://i.ytimg.com/${s?"vi_webp":"vi"}/${t}/${e}.${s?"webp":"jpg"}`}Te(){const{keyDisabled:t}=this.b.$props,{$iosControls:e}=this.b,{controls:s,muted:i,playsinline:o}=this.b.$state,a=s()||e();return{autoplay:0,cc_lang_pref:this.language,cc_load_policy:a?1:void 0,color:this.color,controls:a?1:0,disablekb:!a||t()?1:0,enablejsapi:1,fs:1,hl:this.language,iv_load_policy:a?1:3,mute:i()?1:0,playsinline:o()?1:0}}q(t,e){this.gd({event:"command",func:t,args:e?[e]:void 0})}lc(){window.setTimeout((()=>this.gd({event:"listening"})),100)}md(t){this.b.delegate.jc(void 0,t)}Aa(t){this.G?.resolve(),this.G=null,this.c("pause",void 0,t)}Eb(t,e){const{duration:s,currentTime:i}=this.b.$state,a=0===this.mc?s():t,c={currentTime:a,played:this.Fa>=a?this.Ga:this.Ga=new o.T(0,this.Fa=t)};this.c("time-update",c,e),Math.abs(a-i())>1&&this.c("seeking",a,e)}ic(t,e,s){const i={buffered:new o.T(0,t),seekable:e};this.c("progress",i,s);const{seeking:a,currentTime:c}=this.b.$state;a()&&t>c()&&this.bb(s)}bb(t){const{paused:e,currentTime:s}=this.b.$state;window.clearTimeout(this.nc),this.nc=window.setTimeout((()=>{this.c("seeked",s(),t),this.nc=-1}),e()?100:0)}Db(t){const{seeking:e}=this.b.$state;e()&&this.bb(t),this.c("end",void 0,t)}Rg(t,e){const{paused:s}=this.b.$state,i=1===t,o=3===t;switch(o&&this.c("waiting",void 0,e),s()&&(o||i)&&(this.E?.resolve(),this.E=null,this.c("play",void 0,e)),t){case 5:this.md(e);break;case 1:this.c("playing",void 0,e);break;case 2:this.Aa(e);break;case 0:this.Db(e)}this.mc=t}hd({info:t},e){if(!t)return;const{title:s,duration:a,playbackRate:c}=this.b.$state;if((0,i.t)(t.videoData)&&t.videoData.title!==s()&&this.c("title-change",t.videoData.title,e),(0,i.a)(t.duration)&&t.duration!==a()){if((0,i.a)(t.videoLoadedFraction)){const s=t.progressState?.loaded??t.videoLoadedFraction*t.duration,i=new o.T(0,t.duration);this.ic(s,i,e)}this.c("duration-change",t.duration,e)}if((0,i.a)(t.playbackRate)&&t.playbackRate!==c()&&this.c("rate-change",t.playbackRate,e),t.progressState){const{current:s,seekableStart:i,seekableEnd:c,loaded:n,duration:r}=t.progressState;this.Eb(s,e),this.ic(n,new o.T(i,c),e),r!==a()&&this.c("duration-change",r,e)}if((0,i.a)(t.volume)&&(0,i.u)(t.muted)){const s={muted:t.muted,volume:t.volume/100};this.c("volume-change",s,e)}(0,i.a)(t.playerState)&&t.playerState!==this.mc&&this.Rg(t.playerState,e)}H(){this.mc=-1,this.nc=-1,this.Fa=0,this.Ga=new o.T(0,0),this.E=null,this.G=null}}}}]); \ No newline at end of file diff --git a/assets/js/1984.d1e17a87.js b/assets/js/1984.d1e17a87.js deleted file mode 100644 index ee39ffe72..000000000 --- a/assets/js/1984.d1e17a87.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1984],{888:(t,i,s)=>{s.d(i,{R:()=>a});var e=s(348);class a{constructor(t){this.Ca=t}Bb(){(0,e.i)(this.ca)&&this.Oe()}ra(){(0,e.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,e.i)(this.ca)||(this.Ca(),this.Oe())}))}}},4248:(t,i,s)=>{s.d(i,{c:()=>d});var e=s(8648),a=s(348),h=s(888),r=s(1716);class c{constructor(t,i){this.i=t,this.b=i,this.sa=(0,a.L)(),this.Cb=!1,this.$c=!1,this.ad=!1,this.Da=new h.R(this.bd.bind(this)),this.Qe=void 0,this.Dg=void 0,this.pg(),(0,a.e)(this.qg.bind(this)),(0,a.o)(this.cd.bind(this))}get a(){return this.i.media}get c(){return this.b.delegate.c}cd(){this.$c=!1,this.ad=!1,this.Da.ra(),this.sa.empty()}bd(){const t=this.a.currentTime;this.b.$state.currentTime()!==t&&this.$a(t)}pg(){this.t("loadstart",this.Ea),this.t("abort",this.Pe),this.t("emptied",this.rg),this.t("error",this.U),this.t("volumechange",this.ab)}sg(){this.$c||(this.sa.add(this.t("loadeddata",this.tg),this.t("loadedmetadata",this.ug),this.t("canplay",this.hc),this.t("canplaythrough",this.vg),this.t("durationchange",this.wg),this.t("play",this.xb),this.t("progress",this.ic),this.t("stalled",this.xg),this.t("suspend",this.yg)),this.$c=!0)}zg(){this.ad||(this.sa.add(this.t("pause",this.Aa),this.t("playing",this.Ag),this.t("ratechange",this.Bg),this.t("seeked",this.bb),this.t("seeking",this.Cg),this.t("ended",this.Db),this.t("waiting",this.dd)),this.ad=!0)}t(t,i){return(0,a.l)(this.a,t,i.bind(this))}Eg(t){}$a(t,i){const s={currentTime:Math.min(t,this.b.$state.seekableEnd()),played:this.a.played};this.c("time-update",s,i)}Ea(t){3!==this.a.networkState?(this.sg(),this.c("load-start",void 0,t)):this.Pe(t)}Pe(t){this.c("abort",void 0,t)}rg(){this.c("emptied",void 0,event)}tg(t){this.c("loaded-data",void 0,t)}ug(t){this.zg(),this.c("loaded-metadata",void 0,t),r.g&&(0,e.i)(this.b.$state.source())&&this.b.delegate.jc(this.ed(),t)}ed(){return{provider:(0,a.p)(this.b.$provider),duration:this.a.duration,buffered:this.a.buffered,seekable:this.a.seekable}}xb(t){this.b.$state.canPlay&&this.c("play",void 0,t)}Aa(t){(1!==this.a.readyState||this.Cb)&&(this.Cb=!1,this.Da.ra(),this.c("pause",void 0,t))}hc(t){this.b.delegate.jc(this.ed(),t)}vg(t){this.b.$state.started()||this.c("can-play-through",this.ed(),t)}Ag(t){this.Cb=!1,this.c("playing",void 0,t),this.Da.Bb()}xg(t){this.c("stalled",void 0,t),this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}dd(t){this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}Db(t){this.Da.ra(),this.$a(this.a.duration,t),this.c("end",void 0,t),this.b.$state.loop()&&(0,a.M)(this.a.controls)&&(this.a.controls=!1)}qg(){this.b.$state.paused()&&(0,a.l)(this.a,"timeupdate",this.Eb.bind(this))}Eb(t){this.$a(this.a.currentTime,t)}wg(t){this.b.$state.ended()&&this.$a(this.a.duration,t),this.c("duration-change",this.a.duration,t)}ab(t){const i={volume:this.a.volume,muted:this.a.muted};this.c("volume-change",i,t)}bb(t){this.$a(this.a.currentTime,t),this.c("seeked",this.a.currentTime,t),Math.trunc(this.a.currentTime)===Math.trunc(this.a.duration)&&(0,e.g)(this.a.duration)>(0,e.g)(this.a.currentTime)&&(this.$a(this.a.duration,t),this.a.ended||this.b.player.dispatch(new a.D("media-play-request",{trigger:t})))}Cg(t){this.c("seeking",this.a.currentTime,t)}ic(t){const i={buffered:this.a.buffered,seekable:this.a.seekable};this.c("progress",i,t)}yg(t){this.c("suspend",void 0,t)}Bg(t){this.c("rate-change",this.a.playbackRate,t)}U(t){const i=this.a.error;if(!i)return;const s={message:i.message,code:i.code,mediaError:i};this.c("error",s,t)}}class n{constructor(t,i){this.i=t,this.b=i,this.Fb.onaddtrack=this.Fg.bind(this),this.Fb.onremovetrack=this.Gg.bind(this),this.Fb.onchange=this.Hg.bind(this),(0,a.l)(this.b.audioTracks,"change",this.Ig.bind(this))}get Fb(){return this.i.media.audioTracks}Fg(t){const i=t.track;if(""===i.label)return;const s={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.b.audioTracks[r.L.oa](s,t),i.enabled&&(s.selected=!0)}Gg(t){const i=this.b.audioTracks.getById(t.track.id);i&&this.b.audioTracks[r.L.Yb](i,t)}Hg(t){let i=this.Re();if(!i)return;const s=this.b.audioTracks.getById(i.id);s&&this.b.audioTracks[r.L.pa](s,!0,t)}Re(){return Array.from(this.Fb).find((t=>t.enabled))}Ig(t){const{current:i}=t.detail;if(!i)return;const s=this.Fb.getTrackById(i.id);if(s){const t=this.Re();t&&(t.enabled=!1),s.enabled=!0}}}class d{constructor(t){this.a=t,this.scope=(0,a.q)(),this.V=null}setup(t){new c(this,t),"audioTracks"in this.media&&new n(this,t),(0,a.o)((()=>{this.a.setAttribute("src",""),this.a.load()}))}get type(){return""}get media(){return this.a}get currentSrc(){return this.V}setPlaybackRate(t){this.a.playbackRate=t}async play(){return this.a.play()}async pause(){return this.a.pause()}setMuted(t){this.a.muted=t}setVolume(t){this.a.volume=t}setCurrentTime(t){this.a.currentTime=t}setPlaysinline(t){(0,a.k)(this.a,"playsinline",t)}async loadSource({src:t,type:i},s){this.a.preload=s||"",(0,e.a)(t)?this.a.srcObject=t:(this.a.srcObject=null,this.a.src=(0,a.r)(t)?t:window.URL.createObjectURL(t)),this.a.load(),this.V={src:t,type:i}}}},9604:(t,i,s)=>{s.r(i),s.d(i,{VideoProvider:()=>l});var e=s(348),a=s(1716),h=s(4248),r=s(352);class c{constructor(t,i){this.m=t,this.b=i,t.textTracks.onaddtrack=this.Wc.bind(this),(0,e.o)(this.cd.bind(this))}Wc(t){const i=t.track;if(!i||function(t,i){return Array.from(t.children).find((t=>t.track===i))}(this.m,i))return;const s=new r.b({id:i.id,kind:i.kind,label:i.label,language:i.language,type:"vtt"});s[r.T.T]={track:i},s[r.T.M]=2,s[r.T.te]=!0;let e=0;const a=t=>{if(i.cues)for(let a=e;a{this.a.delegate.c("picture-in-picture-change",t,i)},(0,e.l)(this.m,"enterpictureinpicture",this.Jg.bind(this)),(0,e.l)(this.m,"leavepictureinpicture",this.Kg.bind(this))}get active(){return document.pictureInPictureElement===this.m}get supported(){return(0,a.d)(this.m)}async enter(){return this.m.requestPictureInPicture()}exit(){return document.exitPictureInPicture()}Jg(t){this.B(!0,t)}Kg(t){this.B(!1,t)}}class d{constructor(t,i){this.m=t,this.a=i,this.I="inline",(0,e.l)(this.m,"webkitpresentationmodechanged",this.Ua.bind(this))}get Se(){return(0,a.e)(this.m)}async kc(t){this.I!==t&&this.m.webkitSetPresentationMode(t)}Ua(t){const i=this.I;this.I=this.m.webkitPresentationMode,this.a.player?.dispatch(new e.D("video-presentation-change",{detail:this.I,trigger:t})),["fullscreen","picture-in-picture"].forEach((s=>{this.I!==s&&i!==s||this.a.delegate.c(`${s}-change`,this.I===s,t)}))}}class o{constructor(t){this.fa=t}get active(){return"fullscreen"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("fullscreen")}async exit(){this.fa.kc("inline")}}class u{constructor(t){this.fa=t}get active(){return"picture-in-picture"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("picture-in-picture")}async exit(){this.fa.kc("inline")}}class l extends h.c{constructor(t,i){super(t),this.$$PROVIDER_TYPE="VIDEO",(0,e.s)((()=>{if((0,a.e)(t)){const s=new d(t,i);this.fullscreen=new o(s),this.pictureInPicture=new u(s)}else(0,a.d)(t)&&(this.pictureInPicture=new n(t,i))}),this.scope)}get type(){return"video"}setup(t){super.setup(t),(0,a.b)(this.video)&&new c(this.video,t),t.textRenderers.Fe(this.video),(0,e.o)((()=>{t.textRenderers.Fe(null)})),"video"===this.type&&t.delegate.c("provider-setup",this)}get video(){return this.a}}}}]); \ No newline at end of file diff --git a/assets/js/v-b934e150.496c0c93.js b/assets/js/1_obs_basic.html.2d92a40d.js similarity index 90% rename from assets/js/v-b934e150.496c0c93.js rename to assets/js/1_obs_basic.html.2d92a40d.js index d04ae8193..579c929e3 100644 --- a/assets/js/v-b934e150.496c0c93.js +++ b/assets/js/1_obs_basic.html.2d92a40d.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9200],{9720:(e,a)=>{a.c=(e,a)=>{const n=e.__vccOpts||e;for(const[e,t]of a)n[e]=t;return n}},4384:(e,a,n)=>{n.r(a),n.d(a,{comp:()=>w,data:()=>B});var t=n(3968);const i={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},l=(0,t.IL)('

    主界面

    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。
    直播输出设置

    音频

    点击「设置」>「音频」>「通用」,将声道设为单声道。除非你是歌唱主播,否则无需使用立体声。注意,如果你要使用监听或外放 OBS 声音,声道也需要使用立体声。

    视频

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

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

    直播分辨率设置

    高级

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

    OBS 高级设置

    直播来源

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

    直播来源

    静态来源

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

    音频来源

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

    视频来源

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

    组合输出

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

    滤镜

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

    常用滤镜

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

    色度键(抠图)

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

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

    模糊

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

    图像蒙版

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

    色彩校正

    ',6),u={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Color-Grade",target:"_blank",rel:"noopener noreferrer"},f=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2023-01-08-07-01-17.png",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption",null,"色彩校正")],-1),b=(0,t.QD)("h3",{id:"应用-lut",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#应用-lut"},[(0,t.QD)("span",null,"应用 LUT")])],-1),S={href:"https://wwva.lanzoue.com/iEyOs0k8kj3g",target:"_blank",rel:"noopener noreferrer"},x=(0,t.IL)('

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

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

    常见问题

    直播延迟严重

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

    一直断开重连

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

    后续

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

    ',9),O={},w=(0,n(9720).c)(O,[["render",function(e,a){const n=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[(0,t.QD)("p",null,[(0,t.QD)("a",i,[(0,t.mY)("Open Broadcaster Software"),(0,t.K2)(n)]),(0,t.mY)("(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。")]),l,(0,t.QD)("ul",null,[r,p,o,s,g,(0,t.QD)("li",null,[(0,t.mY)("VLC 视频源:安装 "),(0,t.QD)("a",h,[(0,t.mY)("VLC"),(0,t.K2)(n)]),(0,t.mY)(" 才能启用本来源。「VLC 视频源」用于多个音视频按序播放,支持字幕。")])]),c,(0,t.QD)("p",null,[(0,t.mY)("「模糊」属于效果滤镜,可将指定区域模糊化以维护隐私。推荐设置:类型设为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。要使用模糊滤镜,需要安装插件 "),(0,t.QD)("a",d,[(0,t.mY)("StreamFX"),(0,t.K2)(n)]),(0,t.mY)("。")]),m,(0,t.QD)("p",null,[(0,t.QD)("a",u,[(0,t.mY)("色彩校正"),(0,t.K2)(n)]),(0,t.mY)("(Color Grading)属于效果滤镜,使用伽玛、对比度、亮度、饱和度、色调偏移、不透明度、颜色叠加、添加颜色来改变或校正最终画面的颜色和亮度。")]),f,b,(0,t.QD)("p",null,[(0,t.mY)("「应用 LUT」属于效果滤镜。它使用 LUT 对画面进行色彩调整,相当于手机修图用的风格滤镜,能够大大提升画面效果。初期可以使用我的 "),(0,t.QD)("a",S,[(0,t.mY)("LUT 设置"),(0,t.K2)(n)]),(0,t.mY)(",「路径」指向解压后的 png 文件。")]),x])}]]),B=JSON.parse('{"path":"/apps/livestreaming/1_obs_basic.html","title":"直播入门攻略一 | OBS 篇:OBS 30 新手指南","lang":"zh-CN","frontmatter":{"title":"直播入门攻略一 | OBS 篇:OBS 30 新手指南","category":["工具"],"tag":["OBS","直播"],"order":1,"description":"Open Broadcaster Software(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。 主界面 OBS 界面看起来有些复杂...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/1_obs_basic.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略一 | OBS 篇:OBS 30 新手指南"}],["meta",{"property":"og:description","content":"Open Broadcaster Software(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。 主界面 OBS 界面看起来有些复杂..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-05-20-47-16.png \\"OBS 主界面\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-30T11:57:46.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略一 | OBS 篇:OBS 30 新手指南"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OBS"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-12-30T11:57:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略一 | OBS 篇:OBS 30 新手指南\\",\\"image\\":[\\"https://img.newzone.top/2023-01-05-20-47-16.png \\\\\\"OBS 主界面\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-21-16-34.png \\\\\\"场景按钮\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-22-47-14.png \\\\\\"来源按钮\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-01-22-30.png \\\\\\"直播高级音频属性\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-01-38-21.png \\\\\\"工作室模式\\\\\\"\\",\\"https://img.newzone.top/2022-06-30-14-33-34.png \\\\\\"推流服务器设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-20-06-39.png \\\\\\"直播输出设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-20-22-29.png \\\\\\"直播分辨率设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-21-09-13.png \\\\\\"OBS 高级设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-02-10-05.png \\\\\\"直播来源\\\\\\"\\",\\"https://img.newzone.top/20210328235013.gif?imageMogr2/format/webp \\\\\\"色度键滤镜一键抠图\\\\\\"\\",\\"https://img.newzone.top/2023-01-08-06-49-05.png \\\\\\"右侧为模糊效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-02-51-10.png \\\\\\"模糊滤镜设置\\\\\\"\\",\\"https://img.newzone.top/2023-05-11-09-04-30.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2023-01-08-07-01-17.png \\\\\\"色彩校正\\\\\\"\\"],\\"dateModified\\":\\"2023-12-30T11:57:46.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"主界面","slug":"主界面","link":"#主界面","children":[{"level":3,"title":"场景","slug":"场景","link":"#场景","children":[]},{"level":3,"title":"来源","slug":"来源","link":"#来源","children":[]},{"level":3,"title":"混音器","slug":"混音器","link":"#混音器","children":[]},{"level":3,"title":"转场特效","slug":"转场特效","link":"#转场特效","children":[]},{"level":3,"title":"控制按钮","slug":"控制按钮","link":"#控制按钮","children":[]}]},{"level":2,"title":"设置","slug":"设置","link":"#设置","children":[{"level":3,"title":"直播","slug":"直播","link":"#直播","children":[]},{"level":3,"title":"输出","slug":"输出","link":"#输出","children":[]},{"level":3,"title":"音频","slug":"音频","link":"#音频","children":[]},{"level":3,"title":"视频","slug":"视频","link":"#视频","children":[]},{"level":3,"title":"高级","slug":"高级","link":"#高级","children":[]}]},{"level":2,"title":"直播来源","slug":"直播来源","link":"#直播来源","children":[{"level":3,"title":"静态来源","slug":"静态来源","link":"#静态来源","children":[]},{"level":3,"title":"音频来源","slug":"音频来源","link":"#音频来源","children":[]},{"level":3,"title":"视频来源","slug":"视频来源","link":"#视频来源","children":[]},{"level":3,"title":"组合输出","slug":"组合输出","link":"#组合输出","children":[]}]},{"level":2,"title":"滤镜","slug":"滤镜","link":"#滤镜","children":[{"level":3,"title":"常用滤镜","slug":"常用滤镜","link":"#常用滤镜","children":[]},{"level":3,"title":"色度键(抠图)","slug":"色度键-抠图","link":"#色度键-抠图","children":[]},{"level":3,"title":"模糊","slug":"模糊","link":"#模糊","children":[]},{"level":3,"title":"图像蒙版","slug":"图像蒙版","link":"#图像蒙版","children":[]},{"level":3,"title":"色彩校正","slug":"色彩校正","link":"#色彩校正","children":[]},{"level":3,"title":"应用 LUT","slug":"应用-lut","link":"#应用-lut","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"直播延迟严重","slug":"直播延迟严重","link":"#直播延迟严重","children":[]},{"level":3,"title":"一直断开重连","slug":"一直断开重连","link":"#一直断开重连","children":[]}]},{"level":2,"title":"后续","slug":"后续","link":"#后续","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1703937466000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":9.13,"words":2739},"filePathRelative":"apps/livestreaming/1_obs_basic.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    主界面

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6029],{3671:(e,a)=>{a.A=(e,a)=>{const n=e.__vccOpts||e;for(const[e,t]of a)n[e]=t;return n}},4222:(e,a,n)=>{n.r(a),n.d(a,{comp:()=>O,data:()=>w});var t=n(7847);const i={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},l=(0,t.Fv)('

    主界面

    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。
    直播输出设置

    音频

    点击「设置」>「音频」>「通用」,将声道设为单声道。除非你是歌唱主播,否则无需使用立体声。注意,如果你要使用监听或外放 OBS 声音,声道也需要使用立体声。

    视频

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

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

    直播分辨率设置

    高级

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

    OBS 高级设置

    直播来源

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

    直播来源

    静态来源

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

    音频来源

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

    视频来源

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

    组合输出

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

    滤镜

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

    常用滤镜

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

    色度键(抠图)

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

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

    模糊

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

    图像蒙版

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

    色彩校正

    ',6),m={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Color-Grade",target:"_blank",rel:"noopener noreferrer"},f=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2023-01-08-07-01-17.png",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption",null,"色彩校正")],-1),b=(0,t.Lk)("h3",{id:"应用-lut",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#应用-lut"},[(0,t.Lk)("span",null,"应用 LUT")])],-1),k={href:"https://wwva.lanzoue.com/iEyOs0k8kj3g",target:"_blank",rel:"noopener noreferrer"},S=(0,t.Fv)('

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

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

    常见问题

    直播延迟严重

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

    一直断开重连

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

    后续

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

    ',9),x={},O=(0,n(3671).A)(x,[["render",function(e,a){const n=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",i,[(0,t.eW)("Open Broadcaster Software"),(0,t.bF)(n)]),(0,t.eW)("(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。")]),l,(0,t.Lk)("ul",null,[r,p,o,s,g,(0,t.Lk)("li",null,[(0,t.eW)("VLC 视频源:安装 "),(0,t.Lk)("a",h,[(0,t.eW)("VLC"),(0,t.bF)(n)]),(0,t.eW)(" 才能启用本来源。「VLC 视频源」用于多个音视频按序播放,支持字幕。")])]),c,(0,t.Lk)("p",null,[(0,t.eW)("「模糊」属于效果滤镜,可将指定区域模糊化以维护隐私。推荐设置:类型设为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。要使用模糊滤镜,需要安装插件 "),(0,t.Lk)("a",d,[(0,t.eW)("StreamFX"),(0,t.bF)(n)]),(0,t.eW)("。")]),u,(0,t.Lk)("p",null,[(0,t.Lk)("a",m,[(0,t.eW)("色彩校正"),(0,t.bF)(n)]),(0,t.eW)("(Color Grading)属于效果滤镜,使用伽玛、对比度、亮度、饱和度、色调偏移、不透明度、颜色叠加、添加颜色来改变或校正最终画面的颜色和亮度。")]),f,b,(0,t.Lk)("p",null,[(0,t.eW)("「应用 LUT」属于效果滤镜。它使用 LUT 对画面进行色彩调整,相当于手机修图用的风格滤镜,能够大大提升画面效果。初期可以使用我的 "),(0,t.Lk)("a",k,[(0,t.eW)("LUT 设置"),(0,t.bF)(n)]),(0,t.eW)(",「路径」指向解压后的 png 文件。")]),S])}]]),w=JSON.parse('{"path":"/apps/livestreaming/1_obs_basic.html","title":"直播入门攻略一 | OBS 篇:OBS 30 新手指南","lang":"zh-CN","frontmatter":{"title":"直播入门攻略一 | OBS 篇:OBS 30 新手指南","category":["工具"],"tag":["OBS","直播"],"order":1,"description":"Open Broadcaster Software(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。 主界面 OBS 界面看起来有些复杂...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/1_obs_basic.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略一 | OBS 篇:OBS 30 新手指南"}],["meta",{"property":"og:description","content":"Open Broadcaster Software(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。 主界面 OBS 界面看起来有些复杂..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-05-20-47-16.png \\"OBS 主界面\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-30T11:57:46.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略一 | OBS 篇:OBS 30 新手指南"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OBS"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-12-30T11:57:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略一 | OBS 篇:OBS 30 新手指南\\",\\"image\\":[\\"https://img.newzone.top/2023-01-05-20-47-16.png \\\\\\"OBS 主界面\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-21-16-34.png \\\\\\"场景按钮\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-22-47-14.png \\\\\\"来源按钮\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-01-22-30.png \\\\\\"直播高级音频属性\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-01-38-21.png \\\\\\"工作室模式\\\\\\"\\",\\"https://img.newzone.top/2022-06-30-14-33-34.png \\\\\\"推流服务器设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-20-06-39.png \\\\\\"直播输出设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-20-22-29.png \\\\\\"直播分辨率设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-05-21-09-13.png \\\\\\"OBS 高级设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-02-10-05.png \\\\\\"直播来源\\\\\\"\\",\\"https://img.newzone.top/20210328235013.gif?imageMogr2/format/webp \\\\\\"色度键滤镜一键抠图\\\\\\"\\",\\"https://img.newzone.top/2023-01-08-06-49-05.png \\\\\\"右侧为模糊效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-02-51-10.png \\\\\\"模糊滤镜设置\\\\\\"\\",\\"https://img.newzone.top/2023-05-11-09-04-30.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2023-01-08-07-01-17.png \\\\\\"色彩校正\\\\\\"\\"],\\"dateModified\\":\\"2023-12-30T11:57:46.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"主界面","slug":"主界面","link":"#主界面","children":[{"level":3,"title":"场景","slug":"场景","link":"#场景","children":[]},{"level":3,"title":"来源","slug":"来源","link":"#来源","children":[]},{"level":3,"title":"混音器","slug":"混音器","link":"#混音器","children":[]},{"level":3,"title":"转场特效","slug":"转场特效","link":"#转场特效","children":[]},{"level":3,"title":"控制按钮","slug":"控制按钮","link":"#控制按钮","children":[]}]},{"level":2,"title":"设置","slug":"设置","link":"#设置","children":[{"level":3,"title":"直播","slug":"直播","link":"#直播","children":[]},{"level":3,"title":"输出","slug":"输出","link":"#输出","children":[]},{"level":3,"title":"音频","slug":"音频","link":"#音频","children":[]},{"level":3,"title":"视频","slug":"视频","link":"#视频","children":[]},{"level":3,"title":"高级","slug":"高级","link":"#高级","children":[]}]},{"level":2,"title":"直播来源","slug":"直播来源","link":"#直播来源","children":[{"level":3,"title":"静态来源","slug":"静态来源","link":"#静态来源","children":[]},{"level":3,"title":"音频来源","slug":"音频来源","link":"#音频来源","children":[]},{"level":3,"title":"视频来源","slug":"视频来源","link":"#视频来源","children":[]},{"level":3,"title":"组合输出","slug":"组合输出","link":"#组合输出","children":[]}]},{"level":2,"title":"滤镜","slug":"滤镜","link":"#滤镜","children":[{"level":3,"title":"常用滤镜","slug":"常用滤镜","link":"#常用滤镜","children":[]},{"level":3,"title":"色度键(抠图)","slug":"色度键-抠图","link":"#色度键-抠图","children":[]},{"level":3,"title":"模糊","slug":"模糊","link":"#模糊","children":[]},{"level":3,"title":"图像蒙版","slug":"图像蒙版","link":"#图像蒙版","children":[]},{"level":3,"title":"色彩校正","slug":"色彩校正","link":"#色彩校正","children":[]},{"level":3,"title":"应用 LUT","slug":"应用-lut","link":"#应用-lut","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"直播延迟严重","slug":"直播延迟严重","link":"#直播延迟严重","children":[]},{"level":3,"title":"一直断开重连","slug":"一直断开重连","link":"#一直断开重连","children":[]}]},{"level":2,"title":"后续","slug":"后续","link":"#后续","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1703937466000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":9.13,"words":2739},"filePathRelative":"apps/livestreaming/1_obs_basic.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    主界面

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-45706264.45fc9719.js b/assets/js/2017-04-18-wechat_multi_open.html.2035deb2.js similarity index 91% rename from assets/js/v-45706264.45fc9719.js rename to assets/js/2017-04-18-wechat_multi_open.html.2035deb2.js index 450ae30d7..a09dfd9fc 100644 --- a/assets/js/v-45706264.45fc9719.js +++ b/assets/js/2017-04-18-wechat_multi_open.html.2035deb2.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7240],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4732:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>c,data:()=>g});var n=a(3968);const o=(0,n.IL)('

    由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。

    要在不使用第三方软件的情况下实现微信的多开,现在只能依赖微信自身的一个小漏洞。通过快速双击微信图标,可以实现多开。

    双击多开

    要开启多个微信,只需按住回车键,同时左键点击微信图标,点击次数决定了开启的微信数量。这个小技巧是@刘舒怡分享的:

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

    如果你不喜欢手动点击,可以使用以下脚本,保存为 start_wechat.bat 文件。这个脚本将启动三个微信,你可以根据需要复制更多的 start 行。

    @echo off\nstart "WeChat" "C:\\Program Files\\Tencent\\WeChat\\WeChat.exe"\nstart "WeChat" "C:\\Program Files\\Tencent\\WeChat\\WeChat.exe"\nstart "WeChat" "C:\\Program Files\\Tencent\\WeChat\\WeChat.exe"\n
    ',7),r={href:"https://github.com/huiyadanli/RevokeMsgPatcher",target:"_blank",rel:"noopener noreferrer"},i={href:"https://wwva.lanzouq.com/irUIX187hz3c",target:"_blank",rel:"noopener noreferrer"},p=(0,n.QD)("code",null,".bat",-1),s=(0,n.IL)('

    开机多开微信

    如果你希望电脑开机时自动多开微信,可以把上述脚本的快捷方式放入 Windows 的开机「启动」文件夹。通常这个文件夹路径为 %AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup。或者,打开「运行」对话框,输入 shell:startup,回车即可。

    开机多开微信
    开机多开微信

    多客户端(已失效)

    从 2024 年开始,「微信 For Windows」和「微信 UWP」均已下架,新版的微信 Store 版也无法与微信 PC 版同时安装。因此,这一方案仅供记录,已不再有效。

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

    安装微信客户端
    安装微信客户端

    安装后,你可以同时启动微信 PC 版和这两个版本,互不干扰。如果你希望开机时自动启动这两个微信,可以把它们的快捷方式放在开机启动文件夹内。

    多客户端微信
    多客户端微信

    总结

    应用多开似乎越来越不受欢迎,比如新版 QQ 已经移除了多账户登录选项。但实际上,用户是怎样想的呢?这又有谁在乎呢?

    ',11),l={},c=(0,a(9720).c)(l,[["render",function(e,t){const a=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[o,(0,n.QD)("p",null,[(0,n.mY)("有开发者为微信和 QQ 制作了多开补丁 "),(0,n.QD)("a",r,[(0,n.mY)("RevokeMsgPatcher"),(0,n.K2)(a)]),(0,n.mY)(",可以从国内链接下载:"),(0,n.QD)("a",i,[(0,n.mY)("RevokeMsgPatcher.v1.6.zip"),(0,n.K2)(a)]),(0,n.mY)("。使用这个补丁后,每次点击应用图标都会打开新的登录窗口,这取决于个人需求。我更喜欢直接通过 "),p,(0,n.mY)(" 脚本来实现多开。")]),s])}]]),g=JSON.parse('{"path":"/posts/2017-04-18-wechat_multi_open.html","title":"跳过第三方软件,一步到位实现微信双开的秘密","lang":"zh-CN","frontmatter":{"title":"跳过第三方软件,一步到位实现微信双开的秘密","date":"2017-04-18T00:00:00.000Z","category":["工具"],"tag":["微信"],"order":-1,"description":"由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。 要在不使用第三方软件的情况下实现微信的多开,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-04-18-wechat_multi_open.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"跳过第三方软件,一步到位实现微信双开的秘密"}],["meta",{"property":"og:description","content":"由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。 要在不使用第三方软件的情况下实现微信的多开,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-06-04-23-49.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"跳过第三方软件,一步到位实现微信双开的秘密"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"微信"}],["meta",{"property":"article:published_time","content":"2017-04-18T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"跳过第三方软件,一步到位实现微信双开的秘密\\",\\"image\\":[\\"https://img.newzone.top/2022-05-06-04-23-49.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-06-04-21-30.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-06-04-21-40.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2017-04-18T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"双击多开","slug":"双击多开","link":"#双击多开","children":[]},{"level":2,"title":"开机多开微信","slug":"开机多开微信","link":"#开机多开微信","children":[]},{"level":2,"title":"多客户端(已失效)","slug":"多客户端-已失效","link":"#多客户端-已失效","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":2.59,"words":778},"filePathRelative":"_posts/2017-04-18-wechat_multi_open.md","localizedDate":"2017年4月18日","excerpt":"

    由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。

    \\n

    要在不使用第三方软件的情况下实现微信的多开,现在只能依赖微信自身的一个小漏洞。通过快速双击微信图标,可以实现多开。

    \\n

    双击多开

    \\n

    要开启多个微信,只需按住回车键,同时左键点击微信图标,点击次数决定了开启的微信数量。这个小技巧是@刘舒怡分享的:

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1989],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3993:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>c,data:()=>g});var n=a(7847);const o=(0,n.Fv)('

    由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。

    要在不使用第三方软件的情况下实现微信的多开,现在只能依赖微信自身的一个小漏洞。通过快速双击微信图标,可以实现多开。

    双击多开

    要开启多个微信,只需按住回车键,同时左键点击微信图标,点击次数决定了开启的微信数量。这个小技巧是@刘舒怡分享的:

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

    如果你不喜欢手动点击,可以使用以下脚本,保存为 start_wechat.bat 文件。这个脚本将启动三个微信,你可以根据需要复制更多的 start 行。

    @echo off\nstart "WeChat" "C:\\Program Files\\Tencent\\WeChat\\WeChat.exe"\nstart "WeChat" "C:\\Program Files\\Tencent\\WeChat\\WeChat.exe"\nstart "WeChat" "C:\\Program Files\\Tencent\\WeChat\\WeChat.exe"\n
    ',7),r={href:"https://github.com/huiyadanli/RevokeMsgPatcher",target:"_blank",rel:"noopener noreferrer"},i={href:"https://wwva.lanzouq.com/irUIX187hz3c",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Lk)("code",null,".bat",-1),s=(0,n.Fv)('

    开机多开微信

    如果你希望电脑开机时自动多开微信,可以把上述脚本的快捷方式放入 Windows 的开机「启动」文件夹。通常这个文件夹路径为 %AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup。或者,打开「运行」对话框,输入 shell:startup,回车即可。

    开机多开微信
    开机多开微信

    多客户端(已失效)

    从 2024 年开始,「微信 For Windows」和「微信 UWP」均已下架,新版的微信 Store 版也无法与微信 PC 版同时安装。因此,这一方案仅供记录,已不再有效。

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

    安装微信客户端
    安装微信客户端

    安装后,你可以同时启动微信 PC 版和这两个版本,互不干扰。如果你希望开机时自动启动这两个微信,可以把它们的快捷方式放在开机启动文件夹内。

    多客户端微信
    多客户端微信

    总结

    应用多开似乎越来越不受欢迎,比如新版 QQ 已经移除了多账户登录选项。但实际上,用户是怎样想的呢?这又有谁在乎呢?

    ',11),l={},c=(0,a(3671).A)(l,[["render",function(e,t){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[o,(0,n.Lk)("p",null,[(0,n.eW)("有开发者为微信和 QQ 制作了多开补丁 "),(0,n.Lk)("a",r,[(0,n.eW)("RevokeMsgPatcher"),(0,n.bF)(a)]),(0,n.eW)(",可以从国内链接下载:"),(0,n.Lk)("a",i,[(0,n.eW)("RevokeMsgPatcher.v1.6.zip"),(0,n.bF)(a)]),(0,n.eW)("。使用这个补丁后,每次点击应用图标都会打开新的登录窗口,这取决于个人需求。我更喜欢直接通过 "),p,(0,n.eW)(" 脚本来实现多开。")]),s])}]]),g=JSON.parse('{"path":"/posts/2017-04-18-wechat_multi_open.html","title":"跳过第三方软件,一步到位实现微信双开的秘密","lang":"zh-CN","frontmatter":{"title":"跳过第三方软件,一步到位实现微信双开的秘密","date":"2017-04-18T00:00:00.000Z","category":["工具"],"tag":["微信"],"order":-1,"description":"由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。 要在不使用第三方软件的情况下实现微信的多开,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-04-18-wechat_multi_open.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"跳过第三方软件,一步到位实现微信双开的秘密"}],["meta",{"property":"og:description","content":"由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。 要在不使用第三方软件的情况下实现微信的多开,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-06-04-23-49.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"跳过第三方软件,一步到位实现微信双开的秘密"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"微信"}],["meta",{"property":"article:published_time","content":"2017-04-18T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"跳过第三方软件,一步到位实现微信双开的秘密\\",\\"image\\":[\\"https://img.newzone.top/2022-05-06-04-23-49.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-06-04-21-30.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-06-04-21-40.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2017-04-18T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"双击多开","slug":"双击多开","link":"#双击多开","children":[]},{"level":2,"title":"开机多开微信","slug":"开机多开微信","link":"#开机多开微信","children":[]},{"level":2,"title":"多客户端(已失效)","slug":"多客户端-已失效","link":"#多客户端-已失效","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":2.59,"words":778},"filePathRelative":"_posts/2017-04-18-wechat_multi_open.md","localizedDate":"2017年4月18日","excerpt":"

    由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。

    \\n

    要在不使用第三方软件的情况下实现微信的多开,现在只能依赖微信自身的一个小漏洞。通过快速双击微信图标,可以实现多开。

    \\n

    双击多开

    \\n

    要开启多个微信,只需按住回车键,同时左键点击微信图标,点击次数决定了开启的微信数量。这个小技巧是@刘舒怡分享的:

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2017-04-22-rss_feed43_feedex.html.ba18839c.js b/assets/js/2017-04-22-rss_feed43_feedex.html.ba18839c.js new file mode 100644 index 000000000..e3a56e9d8 --- /dev/null +++ b/assets/js/2017-04-22-rss_feed43_feedex.html.ba18839c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[665],{3671:(a,n)=>{n.A=(a,n)=>{const t=a.__vccOpts||a;for(const[a,s]of n)t[a]=s;return t}},5257:(a,n,t)=>{t.r(n),t.d(n,{comp:()=>z,data:()=>y});var s=t(7847);const e=(0,s.Lk)("p",null,"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。",-1),p=(0,s.Lk)("p",null,[(0,s.Lk)("strong",null,"► 开始烧制属于自己的 feed")],-1),l=(0,s.Lk)("h2",{id:"_1-进入网页",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#_1-进入网页"},[(0,s.Lk)("span",null,"1. 进入网页")])],-1),o={href:"http://www.feed43.com/",target:"_blank",rel:"noopener noreferrer"},c=(0,s.Fv)('

    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>\n  <td class="red">\n    <span>2</span\n    ><a href="更时尚更运动 车展实拍解析红旗 H5"\n      >更时尚更运动 车展实拍解析红旗 H5</a\n    >\n  </td>\n  <td class="cBlue">11211615</td>\n</tr>\n

    抓取规则

    <tr>\n  {*}\n  <td class="{*}"><span>{*}</span><a href="{%}">{%}</a></td>\n  {*}\n  <td class="cBlue">{*}</td>\n  {*}\n</tr>\n

    点击 Extract,进行抓取。

    4. 整理 rss 输入格式

    「Define output format」是 Feed 的属性,通常前三项会被自动抓取一,后三项将之前获取的 item 里面的元素填入即可,{%1} 对应的是链接,所以填入「Item Link」,{%2} 对应标题则填入到「Item Title」。

    然后点击「preview」,完成制作,同时可以查看预览效果。

    如果注册了 FEED43 的账号,可以修改 RSS 地址,但链接不能使用中文,否则会导致 RSS 出错。

    5. 获取 RSS 地址

    ',24),i={href:"https://www.feed43.com/dianji.xml",target:"_blank",rel:"noopener noreferrer"},r=(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://pic1.zhimg.com/v2-f3b00e876d8df136f7d354b4fc22f900_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption")],-1),u=(0,s.Lk)("p",null,"在阅读器中的效果如下:",-1),d=(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://pic4.zhimg.com/v2-6d8f503ff3da16eb985ca1d3ae2de98f_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption")],-1),g=(0,s.Lk)("h2",{id:"_6-全文抓取",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#_6-全文抓取"},[(0,s.Lk)("span",null,"6. 全文抓取")])],-1),k=(0,s.Lk)("p",null,[(0,s.eW)("FEED43 导出的条目需要点击链接才能查看内容。要在 RSS 中展示全文,需要通过 FeedEx 再转换一次。注意:FEED43 免费用户过多,需要在浏览器中打开一次才能获得真实链接(一般为 "),(0,s.Lk)("code",null,"http://node2.feed43.com"),(0,s.eW)(")。FeedEx 需要使用真实链接,一般 3 分钟内转换完毕。")],-1),m={href:"https://feedex.net/",target:"_blank",rel:"noopener noreferrer"},h=(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://pic4.zhimg.com/v2-8e3701adffa1d6fb4ea10dda2704988b_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption")],-1),f=(0,s.Lk)("p",null,"Feeds43 的免费版每 6 小时抓取一次,最多显示最新的 20 条内容。如果网页源更新较频繁,建议使用 RSSHub 和 Huginn。",-1),b=(0,s.Lk)("h2",{id:"rss-合集",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#rss-合集"},[(0,s.Lk)("span",null,"RSS 合集")])],-1),S=(0,s.Lk)("p",null,"汇总的 RSS 永久订阅 feeds 均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),_={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},F={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},x={},z=(0,t(3671).A)(x,[["render",function(a,n){const t=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[e,p,l,(0,s.Lk)("p",null,[(0,s.Lk)("a",o,[(0,s.eW)("FEED43"),(0,s.bF)(t)]),(0,s.eW)(" 不需要注册,点击「Create your own feed」即可使用。")]),c,(0,s.Lk)("p",null,[(0,s.eW)("点击 Feed URL 可得 RSS 地址,样例是 "),(0,s.Lk)("a",i,[(0,s.eW)("https://www.feed43.com/dianji.xml"),(0,s.bF)(t)]),(0,s.eW)("。")]),r,u,d,g,k,(0,s.Lk)("p",null,[(0,s.eW)("FeedEx: "),(0,s.Lk)("a",m,[(0,s.eW)("https://feedex.net/"),(0,s.bF)(t)])]),h,f,b,S,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",_,[(0,s.eW)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,s.bF)(t)])])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",v,[(0,s.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,s.bF)(t)])])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",L,[(0,s.eW)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,s.bF)(t)])])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",F,[(0,s.eW)("RSS 速成篇 2:RSSHub 自部署"),(0,s.bF)(t)])])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",R,[(0,s.eW)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,s.bF)(t)])])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",E,[(0,s.eW)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,s.bF)(t)])])])])])}]]),y=JSON.parse('{"path":"/posts/2017-04-22-rss_feed43_feedex.html","title":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源","lang":"zh-CN","frontmatter":{"title":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源","date":"2017-04-22T12:54:00.000Z","category":["自动化"],"tag":["rss","Feed43","FeedEx"],"order":-2,"description":"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。 ► 开始烧制属于自己的 feed 1. 进入网页 FEED43 不需要注册,点击「Create your own feed」即可使用。 2. 选定 RSS 网页 在「Ste...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源"}],["meta",{"property":"og:description","content":"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。 ► 开始烧制属于自己的 feed 1. 进入网页 FEED43 不需要注册,点击「Create your own feed」即可使用。 2. 选定 RSS 网页 在「Ste..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-b5da0b08f632376fad3925a779e373b4_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-16T08:12:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:tag","content":"Feed43"}],["meta",{"property":"article:tag","content":"FeedEx"}],["meta",{"property":"article:published_time","content":"2017-04-22T12:54:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-05-16T08:12:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-b5da0b08f632376fad3925a779e373b4_r.jpg\\",\\"https://pic1.zhimg.com/v2-1b687a5b1c325ba6d04fbdcc13b95668_r.jpg\\",\\"https://pic1.zhimg.com/v2-b1fa90c59739bddc0c27134cd36ba6bc_r.jpg\\",\\"https://pic2.zhimg.com/v2-cf6dbf2c09189f7517ec63abdc80c50d_r.jpg\\",\\"https://pic4.zhimg.com/v2-e9486741a6229ab258a95147f584571b_r.jpg\\",\\"https://pic1.zhimg.com/v2-b4614f5c46090f2eb762aac87d604350_r.jpg\\",\\"https://pic2.zhimg.com/v2-498bf1f1c0b14da172498b58f59e39b9_r.jpg\\",\\"https://pic1.zhimg.com/v2-f3b00e876d8df136f7d354b4fc22f900_r.jpg\\",\\"https://pic4.zhimg.com/v2-6d8f503ff3da16eb985ca1d3ae2de98f_r.jpg\\",\\"https://pic4.zhimg.com/v2-8e3701adffa1d6fb4ea10dda2704988b_r.jpg\\"],\\"datePublished\\":\\"2017-04-22T12:54:00.000Z\\",\\"dateModified\\":\\"2023-05-16T08:12:45.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"1. 进入网页","slug":"_1-进入网页","link":"#_1-进入网页","children":[]},{"level":2,"title":"2. 选定 RSS 网页","slug":"_2-选定-rss-网页","link":"#_2-选定-rss-网页","children":[]},{"level":2,"title":"3. 定制 RSS 抓取规则","slug":"_3-定制-rss-抓取规则","link":"#_3-定制-rss-抓取规则","children":[]},{"level":2,"title":"4. 整理 rss 输入格式","slug":"_4-整理-rss-输入格式","link":"#_4-整理-rss-输入格式","children":[]},{"level":2,"title":"5. 获取 RSS 地址","slug":"_5-获取-rss-地址","link":"#_5-获取-rss-地址","children":[]},{"level":2,"title":"6. 全文抓取","slug":"_6-全文抓取","link":"#_6-全文抓取","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1684224765000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":2.75,"words":825},"filePathRelative":"_posts/2017-04-22-rss_feed43_feedex.md","localizedDate":"2017年4月22日","excerpt":"

    迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。

    \\n

    ► 开始烧制属于自己的 feed

    \\n

    1. 进入网页

    \\n

    FEED43 不需要注册,点击「Create your own feed」即可使用。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2017-07-28-office_2016_installer_error.html.a6e09f9d.js b/assets/js/2017-07-28-office_2016_installer_error.html.a6e09f9d.js new file mode 100644 index 000000000..729df3c67 --- /dev/null +++ b/assets/js/2017-07-28-office_2016_installer_error.html.a6e09f9d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4166],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,c]of t)o[e]=c;return o}},4575:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>a,data:()=>r});var c=o(7847);const i=[(0,c.Fv)('

    重新安装 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)],n={},a=(0,o(3671).A)(n,[["render",function(e,t){return(0,c.uX)(),(0,c.CE)("div",null,i)}]]),r=JSON.parse('{"path":"/posts/2017-07-28-office_2016_installer_error.html","title":"office 2016 安装程序报错解决办法","lang":"zh-CN","frontmatter":{"title":"office 2016 安装程序报错解决办法","date":"2017-07-28T11:02:00.000Z","category":["系统"],"tag":["office"],"order":-3,"description":"重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。 解决方法 打开 regedit.exe,在注册表中找到路径 计算机\\\\HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Of...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-07-28-office_2016_installer_error.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"office 2016 安装程序报错解决办法"}],["meta",{"property":"og:description","content":"重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。 解决方法 打开 regedit.exe,在注册表中找到路径 计算机\\\\HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Of..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic3.zhimg.com/v2-85bd2a49a47ee6d0c8eade7b3c249516_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-08-12T16:23:39.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"office 2016 安装程序报错解决办法"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"office"}],["meta",{"property":"article:published_time","content":"2017-07-28T11:02:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-08-12T16:23:39.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"office 2016 安装程序报错解决办法\\",\\"image\\":[\\"https://pic3.zhimg.com/v2-85bd2a49a47ee6d0c8eade7b3c249516_r.jpg\\",\\"https://pic3.zhimg.com/v2-650ede86dd191a8f0a1cd6e9b815377a_r.jpg\\"],\\"datePublished\\":\\"2017-07-28T11:02:00.000Z\\",\\"dateModified\\":\\"2022-08-12T16:23:39.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"解决方法","slug":"解决方法","link":"#解决方法","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1660321419000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.59,"words":477},"filePathRelative":"_posts/2017-07-28-office_2016_installer_error.md","localizedDate":"2017年7月28日","excerpt":"

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

    \\n
    \\"\\"
    \\n

    解决方法

    \\n
      \\n
    1. \\n

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

      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

      在 C 盘建立安装组件:

      \\n
        \\n
      • 把安装包路径 \\\\groove.zh-cn\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • \\n
      • 把安装包路径 \\\\proplus.ww\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-0011-0000-1000-0000000FF1CE}-C
      • \\n
      \\n
    6. \\n
    7. \\n

      将需要的程序文件放入 MSOCache 路径\\nMSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。\\n如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      \\n
        \\n
      • Onenote 把安装包路径 \\\\onenote.zh-cn\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • \\n
      • Access 把安装包路径 \\\\access.zh-cn\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-0015-0804-1000-0000000FF1CE}-C
      • \\n
      \\n
    8. \\n
    9. \\n

      最后进入安装包运行 setup.exe 安装正常。

      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5c90ee55.1bdb3d4a.js b/assets/js/2017-07-29-onenote_2016_cannot_be_logged_in.html.afda6ec4.js similarity index 94% rename from assets/js/v-5c90ee55.1bdb3d4a.js rename to assets/js/2017-07-29-onenote_2016_cannot_be_logged_in.html.afda6ec4.js index 8d03b0284..9523c3d7e 100644 --- a/assets/js/v-5c90ee55.1bdb3d4a.js +++ b/assets/js/2017-07-29-onenote_2016_cannot_be_logged_in.html.afda6ec4.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4248],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,i]of e)a[t]=i;return a}},1126:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>c,data:()=>p});var i=a(3968);const o=[(0,i.IL)('

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。

    完成设置后,即可正常登录并打开 OneNote。

    ',9)],n={},c=(0,a(9720).c)(n,[["render",function(t,e){return(0,i.Wz)(),(0,i.An)("div",null,o)}]]),p=JSON.parse('{"path":"/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","title":"OneNote 2016 无法登陆问题解决","lang":"zh-CN","frontmatter":{"title":"OneNote 2016 无法登陆问题解决","date":"2017-07-29T15:19:00.000Z","category":["系统"],"tag":["OneNote"],"order":-4,"description":"OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。 打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。 点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。 完成...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"OneNote 2016 无法登陆问题解决"}],["meta",{"property":"og:description","content":"OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。 打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。 点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。 完成..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic4.zhimg.com/v2-d5945359b896ffd09d9973e9597ec06b_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-11-04T15:29:05.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"OneNote 2016 无法登陆问题解决"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OneNote"}],["meta",{"property":"article:published_time","content":"2017-07-29T15:19:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-11-04T15:29:05.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"OneNote 2016 无法登陆问题解决\\",\\"image\\":[\\"https://pic4.zhimg.com/v2-d5945359b896ffd09d9973e9597ec06b_r.jpg\\",\\"https://pic1.zhimg.com/v2-cc00b3039f755b92f9ae511c8b7debd0_r.jpg\\",\\"https://pic2.zhimg.com/v2-717bf3c8b62748b62a04219435b8a75d_r.jpg\\",\\"https://pic4.zhimg.com/v2-25697b0c27aa8780c532b7a03a78dcbf_r.jpg\\",\\"https://pic4.zhimg.com/v2-ff20ef8aa22215cba64b879775dfdf4f_r.jpg\\"],\\"datePublished\\":\\"2017-07-29T15:19:00.000Z\\",\\"dateModified\\":\\"2022-11-04T15:29:05.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1667575745000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.51,"words":153},"filePathRelative":"_posts/2017-07-29-onenote_2016_cannot_be_logged_in.md","localizedDate":"2017年7月29日","excerpt":"

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    \\n
    \\"\\"
    \\n

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4534],{3671:(t,e)=>{e.A=(t,e)=>{const a=t.__vccOpts||t;for(const[t,i]of e)a[t]=i;return a}},5559:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>c,data:()=>p});var i=a(7847);const o=[(0,i.Fv)('

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。

    完成设置后,即可正常登录并打开 OneNote。

    ',9)],n={},c=(0,a(3671).A)(n,[["render",function(t,e){return(0,i.uX)(),(0,i.CE)("div",null,o)}]]),p=JSON.parse('{"path":"/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","title":"OneNote 2016 无法登陆问题解决","lang":"zh-CN","frontmatter":{"title":"OneNote 2016 无法登陆问题解决","date":"2017-07-29T15:19:00.000Z","category":["系统"],"tag":["OneNote"],"order":-4,"description":"OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。 打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。 点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。 完成...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"OneNote 2016 无法登陆问题解决"}],["meta",{"property":"og:description","content":"OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。 打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。 点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。 完成..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic4.zhimg.com/v2-d5945359b896ffd09d9973e9597ec06b_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-11-04T15:29:05.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"OneNote 2016 无法登陆问题解决"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OneNote"}],["meta",{"property":"article:published_time","content":"2017-07-29T15:19:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-11-04T15:29:05.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"OneNote 2016 无法登陆问题解决\\",\\"image\\":[\\"https://pic4.zhimg.com/v2-d5945359b896ffd09d9973e9597ec06b_r.jpg\\",\\"https://pic1.zhimg.com/v2-cc00b3039f755b92f9ae511c8b7debd0_r.jpg\\",\\"https://pic2.zhimg.com/v2-717bf3c8b62748b62a04219435b8a75d_r.jpg\\",\\"https://pic4.zhimg.com/v2-25697b0c27aa8780c532b7a03a78dcbf_r.jpg\\",\\"https://pic4.zhimg.com/v2-ff20ef8aa22215cba64b879775dfdf4f_r.jpg\\"],\\"datePublished\\":\\"2017-07-29T15:19:00.000Z\\",\\"dateModified\\":\\"2022-11-04T15:29:05.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1667575745000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.51,"words":153},"filePathRelative":"_posts/2017-07-29-onenote_2016_cannot_be_logged_in.md","localizedDate":"2017年7月29日","excerpt":"

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    \\n
    \\"\\"
    \\n

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-557db29b.c95a9f8d.js b/assets/js/2017-09-02-forced_shutdown.html.3159840b.js similarity index 96% rename from assets/js/v-557db29b.c95a9f8d.js rename to assets/js/2017-09-02-forced_shutdown.html.3159840b.js index cdb97a009..6b0e99f0c 100644 --- a/assets/js/v-557db29b.c95a9f8d.js +++ b/assets/js/2017-09-02-forced_shutdown.html.3159840b.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1280],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},8416:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>l,data:()=>s});var o=a(3968);const n=[(0,o.IL)('

    晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 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\n\n[HKEY_CURRENT_USER\\Control Panel\\Desktop]\n"AutoEndTasks"="1"\n"WaitToKillAppTimeout"="2000"\n

    cmd 修改

    以管理员权限运行 cmd(命令提示符),输入以下命令:

    reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v AutoEndTasks /t REG_SZ /d 1 /f\n\nreg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v WaitToKillAppTimeout /t REG_SZ /d 2000 /f\n

    PowerShell 修改

    以管理员权限运行 PowerShell,输入以下命令:

    cmd /c reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v AutoEndTasks /t REG_SZ /d 1 /f\n\ncmd /c reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v WaitToKillAppTimeout /t REG_SZ /d 2000 /f\n

    ——————————

    网上流行一种通过修改「gpedit.msc」达到快速关机的方法,但实际测试结果表明,这种方法并不能实现强制关机。以下为这种方法的操作流程记录,仅供参考:

    1. 点击桌面左下角“windows”图标,选择“运行”选项;

    2. 进入运行窗口,输入“gpedit.msc”命令,按下回车键确定;

    3. 打开本地组策略编辑器界面,依次展开“计算机配置——管理模板——系统——关机选项”文件夹;鼠标右击右侧“关闭会阻止或取消关机的应用程序的自动终止功能”选项,接着选择“编辑”功能;将弹出窗口选项更改成“已启用”,然后点击“应用——确定”按钮。

      但开启后,提示程序没有响应,无法关机。

    修改“gpedit.msc”虽然可以撤销程序阻止关机的权限,但它并没有赋予关机进程对程序的关闭权限,因此并不能达到强制关机的效果。

    ',19)],i={},l=(0,a(9720).c)(i,[["render",function(e,t){return(0,o.Wz)(),(0,o.An)("div",null,n)}]]),s=JSON.parse('{"path":"/posts/2017-09-02-forced_shutdown.html","title":"电脑关机了,第二天一看确又开着的?让系统正常关机!","lang":"zh-CN","frontmatter":{"title":"电脑关机了,第二天一看确又开着的?让系统正常关机!","date":"2017-09-02T00:38:00.000Z","category":["系统"],"tag":["关机"],"order":-5,"description":"晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 GUI 应用程序在阻止或取消关机,使得系统无法正常关机。为解决此问题,可以按照以下方法授予系统自动关机权限。 手工操作 点击「开始菜单」,搜索「Regedit」,进入注册表编辑器。 打开窗口后,向注册表上方菜单输入路径 计算机\\\\HKEY_CURRENT_USER\\\\Control ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-09-02-forced_shutdown.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"电脑关机了,第二天一看确又开着的?让系统正常关机!"}],["meta",{"property":"og:description","content":"晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 GUI 应用程序在阻止或取消关机,使得系统无法正常关机。为解决此问题,可以按照以下方法授予系统自动关机权限。 手工操作 点击「开始菜单」,搜索「Regedit」,进入注册表编辑器。 打开窗口后,向注册表上方菜单输入路径 计算机\\\\HKEY_CURRENT_USER\\\\Control ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic3.zhimg.com/v2-c643b9737b35f9dd9a8382c5653e3d3e_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"电脑关机了,第二天一看确又开着的?让系统正常关机!"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"关机"}],["meta",{"property":"article:published_time","content":"2017-09-02T00:38:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"电脑关机了,第二天一看确又开着的?让系统正常关机!\\",\\"image\\":[\\"https://pic3.zhimg.com/v2-c643b9737b35f9dd9a8382c5653e3d3e_r.jpg\\",\\"https://pic4.zhimg.com/v2-4b736585b25509b036935a2f9c37d843_r.jpg\\",\\"https://pic4.zhimg.com/v2-46fafee0cb6e212e793fc80268ab0917_r.jpg\\"],\\"datePublished\\":\\"2017-09-02T00:38:00.000Z\\",\\"dateModified\\":\\"2023-08-05T23:04:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"手工操作","slug":"手工操作","link":"#手工操作","children":[]},{"level":2,"title":"通过脚本修改","slug":"通过脚本修改","link":"#通过脚本修改","children":[{"level":3,"title":"注册表脚本修改","slug":"注册表脚本修改","link":"#注册表脚本修改","children":[]},{"level":3,"title":"cmd 修改","slug":"cmd-修改","link":"#cmd-修改","children":[]},{"level":3,"title":"PowerShell 修改","slug":"powershell-修改","link":"#powershell-修改","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":2.65,"words":794},"filePathRelative":"_posts/2017-09-02-forced_shutdown.md","localizedDate":"2017年9月2日","excerpt":"

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

    \\n

    手工操作

    \\n
      \\n
    1. \\n

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

      \\n
    2. \\n
    3. \\n

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

      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5478],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},5472:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>l,data:()=>s});var o=a(7847);const n=[(0,o.Fv)('

    晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 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\n\n[HKEY_CURRENT_USER\\Control Panel\\Desktop]\n"AutoEndTasks"="1"\n"WaitToKillAppTimeout"="2000"\n

    cmd 修改

    以管理员权限运行 cmd(命令提示符),输入以下命令:

    reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v AutoEndTasks /t REG_SZ /d 1 /f\n\nreg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v WaitToKillAppTimeout /t REG_SZ /d 2000 /f\n

    PowerShell 修改

    以管理员权限运行 PowerShell,输入以下命令:

    cmd /c reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v AutoEndTasks /t REG_SZ /d 1 /f\n\ncmd /c reg add "HKEY_CURRENT_USER\\Control Panel\\Desktop" /v WaitToKillAppTimeout /t REG_SZ /d 2000 /f\n

    ——————————

    网上流行一种通过修改「gpedit.msc」达到快速关机的方法,但实际测试结果表明,这种方法并不能实现强制关机。以下为这种方法的操作流程记录,仅供参考:

    1. 点击桌面左下角“windows”图标,选择“运行”选项;

    2. 进入运行窗口,输入“gpedit.msc”命令,按下回车键确定;

    3. 打开本地组策略编辑器界面,依次展开“计算机配置——管理模板——系统——关机选项”文件夹;鼠标右击右侧“关闭会阻止或取消关机的应用程序的自动终止功能”选项,接着选择“编辑”功能;将弹出窗口选项更改成“已启用”,然后点击“应用——确定”按钮。

      但开启后,提示程序没有响应,无法关机。

    修改“gpedit.msc”虽然可以撤销程序阻止关机的权限,但它并没有赋予关机进程对程序的关闭权限,因此并不能达到强制关机的效果。

    ',19)],i={},l=(0,a(3671).A)(i,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div",null,n)}]]),s=JSON.parse('{"path":"/posts/2017-09-02-forced_shutdown.html","title":"电脑关机了,第二天一看确又开着的?让系统正常关机!","lang":"zh-CN","frontmatter":{"title":"电脑关机了,第二天一看确又开着的?让系统正常关机!","date":"2017-09-02T00:38:00.000Z","category":["系统"],"tag":["关机"],"order":-5,"description":"晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 GUI 应用程序在阻止或取消关机,使得系统无法正常关机。为解决此问题,可以按照以下方法授予系统自动关机权限。 手工操作 点击「开始菜单」,搜索「Regedit」,进入注册表编辑器。 打开窗口后,向注册表上方菜单输入路径 计算机\\\\HKEY_CURRENT_USER\\\\Control ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-09-02-forced_shutdown.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"电脑关机了,第二天一看确又开着的?让系统正常关机!"}],["meta",{"property":"og:description","content":"晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 GUI 应用程序在阻止或取消关机,使得系统无法正常关机。为解决此问题,可以按照以下方法授予系统自动关机权限。 手工操作 点击「开始菜单」,搜索「Regedit」,进入注册表编辑器。 打开窗口后,向注册表上方菜单输入路径 计算机\\\\HKEY_CURRENT_USER\\\\Control ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic3.zhimg.com/v2-c643b9737b35f9dd9a8382c5653e3d3e_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"电脑关机了,第二天一看确又开着的?让系统正常关机!"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"关机"}],["meta",{"property":"article:published_time","content":"2017-09-02T00:38:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"电脑关机了,第二天一看确又开着的?让系统正常关机!\\",\\"image\\":[\\"https://pic3.zhimg.com/v2-c643b9737b35f9dd9a8382c5653e3d3e_r.jpg\\",\\"https://pic4.zhimg.com/v2-4b736585b25509b036935a2f9c37d843_r.jpg\\",\\"https://pic4.zhimg.com/v2-46fafee0cb6e212e793fc80268ab0917_r.jpg\\"],\\"datePublished\\":\\"2017-09-02T00:38:00.000Z\\",\\"dateModified\\":\\"2023-08-05T23:04:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"手工操作","slug":"手工操作","link":"#手工操作","children":[]},{"level":2,"title":"通过脚本修改","slug":"通过脚本修改","link":"#通过脚本修改","children":[{"level":3,"title":"注册表脚本修改","slug":"注册表脚本修改","link":"#注册表脚本修改","children":[]},{"level":3,"title":"cmd 修改","slug":"cmd-修改","link":"#cmd-修改","children":[]},{"level":3,"title":"PowerShell 修改","slug":"powershell-修改","link":"#powershell-修改","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":2.65,"words":794},"filePathRelative":"_posts/2017-09-02-forced_shutdown.md","localizedDate":"2017年9月2日","excerpt":"

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

    \\n

    手工操作

    \\n
      \\n
    1. \\n

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

      \\n
    2. \\n
    3. \\n

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

      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-d1668f52.ba363409.js b/assets/js/2017-09-03-smb_lan_sharing.html.6847b5b9.js similarity index 93% rename from assets/js/v-d1668f52.ba363409.js rename to assets/js/2017-09-03-smb_lan_sharing.html.6847b5b9.js index d1414c45d..8b55d9263 100644 --- a/assets/js/v-d1668f52.ba363409.js +++ b/assets/js/2017-09-03-smb_lan_sharing.html.6847b5b9.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1760],{9720:(t,e)=>{e.c=(t,e)=>{const i=t.__vccOpts||t;for(const[t,a]of e)i[t]=a;return i}},6404:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>c,data:()=>o});var a=i(3968);const n=[(0,a.IL)('

    Windows 系统开启 SMB 协议:

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

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

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

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

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

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

    ',4)],p={},c=(0,i(9720).c)(p,[["render",function(t,e){return(0,a.Wz)(),(0,a.An)("div",null,n)}]]),o=JSON.parse('{"path":"/posts/2017-09-03-smb_lan_sharing.html","title":"加速 SMB 协议,让 PC 变身小型 NAS","lang":"zh-CN","frontmatter":{"title":"加速 SMB 协议,让 PC 变身小型 NAS","date":"2017-09-03T20:57:00.000Z","category":["系统"],"tag":["smb"],"order":-6,"description":"Windows 系统开启 SMB 协议: 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。 打开「程序」窗口,单击「启用或关闭 windows 功能」。 打开「windows 功能」窗口,勾选 SMB 直通。 勾选「远程差分压缩 API 支持」。 网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。 官方解释:远程差分压...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-09-03-smb_lan_sharing.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"加速 SMB 协议,让 PC 变身小型 NAS"}],["meta",{"property":"og:description","content":"Windows 系统开启 SMB 协议: 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。 打开「程序」窗口,单击「启用或关闭 windows 功能」。 打开「windows 功能」窗口,勾选 SMB 直通。 勾选「远程差分压缩 API 支持」。 网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。 官方解释:远程差分压..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-af3e5c2a16a1f245ac6584097c53be60_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-25T04:29:03.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"加速 SMB 协议,让 PC 变身小型 NAS"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"smb"}],["meta",{"property":"article:published_time","content":"2017-09-03T20:57:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-25T04:29:03.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"加速 SMB 协议,让 PC 变身小型 NAS\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-af3e5c2a16a1f245ac6584097c53be60_r.jpg\\",\\"https://pic1.zhimg.com/v2-36207f67a5eb3aeb8ee7c1ae855b13dc_r.jpg\\",\\"https://pic3.zhimg.com/v2-b1feb5554e6f1da003266be9cb470dfe_r.jpg\\",\\"https://pic4.zhimg.com/v2-c5fc3e3d771b6e4bd2516372c69b340b_r.jpg\\"],\\"datePublished\\":\\"2017-09-03T20:57:00.000Z\\",\\"dateModified\\":\\"2022-07-25T04:29:03.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658723343000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.89,"words":268},"filePathRelative":"_posts/2017-09-03-smb_lan_sharing.md","localizedDate":"2017年9月3日","excerpt":"

    Windows 系统开启 SMB 协议:

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6968],{3671:(t,e)=>{e.A=(t,e)=>{const i=t.__vccOpts||t;for(const[t,a]of e)i[t]=a;return i}},4959:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>c,data:()=>o});var a=i(7847);const n=[(0,a.Fv)('

    Windows 系统开启 SMB 协议:

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

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

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

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

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

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

    ',4)],p={},c=(0,i(3671).A)(p,[["render",function(t,e){return(0,a.uX)(),(0,a.CE)("div",null,n)}]]),o=JSON.parse('{"path":"/posts/2017-09-03-smb_lan_sharing.html","title":"加速 SMB 协议,让 PC 变身小型 NAS","lang":"zh-CN","frontmatter":{"title":"加速 SMB 协议,让 PC 变身小型 NAS","date":"2017-09-03T20:57:00.000Z","category":["系统"],"tag":["smb"],"order":-6,"description":"Windows 系统开启 SMB 协议: 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。 打开「程序」窗口,单击「启用或关闭 windows 功能」。 打开「windows 功能」窗口,勾选 SMB 直通。 勾选「远程差分压缩 API 支持」。 网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。 官方解释:远程差分压...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-09-03-smb_lan_sharing.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"加速 SMB 协议,让 PC 变身小型 NAS"}],["meta",{"property":"og:description","content":"Windows 系统开启 SMB 协议: 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。 打开「程序」窗口,单击「启用或关闭 windows 功能」。 打开「windows 功能」窗口,勾选 SMB 直通。 勾选「远程差分压缩 API 支持」。 网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。 官方解释:远程差分压..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-af3e5c2a16a1f245ac6584097c53be60_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-25T04:29:03.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"加速 SMB 协议,让 PC 变身小型 NAS"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"smb"}],["meta",{"property":"article:published_time","content":"2017-09-03T20:57:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-25T04:29:03.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"加速 SMB 协议,让 PC 变身小型 NAS\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-af3e5c2a16a1f245ac6584097c53be60_r.jpg\\",\\"https://pic1.zhimg.com/v2-36207f67a5eb3aeb8ee7c1ae855b13dc_r.jpg\\",\\"https://pic3.zhimg.com/v2-b1feb5554e6f1da003266be9cb470dfe_r.jpg\\",\\"https://pic4.zhimg.com/v2-c5fc3e3d771b6e4bd2516372c69b340b_r.jpg\\"],\\"datePublished\\":\\"2017-09-03T20:57:00.000Z\\",\\"dateModified\\":\\"2022-07-25T04:29:03.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658723343000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.89,"words":268},"filePathRelative":"_posts/2017-09-03-smb_lan_sharing.md","localizedDate":"2017年9月3日","excerpt":"

    Windows 系统开启 SMB 协议:

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2017-10-18-light_cat_e8-c-epon_admin.html.61c954a8.js b/assets/js/2017-10-18-light_cat_e8-c-epon_admin.html.61c954a8.js new file mode 100644 index 000000000..85f229e75 --- /dev/null +++ b/assets/js/2017-10-18-light_cat_e8-c-epon_admin.html.61c954a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[955],{3671:(e,t)=>{t.A=(e,t)=>{const c=e.__vccOpts||e;for(const[e,i]of t)c[e]=i;return c}},7905:(e,t,c)=>{c.r(t),c.d(t,{comp:()=>n,data:()=>p});var i=c(7847);const a=[(0,i.Fv)('

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

    它可以用于端口映射(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)],o={},n=(0,c(3671).A)(o,[["render",function(e,t){return(0,i.uX)(),(0,i.CE)("div",null,a)}]]),p=JSON.parse('{"path":"/posts/2017-10-18-light_cat_e8-c-epon_admin.html","title":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)","lang":"zh-CN","frontmatter":{"title":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)","date":"2017-10-18T18:28:00.000Z","category":["网络"],"tag":["光猫"],"order":-7,"description":"为什么要获得光猫超级密码? 它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。 破解测试环境 运营商:上海电信 光猫型号:贝尔 E8-C-EPON 硬件版本:RG201O-CA_V1A2 软件版本:E201OCAA2V11...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-10-18-light_cat_e8-c-epon_admin.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"}],["meta",{"property":"og:description","content":"为什么要获得光猫超级密码? 它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。 破解测试环境 运营商:上海电信 光猫型号:贝尔 E8-C-EPON 硬件版本:RG201O-CA_V1A2 软件版本:E201OCAA2V11..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-9e43bc86b9095f3f6c2cfa4bd58dcd68_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-13T16:05:48.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"光猫"}],["meta",{"property":"article:published_time","content":"2017-10-18T18:28:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-13T16:05:48.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-9e43bc86b9095f3f6c2cfa4bd58dcd68_r.jpg\\",\\"https://pic3.zhimg.com/v2-ee441dd18cc8e5f6303fdaef82b6d476_r.jpg\\",\\"https://pic1.zhimg.com/v2-31d6bb6b90be541c186a360fe2dd323c_r.jpg\\"],\\"datePublished\\":\\"2017-10-18T18:28:00.000Z\\",\\"dateModified\\":\\"2023-01-13T16:05:48.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么要获得光猫超级密码?","slug":"为什么要获得光猫超级密码","link":"#为什么要获得光猫超级密码","children":[]},{"level":2,"title":"破解测试环境","slug":"破解测试环境","link":"#破解测试环境","children":[]},{"level":2,"title":"光猫超级密码破解","slug":"光猫超级密码破解","link":"#光猫超级密码破解","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1673625948000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.09,"words":326},"filePathRelative":"_posts/2017-10-18-light_cat_e8-c-epon_admin.md","localizedDate":"2017年10月18日","excerpt":"

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

    \\n

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

    \\n

    破解测试环境

    \\n

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

    \\n

    光猫超级密码破解

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2017-10-18-light_cat_port_forwarding.html.baf0948a.js b/assets/js/2017-10-18-light_cat_port_forwarding.html.baf0948a.js new file mode 100644 index 000000000..eea96cbb7 --- /dev/null +++ b/assets/js/2017-10-18-light_cat_port_forwarding.html.baf0948a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4732],{3671:(t,e)=>{e.A=(t,e)=>{const i=t.__vccOpts||t;for(const[t,a]of e)i[t]=a;return i}},9104:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>o,data:()=>c});var a=i(7847);const n={href:"https://newzone.top/posts/2017-10-18-Light_cat_E8-C-EPON_admin.html",target:"_blank",rel:"noopener noreferrer"},r=(0,a.Fv)('

    光猫端口映射步骤:

    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),p={},o=(0,i(3671).A)(p,[["render",function(t,e){const i=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.eW)("光猫默认没有管理权限,需要先获得光猫的超管密码,参考"),(0,a.Lk)("a",n,[(0,a.eW)("光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"),(0,a.bF)(i)]),(0,a.eW)("。")]),r])}]]),c=JSON.parse('{"path":"/posts/2017-10-18-light_cat_port_forwarding.html","title":"光猫改造 篇二:光猫 + 路由器,实现端口映射","lang":"zh-CN","frontmatter":{"title":"光猫改造 篇二:光猫 + 路由器,实现端口映射","date":"2017-10-18T22:00:00.000Z","category":["网络"],"tag":["光猫"],"order":-8,"description":"光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)。 光猫端口映射步骤: 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X) 登陆路由器...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-10-18-light_cat_port_forwarding.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"光猫改造 篇二:光猫 + 路由器,实现端口映射"}],["meta",{"property":"og:description","content":"光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)。 光猫端口映射步骤: 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X) 登陆路由器..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic2.zhimg.com/v2-658d5433201b79da169a520f4b19d495_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"光猫改造 篇二:光猫 + 路由器,实现端口映射"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"光猫"}],["meta",{"property":"article:published_time","content":"2017-10-18T22:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"光猫改造 篇二:光猫 + 路由器,实现端口映射\\",\\"image\\":[\\"https://pic2.zhimg.com/v2-658d5433201b79da169a520f4b19d495_r.jpg\\",\\"https://pic4.zhimg.com/v2-32825a6d3d75f4bfe5668f1b0d6c6683_r.jpg\\",\\"https://pic2.zhimg.com/v2-8f3eb2c42fd5d1a98f1345c6a5855e99_r.jpg\\",\\"https://pic2.zhimg.com/v2-b4f5179278da52409f4a04ce7d139f99_r.jpg\\"],\\"datePublished\\":\\"2017-10-18T22:00:00.000Z\\",\\"dateModified\\":\\"2023-01-23T14:11:29.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":0.69,"words":206},"filePathRelative":"_posts/2017-10-18-light_cat_port_forwarding.md","localizedDate":"2017年10月18日","excerpt":"

    光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)

    \\n

    光猫端口映射步骤:

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
      \\"\\"
      \\n
    6. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-c1ec9846.2ad1118c.js b/assets/js/2018-01-19-forget_the_cdn.html.409768d8.js similarity index 93% rename from assets/js/v-c1ec9846.2ad1118c.js rename to assets/js/2018-01-19-forget_the_cdn.html.409768d8.js index c90980598..f7b6d1956 100644 --- a/assets/js/v-c1ec9846.2ad1118c.js +++ b/assets/js/2018-01-19-forget_the_cdn.html.409768d8.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7208],{9720:(t,e)=>{e.c=(t,e)=>{const o=t.__vccOpts||t;for(const[t,r]of e)o[t]=r;return o}},9736:(t,e,o)=>{o.r(e),o.d(e,{comp:()=>a,data:()=>c});var r=o(3968);const n=[(0,r.IL)("

    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)],p={},a=(0,o(9720).c)(p,[["render",function(t,e){return(0,r.Wz)(),(0,r.An)("div",null,n)}]]),c=JSON.parse('{"path":"/posts/2018-01-19-forget_the_cdn.html","title":"小型网站管理员,快放弃 CDN!","lang":"zh-CN","frontmatter":{"title":"小型网站管理员,快放弃 CDN!","date":"2018-01-19T12:00:00.000Z","category":["服务器"],"tag":["CDN","建站"],"order":-9,"description":" CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-01-19-forget_the_cdn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"小型网站管理员,快放弃 CDN!"}],["meta",{"property":"og:description","content":" CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-24T17:51:16.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"CDN"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-01-19T12:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-24T17:51:16.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"小型网站管理员,快放弃 CDN!\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-01-19T12:00:00.000Z\\",\\"dateModified\\":\\"2022-07-24T17:51:16.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658685076000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.17,"words":652},"filePathRelative":"_posts/2018-01-19-forget_the_cdn.md","localizedDate":"2018年1月19日","excerpt":"
    \\n

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

    \\n
    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1582],{3671:(t,e)=>{e.A=(t,e)=>{const o=t.__vccOpts||t;for(const[t,r]of e)o[t]=r;return o}},6504:(t,e,o)=>{o.r(e),o.d(e,{comp:()=>a,data:()=>c});var r=o(7847);const n=[(0,r.Fv)("

    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)],p={},a=(0,o(3671).A)(p,[["render",function(t,e){return(0,r.uX)(),(0,r.CE)("div",null,n)}]]),c=JSON.parse('{"path":"/posts/2018-01-19-forget_the_cdn.html","title":"小型网站管理员,快放弃 CDN!","lang":"zh-CN","frontmatter":{"title":"小型网站管理员,快放弃 CDN!","date":"2018-01-19T12:00:00.000Z","category":["服务器"],"tag":["CDN","建站"],"order":-9,"description":" CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-01-19-forget_the_cdn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"小型网站管理员,快放弃 CDN!"}],["meta",{"property":"og:description","content":" CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-24T17:51:16.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"CDN"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-01-19T12:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-24T17:51:16.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"小型网站管理员,快放弃 CDN!\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-01-19T12:00:00.000Z\\",\\"dateModified\\":\\"2022-07-24T17:51:16.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658685076000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.17,"words":652},"filePathRelative":"_posts/2018-01-19-forget_the_cdn.md","localizedDate":"2018年1月19日","excerpt":"
    \\n

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

    \\n
    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-01-31-hire_a_robot.html.a00b0658.js b/assets/js/2018-01-31-hire_a_robot.html.a00b0658.js new file mode 100644 index 000000000..6b10deaef --- /dev/null +++ b/assets/js/2018-01-31-hire_a_robot.html.a00b0658.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5900],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},4865:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>d,data:()=>k});var o=n(7847);const r=(0,o.Fv)('

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

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

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

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

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

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

    ',7),a={href:"https://github.com/huginn/huginn",target:"_blank",rel:"noopener noreferrer"},l=(0,o.Lk)("blockquote",null,[(0,o.Lk)("p",null,"Huginn 是一个可以创建为你在线执行自动化任务的系统。Huginn 可以读取网页,监测事件并且执行符合你需求的动作。Huginn 通过 agents 创建并执行任务(事件流)。你可以将它看作是一个运行在你自己服务器上的 IFTTT 或 Zapier。")],-1),p=(0,o.Lk)("p",null,"Huginn 帮我将所有信息聚合成 RSS,24 小时帮我获取我要的内容。",-1),i={href:"http://news.163.com/rank",target:"_blank",rel:"noopener noreferrer"},c={href:"http://top.baidu.com/buzz?b=1",target:"_blank",rel:"noopener noreferrer"},s={href:"https://www.guokr.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,o.Lk)("li",null,"工作类:梅花、SocialBeta、数英网、艾瑞网",-1),m={},d=(0,n(3671).A)(m,[["render",function(e,t){const n=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[r,(0,o.Lk)("p",null,[(0,o.Lk)("strong",null,[(0,o.eW)("直到遇到了我的第一个机器人雇员 "),(0,o.Lk)("a",a,[(0,o.eW)("Huginn"),(0,o.bF)(n)])])]),l,p,(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.Lk)("a",i,[(0,o.eW)("网易热门新闻"),(0,o.bF)(n)]),(0,o.eW)(":抓取网易顶贴最多的 100 条新闻")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",c,[(0,o.eW)("百度实时热点"),(0,o.bF)(n)]),(0,o.eW)(":实时更新每天的百度热点")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",s,[(0,o.eW)("果壳网"),(0,o.bF)(n)]),(0,o.eW)(":果壳首页推荐,官方更新速度较慢,刚好可以了解些奇思妙想")]),u])])}]]),k=JSON.parse('{"path":"/posts/2018-01-31-hire_a_robot.html","title":"雇个机器人帮你干活","lang":"zh-CN","frontmatter":{"title":"雇个机器人帮你干活","date":"2018-01-31T22:51:00.000Z","category":["自动化"],"tag":["Huginn","rss"],"order":-10,"description":" 机器人会取代你工作! 计算云会取代你工作! AI 会取代你的工作! 我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。 作为懒人、宅男,等不及了怎么办? 既然还没被取代,那就雇个机器人帮你干活! 我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-01-31-hire_a_robot.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"雇个机器人帮你干活"}],["meta",{"property":"og:description","content":" 机器人会取代你工作! 计算云会取代你工作! AI 会取代你的工作! 我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。 作为懒人、宅男,等不及了怎么办? 既然还没被取代,那就雇个机器人帮你干活! 我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-24T17:51:16.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Huginn"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2018-01-31T22:51:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-24T17:51:16.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"雇个机器人帮你干活\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-01-31T22:51:00.000Z\\",\\"dateModified\\":\\"2022-07-24T17:51:16.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658685076000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.65,"words":494},"filePathRelative":"_posts/2018-01-31-hire_a_robot.md","localizedDate":"2018年1月31日","excerpt":"
    \\n

    机器人会取代你工作!\\n计算云会取代你工作!\\nAI 会取代你的工作!

    \\n
    \\n

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

    \\n

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

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-03-06-no_more_dinner.html.eadaa685.js b/assets/js/2018-03-06-no_more_dinner.html.eadaa685.js new file mode 100644 index 000000000..6801262f5 --- /dev/null +++ b/assets/js/2018-03-06-no_more_dinner.html.eadaa685.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3759],{3671:(t,e)=>{e.A=(t,e)=>{const r=t.__vccOpts||t;for(const[t,n]of e)r[t]=n;return r}},567:(t,e,r)=>{r.r(e),r.d(e,{comp:()=>p,data:()=>a});var n=r(7847);const d=[(0,n.Fv)("

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    解决方案:

    1. 增加运动:每天划船机 2 公里,后期再逐步加量

    2. 调节饮食,多喝水不吃炸鸡

      • 早餐:9 点,牛奶 + 麦片

      • 午餐:12 点,正常

      • 晚餐:4 点,晚餐后不再吃东西

    日期历史体重备注
    2012 年 9 月 2 日 23:04:5185KG今天吃了 3 个苹果,3 块钱煎饼。刚洗完澡
    2013 年 4 月 11 日 21:24:5486.4KG脱去外套
    2013 年 9 月 5 日 8 点81.8kg
    2013 年 10 月 3 日 9:55:0278.7KG
    2014 年 2 月 25 日春节83KG重新开始减重
    2014 年 10 月 19 日 16:50:1086.1KG
    2016 年 8 月 4 日88KG
    2018 年 3 月 6 日 晚91.6 KG
    2020 年 10 月 6 日95 KG巅峰,开始营养健康餐
    ",5)],o={},p=(0,r(3671).A)(o,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,d)}]]),a=JSON.parse('{"path":"/posts/2018-03-06-no_more_dinner.html","title":"提早晚餐,饿死算逑","lang":"zh-CN","frontmatter":{"title":"提早晚餐,饿死算逑","date":"2018-03-06T22:06:00.000Z","category":["健康"],"tag":["减肥"],"order":-11,"description":"上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤。 目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。 解决方案: 增加运动:每天划船机 2 公里,后期再逐步加量 调节饮食,多喝水不吃炸鸡 早餐...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-03-06-no_more_dinner.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"提早晚餐,饿死算逑"}],["meta",{"property":"og:description","content":"上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤。 目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。 解决方案: 增加运动:每天划船机 2 公里,后期再逐步加量 调节饮食,多喝水不吃炸鸡 早餐..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-25T04:29:03.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"减肥"}],["meta",{"property":"article:published_time","content":"2018-03-06T22:06:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-25T04:29:03.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"提早晚餐,饿死算逑\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-03-06T22:06:00.000Z\\",\\"dateModified\\":\\"2022-07-25T04:29:03.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658723343000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.02,"words":306},"filePathRelative":"_posts/2018-03-06-no_more_dinner.md","localizedDate":"2018年3月6日","excerpt":"

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    \\n

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    \\n

    解决方案:

    \\n
      \\n
    1. \\n

      增加运动:每天划船机 2 公里,后期再逐步加量

      \\n
    2. \\n
    3. \\n

      调节饮食,多喝水不吃炸鸡

      \\n
        \\n
      • \\n

        早餐:9 点,牛奶 + 麦片

        \\n
      • \\n
      • \\n

        午餐:12 点,正常

        \\n
      • \\n
      • \\n

        晚餐:4 点,晚餐后不再吃东西

        \\n
      • \\n
      \\n
    4. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-42cba8ce.8f68a6ed.js b/assets/js/2018-04-30-baota_deploy_vps.html.547b2f8f.js similarity index 76% rename from assets/js/v-42cba8ce.8f68a6ed.js rename to assets/js/2018-04-30-baota_deploy_vps.html.547b2f8f.js index a9b205fba..9c771e8bd 100644 --- a/assets/js/v-42cba8ce.8f68a6ed.js +++ b/assets/js/2018-04-30-baota_deploy_vps.html.547b2f8f.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8533],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},1016:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>d,data:()=>u});var n=a(3968);const o=(0,n.QD)("p",null,"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。",-1),p=(0,n.QD)("p",null,"国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。",-1),r=(0,n.QD)("blockquote",null,[(0,n.QD)("p",null,"一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP")],-1),l=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/20180430000000.jpg?imageMogr2/format/webp",alt:"宝塔面板界面图",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"宝塔面板界面图")],-1),i={href:"https://www.bt.cn/bbs/thread-1186-1-1.html",target:"_blank",rel:"noopener noreferrer"},m=(0,n.QD)("h2",{id:"宝塔安装-lnmp-或-lamp-环境",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#宝塔安装-lnmp-或-lamp-环境"},[(0,n.QD)("span",null,"宝塔安装 LNMP 或 LAMP 环境")])],-1),c=(0,n.QD)("p",null,[(0,n.QD)("strong",null,"LNMP"),(0,n.mY)(" 和 "),(0,n.QD)("strong",null,"LAMP"),(0,n.mY)(" 都是成熟的建站环境,根据自身需求选择其中之一即可。如果有特殊的定制需求,可以在左侧的「软件管理」中选择需要安装的环境。")],-1),g=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/20180430000001.jpg?imageMogr2/format/webp",alt:"软件安装界面",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"软件安装界面")],-1),s={},d=(0,a(9720).c)(s,[["render",function(t,e){const a=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[o,p,r,l,(0,n.QD)("p",null,[(0,n.mY)("宝塔安装说明:"),(0,n.QD)("a",i,[(0,n.mY)("https://www.bt.cn/bbs/thread-1186-1-1.html"),(0,n.K2)(a)])]),m,c,g])}]]),u=JSON.parse('{"path":"/posts/2018-04-30-baota_deploy_vps.html","title":"新手建站神器 - 宝塔面板","lang":"zh-CN","frontmatter":{"title":"新手建站神器 - 宝塔面板","date":"2018-04-30T00:00:00.000Z","category":["服务器"],"tag":["宝塔面板","建站"],"order":-12,"description":"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。 国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。 一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP 宝塔面板界面图宝塔面板界面图 宝塔安装说明:https://ww...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-04-30-baota_deploy_vps.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"新手建站神器 - 宝塔面板"}],["meta",{"property":"og:description","content":"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。 国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。 一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP 宝塔面板界面图宝塔面板界面图 宝塔安装说明:https://ww..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180430000000.jpg?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"新手建站神器 - 宝塔面板"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"宝塔面板"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-04-30T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"新手建站神器 - 宝塔面板\\",\\"image\\":[\\"https://img.newzone.top/20180430000000.jpg?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180430000001.jpg?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-04-30T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"宝塔安装 LNMP 或 LAMP 环境","slug":"宝塔安装-lnmp-或-lamp-环境","link":"#宝塔安装-lnmp-或-lamp-环境","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.78,"words":234},"filePathRelative":"_posts/2018-04-30-baota_deploy_vps.md","localizedDate":"2018年4月30日","excerpt":"

    新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。

    \\n

    国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。

    \\n
    \\n

    一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP

    \\n
    \\n
    \\"宝塔面板界面图\\"
    宝塔面板界面图
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7722],{3671:(t,e)=>{e.A=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},4328:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>d,data:()=>u});var n=a(7847);const o=(0,n.Lk)("p",null,"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。",-1),p=(0,n.Lk)("p",null,"国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。",-1),r=(0,n.Lk)("blockquote",null,[(0,n.Lk)("p",null,"一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP")],-1),l=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/20180430000000.jpg?imageMogr2/format/webp",alt:"宝塔面板界面图",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"宝塔面板界面图")],-1),i={href:"https://www.bt.cn/bbs/thread-1186-1-1.html",target:"_blank",rel:"noopener noreferrer"},m=(0,n.Lk)("h2",{id:"宝塔安装-lnmp-或-lamp-环境",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#宝塔安装-lnmp-或-lamp-环境"},[(0,n.Lk)("span",null,"宝塔安装 LNMP 或 LAMP 环境")])],-1),c=(0,n.Lk)("p",null,[(0,n.Lk)("strong",null,"LNMP"),(0,n.eW)(" 和 "),(0,n.Lk)("strong",null,"LAMP"),(0,n.eW)(" 都是成熟的建站环境,根据自身需求选择其中之一即可。如果有特殊的定制需求,可以在左侧的「软件管理」中选择需要安装的环境。")],-1),g=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/20180430000001.jpg?imageMogr2/format/webp",alt:"软件安装界面",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"软件安装界面")],-1),s={},d=(0,a(3671).A)(s,[["render",function(t,e){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[o,p,r,l,(0,n.Lk)("p",null,[(0,n.eW)("宝塔安装说明:"),(0,n.Lk)("a",i,[(0,n.eW)("https://www.bt.cn/bbs/thread-1186-1-1.html"),(0,n.bF)(a)])]),m,c,g])}]]),u=JSON.parse('{"path":"/posts/2018-04-30-baota_deploy_vps.html","title":"新手建站神器 - 宝塔面板","lang":"zh-CN","frontmatter":{"title":"新手建站神器 - 宝塔面板","date":"2018-04-30T00:00:00.000Z","category":["服务器"],"tag":["宝塔面板","建站"],"order":-12,"description":"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。 国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。 一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP 宝塔面板界面图宝塔面板界面图 宝塔安装说明:https://ww...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-04-30-baota_deploy_vps.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"新手建站神器 - 宝塔面板"}],["meta",{"property":"og:description","content":"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。 国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。 一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP 宝塔面板界面图宝塔面板界面图 宝塔安装说明:https://ww..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180430000000.jpg?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"新手建站神器 - 宝塔面板"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"宝塔面板"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-04-30T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"新手建站神器 - 宝塔面板\\",\\"image\\":[\\"https://img.newzone.top/20180430000000.jpg?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180430000001.jpg?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-04-30T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"宝塔安装 LNMP 或 LAMP 环境","slug":"宝塔安装-lnmp-或-lamp-环境","link":"#宝塔安装-lnmp-或-lamp-环境","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.78,"words":234},"filePathRelative":"_posts/2018-04-30-baota_deploy_vps.md","localizedDate":"2018年4月30日","excerpt":"

    新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。

    \\n

    国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。

    \\n
    \\n

    一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP

    \\n
    \\n
    \\"宝塔面板界面图\\"
    宝塔面板界面图
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-05-01-jekyll_blog_on_github_pages.html.eb1491cf.js b/assets/js/2018-05-01-jekyll_blog_on_github_pages.html.eb1491cf.js new file mode 100644 index 000000000..430b6097a --- /dev/null +++ b/assets/js/2018-05-01-jekyll_blog_on_github_pages.html.eb1491cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[201],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,i]of t)o[e]=i;return o}},4411:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>h,data:()=>s});var i=o(7847);const n=(0,i.Lk)("p",null,"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。",-1),a=(0,i.Lk)("p",null,"偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。",-1),r=(0,i.Lk)("h3",{id:"搭建流程",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#搭建流程"},[(0,i.Lk)("span",null,"搭建流程")])],-1),l={href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"http://jekyllthemes.org/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},c=(0,i.Fv)('
  • 点击 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),m={},h=(0,o(3671).A)(m,[["render",function(e,t){const o=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[n,a,r,(0,i.Lk)("ol",null,[(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("注册并登录 "),(0,i.Lk)("a",l,[(0,i.eW)("Github"),(0,i.bF)(o)]),(0,i.eW)("。")])]),(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("选择一个喜欢的 "),(0,i.Lk)("a",g,[(0,i.eW)("Jekyll 模板"),(0,i.bF)(o)]),(0,i.eW)(", 进入对应的 Github 主页。我选了黄玄的 "),(0,i.Lk)("a",p,[(0,i.eW)("Hux Blog"),(0,i.bF)(o)]),(0,i.eW)("。")])]),c])])}]]),s=JSON.parse('{"path":"/posts/2018-05-01-jekyll_blog_on_github_pages.html","title":"Jekyll 篇一:3 分钟搭建 Github Pages 博客","lang":"zh-CN","frontmatter":{"title":"Jekyll 篇一:3 分钟搭建 Github Pages 博客","date":"2018-05-01T00:00:00.000Z","category":["博客"],"tag":["Jekyll","Github","建站"],"order":-13,"description":"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。 偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。 搭建流程 注册并登录 Github。 选择一个喜欢的 J...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-01-jekyll_blog_on_github_pages.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 篇一:3 分钟搭建 Github Pages 博客"}],["meta",{"property":"og:description","content":"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。 偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。 搭建流程 注册并登录 Github。 选择一个喜欢的 J..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180505201522.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Jekyll 篇一:3 分钟搭建 Github Pages 博客"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"Github"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-05-01T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 篇一:3 分钟搭建 Github Pages 博客\\",\\"image\\":[\\"https://img.newzone.top/20180505201522.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180505202201.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-08-08-11-42-16.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180505202859.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-01T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":3,"title":"搭建流程","slug":"搭建流程","link":"#搭建流程","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":0.89,"words":268},"filePathRelative":"_posts/2018-05-01-jekyll_blog_on_github_pages.md","localizedDate":"2018年5月1日","excerpt":"

    一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。

    \\n

    偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。

    \\n

    搭建流程

    \\n
      \\n
    1. \\n

      注册并登录 Github

      \\n
    2. \\n
    3. \\n

      选择一个喜欢的 Jekyll 模板, 进入对应的 Github 主页。我选了黄玄的 Hux Blog

      \\n
    4. \\n
    5. \\n

      点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    9. \\n

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

      \\n
      \\"\\"
      \\n
    10. \\n
    11. \\n

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

      \\n
      \\"\\"
      \\n
    12. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a636a840.b6949704.js b/assets/js/2018-05-02-jekyll_blog_on_vps.html.39942719.js similarity index 87% rename from assets/js/v-a636a840.b6949704.js rename to assets/js/2018-05-02-jekyll_blog_on_vps.html.39942719.js index 2442a1143..07dcbadb7 100644 --- a/assets/js/v-a636a840.b6949704.js +++ b/assets/js/2018-05-02-jekyll_blog_on_vps.html.39942719.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6596],{9720:(e,l)=>{l.c=(e,l)=>{const t=e.__vccOpts||e;for(const[e,o]of l)t[e]=o;return t}},1400:(e,l,t)=>{t.r(l),t.d(l,{comp:()=>p,data:()=>c});var o=t(3968);const r=(0,o.QD)("p",null,"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。",-1),n={href:"https://www.jekyll.com.cn/docs/quickstart/",target:"_blank",rel:"noopener noreferrer"},a=(0,o.IL)("
    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),i={},p=(0,t(9720).c)(i,[["render",function(e,l){const t=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[r,(0,o.QD)("p",null,[(0,o.mY)("Jekyll 环境官方"),(0,o.QD)("a",n,[(0,o.mY)("安装指南"),(0,o.K2)(t)]),(0,o.mY)(":")]),a])}]]),c=JSON.parse('{"path":"/posts/2018-05-02-jekyll_blog_on_vps.html","title":"Jekyll 扩展篇:服务器搭建 Jekyll 博客","lang":"zh-CN","frontmatter":{"title":"Jekyll 扩展篇:服务器搭建 Jekyll 博客","date":"2018-05-02T00:00:00.000Z","category":["博客"],"tag":["Jekyll","建站"],"order":-14,"description":"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。 Jekyll 环境官方安装指南: 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了) 安装 jekyll:gem install jekyll。 进入 jekyll 网站,执行...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-02-jekyll_blog_on_vps.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 扩展篇:服务器搭建 Jekyll 博客"}],["meta",{"property":"og:description","content":"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。 Jekyll 环境官方安装指南: 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了) 安装 jekyll:gem install jekyll。 进入 jekyll 网站,执行..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-05-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 扩展篇:服务器搭建 Jekyll 博客\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-05-02T00:00:00.000Z\\",\\"dateModified\\":\\"2023-01-23T14:11:29.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.65,"words":196},"filePathRelative":"_posts/2018-05-02-jekyll_blog_on_vps.md","localizedDate":"2018年5月2日","excerpt":"

    Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。

    \\n

    Jekyll 环境官方安装指南

    \\n
      \\n
    1. \\n

      使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

      \\n
    2. \\n
    3. \\n

      安装 jekyll:gem install jekyll

      \\n
    4. \\n
    5. \\n

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

      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2213],{3671:(e,l)=>{l.A=(e,l)=>{const t=e.__vccOpts||e;for(const[e,o]of l)t[e]=o;return t}},6764:(e,l,t)=>{t.r(l),t.d(l,{comp:()=>p,data:()=>c});var o=t(7847);const r=(0,o.Lk)("p",null,"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。",-1),n={href:"https://www.jekyll.com.cn/docs/quickstart/",target:"_blank",rel:"noopener noreferrer"},a=(0,o.Fv)("
    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),i={},p=(0,t(3671).A)(i,[["render",function(e,l){const t=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[r,(0,o.Lk)("p",null,[(0,o.eW)("Jekyll 环境官方"),(0,o.Lk)("a",n,[(0,o.eW)("安装指南"),(0,o.bF)(t)]),(0,o.eW)(":")]),a])}]]),c=JSON.parse('{"path":"/posts/2018-05-02-jekyll_blog_on_vps.html","title":"Jekyll 扩展篇:服务器搭建 Jekyll 博客","lang":"zh-CN","frontmatter":{"title":"Jekyll 扩展篇:服务器搭建 Jekyll 博客","date":"2018-05-02T00:00:00.000Z","category":["博客"],"tag":["Jekyll","建站"],"order":-14,"description":"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。 Jekyll 环境官方安装指南: 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了) 安装 jekyll:gem install jekyll。 进入 jekyll 网站,执行...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-02-jekyll_blog_on_vps.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 扩展篇:服务器搭建 Jekyll 博客"}],["meta",{"property":"og:description","content":"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。 Jekyll 环境官方安装指南: 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了) 安装 jekyll:gem install jekyll。 进入 jekyll 网站,执行..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-05-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 扩展篇:服务器搭建 Jekyll 博客\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-05-02T00:00:00.000Z\\",\\"dateModified\\":\\"2023-01-23T14:11:29.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.65,"words":196},"filePathRelative":"_posts/2018-05-02-jekyll_blog_on_vps.md","localizedDate":"2018年5月2日","excerpt":"

    Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。

    \\n

    Jekyll 环境官方安装指南

    \\n
      \\n
    1. \\n

      使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

      \\n
    2. \\n
    3. \\n

      安装 jekyll:gem install jekyll

      \\n
    4. \\n
    5. \\n

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

      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-635f6dc4.6568f5ee.js b/assets/js/2018-05-03-jekyll_blog_autodeploy.html.d9214630.js similarity index 92% rename from assets/js/v-635f6dc4.6568f5ee.js rename to assets/js/2018-05-03-jekyll_blog_autodeploy.html.d9214630.js index a96ace102..71d63fd2c 100644 --- a/assets/js/v-635f6dc4.6568f5ee.js +++ b/assets/js/2018-05-03-jekyll_blog_autodeploy.html.d9214630.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7392],{9720:(n,s)=>{s.c=(n,s)=>{const e=n.__vccOpts||n;for(const[n,a]of s)e[n]=a;return e}},3912:(n,s,e)=>{e.r(s),e.d(s,{comp:()=>Q,data:()=>x});var a=e(3968);const t=(0,a.IL)('

    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:\n  - git clone https://github.com/rockbenben/rockbenben.github.io.git\n  - cd rockbenben.github.io && rm -rf * && cp -r ../_site/* .\n  - git config user.name "rockbenben"\n  - git config user.email "qingwhat@gmail.com"\n  - git add --all .\n  - git commit -m "Travis CI Auto Builder"\n  - git push --force https://$DEPLOY_TOKEN@github.com/rockbenben/blog.git master\n

    $DEPLOY_TOKEN 是从 Github 授权得到的,「setting」>「Developer settings」>「Personal access tokens」>「Generate new token」, 然后给于相应权限即可,admin:public_key, admin:repo_hook, repo

    进入 Travis 的 repo 项目,「More options」>「Settings」>「Environment Variables」, 新建一个变量DEPLOY_TOKEN,把 Github 的授权 token 保存在里面。

    ',17),i={href:"https://docs.travis-ci.com/user/encrypting-files/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.IL)('

    Dockerfiles 设置

    在 Github 中新建一个 repository,可以命名为 dockerfiles, 专门用来存储 Docker 镜像的设置文件。在 dockerfiles 新建文件夹 jekyll ,并在 jekyll 中新建文件 Dockerfile, 放入以下代码:

    FROM nginx:1.13.9-alpine\n\nLABEL maintainer="Benson <qingwhat@gmail.com>"\n\nARG TZ='Asia/Shanghai'\n\nENV TZ ${TZ}\n\nRUN apk upgrade --update \\\n    && apk add bash git \\\n    && rm -rf /usr/share/nginx/html \\\n    && git clone https://github.com/rockbenben/blog.git /usr/share/nginx/html \\\n    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \\\n    && echo ${TZ} > /etc/timezone \\\n    && rm -rf /var/cache/apk/*\n\n# ADD entrypoint.sh /entrypoint.sh #容易报错\n# ADD flush /usr/local/bin/flush #容易报错\n\nWORKDIR /usr/share/nginx/html\n\n# CMD ["/entrypoint.sh"] #容易报错\n

    将 Travis CI 生成的静态文件推送到 Github,博客的 docker 化部署,采用 nginx + 静态文件 方式

    ',4),o={href:"https://github.com/mritd/dockerfile/tree/master/mritd",target:"_blank",rel:"noopener noreferrer"},r=(0,a.QD)("h2",{id:"docker-镜像设置",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#docker-镜像设置"},[(0,a.QD)("span",null,"Docker 镜像设置")])],-1),p={href:"https://hub.docker.com",target:"_blank",rel:"noopener noreferrer"},c=(0,a.QD)("code",null,"dockerfiles",-1),d=(0,a.IL)('

    建立 Automated Build 镜像后,进入 Build Seeting, 点击 Trigger,建立第一个 Docker 镜像。

    然后在「Building Settings」>「Build Triggers」>「Activate Triggers」,复制 Trigger URL。

    然后在服务器上执行下列代码,拉取并启动 Docker 镜像

    docker pull rockben/jekyll\ndocker stop jekyll_blog\ndocker rm jekyll_blog\ndocker run --name=jekyll_blog -d -p 39100:80 --privileged=true rockben/jekyll:latest\n

    --name=jekyll_blog 中的 jekyll_blog 是对容器的命名,方便后续操作。

    -d 让容器在后台运行。

    -p 映射端口:80 是容器内对应的端口,39100 是主机端口,也就是最终用户访问的端口,本端口可以自由选择。

    --privileged=true 关闭安全权限,否则你容器操作文件夹没有权限。

    --rockben/jekyll:latest 是容器名称,可省略 :latest

    运行容器后,访问 seoipo.com:39100 就可以看到镜像网页。如果每次用端口访问,可以在域名 DNS 中设置显性 URL,将二级域名 blog.seoipo.com 指向 seoipo.com:39100

    Docker 扩展阅读

    Docker 命令符

    docker ps // 查看所有正在运行容器\ndocker stop containerId // containerId 是容器的 ID\n\ndocker ps -a // 查看所有容器\ndocker ps -a -q // 查看所有容器 ID\n\ndocker stop $(docker ps -a -q) //  stop 停止所有容器\ndocker rm $(docker ps -a -q) //   remove 删除所有容器\n

    docker run 进阶设置

    docker run --name=jekyll_blog -d -p 39100:80 -v /www/wwwroot/jekyll:/jekyll --privileged=true rockben/jekyll:latest /bin/bash\n

    -v 挂载目录/root/software 本地目录 /software 容器目录,在创建前容器是没有 software 目录的,docker 容器会自己创建 --/bin/bash 这是 CMD 命令行,可不填

    SSH 免密码登录

    Travis 不能利用用户名和密码登陆,我们只有利用SSH 免密登陆服务器,更新并重启 Docker 容器。

    1、生成公钥/私钥对

    cd ~/.ssh  # 切换 .ssh 目录,目录的第一个字符如果是 `.` 表示改文件夹是隐藏文件夹\nmkdir ~/.ssh  #如果 .ssh 文件夹不存在,可以执行指令自行创建。如果 .ssh 文件已经存在,该命令会指出 .ssh 目录:/root/.ssh\nssh-keygen -t rsa     # 生成 RSA 密钥对,后面所有的直接以默认就行,passphase 一定要为空\n

    2、将生成的公钥添加为受信列表

    cd ~/.ssh  # 切换.ssh 目录\ncat id_rsa.pub >> authorized_keys #将公钥内容输出到 authorized_keys 中\n

    3、在.ssh 目录下新增配置文件 config

    cd ~/.ssh  # 切换 .ssh 目录\nvim config  #新建并打开目录\n

    点击 i 进入编辑状态,输入下列代码。完毕后,点击 Esc 退出编辑状况,然后输入 :wq! 强制保存后离开文件

    Host test\nHostName 99.99.99.99(你的服务器 ip)\n#登陆的用户名\nUser travis\nIdentitiesOnly yes\n#登陆使用的密钥\nIdentityFile ~/.ssh/id_rsa\n

    4、在 Linux 服务器安装 Travis 客户端(rvm -> ruby -> gem ->Travis)

    gem install travis

    5、服务器创建空白.travis.yml文件

    mkdir /home/travis #新建 travis 文件夹\ntouch /home/travis/.travis.yml #在 travis 文件夹里创建空白 .travis.yml 文件\n

    6、服务器登录 Travis,添加加密的私钥至代码仓库

    cd /home/travis  #进入 .travis.yml 所在文件夹\ntravis login     #用 GitHub 账户登陆 travis\n\n#登陆成功后解密私钥,--add 参数会把加密的私钥解密命令插入到.travis.yml,Travis 解密时要用到的\n#-r 之后是 Github 源文件目录\ntravis encrypt-file ~/.ssh/id_rsa --add -r rockbenben/rockbenben.github.io\n\n#保存加密后的私钥 id_rsa.enc,上传到 Github 源文件 repository 中\n\n#.travis.yml 中也自动添加了解密命令\ncat /home/travis/.travis.yml  #打开服务器的 .travis.yml 文件并保存\nbefore_install:\n- openssl aes-256-cbc -K $encrypted_****_key -iv $encrypted_****_iv\n  -in id_rsa.enc -out ~/.ssh/id_rsa -d\n

    成功加密后,会提示

    Make sure to add id_rsa.enc to the git repository.\nMake sure not to add ~/.ssh/id_rsa to the git repository.\nCommit all changes to your .travis.yml.\n
    • 将新生成的 id_rsa.enc 文件上传到 Github 源文件 repository 中

    • .travis.yml 中的 openssl aes-256-cbc -K $encrypted_5c280379e96c_key -iv $encrypted_5c280379e96c_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d 放入最终的 .travis.yml 文件中。

    travis.yml 配置

    当项目内存在 .travis.yml 文件时,Travis CI 会按照其定义完成自动 build 过程,所以开启了上述配置以后还要在 Github 的 Jekyll 源文件项目下创建 .travis.yml 配置文件。

    .travis.yml 配置文件内容样例如下:

    language: ruby\nrvm:\n- 2.3.3\n\nbefore_script:\n- openssl aes-256-cbc -K $encrypted_5c280379e96c_key -iv $encrypted_5c280379e96c_iv\n  -in id_rsa.enc -out ~/.ssh/id_rsa -d      #本句是服务器上的 Travis 自动生成的,但默认生成的命令可能会在/前面带转义符\\,我们不需要这些转义符,手动删掉所有的转义符,否则可能在后面引发莫名的错误。\n- chmod 600 ~/.ssh/id_rsa\n- echo -e "Host 106.15.190.249\\n\\tStrictHostKeyChecking no\\n" >> ~/.ssh/config #106.15.190.249 是服务器 IP,修改成你自己的就行\n\n# Assume bundler is being used, therefore\n# the `install` step will run `bundle install` by default.\ninstall:\n- gem install jekyll\n- gem install jekyll-paginate\n\nscript: jekyll build #&& htmlproofer ./_site #指定目录容易报错\n\nafter_success:\n  - git clone https://github.com/rockbenben/rockbenben.github.io.git\n  - cd rockbenben.github.io && rm -rf * && cp -r ../_site/* .\n  - git config user.name "rockbenben"\n  - git config user.email "qingwhat@gmail.com"\n  - git add --all .\n  - git commit -m "Travis CI Auto Builder"\n  - git push --force https://$DEPLOY_TOKEN@github.com/rockbenben/blog.git master\n  # Trigger all tags/branchs for this automated build.\n  - curl -X POST https://registry.hub.docker.com/u/rockben/jekyll/trigger/9b1e9527-0cf1-4756-8332-50f8dff37747/ #本句的链接是 hub.docker.com 自动生成,进入 docker 项目后,Building Settings - Build Triggers - Activate Triggers ,复制 Trigger URL\n  - sleep 5m #超过 10 分钟,tavis 将失去响应。此处是在等待 docker 镜像更新\n  - ssh root@106.15.190.249 -p 27378 -o StrictHostKeyChecking=no "docker pull rockben/jekyll && docker stop jekyll_blog && docker rm jekyll_blog && docker run --name=jekyll_blog -d -p 39100:80 --privileged=true rockben/jekyll:latest"  #ssh 连接后,重启 docker 容器,jekyll_blog 为之前设定的容器名。\n  # -p 27378 是我自设的服务器端口,默认是 22\n  # - ssh root@106.15.190.249 -p 27378 -o StrictHostKeyChecking=no "/www/wwwroot/jekyll_build.sh" #执行 jekyll 重建脚本\n  #- ssh root@106.15.190.249 -o StrictHostKeyChecking=no 'cd ~/blog-front && git pull && npm install && npm run build'   #使用 ssh 连接服务器,git pull?\n\n# branch whitelist, only for Github Pages\nbranchs:\n  only:\n  - master  #指定只有检测到 master 分支有变动时才执行任务\n\nenv:\n  global:\n  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer\n\naddons:\n  ssh_known_hosts:\n  - 106.15.190.249 #受信主机,你的 Linux 服务器 ip\n\nsudo: false # route your build to the container-based infrastructure for a faster build\n
    ',42),m={href:"https://docs.travis-ci.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,a.QD)("p",null,"参考资料&引用:",-1),v={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},b={href:"https://zhuanlan.zhihu.com/p/25066056",target:"_blank",rel:"noopener noreferrer"},k={href:"https://mritd.me/2017/02/25/jekyll-blog-+-travis-ci-auto-deploy/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://juejin.im/post/5a9e1a5751882555712bd8e1",target:"_blank",rel:"noopener noreferrer"},h={href:"https://segmentfault.com/a/1190000011218410",target:"_blank",rel:"noopener noreferrer"},f={href:"https://juejin.im/post/5a2941ad6fb9a045030ffc95",target:"_blank",rel:"noopener noreferrer"},y={href:"http://www.cnblogs.com/scofi/p/6617394.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://blog.csdn.net/yinweitao12/article/details/73165914",target:"_blank",rel:"noopener noreferrer"},D={href:"http://www.cnblogs.com/YasinXiao/p/7736075.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://yeasy.gitbooks.io/docker_practice/",target:"_blank",rel:"noopener noreferrer"},T={},Q=(0,e(9720).c)(T,[["render",function(n,s){const e=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[t,(0,a.QD)("p",null,[(0,a.mY)("Travis CI 提供了存放加密文件的方式,参考 "),(0,a.QD)("a",i,[(0,a.mY)("官方文档"),(0,a.K2)(e)]),(0,a.mY)("。")]),l,(0,a.QD)("p",null,[(0,a.mY)("样例 Dockerfile: "),(0,a.QD)("a",o,[(0,a.mY)("https://github.com/mritd/dockerfile/tree/master/mritd"),(0,a.K2)(e)])]),r,(0,a.QD)("p",null,[(0,a.mY)("注册并登录 "),(0,a.QD)("a",p,[(0,a.mY)("Docker Hub"),(0,a.K2)(e)]),(0,a.mY)(",点击 「Create」>「Create Automated Build」>「Create Auto-build Github」, 选择之前新建的 "),c,(0,a.mY)(" repository。")]),d,(0,a.QD)("p",null,[(0,a.mY)("具体 .travis.yml 配置,请参考 "),(0,a.QD)("a",m,[(0,a.mY)("官方文档"),(0,a.K2)(e)]),(0,a.mY)("。")]),u,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",v,[(0,a.mY)("Jekyll 模板 hux blog"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",b,[(0,a.mY)("一点都不高大上,手把手教你使用 Travis CI 实现持续部署"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",k,[(0,a.mY)("Jekyll + Travis CI 自动化部署博客"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",g,[(0,a.mY)("Travis-CI 自动化测试并部署至自己的 CentOS 服务器"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",h,[(0,a.mY)("Travis CI 系列:自动化部署博客"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",f,[(0,a.mY)("SSH 免密登录远程服务器"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",y,[(0,a.mY)("SSH 公钥登录原理"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",_,[(0,a.mY)("如何将 dockerhub 与 github 关联"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",D,[(0,a.mY)("docker 启动,端口映射,挂载本地目录"),(0,a.K2)(e)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",w,[(0,a.mY)("Docker — 从入门到实践"),(0,a.K2)(e)])])])])])}]]),x=JSON.parse('{"path":"/posts/2018-05-03-jekyll_blog_autodeploy.html","title":"Jekyll 篇二:自动部署服务器博客","lang":"zh-CN","frontmatter":{"title":"Jekyll 篇二:自动部署服务器博客","date":"2018-05-03T00:00:00.000Z","category":["博客"],"tag":["Jekyll","Travis CI","Docker"],"order":-15,"description":"Github 上搭建 Jekyll 是最方便的,空间免费、流量免费、部署简单。但 Github 属于被墙状态,将博客部署在那,速度实在太慢。在玩了几天后,我开始在服务器上直接搭建 Jekyll 博客。 服务器搭建需要人工执行 jekyll build, 完全背离了最开始搭建博客的初衷-方便。之后结合了网络上多个自动化方案,选定入门成本最低的 Githu...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-03-jekyll_blog_autodeploy.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 篇二:自动部署服务器博客"}],["meta",{"property":"og:description","content":"Github 上搭建 Jekyll 是最方便的,空间免费、流量免费、部署简单。但 Github 属于被墙状态,将博客部署在那,速度实在太慢。在玩了几天后,我开始在服务器上直接搭建 Jekyll 博客。 服务器搭建需要人工执行 jekyll build, 完全背离了最开始搭建博客的初衷-方便。之后结合了网络上多个自动化方案,选定入门成本最低的 Githu..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180504135244.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Jekyll 篇二:自动部署服务器博客"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"Travis CI"}],["meta",{"property":"article:tag","content":"Docker"}],["meta",{"property":"article:published_time","content":"2018-05-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 篇二:自动部署服务器博客\\",\\"image\\":[\\"https://img.newzone.top/20180504135244.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504135541.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504153729.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504154229.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504161016.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504161245.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504184508.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504141827.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-03T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"搭建思路","slug":"搭建思路","link":"#搭建思路","children":[]},{"level":2,"title":"Travis CI 基本配置","slug":"travis-ci-基本配置","link":"#travis-ci-基本配置","children":[]},{"level":2,"title":"静态文件更新","slug":"静态文件更新","link":"#静态文件更新","children":[]},{"level":2,"title":"Dockerfiles 设置","slug":"dockerfiles-设置","link":"#dockerfiles-设置","children":[]},{"level":2,"title":"Docker 镜像设置","slug":"docker-镜像设置","link":"#docker-镜像设置","children":[{"level":3,"title":"Docker 扩展阅读","slug":"docker-扩展阅读","link":"#docker-扩展阅读","children":[]}]},{"level":2,"title":"SSH 免密码登录","slug":"ssh-免密码登录","link":"#ssh-免密码登录","children":[]},{"level":2,"title":"travis.yml 配置","slug":"travis-yml-配置","link":"#travis-yml-配置","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":7.68,"words":2303},"filePathRelative":"_posts/2018-05-03-jekyll_blog_autodeploy.md","localizedDate":"2018年5月3日","excerpt":"

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8365],{3671:(n,e)=>{e.A=(n,e)=>{const s=n.__vccOpts||n;for(const[n,a]of e)s[n]=a;return s}},9402:(n,e,s)=>{s.r(e),s.d(e,{comp:()=>x,data:()=>j});var a=s(7847);const t=(0,a.Fv)('

    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:\n  - git clone https://github.com/rockbenben/rockbenben.github.io.git\n  - cd rockbenben.github.io && rm -rf * && cp -r ../_site/* .\n  - git config user.name "rockbenben"\n  - git config user.email "qingwhat@gmail.com"\n  - git add --all .\n  - git commit -m "Travis CI Auto Builder"\n  - git push --force https://$DEPLOY_TOKEN@github.com/rockbenben/blog.git master\n

    $DEPLOY_TOKEN 是从 Github 授权得到的,「setting」>「Developer settings」>「Personal access tokens」>「Generate new token」, 然后给于相应权限即可,admin:public_key, admin:repo_hook, repo

    进入 Travis 的 repo 项目,「More options」>「Settings」>「Environment Variables」, 新建一个变量DEPLOY_TOKEN,把 Github 的授权 token 保存在里面。

    ',17),i={href:"https://docs.travis-ci.com/user/encrypting-files/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.Fv)('

    Dockerfiles 设置

    在 Github 中新建一个 repository,可以命名为 dockerfiles, 专门用来存储 Docker 镜像的设置文件。在 dockerfiles 新建文件夹 jekyll ,并在 jekyll 中新建文件 Dockerfile, 放入以下代码:

    FROM nginx:1.13.9-alpine\n\nLABEL maintainer="Benson <qingwhat@gmail.com>"\n\nARG TZ='Asia/Shanghai'\n\nENV TZ ${TZ}\n\nRUN apk upgrade --update \\\n    && apk add bash git \\\n    && rm -rf /usr/share/nginx/html \\\n    && git clone https://github.com/rockbenben/blog.git /usr/share/nginx/html \\\n    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \\\n    && echo ${TZ} > /etc/timezone \\\n    && rm -rf /var/cache/apk/*\n\n# ADD entrypoint.sh /entrypoint.sh #容易报错\n# ADD flush /usr/local/bin/flush #容易报错\n\nWORKDIR /usr/share/nginx/html\n\n# CMD ["/entrypoint.sh"] #容易报错\n

    将 Travis CI 生成的静态文件推送到 Github,博客的 docker 化部署,采用 nginx + 静态文件 方式

    ',4),o={href:"https://github.com/mritd/dockerfile/tree/master/mritd",target:"_blank",rel:"noopener noreferrer"},r=(0,a.Lk)("h2",{id:"docker-镜像设置",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#docker-镜像设置"},[(0,a.Lk)("span",null,"Docker 镜像设置")])],-1),p={href:"https://hub.docker.com",target:"_blank",rel:"noopener noreferrer"},c=(0,a.Lk)("code",null,"dockerfiles",-1),d=(0,a.Fv)('

    建立 Automated Build 镜像后,进入 Build Seeting, 点击 Trigger,建立第一个 Docker 镜像。

    然后在「Building Settings」>「Build Triggers」>「Activate Triggers」,复制 Trigger URL。

    然后在服务器上执行下列代码,拉取并启动 Docker 镜像

    docker pull rockben/jekyll\ndocker stop jekyll_blog\ndocker rm jekyll_blog\ndocker run --name=jekyll_blog -d -p 39100:80 --privileged=true rockben/jekyll:latest\n

    --name=jekyll_blog 中的 jekyll_blog 是对容器的命名,方便后续操作。

    -d 让容器在后台运行。

    -p 映射端口:80 是容器内对应的端口,39100 是主机端口,也就是最终用户访问的端口,本端口可以自由选择。

    --privileged=true 关闭安全权限,否则你容器操作文件夹没有权限。

    --rockben/jekyll:latest 是容器名称,可省略 :latest

    运行容器后,访问 seoipo.com:39100 就可以看到镜像网页。如果每次用端口访问,可以在域名 DNS 中设置显性 URL,将二级域名 blog.seoipo.com 指向 seoipo.com:39100

    Docker 扩展阅读

    Docker 命令符

    docker ps // 查看所有正在运行容器\ndocker stop containerId // containerId 是容器的 ID\n\ndocker ps -a // 查看所有容器\ndocker ps -a -q // 查看所有容器 ID\n\ndocker stop $(docker ps -a -q) //  stop 停止所有容器\ndocker rm $(docker ps -a -q) //   remove 删除所有容器\n

    docker run 进阶设置

    docker run --name=jekyll_blog -d -p 39100:80 -v /www/wwwroot/jekyll:/jekyll --privileged=true rockben/jekyll:latest /bin/bash\n

    -v 挂载目录/root/software 本地目录 /software 容器目录,在创建前容器是没有 software 目录的,docker 容器会自己创建 --/bin/bash 这是 CMD 命令行,可不填

    SSH 免密码登录

    Travis 不能利用用户名和密码登陆,我们只有利用SSH 免密登陆服务器,更新并重启 Docker 容器。

    1、生成公钥/私钥对

    cd ~/.ssh  # 切换 .ssh 目录,目录的第一个字符如果是 `.` 表示改文件夹是隐藏文件夹\nmkdir ~/.ssh  #如果 .ssh 文件夹不存在,可以执行指令自行创建。如果 .ssh 文件已经存在,该命令会指出 .ssh 目录:/root/.ssh\nssh-keygen -t rsa     # 生成 RSA 密钥对,后面所有的直接以默认就行,passphase 一定要为空\n

    2、将生成的公钥添加为受信列表

    cd ~/.ssh  # 切换.ssh 目录\ncat id_rsa.pub >> authorized_keys #将公钥内容输出到 authorized_keys 中\n

    3、在.ssh 目录下新增配置文件 config

    cd ~/.ssh  # 切换 .ssh 目录\nvim config  #新建并打开目录\n

    点击 i 进入编辑状态,输入下列代码。完毕后,点击 Esc 退出编辑状况,然后输入 :wq! 强制保存后离开文件

    Host test\nHostName 99.99.99.99(你的服务器 ip)\n#登陆的用户名\nUser travis\nIdentitiesOnly yes\n#登陆使用的密钥\nIdentityFile ~/.ssh/id_rsa\n

    4、在 Linux 服务器安装 Travis 客户端(rvm -> ruby -> gem ->Travis)

    gem install travis

    5、服务器创建空白.travis.yml文件

    mkdir /home/travis #新建 travis 文件夹\ntouch /home/travis/.travis.yml #在 travis 文件夹里创建空白 .travis.yml 文件\n

    6、服务器登录 Travis,添加加密的私钥至代码仓库

    cd /home/travis  #进入 .travis.yml 所在文件夹\ntravis login     #用 GitHub 账户登陆 travis\n\n#登陆成功后解密私钥,--add 参数会把加密的私钥解密命令插入到.travis.yml,Travis 解密时要用到的\n#-r 之后是 Github 源文件目录\ntravis encrypt-file ~/.ssh/id_rsa --add -r rockbenben/rockbenben.github.io\n\n#保存加密后的私钥 id_rsa.enc,上传到 Github 源文件 repository 中\n\n#.travis.yml 中也自动添加了解密命令\ncat /home/travis/.travis.yml  #打开服务器的 .travis.yml 文件并保存\nbefore_install:\n- openssl aes-256-cbc -K $encrypted_****_key -iv $encrypted_****_iv\n  -in id_rsa.enc -out ~/.ssh/id_rsa -d\n

    成功加密后,会提示

    Make sure to add id_rsa.enc to the git repository.\nMake sure not to add ~/.ssh/id_rsa to the git repository.\nCommit all changes to your .travis.yml.\n
    • 将新生成的 id_rsa.enc 文件上传到 Github 源文件 repository 中

    • .travis.yml 中的 openssl aes-256-cbc -K $encrypted_5c280379e96c_key -iv $encrypted_5c280379e96c_iv -in id_rsa.enc -out ~/.ssh/id_rsa -d 放入最终的 .travis.yml 文件中。

    travis.yml 配置

    当项目内存在 .travis.yml 文件时,Travis CI 会按照其定义完成自动 build 过程,所以开启了上述配置以后还要在 Github 的 Jekyll 源文件项目下创建 .travis.yml 配置文件。

    .travis.yml 配置文件内容样例如下:

    language: ruby\nrvm:\n- 2.3.3\n\nbefore_script:\n- openssl aes-256-cbc -K $encrypted_5c280379e96c_key -iv $encrypted_5c280379e96c_iv\n  -in id_rsa.enc -out ~/.ssh/id_rsa -d      #本句是服务器上的 Travis 自动生成的,但默认生成的命令可能会在/前面带转义符\\,我们不需要这些转义符,手动删掉所有的转义符,否则可能在后面引发莫名的错误。\n- chmod 600 ~/.ssh/id_rsa\n- echo -e "Host 106.15.190.249\\n\\tStrictHostKeyChecking no\\n" >> ~/.ssh/config #106.15.190.249 是服务器 IP,修改成你自己的就行\n\n# Assume bundler is being used, therefore\n# the `install` step will run `bundle install` by default.\ninstall:\n- gem install jekyll\n- gem install jekyll-paginate\n\nscript: jekyll build #&& htmlproofer ./_site #指定目录容易报错\n\nafter_success:\n  - git clone https://github.com/rockbenben/rockbenben.github.io.git\n  - cd rockbenben.github.io && rm -rf * && cp -r ../_site/* .\n  - git config user.name "rockbenben"\n  - git config user.email "qingwhat@gmail.com"\n  - git add --all .\n  - git commit -m "Travis CI Auto Builder"\n  - git push --force https://$DEPLOY_TOKEN@github.com/rockbenben/blog.git master\n  # Trigger all tags/branchs for this automated build.\n  - curl -X POST https://registry.hub.docker.com/u/rockben/jekyll/trigger/9b1e9527-0cf1-4756-8332-50f8dff37747/ #本句的链接是 hub.docker.com 自动生成,进入 docker 项目后,Building Settings - Build Triggers - Activate Triggers ,复制 Trigger URL\n  - sleep 5m #超过 10 分钟,tavis 将失去响应。此处是在等待 docker 镜像更新\n  - ssh root@106.15.190.249 -p 27378 -o StrictHostKeyChecking=no "docker pull rockben/jekyll && docker stop jekyll_blog && docker rm jekyll_blog && docker run --name=jekyll_blog -d -p 39100:80 --privileged=true rockben/jekyll:latest"  #ssh 连接后,重启 docker 容器,jekyll_blog 为之前设定的容器名。\n  # -p 27378 是我自设的服务器端口,默认是 22\n  # - ssh root@106.15.190.249 -p 27378 -o StrictHostKeyChecking=no "/www/wwwroot/jekyll_build.sh" #执行 jekyll 重建脚本\n  #- ssh root@106.15.190.249 -o StrictHostKeyChecking=no 'cd ~/blog-front && git pull && npm install && npm run build'   #使用 ssh 连接服务器,git pull?\n\n# branch whitelist, only for Github Pages\nbranchs:\n  only:\n  - master  #指定只有检测到 master 分支有变动时才执行任务\n\nenv:\n  global:\n  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer\n\naddons:\n  ssh_known_hosts:\n  - 106.15.190.249 #受信主机,你的 Linux 服务器 ip\n\nsudo: false # route your build to the container-based infrastructure for a faster build\n
    ',42),m={href:"https://docs.travis-ci.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,a.Lk)("p",null,"参考资料&引用:",-1),b={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},v={href:"https://zhuanlan.zhihu.com/p/25066056",target:"_blank",rel:"noopener noreferrer"},k={href:"https://mritd.me/2017/02/25/jekyll-blog-+-travis-ci-auto-deploy/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://juejin.im/post/5a9e1a5751882555712bd8e1",target:"_blank",rel:"noopener noreferrer"},h={href:"https://segmentfault.com/a/1190000011218410",target:"_blank",rel:"noopener noreferrer"},f={href:"https://juejin.im/post/5a2941ad6fb9a045030ffc95",target:"_blank",rel:"noopener noreferrer"},y={href:"http://www.cnblogs.com/scofi/p/6617394.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://blog.csdn.net/yinweitao12/article/details/73165914",target:"_blank",rel:"noopener noreferrer"},w={href:"http://www.cnblogs.com/YasinXiao/p/7736075.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://yeasy.gitbooks.io/docker_practice/",target:"_blank",rel:"noopener noreferrer"},T={},x=(0,s(3671).A)(T,[["render",function(n,e){const s=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[t,(0,a.Lk)("p",null,[(0,a.eW)("Travis CI 提供了存放加密文件的方式,参考 "),(0,a.Lk)("a",i,[(0,a.eW)("官方文档"),(0,a.bF)(s)]),(0,a.eW)("。")]),l,(0,a.Lk)("p",null,[(0,a.eW)("样例 Dockerfile: "),(0,a.Lk)("a",o,[(0,a.eW)("https://github.com/mritd/dockerfile/tree/master/mritd"),(0,a.bF)(s)])]),r,(0,a.Lk)("p",null,[(0,a.eW)("注册并登录 "),(0,a.Lk)("a",p,[(0,a.eW)("Docker Hub"),(0,a.bF)(s)]),(0,a.eW)(",点击 「Create」>「Create Automated Build」>「Create Auto-build Github」, 选择之前新建的 "),c,(0,a.eW)(" repository。")]),d,(0,a.Lk)("p",null,[(0,a.eW)("具体 .travis.yml 配置,请参考 "),(0,a.Lk)("a",m,[(0,a.eW)("官方文档"),(0,a.bF)(s)]),(0,a.eW)("。")]),u,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",b,[(0,a.eW)("Jekyll 模板 hux blog"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",v,[(0,a.eW)("一点都不高大上,手把手教你使用 Travis CI 实现持续部署"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",k,[(0,a.eW)("Jekyll + Travis CI 自动化部署博客"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",g,[(0,a.eW)("Travis-CI 自动化测试并部署至自己的 CentOS 服务器"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",h,[(0,a.eW)("Travis CI 系列:自动化部署博客"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",f,[(0,a.eW)("SSH 免密登录远程服务器"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",y,[(0,a.eW)("SSH 公钥登录原理"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",_,[(0,a.eW)("如何将 dockerhub 与 github 关联"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",w,[(0,a.eW)("docker 启动,端口映射,挂载本地目录"),(0,a.bF)(s)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",L,[(0,a.eW)("Docker — 从入门到实践"),(0,a.bF)(s)])])])])])}]]),j=JSON.parse('{"path":"/posts/2018-05-03-jekyll_blog_autodeploy.html","title":"Jekyll 篇二:自动部署服务器博客","lang":"zh-CN","frontmatter":{"title":"Jekyll 篇二:自动部署服务器博客","date":"2018-05-03T00:00:00.000Z","category":["博客"],"tag":["Jekyll","Travis CI","Docker"],"order":-15,"description":"Github 上搭建 Jekyll 是最方便的,空间免费、流量免费、部署简单。但 Github 属于被墙状态,将博客部署在那,速度实在太慢。在玩了几天后,我开始在服务器上直接搭建 Jekyll 博客。 服务器搭建需要人工执行 jekyll build, 完全背离了最开始搭建博客的初衷-方便。之后结合了网络上多个自动化方案,选定入门成本最低的 Githu...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-03-jekyll_blog_autodeploy.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 篇二:自动部署服务器博客"}],["meta",{"property":"og:description","content":"Github 上搭建 Jekyll 是最方便的,空间免费、流量免费、部署简单。但 Github 属于被墙状态,将博客部署在那,速度实在太慢。在玩了几天后,我开始在服务器上直接搭建 Jekyll 博客。 服务器搭建需要人工执行 jekyll build, 完全背离了最开始搭建博客的初衷-方便。之后结合了网络上多个自动化方案,选定入门成本最低的 Githu..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180504135244.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Jekyll 篇二:自动部署服务器博客"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"Travis CI"}],["meta",{"property":"article:tag","content":"Docker"}],["meta",{"property":"article:published_time","content":"2018-05-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 篇二:自动部署服务器博客\\",\\"image\\":[\\"https://img.newzone.top/20180504135244.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504135541.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504153729.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504154229.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504161016.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504161245.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504184508.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504141827.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-03T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"搭建思路","slug":"搭建思路","link":"#搭建思路","children":[]},{"level":2,"title":"Travis CI 基本配置","slug":"travis-ci-基本配置","link":"#travis-ci-基本配置","children":[]},{"level":2,"title":"静态文件更新","slug":"静态文件更新","link":"#静态文件更新","children":[]},{"level":2,"title":"Dockerfiles 设置","slug":"dockerfiles-设置","link":"#dockerfiles-设置","children":[]},{"level":2,"title":"Docker 镜像设置","slug":"docker-镜像设置","link":"#docker-镜像设置","children":[{"level":3,"title":"Docker 扩展阅读","slug":"docker-扩展阅读","link":"#docker-扩展阅读","children":[]}]},{"level":2,"title":"SSH 免密码登录","slug":"ssh-免密码登录","link":"#ssh-免密码登录","children":[]},{"level":2,"title":"travis.yml 配置","slug":"travis-yml-配置","link":"#travis-yml-配置","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":7.68,"words":2303},"filePathRelative":"_posts/2018-05-03-jekyll_blog_autodeploy.md","localizedDate":"2018年5月3日","excerpt":"

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0be839fe.dc2c07bc.js b/assets/js/2018-05-04-audition_cut_mp3.html.f7fb941c.js similarity index 95% rename from assets/js/v-0be839fe.dc2c07bc.js rename to assets/js/2018-05-04-audition_cut_mp3.html.f7fb941c.js index bd16a5a77..57eddc08a 100644 --- a/assets/js/v-0be839fe.dc2c07bc.js +++ b/assets/js/2018-05-04-audition_cut_mp3.html.f7fb941c.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[176],{9720:(t,e)=>{e.c=(t,e)=>{const i=t.__vccOpts||t;for(const[t,n]of e)i[t]=n;return i}},1373:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>p,data:()=>r});var n=i(3968);const o=[(0,n.IL)('

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

    简易剪切流程

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

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

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

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

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

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

    ',4)],a={},p=(0,i(9720).c)(a,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,o)}]]),r=JSON.parse('{"path":"/posts/2018-05-04-audition_cut_mp3.html","title":"怎么用 Adobe Audition 快速剪切音频?","lang":"zh-CN","frontmatter":{"title":"怎么用 Adobe Audition 快速剪切音频?","date":"2018-05-04T00:00:00.000Z","category":["工具"],"tag":["Audition","音频"],"order":-16,"description":"很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。 简易剪切流程 在 Audition 中打开音频文件。 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。 点击右键,选择删除。刚才选择的音频就被删除了。 在混音器中点击,用鼠标滚轮放大音频的可选间距,重...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-04-audition_cut_mp3.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"怎么用 Adobe Audition 快速剪切音频?"}],["meta",{"property":"og:description","content":"很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。 简易剪切流程 在 Audition 中打开音频文件。 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。 点击右键,选择删除。刚才选择的音频就被删除了。 在混音器中点击,用鼠标滚轮放大音频的可选间距,重..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180504152233.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"怎么用 Adobe Audition 快速剪切音频?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Audition"}],["meta",{"property":"article:tag","content":"音频"}],["meta",{"property":"article:published_time","content":"2018-05-04T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"怎么用 Adobe Audition 快速剪切音频?\\",\\"image\\":[\\"https://img.newzone.top/20180504152233.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504151226.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504151306.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504151816.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-04T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"简易剪切流程","slug":"简易剪切流程","link":"#简易剪切流程","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":0.85,"words":256},"filePathRelative":"_posts/2018-05-04-audition_cut_mp3.md","localizedDate":"2018年5月4日","excerpt":"

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

    \\n

    简易剪切流程

    \\n
      \\n
    1. \\n

      在 Audition 中打开音频文件。

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    9. \\n

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

      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1984],{3671:(t,e)=>{e.A=(t,e)=>{const i=t.__vccOpts||t;for(const[t,n]of e)i[t]=n;return i}},808:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>p,data:()=>r});var n=i(7847);const o=[(0,n.Fv)('

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

    简易剪切流程

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

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

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

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

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

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

    ',4)],a={},p=(0,i(3671).A)(a,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,o)}]]),r=JSON.parse('{"path":"/posts/2018-05-04-audition_cut_mp3.html","title":"怎么用 Adobe Audition 快速剪切音频?","lang":"zh-CN","frontmatter":{"title":"怎么用 Adobe Audition 快速剪切音频?","date":"2018-05-04T00:00:00.000Z","category":["工具"],"tag":["Audition","音频"],"order":-16,"description":"很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。 简易剪切流程 在 Audition 中打开音频文件。 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。 点击右键,选择删除。刚才选择的音频就被删除了。 在混音器中点击,用鼠标滚轮放大音频的可选间距,重...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-04-audition_cut_mp3.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"怎么用 Adobe Audition 快速剪切音频?"}],["meta",{"property":"og:description","content":"很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。 简易剪切流程 在 Audition 中打开音频文件。 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。 点击右键,选择删除。刚才选择的音频就被删除了。 在混音器中点击,用鼠标滚轮放大音频的可选间距,重..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180504152233.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"怎么用 Adobe Audition 快速剪切音频?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Audition"}],["meta",{"property":"article:tag","content":"音频"}],["meta",{"property":"article:published_time","content":"2018-05-04T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"怎么用 Adobe Audition 快速剪切音频?\\",\\"image\\":[\\"https://img.newzone.top/20180504152233.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504151226.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504151306.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180504151816.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-04T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"简易剪切流程","slug":"简易剪切流程","link":"#简易剪切流程","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":0.85,"words":256},"filePathRelative":"_posts/2018-05-04-audition_cut_mp3.md","localizedDate":"2018年5月4日","excerpt":"

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

    \\n

    简易剪切流程

    \\n
      \\n
    1. \\n

      在 Audition 中打开音频文件。

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    9. \\n

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

      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-05-15-aria2_a_new_download_tool.html.a96f6483.js b/assets/js/2018-05-15-aria2_a_new_download_tool.html.a96f6483.js new file mode 100644 index 000000000..01aac6f64 --- /dev/null +++ b/assets/js/2018-05-15-aria2_a_new_download_tool.html.a96f6483.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2707],{3671:(e,a)=>{a.A=(e,a)=>{const r=e.__vccOpts||e;for(const[e,n]of a)r[e]=n;return r}},7899:(e,a,r)=>{r.r(a),r.d(a,{comp:()=>ue,data:()=>he});var n=r(7847);const t=(0,n.Fv)('

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

    但是,迅雷已经堕落

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

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

    为什么选择 Aria2?

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

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

    真·懒人包

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

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

    修改默认下载目录:

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

    修改服务器默认连接数:

    # 同一服务器连接数,添加时可指定,默认:1\nmax-connection-per-server=16\n

    修改监听端口 6800:

    # RPC 监听端口,端口被占用时可以修改,默认:6800\n# 端口修改后,需要重新启动 aria2c.exe,并确保页面设置中的 RPC 地址已更改为新端口。\nrpc-listen-port=6800\n

    开启 BT 下列设置:

    enable-dht=true\nbt-enable-lpd=true\nenable-peer-exchange=true\n
    ',8),x={href:"https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt",target:"_blank",rel:"noopener noreferrer"},y=(0,n.Lk)("code",null,",",-1),T=(0,n.Fv)('
    # bt-tracker 更新,解决 Aria2 BT 下载速度慢没速度的问题\nbt-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\n

    其他设置不常用,有时间的话,你可以慢慢调整。

    ',2),F=(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("Aira2 没有原生应用界面,可以输入网址 "),(0,n.Lk)("code",null,"http://aria2c.com"),(0,n.eW)(" 使用第三方下载界面。该页面会自动与本地的 aira2c 程序关联,实现下载管理,建议把其收藏到书签,以便日后使用。"),(0,n.Lk)("sup",{class:"footnote-ref"},[(0,n.Lk)("a",{href:"#footnote2"},"[2]"),(0,n.Lk)("a",{class:"footnote-anchor",id:"footnote-ref2"})])])],-1),z=(0,n.Lk)("code",null,"http://localhost:6800/jsonrpc",-1),N=(0,n.Lk)("strong",null,"链接须为 http 而非 https",-1),D={href:"https://www.seoipo.com/software/Aria2/",target:"_blank",rel:"noopener noreferrer"},B=(0,n.Lk)("h2",{id:"aria2-进阶",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#aria2-进阶"},[(0,n.Lk)("span",null,"Aria2 进阶")])],-1),C=(0,n.Lk)("h3",{id:"更换-aria2-界面",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#更换-aria2-界面"},[(0,n.Lk)("span",null,"更换 Aria2 界面")])],-1),P={href:"https://github.com/mayswind/AriaNg",target:"_blank",rel:"noopener noreferrer"},R=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/20180516104758.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"AriaNg 界面")],-1),I={href:"https://github.com/mayswind/AriaNg/releases",target:"_blank",rel:"noopener noreferrer"},O=(0,n.Lk)("code",null,"cannot get language resources, and will display in default language",-1),q={href:"https://github.com/mayswind/AriaNg/releases",target:"_blank",rel:"noopener noreferrer"},H=(0,n.Lk)("code",null,"cannot get language resources, and will display in default language",-1),U=(0,n.Fv)('

    如果 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 接管浏览器的下载管理,需安装插件/扩展。

    ',7),j={href:"https://chrome.google.com/webstore/detail/nimeojfecmndgolmlmjghjmbpdkhhogl",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://wwi.lanzoui.com/i4Fmeetsdaj",target:"_blank",rel:"noopener noreferrer"},S=(0,n.Lk)("code",null,".crx",-1),G=(0,n.Lk)("code",null,"chrome://extensions/",-1),J={href:"https://addons.mozilla.org/en-US/firefox/addon/aria2-integration/",target:"_blank",rel:"noopener noreferrer"},M=(0,n.Fv)('

    安装完「添加到 aria2」扩展后,右键扩展图标,点击「选项」>「设置」,设置如下:

    • 最小监视:10 M,低于该容量将由浏览器下载。如果 Aria2 要接手所有下载,可以将最小监视设为 0.001
    • JSON-RPC 链接:http://localhost:6800/jsonrpc

    注意:「添加到 aria2」图标显示的 en 表示处于开启状态,dis 表示处于关闭状态,点击图标可以切换使用状态。

    Aria2 启动器

    每次启动 Aria2 下载时,都需要执行两个文件:打开 WebUI 链接和 aria2c,这有点麻烦。因此,我使用 AutoHotkey 做了一个启动器,它可以检测 aria2c 运行状态,并一键打开下载界面,以简化 Aria 的启动过程。

    ',5),E={href:"https://wwz.lanzouf.com/iqud50ebl06d",target:"_blank",rel:"noopener noreferrer"},X=(0,n.Lk)("code",null,"D:\\Aria2",-1),K=(0,n.Lk)("strong",null,"AriaNg 启动器",-1),Q={href:"https://github.com/mayswind/AriaNg-DailyBuild/archive/master.zip",target:"_blank",rel:"noopener noreferrer"},V=(0,n.Lk)("code",null,"Aria2\\AriaNg\\index.html",-1),Y=(0,n.Lk)("li",null,[(0,n.Lk)("strong",null,"Aria2c 启动器"),(0,n.eW)(":将 "),(0,n.Lk)("code",null,"https://aria2c.com"),(0,n.eW)(" 作为默认下载界面。该设置较旧,需确保 JSON-RPC Path 为 "),(0,n.Lk)("code",null,"http://localhost:6800/jsonrpc"),(0,n.eW)("。")],-1),$=(0,n.Lk)("hr",{class:"footnotes-sep"},null,-1),ee={class:"footnotes"},ae={class:"footnotes-list"},re={id:"footnote1",class:"footnote-item"},ne={href:"https://zhuanlan.zhihu.com/p/30666881",target:"_blank",rel:"noopener noreferrer"},te=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),oe={id:"footnote2",class:"footnote-item"},le={href:"https://www.appinn.com/aria2-in-windows-setup/",target:"_blank",rel:"noopener noreferrer"},ie=(0,n.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ce={id:"footnote3",class:"footnote-item"},se={href:"http://www.senra.me/solutions-to-aria2-bt-metalink-download-slowly/",target:"_blank",rel:"noopener noreferrer"},pe=(0,n.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),de={},ue=(0,r(3671).A)(de,[["render",function(e,a){const r=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[t,(0,n.Lk)("p",null,[(0,n.eW)("真·懒人包:"),(0,n.Lk)("a",o,[(0,n.eW)("https://www.seoipo.com/software/Aria2/"),(0,n.bF)(r)])]),l,i,c,s,p,d,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("下载 "),(0,n.Lk)("a",u,[(0,n.eW)("Aria2 快速设置包"),(0,n.bF)(r)]),(0,n.eW)("或"),(0,n.Lk)("a",h,[(0,n.eW)("备用链接"),(0,n.bF)(r)]),(0,n.eW)(",将其解压到存放文件夹,例如 "),k,(0,n.eW)("。")])]),(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("官网下载 "),(0,n.Lk)("a",g,[(0,n.eW)("Aria2 程序"),(0,n.bF)(r)]),(0,n.eW)("(Windows 选择 "),(0,n.Lk)("a",f,[(0,n.eW)("aria2-1.37.0-win-64bit-build1.zip"),(0,n.bF)(r)]),(0,n.eW)("),然后解压到快速设置包的存放文件夹中,替代其中的 "),m,(0,n.eW)(" 程序。")]),b]),L,(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("参照"),(0,n.Lk)("a",A,[(0,n.eW)("懒人包配置"),(0,n.bF)(r)]),(0,n.eW)("修改 "),W,(0,n.eW)(",更多设置参考 "),(0,n.Lk)("a",v,[(0,n.eW)("aria2c 官方文档"),(0,n.bF)(r)]),(0,n.eW)("。"),w]),_,(0,n.Lk)("p",null,[(0,n.eW)("在文档最后一行添加 BT trackers,最新 trackers 列表从 "),(0,n.Lk)("a",x,[(0,n.eW)("ngosang/trackerslist"),(0,n.bF)(r)]),(0,n.eW)(" 中获取,tracker 中用 "),y,(0,n.eW)(" 隔开。")]),T]),F]),(0,n.Lk)("p",null,[(0,n.eW)("如果出现「Aria2 RPC 服务器错误」,请检查 JSON-RPC Path 是否为 "),z,(0,n.eW)("。注意,页面"),N,(0,n.eW)("。如果依然报错,则说明 aria2.conf 配置有误,建议下载 "),(0,n.Lk)("a",D,[(0,n.eW)("真·懒人包"),(0,n.bF)(r)]),(0,n.eW)("。")]),B,C,(0,n.Lk)("p",null,[(0,n.Lk)("a",P,[(0,n.eW)("AriaNg"),(0,n.bF)(r)]),(0,n.eW)(" 提供了类似传统下载软件的界面,简便易用。")]),R,(0,n.Lk)("p",null,[(0,n.eW)("使用方法:下载并解压 "),(0,n.Lk)("a",I,[(0,n.eW)("AriaNg"),(0,n.bF)(r)]),(0,n.eW)(" AllInOne,运行目录下的 index.html,打开 Aria2 WebUI 界面,将页面链接收藏到书签以便后续使用 Aria2。注意,本地运行要用 AllInOne 版本,否则会出现 "),O,(0,n.eW)("。")]),(0,n.Lk)("p",null,[(0,n.eW)("操作步骤如下:首先,下载并解压 "),(0,n.Lk)("a",q,[(0,n.eW)("AriaNg"),(0,n.bF)(r)]),(0,n.eW)(" AllInOne 版本。然后,运行目录中的 index.html 文件,以打开 Aria2 WebUI 界面。为方便后续使用,建议将页面链接添加至书签。需注意,本地运行需使用 AllInOne 版本,否则可能会出现 "),H,(0,n.eW)(" 的错误提示。")]),U,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.eW)("Chrome:安装"),(0,n.Lk)("a",j,[(0,n.eW)("添加到 aria2"),(0,n.bF)(r)]),(0,n.eW)(" 扩展。下载包可以用"),(0,n.Lk)("a",Z,[(0,n.eW)("国内搬运地址"),(0,n.bF)(r)]),(0,n.eW)(",或是懒人包内置文件。 如果浏览器无法直接安装 "),S,(0,n.eW)(" 格式的扩展,可以将文件解压到新文件夹「xxx」,然后在浏览器的地址栏输入 "),G,(0,n.eW)(" 开启开发者模式,点击加载已解压的扩展程序,选中刚才解压的文件夹「xxx」。")]),(0,n.Lk)("li",null,[(0,n.eW)("Firefox:安装 "),(0,n.Lk)("a",J,[(0,n.eW)("Aria2 Download Manager Integration"),(0,n.bF)(r)]),(0,n.eW)(" 扩展,可参考下方的 Chrome 扩展设置进行配置。")])]),M,(0,n.Lk)("p",null,[(0,n.eW)("下载 "),(0,n.Lk)("a",E,[(0,n.eW)("Aria2 启动器"),(0,n.bF)(r)]),(0,n.eW)(",然后将其解压到 Aria2 运行目录,例如 "),X,(0,n.eW)("。Aria2 启动器提供了两种方式,只需选择其中一种即可。")]),(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[K,(0,n.eW)("(推荐):使用 AriaNg 本地版作为下载管理界面。在使用该启动器前,需将 "),(0,n.Lk)("a",Q,[(0,n.eW)("AriaNg"),(0,n.bF)(r)]),(0,n.eW)(" 解压到 Aria2 目录下,并将文件夹名改为 AriaNg,然后打开文件 index.html,该文件位于 "),V,(0,n.eW)("。")]),Y]),$,(0,n.Lk)("section",ee,[(0,n.Lk)("ol",ae,[(0,n.Lk)("li",re,[(0,n.Lk)("p",null,[(0,n.Lk)("a",ne,[(0,n.eW)("Aria2 基础上手指南"),(0,n.bF)(r)]),(0,n.eW)(),te])]),(0,n.Lk)("li",oe,[(0,n.Lk)("p",null,[(0,n.Lk)("a",le,[(0,n.eW)("aria2 懒人安装教程"),(0,n.bF)(r)]),(0,n.eW)(),ie])]),(0,n.Lk)("li",ce,[(0,n.Lk)("p",null,[(0,n.Lk)("a",se,[(0,n.eW)("解决 Aria2 BT 下载速度慢没速度的问题"),(0,n.bF)(r)]),(0,n.eW)(),pe])])])])])}]]),he=JSON.parse('{"path":"/posts/2018-05-15-aria2_a_new_download_tool.html","title":"抛弃迅雷,Aria2 新手入门","lang":"zh-CN","frontmatter":{"title":"抛弃迅雷,Aria2 新手入门","date":"2018-05-15T00:00:00.000Z","category":["工具"],"tag":["Aria2","迅雷"],"star":true,"order":-17,"description":"迅雷已经用了 10 年,一直将它视为最快也最方便的下载工具,也一直购买迅雷会员。 但是,迅雷已经堕落。 thunder:\\\\\\\\ 迅雷专属链接越来越少,下载基本是磁力链接和 BT 种子; 迅雷会员加速不再有效,大量资源速度为 0(会员虽然还有一年多,但已经没用了); 迅雷关闭旧版功能,迫使大家升级迅雷 U 享版,但升级后,发现新版迅雷会强制接收所有下载。 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-15-aria2_a_new_download_tool.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃迅雷,Aria2 新手入门"}],["meta",{"property":"og:description","content":"迅雷已经用了 10 年,一直将它视为最快也最方便的下载工具,也一直购买迅雷会员。 但是,迅雷已经堕落。 thunder:\\\\\\\\ 迅雷专属链接越来越少,下载基本是磁力链接和 BT 种子; 迅雷会员加速不再有效,大量资源速度为 0(会员虽然还有一年多,但已经没用了); 迅雷关闭旧版功能,迫使大家升级迅雷 U 享版,但升级后,发现新版迅雷会强制接收所有下载。 ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20191210232831.png \\"GitHub 官方仓库下载 Aria2\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃迅雷,Aria2 新手入门"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Aria2"}],["meta",{"property":"article:tag","content":"迅雷"}],["meta",{"property":"article:published_time","content":"2018-05-15T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃迅雷,Aria2 新手入门\\",\\"image\\":[\\"https://img.newzone.top/20191210232831.png \\\\\\"GitHub 官方仓库下载 Aria2\\\\\\"\\",\\"https://img.newzone.top/20180516104758.png \\\\\\"AriaNg 界面\\\\\\"\\"],\\"datePublished\\":\\"2018-05-15T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么选择 Aria2?","slug":"为什么选择-aria2","link":"#为什么选择-aria2","children":[]},{"level":2,"title":"真·懒人包","slug":"真·懒人包","link":"#真·懒人包","children":[]},{"level":2,"title":"Aria2 设置","slug":"aria2-设置","link":"#aria2-设置","children":[]},{"level":2,"title":"Aria2 进阶","slug":"aria2-进阶","link":"#aria2-进阶","children":[{"level":3,"title":"更换 Aria2 界面","slug":"更换-aria2-界面","link":"#更换-aria2-界面","children":[]},{"level":3,"title":"Aira2 下载预热","slug":"aira2-下载预热","link":"#aira2-下载预热","children":[]},{"level":3,"title":"接管浏览器下载","slug":"接管浏览器下载","link":"#接管浏览器下载","children":[]}]},{"level":2,"title":"Aria2 启动器","slug":"aria2-启动器","link":"#aria2-启动器","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":30}]},"readingTime":{"minutes":7.06,"words":2117},"filePathRelative":"_posts/2018-05-15-aria2_a_new_download_tool.md","localizedDate":"2018年5月15日","excerpt":"

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

    \\n

    但是,迅雷已经堕落

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

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

      \\n
      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-05-24-airtable_noob.html.47e55f34.js b/assets/js/2018-05-24-airtable_noob.html.47e55f34.js new file mode 100644 index 000000000..03eaaa291 --- /dev/null +++ b/assets/js/2018-05-24-airtable_noob.html.47e55f34.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[960],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},6109:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>u,data:()=>z});var i=a(7847);const n=(0,i.Lk)("p",null,[(0,i.eW)("Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的"),(0,i.Lk)("strong",null,"私人定制资料库"),(0,i.eW)("。")],-1),r=(0,i.Lk)("p",null,"之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。",-1),o=(0,i.Lk)("p",null,"这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。",-1),p=(0,i.Lk)("h2",{id:"建立空白-airtable",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#建立空白-airtable"},[(0,i.Lk)("span",null,"建立空白 Airtable")])],-1),l={href:"https://airtable.com/",target:"_blank",rel:"noopener noreferrer"},g=(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。 "),(0,i.Lk)("img",{src:"https://img.newzone.top/20180524095238.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),m=(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("进入刚刚新建的表格,界面跟 Excel 蛮像的。 "),(0,i.Lk)("img",{src:"https://img.newzone.top/20180524095557.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),s=(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("在第一栏单击右键,唤出 field 栏目选项,可以更改 filed 栏目类型和名称。 "),(0,i.Lk)("img",{src:"https://img.newzone.top/20180524095935.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),b=(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("filed 栏目类型可以设为文本、链接、附件、单选多选等多种玩法,在使用中可以多试试。 "),(0,i.Lk)("img",{src:"https://img.newzone.top/20180524100437.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),f={href:"https://support.airtable.com/hc/en-us/articles/203229705",target:"_blank",rel:"noopener noreferrer"},c=(0,i.Fv)('

    应用 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),d={href:"http://www.playpcesor.com/2016/06/airtable.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://sspai.com/post/36402",target:"_blank",rel:"noopener noreferrer"},h={},u=(0,a(3671).A)(h,[["render",function(e,t){const a=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[n,r,o,p,(0,i.Lk)("ol",null,[(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("注册并登录 "),(0,i.Lk)("a",l,[(0,i.eW)("Airtable"),(0,i.bF)(a)]),(0,i.eW)("。")])]),g,m,s,b]),(0,i.Lk)("p",null,[(0,i.eW)("更多玩法,参考"),(0,i.Lk)("a",f,[(0,i.eW)("官方说明文档"),(0,i.bF)(a)]),(0,i.eW)("。")]),c,(0,i.Lk)("ul",null,[(0,i.Lk)("li",null,[(0,i.Lk)("a",d,[(0,i.eW)("Airtable 最強大線上表格製作,免費資料庫重整任何事"),(0,i.bF)(a)])]),(0,i.Lk)("li",null,[(0,i.Lk)("a",w,[(0,i.eW)("重新想像 Excel 该有的样子:Airtable 评测"),(0,i.bF)(a)])])])])}]]),z=JSON.parse('{"path":"/posts/2018-05-24-airtable_noob.html","title":"真· Airtable 3 分钟菜鸟入门","lang":"zh-CN","frontmatter":{"title":"真· Airtable 3 分钟菜鸟入门","date":"2018-05-24T00:00:00.000Z","category":["工具"],"tag":["Airtable"],"order":-18,"description":"Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库。 之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。 这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。 建立空白 Airtable 注册并登录 Airtabl...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-24-airtable_noob.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"真· Airtable 3 分钟菜鸟入门"}],["meta",{"property":"og:description","content":"Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库。 之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。 这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。 建立空白 Airtable 注册并登录 Airtabl..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180524095238.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"真· Airtable 3 分钟菜鸟入门"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Airtable"}],["meta",{"property":"article:published_time","content":"2018-05-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"真· Airtable 3 分钟菜鸟入门\\",\\"image\\":[\\"https://img.newzone.top/20180524095238.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524095557.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524095935.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524100437.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524102247.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524102641.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524102740.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524104251.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524105035.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524110129.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524112225.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524112534.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/20180524112659.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524111028.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524111455.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524111716.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524113003.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524113513.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524114139.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-24T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"建立空白 Airtable","slug":"建立空白-airtable","link":"#建立空白-airtable","children":[]},{"level":2,"title":"应用 Airtable","slug":"应用-airtable","link":"#应用-airtable","children":[]},{"level":2,"title":"Airtable 变形记","slug":"airtable-变形记","link":"#airtable-变形记","children":[{"level":3,"title":"Form view 表单视图","slug":"form-view-表单视图","link":"#form-view-表单视图","children":[]},{"level":3,"title":"Calendar view 日期视图","slug":"calendar-view-日期视图","link":"#calendar-view-日期视图","children":[]},{"level":3,"title":"Gallery view 卡片视图","slug":"gallery-view-卡片视图","link":"#gallery-view-卡片视图","children":[]},{"level":3,"title":"Kanban view 看板视图","slug":"kanban-view-看板视图","link":"#kanban-view-看板视图","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.31,"words":993},"filePathRelative":"_posts/2018-05-24-airtable_noob.md","localizedDate":"2018年5月24日","excerpt":"

    Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库

    \\n

    之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。

    \\n

    这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。

    \\n

    建立空白 Airtable

    \\n
      \\n
    1. \\n

      注册并登录 Airtable

      \\n
    2. \\n
    3. \\n

      点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。\\n\\"\\"

      \\n
    4. \\n
    5. \\n

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

      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    9. \\n

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

      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-06-08-baizhuo_gp1700.html.391936e7.js b/assets/js/2018-06-08-baizhuo_gp1700.html.391936e7.js new file mode 100644 index 000000000..7296c051c --- /dev/null +++ b/assets/js/2018-06-08-baizhuo_gp1700.html.391936e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[88],{3671:(t,e)=>{e.A=(t,e)=>{const i=t.__vccOpts||t;for(const[t,n]of e)i[t]=n;return i}},6835:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>p,data:()=>r});var n=i(7847);const a=[(0,n.Fv)('

    宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 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)],o={},p=(0,i(3671).A)(o,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,a)}]]),r=JSON.parse('{"path":"/posts/2018-06-08-baizhuo_gp1700.html","title":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射","lang":"zh-CN","frontmatter":{"title":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射","date":"2018-06-08T00:00:00.000Z","category":["网络"],"tag":["GP1700","光猫"],"order":-19,"description":"宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。 电信「网络管家」功能 重启光猫; 开启 UPnp; 开启 DMZ 主机,建立端口映射; 建立虚拟服务器,内网穿透访问。 开启光猫端口映射、内网穿透 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。 打开电信官方 AP...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-06-08-baizhuo_gp1700.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"}],["meta",{"property":"og:description","content":"宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。 电信「网络管家」功能 重启光猫; 开启 UPnp; 开启 DMZ 主机,建立端口映射; 建立虚拟服务器,内网穿透访问。 开启光猫端口映射、内网穿透 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。 打开电信官方 AP..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180608183159.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"GP1700"}],["meta",{"property":"article:tag","content":"光猫"}],["meta",{"property":"article:published_time","content":"2018-06-08T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射\\",\\"image\\":[\\"https://img.newzone.top/20180608183159.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180608185618.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190330175000.png?imageMogr2/auto-orient/strip%7CimageView2/2/h/600\\"],\\"datePublished\\":\\"2018-06-08T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"电信「网络管家」功能","slug":"电信「网络管家」功能","link":"#电信「网络管家」功能","children":[]},{"level":2,"title":"开启光猫端口映射、内网穿透","slug":"开启光猫端口映射、内网穿透","link":"#开启光猫端口映射、内网穿透","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":1.3,"words":391},"filePathRelative":"_posts/2018-06-08-baizhuo_gp1700.md","localizedDate":"2018年6月8日","excerpt":"

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

    \\n

    电信「网络管家」功能

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

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

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

      光猫内网穿透:当外网要访问局域网(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)。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-06-10-koolproxy_https.html.240cb93f.js b/assets/js/2018-06-10-koolproxy_https.html.240cb93f.js new file mode 100644 index 000000000..09720e12b --- /dev/null +++ b/assets/js/2018-06-10-koolproxy_https.html.240cb93f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3834],{3671:(t,o)=>{o.A=(t,o)=>{const e=t.__vccOpts||t;for(const[t,r]of o)e[t]=r;return e}},8918:(t,o,e)=>{e.r(o),e.d(o,{comp:()=>d,data:()=>u});var r=e(7847);const n=(0,r.Lk)("div",{class:"hint-container warning"},[(0,r.Lk)("p",{class:"hint-container-title"},"注意"),(0,r.Lk)("p",null,"KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。")],-1),p=(0,r.Lk)("p",null,"koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)",-1),l=(0,r.Lk)("p",null,"为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。",-1),a=(0,r.Lk)("p",null,"这是我们需要进入路由器后台,对证书地址进行操作。",-1),i=(0,r.Lk)("p",null,[(0,r.eW)("进入路由器后台,一般设置-Tools-Run Cmd ,运行命令 "),(0,r.Lk)("code",null,"iptables -t nat -I PREROUTING -d 110.110.110.110 -p tcp --dport 80 -j REDIRECT --to 3000"),(0,r.eW)("。重启后,该命令失效。")],-1),s=(0,r.Lk)("figure",null,[(0,r.Lk)("img",{src:"https://img.newzone.top/20180610143928.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.Lk)("figcaption")],-1),c={href:"http://koolshare.cn/thread-80430-1-1.html",target:"_blank",rel:"noopener noreferrer"},h=(0,r.Lk)("p",null,[(0,r.eW)("保存 Koolproxy 设置后,一定要"),(0,r.Lk)("strong",null,"重启路由"),(0,r.eW)(",否则可能部分屏蔽设置未成功生效。")],-1),m=(0,r.Lk)("p",null,[(0,r.Lk)("strong",null,"参考资料:")],-1),k={href:"https://github.com/koolproxy/merlin-koolproxy",target:"_blank",rel:"noopener noreferrer"},g={href:"http://koolshare.cn/thread-81712-1-1.html",target:"_blank",rel:"noopener noreferrer"},y={},d=(0,e(3671).A)(y,[["render",function(t,o){const e=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[n,p,l,a,i,s,(0,r.Lk)("p",null,[(0,r.eW)("运行命令后,就可以下载 https 证书,之后的设置参考 "),(0,r.Lk)("a",c,[(0,r.eW)("Merlin 版 Koolproxy3.1.x 使用教程"),(0,r.bF)(e)]),(0,r.eW)("。")]),h,m,(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,[(0,r.Lk)("a",k,[(0,r.eW)("koolproxy 项目地址"),(0,r.bF)(e)])]),(0,r.Lk)("li",null,[(0,r.Lk)("a",g,[(0,r.eW)("失效链接"),(0,r.bF)(e)])])])])}]]),u=JSON.parse('{"path":"/posts/2018-06-10-koolproxy_https.html","title":"koolproxy 无法下载 https 证书?","lang":"zh-CN","frontmatter":{"title":"koolproxy 无法下载 https 证书?","date":"2018-06-10T00:00:00.000Z","category":["网络"],"tag":["koolproxy"],"order":-20,"description":" 注意 KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。 koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。) 为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-06-10-koolproxy_https.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"koolproxy 无法下载 https 证书?"}],["meta",{"property":"og:description","content":" 注意 KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。 koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。) 为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180610143928.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"koolproxy 无法下载 https 证书?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"koolproxy"}],["meta",{"property":"article:published_time","content":"2018-06-10T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"koolproxy 无法下载 https 证书?\\",\\"image\\":[\\"https://img.newzone.top/20180610143928.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-06-10T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":0.98,"words":294},"filePathRelative":"_posts/2018-06-10-koolproxy_https.md","localizedDate":"2018年6月10日","excerpt":"
    \\n

    注意

    \\n

    KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。

    \\n
    \\n

    koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)

    \\n

    为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-03ef6dea.b941c581.js b/assets/js/2018-06-19-iptv_direckly.html.da62fedd.js similarity index 70% rename from assets/js/v-03ef6dea.b941c581.js rename to assets/js/2018-06-19-iptv_direckly.html.da62fedd.js index 2ebfd3f14..2f9cef79a 100644 --- a/assets/js/v-03ef6dea.b941c581.js +++ b/assets/js/2018-06-19-iptv_direckly.html.da62fedd.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4194],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},8368:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>y});var r=n(3968);const a=(0,r.QD)("p",null,"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。",-1),l={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},o=(0,r.QD)("strong",null,"仅限上海电信",-1),i=(0,r.QD)("strong",null,"慢 15 秒",-1),p={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list/issues/28",target:"_blank",rel:"noopener noreferrer"},s=(0,r.QD)("blockquote",null,[(0,r.QD)("p",null,"这个播放列表使用 IPTV 的频道 回放 功能。IPTV 直播用的是专网组播,无法直接通过 Internet 播放。 因为不是所有频道都支持回放,所以这个列表里的频道 必然少于 IPTV 的直播频道。 还有部分频道的回放地址播放错误,所以也没有收录。")],-1),m={href:"https://github.com/fanmingming/live",target:"_blank",rel:"noopener noreferrer"},g=(0,r.QD)("h2",{id:"提取直播源列表",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#提取直播源列表"},[(0,r.QD)("span",null,"提取直播源列表")])],-1),c={href:"https://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/IPTV.html",target:"_blank",rel:"noopener noreferrer"},h=(0,r.QD)("strong",null,"视频直播源列表",-1),u=(0,r.QD)("strong",null,"ANSI 编码",-1),f=(0,r.IL)('

    电视盒子直播

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

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

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

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

    PC 端电视直播

    ',4),P={href:"http://www.potplayer.org/",target:"_blank",rel:"noopener noreferrer"},d=(0,r.QD)("li",null,[(0,r.QD)("p",null,"复制节目 rtsp 直播源链接,打开 Potplayer , 右键单击主界面 >「打开」>「打开剪贴板」。"),(0,r.QD)("figure",null,[(0,r.QD)("img",{src:"https://img.newzone.top/20180619140722.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.QD)("figcaption")])],-1),T=(0,r.QD)("p",null,"这样就可以在 PC 端看电视了。",-1),I=(0,r.QD)("p",null,"参考资料:",-1),b={href:"http://koolshare.cn/thread-133246-1-1.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},D={href:"http://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/iptvplayseek.html",target:"_blank",rel:"noopener noreferrer"},Q={},w=(0,n(9720).c)(Q,[["render",function(e,t){const n=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[a,(0,r.QD)("p",null,[(0,r.mY)("如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的"),(0,r.QD)("a",l,[(0,r.mY)("上海电信 IPTV 视频回放源"),(0,r.K2)(n)]),(0,r.mY)("(原理上"),o,(0,r.mY)(")。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播"),i,(0,r.mY)(",对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:"),(0,r.QD)("a",p,[(0,r.mY)("电信公网疑似已屏蔽回放源 IP · Issue #28"),(0,r.K2)(n)])]),s,(0,r.QD)("p",null,[(0,r.mY)("如果你没有 IPTV,推荐使用 fanmingming 的 "),(0,r.QD)("a",m,[(0,r.mY)("live"),(0,r.K2)(n)]),(0,r.mY)(" 项目,这是一个国内可直连的直播源分享项目,直播源支持 IPv4/IPv6 双栈访问。")]),g,(0,r.QD)("p",null,[(0,r.mY)("进入"),(0,r.QD)("a",c,[(0,r.mY)("上海电信 IPTV 视频流地址"),(0,r.K2)(n)]),(0,r.mY)("。点击「生成 txt 内容」,然后复制下方的"),h,(0,r.mY)(",保存为 tv.txt,并将 tv.txt 文本转为 "),u,(0,r.mY)("(避免节目名会出现中文乱码)。")]),f,(0,r.QD)("ol",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("PC 端安排 "),(0,r.QD)("a",P,[(0,r.mY)("Potplayer"),(0,r.K2)(n)]),(0,r.mY)("。")])]),d]),T,I,(0,r.QD)("ul",null,[(0,r.QD)("li",null,[(0,r.QD)("a",b,[(0,r.mY)("丢了你的 iptv 吧!上海电信 IPTV 直播源"),(0,r.K2)(n)])]),(0,r.QD)("li",null,[(0,r.QD)("a",V,[(0,r.mY)("上海电信 IPTV 视频流项目主页"),(0,r.K2)(n)])]),(0,r.QD)("li",null,[(0,r.QD)("a",D,[(0,r.mY)("上海电信 IPTV 视频流地址"),(0,r.K2)(n)])])])])}]]),y=JSON.parse('{"path":"/posts/2018-06-19-iptv_direckly.html","title":"客厅、书房、卧室,任意收看 IPTV 直播!","lang":"zh-CN","frontmatter":{"title":"客厅、书房、卧室,任意收看 IPTV 直播!","date":"2018-06-19T00:00:00.000Z","category":["网络"],"tag":["IPTV"],"order":-21,"description":"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。 如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-06-19-iptv_direckly.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"客厅、书房、卧室,任意收看 IPTV 直播!"}],["meta",{"property":"og:description","content":"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。 如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180619170944.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-11T02:31:57.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"客厅、书房、卧室,任意收看 IPTV 直播!"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"IPTV"}],["meta",{"property":"article:published_time","content":"2018-06-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-11T02:31:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"客厅、书房、卧室,任意收看 IPTV 直播!\\",\\"image\\":[\\"https://img.newzone.top/20180619170944.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180619164137.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180619140722.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-06-19T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-11T02:31:57.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"提取直播源列表","slug":"提取直播源列表","link":"#提取直播源列表","children":[]},{"level":2,"title":"电视盒子直播","slug":"电视盒子直播","link":"#电视盒子直播","children":[]},{"level":2,"title":"PC 端电视直播","slug":"pc-端电视直播","link":"#pc-端电视直播","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1696991517000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":2.26,"words":679},"filePathRelative":"_posts/2018-06-19-iptv_direckly.md","localizedDate":"2018年6月19日","excerpt":"

    随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。

    \\n

    如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒,对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:电信公网疑似已屏蔽回放源 IP · Issue #28

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2823],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},8374:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>y});var r=n(7847);const a=(0,r.Lk)("p",null,"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。",-1),l={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},o=(0,r.Lk)("strong",null,"仅限上海电信",-1),i=(0,r.Lk)("strong",null,"慢 15 秒",-1),p={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list/issues/28",target:"_blank",rel:"noopener noreferrer"},s=(0,r.Lk)("blockquote",null,[(0,r.Lk)("p",null,"这个播放列表使用 IPTV 的频道 回放 功能。IPTV 直播用的是专网组播,无法直接通过 Internet 播放。 因为不是所有频道都支持回放,所以这个列表里的频道 必然少于 IPTV 的直播频道。 还有部分频道的回放地址播放错误,所以也没有收录。")],-1),g={href:"https://github.com/fanmingming/live",target:"_blank",rel:"noopener noreferrer"},c=(0,r.Lk)("h2",{id:"提取直播源列表",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#提取直播源列表"},[(0,r.Lk)("span",null,"提取直播源列表")])],-1),h={href:"https://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/IPTV.html",target:"_blank",rel:"noopener noreferrer"},m=(0,r.Lk)("strong",null,"视频直播源列表",-1),u=(0,r.Lk)("strong",null,"ANSI 编码",-1),f=(0,r.Fv)('

    电视盒子直播

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

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

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

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

    PC 端电视直播

    ',4),P={href:"http://www.potplayer.org/",target:"_blank",rel:"noopener noreferrer"},k=(0,r.Lk)("li",null,[(0,r.Lk)("p",null,"复制节目 rtsp 直播源链接,打开 Potplayer , 右键单击主界面 >「打开」>「打开剪贴板」。"),(0,r.Lk)("figure",null,[(0,r.Lk)("img",{src:"https://img.newzone.top/20180619140722.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.Lk)("figcaption")])],-1),d=(0,r.Lk)("p",null,"这样就可以在 PC 端看电视了。",-1),T=(0,r.Lk)("p",null,"参考资料:",-1),I={href:"http://koolshare.cn/thread-133246-1-1.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},V={href:"http://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/iptvplayseek.html",target:"_blank",rel:"noopener noreferrer"},L={},w=(0,n(3671).A)(L,[["render",function(e,t){const n=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[a,(0,r.Lk)("p",null,[(0,r.eW)("如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的"),(0,r.Lk)("a",l,[(0,r.eW)("上海电信 IPTV 视频回放源"),(0,r.bF)(n)]),(0,r.eW)("(原理上"),o,(0,r.eW)(")。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播"),i,(0,r.eW)(",对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:"),(0,r.Lk)("a",p,[(0,r.eW)("电信公网疑似已屏蔽回放源 IP · Issue #28"),(0,r.bF)(n)])]),s,(0,r.Lk)("p",null,[(0,r.eW)("如果你没有 IPTV,推荐使用 fanmingming 的 "),(0,r.Lk)("a",g,[(0,r.eW)("live"),(0,r.bF)(n)]),(0,r.eW)(" 项目,这是一个国内可直连的直播源分享项目,直播源支持 IPv4/IPv6 双栈访问。")]),c,(0,r.Lk)("p",null,[(0,r.eW)("进入"),(0,r.Lk)("a",h,[(0,r.eW)("上海电信 IPTV 视频流地址"),(0,r.bF)(n)]),(0,r.eW)("。点击「生成 txt 内容」,然后复制下方的"),m,(0,r.eW)(",保存为 tv.txt,并将 tv.txt 文本转为 "),u,(0,r.eW)("(避免节目名会出现中文乱码)。")]),f,(0,r.Lk)("ol",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("PC 端安排 "),(0,r.Lk)("a",P,[(0,r.eW)("Potplayer"),(0,r.bF)(n)]),(0,r.eW)("。")])]),k]),d,T,(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,[(0,r.Lk)("a",I,[(0,r.eW)("丢了你的 iptv 吧!上海电信 IPTV 直播源"),(0,r.bF)(n)])]),(0,r.Lk)("li",null,[(0,r.Lk)("a",b,[(0,r.eW)("上海电信 IPTV 视频流项目主页"),(0,r.bF)(n)])]),(0,r.Lk)("li",null,[(0,r.Lk)("a",V,[(0,r.eW)("上海电信 IPTV 视频流地址"),(0,r.bF)(n)])])])])}]]),y=JSON.parse('{"path":"/posts/2018-06-19-iptv_direckly.html","title":"客厅、书房、卧室,任意收看 IPTV 直播!","lang":"zh-CN","frontmatter":{"title":"客厅、书房、卧室,任意收看 IPTV 直播!","date":"2018-06-19T00:00:00.000Z","category":["网络"],"tag":["IPTV"],"order":-21,"description":"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。 如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-06-19-iptv_direckly.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"客厅、书房、卧室,任意收看 IPTV 直播!"}],["meta",{"property":"og:description","content":"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。 如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180619170944.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-11T02:31:57.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"客厅、书房、卧室,任意收看 IPTV 直播!"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"IPTV"}],["meta",{"property":"article:published_time","content":"2018-06-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-11T02:31:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"客厅、书房、卧室,任意收看 IPTV 直播!\\",\\"image\\":[\\"https://img.newzone.top/20180619170944.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180619164137.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180619140722.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-06-19T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-11T02:31:57.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"提取直播源列表","slug":"提取直播源列表","link":"#提取直播源列表","children":[]},{"level":2,"title":"电视盒子直播","slug":"电视盒子直播","link":"#电视盒子直播","children":[]},{"level":2,"title":"PC 端电视直播","slug":"pc-端电视直播","link":"#pc-端电视直播","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1696991517000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":2.26,"words":679},"filePathRelative":"_posts/2018-06-19-iptv_direckly.md","localizedDate":"2018年6月19日","excerpt":"

    随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。

    \\n

    如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒,对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:电信公网疑似已屏蔽回放源 IP · Issue #28

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1134afdd.35ba9547.js b/assets/js/2018-10-07-huginn_scraping_any_website.html.2cf1b212.js similarity index 80% rename from assets/js/v-1134afdd.35ba9547.js rename to assets/js/2018-10-07-huginn_scraping_any_website.html.2cf1b212.js index 3a5d0f9f1..9f09a80ae 100644 --- a/assets/js/v-1134afdd.35ba9547.js +++ b/assets/js/2018-10-07-huginn_scraping_any_website.html.2cf1b212.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3896],{9720:(n,e)=>{e.c=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},9584:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>x,data:()=>z});var a=t(3968);const s=(0,a.QD)("p",null,[(0,a.mY)("烧制网页 RSS 源,主要有 "),(0,a.QD)("strong",null,"FEED43"),(0,a.mY)(" 和 "),(0,a.QD)("strong",null,"Huginn"),(0,a.mY)(" 两种方法。")],-1),o=(0,a.QD)("ul",null,[(0,a.QD)("li",null,"FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。"),(0,a.QD)("li",null,[(0,a.mY)("Huginn:自由度高,能自定义"),(0,a.QD)("strong",null,"抓取频率、内容结构、js 结果、输出样式"),(0,a.mY)("等;需要搭建服务器,学习 Huginn 抓取规则。")])],-1),i=(0,a.QD)("h2",{id:"huginn-准备工作",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#huginn-准备工作"},[(0,a.QD)("span",null,"Huginn 准备工作")])],-1),p=(0,a.QD)("li",null,[(0,a.QD)("p",null,"准备 NAS 或 Debian/Ubuntu 环境的服务器;")],-1),r={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/huginn/huginn/blob/master/doc/manual/installation.md",target:"_blank",rel:"noopener noreferrer"},c={href:"https://phantomjscloud.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,a.QD)("strong",null,"PhantomJs Cloud",-1),g=(0,a.QD)("figure",null,[(0,a.QD)("img",{src:"https://img.newzone.top/20181006010447.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.QD)("figcaption")],-1),d=(0,a.IL)('

    PhantomJs 网页抓取

    新建 Huginn 任务组 Scenario「国内应急新闻」,样例抓取链接为 http://www.cneb.gov.cn/guoneinews/。注意,某些链接,特别是小城市的地方网站,即使缓存后也可能无法打开。这通常是由于数据通过第三方链接注入造成的。你可以利用网页浏览器工具定位到真正的数据链接再进行抓取。

    页面缓存

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

    解析网页内容

    使用 WebsiteAgent,抓取网页内容。

    获取内容路径

    使用火狐浏览器打开目标页面,获取 css path 路径。如果你使用的是 Xpath 路径,请将路径中的双引号替换为单引号,或者用反义符 \\ 注释掉路径中的双引号。

    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",
    • 有时节点路径输入正确,但输出为空。此时,将路径更改为 html,检查源码中是否含有你需要的内容。动态页面直接获取会为空,你需要使用 PhantomJs Cloud 来缓存页面。

    导出 RSS

    使用 DataOutputAgent,将抓取内容导出为 RSS。

    回到 Scenarios,点击 Data Output Agent 旁的按钮「Actions」>「Show」,复制导出的 xml 链接 http://xxx.xxx/users/1/web_requests/xxx/xxxx.xml

    ',19),m={href:"https://pan.baidu.com/s/1JdsFkLN9kczR9C92tKi83A",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/huginn/huginn/wiki/Browser-Emulation-Using-PhantomJs-Cloud",target:"_blank",rel:"noopener noreferrer"},b={href:"https://wechat.privacyhide.com/",target:"_blank",rel:"noopener noreferrer"},f=(0,a.QD)("h2",{id:"跳转链接处理示例",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#跳转链接处理示例"},[(0,a.QD)("span",null,"跳转链接处理示例")])],-1),k=(0,a.QD)("p",null,"要获取跳转链接的真实地址,可以使用 WebsiteAgent 直接读取原网页的 HTML 代码,并检查其中的跳转代码。",-1),v=(0,a.IL)('

    跳转代码通常位于<script>标签内。由于<script>标签内的内容是文本,而非 HTML 属性,我们不能使用属性选择器(如@href)。相反,我们应使用 XPath 的string()函数来提取整个<script>标签的文本内容。之后,可以利用 EventFormattingAgent 的正则表达式从这些文本中提取 URL。

    # WebsiteAgent\n{\n  "expected_update_period_in_days": "2",\n  "url": "https://www.chncpa.org/ycxm/202308/t20230817_254985.html",\n  "type": "html",\n  "mode": "on_change",\n  "extract": {\n    "url": {\n      "xpath": "//script",\n      "value": "string(.)"\n    }\n  }\n}\n\n# EventFormattingAgent\n{\n  "instructions": {\n    "jumpurl": "{{real_url.1}}"\n  },\n  "matchers": [\n    {\n      "path": "{{url}}",\n      "regexp": "window\\\\.location\\\\.href\\\\s*=\\\\s*\\\\\\\\?[\\"']([^\\"']+?)(?:\\\\\\\\?[\\"']);",\n      "to": "real_url"\n    }\n  ],\n  "mode": "clean"\n}\n

    RSS 合集

    汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    ',4),S={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},D={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},q={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},Q={},x=(0,t(9720).c)(Q,[["render",function(n,e){const t=(0,a.E1)("BiliBili"),Q=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[s,o,(0,a.K2)(t,{bvid:"BV1k5411B7vF"}),i,(0,a.QD)("ul",null,[p,(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.mY)("参考 "),(0,a.QD)("a",r,[(0,a.mY)("deploy Huginn inside of Docker"),(0,a.K2)(Q)]),(0,a.mY)("、"),(0,a.QD)("a",l,[(0,a.mY)("installation guide for Debian/Ubuntu"),(0,a.K2)(Q)]),(0,a.mY)(" 来搭建 Huginn。")])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.mY)("注册 "),(0,a.QD)("a",c,[(0,a.mY)("PhantomJs Cloud"),(0,a.K2)(Q)]),(0,a.mY)(" ,然后将 API key 保存在 Huginn 的 Credentials 中。很多网站是用 JS 加载动态内容,因此需要 "),u,(0,a.mY)(" 来抓取页面 JS 缓存。免费版每天限制抓取 500 次页面,需求不大可建立多个账号使用不同 API key,足够个人使用。")]),g])]),d,(0,a.QD)("p",null,[(0,a.QD)("a",m,[(0,a.mY)("点击网盘下载"),(0,a.K2)(Q)]),(0,a.mY)("国内应急新闻的详细设置,导入到 Huginn 即可使用。其他问题参考 "),(0,a.QD)("a",h,[(0,a.mY)("PhantomJs Cloud 英文攻略"),(0,a.K2)(Q)]),(0,a.mY)("。")]),(0,a.QD)("p",null,[(0,a.mY)("微信的屏蔽措施非常之多,公众号抓取可以尝试 "),(0,a.QD)("a",b,[(0,a.mY)("wechat-feeds"),(0,a.K2)(Q)]),(0,a.mY)("。")]),f,k,(0,a.K2)(t,{bvid:"BV1ae411v7Qg"}),v,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",S,[(0,a.mY)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,a.K2)(Q)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",w,[(0,a.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,a.K2)(Q)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",D,[(0,a.mY)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,a.K2)(Q)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",q,[(0,a.mY)("RSS 速成篇 2:RSSHub 自部署"),(0,a.K2)(Q)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",y,[(0,a.mY)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,a.K2)(Q)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",_,[(0,a.mY)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,a.K2)(Q)])])])])])}]]),z=JSON.parse('{"path":"/posts/2018-10-07-huginn_scraping_any_website.html","title":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)","lang":"zh-CN","frontmatter":{"title":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)","date":"2018-10-07T00:00:00.000Z","category":["自动化"],"tag":["Huginn","rss"],"order":-22,"description":"烧制网页 RSS 源,主要有 FEED43 和 Huginn 两种方法。 FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。 Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"}],["meta",{"property":"og:description","content":"烧制网页 RSS 源,主要有 FEED43 和 Huginn 两种方法。 FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。 Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。 "}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20181006010447.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Huginn"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2018-10-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)\\",\\"image\\":[\\"https://img.newzone.top/20181006010447.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008131549.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008111704.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008112658.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008114911.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008113925.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008114207.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008130943.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008131059.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-10-07T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"Huginn 准备工作","slug":"huginn-准备工作","link":"#huginn-准备工作","children":[]},{"level":2,"title":"PhantomJs 网页抓取","slug":"phantomjs-网页抓取","link":"#phantomjs-网页抓取","children":[{"level":3,"title":"页面缓存","slug":"页面缓存","link":"#页面缓存","children":[]},{"level":3,"title":"解析网页内容","slug":"解析网页内容","link":"#解析网页内容","children":[]},{"level":3,"title":"获取内容路径","slug":"获取内容路径","link":"#获取内容路径","children":[]},{"level":3,"title":"导出 RSS","slug":"导出-rss","link":"#导出-rss","children":[]}]},{"level":2,"title":"跳转链接处理示例","slug":"跳转链接处理示例","link":"#跳转链接处理示例","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13}]},"readingTime":{"minutes":3.95,"words":1185},"filePathRelative":"_posts/2018-10-07-huginn_scraping_any_website.md","localizedDate":"2018年10月7日","excerpt":"

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

    \\n
      \\n
    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • \\n
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。
    • \\n
    \\n","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9022],{3671:(n,e)=>{e.A=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},1309:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>z,data:()=>R});var a=t(7847);const s=(0,a.Lk)("p",null,[(0,a.eW)("烧制网页 RSS 源,主要有 "),(0,a.Lk)("strong",null,"FEED43"),(0,a.eW)(" 和 "),(0,a.Lk)("strong",null,"Huginn"),(0,a.eW)(" 两种方法。")],-1),o=(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,"FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。"),(0,a.Lk)("li",null,[(0,a.eW)("Huginn:自由度高,能自定义"),(0,a.Lk)("strong",null,"抓取频率、内容结构、js 结果、输出样式"),(0,a.eW)("等;需要搭建服务器,学习 Huginn 抓取规则。")])],-1),i=(0,a.Lk)("h2",{id:"huginn-准备工作",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#huginn-准备工作"},[(0,a.Lk)("span",null,"Huginn 准备工作")])],-1),p=(0,a.Lk)("li",null,[(0,a.Lk)("p",null,"准备 NAS 或 Debian/Ubuntu 环境的服务器;")],-1),r={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/huginn/huginn/blob/master/doc/manual/installation.md",target:"_blank",rel:"noopener noreferrer"},c={href:"https://phantomjscloud.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,a.Lk)("strong",null,"PhantomJs Cloud",-1),g=(0,a.Lk)("figure",null,[(0,a.Lk)("img",{src:"https://img.newzone.top/20181006010447.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.Lk)("figcaption")],-1),d=(0,a.Fv)('

    PhantomJs 网页抓取

    新建 Huginn 任务组 Scenario「国内应急新闻」,样例抓取链接为 http://www.cneb.gov.cn/guoneinews/。注意,某些链接,特别是小城市的地方网站,即使缓存后也可能无法打开。这通常是由于数据通过第三方链接注入造成的。你可以利用网页浏览器工具定位到真正的数据链接再进行抓取。

    页面缓存

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

    解析网页内容

    使用 WebsiteAgent,抓取网页内容。

    获取内容路径

    使用火狐浏览器打开目标页面,获取 css path 路径。如果你使用的是 Xpath 路径,请将路径中的双引号替换为单引号,或者用反义符 \\ 注释掉路径中的双引号。

    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",
    • 有时节点路径输入正确,但输出为空。此时,将路径更改为 html,检查源码中是否含有你需要的内容。动态页面直接获取会为空,你需要使用 PhantomJs Cloud 来缓存页面。

    导出 RSS

    使用 DataOutputAgent,将抓取内容导出为 RSS。

    回到 Scenarios,点击 Data Output Agent 旁的按钮「Actions」>「Show」,复制导出的 xml 链接 http://xxx.xxx/users/1/web_requests/xxx/xxxx.xml

    ',19),m={href:"https://pan.baidu.com/s/1JdsFkLN9kczR9C92tKi83A",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/huginn/huginn/wiki/Browser-Emulation-Using-PhantomJs-Cloud",target:"_blank",rel:"noopener noreferrer"},k={href:"https://wechat.privacyhide.com/",target:"_blank",rel:"noopener noreferrer"},b=(0,a.Lk)("h2",{id:"跳转链接处理示例",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#跳转链接处理示例"},[(0,a.Lk)("span",null,"跳转链接处理示例")])],-1),f=(0,a.Lk)("p",null,"要获取跳转链接的真实地址,可以使用 WebsiteAgent 直接读取原网页的 HTML 代码,并检查其中的跳转代码。",-1),v=(0,a.Fv)('

    跳转代码通常位于<script>标签内。由于<script>标签内的内容是文本,而非 HTML 属性,我们不能使用属性选择器(如@href)。相反,我们应使用 XPath 的string()函数来提取整个<script>标签的文本内容。之后,可以利用 EventFormattingAgent 的正则表达式从这些文本中提取 URL。

    # WebsiteAgent\n{\n  "expected_update_period_in_days": "2",\n  "url": "https://www.chncpa.org/ycxm/202308/t20230817_254985.html",\n  "type": "html",\n  "mode": "on_change",\n  "extract": {\n    "url": {\n      "xpath": "//script",\n      "value": "string(.)"\n    }\n  }\n}\n\n# EventFormattingAgent\n{\n  "instructions": {\n    "jumpurl": "{{real_url.1}}"\n  },\n  "matchers": [\n    {\n      "path": "{{url}}",\n      "regexp": "window\\\\.location\\\\.href\\\\s*=\\\\s*\\\\\\\\?[\\"']([^\\"']+?)(?:\\\\\\\\?[\\"']);",\n      "to": "real_url"\n    }\n  ],\n  "mode": "clean"\n}\n

    RSS 合集

    汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    ',4),S={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},q={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},x={},z=(0,t(3671).A)(x,[["render",function(n,e){const t=(0,a.g2)("BiliBili"),x=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[s,o,(0,a.bF)(t,{bvid:"BV1k5411B7vF"}),i,(0,a.Lk)("ul",null,[p,(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.eW)("参考 "),(0,a.Lk)("a",r,[(0,a.eW)("deploy Huginn inside of Docker"),(0,a.bF)(x)]),(0,a.eW)("、"),(0,a.Lk)("a",l,[(0,a.eW)("installation guide for Debian/Ubuntu"),(0,a.bF)(x)]),(0,a.eW)(" 来搭建 Huginn。")])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.eW)("注册 "),(0,a.Lk)("a",c,[(0,a.eW)("PhantomJs Cloud"),(0,a.bF)(x)]),(0,a.eW)(" ,然后将 API key 保存在 Huginn 的 Credentials 中。很多网站是用 JS 加载动态内容,因此需要 "),u,(0,a.eW)(" 来抓取页面 JS 缓存。免费版每天限制抓取 500 次页面,需求不大可建立多个账号使用不同 API key,足够个人使用。")]),g])]),d,(0,a.Lk)("p",null,[(0,a.Lk)("a",m,[(0,a.eW)("点击网盘下载"),(0,a.bF)(x)]),(0,a.eW)("国内应急新闻的详细设置,导入到 Huginn 即可使用。其他问题参考 "),(0,a.Lk)("a",h,[(0,a.eW)("PhantomJs Cloud 英文攻略"),(0,a.bF)(x)]),(0,a.eW)("。")]),(0,a.Lk)("p",null,[(0,a.eW)("微信的屏蔽措施非常之多,公众号抓取可以尝试 "),(0,a.Lk)("a",k,[(0,a.eW)("wechat-feeds"),(0,a.bF)(x)]),(0,a.eW)("。")]),b,f,(0,a.bF)(t,{bvid:"BV1ae411v7Qg"}),v,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",S,[(0,a.eW)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,a.bF)(x)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",w,[(0,a.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,a.bF)(x)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",q,[(0,a.eW)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,a.bF)(x)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",y,[(0,a.eW)("RSS 速成篇 2:RSSHub 自部署"),(0,a.bF)(x)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",L,[(0,a.eW)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,a.bF)(x)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",_,[(0,a.eW)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,a.bF)(x)])])])])])}]]),R=JSON.parse('{"path":"/posts/2018-10-07-huginn_scraping_any_website.html","title":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)","lang":"zh-CN","frontmatter":{"title":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)","date":"2018-10-07T00:00:00.000Z","category":["自动化"],"tag":["Huginn","rss"],"order":-22,"description":"烧制网页 RSS 源,主要有 FEED43 和 Huginn 两种方法。 FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。 Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"}],["meta",{"property":"og:description","content":"烧制网页 RSS 源,主要有 FEED43 和 Huginn 两种方法。 FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。 Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。 "}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20181006010447.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Huginn"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2018-10-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)\\",\\"image\\":[\\"https://img.newzone.top/20181006010447.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008131549.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008111704.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008112658.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008114911.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008113925.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008114207.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008130943.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20181008131059.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-10-07T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"Huginn 准备工作","slug":"huginn-准备工作","link":"#huginn-准备工作","children":[]},{"level":2,"title":"PhantomJs 网页抓取","slug":"phantomjs-网页抓取","link":"#phantomjs-网页抓取","children":[{"level":3,"title":"页面缓存","slug":"页面缓存","link":"#页面缓存","children":[]},{"level":3,"title":"解析网页内容","slug":"解析网页内容","link":"#解析网页内容","children":[]},{"level":3,"title":"获取内容路径","slug":"获取内容路径","link":"#获取内容路径","children":[]},{"level":3,"title":"导出 RSS","slug":"导出-rss","link":"#导出-rss","children":[]}]},{"level":2,"title":"跳转链接处理示例","slug":"跳转链接处理示例","link":"#跳转链接处理示例","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13}]},"readingTime":{"minutes":3.95,"words":1185},"filePathRelative":"_posts/2018-10-07-huginn_scraping_any_website.md","localizedDate":"2018年10月7日","excerpt":"

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

    \\n
      \\n
    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • \\n
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。
    • \\n
    \\n","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2018-12-28-voice_input_try.html.02451ffb.js b/assets/js/2018-12-28-voice_input_try.html.02451ffb.js new file mode 100644 index 000000000..7cb539137 --- /dev/null +++ b/assets/js/2018-12-28-voice_input_try.html.02451ffb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1088],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,p]of t)n[e]=p;return n}},7486:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>u,data:()=>h});var p=n(7847);const a=(0,p.Fv)('

    从 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),i={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},o=(0,p.Lk)("figure",null,[(0,p.Lk)("img",{src:"https://img.newzone.top/2022-05-25-18-08-06.png?imageMogr2/thumbnail/500x",alt:"Quick Cut 界面",tabindex:"0",loading:"lazy"}),(0,p.Lk)("figcaption",null,"Quick Cut 界面")],-1),r=(0,p.Lk)("p",null,"Quick Cut 的缺点:语音输入时,要一直按大写键,不适合长语音录入;触发键无法更改,大写键与我的常用脚本冲突了。因此,长时间的语音输入只能借助手机上的飞书妙记来完成转录。",-1),l=(0,p.Lk)("h2",{id:"最终方案-微软语音输入",tabindex:"-1"},[(0,p.Lk)("a",{class:"header-anchor",href:"#最终方案-微软语音输入"},[(0,p.Lk)("span",null,"最终方案:微软语音输入")])],-1),c={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"},g=(0,p.Fv)('

    微软自带的语音输入,快捷键 Win + H。3 块钱的麦克风,距离 50 厘米,很低的声音读出来了。

    测试后,发现微软语音输入确实是好用,甚至好用到有点恐怖。测试中,我临时有事,走到另外一个房间和家人说话,回来后发现刚刚的对话也被微软语音输入正确识别。

    微软语音输入
    微软语音输入

    微软语音输入非常敏感,距离远、声音低也能识别。这样我不用为语音输入而特意移动话筒,可以继续把话筒放在不遮挡视野的远角。

    「语音键入功能在此应用上受限制」在 Notepad++ 和微信都出现了,Visual Studio Code 没出现,但实际上这提示对语音输入并没造成影响,平常可以忽略这个提示。

    虽然微软语音输入的识别率只有 85%,不如阿里云方案的 95%,可系统自带的优势太明显,微软语音输入体验感非常顺滑。设置中开启「自动标点符号」后,对长句的优化非常好。

    启动快捷键 Win + H,语音识别立即会启动。如果中途没说话,应用会自动暂停,并对前面的输入进行整理,插入合适的标点符号。停止超过一分钟,语音识别才会暂停,等待再次启动。换言之,微软语音输入能一键完成长语音录入。

    之前的麦克风放着放着就坏了,所以我没测 @李乐 说的低价麦克风的语音输入效果。不过,微软输入的软件优化非常好,按照目前效果推测,用便宜的麦克风也能实现完美的收音效果。综合来说,微软语音输入是当前最完美也是兼容性最高的语音输入方案。

    总结与展望

    语音输入的 3 种方案:

    • 文章输入:微软语音输入 + 外置声卡 + 动圈话筒,兼容性最高,使用方便,但精度一般,用于文章草稿阶段。
    • 一句话输入:Quick Cut + 外置声卡 + 动圈话筒,一句话识别精度最高,适合聊天时使用。
    • 语音转录:飞书妙记 + 手机,录音转文字,长语音的识别率超高。

    与 2018 年相比,2022 年的语音输入方案已经完善了许多。硬件已经不再是问题了,便宜的话筒也能达到语音输入标准。语音识别进步明显,在 AI 技术的加持下,短句识别率从 90% 上升到 95%,长句识别率则从 50% 上升到 70%,标点符号均能正确插入。

    目前语音输入算法在提升最后 10% 的准确率,期待早日达到「口述与键盘输入完全一致」的一天。

    ',13),s={},u=(0,n(3671).A)(s,[["render",function(e,t){const n=(0,p.g2)("ExternalLinkIcon");return(0,p.uX)(),(0,p.CE)("div",null,[a,(0,p.Lk)("p",null,[(0,p.eW)("语音输入则转用开源的 "),(0,p.Lk)("a",i,[(0,p.eW)("Quick Cut"),(0,p.bF)(n)]),(0,p.eW)(",使用阿里云、腾讯云的商用语音接口,识别率比免费的搜狗和讯飞都高。")]),o,r,l,(0,p.Lk)("p",null,[(0,p.eW)("面对 Quick Cut 的长语音输入难题时,@李乐 推荐了微软语音输入-"),(0,p.Lk)("a",c,[(0,p.eW)("使用语音键入来说话,而不是在电脑上键入"),(0,p.bF)(n)]),(0,p.eW)("。")]),g])}]]),h=JSON.parse('{"path":"/posts/2018-12-28-voice_input_try.html","title":"等了十年,PC 端能用的语音输入方案来了","lang":"zh-CN","frontmatter":{"title":"等了十年,PC 端能用的语音输入方案来了","subtitle":"解放双手,加速打字,电脑端语音录入方案","date":"2018-12-28T00:00:00.000Z","category":["自动化"],"tag":["语音输入"],"order":-23,"description":"从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。 为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。 讯飞 + 小麦克风 2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-12-28-voice_input_try.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"等了十年,PC 端能用的语音输入方案来了"}],["meta",{"property":"og:description","content":"从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。 为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。 讯飞 + 小麦克风 2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20181228052211.png?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"等了十年,PC 端能用的语音输入方案来了"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"语音输入"}],["meta",{"property":"article:published_time","content":"2018-12-28T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"等了十年,PC 端能用的语音输入方案来了\\",\\"image\\":[\\"https://img.newzone.top/20181228052211.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-25-18-02-54.jpg?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2022-05-25-18-08-06.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2022-05-25-18-13-17.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-12-28T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-29T12:26:51.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"讯飞 + 小麦克风","slug":"讯飞-小麦克风","link":"#讯飞-小麦克风","children":[]},{"level":2,"title":"讯飞 + Blue Yeti","slug":"讯飞-blue-yeti","link":"#讯飞-blue-yeti","children":[]},{"level":2,"title":"外置声卡 + 动圈话筒","slug":"外置声卡-动圈话筒","link":"#外置声卡-动圈话筒","children":[]},{"level":2,"title":"输入法之争","slug":"输入法之争","link":"#输入法之争","children":[]},{"level":2,"title":"最终方案:微软语音输入","slug":"最终方案-微软语音输入","link":"#最终方案-微软语音输入","children":[]},{"level":2,"title":"总结与展望","slug":"总结与展望","link":"#总结与展望","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":6.53,"words":1959},"filePathRelative":"_posts/2018-12-28-voice_input_try.md","localizedDate":"2018年12月28日","excerpt":"

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    \\n

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    \\n

    讯飞 + 小麦克风

    \\n

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    \\n

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    \\n

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2019-03-31-openvpn_back_to_home.html.23993a69.js b/assets/js/2019-03-31-openvpn_back_to_home.html.23993a69.js new file mode 100644 index 000000000..4252b588d --- /dev/null +++ b/assets/js/2019-03-31-openvpn_back_to_home.html.23993a69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4026],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},5912:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>h,data:()=>d});var o=n(7847);const p=(0,o.Lk)("p",null,"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。",-1),a=(0,o.Lk)("h2",{id:"内网穿透",tabindex:"-1"},[(0,o.Lk)("a",{class:"header-anchor",href:"#内网穿透"},[(0,o.Lk)("span",null,"内网穿透")])],-1),r=(0,o.Lk)("p",null,"连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。",-1),i=(0,o.Lk)("p",null,"梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。",-1),m=(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/20190331203233.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")],-1),g=(0,o.Lk)("p",null,"电信分配的公网 IP 经常会更换,每次都需要重定向子域名。在路由器 koolshare - 软件中心中安装 Aliddns,帮助更新家的公网 IP。插件中输入定向子域名和阿里云的 appkey,配置就完成了。如果没有自动在阿里云解析,可以先手动解析设置。",-1),l={href:"https://newzone.top/posts/2018-06-08-Baizhuo_GP1700.html",target:"_blank",rel:"noopener noreferrer"},c=(0,o.Fv)('

    OpenVPN 配置

    内网穿透完成后,开始 OpenVPN 配置。梅林路由器进入「高级设置」→「VPN」→「虚拟专用网(VPN)服务器」,开启路由器自带的 OpenVPN。

    高级配置红色的部分有修改,特别是VPN 子网必须修改为与路由器不同的号段,如 192.168.3.0。如果使用默认子网,会无法顺利翻墙。

    应用设置后,点击「一般设置」,并导出 .ovpn 文件。打开该配置文件,将远程端口改为光猫上虚拟服务器映射的端口。

    最后,手机导入 .ovpn 设置文件,就可以上网回家了!

    ',7),s={},h=(0,n(3671).A)(s,[["render",function(e,t){const n=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[p,a,r,i,m,g,(0,o.Lk)("p",null,[(0,o.eW)("光猫设置参考"),(0,o.Lk)("a",l,[(0,o.eW)("光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"),(0,o.bF)(n)]),(0,o.eW)("。")]),c])}]]),d=JSON.parse('{"path":"/posts/2019-03-31-openvpn_back_to_home.html","title":"OpenVPN 随时随地回家的路","lang":"zh-CN","frontmatter":{"title":"OpenVPN 随时随地回家的路","date":"2019-03-31T00:00:00.000Z","category":["网络"],"tag":["OpenVPN","内网穿透"],"order":-24,"description":"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。 内网穿透 连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。 梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。 电信分配的公网 IP 经常会更换,每...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-03-31-openvpn_back_to_home.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"OpenVPN 随时随地回家的路"}],["meta",{"property":"og:description","content":"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。 内网穿透 连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。 梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。 电信分配的公网 IP 经常会更换,每..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20190331203233.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"OpenVPN 随时随地回家的路"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OpenVPN"}],["meta",{"property":"article:tag","content":"内网穿透"}],["meta",{"property":"article:published_time","content":"2019-03-31T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"OpenVPN 随时随地回家的路\\",\\"image\\":[\\"https://img.newzone.top/20190331203233.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190331200921.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190331202017.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2019-03-31T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"内网穿透","slug":"内网穿透","link":"#内网穿透","children":[]},{"level":2,"title":"OpenVPN 配置","slug":"openvpn-配置","link":"#openvpn-配置","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":1.39,"words":416},"filePathRelative":"_posts/2019-03-31-openvpn_back_to_home.md","localizedDate":"2019年3月31日","excerpt":"

    有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。

    \\n

    内网穿透

    \\n

    连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。

    \\n

    梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-243182fe.b4972189.js b/assets/js/2019-04-01-rsshub_noob.html.41f193c9.js similarity index 64% rename from assets/js/v-243182fe.b4972189.js rename to assets/js/2019-04-01-rsshub_noob.html.41f193c9.js index 7fd628d24..be5bbe849 100644 --- a/assets/js/v-243182fe.b4972189.js +++ b/assets/js/2019-04-01-rsshub_noob.html.41f193c9.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7320],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},1824:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>H});var r=n(3968);const i=(0,r.QD)("p",null,"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。",-1),l=(0,r.QD)("strong",null,"RSSHub",-1),o={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},a=(0,r.QD)("figure",null,[(0,r.QD)("img",{src:"https://img.newzone.top/20190331012441.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.QD)("figcaption")],-1),p=(0,r.QD)("h2",{id:"bilibili-番剧抓取示例",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#bilibili-番剧抓取示例"},[(0,r.QD)("span",null,"bilibili 番剧抓取示例")])],-1),s={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},S=(0,r.QD)("figure",null,[(0,r.QD)("img",{src:"https://img.newzone.top/20190406131343.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.QD)("figcaption")],-1),u=(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("准备抓取番剧《盾之勇者成名录》的更新,番剧主页链接为 "),(0,r.QD)("code",null,"https://www.bilibili.com/bangumi/media/md4316482/"),(0,r.mY)(",mediaid 为 "),(0,r.QD)("code",null,"4316482"),(0,r.mY)("。")])],-1),b=(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("按照路由参数,修改 RSS 链接 "),(0,r.QD)("code",null,"https://rsshub.app/bilibili/bangumi/media/4316482"),(0,r.mY)(",然后在 RSS 阅读器中打开。")]),(0,r.QD)("figure",null,[(0,r.QD)("img",{src:"https://img.newzone.top/20190406134022.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.QD)("figcaption")])],-1),m=(0,r.QD)("p",null,"附注:虽然 RSSHub 使用非常简单,但由于现已过于流行,微博、知乎等已开始反爬限制。若动手能力强,建议按下方教程自行部署或选择 Huginn。",-1),g=(0,r.QD)("h2",{id:"rss-合集",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#rss-合集"},[(0,r.QD)("span",null,"RSS 合集")])],-1),h=(0,r.QD)("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),c={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},D={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},_={},w=(0,n(9720).c)(_,[["render",function(e,t){const n=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[i,(0,r.QD)("p",null,[l,(0,r.mY)(" 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 "),(0,r.QD)("a",o,[(0,r.mY)("RSSHub 官网"),(0,r.K2)(n)]),(0,r.mY)(",便可定期获取主流媒体的 RSS 项目更新。")]),a,p,(0,r.QD)("ol",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("打开 "),(0,r.QD)("a",s,[(0,r.mY)("RSSHub bilibili 专区"),(0,r.K2)(n)]),(0,r.mY)(",在此可根据番剧、UP 主等定制 RSS。")]),S]),u,b]),m,g,h,(0,r.QD)("ul",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",c,[(0,r.mY)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",d,[(0,r.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",R,[(0,r.mY)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",D,[(0,r.mY)("RSS 速成篇 2:RSSHub 自部署"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",f,[(0,r.mY)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",Q,[(0,r.mY)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,r.K2)(n)])])])])])}]]),H=JSON.parse('{"path":"/posts/2019-04-01-rsshub_noob.html","title":"RSS 速成篇:RSSHub 捡现成的轮子","lang":"zh-CN","frontmatter":{"title":"RSS 速成篇:RSSHub 捡现成的轮子","date":"2019-04-01T00:00:00.000Z","category":["自动化"],"tag":["rss","RSSHub"],"order":-25,"description":"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。 RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。 bilibili ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-04-01-rsshub_noob.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 速成篇:RSSHub 捡现成的轮子"}],["meta",{"property":"og:description","content":"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。 RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。 bilibili ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20190331012441.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-09T21:57:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 速成篇:RSSHub 捡现成的轮子"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:tag","content":"RSSHub"}],["meta",{"property":"article:published_time","content":"2019-04-01T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-08-09T21:57:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 速成篇:RSSHub 捡现成的轮子\\",\\"image\\":[\\"https://img.newzone.top/20190331012441.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190406131343.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190406134022.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2019-04-01T00:00:00.000Z\\",\\"dateModified\\":\\"2023-08-09T21:57:45.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"bilibili 番剧抓取示例","slug":"bilibili-番剧抓取示例","link":"#bilibili-番剧抓取示例","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1691618265000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":1.4,"words":419},"filePathRelative":"_posts/2019-04-01-rsshub_noob.md","localizedDate":"2019年4月1日","excerpt":"

    RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。

    \\n

    RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3146],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},3130:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>H});var r=n(7847);const i=(0,r.Lk)("p",null,"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。",-1),l=(0,r.Lk)("strong",null,"RSSHub",-1),o={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},a=(0,r.Lk)("figure",null,[(0,r.Lk)("img",{src:"https://img.newzone.top/20190331012441.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.Lk)("figcaption")],-1),p=(0,r.Lk)("h2",{id:"bilibili-番剧抓取示例",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#bilibili-番剧抓取示例"},[(0,r.Lk)("span",null,"bilibili 番剧抓取示例")])],-1),s={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},S=(0,r.Lk)("figure",null,[(0,r.Lk)("img",{src:"https://img.newzone.top/20190406131343.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.Lk)("figcaption")],-1),u=(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("准备抓取番剧《盾之勇者成名录》的更新,番剧主页链接为 "),(0,r.Lk)("code",null,"https://www.bilibili.com/bangumi/media/md4316482/"),(0,r.eW)(",mediaid 为 "),(0,r.Lk)("code",null,"4316482"),(0,r.eW)("。")])],-1),b=(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("按照路由参数,修改 RSS 链接 "),(0,r.Lk)("code",null,"https://rsshub.app/bilibili/bangumi/media/4316482"),(0,r.eW)(",然后在 RSS 阅读器中打开。")]),(0,r.Lk)("figure",null,[(0,r.Lk)("img",{src:"https://img.newzone.top/20190406134022.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.Lk)("figcaption")])],-1),g=(0,r.Lk)("p",null,"附注:虽然 RSSHub 使用非常简单,但由于现已过于流行,微博、知乎等已开始反爬限制。若动手能力强,建议按下方教程自行部署或选择 Huginn。",-1),m=(0,r.Lk)("h2",{id:"rss-合集",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#rss-合集"},[(0,r.Lk)("span",null,"RSS 合集")])],-1),h=(0,r.Lk)("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),c={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},_={},w=(0,n(3671).A)(_,[["render",function(e,t){const n=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[i,(0,r.Lk)("p",null,[l,(0,r.eW)(" 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 "),(0,r.Lk)("a",o,[(0,r.eW)("RSSHub 官网"),(0,r.bF)(n)]),(0,r.eW)(",便可定期获取主流媒体的 RSS 项目更新。")]),a,p,(0,r.Lk)("ol",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("打开 "),(0,r.Lk)("a",s,[(0,r.eW)("RSSHub bilibili 专区"),(0,r.bF)(n)]),(0,r.eW)(",在此可根据番剧、UP 主等定制 RSS。")]),S]),u,b]),g,m,h,(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",c,[(0,r.eW)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",d,[(0,r.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",k,[(0,r.eW)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",R,[(0,r.eW)("RSS 速成篇 2:RSSHub 自部署"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",f,[(0,r.eW)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",L,[(0,r.eW)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,r.bF)(n)])])])])])}]]),H=JSON.parse('{"path":"/posts/2019-04-01-rsshub_noob.html","title":"RSS 速成篇:RSSHub 捡现成的轮子","lang":"zh-CN","frontmatter":{"title":"RSS 速成篇:RSSHub 捡现成的轮子","date":"2019-04-01T00:00:00.000Z","category":["自动化"],"tag":["rss","RSSHub"],"order":-25,"description":"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。 RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。 bilibili ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-04-01-rsshub_noob.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 速成篇:RSSHub 捡现成的轮子"}],["meta",{"property":"og:description","content":"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。 RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。 bilibili ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20190331012441.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-09T21:57:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 速成篇:RSSHub 捡现成的轮子"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:tag","content":"RSSHub"}],["meta",{"property":"article:published_time","content":"2019-04-01T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-08-09T21:57:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 速成篇:RSSHub 捡现成的轮子\\",\\"image\\":[\\"https://img.newzone.top/20190331012441.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190406131343.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190406134022.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2019-04-01T00:00:00.000Z\\",\\"dateModified\\":\\"2023-08-09T21:57:45.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"bilibili 番剧抓取示例","slug":"bilibili-番剧抓取示例","link":"#bilibili-番剧抓取示例","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1691618265000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":1.4,"words":419},"filePathRelative":"_posts/2019-04-01-rsshub_noob.md","localizedDate":"2019年4月1日","excerpt":"

    RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。

    \\n

    RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-69734bd3.c21386d8.js b/assets/js/2019-08-26-scrcpy_screen_projection.html.a5e956ae.js similarity index 90% rename from assets/js/v-69734bd3.c21386d8.js rename to assets/js/2019-08-26-scrcpy_screen_projection.html.a5e956ae.js index 9c14e0b7b..4b4d1077d 100644 --- a/assets/js/v-69734bd3.c21386d8.js +++ b/assets/js/2019-08-26-scrcpy_screen_projection.html.a5e956ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7696],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},3704:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>b,data:()=>g});var s=a(3968);const t={href:"https://github.com/Genymobile/scrcpy",target:"_blank",rel:"noopener noreferrer"},c=(0,s.QD)("p",null,"市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。",-1),r={href:"https://github.com/Genymobile/scrcpy/releases/download/v2.3/scrcpy-win64-v2.3.zip",target:"_blank",rel:"noopener noreferrer"},i={href:"https://wwva.lanzouq.com/iRD6J1fzo7tc",target:"_blank",rel:"noopener noreferrer"},p=(0,s.IL)('

    有线投屏

    1. 下载并解压 scrcpy。
    2. 在手机上启用 开发者选项USB 调试。要开启开发者选项,通常需要点击手机上的「设置/系统」>「关于手机」,然后连续点击版本号七次。返回上一屏幕后,你将在底部找到开发者选项。
    3. 使用数据线连接手机和电脑。手机上会弹出一个授权请求,请选择「允许 USB 调试」。
    4. 双击已解压的 scrcpy.exe 文件,即可开始有线投屏。

    若需在手机黑屏时继续投屏,请按以下步骤操作:当手机屏幕亮起并解锁后,连接至电脑,然后输入命令 .\\scrcpy --turn-screen-off。此操作会关闭手机屏幕,但投屏功能继续正常运行。

    无线投屏

    无线投屏的前提是,电脑和手机处于同一局域网中。

    有线投屏中的前三步也适用于无线投屏,完成这些步骤后,打开 PowerShell(~ cmd),依次输入操作命令。

    # a.将命令目录切换到 scrcpy 文件夹。如果使用的是 Windows 11,在 scrcpy 文件夹中右键点击「在终端中打开」,会自动切换到当前路径。\ncd D:\\Libraries\\Desktop\\scrcpy-win64-v2.3\n​\n# b.在手机端开启「开发者选项」和「USB 调试」,然后使用数据线将手机和电脑连接,并允许 USB 调试,开启手机端口。\n.\\adb tcpip 5555\n\n# 如果本行显示 no device 或未启动 adb,需检查「USB 调试」是否开启,或更换数据线。\n# 此外,一些手机需选择「文件传输」模式方能使用 adb。\n​\n# c.拔出手机数据线,开始无线投屏。(192.168.2.20 为手机端的 WIFI 局域网 ip,需更改)\n.\\adb connect 192.168.2.20:5555\n​\n# d.启动 scrcpy.exe\n.\\scrcpy\n\n# 如果出现错误或延迟较大,可以指定低分辨率投屏。\n.\\scrcpy -m 1024\n# 连接多个设备会出现报错 `failed to get feature set: more than one device/emulator`,此时需要指定连接 tcpip 设备。\n.\\scrcpy -e -m 1024\n# 简化操作:合并步骤 c 和 d,保持屏幕常亮,指定 1024 分辨率。\n.\\scrcpy --tcpip=192.168.2.20 -w -m 1024\n\n# Android 12 以上的设备可使用相机投屏\n.\\scrcpy --video-source=camera\n
    scrcpy 命令行截图

    屏幕录制

    如果想在投屏的同时,对手机屏幕进行录制,可以输入下方命令进行操作。

    # 将命令目录切换到 scrcpy 文件夹。\ncd D:\\Libraries\\Desktop\\scrcpy-win64-v2.3\n​\n# 开始录制,录屏文件会自动保存在当前文件夹内,文件名为指定的文件名。\n.\\scrcpy -r filename.mp4\n​\n# 关闭投屏窗口后,自动停止录屏并将视频保存在相应的目录中。\n

    常见问题

    错误检查

    遇到报错时,检查下列三种情况,可以解决 90% 的错误:

    • 更换数据线;
    • 检查手机的「本机 IP」是否正确;
    • 核对有线连接步骤,选择「开启 USB 调试」>「连接手机与电脑」>「启动 scrcpy」。

    Could not find any ADB device

    ',16),l=(0,s.QD)("code",null,"ERROR: Could not find any ADB device",-1),o={href:"https://developer.android.com/studio/run/oem-usb?hl=zh-cn#Drivers",target:"_blank",rel:"noopener noreferrer"},d={href:"http://zs.vivo.com.cn/download.php?sel_type=2",target:"_blank",rel:"noopener noreferrer"},m={href:"http://www.miui.com/unlock/download.html",target:"_blank",rel:"noopener noreferrer"},u=(0,s.IL)('

    ERROR: Exception on thread

    报错 ERROR: Exception on thread Thread[main,5,main],通常是因为手机不兼容 scrcpy 默认的分辨率设置。解决方法是,修改 scrcpy 启动代码,使用较低的分辨率。

    # 三个分辨率设置,任选其一。\n.\\scrcpy -m 1920\n.\\scrcpy -m 1024\n.\\scrcpy -m 800\n

    小米投屏设置

    小米手机的投屏设置与其他手机不同。你需要进入「我的设备」>「全部参数与信息」,然后连续点击多次「OS 版本」,随后返回到「设置」>「更多设置」,才能进入开发者模式。

    在开发者选项中,需要同时启用 USB 调试USB 调试 (安全设置),然后重新启动手机,才能使用 scrcpy 进行投屏。否则,scrcpy 将出现各种报错命令,并无法正常进行投屏操作。

    华为投屏断开

    在华为/荣耀设备上,当切换到无线投屏时,拔掉数据线会导致系统关闭 USB 调试,从而终止投屏。

    解决方案来自 @残荷听雨:「进工程模式,把 usb 调成开发模式,先打开“在充电模式下允许 ADB 调试”,再打开 usb 调试。这样操作后,再拔掉数据线,它就不会自动关闭 usb 调试了。副作用是,“在充电模式下允许 ADB 调试”会自动常开,在网吧等公共区域,仅用数据线充电时就需要手动关掉 usb 调试,防止被黑。」

    投屏没声音

    Android 11 及以上版本支持将音频投屏至电脑。若你的系统版本已满足此要求,但仍未输出声音,建议更换音频解码方式尝试。

    .\\scrcpy --audio-codec=opus  # default\n.\\scrcpy --audio-codec=aac\n.\\scrcpy --audio-codec=raw\n

    输入法问题

    英文输入法及主流中文输入法均可正常使用。如中文输入出现问题,建议复制后再粘贴。

    投屏模糊

    如果屏幕设置了缩放比例,可能导致投屏界面模糊。为解决此问题,请右键单击 scrcpy.exe,选择「属性」>「兼容性」>「更改高 DPI 设置」,并勾选「替代高 DPI 缩放行为」选项。应用此设置后,投屏效果即可恢复正常。

    解决 scrcpy 投屏模糊
    ',17),h={href:"https://github.com/Genymobile/scrcpy/blob/master/FAQ.md",target:"_blank",rel:"noopener noreferrer"},v={},b=(0,a(9720).c)(v,[["render",function(e,n){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("scrcpy"),(0,s.K2)(a)]),(0,s.mY)(" 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。")]),c,(0,s.QD)("p",null,[(0,s.mY)("本文以 Windows 投屏为例,可以前往官方站点下载 "),(0,s.QD)("a",r,[(0,s.mY)("scrcpy-win64-v2.3.zip"),(0,s.K2)(a)]),(0,s.mY)(",或者使用"),(0,s.QD)("a",i,[(0,s.mY)("国内搬运链接"),(0,s.K2)(a)]),(0,s.mY)("。")]),p,(0,s.QD)("p",null,[(0,s.mY)("如果出现 "),l,(0,s.mY)(" 报错意味着你的手机未被电脑识别。可能是因为电脑上缺少相应的 USB 驱动程序。你可以点击此 "),(0,s.QD)("a",o,[(0,s.mY)("OEM 驱动程序链接"),(0,s.K2)(a)]),(0,s.mY)(" 进行下载。如果列表中没有你的手机品牌,请前往手机官网查找。例如,vivo 的驱动是 "),(0,s.QD)("a",d,[(0,s.mY)("vivo_usb_driver.exe"),(0,s.K2)(a)]),(0,s.mY)(";小米则需要下载"),(0,s.QD)("a",m,[(0,s.mY)("小米解锁工具包"),(0,s.K2)(a)]),(0,s.mY)(",里面包含官方驱动安装程序 MiUsbDriver.exe。")]),u,(0,s.QD)("p",null,[(0,s.mY)("如遇其他问题或错误,请参考 "),(0,s.QD)("a",h,[(0,s.mY)("scrcpy 常见问题解答"),(0,s.K2)(a)]),(0,s.mY)("。")])])}]]),g=JSON.parse('{"path":"/posts/2019-08-26-scrcpy_screen_projection.html","title":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏","lang":"zh-CN","frontmatter":{"title":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏","date":"2019-08-26T00:00:00.000Z","category":["工具"],"tag":["scrcpy","投屏"],"star":true,"order":-26,"description":"scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。 本文以 Windows 投屏为例,可以前往官方站点...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-08-26-scrcpy_screen_projection.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏"}],["meta",{"property":"og:description","content":"scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。 本文以 Windows 投屏为例,可以前往官方站点..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20190829093407.png \\"scrcpy 命令行截图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"scrcpy"}],["meta",{"property":"article:tag","content":"投屏"}],["meta",{"property":"article:published_time","content":"2019-08-26T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏\\",\\"image\\":[\\"https://img.newzone.top/20190829093407.png \\\\\\"scrcpy 命令行截图\\\\\\"\\",\\"https://img.newzone.top/20190829095640.png \\\\\\"解决 scrcpy 投屏模糊\\\\\\"\\"],\\"datePublished\\":\\"2019-08-26T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"有线投屏","slug":"有线投屏","link":"#有线投屏","children":[]},{"level":2,"title":"无线投屏","slug":"无线投屏","link":"#无线投屏","children":[]},{"level":2,"title":"屏幕录制","slug":"屏幕录制","link":"#屏幕录制","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"错误检查","slug":"错误检查","link":"#错误检查","children":[]},{"level":3,"title":"Could not find any ADB device","slug":"could-not-find-any-adb-device","link":"#could-not-find-any-adb-device","children":[]},{"level":3,"title":"ERROR: Exception on thread","slug":"error-exception-on-thread","link":"#error-exception-on-thread","children":[]},{"level":3,"title":"小米投屏设置","slug":"小米投屏设置","link":"#小米投屏设置","children":[]},{"level":3,"title":"华为投屏断开","slug":"华为投屏断开","link":"#华为投屏断开","children":[]},{"level":3,"title":"投屏没声音","slug":"投屏没声音","link":"#投屏没声音","children":[]},{"level":3,"title":"输入法问题","slug":"输入法问题","link":"#输入法问题","children":[]},{"level":3,"title":"投屏模糊","slug":"投屏模糊","link":"#投屏模糊","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":18}]},"readingTime":{"minutes":5.55,"words":1666},"filePathRelative":"_posts/2019-08-26-scrcpy_screen_projection.md","localizedDate":"2019年8月26日","excerpt":"

    scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。

    \\n

    市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。

    \\n

    本文以 Windows 投屏为例,可以前往官方站点下载 scrcpy-win64-v2.3.zip,或者使用国内搬运链接

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6762],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},2955:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>b,data:()=>k});var s=a(7847);const t={href:"https://github.com/Genymobile/scrcpy",target:"_blank",rel:"noopener noreferrer"},c=(0,s.Lk)("p",null,"市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。",-1),r={href:"https://github.com/Genymobile/scrcpy/releases/download/v2.3/scrcpy-win64-v2.3.zip",target:"_blank",rel:"noopener noreferrer"},i={href:"https://wwva.lanzouq.com/iRD6J1fzo7tc",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Fv)('

    有线投屏

    1. 下载并解压 scrcpy。
    2. 在手机上启用 开发者选项USB 调试。要开启开发者选项,通常需要点击手机上的「设置/系统」>「关于手机」,然后连续点击版本号七次。返回上一屏幕后,你将在底部找到开发者选项。
    3. 使用数据线连接手机和电脑。手机上会弹出一个授权请求,请选择「允许 USB 调试」。
    4. 双击已解压的 scrcpy.exe 文件,即可开始有线投屏。

    若需在手机黑屏时继续投屏,请按以下步骤操作:当手机屏幕亮起并解锁后,连接至电脑,然后输入命令 .\\scrcpy --turn-screen-off。此操作会关闭手机屏幕,但投屏功能继续正常运行。

    无线投屏

    无线投屏的前提是,电脑和手机处于同一局域网中。

    有线投屏中的前三步也适用于无线投屏,完成这些步骤后,打开 PowerShell(~ cmd),依次输入操作命令。

    # a.将命令目录切换到 scrcpy 文件夹。如果使用的是 Windows 11,在 scrcpy 文件夹中右键点击「在终端中打开」,会自动切换到当前路径。\ncd D:\\Libraries\\Desktop\\scrcpy-win64-v2.3\n​\n# b.在手机端开启「开发者选项」和「USB 调试」,然后使用数据线将手机和电脑连接,并允许 USB 调试,开启手机端口。\n.\\adb tcpip 5555\n\n# 如果本行显示 no device 或未启动 adb,需检查「USB 调试」是否开启,或更换数据线。\n# 此外,一些手机需选择「文件传输」模式方能使用 adb。\n​\n# c.拔出手机数据线,开始无线投屏。(192.168.2.20 为手机端的 WIFI 局域网 ip,需更改)\n.\\adb connect 192.168.2.20:5555\n​\n# d.启动 scrcpy.exe\n.\\scrcpy\n\n# 如果出现错误或延迟较大,可以指定低分辨率投屏。\n.\\scrcpy -m 1024\n# 连接多个设备会出现报错 `failed to get feature set: more than one device/emulator`,此时需要指定连接 tcpip 设备。\n.\\scrcpy -e -m 1024\n# 简化操作:合并步骤 c 和 d,保持屏幕常亮,指定 1024 分辨率。\n.\\scrcpy --tcpip=192.168.2.20 -w -m 1024\n\n# Android 12 以上的设备可使用相机投屏\n.\\scrcpy --video-source=camera\n
    scrcpy 命令行截图

    屏幕录制

    如果想在投屏的同时,对手机屏幕进行录制,可以输入下方命令进行操作。

    # 将命令目录切换到 scrcpy 文件夹。\ncd D:\\Libraries\\Desktop\\scrcpy-win64-v2.3\n​\n# 开始录制,录屏文件会自动保存在当前文件夹内,文件名为指定的文件名。\n.\\scrcpy -r filename.mp4\n​\n# 关闭投屏窗口后,自动停止录屏并将视频保存在相应的目录中。\n

    常见问题

    错误检查

    遇到报错时,检查下列三种情况,可以解决 90% 的错误:

    • 更换数据线;
    • 检查手机的「本机 IP」是否正确;
    • 核对有线连接步骤,选择「开启 USB 调试」>「连接手机与电脑」>「启动 scrcpy」。

    Could not find any ADB device

    ',16),l=(0,s.Lk)("code",null,"ERROR: Could not find any ADB device",-1),o={href:"https://developer.android.com/studio/run/oem-usb?hl=zh-cn#Drivers",target:"_blank",rel:"noopener noreferrer"},d={href:"http://zs.vivo.com.cn/download.php?sel_type=2",target:"_blank",rel:"noopener noreferrer"},u={href:"http://www.miui.com/unlock/download.html",target:"_blank",rel:"noopener noreferrer"},m=(0,s.Fv)('

    ERROR: Exception on thread

    报错 ERROR: Exception on thread Thread[main,5,main],通常是因为手机不兼容 scrcpy 默认的分辨率设置。解决方法是,修改 scrcpy 启动代码,使用较低的分辨率。

    # 三个分辨率设置,任选其一。\n.\\scrcpy -m 1920\n.\\scrcpy -m 1024\n.\\scrcpy -m 800\n

    小米投屏设置

    小米手机的投屏设置与其他手机不同。你需要进入「我的设备」>「全部参数与信息」,然后连续点击多次「OS 版本」,随后返回到「设置」>「更多设置」,才能进入开发者模式。

    在开发者选项中,需要同时启用 USB 调试USB 调试 (安全设置),然后重新启动手机,才能使用 scrcpy 进行投屏。否则,scrcpy 将出现各种报错命令,并无法正常进行投屏操作。

    华为投屏断开

    在华为/荣耀设备上,当切换到无线投屏时,拔掉数据线会导致系统关闭 USB 调试,从而终止投屏。

    解决方案来自 @残荷听雨:「进工程模式,把 usb 调成开发模式,先打开“在充电模式下允许 ADB 调试”,再打开 usb 调试。这样操作后,再拔掉数据线,它就不会自动关闭 usb 调试了。副作用是,“在充电模式下允许 ADB 调试”会自动常开,在网吧等公共区域,仅用数据线充电时就需要手动关掉 usb 调试,防止被黑。」

    投屏没声音

    Android 11 及以上版本支持将音频投屏至电脑。若你的系统版本已满足此要求,但仍未输出声音,建议更换音频解码方式尝试。

    .\\scrcpy --audio-codec=opus  # default\n.\\scrcpy --audio-codec=aac\n.\\scrcpy --audio-codec=raw\n

    输入法问题

    英文输入法及主流中文输入法均可正常使用。如中文输入出现问题,建议复制后再粘贴。

    投屏模糊

    如果屏幕设置了缩放比例,可能导致投屏界面模糊。为解决此问题,请右键单击 scrcpy.exe,选择「属性」>「兼容性」>「更改高 DPI 设置」,并勾选「替代高 DPI 缩放行为」选项。应用此设置后,投屏效果即可恢复正常。

    解决 scrcpy 投屏模糊
    ',17),h={href:"https://github.com/Genymobile/scrcpy/blob/master/FAQ.md",target:"_blank",rel:"noopener noreferrer"},v={},b=(0,a(3671).A)(v,[["render",function(e,n){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("scrcpy"),(0,s.bF)(a)]),(0,s.eW)(" 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。")]),c,(0,s.Lk)("p",null,[(0,s.eW)("本文以 Windows 投屏为例,可以前往官方站点下载 "),(0,s.Lk)("a",r,[(0,s.eW)("scrcpy-win64-v2.3.zip"),(0,s.bF)(a)]),(0,s.eW)(",或者使用"),(0,s.Lk)("a",i,[(0,s.eW)("国内搬运链接"),(0,s.bF)(a)]),(0,s.eW)("。")]),p,(0,s.Lk)("p",null,[(0,s.eW)("如果出现 "),l,(0,s.eW)(" 报错意味着你的手机未被电脑识别。可能是因为电脑上缺少相应的 USB 驱动程序。你可以点击此 "),(0,s.Lk)("a",o,[(0,s.eW)("OEM 驱动程序链接"),(0,s.bF)(a)]),(0,s.eW)(" 进行下载。如果列表中没有你的手机品牌,请前往手机官网查找。例如,vivo 的驱动是 "),(0,s.Lk)("a",d,[(0,s.eW)("vivo_usb_driver.exe"),(0,s.bF)(a)]),(0,s.eW)(";小米则需要下载"),(0,s.Lk)("a",u,[(0,s.eW)("小米解锁工具包"),(0,s.bF)(a)]),(0,s.eW)(",里面包含官方驱动安装程序 MiUsbDriver.exe。")]),m,(0,s.Lk)("p",null,[(0,s.eW)("如遇其他问题或错误,请参考 "),(0,s.Lk)("a",h,[(0,s.eW)("scrcpy 常见问题解答"),(0,s.bF)(a)]),(0,s.eW)("。")])])}]]),k=JSON.parse('{"path":"/posts/2019-08-26-scrcpy_screen_projection.html","title":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏","lang":"zh-CN","frontmatter":{"title":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏","date":"2019-08-26T00:00:00.000Z","category":["工具"],"tag":["scrcpy","投屏"],"star":true,"order":-26,"description":"scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。 本文以 Windows 投屏为例,可以前往官方站点...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-08-26-scrcpy_screen_projection.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏"}],["meta",{"property":"og:description","content":"scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。 本文以 Windows 投屏为例,可以前往官方站点..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20190829093407.png \\"scrcpy 命令行截图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"scrcpy"}],["meta",{"property":"article:tag","content":"投屏"}],["meta",{"property":"article:published_time","content":"2019-08-26T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏\\",\\"image\\":[\\"https://img.newzone.top/20190829093407.png \\\\\\"scrcpy 命令行截图\\\\\\"\\",\\"https://img.newzone.top/20190829095640.png \\\\\\"解决 scrcpy 投屏模糊\\\\\\"\\"],\\"datePublished\\":\\"2019-08-26T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"有线投屏","slug":"有线投屏","link":"#有线投屏","children":[]},{"level":2,"title":"无线投屏","slug":"无线投屏","link":"#无线投屏","children":[]},{"level":2,"title":"屏幕录制","slug":"屏幕录制","link":"#屏幕录制","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"错误检查","slug":"错误检查","link":"#错误检查","children":[]},{"level":3,"title":"Could not find any ADB device","slug":"could-not-find-any-adb-device","link":"#could-not-find-any-adb-device","children":[]},{"level":3,"title":"ERROR: Exception on thread","slug":"error-exception-on-thread","link":"#error-exception-on-thread","children":[]},{"level":3,"title":"小米投屏设置","slug":"小米投屏设置","link":"#小米投屏设置","children":[]},{"level":3,"title":"华为投屏断开","slug":"华为投屏断开","link":"#华为投屏断开","children":[]},{"level":3,"title":"投屏没声音","slug":"投屏没声音","link":"#投屏没声音","children":[]},{"level":3,"title":"输入法问题","slug":"输入法问题","link":"#输入法问题","children":[]},{"level":3,"title":"投屏模糊","slug":"投屏模糊","link":"#投屏模糊","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":18}]},"readingTime":{"minutes":5.55,"words":1666},"filePathRelative":"_posts/2019-08-26-scrcpy_screen_projection.md","localizedDate":"2019年8月26日","excerpt":"

    scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。

    \\n

    市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。

    \\n

    本文以 Windows 投屏为例,可以前往官方站点下载 scrcpy-win64-v2.3.zip,或者使用国内搬运链接

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-bb40c934.de206c05.js b/assets/js/2019-10-04-fake_aka_hospital_skin_care_products.html.87bd501b.js similarity index 88% rename from assets/js/v-bb40c934.de206c05.js rename to assets/js/2019-10-04-fake_aka_hospital_skin_care_products.html.87bd501b.js index e8b41d6f3..d3a5f3605 100644 --- a/assets/js/v-bb40c934.de206c05.js +++ b/assets/js/2019-10-04-fake_aka_hospital_skin_care_products.html.87bd501b.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5492],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6216:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>m,data:()=>h});var n=a(3968);const p=(0,n.IL)('

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    协和

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    协和维生素 e 乳是网红大爆款,同名但不同厂家的超过五款,包装类似的更是不下二十款,完全分不清李鬼还是李逵。

    精心

    精心由「北京协和医院」的全资子公司「北京协和精细化学制品有限公司」出品,暂列为可信。根据精心旗舰店的授权说明,其他「协和 XX」都与北京协和医院无关。

    使用精心产品后,个人评价一般,并没感受到医院的科技加成。

    爱心 301

    爱心 301 打着 301 的抬头,包装盒甚至有「解放军总医院监制」,但背后的「北京市时代美业科技有限责任公司」是自然人独资企业,跟 301 没有关系。

    目前生产爱心 301 产品的公司是北京时代美业科技有限公司,其工商信息显示,该法定代表人也是唯一最终受益人均是陈某某,而陈某某没有解放军总医院(301 医院)的任职信息。 健康时报记者拨打解放军总医院(301 医院)总机,一名工作人员告诉健康时报记者,爱心 301 产品和 301 医院没有任何关系;医院一名皮肤科医生也告知记者两者无关。

    ',14),o={href:"http://paper.people.com.cn/jksb/html/2019-06/28/content_1936727.htm",target:"_blank",rel:"noopener noreferrer"},r=(0,n.QD)("h2",{id:"肤倍佳",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#肤倍佳"},[(0,n.QD)("span",null,"肤倍佳")])],-1),i=(0,n.QD)("p",null,"打着「中国医学科学院整形外科医院」的名号,但被医院发声明说是冒用。",-1),l=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-05-05-14-02-49.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption")],-1),c={href:"http://www.zhengxing.com.cn/ArticleShow4145.aspx",target:"_blank",rel:"noopener noreferrer"},g=(0,n.IL)('

    肤倍佳背后的「北京臻馨芳草科技发展有限公司」于 2014 年 4 月 3 日成立,并于 2019 年 7 月 15 日注册资本从 10 万元变更为 1000 万元。2014 年到 2019 年,「肤倍佳」这 5 年间的公司资本都只有 10 万元,这是一家护肤品企业的注册资本?而其法人也是一直在高 XX、张 XX 间交替变换。

    京卫本草

    京卫本草背后公司为「北京华风时代化妆品有限公司」,股东都为自然人,无医院或单位股东。国家食品药品监督管理总局上用京卫本草都无法搜索到相关产品备案。京卫本草官网上甚至带有 Windows 未激活水印。

    总结

    医院开的大都是医疗用品,没有处方是无法购买的。所谓北京医院、301 医院出的医用护肤品都必须去医院才能买到,网上购买是非常不靠谱的。

    第一次用的护肤品,一定要去「国家食品药品监督管理总局」进行查询,查询入口分别为 国产特殊用途化妆品 和 国产非特殊用途化妆品。

    依据《化妆品卫生监督条例》,我国将化妆品分为特殊用途化妆品及非特殊用途化妆品(2007 年之前称为普通化妆品),特殊用途化妆品是指用于育发、染发、烫发、脱毛、美乳、健美、除臭、祛斑、防晒等的化妆品,特殊用途化妆品必须要有国妆特字批号才能进行销售。

    ',8),s={},m=(0,a(9720).c)(s,[["render",function(e,t){const a=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[p,(0,n.QD)("p",null,[(0,n.mY)("以上引用自健康时报 2019 年 06 月 28 日,"),(0,n.QD)("a",o,[(0,n.mY)("神秘的“北京 301”祛斑团队"),(0,n.K2)(a)]),(0,n.mY)("。")]),r,i,l,(0,n.QD)("p",null,[(0,n.QD)("s",null,[(0,n.mY)("声明链接(已删除):"),(0,n.QD)("a",c,[(0,n.mY)("http://www.zhengxing.com.cn/ArticleShow4145.aspx"),(0,n.K2)(a)])])]),g])}]]),h=JSON.parse('{"path":"/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","title":"这些「医院护肤品」你买了吗?","lang":"zh-CN","frontmatter":{"title":"这些「医院护肤品」你买了吗?","date":"2019-10-04T00:00:00.000Z","category":["购物"],"tag":["化妆品"],"order":-27,"description":"日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。 这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗? 协和 一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。 京东淘宝均有...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-10-04-fake_aka_hospital_skin_care_products.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"这些「医院护肤品」你买了吗?"}],["meta",{"property":"og:description","content":"日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。 这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗? 协和 一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。 京东淘宝均有..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-14-02-27.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"这些「医院护肤品」你买了吗?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"化妆品"}],["meta",{"property":"article:published_time","content":"2019-10-04T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"这些「医院护肤品」你买了吗?\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-14-02-27.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20191004143812.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-02-49.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20191004135719.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2019-10-04T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"协和","slug":"协和","link":"#协和","children":[]},{"level":2,"title":"精心","slug":"精心","link":"#精心","children":[]},{"level":2,"title":"爱心 301","slug":"爱心-301","link":"#爱心-301","children":[]},{"level":2,"title":"肤倍佳","slug":"肤倍佳","link":"#肤倍佳","children":[]},{"level":2,"title":"京卫本草","slug":"京卫本草","link":"#京卫本草","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":3.68,"words":1103},"filePathRelative":"_posts/2019-10-04-fake_aka_hospital_skin_care_products.md","localizedDate":"2019年10月4日","excerpt":"

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    \\n

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    \\n

    协和

    \\n

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    \\n

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1471],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},7967:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>h,data:()=>m});var n=a(7847);const p=(0,n.Fv)('

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    协和

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    协和维生素 e 乳是网红大爆款,同名但不同厂家的超过五款,包装类似的更是不下二十款,完全分不清李鬼还是李逵。

    精心

    精心由「北京协和医院」的全资子公司「北京协和精细化学制品有限公司」出品,暂列为可信。根据精心旗舰店的授权说明,其他「协和 XX」都与北京协和医院无关。

    使用精心产品后,个人评价一般,并没感受到医院的科技加成。

    爱心 301

    爱心 301 打着 301 的抬头,包装盒甚至有「解放军总医院监制」,但背后的「北京市时代美业科技有限责任公司」是自然人独资企业,跟 301 没有关系。

    目前生产爱心 301 产品的公司是北京时代美业科技有限公司,其工商信息显示,该法定代表人也是唯一最终受益人均是陈某某,而陈某某没有解放军总医院(301 医院)的任职信息。 健康时报记者拨打解放军总医院(301 医院)总机,一名工作人员告诉健康时报记者,爱心 301 产品和 301 医院没有任何关系;医院一名皮肤科医生也告知记者两者无关。

    ',14),o={href:"http://paper.people.com.cn/jksb/html/2019-06/28/content_1936727.htm",target:"_blank",rel:"noopener noreferrer"},r=(0,n.Lk)("h2",{id:"肤倍佳",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#肤倍佳"},[(0,n.Lk)("span",null,"肤倍佳")])],-1),i=(0,n.Lk)("p",null,"打着「中国医学科学院整形外科医院」的名号,但被医院发声明说是冒用。",-1),l=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-05-05-14-02-49.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption")],-1),c={href:"http://www.zhengxing.com.cn/ArticleShow4145.aspx",target:"_blank",rel:"noopener noreferrer"},g=(0,n.Fv)('

    肤倍佳背后的「北京臻馨芳草科技发展有限公司」于 2014 年 4 月 3 日成立,并于 2019 年 7 月 15 日注册资本从 10 万元变更为 1000 万元。2014 年到 2019 年,「肤倍佳」这 5 年间的公司资本都只有 10 万元,这是一家护肤品企业的注册资本?而其法人也是一直在高 XX、张 XX 间交替变换。

    京卫本草

    京卫本草背后公司为「北京华风时代化妆品有限公司」,股东都为自然人,无医院或单位股东。国家食品药品监督管理总局上用京卫本草都无法搜索到相关产品备案。京卫本草官网上甚至带有 Windows 未激活水印。

    总结

    医院开的大都是医疗用品,没有处方是无法购买的。所谓北京医院、301 医院出的医用护肤品都必须去医院才能买到,网上购买是非常不靠谱的。

    第一次用的护肤品,一定要去「国家食品药品监督管理总局」进行查询,查询入口分别为 国产特殊用途化妆品 和 国产非特殊用途化妆品。

    依据《化妆品卫生监督条例》,我国将化妆品分为特殊用途化妆品及非特殊用途化妆品(2007 年之前称为普通化妆品),特殊用途化妆品是指用于育发、染发、烫发、脱毛、美乳、健美、除臭、祛斑、防晒等的化妆品,特殊用途化妆品必须要有国妆特字批号才能进行销售。

    ',8),s={},h=(0,a(3671).A)(s,[["render",function(e,t){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[p,(0,n.Lk)("p",null,[(0,n.eW)("以上引用自健康时报 2019 年 06 月 28 日,"),(0,n.Lk)("a",o,[(0,n.eW)("神秘的“北京 301”祛斑团队"),(0,n.bF)(a)]),(0,n.eW)("。")]),r,i,l,(0,n.Lk)("p",null,[(0,n.Lk)("s",null,[(0,n.eW)("声明链接(已删除):"),(0,n.Lk)("a",c,[(0,n.eW)("http://www.zhengxing.com.cn/ArticleShow4145.aspx"),(0,n.bF)(a)])])]),g])}]]),m=JSON.parse('{"path":"/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","title":"这些「医院护肤品」你买了吗?","lang":"zh-CN","frontmatter":{"title":"这些「医院护肤品」你买了吗?","date":"2019-10-04T00:00:00.000Z","category":["购物"],"tag":["化妆品"],"order":-27,"description":"日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。 这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗? 协和 一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。 京东淘宝均有...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-10-04-fake_aka_hospital_skin_care_products.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"这些「医院护肤品」你买了吗?"}],["meta",{"property":"og:description","content":"日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。 这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗? 协和 一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。 京东淘宝均有..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-14-02-27.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"这些「医院护肤品」你买了吗?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"化妆品"}],["meta",{"property":"article:published_time","content":"2019-10-04T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"这些「医院护肤品」你买了吗?\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-14-02-27.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20191004143812.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-02-49.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20191004135719.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2019-10-04T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"协和","slug":"协和","link":"#协和","children":[]},{"level":2,"title":"精心","slug":"精心","link":"#精心","children":[]},{"level":2,"title":"爱心 301","slug":"爱心-301","link":"#爱心-301","children":[]},{"level":2,"title":"肤倍佳","slug":"肤倍佳","link":"#肤倍佳","children":[]},{"level":2,"title":"京卫本草","slug":"京卫本草","link":"#京卫本草","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":3.68,"words":1103},"filePathRelative":"_posts/2019-10-04-fake_aka_hospital_skin_care_products.md","localizedDate":"2019年10月4日","excerpt":"

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    \\n

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    \\n

    协和

    \\n

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    \\n

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5913597a.602547b0.js b/assets/js/2020-03-25-rsshub_on_vps.html.84b3635e.js similarity index 63% rename from assets/js/v-5913597a.602547b0.js rename to assets/js/2020-03-25-rsshub_on_vps.html.84b3635e.js index 79eef0a02..bbbd05d18 100644 --- a/assets/js/v-5913597a.602547b0.js +++ b/assets/js/2020-03-25-rsshub_on_vps.html.84b3635e.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[608],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},1968:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>v,data:()=>P});var r=n(3968);const l=(0,r.QD)("p",null,[(0,r.mY)("RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好"),(0,r.QD)("strong",null,"域名和服务器"),(0,r.mY)("。")],-1),o=(0,r.QD)("p",null,"新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。",-1),i=(0,r.QD)("h2",{id:"部署步骤",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#部署步骤"},[(0,r.QD)("span",null,"部署步骤")])],-1),a=(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("将 RSSHub 代码下载到根目录 root,执行命令 "),(0,r.QD)("code",null,"git clone https://github.com/DIYgod/RSSHub.git"),(0,r.mY)("。")])],-1),p={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},s=(0,r.IL)('
  • 登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

  • 点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

  • 添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

  • ',3),u=(0,r.QD)("p",null,[(0,r.mY)("程序运行时,如果遇到报错,可以直接用命令运行 pm2,如 "),(0,r.QD)("code",null,"pm2 start /root/RSSHub/lib/index.js --name rsshub"),(0,r.mY)("。")],-1),g=(0,r.QD)("h2",{id:"使用步骤",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#使用步骤"},[(0,r.QD)("span",null,"使用步骤")])],-1),m={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},c=(0,r.QD)("code",null,"https://rsshub.app/bilibili/bangumi/media/9192",-1),b=(0,r.QD)("code",null,"https://rsshub.app",-1),S=(0,r.QD)("code",null,"http://rsshub.xxx.com/bilibili/bangumi/media/9192",-1),d=(0,r.QD)("code",null,"mode=fulltext",-1),f=(0,r.QD)("code",null,"https://rsshub.xxx.com/guokr/scientific?mode=fulltext",-1),D={href:"https://docs.rsshub.app/parameter.html",target:"_blank",rel:"noopener noreferrer"},Q=(0,r.QD)("h2",{id:"rsshub-vs-huginn",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#rsshub-vs-huginn"},[(0,r.QD)("span",null,"RSSHub VS. Huginn")])],-1),R=(0,r.QD)("ul",null,[(0,r.QD)("li",null,"RSSHub:使用简单,使用现成的抓取规则,适用于国内主流网站;但无法抓取对小众网站,必须 RSSHub 官方定制订阅源。"),(0,r.QD)("li",null,"Huginn:适用于所有网站,可设定抓取频率、内容结构、js 结果、输出样式等;但部署、配置复杂,入门门槛高,需要针对网站单独定制抓取规则。")],-1),H=(0,r.QD)("h2",{id:"rss-合集",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#rss-合集"},[(0,r.QD)("span",null,"RSS 合集")])],-1),_=(0,r.QD)("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),w={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},z={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},M={},v=(0,n(9720).c)(M,[["render",function(e,t){const n=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[l,o,i,(0,r.QD)("ol",null,[a,(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("安装宝塔面板,查看"),(0,r.QD)("a",p,[(0,r.mY)("官方安装教程"),(0,r.K2)(n)]),(0,r.mY)("。")])]),s]),u,g,(0,r.QD)("ol",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("打开 "),(0,r.QD)("a",m,[(0,r.mY)("RSSHub 接口指南"),(0,r.K2)(n)]),(0,r.mY)(",搜索需要订阅的网站。RSSHub 支持国内大部分的主流网站。")])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("根据 "),(0,r.QD)("a",h,[(0,r.mY)("bilibili 番剧路由"),(0,r.K2)(n)]),(0,r.mY)("的文档,将生成源 "),c,(0,r.mY)(" 其中的域名 "),b,(0,r.mY)(" 替换为你自部署的域名,如 "),S,(0,r.mY)("。")])])]),(0,r.QD)("p",null,[(0,r.mY)("另外 RSSHub 支持很多实用的参数,比如内容过滤、全文输出等。全文输出参数为 "),d,(0,r.mY)(",应用举例:果壳科学人全文输出 "),f,(0,r.mY)("。其他可以在"),(0,r.QD)("a",D,[(0,r.mY)("通用参数"),(0,r.K2)(n)]),(0,r.mY)("官方文档了解具体使用方法。")]),Q,R,H,_,(0,r.QD)("ul",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",w,[(0,r.mY)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",Y,[(0,r.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",x,[(0,r.mY)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",z,[(0,r.mY)("RSS 速成篇 2:RSSHub 自部署"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",y,[(0,r.mY)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,r.K2)(n)])])]),(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.QD)("a",k,[(0,r.mY)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,r.K2)(n)])])])])])}]]),P=JSON.parse('{"path":"/posts/2020-03-25-rsshub_on_vps.html","title":"RSS 速成篇 2:RSSHub 自部署","lang":"zh-CN","frontmatter":{"title":"RSS 速成篇 2:RSSHub 自部署","date":"2020-03-25T00:00:00.000Z","category":["自动化"],"tag":["rss","RSSHub"],"order":-28,"description":"RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器。 新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。 部署步骤 将 RSSHub 代码下载到根目录 root,执行命令 git clone https://g...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 速成篇 2:RSSHub 自部署"}],["meta",{"property":"og:description","content":"RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器。 新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。 部署步骤 将 RSSHub 代码下载到根目录 root,执行命令 git clone https://g..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20200325120705.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 速成篇 2:RSSHub 自部署"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:tag","content":"RSSHub"}],["meta",{"property":"article:published_time","content":"2020-03-25T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 速成篇 2:RSSHub 自部署\\",\\"image\\":[\\"https://img.newzone.top/20200325120705.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200325121639.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200325121921.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2020-03-25T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"部署步骤","slug":"部署步骤","link":"#部署步骤","children":[]},{"level":2,"title":"使用步骤","slug":"使用步骤","link":"#使用步骤","children":[]},{"level":2,"title":"RSSHub VS. Huginn","slug":"rsshub-vs-huginn","link":"#rsshub-vs-huginn","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":2.3,"words":689},"filePathRelative":"_posts/2020-03-25-rsshub_on_vps.md","localizedDate":"2020年3月25日","excerpt":"

    RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器

    \\n

    新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。

    \\n

    部署步骤

    \\n
      \\n
    1. \\n

      将 RSSHub 代码下载到根目录 root,执行命令 git clone https://github.com/DIYgod/RSSHub.git

      \\n
    2. \\n
    3. \\n

      安装宝塔面板,查看官方安装教程

      \\n
    4. \\n
    5. \\n

      登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

      点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

      \\n
      \\"\\"
      \\n
    8. \\n
    9. \\n

      添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

      \\n
      \\"\\"
      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4552],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},993:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>P,data:()=>F});var r=n(7847);const l=(0,r.Lk)("p",null,[(0,r.eW)("RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好"),(0,r.Lk)("strong",null,"域名和服务器"),(0,r.eW)("。")],-1),o=(0,r.Lk)("p",null,"新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。",-1),i=(0,r.Lk)("h2",{id:"部署步骤",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#部署步骤"},[(0,r.Lk)("span",null,"部署步骤")])],-1),a=(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("将 RSSHub 代码下载到根目录 root,执行命令 "),(0,r.Lk)("code",null,"git clone https://github.com/DIYgod/RSSHub.git"),(0,r.eW)("。")])],-1),p={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},s=(0,r.Fv)('
  • 登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

  • 点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

  • 添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

  • ',3),u=(0,r.Lk)("p",null,[(0,r.eW)("程序运行时,如果遇到报错,可以直接用命令运行 pm2,如 "),(0,r.Lk)("code",null,"pm2 start /root/RSSHub/lib/index.js --name rsshub"),(0,r.eW)("。")],-1),g=(0,r.Lk)("h2",{id:"使用步骤",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#使用步骤"},[(0,r.Lk)("span",null,"使用步骤")])],-1),b={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},c=(0,r.Lk)("code",null,"https://rsshub.app/bilibili/bangumi/media/9192",-1),S=(0,r.Lk)("code",null,"https://rsshub.app",-1),m=(0,r.Lk)("code",null,"http://rsshub.xxx.com/bilibili/bangumi/media/9192",-1),d=(0,r.Lk)("code",null,"mode=fulltext",-1),k=(0,r.Lk)("code",null,"https://rsshub.xxx.com/guokr/scientific?mode=fulltext",-1),f={href:"https://docs.rsshub.app/parameter.html",target:"_blank",rel:"noopener noreferrer"},L=(0,r.Lk)("h2",{id:"rsshub-vs-huginn",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#rsshub-vs-huginn"},[(0,r.Lk)("span",null,"RSSHub VS. Huginn")])],-1),R=(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,"RSSHub:使用简单,使用现成的抓取规则,适用于国内主流网站;但无法抓取对小众网站,必须 RSSHub 官方定制订阅源。"),(0,r.Lk)("li",null,"Huginn:适用于所有网站,可设定抓取频率、内容结构、js 结果、输出样式等;但部署、配置复杂,入门门槛高,需要针对网站单独定制抓取规则。")],-1),H=(0,r.Lk)("h2",{id:"rss-合集",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#rss-合集"},[(0,r.Lk)("span",null,"RSS 合集")])],-1),_=(0,r.Lk)("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),w={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},W={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},z={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},M={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},v={},P=(0,n(3671).A)(v,[["render",function(e,t){const n=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[l,o,i,(0,r.Lk)("ol",null,[a,(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("安装宝塔面板,查看"),(0,r.Lk)("a",p,[(0,r.eW)("官方安装教程"),(0,r.bF)(n)]),(0,r.eW)("。")])]),s]),u,g,(0,r.Lk)("ol",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("打开 "),(0,r.Lk)("a",b,[(0,r.eW)("RSSHub 接口指南"),(0,r.bF)(n)]),(0,r.eW)(",搜索需要订阅的网站。RSSHub 支持国内大部分的主流网站。")])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("根据 "),(0,r.Lk)("a",h,[(0,r.eW)("bilibili 番剧路由"),(0,r.bF)(n)]),(0,r.eW)("的文档,将生成源 "),c,(0,r.eW)(" 其中的域名 "),S,(0,r.eW)(" 替换为你自部署的域名,如 "),m,(0,r.eW)("。")])])]),(0,r.Lk)("p",null,[(0,r.eW)("另外 RSSHub 支持很多实用的参数,比如内容过滤、全文输出等。全文输出参数为 "),d,(0,r.eW)(",应用举例:果壳科学人全文输出 "),k,(0,r.eW)("。其他可以在"),(0,r.Lk)("a",f,[(0,r.eW)("通用参数"),(0,r.bF)(n)]),(0,r.eW)("官方文档了解具体使用方法。")]),L,R,H,_,(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",w,[(0,r.eW)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",x,[(0,r.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",W,[(0,r.eW)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",z,[(0,r.eW)("RSS 速成篇 2:RSSHub 自部署"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",y,[(0,r.eW)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,r.bF)(n)])])]),(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",M,[(0,r.eW)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,r.bF)(n)])])])])])}]]),F=JSON.parse('{"path":"/posts/2020-03-25-rsshub_on_vps.html","title":"RSS 速成篇 2:RSSHub 自部署","lang":"zh-CN","frontmatter":{"title":"RSS 速成篇 2:RSSHub 自部署","date":"2020-03-25T00:00:00.000Z","category":["自动化"],"tag":["rss","RSSHub"],"order":-28,"description":"RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器。 新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。 部署步骤 将 RSSHub 代码下载到根目录 root,执行命令 git clone https://g...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 速成篇 2:RSSHub 自部署"}],["meta",{"property":"og:description","content":"RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器。 新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。 部署步骤 将 RSSHub 代码下载到根目录 root,执行命令 git clone https://g..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20200325120705.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 速成篇 2:RSSHub 自部署"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:tag","content":"RSSHub"}],["meta",{"property":"article:published_time","content":"2020-03-25T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 速成篇 2:RSSHub 自部署\\",\\"image\\":[\\"https://img.newzone.top/20200325120705.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200325121639.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200325121921.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2020-03-25T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"部署步骤","slug":"部署步骤","link":"#部署步骤","children":[]},{"level":2,"title":"使用步骤","slug":"使用步骤","link":"#使用步骤","children":[]},{"level":2,"title":"RSSHub VS. Huginn","slug":"rsshub-vs-huginn","link":"#rsshub-vs-huginn","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":2.3,"words":689},"filePathRelative":"_posts/2020-03-25-rsshub_on_vps.md","localizedDate":"2020年3月25日","excerpt":"

    RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器

    \\n

    新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。

    \\n

    部署步骤

    \\n
      \\n
    1. \\n

      将 RSSHub 代码下载到根目录 root,执行命令 git clone https://github.com/DIYgod/RSSHub.git

      \\n
    2. \\n
    3. \\n

      安装宝塔面板,查看官方安装教程

      \\n
    4. \\n
    5. \\n

      登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

      点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

      \\n
      \\"\\"
      \\n
    8. \\n
    9. \\n

      添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

      \\n
      \\"\\"
      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2020-09-13-wifi_speed_up.html.4160e09c.js b/assets/js/2020-09-13-wifi_speed_up.html.4160e09c.js new file mode 100644 index 000000000..18bccca5a --- /dev/null +++ b/assets/js/2020-09-13-wifi_speed_up.html.4160e09c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7681],{3671:(t,e)=>{e.A=(t,e)=>{const i=t.__vccOpts||t;for(const[t,n]of e)i[t]=n;return i}},554:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>r,data:()=>o});var n=i(7847);const a=[(0,n.Fv)('

    拖慢 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)],p={},r=(0,i(3671).A)(p,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,a)}]]),o=JSON.parse('{"path":"/posts/2020-09-13-wifi_speed_up.html","title":"无线路由调整,加快 WIFI 速度","lang":"zh-CN","frontmatter":{"title":"无线路由调整,加快 WIFI 速度","date":"2020-09-13T00:00:00.000Z","category":["网络"],"tag":["WIFI"],"order":-29,"description":"拖慢 WIFI 速度的最大元凶是无线信号合并。 「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。 先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-09-13-wifi_speed_up.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"无线路由调整,加快 WIFI 速度"}],["meta",{"property":"og:description","content":"拖慢 WIFI 速度的最大元凶是无线信号合并。 「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。 先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20200913134120.jpg?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"无线路由调整,加快 WIFI 速度"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"WIFI"}],["meta",{"property":"article:published_time","content":"2020-09-13T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"无线路由调整,加快 WIFI 速度\\",\\"image\\":[\\"https://img.newzone.top/20200913134120.jpg?imageMogr2/thumbnail/400x\\"],\\"datePublished\\":\\"2020-09-13T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"无线模式","slug":"无线模式","link":"#无线模式","children":[]},{"level":2,"title":"频道带宽","slug":"频道带宽","link":"#频道带宽","children":[]},{"level":2,"title":"调整信道","slug":"调整信道","link":"#调整信道","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":2.08,"words":623},"filePathRelative":"_posts/2020-09-13-wifi_speed_up.md","localizedDate":"2020年9月13日","excerpt":"

    拖慢 WIFI 速度的最大元凶是无线信号合并

    \\n

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    \\n

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    \\n

    无线模式

    \\n

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5aa07284.397cadeb.js b/assets/js/2020-09-22-uefi_asus_board.html.ca385c07.js similarity index 84% rename from assets/js/v-5aa07284.397cadeb.js rename to assets/js/2020-09-22-uefi_asus_board.html.ca385c07.js index b2a7278cf..10b259357 100644 --- a/assets/js/v-5aa07284.397cadeb.js +++ b/assets/js/2020-09-22-uefi_asus_board.html.ca385c07.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5160],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},7712:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>i,data:()=>c});var n=a(3968);const r=[(0,n.QD)("p",null,"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。",-1),(0,n.QD)("p",null,"电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。",-1),(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"华硕主板设置截图")],-1),(0,n.QD)("p",null,"设置完成后,Win10 就可以正常更新了。",-1),(0,n.QD)("p",null,"有人反馈「改了启动不了系统」,这是由于系统硬件与你新的设置冲突造成的,并不会造成系统破坏。只需重新进入 BIOS,将设置改回或将 BIOS 还原为默认设置,即可进入系统。",-1)],o={},i=(0,a(9720).c)(o,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,r)}]]),c=JSON.parse('{"path":"/posts/2020-09-22-uefi_asus_board.html","title":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案","lang":"zh-CN","frontmatter":{"title":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案","date":"2020-09-22T00:00:00.000Z","category":["系统"],"tag":["主板"],"order":-30,"description":"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。 电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。 华硕主板设置截图 设...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-09-22-uefi_asus_board.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案"}],["meta",{"property":"og:description","content":"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。 电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。 华硕主板设置截图 设..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg \\"华硕主板设置截图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-11-06T15:33:23.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"主板"}],["meta",{"property":"article:published_time","content":"2020-09-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-11-06T15:33:23.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案\\",\\"image\\":[\\"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg \\\\\\"华硕主板设置截图\\\\\\"\\"],\\"datePublished\\":\\"2020-09-22T00:00:00.000Z\\",\\"dateModified\\":\\"2022-11-06T15:33:23.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658762316000,"updatedTime":1667748803000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.73,"words":218},"filePathRelative":"_posts/2020-09-22-uefi_asus_board.md","localizedDate":"2020年9月22日","excerpt":"

    电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。

    \\n

    电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。

    \\n
    \\"\\"
    华硕主板设置截图
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3121],{3671:(t,e)=>{e.A=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},3189:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>i,data:()=>c});var n=a(7847);const r=[(0,n.Lk)("p",null,"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。",-1),(0,n.Lk)("p",null,"电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。",-1),(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"华硕主板设置截图")],-1),(0,n.Lk)("p",null,"设置完成后,Win10 就可以正常更新了。",-1),(0,n.Lk)("p",null,"有人反馈「改了启动不了系统」,这是由于系统硬件与你新的设置冲突造成的,并不会造成系统破坏。只需重新进入 BIOS,将设置改回或将 BIOS 还原为默认设置,即可进入系统。",-1)],o={},i=(0,a(3671).A)(o,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,r)}]]),c=JSON.parse('{"path":"/posts/2020-09-22-uefi_asus_board.html","title":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案","lang":"zh-CN","frontmatter":{"title":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案","date":"2020-09-22T00:00:00.000Z","category":["系统"],"tag":["主板"],"order":-30,"description":"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。 电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。 华硕主板设置截图 设...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-09-22-uefi_asus_board.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案"}],["meta",{"property":"og:description","content":"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。 电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。 华硕主板设置截图 设..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg \\"华硕主板设置截图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-11-06T15:33:23.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"主板"}],["meta",{"property":"article:published_time","content":"2020-09-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-11-06T15:33:23.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案\\",\\"image\\":[\\"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg \\\\\\"华硕主板设置截图\\\\\\"\\"],\\"datePublished\\":\\"2020-09-22T00:00:00.000Z\\",\\"dateModified\\":\\"2022-11-06T15:33:23.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658762316000,"updatedTime":1667748803000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.73,"words":218},"filePathRelative":"_posts/2020-09-22-uefi_asus_board.md","localizedDate":"2020年9月22日","excerpt":"

    电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。

    \\n

    电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。

    \\n
    \\"\\"
    华硕主板设置截图
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4da7cd3a.72fb90f5.js b/assets/js/2020-10-25-dpc_watchdog_violation.html.429ef16d.js similarity index 86% rename from assets/js/v-4da7cd3a.72fb90f5.js rename to assets/js/2020-10-25-dpc_watchdog_violation.html.429ef16d.js index ba86560b0..e03ffcfdf 100644 --- a/assets/js/v-4da7cd3a.72fb90f5.js +++ b/assets/js/2020-10-25-dpc_watchdog_violation.html.429ef16d.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7452],{9720:(e,n)=>{n.c=(e,n)=>{const t=e.__vccOpts||e;for(const[e,i]of n)t[e]=i;return t}},4528:(e,n,t)=>{t.r(n),t.d(n,{comp:()=>b,data:()=>v});var i=t(3968);const o=(0,i.QD)("p",null,"Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。",-1),a=(0,i.QD)("h2",{id:"导出蓝屏日志",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#导出蓝屏日志"},[(0,i.QD)("span",null,"导出蓝屏日志")])],-1),l={href:"https://www.microsoft.com/zh-cn/p/windbg/9pgjgd53tn86?rtc=1&activetab=pivot:overviewtab",target:"_blank",rel:"noopener noreferrer"},r=(0,i.IL)('
  • 启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\\Windows\\Minidump,导出日志 *.dmp

  • 载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

  • 分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

  • ',3),p=(0,i.QD)("h2",{id:"上传社区分析",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#上传社区分析"},[(0,i.QD)("span",null,"上传社区分析")])],-1),d=(0,i.QD)("p",null,"有些蓝屏比较复杂,由多方面的原因造成,新手很难分析。如果你看不懂或者不想分析日志,可以将蓝屏日志完整上传到微软社区,一般几个小时就会有人回复。",-1),s=(0,i.QD)("li",null,[(0,i.mY)("打开文件夹 "),(0,i.QD)("code",null,"C:\\Windows\\Minidump"),(0,i.mY)(",导出日志 "),(0,i.QD)("code",null,"*.dmp"),(0,i.mY)("。")],-1),c={href:"https://answers.microsoft.com/zh-hans/newthread?threadtype=Questions&cancelurl=/zh-hans/windows/forum&forum=windows&filter=",target:"_blank",rel:"noopener noreferrer"},m=(0,i.IL)('

    蓝屏解决方案

    分析完蓝屏日志后,我们得到了具体的蓝屏冲突进程,然后在引擎中搜索该进程名,以确定它是系统模块、驱动还是某个程序。

    系统模块报错

    ntkrnlmp.exe*.symbols.exe 是系统模块,该报错不是蓝屏的底层原因,实际是由应用进程与系统冲突引起的蓝屏,需重新深入分析日志。不要尝试删除系统模块

    驱动冲突

    nvlddmkm.sysamdkmdag.sys 等后缀为 *.sys 的进程报错,多为硬件驱动错误,可通过回退驱动来解决。

    1. 开始菜单上搜索并打开「设备管理器」。
    2. 设备管理器上找到对应硬件,点击「回退驱动程序」。
    还原驱动

    如果无法回退驱动程序,则去硬件官网下载旧驱动或最新驱动。如果仍然出现蓝屏,可以尝试在设备管理器中卸载设备,然后重启电脑,让系统启用自带驱动。如果上述方案都没有解决问题,可以尝试更新主板 BIOS,关闭超频。

    如果你不清楚报错进程与哪个硬件相关,尝试多种方法仍然无法修复,那只能用强行删除来尝试修复。但在删除前,必须备份好相关文件及其所在路径。如果删除后无法进入系统,则需要使用 PE 系统来还原备份文件。如果相关文件数量超过 5 个,或者不清楚如何使用 PE,则不要强制删除任何 *.sys 文件。

    未知程序

    ',11),g={href:"https://www.voidtools.com/zh-cn/downloads/",target:"_blank",rel:"noopener noreferrer"},h=(0,i.QD)("strong",null,"备份",-1),u=(0,i.IL)('

    MpKslDrv.sys 通常用于恶意软件保护,对系统影响不大。如果出现该报错,可使用 Defender Control 关闭微软杀毒 Defender Antivirus Service。@yys 爱与诚 反馈,「当我关掉 defender 的时候 他自己消失了,不用我删除。当我打开 他又出现了,又删除不了」。

    蓝屏解决集锦

    如果不想分析日志,甚至找不到蓝屏日志,可以尝试以下方法,这些方法可以解决 80% 的蓝屏问题:

    • 驱动类:更新显卡驱动;更新网卡驱动;重置声卡驱动;重置 SATA AHCI 驱动;
    • 主板类:擦拭内存条;重置 BIOS;增加 CPU 电压;关闭超线程;
    • 系统修复:管理员权限打开命令行(cmd),运行 sfc/Scannow,系统会自动检查损坏文件并修复;
    • 终极方法:重装系统,测试期间尽量使用默认系统驱动。如果重装后仍然出现蓝屏,说明你新装的驱动有问题,可以卸掉有问题的驱动。

    常见问题

    装不了 WinDbg

    ',6),w={href:"https://answers.microsoft.com/zh-hans/newthread?threadtype=Questions&cancelurl=/zh-hans/windows/forum&forum=windows&filter=",target:"_blank",rel:"noopener noreferrer"},f=(0,i.IL)('

    分析日志时报错

    分析蓝屏日志时出错,或 WinDbg 对 minidump 蓝屏日志的访问被拒绝,这都是由于系统盘读取权限未开放所导致的。

    解决办法有 3 种:

    • 将 minidump 文件复制到 D 盘,然后手动导入到 WinDbg 进行分析。
    • @天气控制仪:以管理员权限运行 WinDbg。
    • @紫石英与灯心草:右键单击 minidump 蓝屏日志,点击「属性」>「权限」>「点击用户」>「点击继承」>「同意」。

    找不到 minidump 文件

    默认情况下,蓝屏日志保存在 C:\\Windows\\Minidump 文件夹中。如果该文件夹为空,则表明蓝屏日志尚未生成,可等待下一次蓝屏时再查看。如果多次发生蓝屏,但该文件夹仍未生成日志,可尝试在资源管理器中打开 %SystemRoot%\\Minidump。若失败,可按以下步骤进行设置:

    1. 打开「控制面板」>「系统」>「高级系统设置」>「高级」>「启动和故障恢复」>「设置」;
    2. 选择「写入调试信息」>「小内存转储(256KB)」,并将「小存储目录」设置为 %SystemRoot%\\Minidump,确定后重启计算机;
    3. 再次异常关机后,可前往 %SystemRoot%\\Minidump 提取即可。

    视频说明:

    ',8),D={},b=(0,t(9720).c)(D,[["render",function(e,n){const t=(0,i.E1)("ExternalLinkIcon"),D=(0,i.E1)("BiliBili");return(0,i.Wz)(),(0,i.An)("div",null,[o,a,(0,i.QD)("ol",null,[(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("安装 "),(0,i.QD)("a",l,[(0,i.mY)("WinDbg Preview"),(0,i.K2)(t)]),(0,i.mY)(",这是微软官方推出的系统调试工具。")])]),r]),p,d,(0,i.QD)("ol",null,[s,(0,i.QD)("li",null,[(0,i.mY)("将 dmp 蓝屏日志上传至"),(0,i.QD)("a",c,[(0,i.mY)("微软社区"),(0,i.K2)(t)]),(0,i.mY)(",会有技术人员帮助你分析蓝屏原因。由于微软社区不支持上传附件,请先将 dmp 日志上传至百度云或微云,然后将分享链接放在问题中。")])]),m,(0,i.QD)("p",null,[(0,i.mY)("如果是与系统模块、驱动无关的未知程序,可使用 "),(0,i.QD)("a",g,[(0,i.mY)("Everything"),(0,i.K2)(t)]),(0,i.mY)(" 搜索该进程的位置,"),h,(0,i.mY)("后尝试删除该程序。如果提示文件被占用,可使用火绒或 Unlocker 来解除文件占用,但一定要先做好备份。")]),u,(0,i.QD)("p",null,[(0,i.mY)("少数情况安装应用报错,本地无法分析日志。此时,我们可以导出蓝屏日志,上传到"),(0,i.QD)("a",w,[(0,i.mY)("微软社区"),(0,i.K2)(t)]),(0,i.mY)(",会有人帮助分析原因。")]),f,(0,i.K2)(D,{bvid:"BV1jt4y1i7C8"})])}]]),v=JSON.parse('{"path":"/posts/2020-10-25-dpc_watchdog_violation.html","title":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例","lang":"zh-CN","frontmatter":{"title":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例","date":"2020-10-25T00:00:00.000Z","category":["系统"],"tag":["蓝屏"],"star":true,"order":-30,"description":"Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-10-25-dpc_watchdog_violation.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例"}],["meta",{"property":"og:description","content":"Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20201025223307.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"蓝屏"}],["meta",{"property":"article:published_time","content":"2020-10-25T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例\\",\\"image\\":[\\"https://img.newzone.top/20201025223307.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201025224308.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-12-17-10-38-44.png \\\\\\"还原驱动\\\\\\"\\"],\\"datePublished\\":\\"2020-10-25T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"导出蓝屏日志","slug":"导出蓝屏日志","link":"#导出蓝屏日志","children":[]},{"level":2,"title":"上传社区分析","slug":"上传社区分析","link":"#上传社区分析","children":[]},{"level":2,"title":"蓝屏解决方案","slug":"蓝屏解决方案","link":"#蓝屏解决方案","children":[{"level":3,"title":"系统模块报错","slug":"系统模块报错","link":"#系统模块报错","children":[]},{"level":3,"title":"驱动冲突","slug":"驱动冲突","link":"#驱动冲突","children":[]},{"level":3,"title":"未知程序","slug":"未知程序","link":"#未知程序","children":[]}]},{"level":2,"title":"蓝屏解决集锦","slug":"蓝屏解决集锦","link":"#蓝屏解决集锦","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"装不了 WinDbg","slug":"装不了-windbg","link":"#装不了-windbg","children":[]},{"level":3,"title":"分析日志时报错","slug":"分析日志时报错","link":"#分析日志时报错","children":[]},{"level":3,"title":"找不到 minidump 文件","slug":"找不到-minidump-文件","link":"#找不到-minidump-文件","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":20}]},"readingTime":{"minutes":5.48,"words":1643},"filePathRelative":"_posts/2020-10-25-dpc_watchdog_violation.md","localizedDate":"2020年10月25日","excerpt":"

    Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。

    \\n

    导出蓝屏日志

    \\n
      \\n
    1. \\n

      安装 WinDbg Preview,这是微软官方推出的系统调试工具。

      \\n
    2. \\n
    3. \\n

      启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\\\\Windows\\\\Minidump,导出日志 *.dmp

      \\n
    4. \\n
    5. \\n

      载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

      分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

      \\n
      \\"\\"
      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8184],{3671:(e,n)=>{n.A=(e,n)=>{const t=e.__vccOpts||e;for(const[e,i]of n)t[e]=i;return t}},7268:(e,n,t)=>{t.r(n),t.d(n,{comp:()=>k,data:()=>W});var i=t(7847);const o=(0,i.Lk)("p",null,"Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。",-1),a=(0,i.Lk)("h2",{id:"导出蓝屏日志",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#导出蓝屏日志"},[(0,i.Lk)("span",null,"导出蓝屏日志")])],-1),l={href:"https://www.microsoft.com/zh-cn/p/windbg/9pgjgd53tn86?rtc=1&activetab=pivot:overviewtab",target:"_blank",rel:"noopener noreferrer"},r=(0,i.Fv)('
  • 启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\\Windows\\Minidump,导出日志 *.dmp

  • 载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

  • 分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

  • ',3),p=(0,i.Lk)("h2",{id:"上传社区分析",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#上传社区分析"},[(0,i.Lk)("span",null,"上传社区分析")])],-1),d=(0,i.Lk)("p",null,"有些蓝屏比较复杂,由多方面的原因造成,新手很难分析。如果你看不懂或者不想分析日志,可以将蓝屏日志完整上传到微软社区,一般几个小时就会有人回复。",-1),s=(0,i.Lk)("li",null,[(0,i.eW)("打开文件夹 "),(0,i.Lk)("code",null,"C:\\Windows\\Minidump"),(0,i.eW)(",导出日志 "),(0,i.Lk)("code",null,"*.dmp"),(0,i.eW)("。")],-1),c={href:"https://answers.microsoft.com/zh-hans/newthread?threadtype=Questions&cancelurl=/zh-hans/windows/forum&forum=windows&filter=",target:"_blank",rel:"noopener noreferrer"},g=(0,i.Fv)('

    蓝屏解决方案

    分析完蓝屏日志后,我们得到了具体的蓝屏冲突进程,然后在引擎中搜索该进程名,以确定它是系统模块、驱动还是某个程序。

    系统模块报错

    ntkrnlmp.exe*.symbols.exe 是系统模块,该报错不是蓝屏的底层原因,实际是由应用进程与系统冲突引起的蓝屏,需重新深入分析日志。不要尝试删除系统模块

    驱动冲突

    nvlddmkm.sysamdkmdag.sys 等后缀为 *.sys 的进程报错,多为硬件驱动错误,可通过回退驱动来解决。

    1. 开始菜单上搜索并打开「设备管理器」。
    2. 设备管理器上找到对应硬件,点击「回退驱动程序」。
    还原驱动

    如果无法回退驱动程序,则去硬件官网下载旧驱动或最新驱动。如果仍然出现蓝屏,可以尝试在设备管理器中卸载设备,然后重启电脑,让系统启用自带驱动。如果上述方案都没有解决问题,可以尝试更新主板 BIOS,关闭超频。

    如果你不清楚报错进程与哪个硬件相关,尝试多种方法仍然无法修复,那只能用强行删除来尝试修复。但在删除前,必须备份好相关文件及其所在路径。如果删除后无法进入系统,则需要使用 PE 系统来还原备份文件。如果相关文件数量超过 5 个,或者不清楚如何使用 PE,则不要强制删除任何 *.sys 文件。

    未知程序

    ',11),m={href:"https://www.voidtools.com/zh-cn/downloads/",target:"_blank",rel:"noopener noreferrer"},h=(0,i.Lk)("strong",null,"备份",-1),u=(0,i.Fv)('

    MpKslDrv.sys 通常用于恶意软件保护,对系统影响不大。如果出现该报错,可使用 Defender Control 关闭微软杀毒 Defender Antivirus Service。@yys 爱与诚 反馈,「当我关掉 defender 的时候 他自己消失了,不用我删除。当我打开 他又出现了,又删除不了」。

    蓝屏解决集锦

    如果不想分析日志,甚至找不到蓝屏日志,可以尝试以下方法,这些方法可以解决 80% 的蓝屏问题:

    • 驱动类:更新显卡驱动;更新网卡驱动;重置声卡驱动;重置 SATA AHCI 驱动;
    • 主板类:擦拭内存条;重置 BIOS;增加 CPU 电压;关闭超线程;
    • 系统修复:管理员权限打开命令行(cmd),运行 sfc/Scannow,系统会自动检查损坏文件并修复;
    • 终极方法:重装系统,测试期间尽量使用默认系统驱动。如果重装后仍然出现蓝屏,说明你新装的驱动有问题,可以卸掉有问题的驱动。

    常见问题

    装不了 WinDbg

    ',6),w={href:"https://answers.microsoft.com/zh-hans/newthread?threadtype=Questions&cancelurl=/zh-hans/windows/forum&forum=windows&filter=",target:"_blank",rel:"noopener noreferrer"},f=(0,i.Fv)('

    分析日志时报错

    分析蓝屏日志时出错,或 WinDbg 对 minidump 蓝屏日志的访问被拒绝,这都是由于系统盘读取权限未开放所导致的。

    解决办法有 3 种:

    • 将 minidump 文件复制到 D 盘,然后手动导入到 WinDbg 进行分析。
    • @天气控制仪:以管理员权限运行 WinDbg。
    • @紫石英与灯心草:右键单击 minidump 蓝屏日志,点击「属性」>「权限」>「点击用户」>「点击继承」>「同意」。

    找不到 minidump 文件

    默认情况下,蓝屏日志保存在 C:\\Windows\\Minidump 文件夹中。如果该文件夹为空,则表明蓝屏日志尚未生成,可等待下一次蓝屏时再查看。如果多次发生蓝屏,但该文件夹仍未生成日志,可尝试在资源管理器中打开 %SystemRoot%\\Minidump。若失败,可按以下步骤进行设置:

    1. 打开「控制面板」>「系统」>「高级系统设置」>「高级」>「启动和故障恢复」>「设置」;
    2. 选择「写入调试信息」>「小内存转储(256KB)」,并将「小存储目录」设置为 %SystemRoot%\\Minidump,确定后重启计算机;
    3. 再次异常关机后,可前往 %SystemRoot%\\Minidump 提取即可。

    视频说明:

    ',8),b={},k=(0,t(3671).A)(b,[["render",function(e,n){const t=(0,i.g2)("ExternalLinkIcon"),b=(0,i.g2)("BiliBili");return(0,i.uX)(),(0,i.CE)("div",null,[o,a,(0,i.Lk)("ol",null,[(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.eW)("安装 "),(0,i.Lk)("a",l,[(0,i.eW)("WinDbg Preview"),(0,i.bF)(t)]),(0,i.eW)(",这是微软官方推出的系统调试工具。")])]),r]),p,d,(0,i.Lk)("ol",null,[s,(0,i.Lk)("li",null,[(0,i.eW)("将 dmp 蓝屏日志上传至"),(0,i.Lk)("a",c,[(0,i.eW)("微软社区"),(0,i.bF)(t)]),(0,i.eW)(",会有技术人员帮助你分析蓝屏原因。由于微软社区不支持上传附件,请先将 dmp 日志上传至百度云或微云,然后将分享链接放在问题中。")])]),g,(0,i.Lk)("p",null,[(0,i.eW)("如果是与系统模块、驱动无关的未知程序,可使用 "),(0,i.Lk)("a",m,[(0,i.eW)("Everything"),(0,i.bF)(t)]),(0,i.eW)(" 搜索该进程的位置,"),h,(0,i.eW)("后尝试删除该程序。如果提示文件被占用,可使用火绒或 Unlocker 来解除文件占用,但一定要先做好备份。")]),u,(0,i.Lk)("p",null,[(0,i.eW)("少数情况安装应用报错,本地无法分析日志。此时,我们可以导出蓝屏日志,上传到"),(0,i.Lk)("a",w,[(0,i.eW)("微软社区"),(0,i.bF)(t)]),(0,i.eW)(",会有人帮助分析原因。")]),f,(0,i.bF)(b,{bvid:"BV1jt4y1i7C8"})])}]]),W=JSON.parse('{"path":"/posts/2020-10-25-dpc_watchdog_violation.html","title":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例","lang":"zh-CN","frontmatter":{"title":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例","date":"2020-10-25T00:00:00.000Z","category":["系统"],"tag":["蓝屏"],"star":true,"order":-30,"description":"Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-10-25-dpc_watchdog_violation.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例"}],["meta",{"property":"og:description","content":"Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20201025223307.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"蓝屏"}],["meta",{"property":"article:published_time","content":"2020-10-25T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例\\",\\"image\\":[\\"https://img.newzone.top/20201025223307.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201025224308.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-12-17-10-38-44.png \\\\\\"还原驱动\\\\\\"\\"],\\"datePublished\\":\\"2020-10-25T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"导出蓝屏日志","slug":"导出蓝屏日志","link":"#导出蓝屏日志","children":[]},{"level":2,"title":"上传社区分析","slug":"上传社区分析","link":"#上传社区分析","children":[]},{"level":2,"title":"蓝屏解决方案","slug":"蓝屏解决方案","link":"#蓝屏解决方案","children":[{"level":3,"title":"系统模块报错","slug":"系统模块报错","link":"#系统模块报错","children":[]},{"level":3,"title":"驱动冲突","slug":"驱动冲突","link":"#驱动冲突","children":[]},{"level":3,"title":"未知程序","slug":"未知程序","link":"#未知程序","children":[]}]},{"level":2,"title":"蓝屏解决集锦","slug":"蓝屏解决集锦","link":"#蓝屏解决集锦","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"装不了 WinDbg","slug":"装不了-windbg","link":"#装不了-windbg","children":[]},{"level":3,"title":"分析日志时报错","slug":"分析日志时报错","link":"#分析日志时报错","children":[]},{"level":3,"title":"找不到 minidump 文件","slug":"找不到-minidump-文件","link":"#找不到-minidump-文件","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":20}]},"readingTime":{"minutes":5.48,"words":1643},"filePathRelative":"_posts/2020-10-25-dpc_watchdog_violation.md","localizedDate":"2020年10月25日","excerpt":"

    Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。

    \\n

    导出蓝屏日志

    \\n
      \\n
    1. \\n

      安装 WinDbg Preview,这是微软官方推出的系统调试工具。

      \\n
    2. \\n
    3. \\n

      启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\\\\Windows\\\\Minidump,导出日志 *.dmp

      \\n
    4. \\n
    5. \\n

      载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

      分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

      \\n
      \\"\\"
      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7cea757f.8c28289b.js b/assets/js/2020-11-01-gym_equipment_throw_away.html.82a2382a.js similarity index 97% rename from assets/js/v-7cea757f.8c28289b.js rename to assets/js/2020-11-01-gym_equipment_throw_away.html.82a2382a.js index bb8fef7a9..a8f21d4b6 100644 --- a/assets/js/v-7cea757f.8c28289b.js +++ b/assets/js/2020-11-01-gym_equipment_throw_away.html.82a2382a.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5815],{9720:(t,e)=>{e.c=(t,e)=>{const n=t.__vccOpts||t;for(const[t,a]of e)n[t]=a;return n}},8544:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>i,data:()=>r});var a=n(3968);const p=[(0,a.IL)('

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    划船机

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    想象:划着船看着电视,运动娱乐两不耽误,轻松减肥。

    真实:划几分钟就累成狗,根本无心看电视。划船机可以直立节省空间,但也意味着每次运动都需要先搬运几十公斤的划船机。慢慢用得越来越少,一个月可能只用一次,最后 499 自提出掉。

    出掉过程也很神奇,当晚 12 点突然决定卖掉家里所有非必需品,时间不够就只拍了划船机照片,随手写 499 后睡觉。凌晨 3 点来了买家,问了几个问题无人回复,然后就直接拍了。早上起来,我一查才知道二手划船机一般在 1000-2000,但想着人家都拍了,就还是出给他了。之后,出的器材都必须查闲鱼同款价格,不至于亏这么多。

    动感单车

    中学时代,每天骑车上学,那会体重最轻。于是淘宝 999 购入动感单车。

    想象:骑自行车多轻松,每天一小时,体重回高中。

    真实:最低档确实轻松,但效果也为零。调成高档,骑车也变狗。动感单车最大的锻炼作用是当哑铃,每次使用都得搬运 35KG。占地比划船机更大,很快就闲置了,半年后 399 自提出掉。

    健腹轮

    每天都想瘦肚子,健腹轮似乎是个完美辅助,于是京东 311 购入貌似高级的自动回弹健腹轮。

    想象:每天一百卷腹,一个月后肚子就瘦了。

    真实:咬牙坚持到一百,但动作完全变形。体重太大又导致膝盖、手掌负担过大,逐渐闲置。使用 2 年,健腹轮统计数字停在 4300,最后 130 跟划船机一起自提出掉了。

    TRX 悬挂训练

    TRX 算比较热门的运动设备了,无需安装,随时锻炼。于是美亚 889.4 入手。

    想象:一看这专业的装备,就感觉自己瘦了。

    真实:想象中的自己瘦了很多回,但人懒再专业的设备也没用,最后送给腰伤的朋友了。

    电动瑜伽柱

    运动后需要放松筋肉,我们需要瑜伽柱。人懒不愿动的话,那就需要电动的,于是严选 347.6 购入电动肌肉按摩滚。

    想象:运动完大汗淋漓,电动瑜伽柱款缓解疲劳,加速消耗脂肪。

    真实:运动呢?大汗呢?使用场景太少,甚至不如筋膜枪,直接闲置。这款挂了一周也没人买,最后 60 到付低价出了。

    开跨拉筋器

    「筋长一寸寿长十年」,于是淘宝 519 购入拉筋器。

    想象:每天多拉一毫米,明年炼成一字马。

    真实:原理与自重下压拉伸相同,但占位且笨重,使用频率越来越低,最后 150 自提出掉。

    头皮按摩器

    头皮健康才是真的健康,于是严选 179 购入龙爪手头皮按摩仪。

    想象:电动按摩头皮,能活一百八。

    真实:仪器需要 3 颗电池驱动,举着一斤的重量来按摩头皮,真的大丈夫?花了 5.5 买入 2 个八爪鱼按摩器 (推荐),重量不过 10g,效果好太多。最终 52 包邮出。

    理发器

    不愿出门理发,于是京东 99 购入电动理发器。

    想象:楼下理发一次 45,用 2 次就能回本,多理几次自动晋升理发师。

    真实:确实回本了,两次光头,然后闲置。春节带回老家,给爷爷添加了一个剃头神器。

    永远别相信身边人的剃头技术,除非你想要光头。

    灭蚊灯

    夏天一到,就被推送灭蚊灯。没抵御住,于是淘宝 78 购入灭蚊灯。

    想象:每天一小时,蚊子去无踪。

    真实:该来的蚊子总是会来,小功率的灭蚊灯等于安慰剂。效果还不如紫外线灯直接杀菌来得爽快,最后 38 包邮出掉。

    Dyson 吸尘器

    搬新家,怎少得了帅 (z) 气 (b) 的电器,于是美亚 1536.51 购入 Dyson DC58 V6 吸尘器。

    想象:快速打扫,轻松无灰尘。

    真实:吸尘器需要人来使用,打扫也不可能轻松。Dyson 造型不错,但吸力就远没吹得那么厉害。打扫阿姨也嫌弃 Dyson,推荐我买了海尔一款 109 的吸尘器。用后感觉真香,比 Dyson 实用太多。Dyson 545 包邮出。

    生活电器必须实用为先,否则再好看也只会闲置。

    总结

    运动器材需要大量空间,不适合居家使用。普通人健身,靠自重或简单器材就足够了。大型运动器材只会占据房屋位置,不会带来任何的健身加成。

    买东西前,千万要看看是否会常用。这方面,我是完美的反面教材,除了上面一系列用品外,还有墙角落的神舟笔记本(各种神奇 Bug,改装黑苹果)、胸带 + 心率表(先保持运动吧)、玩客云(专注废硬盘,被 NAS 替代)、北通游戏手柄 (永远买但永远不用)、小米 + 微软馒头鼠标(入手 3 个 MX Vertical 替代)、BackJoy + 电脑手托架(Embody 替代)、松下蒸汽眼罩(眼部按摩仪替代)、美容灯 (已变床头桌垫)、艾灸仪 (搭配防毒面具使用)。

    ',58)],o={},i=(0,n(9720).c)(o,[["render",function(t,e){return(0,a.Wz)(),(0,a.An)("div",null,p)}]]),r=JSON.parse('{"path":"/posts/2020-11-01-gym_equipment_throw_away.html","title":"这些全网卖爆的“必备”品,我劝你别买……","lang":"zh-CN","frontmatter":{"title":"这些全网卖爆的“必备”品,我劝你别买……","subtitle":"断舍离:10 件不值得买的「毒草」","date":"2020-11-01T00:00:00.000Z","category":["购物"],"tag":["断舍离","健身器材"],"order":-31,"description":"受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。 我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。 划船机 自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。 想象:划着船看着电视,运动娱乐两不耽误,轻松...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-11-01-gym_equipment_throw_away.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"这些全网卖爆的“必备”品,我劝你别买……"}],["meta",{"property":"og:description","content":"受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。 我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。 划船机 自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。 想象:划着船看着电视,运动娱乐两不耽误,轻松..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20200417091952.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"这些全网卖爆的“必备”品,我劝你别买……"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"断舍离"}],["meta",{"property":"article:tag","content":"健身器材"}],["meta",{"property":"article:published_time","content":"2020-11-01T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"这些全网卖爆的“必备”品,我劝你别买……\\",\\"image\\":[\\"https://img.newzone.top/20200417091952.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200418183425.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200417092142.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200421125830.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200417100520.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201101114736.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200417095327.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201101115630.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201101115348.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200421110937.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2020-11-01T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"划船机","slug":"划船机","link":"#划船机","children":[]},{"level":2,"title":"动感单车","slug":"动感单车","link":"#动感单车","children":[]},{"level":2,"title":"健腹轮","slug":"健腹轮","link":"#健腹轮","children":[]},{"level":2,"title":"TRX 悬挂训练","slug":"trx-悬挂训练","link":"#trx-悬挂训练","children":[]},{"level":2,"title":"电动瑜伽柱","slug":"电动瑜伽柱","link":"#电动瑜伽柱","children":[]},{"level":2,"title":"开跨拉筋器","slug":"开跨拉筋器","link":"#开跨拉筋器","children":[]},{"level":2,"title":"头皮按摩器","slug":"头皮按摩器","link":"#头皮按摩器","children":[]},{"level":2,"title":"理发器","slug":"理发器","link":"#理发器","children":[]},{"level":2,"title":"灭蚊灯","slug":"灭蚊灯","link":"#灭蚊灯","children":[]},{"level":2,"title":"Dyson 吸尘器","slug":"dyson-吸尘器","link":"#dyson-吸尘器","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":5.27,"words":1580},"filePathRelative":"_posts/2020-11-01-gym_equipment_throw_away.md","localizedDate":"2020年11月1日","excerpt":"

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    \\n

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    \\n

    划船机

    \\n

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3986],{3671:(t,e)=>{e.A=(t,e)=>{const n=t.__vccOpts||t;for(const[t,a]of e)n[t]=a;return n}},2884:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>i,data:()=>r});var a=n(7847);const p=[(0,a.Fv)('

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    划船机

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    想象:划着船看着电视,运动娱乐两不耽误,轻松减肥。

    真实:划几分钟就累成狗,根本无心看电视。划船机可以直立节省空间,但也意味着每次运动都需要先搬运几十公斤的划船机。慢慢用得越来越少,一个月可能只用一次,最后 499 自提出掉。

    出掉过程也很神奇,当晚 12 点突然决定卖掉家里所有非必需品,时间不够就只拍了划船机照片,随手写 499 后睡觉。凌晨 3 点来了买家,问了几个问题无人回复,然后就直接拍了。早上起来,我一查才知道二手划船机一般在 1000-2000,但想着人家都拍了,就还是出给他了。之后,出的器材都必须查闲鱼同款价格,不至于亏这么多。

    动感单车

    中学时代,每天骑车上学,那会体重最轻。于是淘宝 999 购入动感单车。

    想象:骑自行车多轻松,每天一小时,体重回高中。

    真实:最低档确实轻松,但效果也为零。调成高档,骑车也变狗。动感单车最大的锻炼作用是当哑铃,每次使用都得搬运 35KG。占地比划船机更大,很快就闲置了,半年后 399 自提出掉。

    健腹轮

    每天都想瘦肚子,健腹轮似乎是个完美辅助,于是京东 311 购入貌似高级的自动回弹健腹轮。

    想象:每天一百卷腹,一个月后肚子就瘦了。

    真实:咬牙坚持到一百,但动作完全变形。体重太大又导致膝盖、手掌负担过大,逐渐闲置。使用 2 年,健腹轮统计数字停在 4300,最后 130 跟划船机一起自提出掉了。

    TRX 悬挂训练

    TRX 算比较热门的运动设备了,无需安装,随时锻炼。于是美亚 889.4 入手。

    想象:一看这专业的装备,就感觉自己瘦了。

    真实:想象中的自己瘦了很多回,但人懒再专业的设备也没用,最后送给腰伤的朋友了。

    电动瑜伽柱

    运动后需要放松筋肉,我们需要瑜伽柱。人懒不愿动的话,那就需要电动的,于是严选 347.6 购入电动肌肉按摩滚。

    想象:运动完大汗淋漓,电动瑜伽柱款缓解疲劳,加速消耗脂肪。

    真实:运动呢?大汗呢?使用场景太少,甚至不如筋膜枪,直接闲置。这款挂了一周也没人买,最后 60 到付低价出了。

    开跨拉筋器

    「筋长一寸寿长十年」,于是淘宝 519 购入拉筋器。

    想象:每天多拉一毫米,明年炼成一字马。

    真实:原理与自重下压拉伸相同,但占位且笨重,使用频率越来越低,最后 150 自提出掉。

    头皮按摩器

    头皮健康才是真的健康,于是严选 179 购入龙爪手头皮按摩仪。

    想象:电动按摩头皮,能活一百八。

    真实:仪器需要 3 颗电池驱动,举着一斤的重量来按摩头皮,真的大丈夫?花了 5.5 买入 2 个八爪鱼按摩器 (推荐),重量不过 10g,效果好太多。最终 52 包邮出。

    理发器

    不愿出门理发,于是京东 99 购入电动理发器。

    想象:楼下理发一次 45,用 2 次就能回本,多理几次自动晋升理发师。

    真实:确实回本了,两次光头,然后闲置。春节带回老家,给爷爷添加了一个剃头神器。

    永远别相信身边人的剃头技术,除非你想要光头。

    灭蚊灯

    夏天一到,就被推送灭蚊灯。没抵御住,于是淘宝 78 购入灭蚊灯。

    想象:每天一小时,蚊子去无踪。

    真实:该来的蚊子总是会来,小功率的灭蚊灯等于安慰剂。效果还不如紫外线灯直接杀菌来得爽快,最后 38 包邮出掉。

    Dyson 吸尘器

    搬新家,怎少得了帅 (z) 气 (b) 的电器,于是美亚 1536.51 购入 Dyson DC58 V6 吸尘器。

    想象:快速打扫,轻松无灰尘。

    真实:吸尘器需要人来使用,打扫也不可能轻松。Dyson 造型不错,但吸力就远没吹得那么厉害。打扫阿姨也嫌弃 Dyson,推荐我买了海尔一款 109 的吸尘器。用后感觉真香,比 Dyson 实用太多。Dyson 545 包邮出。

    生活电器必须实用为先,否则再好看也只会闲置。

    总结

    运动器材需要大量空间,不适合居家使用。普通人健身,靠自重或简单器材就足够了。大型运动器材只会占据房屋位置,不会带来任何的健身加成。

    买东西前,千万要看看是否会常用。这方面,我是完美的反面教材,除了上面一系列用品外,还有墙角落的神舟笔记本(各种神奇 Bug,改装黑苹果)、胸带 + 心率表(先保持运动吧)、玩客云(专注废硬盘,被 NAS 替代)、北通游戏手柄 (永远买但永远不用)、小米 + 微软馒头鼠标(入手 3 个 MX Vertical 替代)、BackJoy + 电脑手托架(Embody 替代)、松下蒸汽眼罩(眼部按摩仪替代)、美容灯 (已变床头桌垫)、艾灸仪 (搭配防毒面具使用)。

    ',58)],o={},i=(0,n(3671).A)(o,[["render",function(t,e){return(0,a.uX)(),(0,a.CE)("div",null,p)}]]),r=JSON.parse('{"path":"/posts/2020-11-01-gym_equipment_throw_away.html","title":"这些全网卖爆的“必备”品,我劝你别买……","lang":"zh-CN","frontmatter":{"title":"这些全网卖爆的“必备”品,我劝你别买……","subtitle":"断舍离:10 件不值得买的「毒草」","date":"2020-11-01T00:00:00.000Z","category":["购物"],"tag":["断舍离","健身器材"],"order":-31,"description":"受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。 我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。 划船机 自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。 想象:划着船看着电视,运动娱乐两不耽误,轻松...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-11-01-gym_equipment_throw_away.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"这些全网卖爆的“必备”品,我劝你别买……"}],["meta",{"property":"og:description","content":"受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。 我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。 划船机 自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。 想象:划着船看着电视,运动娱乐两不耽误,轻松..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20200417091952.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"这些全网卖爆的“必备”品,我劝你别买……"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"断舍离"}],["meta",{"property":"article:tag","content":"健身器材"}],["meta",{"property":"article:published_time","content":"2020-11-01T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"这些全网卖爆的“必备”品,我劝你别买……\\",\\"image\\":[\\"https://img.newzone.top/20200417091952.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200418183425.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200417092142.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200421125830.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200417100520.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201101114736.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200417095327.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201101115630.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20201101115348.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20200421110937.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2020-11-01T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"划船机","slug":"划船机","link":"#划船机","children":[]},{"level":2,"title":"动感单车","slug":"动感单车","link":"#动感单车","children":[]},{"level":2,"title":"健腹轮","slug":"健腹轮","link":"#健腹轮","children":[]},{"level":2,"title":"TRX 悬挂训练","slug":"trx-悬挂训练","link":"#trx-悬挂训练","children":[]},{"level":2,"title":"电动瑜伽柱","slug":"电动瑜伽柱","link":"#电动瑜伽柱","children":[]},{"level":2,"title":"开跨拉筋器","slug":"开跨拉筋器","link":"#开跨拉筋器","children":[]},{"level":2,"title":"头皮按摩器","slug":"头皮按摩器","link":"#头皮按摩器","children":[]},{"level":2,"title":"理发器","slug":"理发器","link":"#理发器","children":[]},{"level":2,"title":"灭蚊灯","slug":"灭蚊灯","link":"#灭蚊灯","children":[]},{"level":2,"title":"Dyson 吸尘器","slug":"dyson-吸尘器","link":"#dyson-吸尘器","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":5.27,"words":1580},"filePathRelative":"_posts/2020-11-01-gym_equipment_throw_away.md","localizedDate":"2020年11月1日","excerpt":"

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    \\n

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    \\n

    划船机

    \\n

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-156dc265.87f4c38a.js b/assets/js/2020-11-27-rime_input.html.67b1f8c3.js similarity index 61% rename from assets/js/v-156dc265.87f4c38a.js rename to assets/js/2020-11-27-rime_input.html.67b1f8c3.js index 83e0e7748..6a4357ee6 100644 --- a/assets/js/v-156dc265.87f4c38a.js +++ b/assets/js/2020-11-27-rime_input.html.67b1f8c3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3792],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},6244:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>_e,data:()=>xe});var t=a(3968);const l=(0,t.QD)("p",null,[(0,t.mY)("常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个"),(0,t.QD)("strong",null,"键盘记录器"),(0,t.mY)("。")],-1),r=(0,t.QD)("p",null,"之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。",-1),s={href:"https://github.com/rime/weasel/releases/download/0.15.0/weasel-0.15.0.0-installer.exe",target:"_blank",rel:"noopener noreferrer"},o={href:"https://wwva.lanzoum.com/iTAcP0ynxmfi",target:"_blank",rel:"noopener noreferrer"},i=(0,t.IL)('

    基础设置

    安装小狼毫时,不要修改用户文件夹位置,否则后续输入法定制容易出错。安装完成后,右键单击任务栏的小狼毫图标,点击「输入法设定」,勾选输入法(推荐「朙月拼音·简化字」),点击「中」,选择皮肤后即可使用小狼毫输入法。[1][2]

    ',2),p={href:"https://github.com/fkxxyz/rime-cloverpinyin",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/ssnhd/rime",target:"_blank",rel:"noopener noreferrer"},c={href:"https://blog.csdn.net/qq_42204675/article/details/86422450",target:"_blank",rel:"noopener noreferrer"},u=(0,t.QD)("h2",{id:"扩充词库",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#扩充词库"},[(0,t.QD)("span",null,"扩充词库")])],-1),d={href:"https://github.com/Chernfalin/better-rime-dict",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/Chernfalin/SuperRimeDict",target:"_blank",rel:"noopener noreferrer"},f={href:"https://gist.github.com/lotem/5440677",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/rime-aca/dictionaries",target:"_blank",rel:"noopener noreferrer"},b=(0,t.QD)("p",null,"从容量上来说,SuperRime 词库 > BetterRime 词库 > Rime 擴充詞庫,但词库越大错误收录也越多,建议按实际需求选择词库。",-1),g=(0,t.QD)("p",null,[(0,t.mY)("词库解压后,修改 "),(0,t.QD)("code",null,"luna_pinyin.extended.dict.yaml"),(0,t.mY)(",选择词库范围。"),(0,t.QD)("code",null,"mysymbols.yaml"),(0,t.mY)(" 对全角和半角符号都做了优化,有其他需求可以自行修改。")],-1),D=(0,t.QD)("h2",{id:"双拼方案",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#双拼方案"},[(0,t.QD)("span",null,"双拼方案")])],-1),Q={href:"https://github.com/rime/rime-double-pinyin",target:"_blank",rel:"noopener noreferrer"},y={href:"https://github.com/rime/rime-double-pinyin/blob/master/double_pinyin_flypy.schema.yaml",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://github.com/functoreality/rime-flypy-zrmfast",target:"_blank",rel:"noopener noreferrer"},v={href:"https://blog.csdn.net/neninee/article/details/83692270",target:"_blank",rel:"noopener noreferrer"},_=(0,t.QD)("code",null,"double_pinyin_flypy.schema.yaml",-1),x={href:"https://github.com/rime/rime-double-pinyin/issues/6#issuecomment-754367706",target:"_blank",rel:"noopener noreferrer"},w=(0,t.QD)("code",null,"- 'xform/^(.*)$/\\U$1\\E\\t | $1/'",-1),E=(0,t.QD)("code",null,"{原始输出}|{对应拼音}",-1),K=(0,t.IL)('
    translator:\n  dictionary: luna_pinyin\n  prism: double_pinyin_flypy\n  preedit_format:\n

    进阶指南

    在进阶前,需要进入小狼毫的默认用户文档位置,新建 YAML 文档来存储输入法设置修改。如果使用「朙月拼音·简化字」输入法方案,则新建「luna_pinyin_simp.custom.yaml」。%APPDATA%\\Rime 是小狼毫默认的用户文档位置。如果安装时修改了用户文档位置,右键单击任务栏小狼毫图标,选择「用户文件夹」,即可进入用户文档。[3]

    ',3),A={href:"https://github.com/rime/home/wiki/CustomizationGuide",target:"_blank",rel:"noopener noreferrer"},q={href:"https://github.com/rime/home/wiki/RimeWithSchemata#rime-%E4%B8%AD%E7%9A%84%E6%95%B8%E6%93%9A%E6%96%87%E4%BB%B6%E5%88%86%E4%BD%88%E5%8F%8A%E4%BD%9C%E7%94%A8",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/rime/rime-emoji",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/rime/home/wiki/CustomizationGuide#%E6%A8%A1%E7%B3%8A%E9%9F%B3",target:"_blank",rel:"noopener noreferrer"},R={href:"https://github.com/rime/home/wiki/UserGuide#%E5%90%8C%E6%AD%A5%E7%94%A8%E6%88%B6%E8%B3%87%E6%96%99",target:"_blank",rel:"noopener noreferrer"},B=(0,t.QD)("code",null,"installation.yaml",-1),C=(0,t.QD)("code",null,"installation_id",-1),W=(0,t.QD)("code",null,"installation.yaml",-1),T=(0,t.QD)("code",null,"sync_dir: 'D:\\Sync\\RIME'",-1),j=(0,t.QD)("p",null,[(0,t.mY)("打字习惯会保存在 "),(0,t.QD)("code",null,"<词典名>.userdb.txt"),(0,t.mY)(" 或 "),(0,t.QD)("code",null,"<词典名>.userdb.kct.snapshot"),(0,t.mY)(" 中。要还原个人输入习惯,则点击「用户词典管理」>「导入文本码表」来恢复词频记录。")],-1),P={href:"https://github.com/rime/librime/releases",target:"_blank",rel:"noopener noreferrer"},L=(0,t.QD)("code",null,"Rime.lua",-1),I=(0,t.QD)("h3",{id:"繁体字修正",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#繁体字修正"},[(0,t.QD)("span",null,"繁体字修正")])],-1),M=(0,t.QD)("code",null,"什麼 甚麼",-1),F={href:"https://github.com/Sleeplest/texts/blob/master/dzing_variants.txt",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://github.com/rime-aca/customize",target:"_blank",rel:"noopener noreferrer"},G=(0,t.QD)("ol",null,[(0,t.QD)("li",null,[(0,t.mY)("将 "),(0,t.QD)("code",null,"dzing.ini"),(0,t.mY)(" 與 "),(0,t.QD)("code",null,"dzing_variants.txt"),(0,t.mY)(" 放入程序文件夾内,比如 "),(0,t.QD)("code",null,"C:\\Program Files (x86)\\Rime\\weasel-0.15.0\\data\\opencc"),(0,t.mY)("。")]),(0,t.QD)("li",null,[(0,t.mY)("修改用户文件夹(即 "),(0,t.QD)("code",null,"%appdata%\\rime"),(0,t.mY)(")中的方案")])],-1),N={href:"https://github.com/imfuxiao/Hamster/issues/72",target:"_blank",rel:"noopener noreferrer"},$=(0,t.IL)('

    常见问题

    开机后不能输出中文

    有时开机后,不能正常输出中文,这是由于 WeaselServer.exe 未正常启动的原因。

    此时,我们可以打开程序文件夹中的 WeaselServer.exe 来解决问题。该程序默认位置为 C:\\Program Files (x86)\\Rime\\weasel-0.14.3\\WeaselServer.exe。不要将 WeaselServer.exe 放入开启启动程序,会导致程序报错。

    ',4),H=(0,t.QD)("code",null,"WeaselServer.exe",-1),O={href:"https://github.com/rockbenben/rime-WeaselServer",target:"_blank",rel:"noopener noreferrer"},U=(0,t.QD)("code",null,"%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",-1),J={href:"https://wwx.lanzoux.com/if3znkka01g",target:"_blank",rel:"noopener noreferrer"},V=(0,t.QD)("h3",{id:"输入法报错",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#输入法报错"},[(0,t.QD)("span",null,"输入法报错")])],-1),X=(0,t.QD)("p",null,"将用户文件夹设置为同步文件夹后,出现提示「有错误,请查看日志%TEMP%\\rime.weasel.*.INFO」。这是由于用户文件夹设置为同步文件夹后导致的进程冲突。日志中有提示「另一个程序正在使用此文件,进程无法访问」。",-1),ee=(0,t.QD)("p",null,[(0,t.mY)("遇到报错后,关闭任务管理器中的 "),(0,t.QD)("code",null,"WeaselServer.exe"),(0,t.mY)(" 进程,然后重新执行小狼毫算法服务。")],-1),ne=(0,t.QD)("h3",{id:"切换输入法状态",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#切换输入法状态"},[(0,t.QD)("span",null,"切换输入法状态")])],-1),ae={href:"https://gist.github.com/lotem/2981316",target:"_blank",rel:"noopener noreferrer"},te=(0,t.QD)("p",null,"虽然小狼毫不能组合键切换,但可以使用 Windows 键盘切换设置组合键。设置中选择「时间和语言」>「输入」>「高级键盘设置」>「语言栏选项」>「高级键设置」,Ctrl+Space 是 Windows 默认的中文输入法/非输入法切换的快捷键。",-1),le=(0,t.QD)("h3",{id:"输入法候选框闪烁",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#输入法候选框闪烁"},[(0,t.QD)("span",null,"输入法候选框闪烁")])],-1),re={href:"https://github.com/rime/weasel/issues/228",target:"_blank",rel:"noopener noreferrer"},se=(0,t.IL)('

    删除错误「上屏」的词

    有时打错几次的字会出现在预选词的前排,影响了输入法的习惯词典。要删除这些错误的「上屏」词,只需将选字光标移到错词上,然后按下 Shift+Delete 或 Control+Delete 即可。

    符号直接上屏

    小狼毫给字符提供了多个候选,比如 / 默认有 "、", "/", "/", "÷" 四个候选词。若要按 / 键直接输出「、」,则按下方代码修改 luna_pinyin.schema.yaml 中的 punctuator 区块。[4]

    punctuator:\n  import_preset: default\n  full_shape:\n    "/": "、"\n  half_shape:\n    "/": "、"\n

    指定程序中默认输入法

    如果想在特定程序中默认使用英文输入法,可以在 .\\weasel.custom.yaml 中加入下列代码。

    patch:\n  app_options/windowsterminal.exe: # 程序名字全用小寫字母\n    ascii_mode: true\n  app_options/powershell.exe:\n    ascii_mode: true\n  app_options/code.exe:\n    ascii_mode: true\n  app_options/putty.exe:\n    ascii_mode: true\n  app_options/listary.exe:\n    ascii_mode: true\n

    不能输出 emoji

    ',9),oe={href:"https://github.com/ssnhd/rime",target:"_blank",rel:"noopener noreferrer"},ie=(0,t.IL)('

    无法触发词库的特殊符号

    SuperRime 词库自带的标点及特殊表情设置有问题,需要在输入法设置文件夹 luna_pinyin_simp.custom.yaml 中植入触发标点及特殊表情的代码。

    patch:\n  "punctuator/import_preset": mysymbols\n  "recognizer/patterns/punct": "^/([a-z]+|[0-9])$"\n

    ',4),pe={class:"footnotes"},me={class:"footnotes-list"},ce={id:"footnote1",class:"footnote-item"},ue={href:"https://www.jianshu.com/p/296bba666604",target:"_blank",rel:"noopener noreferrer"},de=(0,t.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),he={id:"footnote2",class:"footnote-item"},fe={href:"https://www.jianshu.com/p/cffc0ea094a7",target:"_blank",rel:"noopener noreferrer"},ke=(0,t.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),be={id:"footnote3",class:"footnote-item"},ge={href:"https://www.dazhuanlan.com/2019/10/06/5d995d43e4432/",target:"_blank",rel:"noopener noreferrer"},De=(0,t.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),Qe={id:"footnote4",class:"footnote-item"},ye={href:"https://github.com/rime/home/wiki/CustomizationGuide#%E4%B8%80%E4%BE%8B%E5%AE%9A%E8%A3%BD%E6%A8%99%E9%BB%9E%E7%AC%A6%E8%99%9F",target:"_blank",rel:"noopener noreferrer"},Ye=(0,t.QD)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),ve={},_e=(0,a(9720).c)(ve,[["render",function(e,n){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[l,r,(0,t.QD)("p",null,[(0,t.mY)("Rime 小狼毫输入法下载:"),(0,t.QD)("a",s,[(0,t.mY)("官方渠道"),(0,t.K2)(a)]),(0,t.mY)(","),(0,t.QD)("a",o,[(0,t.mY)("国内搬运"),(0,t.K2)(a)]),(0,t.mY)("。")]),i,(0,t.QD)("p",null,[(0,t.mY)("小狼毫不推荐使用"),(0,t.QD)("a",p,[(0,t.mY)("四叶草"),(0,t.K2)(a)]),(0,t.mY)("等集成方案,建议参考 "),(0,t.QD)("a",m,[(0,t.mY)("Squirrel 鼠须管配置"),(0,t.K2)(a)]),(0,t.mY)("和"),(0,t.QD)("a",c,[(0,t.mY)("小狼毫 [rime_win][眀月拼音] 简单配置方法"),(0,t.K2)(a)]),(0,t.mY)(" 以「朙月拼音·简化字」为基础定制自己的输入法,最大限度提升输入法效率。小狼毫的魅力在于可自定义,让输入法按你的想法输出,定制流程参考下面的进阶指南。")]),u,(0,t.QD)("p",null,[(0,t.mY)("扩充词库包含英文联想、网络流行语、成语、俗语等,能提高输出效率。热门词库有 "),(0,t.QD)("a",d,[(0,t.mY)("BetterRime 词库"),(0,t.K2)(a)]),(0,t.mY)("、"),(0,t.QD)("a",h,[(0,t.mY)("SuperRime 拓展词库"),(0,t.K2)(a)]),(0,t.mY)("、"),(0,t.QD)("a",f,[(0,t.mY)("自定义短语"),(0,t.K2)(a)]),(0,t.mY)("和 "),(0,t.QD)("a",k,[(0,t.mY)("Rime 擴充詞庫"),(0,t.K2)(a)]),(0,t.mY)("。")]),b,g,D,(0,t.QD)("p",null,[(0,t.mY)("为了提高输出效率,我使用的是小鹤双拼方案。"),(0,t.QD)("a",Q,[(0,t.mY)("小狼毫官方配置库"),(0,t.K2)(a)]),(0,t.mY)("收录了自然码双拼、智能 ABC 双拼、小鹤双拼、MSPY 双拼和拼音加加双拼。")]),(0,t.QD)("p",null,[(0,t.mY)("配置时,将官方配置库中的 "),(0,t.QD)("a",y,[(0,t.mY)("double_pinyin_flypy.schema.yaml"),(0,t.K2)(a)]),(0,t.mY)(" 下载到小狼毫的用户文件夹。然后,右键单击任务栏小狼毫图标,选「输入法设定」,只勾选一个「小鹤双拼」。默认方案为繁体,可使用按键 F5 (部分版本是 F4),将配置默认为简体。如果你不想翻页找字,可以参考由 @functoreality 提供的"),(0,t.QD)("a",Y,[(0,t.mY)("双拼加辅助码方案"),(0,t.K2)(a)]),(0,t.mY)("。")]),(0,t.QD)("p",null,[(0,t.mY)("双拼的自定义短语可参考"),(0,t.QD)("a",v,[(0,t.mY)("小狼毫自定义短语-Rime-双拼"),(0,t.K2)(a)]),(0,t.mY)("。如果设定后无法使用简体输入,可将 "),_,(0,t.mY)(" 中的 filters 模块剪贴到 translators 模块上方。")]),(0,t.QD)("p",null,[(0,t.mY)("双拼不会显示当前输出字母,可参考"),(0,t.QD)("a",x,[(0,t.mY)("使用双拼时如何同时显示按下的键以及双拼对应的拼音"),(0,t.K2)(a)]),(0,t.mY)("。在 double_pinyin_flypy.schema.yaml 文件中,找到下方的代码行,然后换行加入 "),w,(0,t.mY)("。这是同时显示拼音的核心代码,配置后的双拼会显示为 "),E,(0,t.mY)("。")]),K,(0,t.QD)("p",null,[(0,t.mY)("Rime 的官方文档非常详细,涵盖几乎所有的进阶需求,比如"),(0,t.QD)("a",A,[(0,t.mY)("定制指南"),(0,t.K2)(a)]),(0,t.mY)("、"),(0,t.QD)("a",q,[(0,t.mY)("文件配置说明"),(0,t.K2)(a)]),(0,t.mY)("、"),(0,t.QD)("a",S,[(0,t.mY)("emoji 集成"),(0,t.K2)(a)]),(0,t.mY)(" 和 "),(0,t.QD)("a",z,[(0,t.mY)("模糊音设置"),(0,t.K2)(a)]),(0,t.mY)("。")]),(0,t.QD)("p",null,[(0,t.mY)("如果要在多个设备上"),(0,t.QD)("a",R,[(0,t.mY)("同步用户资料"),(0,t.K2)(a)]),(0,t.mY)(",请打开用户文件夹中的 "),B,(0,t.mY)(",将其中的设备名称 "),C,(0,t.mY)(" 从长字符串修改为方便识别的名称,并在 "),W,(0,t.mY)(" 文本末尾添加用户资料同步位置 "),T,(0,t.mY)(",路径中不能出现中文。")]),j,(0,t.QD)("p",null,[(0,t.mY)("小狼毫主版本更新频率较低,可以用 rime 核心库 "),(0,t.QD)("a",P,[(0,t.mY)("librime"),(0,t.K2)(a)]),(0,t.mY)(" 替换小狼毫程序文件夹中的 rime.dll 来更新输入法。如果输入法中使用了 "),L,(0,t.mY)(" 的动态输出功能,可能会与核心库发生冲突,不要更换 rime.dll。")]),I,(0,t.QD)("p",null,[(0,t.mY)("繁体的异体字较多,比如 "),M,(0,t.mY)(",建议用 "),(0,t.QD)("a",F,[(0,t.mY)("dzing_variants.txt"),(0,t.K2)(a)]),(0,t.mY)(" 来替换。")]),(0,t.QD)("p",null,[(0,t.mY)("替换方案参考:"),(0,t.QD)("a",Z,[(0,t.mY)("https://github.com/rime-aca/customize"),(0,t.K2)(a)])]),G,(0,t.QD)("p",null,[(0,t.mY)("其他解读:"),(0,t.QD)("a",N,[(0,t.mY)("https://github.com/imfuxiao/Hamster/issues/72"),(0,t.K2)(a)])]),$,(0,t.QD)("p",null,[(0,t.mY)("如果不想手动启动 "),H,(0,t.mY)(",可以使用 "),(0,t.QD)("a",O,[(0,t.mY)("WeaselServerAutostart"),(0,t.K2)(a)]),(0,t.mY)(" 脚本工具。首先把脚本放置于小狼毫「程序文件夹」内,然后将脚本的快捷方式移动至开机启动目录 "),U,(0,t.mY)("。当开机时,如果检测到小狼毫未正常启动,脚本会自动启动对应程序。WeaselServerAutostart 脚本国内下载:"),(0,t.QD)("a",J,[(0,t.mY)("https://wwx.lanzoux.com/if3znkka01g"),(0,t.K2)(a)]),(0,t.mY)("。")]),V,X,ee,ne,(0,t.QD)("p",null,[(0,t.mY)("小狼毫只支持按键切换中英文,支持的按键是 Caps_Lock, Shift_L, Shift_R, Control_L, control_R,配置参考"),(0,t.QD)("a",ae,[(0,t.mY)("使用 Control 鍵切換中西文"),(0,t.K2)(a)]),(0,t.mY)(",修改 default.custom.yaml。")]),te,le,(0,t.QD)("p",null,[(0,t.mY)("中文输入法的候选框闪烁,无法显示候选词。排除键盘硬件问题,可以尝试拔除或更换键盘,以确认问题是否复现。Word 2016 下候选框闪烁可以参考 "),(0,t.QD)("a",re,[(0,t.mY)("issue 228"),(0,t.K2)(a)]),(0,t.mY)("。")]),se,(0,t.QD)("p",null,[(0,t.mY)("根据官方文档的教程设置了 emoji,但无法输出符号。经过多种方案的测试,目前输出特殊字符最稳定的是 "),(0,t.QD)("a",oe,[(0,t.mY)("Squirrel 鼠须管配置"),(0,t.K2)(a)]),(0,t.mY)(",Windows 用户可以参考它来调整自己的输入法。")]),ie,(0,t.QD)("section",pe,[(0,t.QD)("ol",me,[(0,t.QD)("li",ce,[(0,t.QD)("p",null,[(0,t.QD)("a",ue,[(0,t.mY)("30 分钟搞定 自由输入法 RIME 简明配置指南"),(0,t.K2)(a)]),(0,t.mY)(),de])]),(0,t.QD)("li",he,[(0,t.QD)("p",null,[(0,t.QD)("a",fe,[(0,t.mY)("Rime 输入法—鼠须管 (Squirrel) 词库添加及配置"),(0,t.K2)(a)]),(0,t.mY)(),ke])]),(0,t.QD)("li",be,[(0,t.QD)("p",null,[(0,t.QD)("a",ge,[(0,t.mY)("小狼毫 RIME 输入法配置"),(0,t.K2)(a)]),(0,t.mY)(),De])]),(0,t.QD)("li",Qe,[(0,t.QD)("p",null,[(0,t.QD)("a",ye,[(0,t.mY)("一例、定製標點符號"),(0,t.K2)(a)]),(0,t.mY)(),Ye])])])])])}]]),xe=JSON.parse('{"path":"/posts/2020-11-27-rime_input.html","title":"小狼毫 3 分钟入门及进阶指南","lang":"zh-CN","frontmatter":{"title":"小狼毫 3 分钟入门及进阶指南","date":"2020-11-27T00:00:00.000Z","category":["工具"],"tag":["小狼毫","输入法"],"order":-32,"description":"常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器。 之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-11-27-rime_input.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"小狼毫 3 分钟入门及进阶指南"}],["meta",{"property":"og:description","content":"常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器。 之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"小狼毫"}],["meta",{"property":"article:tag","content":"输入法"}],["meta",{"property":"article:published_time","content":"2020-11-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"小狼毫 3 分钟入门及进阶指南\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2020-11-27T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"基础设置","slug":"基础设置","link":"#基础设置","children":[]},{"level":2,"title":"扩充词库","slug":"扩充词库","link":"#扩充词库","children":[]},{"level":2,"title":"双拼方案","slug":"双拼方案","link":"#双拼方案","children":[]},{"level":2,"title":"进阶指南","slug":"进阶指南","link":"#进阶指南","children":[{"level":3,"title":"繁体字修正","slug":"繁体字修正","link":"#繁体字修正","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"开机后不能输出中文","slug":"开机后不能输出中文","link":"#开机后不能输出中文","children":[]},{"level":3,"title":"输入法报错","slug":"输入法报错","link":"#输入法报错","children":[]},{"level":3,"title":"切换输入法状态","slug":"切换输入法状态","link":"#切换输入法状态","children":[]},{"level":3,"title":"输入法候选框闪烁","slug":"输入法候选框闪烁","link":"#输入法候选框闪烁","children":[]},{"level":3,"title":"删除错误「上屏」的词","slug":"删除错误「上屏」的词","link":"#删除错误「上屏」的词","children":[]},{"level":3,"title":"符号直接上屏","slug":"符号直接上屏","link":"#符号直接上屏","children":[]},{"level":3,"title":"指定程序中默认输入法","slug":"指定程序中默认输入法","link":"#指定程序中默认输入法","children":[]},{"level":3,"title":"不能输出 emoji","slug":"不能输出-emoji","link":"#不能输出-emoji","children":[]},{"level":3,"title":"无法触发词库的特殊符号","slug":"无法触发词库的特殊符号","link":"#无法触发词库的特殊符号","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":7.87,"words":2361},"filePathRelative":"_posts/2020-11-27-rime_input.md","localizedDate":"2020年11月27日","excerpt":"

    常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器

    \\n

    之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。

    \\n

    Rime 小狼毫输入法下载:官方渠道国内搬运

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5260],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},7786:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>xe,data:()=>we});var t=a(7847);const l=(0,t.Lk)("p",null,[(0,t.eW)("常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个"),(0,t.Lk)("strong",null,"键盘记录器"),(0,t.eW)("。")],-1),r=(0,t.Lk)("p",null,"之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。",-1),s={href:"https://github.com/rime/weasel/releases/download/0.15.0/weasel-0.15.0.0-installer.exe",target:"_blank",rel:"noopener noreferrer"},o={href:"https://wwva.lanzoum.com/iTAcP0ynxmfi",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Fv)('

    基础设置

    安装小狼毫时,不要修改用户文件夹位置,否则后续输入法定制容易出错。安装完成后,右键单击任务栏的小狼毫图标,点击「输入法设定」,勾选输入法(推荐「朙月拼音·简化字」),点击「中」,选择皮肤后即可使用小狼毫输入法。[1][2]

    ',2),p={href:"https://github.com/fkxxyz/rime-cloverpinyin",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/ssnhd/rime",target:"_blank",rel:"noopener noreferrer"},u={href:"https://blog.csdn.net/qq_42204675/article/details/86422450",target:"_blank",rel:"noopener noreferrer"},d=(0,t.Lk)("h2",{id:"扩充词库",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#扩充词库"},[(0,t.Lk)("span",null,"扩充词库")])],-1),m={href:"https://github.com/Chernfalin/better-rime-dict",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/Chernfalin/SuperRimeDict",target:"_blank",rel:"noopener noreferrer"},h={href:"https://gist.github.com/lotem/5440677",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/rime-aca/dictionaries",target:"_blank",rel:"noopener noreferrer"},f=(0,t.Lk)("p",null,"从容量上来说,SuperRime 词库 > BetterRime 词库 > Rime 擴充詞庫,但词库越大错误收录也越多,建议按实际需求选择词库。",-1),g=(0,t.Lk)("p",null,[(0,t.eW)("词库解压后,修改 "),(0,t.Lk)("code",null,"luna_pinyin.extended.dict.yaml"),(0,t.eW)(",选择词库范围。"),(0,t.Lk)("code",null,"mysymbols.yaml"),(0,t.eW)(" 对全角和半角符号都做了优化,有其他需求可以自行修改。")],-1),W=(0,t.Lk)("h2",{id:"双拼方案",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#双拼方案"},[(0,t.Lk)("span",null,"双拼方案")])],-1),L={href:"https://github.com/rime/rime-double-pinyin",target:"_blank",rel:"noopener noreferrer"},y={href:"https://github.com/rime/rime-double-pinyin/blob/master/double_pinyin_flypy.schema.yaml",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/functoreality/rime-flypy-zrmfast",target:"_blank",rel:"noopener noreferrer"},_={href:"https://blog.csdn.net/neninee/article/details/83692270",target:"_blank",rel:"noopener noreferrer"},x=(0,t.Lk)("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"},F=(0,t.Lk)("code",null,"- 'xform/^(.*)$/\\U$1\\E\\t | $1/'",-1),E=(0,t.Lk)("code",null,"{原始输出}|{对应拼音}",-1),A=(0,t.Fv)('
    translator:\n  dictionary: luna_pinyin\n  prism: double_pinyin_flypy\n  preedit_format:\n

    进阶指南

    在进阶前,需要进入小狼毫的默认用户文档位置,新建 YAML 文档来存储输入法设置修改。如果使用「朙月拼音·简化字」输入法方案,则新建「luna_pinyin_simp.custom.yaml」。%APPDATA%\\Rime 是小狼毫默认的用户文档位置。如果安装时修改了用户文档位置,右键单击任务栏小狼毫图标,选择「用户文件夹」,即可进入用户文档。[3]

    ',3),q={href:"https://github.com/rime/home/wiki/CustomizationGuide",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/rime/home/wiki/RimeWithSchemata#rime-%E4%B8%AD%E7%9A%84%E6%95%B8%E6%93%9A%E6%96%87%E4%BB%B6%E5%88%86%E4%BD%88%E5%8F%8A%E4%BD%9C%E7%94%A8",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/rime/rime-emoji",target:"_blank",rel:"noopener noreferrer"},R={href:"https://github.com/rime/home/wiki/CustomizationGuide#%E6%A8%A1%E7%B3%8A%E9%9F%B3",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/rime/home/wiki/UserGuide#%E5%90%8C%E6%AD%A5%E7%94%A8%E6%88%B6%E8%B3%87%E6%96%99",target:"_blank",rel:"noopener noreferrer"},B=(0,t.Lk)("code",null,"installation.yaml",-1),D=(0,t.Lk)("code",null,"installation_id",-1),T=(0,t.Lk)("code",null,"installation.yaml",-1),j=(0,t.Lk)("code",null,"sync_dir: 'D:\\Sync\\RIME'",-1),P=(0,t.Lk)("p",null,[(0,t.eW)("打字习惯会保存在 "),(0,t.Lk)("code",null,"<词典名>.userdb.txt"),(0,t.eW)(" 或 "),(0,t.Lk)("code",null,"<词典名>.userdb.kct.snapshot"),(0,t.eW)(" 中。要还原个人输入习惯,则点击「用户词典管理」>「导入文本码表」来恢复词频记录。")],-1),M={href:"https://github.com/rime/librime/releases",target:"_blank",rel:"noopener noreferrer"},Z=(0,t.Lk)("code",null,"Rime.lua",-1),I=(0,t.Lk)("h3",{id:"繁体字修正",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#繁体字修正"},[(0,t.Lk)("span",null,"繁体字修正")])],-1),G=(0,t.Lk)("code",null,"什麼 甚麼",-1),N={href:"https://github.com/Sleeplest/texts/blob/master/dzing_variants.txt",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/rime-aca/customize",target:"_blank",rel:"noopener noreferrer"},H=(0,t.Lk)("ol",null,[(0,t.Lk)("li",null,[(0,t.eW)("将 "),(0,t.Lk)("code",null,"dzing.ini"),(0,t.eW)(" 與 "),(0,t.Lk)("code",null,"dzing_variants.txt"),(0,t.eW)(" 放入程序文件夾内,比如 "),(0,t.Lk)("code",null,"C:\\Program Files (x86)\\Rime\\weasel-0.15.0\\data\\opencc"),(0,t.eW)("。")]),(0,t.Lk)("li",null,[(0,t.eW)("修改用户文件夹(即 "),(0,t.Lk)("code",null,"%appdata%\\rime"),(0,t.eW)(")中的方案")])],-1),O={href:"https://github.com/imfuxiao/Hamster/issues/72",target:"_blank",rel:"noopener noreferrer"},U=(0,t.Fv)('

    常见问题

    开机后不能输出中文

    有时开机后,不能正常输出中文,这是由于 WeaselServer.exe 未正常启动的原因。

    此时,我们可以打开程序文件夹中的 WeaselServer.exe 来解决问题。该程序默认位置为 C:\\Program Files (x86)\\Rime\\weasel-0.14.3\\WeaselServer.exe。不要将 WeaselServer.exe 放入开启启动程序,会导致程序报错。

    ',4),Y=(0,t.Lk)("code",null,"WeaselServer.exe",-1),J={href:"https://github.com/rockbenben/rime-WeaselServer",target:"_blank",rel:"noopener noreferrer"},X=(0,t.Lk)("code",null,"%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",-1),K={href:"https://wwx.lanzoux.com/if3znkka01g",target:"_blank",rel:"noopener noreferrer"},Q=(0,t.Lk)("h3",{id:"输入法报错",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#输入法报错"},[(0,t.Lk)("span",null,"输入法报错")])],-1),V=(0,t.Lk)("p",null,"将用户文件夹设置为同步文件夹后,出现提示「有错误,请查看日志%TEMP%\\rime.weasel.*.INFO」。这是由于用户文件夹设置为同步文件夹后导致的进程冲突。日志中有提示「另一个程序正在使用此文件,进程无法访问」。",-1),ee=(0,t.Lk)("p",null,[(0,t.eW)("遇到报错后,关闭任务管理器中的 "),(0,t.Lk)("code",null,"WeaselServer.exe"),(0,t.eW)(" 进程,然后重新执行小狼毫算法服务。")],-1),ne=(0,t.Lk)("h3",{id:"切换输入法状态",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#切换输入法状态"},[(0,t.Lk)("span",null,"切换输入法状态")])],-1),ae={href:"https://gist.github.com/lotem/2981316",target:"_blank",rel:"noopener noreferrer"},te=(0,t.Lk)("p",null,"虽然小狼毫不能组合键切换,但可以使用 Windows 键盘切换设置组合键。设置中选择「时间和语言」>「输入」>「高级键盘设置」>「语言栏选项」>「高级键设置」,Ctrl+Space 是 Windows 默认的中文输入法/非输入法切换的快捷键。",-1),le=(0,t.Lk)("h3",{id:"输入法候选框闪烁",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#输入法候选框闪烁"},[(0,t.Lk)("span",null,"输入法候选框闪烁")])],-1),re={href:"https://github.com/rime/weasel/issues/228",target:"_blank",rel:"noopener noreferrer"},se=(0,t.Fv)('

    删除错误「上屏」的词

    有时打错几次的字会出现在预选词的前排,影响了输入法的习惯词典。要删除这些错误的「上屏」词,只需将选字光标移到错词上,然后按下 Shift+Delete 或 Control+Delete 即可。

    符号直接上屏

    小狼毫给字符提供了多个候选,比如 / 默认有 "、", "/", "/", "÷" 四个候选词。若要按 / 键直接输出「、」,则按下方代码修改 luna_pinyin.schema.yaml 中的 punctuator 区块。[4]

    punctuator:\n  import_preset: default\n  full_shape:\n    "/": "、"\n  half_shape:\n    "/": "、"\n

    指定程序中默认输入法

    如果想在特定程序中默认使用英文输入法,可以在 .\\weasel.custom.yaml 中加入下列代码。

    patch:\n  app_options/windowsterminal.exe: # 程序名字全用小寫字母\n    ascii_mode: true\n  app_options/powershell.exe:\n    ascii_mode: true\n  app_options/code.exe:\n    ascii_mode: true\n  app_options/putty.exe:\n    ascii_mode: true\n  app_options/listary.exe:\n    ascii_mode: true\n

    不能输出 emoji

    ',9),oe={href:"https://github.com/ssnhd/rime",target:"_blank",rel:"noopener noreferrer"},ie=(0,t.Fv)('

    无法触发词库的特殊符号

    SuperRime 词库自带的标点及特殊表情设置有问题,需要在输入法设置文件夹 luna_pinyin_simp.custom.yaml 中植入触发标点及特殊表情的代码。

    patch:\n  "punctuator/import_preset": mysymbols\n  "recognizer/patterns/punct": "^/([a-z]+|[0-9])$"\n

    ',4),pe={class:"footnotes"},ce={class:"footnotes-list"},ue={id:"footnote1",class:"footnote-item"},de={href:"https://www.jianshu.com/p/296bba666604",target:"_blank",rel:"noopener noreferrer"},me=(0,t.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),ke={id:"footnote2",class:"footnote-item"},he={href:"https://www.jianshu.com/p/cffc0ea094a7",target:"_blank",rel:"noopener noreferrer"},be=(0,t.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),fe={id:"footnote3",class:"footnote-item"},ge={href:"https://www.dazhuanlan.com/2019/10/06/5d995d43e4432/",target:"_blank",rel:"noopener noreferrer"},We=(0,t.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),Le={id:"footnote4",class:"footnote-item"},ye={href:"https://github.com/rime/home/wiki/CustomizationGuide#%E4%B8%80%E4%BE%8B%E5%AE%9A%E8%A3%BD%E6%A8%99%E9%BB%9E%E7%AC%A6%E8%99%9F",target:"_blank",rel:"noopener noreferrer"},ve=(0,t.Lk)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),_e={},xe=(0,a(3671).A)(_e,[["render",function(e,n){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[l,r,(0,t.Lk)("p",null,[(0,t.eW)("Rime 小狼毫输入法下载:"),(0,t.Lk)("a",s,[(0,t.eW)("官方渠道"),(0,t.bF)(a)]),(0,t.eW)(","),(0,t.Lk)("a",o,[(0,t.eW)("国内搬运"),(0,t.bF)(a)]),(0,t.eW)("。")]),i,(0,t.Lk)("p",null,[(0,t.eW)("小狼毫不推荐使用"),(0,t.Lk)("a",p,[(0,t.eW)("四叶草"),(0,t.bF)(a)]),(0,t.eW)("等集成方案,建议参考 "),(0,t.Lk)("a",c,[(0,t.eW)("Squirrel 鼠须管配置"),(0,t.bF)(a)]),(0,t.eW)("和"),(0,t.Lk)("a",u,[(0,t.eW)("小狼毫 [rime_win][眀月拼音] 简单配置方法"),(0,t.bF)(a)]),(0,t.eW)(" 以「朙月拼音·简化字」为基础定制自己的输入法,最大限度提升输入法效率。小狼毫的魅力在于可自定义,让输入法按你的想法输出,定制流程参考下面的进阶指南。")]),d,(0,t.Lk)("p",null,[(0,t.eW)("扩充词库包含英文联想、网络流行语、成语、俗语等,能提高输出效率。热门词库有 "),(0,t.Lk)("a",m,[(0,t.eW)("BetterRime 词库"),(0,t.bF)(a)]),(0,t.eW)("、"),(0,t.Lk)("a",k,[(0,t.eW)("SuperRime 拓展词库"),(0,t.bF)(a)]),(0,t.eW)("、"),(0,t.Lk)("a",h,[(0,t.eW)("自定义短语"),(0,t.bF)(a)]),(0,t.eW)("和 "),(0,t.Lk)("a",b,[(0,t.eW)("Rime 擴充詞庫"),(0,t.bF)(a)]),(0,t.eW)("。")]),f,g,W,(0,t.Lk)("p",null,[(0,t.eW)("为了提高输出效率,我使用的是小鹤双拼方案。"),(0,t.Lk)("a",L,[(0,t.eW)("小狼毫官方配置库"),(0,t.bF)(a)]),(0,t.eW)("收录了自然码双拼、智能 ABC 双拼、小鹤双拼、MSPY 双拼和拼音加加双拼。")]),(0,t.Lk)("p",null,[(0,t.eW)("配置时,将官方配置库中的 "),(0,t.Lk)("a",y,[(0,t.eW)("double_pinyin_flypy.schema.yaml"),(0,t.bF)(a)]),(0,t.eW)(" 下载到小狼毫的用户文件夹。然后,右键单击任务栏小狼毫图标,选「输入法设定」,只勾选一个「小鹤双拼」。默认方案为繁体,可使用按键 F5 (部分版本是 F4),将配置默认为简体。如果你不想翻页找字,可以参考由 @functoreality 提供的"),(0,t.Lk)("a",v,[(0,t.eW)("双拼加辅助码方案"),(0,t.bF)(a)]),(0,t.eW)("。")]),(0,t.Lk)("p",null,[(0,t.eW)("双拼的自定义短语可参考"),(0,t.Lk)("a",_,[(0,t.eW)("小狼毫自定义短语-Rime-双拼"),(0,t.bF)(a)]),(0,t.eW)("。如果设定后无法使用简体输入,可将 "),x,(0,t.eW)(" 中的 filters 模块剪贴到 translators 模块上方。")]),(0,t.Lk)("p",null,[(0,t.eW)("双拼不会显示当前输出字母,可参考"),(0,t.Lk)("a",w,[(0,t.eW)("使用双拼时如何同时显示按下的键以及双拼对应的拼音"),(0,t.bF)(a)]),(0,t.eW)("。在 double_pinyin_flypy.schema.yaml 文件中,找到下方的代码行,然后换行加入 "),F,(0,t.eW)("。这是同时显示拼音的核心代码,配置后的双拼会显示为 "),E,(0,t.eW)("。")]),A,(0,t.Lk)("p",null,[(0,t.eW)("Rime 的官方文档非常详细,涵盖几乎所有的进阶需求,比如"),(0,t.Lk)("a",q,[(0,t.eW)("定制指南"),(0,t.bF)(a)]),(0,t.eW)("、"),(0,t.Lk)("a",S,[(0,t.eW)("文件配置说明"),(0,t.bF)(a)]),(0,t.eW)("、"),(0,t.Lk)("a",z,[(0,t.eW)("emoji 集成"),(0,t.bF)(a)]),(0,t.eW)(" 和 "),(0,t.Lk)("a",R,[(0,t.eW)("模糊音设置"),(0,t.bF)(a)]),(0,t.eW)("。")]),(0,t.Lk)("p",null,[(0,t.eW)("如果要在多个设备上"),(0,t.Lk)("a",C,[(0,t.eW)("同步用户资料"),(0,t.bF)(a)]),(0,t.eW)(",请打开用户文件夹中的 "),B,(0,t.eW)(",将其中的设备名称 "),D,(0,t.eW)(" 从长字符串修改为方便识别的名称,并在 "),T,(0,t.eW)(" 文本末尾添加用户资料同步位置 "),j,(0,t.eW)(",路径中不能出现中文。")]),P,(0,t.Lk)("p",null,[(0,t.eW)("小狼毫主版本更新频率较低,可以用 rime 核心库 "),(0,t.Lk)("a",M,[(0,t.eW)("librime"),(0,t.bF)(a)]),(0,t.eW)(" 替换小狼毫程序文件夹中的 rime.dll 来更新输入法。如果输入法中使用了 "),Z,(0,t.eW)(" 的动态输出功能,可能会与核心库发生冲突,不要更换 rime.dll。")]),I,(0,t.Lk)("p",null,[(0,t.eW)("繁体的异体字较多,比如 "),G,(0,t.eW)(",建议用 "),(0,t.Lk)("a",N,[(0,t.eW)("dzing_variants.txt"),(0,t.bF)(a)]),(0,t.eW)(" 来替换。")]),(0,t.Lk)("p",null,[(0,t.eW)("替换方案参考:"),(0,t.Lk)("a",$,[(0,t.eW)("https://github.com/rime-aca/customize"),(0,t.bF)(a)])]),H,(0,t.Lk)("p",null,[(0,t.eW)("其他解读:"),(0,t.Lk)("a",O,[(0,t.eW)("https://github.com/imfuxiao/Hamster/issues/72"),(0,t.bF)(a)])]),U,(0,t.Lk)("p",null,[(0,t.eW)("如果不想手动启动 "),Y,(0,t.eW)(",可以使用 "),(0,t.Lk)("a",J,[(0,t.eW)("WeaselServerAutostart"),(0,t.bF)(a)]),(0,t.eW)(" 脚本工具。首先把脚本放置于小狼毫「程序文件夹」内,然后将脚本的快捷方式移动至开机启动目录 "),X,(0,t.eW)("。当开机时,如果检测到小狼毫未正常启动,脚本会自动启动对应程序。WeaselServerAutostart 脚本国内下载:"),(0,t.Lk)("a",K,[(0,t.eW)("https://wwx.lanzoux.com/if3znkka01g"),(0,t.bF)(a)]),(0,t.eW)("。")]),Q,V,ee,ne,(0,t.Lk)("p",null,[(0,t.eW)("小狼毫只支持按键切换中英文,支持的按键是 Caps_Lock, Shift_L, Shift_R, Control_L, control_R,配置参考"),(0,t.Lk)("a",ae,[(0,t.eW)("使用 Control 鍵切換中西文"),(0,t.bF)(a)]),(0,t.eW)(",修改 default.custom.yaml。")]),te,le,(0,t.Lk)("p",null,[(0,t.eW)("中文输入法的候选框闪烁,无法显示候选词。排除键盘硬件问题,可以尝试拔除或更换键盘,以确认问题是否复现。Word 2016 下候选框闪烁可以参考 "),(0,t.Lk)("a",re,[(0,t.eW)("issue 228"),(0,t.bF)(a)]),(0,t.eW)("。")]),se,(0,t.Lk)("p",null,[(0,t.eW)("根据官方文档的教程设置了 emoji,但无法输出符号。经过多种方案的测试,目前输出特殊字符最稳定的是 "),(0,t.Lk)("a",oe,[(0,t.eW)("Squirrel 鼠须管配置"),(0,t.bF)(a)]),(0,t.eW)(",Windows 用户可以参考它来调整自己的输入法。")]),ie,(0,t.Lk)("section",pe,[(0,t.Lk)("ol",ce,[(0,t.Lk)("li",ue,[(0,t.Lk)("p",null,[(0,t.Lk)("a",de,[(0,t.eW)("30 分钟搞定 自由输入法 RIME 简明配置指南"),(0,t.bF)(a)]),(0,t.eW)(),me])]),(0,t.Lk)("li",ke,[(0,t.Lk)("p",null,[(0,t.Lk)("a",he,[(0,t.eW)("Rime 输入法—鼠须管 (Squirrel) 词库添加及配置"),(0,t.bF)(a)]),(0,t.eW)(),be])]),(0,t.Lk)("li",fe,[(0,t.Lk)("p",null,[(0,t.Lk)("a",ge,[(0,t.eW)("小狼毫 RIME 输入法配置"),(0,t.bF)(a)]),(0,t.eW)(),We])]),(0,t.Lk)("li",Le,[(0,t.Lk)("p",null,[(0,t.Lk)("a",ye,[(0,t.eW)("一例、定製標點符號"),(0,t.bF)(a)]),(0,t.eW)(),ve])])])])])}]]),we=JSON.parse('{"path":"/posts/2020-11-27-rime_input.html","title":"小狼毫 3 分钟入门及进阶指南","lang":"zh-CN","frontmatter":{"title":"小狼毫 3 分钟入门及进阶指南","date":"2020-11-27T00:00:00.000Z","category":["工具"],"tag":["小狼毫","输入法"],"order":-32,"description":"常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器。 之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-11-27-rime_input.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"小狼毫 3 分钟入门及进阶指南"}],["meta",{"property":"og:description","content":"常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器。 之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"小狼毫"}],["meta",{"property":"article:tag","content":"输入法"}],["meta",{"property":"article:published_time","content":"2020-11-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"小狼毫 3 分钟入门及进阶指南\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2020-11-27T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"基础设置","slug":"基础设置","link":"#基础设置","children":[]},{"level":2,"title":"扩充词库","slug":"扩充词库","link":"#扩充词库","children":[]},{"level":2,"title":"双拼方案","slug":"双拼方案","link":"#双拼方案","children":[]},{"level":2,"title":"进阶指南","slug":"进阶指南","link":"#进阶指南","children":[{"level":3,"title":"繁体字修正","slug":"繁体字修正","link":"#繁体字修正","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"开机后不能输出中文","slug":"开机后不能输出中文","link":"#开机后不能输出中文","children":[]},{"level":3,"title":"输入法报错","slug":"输入法报错","link":"#输入法报错","children":[]},{"level":3,"title":"切换输入法状态","slug":"切换输入法状态","link":"#切换输入法状态","children":[]},{"level":3,"title":"输入法候选框闪烁","slug":"输入法候选框闪烁","link":"#输入法候选框闪烁","children":[]},{"level":3,"title":"删除错误「上屏」的词","slug":"删除错误「上屏」的词","link":"#删除错误「上屏」的词","children":[]},{"level":3,"title":"符号直接上屏","slug":"符号直接上屏","link":"#符号直接上屏","children":[]},{"level":3,"title":"指定程序中默认输入法","slug":"指定程序中默认输入法","link":"#指定程序中默认输入法","children":[]},{"level":3,"title":"不能输出 emoji","slug":"不能输出-emoji","link":"#不能输出-emoji","children":[]},{"level":3,"title":"无法触发词库的特殊符号","slug":"无法触发词库的特殊符号","link":"#无法触发词库的特殊符号","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":7.87,"words":2361},"filePathRelative":"_posts/2020-11-27-rime_input.md","localizedDate":"2020年11月27日","excerpt":"

    常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器

    \\n

    之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。

    \\n

    Rime 小狼毫输入法下载:官方渠道国内搬运

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-40853dbc.1c284d04.js b/assets/js/2020-12-17-weight_log.html.fe0f7168.js similarity index 97% rename from assets/js/v-40853dbc.1c284d04.js rename to assets/js/2020-12-17-weight_log.html.fe0f7168.js index 55221390b..356c14a2c 100644 --- a/assets/js/v-40853dbc.1c284d04.js +++ b/assets/js/2020-12-17-weight_log.html.fe0f7168.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5844],{9720:(g,t)=>{t.c=(g,t)=>{const d=g.__vccOpts||g;for(const[g,e]of t)d[g]=e;return d}},5980:(g,t,d)=>{d.r(t),d.d(t,{comp:()=>o,data:()=>n});var e=d(3968);const r=[(0,e.IL)('

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    食谱初期容易有点饿,我逐渐将作息推早。原本睡觉多在凌晨 2、3 点,提前到 10、11 点睡。早睡后,起床时间也自动提早,一般 6 点起床。有时会 3、4 点突然起床,不知是什么原因。如果早起了,就直接起来工作,整天一样有精神。

    个人体验,前两周掉的主要是浮肉,平常吃的太多,一直在身体积累。对于超重的人,控制摄入量后,掉肉会非常明显。

    使用食谱前,先需要养成正确的减重习惯和心态。

    • 不要让自己饿肚子,每天至少要吃 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)],a={},o=(0,d(9720).c)(a,[["render",function(g,t){return(0,e.Wz)(),(0,e.An)("div",null,r)}]]),n=JSON.parse('{"path":"/posts/2020-12-17-weight_log.html","title":"减肥日志:4 周 15 斤","lang":"zh-CN","frontmatter":{"title":"减肥日志:4 周 15 斤","date":"2020-12-17T00:00:00.000Z","category":["健康"],"tag":["减肥"],"order":-33,"description":"巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃。 一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。 190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。 严格按照食谱...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-12-17-weight_log.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"减肥日志:4 周 15 斤"}],["meta",{"property":"og:description","content":"巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃。 一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。 190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。 严格按照食谱..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20201217094443.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"减肥日志:4 周 15 斤"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"减肥"}],["meta",{"property":"article:published_time","content":"2020-12-17T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"减肥日志:4 周 15 斤\\",\\"image\\":[\\"https://img.newzone.top/20201217094443.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2020-12-17T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":11.46,"words":3439},"filePathRelative":"_posts/2020-12-17-weight_log.md","localizedDate":"2020年12月17日","excerpt":"

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    \\n

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    \\n

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    \\n

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2013],{3671:(g,t)=>{t.A=(g,t)=>{const d=g.__vccOpts||g;for(const[g,e]of t)d[g]=e;return d}},3215:(g,t,d)=>{d.r(t),d.d(t,{comp:()=>o,data:()=>n});var e=d(7847);const r=[(0,e.Fv)('

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    食谱初期容易有点饿,我逐渐将作息推早。原本睡觉多在凌晨 2、3 点,提前到 10、11 点睡。早睡后,起床时间也自动提早,一般 6 点起床。有时会 3、4 点突然起床,不知是什么原因。如果早起了,就直接起来工作,整天一样有精神。

    个人体验,前两周掉的主要是浮肉,平常吃的太多,一直在身体积累。对于超重的人,控制摄入量后,掉肉会非常明显。

    使用食谱前,先需要养成正确的减重习惯和心态。

    • 不要让自己饿肚子,每天至少要吃 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)],a={},o=(0,d(3671).A)(a,[["render",function(g,t){return(0,e.uX)(),(0,e.CE)("div",null,r)}]]),n=JSON.parse('{"path":"/posts/2020-12-17-weight_log.html","title":"减肥日志:4 周 15 斤","lang":"zh-CN","frontmatter":{"title":"减肥日志:4 周 15 斤","date":"2020-12-17T00:00:00.000Z","category":["健康"],"tag":["减肥"],"order":-33,"description":"巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃。 一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。 190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。 严格按照食谱...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-12-17-weight_log.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"减肥日志:4 周 15 斤"}],["meta",{"property":"og:description","content":"巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃。 一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。 190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。 严格按照食谱..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20201217094443.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"减肥日志:4 周 15 斤"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"减肥"}],["meta",{"property":"article:published_time","content":"2020-12-17T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"减肥日志:4 周 15 斤\\",\\"image\\":[\\"https://img.newzone.top/20201217094443.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2020-12-17T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":11.46,"words":3439},"filePathRelative":"_posts/2020-12-17-weight_log.md","localizedDate":"2020年12月17日","excerpt":"

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    \\n

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    \\n

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    \\n

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5b5cc116.a2f40de8.js b/assets/js/2021-01-02-keepass_the_real_lastpassword.html.ac1757e2.js similarity index 63% rename from assets/js/v-5b5cc116.a2f40de8.js rename to assets/js/2021-01-02-keepass_the_real_lastpassword.html.ac1757e2.js index 1128b0bf1..958ff70af 100644 --- a/assets/js/v-5b5cc116.a2f40de8.js +++ b/assets/js/2021-01-02-keepass_the_real_lastpassword.html.ac1757e2.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6808],{9720:(e,a)=>{a.c=(e,a)=>{const t=e.__vccOpts||e;for(const[e,s]of a)t[e]=s;return t}},8688:(e,a,t)=>{t.r(a),t.d(a,{comp:()=>le,data:()=>oe});var s=t(3968);const n=(0,s.QD)("p",null,"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。",-1),r=(0,s.QD)("p",null,[(0,s.mY)("之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择"),(0,s.QD)("strong",null,"开源免费且自动填充超强"),(0,s.mY)("的 KeePass。")],-1),l=(0,s.QD)("p",null,[(0,s.mY)("KeePass 的密码保存在本地的 "),(0,s.QD)("code",null,".kdbx"),(0,s.mY)(" 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。")],-1),o={href:"https://keepass.info/download.html",target:"_blank",rel:"noopener noreferrer"},p=(0,s.QD)("code",null,"Keepass2Android",-1),i=(0,s.QD)("code",null,"Strongbox",-1),c=(0,s.QD)("code",null,"KeePassium",-1),h=(0,s.IL)('

    接着我会逐步介绍 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),d={href:"https://github.com/pfn/keepasshttp",target:"_blank",rel:"noopener noreferrer"},u=(0,s.QD)("p",null,"如果网页有不能被识别用户名或密码框,可使用 KeePassHttp-Connector 的「Choose own credential fields for this page」功能。",-1),m=(0,s.QD)("h3",{id:"kpenhancedentryview",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#kpenhancedentryview"},[(0,s.QD)("span",null,"KPEnhancedEntryView")])],-1),g={href:"https://keepass.info/plugins.html#kpenhentryview",target:"_blank",rel:"noopener noreferrer"},f=(0,s.QD)("ul",null,[(0,s.QD)("li",null,"在主界面中点击「显示」>「窗口布局」>「平铺」;"),(0,s.QD)("li",null,"在主界面中点击「显示」>「列设置」,只选择:「标题」>「确定」。大家也可以按自己要求选择。")],-1),k=(0,s.QD)("h3",{id:"autotypesearch",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#autotypesearch"},[(0,s.QD)("span",null,"AutoTypeSearch")])],-1),D={href:"https://keepass.info/plugins.html#atsearch",target:"_blank",rel:"noopener noreferrer"},K=(0,s.QD)("code",null,"Ctrl+Shift+A",-1),Q=(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://img.newzone.top/20191013083950.png",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption",null,"AutoTypeSearch 通用设置")],-1),P=(0,s.QD)("h3",{id:"kp-entry-templates",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#kp-entry-templates"},[(0,s.QD)("span",null,"KP Entry Templates")])],-1),b={href:"https://github.com/mitchcapper/KPEntryTemplates",target:"_blank",rel:"noopener noreferrer"},y=(0,s.QD)("ol",null,[(0,s.QD)("li",null,"点击 KeePass 主界面的「文件」>「数据库设置」>「高级」,在「模板记录组」中选择一个群组,点击「确定」;"),(0,s.QD)("li",null,"返回主界面,点击步骤 1 中选择的群组,按 Ctrl+I(或点击上方工具栏的钥匙图标)添加记录;"),(0,s.QD)("li",null,[(0,s.mY)("点击「自动输入」,勾选「双通道自动输入混淆」("),(0,s.QD)("strong",null,"以后用模板添加记录时就不需要再勾选,一劳永逸"),(0,s.mY)(");")]),(0,s.QD)("li",null,"点击最左边的「Template」>「Init As Template」,配置好所需模板,点击「确定」。")],-1),w=(0,s.QD)("h3",{id:"kpsourceforgeupdatechecker",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#kpsourceforgeupdatechecker"},[(0,s.QD)("span",null,"KPSourceForgeUpdateChecker")])],-1),Y={href:"https://sourceforge.net/projects/kpsfupdatechecker/reviews",target:"_blank",rel:"noopener noreferrer"},v=(0,s.QD)("h2",{id:"可选插件",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#可选插件"},[(0,s.QD)("span",null,"可选插件")])],-1),T=(0,s.QD)("h3",{id:"early-update-check",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#early-update-check"},[(0,s.QD)("span",null,"Early update Check")])],-1),_={href:"https://github.com/Rookiestyle/EarlyUpdateCheck",target:"_blank",rel:"noopener noreferrer"},C=(0,s.QD)("h3",{id:"keetraytotp",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#keetraytotp"},[(0,s.QD)("span",null,"KeeTrayTOTP")])],-1),x={href:"https://github.com/victor-rds/KeeTrayTOTP/releases/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://www.cnblogs.com/tielemao/p/9613839.html",target:"_blank",rel:"noopener noreferrer"},A=(0,s.QD)("h3",{id:"webautotype",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#webautotype"},[(0,s.QD)("span",null,"WebAutoType")])],-1),S={href:"https://keepass.info/plugins.html#webautotype",target:"_blank",rel:"noopener noreferrer"},L=(0,s.QD)("h3",{id:"yet-another-favicon-downloader",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#yet-another-favicon-downloader"},[(0,s.QD)("span",null,"Yet Another Favicon Downloader")])],-1),z={href:"https://keepass.info/plugins.html#yafd",target:"_blank",rel:"noopener noreferrer"},R=(0,s.QD)("h3",{id:"hibp-offline-check",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#hibp-offline-check"},[(0,s.QD)("span",null,"HIBP Offline Check")])],-1),F={href:"https://github.com/mihaifm/HIBPOfflineCheck",target:"_blank",rel:"noopener noreferrer"},B={href:"https://haveibeenpwned.com/",target:"_blank",rel:"noopener noreferrer"},O=(0,s.QD)("h3",{id:"keepassrpc",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#keepassrpc"},[(0,s.QD)("span",null,"KeePassRPC")])],-1),H={href:"https://github.com/kee-org/keepassrpc/releases/",target:"_blank",rel:"noopener noreferrer"},I=(0,s.QD)("strong",null,"自动填充密码并登录",-1),M=(0,s.QD)("p",null,"其他插件不能自动登录,只有 Kee 能做到该功能。使用 Kee 的自动登录功能后,少数页面会出现循环登录,需暂停 Kee 扩展来停止循环错误。",-1),N=(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://img.newzone.top/2022-05-05-14-29-32.png",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption",null,"Kee 设置")],-1),U=(0,s.QD)("h3",{id:"keepassnatmsg",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#keepassnatmsg"},[(0,s.QD)("span",null,"KeePassNatMsg")])],-1),W=(0,s.QD)("p",null,"浏览器插件 KeePassHttp-Connector 已不再更新,有段时间甚至不兼容新版 KeePass。",-1),Z={href:"https://github.com/smorks/keepassnatmsg",target:"_blank",rel:"noopener noreferrer"},j=(0,s.IL)('

    如果报错「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),X={href:"https://wwz.lanzouy.com/iJ6yA0bve7wb",target:"_blank",rel:"noopener noreferrer"},q={href:"https://pan.baidu.com/s/1dm0djnDGq8SOsTPy3jByZg?pwd=nrwj",target:"_blank",rel:"noopener noreferrer"},V=(0,s.IL)('

    KeePass 懒人包为绿色版,集成了常用插件,建立数据库即可使用 KeePass。

    建立数据库:

    1. 解压懒人包,打开程序 KeePass.exe

    2. 屏幕右下角托盘处,打开 KeePass。

    3. 菜单栏上点击「文件」>「新建」,建立属于你的密码数据库。

      KeePass 懒人包设置

    懒人包集成插件:AutoTypeSearch,Entry Templates,KeePassHttp,KeePassNatMsg,KeePassRpc,KeeTrayTOTP,KPEnhancedEntryView,SourceForgeUpdateChecker,WebAutoType。


    ',5),J={class:"footnotes"},G={class:"footnotes-list"},$={id:"footnote1",class:"footnote-item"},ee={href:"https://blog.csdn.net/SingWarm/article/details/90669580",target:"_blank",rel:"noopener noreferrer"},ae=(0,s.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),te={id:"footnote2",class:"footnote-item"},se={href:"https://keepass.info/help/base/fieldrefs.html",target:"_blank",rel:"noopener noreferrer"},ne=(0,s.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),re={},le=(0,t(9720).c)(re,[["render",function(e,a){const t=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[n,r,l,(0,s.QD)("p",null,[(0,s.mY)("KeePass 官网下载(Windows):"),(0,s.QD)("a",o,[(0,s.mY)("https://keepass.info/download.html"),(0,s.K2)(t)]),(0,s.mY)("。安卓推荐 "),p,(0,s.mY)(",iOS/Mac 推荐 "),i,(0,s.mY)(" 或 "),c,(0,s.mY)("。")]),h,(0,s.QD)("p",null,[(0,s.QD)("a",d,[(0,s.mY)("KeePassHttp"),(0,s.K2)(t)]),(0,s.mY)(" 是 Keepass 的连接核心,搭配浏览器插件 KeePassHttp-Connector,可以实现浏览器自动填充密码效果。")]),u,m,(0,s.QD)("p",null,[(0,s.QD)("a",g,[(0,s.mY)("KPEnhancedEntryView"),(0,s.K2)(t)]),(0,s.mY)(" 增强视觉效果,为达到最佳显示效果,按以下配置:")]),f,k,(0,s.QD)("p",null,[(0,s.QD)("a",D,[(0,s.mY)("AutoTypeSearch"),(0,s.K2)(t)]),(0,s.mY)(" 提供全局框,输入热键 "),K,(0,s.mY)(" 后,搜索关键词输入密码。")]),Q,P,(0,s.QD)("p",null,[(0,s.QD)("a",b,[(0,s.mY)("KP Entry Templates"),(0,s.K2)(t)]),(0,s.mY)(" 可以设置保存模板,配置方法如下:")]),y,w,(0,s.QD)("p",null,[(0,s.QD)("a",Y,[(0,s.mY)("KPSourceForgeUpdateChecker"),(0,s.K2)(t)]),(0,s.mY)(" 可以帮助检查 KeePass 及其插件是否有更新,功能从菜单栏上点击「帮助」>「检查更新」进入,会使用 SourceForge 上的插件更新信息。")]),v,T,(0,s.QD)("p",null,[(0,s.QD)("a",_,[(0,s.mY)("Early Update Check"),(0,s.K2)(t)]),(0,s.mY)(" 可以一键式更新 KeePass 及其插件,支持安装包和便携版的安装方式。")]),C,(0,s.QD)("p",null,[(0,s.mY)("如果你有更高安全要求,"),(0,s.QD)("a",x,[(0,s.mY)("KeeTrayTOTP"),(0,s.K2)(t)]),(0,s.mY)(" 能增加二次动态验证,使用参考"),(0,s.QD)("a",E,[(0,s.mY)("使用 KeePass 管理两步验证"),(0,s.K2)(t)]),(0,s.mY)("。")]),A,(0,s.QD)("p",null,[(0,s.QD)("a",S,[(0,s.mY)("WebAutoType"),(0,s.K2)(t)]),(0,s.mY)(" 是很多人的推荐插件,启动密码热键后会自动匹配当前网址、标题。这对于已经有大量密码的人来说,并不实用,可不安装。")]),L,(0,s.QD)("p",null,[(0,s.QD)("a",z,[(0,s.mY)("Yet Another Favicon Downloader"),(0,s.K2)(t)]),(0,s.mY)(" 插件能自动匹配下载网站图标,但会大幅增加数据库的大小。不在意界面美观度的话,无需安装 Yet Another Favicon Downloader。")]),R,(0,s.QD)("p",null,[(0,s.QD)("a",F,[(0,s.mY)("HIBP Offline Check"),(0,s.K2)(t)]),(0,s.mY)(" 可以使用 "),(0,s.QD)("a",B,[(0,s.mY)("have i been pwned?"),(0,s.K2)(t)]),(0,s.mY)(" 在线检查密码库,也能使用本地数据库离线检查。")]),O,(0,s.QD)("p",null,[(0,s.QD)("a",H,[(0,s.mY)("KeePassRPC"),(0,s.K2)(t)]),(0,s.mY)(" 搭配浏览器插件 Kee,能实现"),I,(0,s.mY)("。")]),M,N,U,W,(0,s.QD)("p",null,[(0,s.mY)("如果遇到不兼容,可使用 "),(0,s.QD)("a",Z,[(0,s.mY)("KeePassNatMsg"),(0,s.K2)(t)]),(0,s.mY)(" 和 KeePassXC-Browser 连接浏览器,本方案不支持搜狗浏览器。")]),j,(0,s.QD)("p",null,[(0,s.mY)("2022.09.17 更新懒人包:"),(0,s.QD)("a",X,[(0,s.mY)("蓝奏云"),(0,s.K2)(t)]),(0,s.mY)(","),(0,s.QD)("a",q,[(0,s.mY)("百度云盘"),(0,s.K2)(t)]),(0,s.mY)(" 提取码:nrwj。")]),V,(0,s.QD)("section",J,[(0,s.QD)("ol",G,[(0,s.QD)("li",$,[(0,s.QD)("p",null,[(0,s.QD)("a",ee,[(0,s.mY)("Keepass 教程之二——完美的通用自动输入规则"),(0,s.K2)(t)]),(0,s.mY)(),ae])]),(0,s.QD)("li",te,[(0,s.QD)("p",null,[(0,s.QD)("a",se,[(0,s.mY)("Field References-KeePass"),(0,s.K2)(t)]),(0,s.mY)(),ne])])])])])}]]),oe=JSON.parse('{"path":"/posts/2021-01-02-keepass_the_real_lastpassword.html","title":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件","lang":"zh-CN","frontmatter":{"title":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件","subtitle":"我的最后一款密码管理器","date":"2021-01-02T00:00:00.000Z","category":["工具"],"tag":["KeePass"],"order":-34,"description":"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。 之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。 KeePass...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-01-02-keepass_the_real_lastpassword.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件"}],["meta",{"property":"og:description","content":"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。 之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。 KeePass..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-10-18-11-41-15.png \\"引用字段设置步骤\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"KeePass"}],["meta",{"property":"article:published_time","content":"2021-01-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件\\",\\"image\\":[\\"https://img.newzone.top/2022-10-18-11-41-15.png \\\\\\"引用字段设置步骤\\\\\\"\\",\\"https://img.newzone.top/20191013083950.png \\\\\\"AutoTypeSearch 通用设置\\\\\\"\\",\\"https://img.newzone.top/2022-05-05-14-29-32.png \\\\\\"Kee 设置\\\\\\"\\",\\"https://img.newzone.top/KeePass_new_kdbx.gif?imageMogr2/format/webp \\\\\\"KeePass 懒人包设置\\\\\\"\\"],\\"datePublished\\":\\"2021-01-02T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"KeePass 设置","slug":"keepass-设置","link":"#keepass-设置","children":[{"level":3,"title":"选项设置","slug":"选项设置","link":"#选项设置","children":[]},{"level":3,"title":"自动输入规则","slug":"自动输入规则","link":"#自动输入规则","children":[]},{"level":3,"title":"匹配多个网址","slug":"匹配多个网址","link":"#匹配多个网址","children":[]}]},{"level":2,"title":"必备插件","slug":"必备插件","link":"#必备插件","children":[{"level":3,"title":"KeePassHttp","slug":"keepasshttp","link":"#keepasshttp","children":[]},{"level":3,"title":"KPEnhancedEntryView","slug":"kpenhancedentryview","link":"#kpenhancedentryview","children":[]},{"level":3,"title":"AutoTypeSearch","slug":"autotypesearch","link":"#autotypesearch","children":[]},{"level":3,"title":"KP Entry Templates","slug":"kp-entry-templates","link":"#kp-entry-templates","children":[]},{"level":3,"title":"KPSourceForgeUpdateChecker","slug":"kpsourceforgeupdatechecker","link":"#kpsourceforgeupdatechecker","children":[]}]},{"level":2,"title":"可选插件","slug":"可选插件","link":"#可选插件","children":[{"level":3,"title":"Early update Check","slug":"early-update-check","link":"#early-update-check","children":[]},{"level":3,"title":"KeeTrayTOTP","slug":"keetraytotp","link":"#keetraytotp","children":[]},{"level":3,"title":"WebAutoType","slug":"webautotype","link":"#webautotype","children":[]},{"level":3,"title":"Yet Another Favicon Downloader","slug":"yet-another-favicon-downloader","link":"#yet-another-favicon-downloader","children":[]},{"level":3,"title":"HIBP Offline Check","slug":"hibp-offline-check","link":"#hibp-offline-check","children":[]},{"level":3,"title":"KeePassRPC","slug":"keepassrpc","link":"#keepassrpc","children":[]},{"level":3,"title":"KeePassNatMsg","slug":"keepassnatmsg","link":"#keepassnatmsg","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"多账户排序","slug":"多账户排序","link":"#多账户排序","children":[]},{"level":3,"title":"为什么不选 KeepassXC","slug":"为什么不选-keepassxc","link":"#为什么不选-keepassxc","children":[]}]},{"level":2,"title":"KeePass 懒人包","slug":"keepass-懒人包","link":"#keepass-懒人包","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13}]},"readingTime":{"minutes":6.18,"words":1855},"filePathRelative":"_posts/2021-01-02-keepass_the_real_lastpassword.md","localizedDate":"2021年1月2日","excerpt":"

    用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。

    \\n

    之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。

    \\n

    KeePass 的密码保存在本地的 .kdbx 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2658],{3671:(e,a)=>{a.A=(e,a)=>{const t=e.__vccOpts||e;for(const[e,s]of a)t[e]=s;return t}},6975:(e,a,t)=>{t.r(a),t.d(a,{comp:()=>le,data:()=>oe});var s=t(7847);const n=(0,s.Lk)("p",null,"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。",-1),r=(0,s.Lk)("p",null,[(0,s.eW)("之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择"),(0,s.Lk)("strong",null,"开源免费且自动填充超强"),(0,s.eW)("的 KeePass。")],-1),l=(0,s.Lk)("p",null,[(0,s.eW)("KeePass 的密码保存在本地的 "),(0,s.Lk)("code",null,".kdbx"),(0,s.eW)(" 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。")],-1),o={href:"https://keepass.info/download.html",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Lk)("code",null,"Keepass2Android",-1),i=(0,s.Lk)("code",null,"Strongbox",-1),c=(0,s.Lk)("code",null,"KeePassium",-1),h=(0,s.Fv)('

    接着我会逐步介绍 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),k={href:"https://github.com/pfn/keepasshttp",target:"_blank",rel:"noopener noreferrer"},d=(0,s.Lk)("p",null,"如果网页有不能被识别用户名或密码框,可使用 KeePassHttp-Connector 的「Choose own credential fields for this page」功能。",-1),u=(0,s.Lk)("h3",{id:"kpenhancedentryview",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#kpenhancedentryview"},[(0,s.Lk)("span",null,"KPEnhancedEntryView")])],-1),g={href:"https://keepass.info/plugins.html#kpenhentryview",target:"_blank",rel:"noopener noreferrer"},f=(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,"在主界面中点击「显示」>「窗口布局」>「平铺」;"),(0,s.Lk)("li",null,"在主界面中点击「显示」>「列设置」,只选择:「标题」>「确定」。大家也可以按自己要求选择。")],-1),L=(0,s.Lk)("h3",{id:"autotypesearch",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#autotypesearch"},[(0,s.Lk)("span",null,"AutoTypeSearch")])],-1),b={href:"https://keepass.info/plugins.html#atsearch",target:"_blank",rel:"noopener noreferrer"},m=(0,s.Lk)("code",null,"Ctrl+Shift+A",-1),P=(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://img.newzone.top/20191013083950.png",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption",null,"AutoTypeSearch 通用设置")],-1),K=(0,s.Lk)("h3",{id:"kp-entry-templates",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#kp-entry-templates"},[(0,s.Lk)("span",null,"KP Entry Templates")])],-1),y={href:"https://github.com/mitchcapper/KPEntryTemplates",target:"_blank",rel:"noopener noreferrer"},w=(0,s.Lk)("ol",null,[(0,s.Lk)("li",null,"点击 KeePass 主界面的「文件」>「数据库设置」>「高级」,在「模板记录组」中选择一个群组,点击「确定」;"),(0,s.Lk)("li",null,"返回主界面,点击步骤 1 中选择的群组,按 Ctrl+I(或点击上方工具栏的钥匙图标)添加记录;"),(0,s.Lk)("li",null,[(0,s.eW)("点击「自动输入」,勾选「双通道自动输入混淆」("),(0,s.Lk)("strong",null,"以后用模板添加记录时就不需要再勾选,一劳永逸"),(0,s.eW)(");")]),(0,s.Lk)("li",null,"点击最左边的「Template」>「Init As Template」,配置好所需模板,点击「确定」。")],-1),W=(0,s.Lk)("h3",{id:"kpsourceforgeupdatechecker",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#kpsourceforgeupdatechecker"},[(0,s.Lk)("span",null,"KPSourceForgeUpdateChecker")])],-1),v={href:"https://sourceforge.net/projects/kpsfupdatechecker/reviews",target:"_blank",rel:"noopener noreferrer"},T=(0,s.Lk)("h2",{id:"可选插件",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#可选插件"},[(0,s.Lk)("span",null,"可选插件")])],-1),C=(0,s.Lk)("h3",{id:"early-update-check",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#early-update-check"},[(0,s.Lk)("span",null,"Early update Check")])],-1),_={href:"https://github.com/Rookiestyle/EarlyUpdateCheck",target:"_blank",rel:"noopener noreferrer"},x=(0,s.Lk)("h3",{id:"keetraytotp",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#keetraytotp"},[(0,s.Lk)("span",null,"KeeTrayTOTP")])],-1),E={href:"https://github.com/victor-rds/KeeTrayTOTP/releases/",target:"_blank",rel:"noopener noreferrer"},F={href:"https://www.cnblogs.com/tielemao/p/9613839.html",target:"_blank",rel:"noopener noreferrer"},A=(0,s.Lk)("h3",{id:"webautotype",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#webautotype"},[(0,s.Lk)("span",null,"WebAutoType")])],-1),S={href:"https://keepass.info/plugins.html#webautotype",target:"_blank",rel:"noopener noreferrer"},z=(0,s.Lk)("h3",{id:"yet-another-favicon-downloader",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#yet-another-favicon-downloader"},[(0,s.Lk)("span",null,"Yet Another Favicon Downloader")])],-1),R={href:"https://keepass.info/plugins.html#yafd",target:"_blank",rel:"noopener noreferrer"},B=(0,s.Lk)("h3",{id:"hibp-offline-check",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#hibp-offline-check"},[(0,s.Lk)("span",null,"HIBP Offline Check")])],-1),D={href:"https://github.com/mihaifm/HIBPOfflineCheck",target:"_blank",rel:"noopener noreferrer"},O={href:"https://haveibeenpwned.com/",target:"_blank",rel:"noopener noreferrer"},H=(0,s.Lk)("h3",{id:"keepassrpc",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#keepassrpc"},[(0,s.Lk)("span",null,"KeePassRPC")])],-1),M={href:"https://github.com/kee-org/keepassrpc/releases/",target:"_blank",rel:"noopener noreferrer"},N=(0,s.Lk)("strong",null,"自动填充密码并登录",-1),I=(0,s.Lk)("p",null,"其他插件不能自动登录,只有 Kee 能做到该功能。使用 Kee 的自动登录功能后,少数页面会出现循环登录,需暂停 Kee 扩展来停止循环错误。",-1),U=(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://img.newzone.top/2022-05-05-14-29-32.png",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption",null,"Kee 设置")],-1),X=(0,s.Lk)("h3",{id:"keepassnatmsg",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#keepassnatmsg"},[(0,s.Lk)("span",null,"KeePassNatMsg")])],-1),Z=(0,s.Lk)("p",null,"浏览器插件 KeePassHttp-Connector 已不再更新,有段时间甚至不兼容新版 KeePass。",-1),j={href:"https://github.com/smorks/keepassnatmsg",target:"_blank",rel:"noopener noreferrer"},Y=(0,s.Fv)('

    如果报错「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),q={href:"https://wwz.lanzouy.com/iJ6yA0bve7wb",target:"_blank",rel:"noopener noreferrer"},V={href:"https://pan.baidu.com/s/1dm0djnDGq8SOsTPy3jByZg?pwd=nrwj",target:"_blank",rel:"noopener noreferrer"},J=(0,s.Fv)('

    KeePass 懒人包为绿色版,集成了常用插件,建立数据库即可使用 KeePass。

    建立数据库:

    1. 解压懒人包,打开程序 KeePass.exe

    2. 屏幕右下角托盘处,打开 KeePass。

    3. 菜单栏上点击「文件」>「新建」,建立属于你的密码数据库。

      KeePass 懒人包设置

    懒人包集成插件:AutoTypeSearch,Entry Templates,KeePassHttp,KeePassNatMsg,KeePassRpc,KeeTrayTOTP,KPEnhancedEntryView,SourceForgeUpdateChecker,WebAutoType。


    ',5),G={class:"footnotes"},Q={class:"footnotes-list"},$={id:"footnote1",class:"footnote-item"},ee={href:"https://blog.csdn.net/SingWarm/article/details/90669580",target:"_blank",rel:"noopener noreferrer"},ae=(0,s.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),te={id:"footnote2",class:"footnote-item"},se={href:"https://keepass.info/help/base/fieldrefs.html",target:"_blank",rel:"noopener noreferrer"},ne=(0,s.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),re={},le=(0,t(3671).A)(re,[["render",function(e,a){const t=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[n,r,l,(0,s.Lk)("p",null,[(0,s.eW)("KeePass 官网下载(Windows):"),(0,s.Lk)("a",o,[(0,s.eW)("https://keepass.info/download.html"),(0,s.bF)(t)]),(0,s.eW)("。安卓推荐 "),p,(0,s.eW)(",iOS/Mac 推荐 "),i,(0,s.eW)(" 或 "),c,(0,s.eW)("。")]),h,(0,s.Lk)("p",null,[(0,s.Lk)("a",k,[(0,s.eW)("KeePassHttp"),(0,s.bF)(t)]),(0,s.eW)(" 是 Keepass 的连接核心,搭配浏览器插件 KeePassHttp-Connector,可以实现浏览器自动填充密码效果。")]),d,u,(0,s.Lk)("p",null,[(0,s.Lk)("a",g,[(0,s.eW)("KPEnhancedEntryView"),(0,s.bF)(t)]),(0,s.eW)(" 增强视觉效果,为达到最佳显示效果,按以下配置:")]),f,L,(0,s.Lk)("p",null,[(0,s.Lk)("a",b,[(0,s.eW)("AutoTypeSearch"),(0,s.bF)(t)]),(0,s.eW)(" 提供全局框,输入热键 "),m,(0,s.eW)(" 后,搜索关键词输入密码。")]),P,K,(0,s.Lk)("p",null,[(0,s.Lk)("a",y,[(0,s.eW)("KP Entry Templates"),(0,s.bF)(t)]),(0,s.eW)(" 可以设置保存模板,配置方法如下:")]),w,W,(0,s.Lk)("p",null,[(0,s.Lk)("a",v,[(0,s.eW)("KPSourceForgeUpdateChecker"),(0,s.bF)(t)]),(0,s.eW)(" 可以帮助检查 KeePass 及其插件是否有更新,功能从菜单栏上点击「帮助」>「检查更新」进入,会使用 SourceForge 上的插件更新信息。")]),T,C,(0,s.Lk)("p",null,[(0,s.Lk)("a",_,[(0,s.eW)("Early Update Check"),(0,s.bF)(t)]),(0,s.eW)(" 可以一键式更新 KeePass 及其插件,支持安装包和便携版的安装方式。")]),x,(0,s.Lk)("p",null,[(0,s.eW)("如果你有更高安全要求,"),(0,s.Lk)("a",E,[(0,s.eW)("KeeTrayTOTP"),(0,s.bF)(t)]),(0,s.eW)(" 能增加二次动态验证,使用参考"),(0,s.Lk)("a",F,[(0,s.eW)("使用 KeePass 管理两步验证"),(0,s.bF)(t)]),(0,s.eW)("。")]),A,(0,s.Lk)("p",null,[(0,s.Lk)("a",S,[(0,s.eW)("WebAutoType"),(0,s.bF)(t)]),(0,s.eW)(" 是很多人的推荐插件,启动密码热键后会自动匹配当前网址、标题。这对于已经有大量密码的人来说,并不实用,可不安装。")]),z,(0,s.Lk)("p",null,[(0,s.Lk)("a",R,[(0,s.eW)("Yet Another Favicon Downloader"),(0,s.bF)(t)]),(0,s.eW)(" 插件能自动匹配下载网站图标,但会大幅增加数据库的大小。不在意界面美观度的话,无需安装 Yet Another Favicon Downloader。")]),B,(0,s.Lk)("p",null,[(0,s.Lk)("a",D,[(0,s.eW)("HIBP Offline Check"),(0,s.bF)(t)]),(0,s.eW)(" 可以使用 "),(0,s.Lk)("a",O,[(0,s.eW)("have i been pwned?"),(0,s.bF)(t)]),(0,s.eW)(" 在线检查密码库,也能使用本地数据库离线检查。")]),H,(0,s.Lk)("p",null,[(0,s.Lk)("a",M,[(0,s.eW)("KeePassRPC"),(0,s.bF)(t)]),(0,s.eW)(" 搭配浏览器插件 Kee,能实现"),N,(0,s.eW)("。")]),I,U,X,Z,(0,s.Lk)("p",null,[(0,s.eW)("如果遇到不兼容,可使用 "),(0,s.Lk)("a",j,[(0,s.eW)("KeePassNatMsg"),(0,s.bF)(t)]),(0,s.eW)(" 和 KeePassXC-Browser 连接浏览器,本方案不支持搜狗浏览器。")]),Y,(0,s.Lk)("p",null,[(0,s.eW)("2022.09.17 更新懒人包:"),(0,s.Lk)("a",q,[(0,s.eW)("蓝奏云"),(0,s.bF)(t)]),(0,s.eW)(","),(0,s.Lk)("a",V,[(0,s.eW)("百度云盘"),(0,s.bF)(t)]),(0,s.eW)(" 提取码:nrwj。")]),J,(0,s.Lk)("section",G,[(0,s.Lk)("ol",Q,[(0,s.Lk)("li",$,[(0,s.Lk)("p",null,[(0,s.Lk)("a",ee,[(0,s.eW)("Keepass 教程之二——完美的通用自动输入规则"),(0,s.bF)(t)]),(0,s.eW)(),ae])]),(0,s.Lk)("li",te,[(0,s.Lk)("p",null,[(0,s.Lk)("a",se,[(0,s.eW)("Field References-KeePass"),(0,s.bF)(t)]),(0,s.eW)(),ne])])])])])}]]),oe=JSON.parse('{"path":"/posts/2021-01-02-keepass_the_real_lastpassword.html","title":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件","lang":"zh-CN","frontmatter":{"title":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件","subtitle":"我的最后一款密码管理器","date":"2021-01-02T00:00:00.000Z","category":["工具"],"tag":["KeePass"],"order":-34,"description":"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。 之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。 KeePass...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-01-02-keepass_the_real_lastpassword.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件"}],["meta",{"property":"og:description","content":"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。 之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。 KeePass..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-10-18-11-41-15.png \\"引用字段设置步骤\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"KeePass"}],["meta",{"property":"article:published_time","content":"2021-01-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件\\",\\"image\\":[\\"https://img.newzone.top/2022-10-18-11-41-15.png \\\\\\"引用字段设置步骤\\\\\\"\\",\\"https://img.newzone.top/20191013083950.png \\\\\\"AutoTypeSearch 通用设置\\\\\\"\\",\\"https://img.newzone.top/2022-05-05-14-29-32.png \\\\\\"Kee 设置\\\\\\"\\",\\"https://img.newzone.top/KeePass_new_kdbx.gif?imageMogr2/format/webp \\\\\\"KeePass 懒人包设置\\\\\\"\\"],\\"datePublished\\":\\"2021-01-02T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"KeePass 设置","slug":"keepass-设置","link":"#keepass-设置","children":[{"level":3,"title":"选项设置","slug":"选项设置","link":"#选项设置","children":[]},{"level":3,"title":"自动输入规则","slug":"自动输入规则","link":"#自动输入规则","children":[]},{"level":3,"title":"匹配多个网址","slug":"匹配多个网址","link":"#匹配多个网址","children":[]}]},{"level":2,"title":"必备插件","slug":"必备插件","link":"#必备插件","children":[{"level":3,"title":"KeePassHttp","slug":"keepasshttp","link":"#keepasshttp","children":[]},{"level":3,"title":"KPEnhancedEntryView","slug":"kpenhancedentryview","link":"#kpenhancedentryview","children":[]},{"level":3,"title":"AutoTypeSearch","slug":"autotypesearch","link":"#autotypesearch","children":[]},{"level":3,"title":"KP Entry Templates","slug":"kp-entry-templates","link":"#kp-entry-templates","children":[]},{"level":3,"title":"KPSourceForgeUpdateChecker","slug":"kpsourceforgeupdatechecker","link":"#kpsourceforgeupdatechecker","children":[]}]},{"level":2,"title":"可选插件","slug":"可选插件","link":"#可选插件","children":[{"level":3,"title":"Early update Check","slug":"early-update-check","link":"#early-update-check","children":[]},{"level":3,"title":"KeeTrayTOTP","slug":"keetraytotp","link":"#keetraytotp","children":[]},{"level":3,"title":"WebAutoType","slug":"webautotype","link":"#webautotype","children":[]},{"level":3,"title":"Yet Another Favicon Downloader","slug":"yet-another-favicon-downloader","link":"#yet-another-favicon-downloader","children":[]},{"level":3,"title":"HIBP Offline Check","slug":"hibp-offline-check","link":"#hibp-offline-check","children":[]},{"level":3,"title":"KeePassRPC","slug":"keepassrpc","link":"#keepassrpc","children":[]},{"level":3,"title":"KeePassNatMsg","slug":"keepassnatmsg","link":"#keepassnatmsg","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"多账户排序","slug":"多账户排序","link":"#多账户排序","children":[]},{"level":3,"title":"为什么不选 KeepassXC","slug":"为什么不选-keepassxc","link":"#为什么不选-keepassxc","children":[]}]},{"level":2,"title":"KeePass 懒人包","slug":"keepass-懒人包","link":"#keepass-懒人包","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13}]},"readingTime":{"minutes":6.18,"words":1855},"filePathRelative":"_posts/2021-01-02-keepass_the_real_lastpassword.md","localizedDate":"2021年1月2日","excerpt":"

    用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。

    \\n

    之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。

    \\n

    KeePass 的密码保存在本地的 .kdbx 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2021-01-27-blog_jekyll_to_wordpress.html.0697638c.js b/assets/js/2021-01-27-blog_jekyll_to_wordpress.html.0697638c.js new file mode 100644 index 000000000..03e977ad7 --- /dev/null +++ b/assets/js/2021-01-27-blog_jekyll_to_wordpress.html.0697638c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9544],{3671:(n,t)=>{t.A=(n,t)=>{const a=n.__vccOpts||n;for(const[n,e]of t)a[n]=e;return a}},3822:(n,t,a)=>{a.r(t),a.d(t,{comp:()=>w,data:()=>y});var e=a(7847);const s=(0,e.Lk)("p",null,"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。",-1),o=(0,e.Lk)("p",null,"2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。",-1),p=(0,e.Lk)("p",null,"Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。",-1),l=(0,e.Lk)("figure",null,[(0,e.Lk)("img",{src:"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/500x",alt:"",tabindex:"0",loading:"lazy"}),(0,e.Lk)("figcaption")],-1),r=(0,e.Lk)("h2",{id:"迁移步骤",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#迁移步骤"},[(0,e.Lk)("span",null,"迁移步骤")])],-1),c={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Fv)('
    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/" >\n  <item>\n    <title>标题</title>\n    <pubDate>发布日期</pubDate>\n    <content:encoded>内容</content:encoded>\n    <category>标签/目录 (该项将全部转为目录)</category>\n  </item>\n</rss>\n
    4. 登录 WordPress 后台,工具-导入-安装并启用插件 FeedWordPress 。自带 RSS 导入器许久不更新,极易报错,不推荐。

    5. 后台-Syndication-添加 rss 源,比如添加源 xxx.com/feed-wp.xml,其中 xxx.com 指你的博客网址。

    参考资料:

    ',2),u={href:"https://www.v2ex.com/t/73385",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.yiyult.com/201903155699.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://www.cnblogs.com/u0mo5/p/4100927.html",target:"_blank",rel:"noopener noreferrer"},g={href:"https://stackoverflow.com/questions/33212592/how-to-create-contentencoded-in-rss",target:"_blank",rel:"noopener noreferrer"},m={href:"content:encoded"},h={},w=(0,a(3671).A)(h,[["render",function(n,t){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[s,o,p,l,r,(0,e.Lk)("p",null,[(0,e.eW)("这里迁移的是 Jekyll 的 "),(0,e.Lk)("a",c,[(0,e.eW)("Hux blog 模板"),(0,e.bF)(a)]),(0,e.eW)(",Hexo 或其他 Jekyll 博客可以参照微调。")]),i,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",u,[(0,e.eW)("有没有办法把 Markdown 写的博客迁移到 wordpress?"),(0,e.bF)(a)])])]),(0,e.Lk)("li",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",k,[(0,e.eW)("WordPress 从 RSS 导入文章"),(0,e.bF)(a)])])]),(0,e.Lk)("li",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",d,[(0,e.eW)("有关 WordPress 的 Rss 导入指南"),(0,e.bF)(a)])])]),(0,e.Lk)("li",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",g,[(0,e.eW)("How to create "),(0,e.Lk)("a",m,[(0,e.eW)("content:encoded"),(0,e.bF)(a)]),(0,e.eW)(" in RSS")])])])])])}]]),y=JSON.parse('{"path":"/posts/2021-01-27-blog_jekyll_to_wordpress.html","title":"Jekyll 博客迁移-从 Markdown 到 WordPress","lang":"zh-CN","frontmatter":{"title":"Jekyll 博客迁移-从 Markdown 到 WordPress","date":"2021-01-27T00:00:00.000Z","category":["博客"],"tag":["Jekyll","WordPress"],"order":-35,"description":"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。 2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-01-27-blog_jekyll_to_wordpress.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 博客迁移-从 Markdown 到 WordPress"}],["meta",{"property":"og:description","content":"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。 2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/500x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Jekyll 博客迁移-从 Markdown 到 WordPress"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"WordPress"}],["meta",{"property":"article:published_time","content":"2021-01-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 博客迁移-从 Markdown 到 WordPress\\",\\"image\\":[\\"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/20210128120956.gif\\"],\\"datePublished\\":\\"2021-01-27T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"迁移步骤","slug":"迁移步骤","link":"#迁移步骤","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.79,"words":537},"filePathRelative":"_posts/2021-01-27-blog_jekyll_to_wordpress.md","localizedDate":"2021年1月27日","excerpt":"

    2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。

    \\n

    2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。

    \\n

    Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6e29d810.a6ce0b2d.js b/assets/js/2021-05-31-principles_criticism_and_self-criticism.html.bc1e867f.js similarity index 84% rename from assets/js/v-6e29d810.a6ce0b2d.js rename to assets/js/2021-05-31-principles_criticism_and_self-criticism.html.bc1e867f.js index 7365feb7b..c7e574f74 100644 --- a/assets/js/v-6e29d810.a6ce0b2d.js +++ b/assets/js/2021-05-31-principles_criticism_and_self-criticism.html.bc1e867f.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6372],{9720:(t,e)=>{e.c=(t,e)=>{const l=t.__vccOpts||t;for(const[t,n]of e)l[t]=n;return l}},9812:(t,e,l)=>{l.r(e),l.d(e,{comp:()=>b,data:()=>_});var n=l(3968);const r=(0,n.IL)('

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    理论支撑

    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评

    中国共产党的三大作风有:

    第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把马克思主义的普遍真理同中国革命的具体实践相结合,也就是运用马克思主义的立场、观点和方法,去分析、研究和解决中国革命的实际问题。

    第二,密切联系群众的作风,就是相信群众,依靠群众,尊重群众,向群众学习,对群众负责的作风,也就是要坚持历史唯物主义关于历史是人民群众创造的观点和辩证唯物主义认识论关于人民群众是认识的主体的观点,坚持党的群众路线和群众观点,实行“从群众中来,到群众中去”的工作方法,就是要求党一刻也不能脱离群众,一刻也不能放松群众工作,要为广大群众求解放,谋幸福。

    第三,批评和自我批评的作风,就是对党内、同志之间在思想上、作风上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助犯错误的同志提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

    融入到个人生活中变为:

    第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把理论知识与个人生活相结合,也就是站在客观角度,去分析、研究和解决个人生活的实际问题。

    第二,头脑极度透明,公开分享想法,在不擅长的领域请教擅长的其他人,不要固守你对事物「应该」是怎样的看法。

    第三,批评和自我批评的作风,就是对朋友、家人之间在思想上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助其他人提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

    以下是我给自己制订的方案,可结合自己的实际生活做出调整。

    实事求是地制订方案

    根据「你想要什么;事实是什么;面对事实,你如何实现目标」设定目标,然后写下清晰具体的方案,让任何人都能对照方案执行。

    方案要求:

    • 有明确的目标。
    • 找到问题:找到阻碍你实现这些目标的问题,准确诊断问题,发掘问题的根源,并且不容忍问题。
    • 制订方案:规划可以解决问题的方案,并严格执行。做一切必要的事来践行这些方案,实现成果。
    • 执行方案需要严格遵守方案的自律,如果执行中出现问题,思考该步任务是否符合目标。

    头脑透明地分享想法

    公开想法:让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    同时注意:

    • 不要固守你对事物「应该」是怎样的看法,这将使你无法了解真实的情况。
    • 在不擅长的领域请教擅长的其他人,或外包,或使用成熟的工具,或查看教程攻略。
    • 不要把不好的结果归咎于任何人,从自己身上找原因。

    批评和自我批评

    每月固定一个时间 (月底),对自身行为进行反思,并与家人、朋友分享自己的现状,征求他们的意见、批评。不用担心其他人的看法,不要担心自己的形象,而关心如何实现目标。

    行动计划

    按上列原则,制定行动计划 (不断调整):

    每日

    ',21),a=(0,n.QD)("p",null,[(0,n.QD)("strong",null,"早上创造美好情绪"),(0,n.mY)(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),i=(0,n.QD)("li",null,"唱歌:唱一首你喜欢的歌。(为减肥,我选择了外语美声歌曲,秋山雅史 - 千の風になって)",-1),o=(0,n.QD)("li",null,"录自拍视频:说一句话(当日目标?)鼓励自己。录制内容在前一天准备好,目的是给你带来积极情绪。",-1),p={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.IL)("
  • 人际连接:通过直播连麦与陌生人沟通 15 分钟。如:抖音 PK 语音直播。

    • 别人很重要:帮助别人,能让人更健康、更幸福。心情不好事,就去帮助其他人,心情会更好。
    • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
  • 微习惯

    • 工作 20 分钟休息 20 秒,做 10 个深蹲。
    • 出书房或上完厕所,做 10 个俯卧撑。
    • 俯卧撑、深蹲前,在磁性板上写正字来记录,一个笔画代表一组(10 个)。
  • 间隔学习:通过 SuperMemo 的记忆模型,复习心理认知、沟通理论、行为反思在内的笔记。

  • 当日回顾:记录 3 件好事,总结好事发生的原因,给家人分享好事。 这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

  • ",4),d=(0,n.QD)("p",null,[(0,n.QD)("strong",null,"定期"),(0,n.mY)(":")],-1),c=(0,n.QD)("strong",null,"月底反思",-1),h={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},g=(0,n.QD)("li",null,[(0,n.QD)("strong",null,"积极自我介绍"),(0,n.mY)(":每隔三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),m=(0,n.QD)("p",null,[(0,n.QD)("strong",null,"公开记录"),(0,n.mY)(":")],-1),f={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},D=(0,n.QD)("li",null,[(0,n.QD)("p",null,"微习惯视频:监督运动习惯。拍摄视频时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。")],-1),x=(0,n.QD)("p",null,"下一步,寻找更多的党组理论根据和执行书籍资料,相信一个成熟的组织不是无故崛起,更不会无故持续这么些年。",-1),Q={},b=(0,l(9720).c)(Q,[["render",function(t,e){const l=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[r,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[a,(0,n.QD)("ul",null,[i,o,(0,n.QD)("li",null,[(0,n.mY)("参考"),(0,n.QD)("a",p,[(0,n.mY)("积极心理学"),(0,n.K2)(l)]),(0,n.mY)(",收集积极情绪材料放在醒目的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。")])])]),s]),d,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[c,(0,n.mY)(":检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 "),(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.mY)("复盘笔记参照 "),(0,n.QD)("a",h,[(0,n.mY)("Allison Seboldt"),(0,n.K2)(l)]),(0,n.mY)(",作者每个月都会进行「回顾」,分享他的收入并反思上个月的成就。")]),(0,n.QD)("li",null,[(0,n.mY)("读 "),(0,n.QD)("a",u,[(0,n.mY)("JustinJ ackson"),(0,n.K2)(l)]),(0,n.mY)(" – 作者在 2018 年初创办  Transistor  以来,一直在分享他的项目。他整理了在此过程中学到的许多经验教训。")])])]),g]),m,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.QD)("a",f,[(0,n.mY)("学习笔记"),(0,n.K2)(l)]),(0,n.mY)(":将对工具、工作方式和生活的思考记录发布在公开页面,欢迎大家的点评。")])]),(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("工作视频:"),(0,n.QD)("a",y,[(0,n.mY)("自我监控视频"),(0,n.K2)(l)]),(0,n.mY)(",记录私密工作状态,方便当日回顾。")])]),D]),x])}]]),_=JSON.parse('{"path":"/posts/2021-05-31-principles_criticism_and_self-criticism.html","title":"普通人的生活原则-批评与自我批评","lang":"zh-CN","frontmatter":{"title":"普通人的生活原则-批评与自我批评","date":"2021-05-31T00:00:00.000Z","category":["头脑驿站"],"tag":["原则","批评与自我批评"],"order":-37,"description":"读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。 理论支撑 中国共产党的三大作风有: 第一,理论联系实际的作风,就是坚持实事求是,一切从实...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-05-31-principles_criticism_and_self-criticism.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"普通人的生活原则-批评与自我批评"}],["meta",{"property":"og:description","content":"读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。 理论支撑 中国共产党的三大作风有: 第一,理论联系实际的作风,就是坚持实事求是,一切从实..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"原则"}],["meta",{"property":"article:tag","content":"批评与自我批评"}],["meta",{"property":"article:published_time","content":"2021-05-31T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"普通人的生活原则-批评与自我批评\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2021-05-31T00:00:00.000Z\\",\\"dateModified\\":\\"2023-01-23T14:11:29.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"理论支撑","slug":"理论支撑","link":"#理论支撑","children":[]},{"level":2,"title":"实事求是地制订方案","slug":"实事求是地制订方案","link":"#实事求是地制订方案","children":[]},{"level":2,"title":"头脑透明地分享想法","slug":"头脑透明地分享想法","link":"#头脑透明地分享想法","children":[]},{"level":2,"title":"批评和自我批评","slug":"批评和自我批评","link":"#批评和自我批评","children":[]},{"level":2,"title":"行动计划","slug":"行动计划","link":"#行动计划","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":6.6,"words":1981},"filePathRelative":"_posts/2021-05-31-principles_criticism_and_self-criticism.md","localizedDate":"2021年5月31日","excerpt":"

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    \\n

    理论支撑

    \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8245],{3671:(t,e)=>{e.A=(t,e)=>{const l=t.__vccOpts||t;for(const[t,n]of e)l[t]=n;return l}},6281:(t,e,l)=>{l.r(e),l.d(e,{comp:()=>x,data:()=>_});var n=l(7847);const r=(0,n.Fv)('

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    理论支撑

    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评

    中国共产党的三大作风有:

    第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把马克思主义的普遍真理同中国革命的具体实践相结合,也就是运用马克思主义的立场、观点和方法,去分析、研究和解决中国革命的实际问题。

    第二,密切联系群众的作风,就是相信群众,依靠群众,尊重群众,向群众学习,对群众负责的作风,也就是要坚持历史唯物主义关于历史是人民群众创造的观点和辩证唯物主义认识论关于人民群众是认识的主体的观点,坚持党的群众路线和群众观点,实行“从群众中来,到群众中去”的工作方法,就是要求党一刻也不能脱离群众,一刻也不能放松群众工作,要为广大群众求解放,谋幸福。

    第三,批评和自我批评的作风,就是对党内、同志之间在思想上、作风上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助犯错误的同志提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

    融入到个人生活中变为:

    第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把理论知识与个人生活相结合,也就是站在客观角度,去分析、研究和解决个人生活的实际问题。

    第二,头脑极度透明,公开分享想法,在不擅长的领域请教擅长的其他人,不要固守你对事物「应该」是怎样的看法。

    第三,批评和自我批评的作风,就是对朋友、家人之间在思想上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助其他人提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

    以下是我给自己制订的方案,可结合自己的实际生活做出调整。

    实事求是地制订方案

    根据「你想要什么;事实是什么;面对事实,你如何实现目标」设定目标,然后写下清晰具体的方案,让任何人都能对照方案执行。

    方案要求:

    • 有明确的目标。
    • 找到问题:找到阻碍你实现这些目标的问题,准确诊断问题,发掘问题的根源,并且不容忍问题。
    • 制订方案:规划可以解决问题的方案,并严格执行。做一切必要的事来践行这些方案,实现成果。
    • 执行方案需要严格遵守方案的自律,如果执行中出现问题,思考该步任务是否符合目标。

    头脑透明地分享想法

    公开想法:让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    同时注意:

    • 不要固守你对事物「应该」是怎样的看法,这将使你无法了解真实的情况。
    • 在不擅长的领域请教擅长的其他人,或外包,或使用成熟的工具,或查看教程攻略。
    • 不要把不好的结果归咎于任何人,从自己身上找原因。

    批评和自我批评

    每月固定一个时间 (月底),对自身行为进行反思,并与家人、朋友分享自己的现状,征求他们的意见、批评。不用担心其他人的看法,不要担心自己的形象,而关心如何实现目标。

    行动计划

    按上列原则,制定行动计划 (不断调整):

    每日

    ',21),a=(0,n.Lk)("p",null,[(0,n.Lk)("strong",null,"早上创造美好情绪"),(0,n.eW)(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),i=(0,n.Lk)("li",null,"唱歌:唱一首你喜欢的歌。(为减肥,我选择了外语美声歌曲,秋山雅史 - 千の風になって)",-1),o=(0,n.Lk)("li",null,"录自拍视频:说一句话(当日目标?)鼓励自己。录制内容在前一天准备好,目的是给你带来积极情绪。",-1),p={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.Fv)("
  • 人际连接:通过直播连麦与陌生人沟通 15 分钟。如:抖音 PK 语音直播。

    • 别人很重要:帮助别人,能让人更健康、更幸福。心情不好事,就去帮助其他人,心情会更好。
    • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
  • 微习惯

    • 工作 20 分钟休息 20 秒,做 10 个深蹲。
    • 出书房或上完厕所,做 10 个俯卧撑。
    • 俯卧撑、深蹲前,在磁性板上写正字来记录,一个笔画代表一组(10 个)。
  • 间隔学习:通过 SuperMemo 的记忆模型,复习心理认知、沟通理论、行为反思在内的笔记。

  • 当日回顾:记录 3 件好事,总结好事发生的原因,给家人分享好事。 这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

  • ",4),d=(0,n.Lk)("p",null,[(0,n.Lk)("strong",null,"定期"),(0,n.eW)(":")],-1),c=(0,n.Lk)("strong",null,"月底反思",-1),h={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},g=(0,n.Lk)("li",null,[(0,n.Lk)("strong",null,"积极自我介绍"),(0,n.eW)(":每隔三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),k=(0,n.Lk)("p",null,[(0,n.Lk)("strong",null,"公开记录"),(0,n.eW)(":")],-1),f={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},m=(0,n.Lk)("li",null,[(0,n.Lk)("p",null,"微习惯视频:监督运动习惯。拍摄视频时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。")],-1),b=(0,n.Lk)("p",null,"下一步,寻找更多的党组理论根据和执行书籍资料,相信一个成熟的组织不是无故崛起,更不会无故持续这么些年。",-1),L={},x=(0,l(3671).A)(L,[["render",function(t,e){const l=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[r,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[a,(0,n.Lk)("ul",null,[i,o,(0,n.Lk)("li",null,[(0,n.eW)("参考"),(0,n.Lk)("a",p,[(0,n.eW)("积极心理学"),(0,n.bF)(l)]),(0,n.eW)(",收集积极情绪材料放在醒目的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。")])])]),s]),d,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[c,(0,n.eW)(":检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 "),(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.eW)("复盘笔记参照 "),(0,n.Lk)("a",h,[(0,n.eW)("Allison Seboldt"),(0,n.bF)(l)]),(0,n.eW)(",作者每个月都会进行「回顾」,分享他的收入并反思上个月的成就。")]),(0,n.Lk)("li",null,[(0,n.eW)("读 "),(0,n.Lk)("a",u,[(0,n.eW)("JustinJ ackson"),(0,n.bF)(l)]),(0,n.eW)(" – 作者在 2018 年初创办  Transistor  以来,一直在分享他的项目。他整理了在此过程中学到的许多经验教训。")])])]),g]),k,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.Lk)("a",f,[(0,n.eW)("学习笔记"),(0,n.bF)(l)]),(0,n.eW)(":将对工具、工作方式和生活的思考记录发布在公开页面,欢迎大家的点评。")])]),(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("工作视频:"),(0,n.Lk)("a",y,[(0,n.eW)("自我监控视频"),(0,n.bF)(l)]),(0,n.eW)(",记录私密工作状态,方便当日回顾。")])]),m]),b])}]]),_=JSON.parse('{"path":"/posts/2021-05-31-principles_criticism_and_self-criticism.html","title":"普通人的生活原则-批评与自我批评","lang":"zh-CN","frontmatter":{"title":"普通人的生活原则-批评与自我批评","date":"2021-05-31T00:00:00.000Z","category":["头脑驿站"],"tag":["原则","批评与自我批评"],"order":-37,"description":"读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。 理论支撑 中国共产党的三大作风有: 第一,理论联系实际的作风,就是坚持实事求是,一切从实...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-05-31-principles_criticism_and_self-criticism.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"普通人的生活原则-批评与自我批评"}],["meta",{"property":"og:description","content":"读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。 理论支撑 中国共产党的三大作风有: 第一,理论联系实际的作风,就是坚持实事求是,一切从实..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"原则"}],["meta",{"property":"article:tag","content":"批评与自我批评"}],["meta",{"property":"article:published_time","content":"2021-05-31T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"普通人的生活原则-批评与自我批评\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2021-05-31T00:00:00.000Z\\",\\"dateModified\\":\\"2023-01-23T14:11:29.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"理论支撑","slug":"理论支撑","link":"#理论支撑","children":[]},{"level":2,"title":"实事求是地制订方案","slug":"实事求是地制订方案","link":"#实事求是地制订方案","children":[]},{"level":2,"title":"头脑透明地分享想法","slug":"头脑透明地分享想法","link":"#头脑透明地分享想法","children":[]},{"level":2,"title":"批评和自我批评","slug":"批评和自我批评","link":"#批评和自我批评","children":[]},{"level":2,"title":"行动计划","slug":"行动计划","link":"#行动计划","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":6.6,"words":1981},"filePathRelative":"_posts/2021-05-31-principles_criticism_and_self-criticism.md","localizedDate":"2021年5月31日","excerpt":"

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    \\n

    理论支撑

    \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2021-10-23-nas_with_rsshub_and_huginn.html.938bb0ad.js b/assets/js/2021-10-23-nas_with_rsshub_and_huginn.html.938bb0ad.js new file mode 100644 index 000000000..0aa1a7910 --- /dev/null +++ b/assets/js/2021-10-23-nas_with_rsshub_and_huginn.html.938bb0ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3363],{3671:(n,e)=>{e.A=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},5530:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>y,data:()=>_});var a=t(7847);const s=(0,a.Fv)('

    作为一个重度 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),o=(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("strong",null,"关闭光猫路由"),(0,a.eW)(":通过电话联系宽带运营商,要求关闭光猫的路由功能。对于那些默认不提供公网 IP 的运营商,也可以在这个环节让运营商给你分配一个公网 IP。如果碰到死板的客服,找你要开通理由,不要正面回答。")])],-1),p=(0,a.Lk)("li",null,[(0,a.Lk)("p",null,"家用宽带通常使用动态 IP,且无法提供对外的 80 接口。可以使用动态 DNS 插件来实现域名与家庭宽带 IP 的实时绑定,以达到固定链接打开 NAS 服务的效果。")],-1),l=(0,a.Lk)("p",null,[(0,a.Lk)("strong",null,"动态 DNS(DDNS) 设置"),(0,a.eW)(",以下以 OpenWrt+Cloudflare 为例。")],-1),r={href:"https://p3terx.com/archives/openwrt-cloudflare-ddns.html",target:"_blank",rel:"noopener noreferrer"},i=(0,a.Lk)("code",null,"ddns-scripts_cloudflare.com-v4",-1),S={href:"https://dash.cloudflare.com/profile/api-tokens",target:"_blank",rel:"noopener noreferrer"},c={href:"https://ram.console.aliyun.com/users",target:"_blank",rel:"noopener noreferrer"},u=(0,a.Lk)("figure",null,[(0,a.Lk)("img",{src:"https://img.newzone.top/2022-05-05-14-41-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.Lk)("figcaption")],-1),g=(0,a.Fv)('

    如果你使用的是内网宽带,无法提供公网 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 文件,然后放入如下代码\n## yyy 代表链接参数,方便区分不同 rss 源,qqq 代表内部 rss 源路径\n## 注意:如果链接参数 yyy 参数中有中文,可用 UrlEncode 编码,避免 rss 阅读器报错。\n<?php\n    if($_GET['type']=="yyy"){\n        echo file_get_contents("http://home.xxx.com:34567/qqq");\n    }elseif($_GET['type']=="zzz"){\n        echo file_get_contents("http://home.xxx.com:34567/wwww");\n    }\n?>\n

    如果你没有服务器或不愿意再折腾,也可以尝试其他的 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,可以参考以下教程。

    ',16),d={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},h={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},f={},y=(0,t(3671).A)(f,[["render",function(n,e){const t=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[s,(0,a.Lk)("ol",null,[o,p,(0,a.Lk)("li",null,[l,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("Cloudflare 动态 DNS 配置 ("),(0,a.Lk)("a",r,[(0,a.eW)("教程"),(0,a.bF)(t)]),(0,a.eW)("):进入系统 - 软件包,搜索「cloudflare」,安装 "),i,(0,a.eW)(",然后重启路由器。")]),(0,a.Lk)("li",null,[(0,a.eW)("进入服务 - 动态 DNS,Cloudflare 登录密码为 "),(0,a.Lk)("a",S,[(0,a.eW)("Cloudflare API"),(0,a.bF)(t)]),(0,a.eW)(" 中的 Global API Key。如果你的域名托管在阿里云上,可以在 "),(0,a.Lk)("a",c,[(0,a.eW)("RAM 访问控制"),(0,a.bF)(t)]),(0,a.eW)(" 中创建拥有 AliyunDNSFullAccess 权限的 AccessKey。动态 DNS 的用户名和密码分别可以使用 AccessKey ID 和 AccessKey Secret。")])]),u])]),g,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",d,[(0,a.eW)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,a.bF)(t)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",h,[(0,a.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,a.bF)(t)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",m,[(0,a.eW)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,a.bF)(t)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",k,[(0,a.eW)("RSS 速成篇 2:RSSHub 自部署"),(0,a.bF)(t)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",R,[(0,a.eW)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,a.bF)(t)])])]),(0,a.Lk)("li",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",b,[(0,a.eW)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,a.bF)(t)])])])])])}]]),_=JSON.parse('{"path":"/posts/2021-10-23-nas_with_rsshub_and_huginn.html","title":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS","lang":"zh-CN","frontmatter":{"title":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS","date":"2021-10-23T00:00:00.000Z","category":["自动化"],"tag":["nas","rss"],"order":-38,"description":"作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时。 这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"}],["meta",{"property":"og:description","content":"作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时。 这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-14-40-43.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-12T02:07:50.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"nas"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2021-10-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-12T02:07:50.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-14-40-43.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-41-01.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-41-15.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-41-31.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2021-10-23T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-12T02:07:50.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"事前准备","slug":"事前准备","link":"#事前准备","children":[]},{"level":2,"title":"Docker 镜像安装","slug":"docker-镜像安装","link":"#docker-镜像安装","children":[]},{"level":2,"title":"域名绑定","slug":"域名绑定","link":"#域名绑定","children":[]},{"level":2,"title":"RSS 转码","slug":"rss-转码","link":"#rss-转码","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1699754870000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":6.74,"words":2022},"filePathRelative":"_posts/2021-10-23-nas_with_rsshub_and_huginn.md","localizedDate":"2021年10月23日","excerpt":"

    作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时

    \\n

    这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然而,由于配置过低,服务器频繁重启,维护成本不断上升。后来,我尝试了一些配置较高的国外服务器,例如 2 核 4G 低端服务器,但遇到了严重的超售和性能不稳定的问题。总的来说,购买国外的低端服务器(特别是俄罗斯服务器)就是把钱扔进水里。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-66abecb4.554701e7.js b/assets/js/2022-01-23-wechat_lucky_money_cover.html.7d693f27.js similarity index 79% rename from assets/js/v-66abecb4.554701e7.js rename to assets/js/2022-01-23-wechat_lucky_money_cover.html.7d693f27.js index aa24a24be..1670d7e9e 100644 --- a/assets/js/v-66abecb4.554701e7.js +++ b/assets/js/2022-01-23-wechat_lucky_money_cover.html.7d693f27.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1736],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,a]of t)n[e]=a;return n}},8848:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>y,data:()=>D});var a=n(3968);const i=(0,a.QD)("p",null,"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。",-1),o=(0,a.QD)("p",null,"春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。",-1),r=(0,a.QD)("figure",null,[(0,a.QD)("img",{src:"https://img.newzone.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x",alt:"",tabindex:"0",loading:"lazy"}),(0,a.QD)("figcaption")],-1),p=(0,a.QD)("p",null,"红包封面的设计并不复杂,新手也能轻松设计,但注册前提是要有至少 100 粉丝的视频号或公众号。",-1),l=(0,a.QD)("p",null,"接下来,我会介绍微信红包注册和定制流程。",-1),g=(0,a.QD)("h2",{id:"封面平台注册",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#封面平台注册"},[(0,a.QD)("span",null,"封面平台注册")])],-1),m={href:"https://cover.weixin.qq.com/",target:"_blank",rel:"noopener noreferrer"},c=(0,a.QD)("figure",null,[(0,a.QD)("img",{src:"https://img.newzone.top/2022-05-05-16-09-39.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.QD)("figcaption")],-1),s=(0,a.QD)("p",null,"个人认证环节需要有 100 粉丝以上的视频号或公众号。",-1),h=(0,a.QD)("figure",null,[(0,a.QD)("img",{src:"https://img.newzone.top/2022-05-05-16-09-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.QD)("figcaption")],-1),d=(0,a.QD)("p",null,"如果没有红包封面额度,可以自行购买。封面费用为 1 元/个,购买 n 个,则 n 个用户可以使用此款红包封面,有效期为半年。微信用户领取后,可在 3 个月内无限次使用该封面。",-1),u=(0,a.QD)("h2",{id:"红包封面设计",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#红包封面设计"},[(0,a.QD)("span",null,"红包封面设计")])],-1),f={href:"https://cover.weixin.qq.com/cgi-bin/mmcover-bin/readtemplate?t=page/index#/doc?page=design&index=-1",target:"_blank",rel:"noopener noreferrer"},b=(0,a.IL)('

    整个流程非常简单,即使不懂设计模板也能轻松上手。零基础用户可以使用小画家,有图层概念的用户可以使用 Figma。无论使用什么工具,只要上传喜欢的图片,就可以完成红包设计。

    示例基础图片 (推荐手写字体:杨任东竹石体)
    示例基础图片 (推荐手写字体:杨任东竹石体)

    常见问题

    封面名称

    红包封面会展示公众号名称和头像,名称一年可修改两次,头像一个月可申请修改 5 次。我提交的封面名称与公众号无关,平台并未拒绝。

    红包审核

    红包审核需要 3 个工作日。如果审核期间接近放假,建议同时提交三个红包封面,以免到了春节,红包尚未审核通过。

    红包图片

    微信红包封面的肖像需要授权,不过我提交的全家福红包通过了。尽量不要使用网络上的图片作为红包封面,容易因版权问题而被驳回。

    ',10),w={},y=(0,n(9720).c)(w,[["render",function(e,t){const n=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[i,o,r,p,l,g,(0,a.QD)("p",null,[(0,a.mY)("首次使用"),(0,a.QD)("a",m,[(0,a.mY)("微信红包封面开放平台"),(0,a.K2)(n)]),(0,a.mY)(",需要注册并实名认证。如果使用个人身份认证,注册中无付费环节。")]),c,s,h,d,u,(0,a.QD)("p",null,[(0,a.mY)("完成注册环节后,即可定制红包封面。微信提供了 PSD 和 Sketch 的红包封面模板,红包设计可参考"),(0,a.QD)("a",f,[(0,a.mY)("微信红包封面官方文档"),(0,a.K2)(n)]),(0,a.mY)("。")]),b])}]]),D=JSON.parse('{"path":"/posts/2022-01-23-wechat_lucky_money_cover.html","title":"想要独一无二的微信红包,你也可以自己做","lang":"zh-CN","frontmatter":{"title":"想要独一无二的微信红包,你也可以自己做","date":"2022-01-23T00:00:00.000Z","category":["工具"],"tag":["微信红包"],"order":-39,"description":"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。 春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。 红包封面的设计并不复杂,新...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-01-23-wechat_lucky_money_cover.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"想要独一无二的微信红包,你也可以自己做"}],["meta",{"property":"og:description","content":"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。 春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。 红包封面的设计并不复杂,新..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-16T08:12:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"想要独一无二的微信红包,你也可以自己做"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"微信红包"}],["meta",{"property":"article:published_time","content":"2022-01-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-05-16T08:12:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"想要独一无二的微信红包,你也可以自己做\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x\\",\\"https://img.newzone.top/2022-05-05-16-09-39.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-16-09-52.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-01-17-16-36-16.png?imageMogr2/thumbnail/350x\\",\\"https://img.newzone.top/2022-05-05-16-10-58.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-01-23T00:00:00.000Z\\",\\"dateModified\\":\\"2023-05-16T08:12:45.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"封面平台注册","slug":"封面平台注册","link":"#封面平台注册","children":[]},{"level":2,"title":"红包封面设计","slug":"红包封面设计","link":"#红包封面设计","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"封面名称","slug":"封面名称","link":"#封面名称","children":[]},{"level":3,"title":"红包审核","slug":"红包审核","link":"#红包审核","children":[]},{"level":3,"title":"红包图片","slug":"红包图片","link":"#红包图片","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1684224765000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":2.48,"words":744},"filePathRelative":"_posts/2022-01-23-wechat_lucky_money_cover.md","localizedDate":"2022年1月23日","excerpt":"

    上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。

    \\n

    春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6077],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,a]of t)n[e]=a;return n}},4376:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>y});var a=n(7847);const i=(0,a.Lk)("p",null,"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。",-1),o=(0,a.Lk)("p",null,"春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。",-1),r=(0,a.Lk)("figure",null,[(0,a.Lk)("img",{src:"https://img.newzone.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x",alt:"",tabindex:"0",loading:"lazy"}),(0,a.Lk)("figcaption")],-1),p=(0,a.Lk)("p",null,"红包封面的设计并不复杂,新手也能轻松设计,但注册前提是要有至少 100 粉丝的视频号或公众号。",-1),l=(0,a.Lk)("p",null,"接下来,我会介绍微信红包注册和定制流程。",-1),g=(0,a.Lk)("h2",{id:"封面平台注册",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#封面平台注册"},[(0,a.Lk)("span",null,"封面平台注册")])],-1),c={href:"https://cover.weixin.qq.com/",target:"_blank",rel:"noopener noreferrer"},m=(0,a.Lk)("figure",null,[(0,a.Lk)("img",{src:"https://img.newzone.top/2022-05-05-16-09-39.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.Lk)("figcaption")],-1),s=(0,a.Lk)("p",null,"个人认证环节需要有 100 粉丝以上的视频号或公众号。",-1),h=(0,a.Lk)("figure",null,[(0,a.Lk)("img",{src:"https://img.newzone.top/2022-05-05-16-09-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.Lk)("figcaption")],-1),d=(0,a.Lk)("p",null,"如果没有红包封面额度,可以自行购买。封面费用为 1 元/个,购买 n 个,则 n 个用户可以使用此款红包封面,有效期为半年。微信用户领取后,可在 3 个月内无限次使用该封面。",-1),u=(0,a.Lk)("h2",{id:"红包封面设计",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#红包封面设计"},[(0,a.Lk)("span",null,"红包封面设计")])],-1),k={href:"https://cover.weixin.qq.com/cgi-bin/mmcover-bin/readtemplate?t=page/index#/doc?page=design&index=-1",target:"_blank",rel:"noopener noreferrer"},f=(0,a.Fv)('

    整个流程非常简单,即使不懂设计模板也能轻松上手。零基础用户可以使用小画家,有图层概念的用户可以使用 Figma。无论使用什么工具,只要上传喜欢的图片,就可以完成红包设计。

    示例基础图片 (推荐手写字体:杨任东竹石体)
    示例基础图片 (推荐手写字体:杨任东竹石体)

    常见问题

    封面名称

    红包封面会展示公众号名称和头像,名称一年可修改两次,头像一个月可申请修改 5 次。我提交的封面名称与公众号无关,平台并未拒绝。

    红包审核

    红包审核需要 3 个工作日。如果审核期间接近放假,建议同时提交三个红包封面,以免到了春节,红包尚未审核通过。

    红包图片

    微信红包封面的肖像需要授权,不过我提交的全家福红包通过了。尽量不要使用网络上的图片作为红包封面,容易因版权问题而被驳回。

    ',10),b={},w=(0,n(3671).A)(b,[["render",function(e,t){const n=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[i,o,r,p,l,g,(0,a.Lk)("p",null,[(0,a.eW)("首次使用"),(0,a.Lk)("a",c,[(0,a.eW)("微信红包封面开放平台"),(0,a.bF)(n)]),(0,a.eW)(",需要注册并实名认证。如果使用个人身份认证,注册中无付费环节。")]),m,s,h,d,u,(0,a.Lk)("p",null,[(0,a.eW)("完成注册环节后,即可定制红包封面。微信提供了 PSD 和 Sketch 的红包封面模板,红包设计可参考"),(0,a.Lk)("a",k,[(0,a.eW)("微信红包封面官方文档"),(0,a.bF)(n)]),(0,a.eW)("。")]),f])}]]),y=JSON.parse('{"path":"/posts/2022-01-23-wechat_lucky_money_cover.html","title":"想要独一无二的微信红包,你也可以自己做","lang":"zh-CN","frontmatter":{"title":"想要独一无二的微信红包,你也可以自己做","date":"2022-01-23T00:00:00.000Z","category":["工具"],"tag":["微信红包"],"order":-39,"description":"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。 春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。 红包封面的设计并不复杂,新...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-01-23-wechat_lucky_money_cover.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"想要独一无二的微信红包,你也可以自己做"}],["meta",{"property":"og:description","content":"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。 春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。 红包封面的设计并不复杂,新..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-16T08:12:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"想要独一无二的微信红包,你也可以自己做"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"微信红包"}],["meta",{"property":"article:published_time","content":"2022-01-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-05-16T08:12:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"想要独一无二的微信红包,你也可以自己做\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x\\",\\"https://img.newzone.top/2022-05-05-16-09-39.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-16-09-52.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-01-17-16-36-16.png?imageMogr2/thumbnail/350x\\",\\"https://img.newzone.top/2022-05-05-16-10-58.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-01-23T00:00:00.000Z\\",\\"dateModified\\":\\"2023-05-16T08:12:45.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"封面平台注册","slug":"封面平台注册","link":"#封面平台注册","children":[]},{"level":2,"title":"红包封面设计","slug":"红包封面设计","link":"#红包封面设计","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"封面名称","slug":"封面名称","link":"#封面名称","children":[]},{"level":3,"title":"红包审核","slug":"红包审核","link":"#红包审核","children":[]},{"level":3,"title":"红包图片","slug":"红包图片","link":"#红包图片","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1684224765000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":2.48,"words":744},"filePathRelative":"_posts/2022-01-23-wechat_lucky_money_cover.md","localizedDate":"2022年1月23日","excerpt":"

    上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。

    \\n

    春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-dbd4392a.34137317.js b/assets/js/2022-02-19-microsoft_store_fixed.html.68b12af6.js similarity index 88% rename from assets/js/v-dbd4392a.34137317.js rename to assets/js/2022-02-19-microsoft_store_fixed.html.68b12af6.js index 9dfa26400..62e8d3a32 100644 --- a/assets/js/v-dbd4392a.34137317.js +++ b/assets/js/2022-02-19-microsoft_store_fixed.html.68b12af6.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2536],{9720:(t,e)=>{e.c=(t,e)=>{const n=t.__vccOpts||t;for(const[t,i]of e)n[t]=i;return n}},2960:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>s,data:()=>l});var i=n(3968);const o=(0,i.IL)('

    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),r={href:"https://answers.microsoft.com/zh-hans/windows/forum/all/microsoft/43acd62e-a11e-449c-9fa4-50931ad38565",target:"_blank",rel:"noopener noreferrer"},a=(0,i.QD)("h2",{id:"解决流程-gif",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#解决流程-gif"},[(0,i.QD)("span",null,"解决流程 GIF")])],-1),p=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/IE_SSL_Setting_win11.webp",alt:"win11-ie 高级设置.gif",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"win11-ie 高级设置.gif")],-1),g={},s=(0,n(9720).c)(g,[["render",function(t,e){const n=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[o,(0,i.QD)("p",null,[(0,i.mY)("如果你依然无法访问,则尝试重置网络连接、DNS、缓存、应用商店设置,操作参考 "),(0,i.QD)("a",r,[(0,i.mY)("Microsoft Store 打不开,代码:0x80131500"),(0,i.K2)(n)]),(0,i.mY)("。")]),a,p])}]]),l=JSON.parse('{"path":"/posts/2022-02-19-microsoft_store_fixed.html","title":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11","lang":"zh-CN","frontmatter":{"title":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11","date":"2022-02-19T00:00:00.000Z","category":["系统"],"tag":["Microsoft store"],"order":-40,"description":"Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了。 特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。 解决方法 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。 Inte...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-02-19-microsoft_store_fixed.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11"}],["meta",{"property":"og:description","content":"Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了。 特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。 解决方法 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。 Inte..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-16-48-55.png?imageMogr2/thumbnail/500x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Microsoft store"}],["meta",{"property":"article:published_time","content":"2022-02-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-16-48-55.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2022-05-05-17-01-23.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-05-17-01-48.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-05-17-02-01.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/IE_SSL_Setting_win11.webp\\"],\\"datePublished\\":\\"2022-02-19T00:00:00.000Z\\",\\"dateModified\\":\\"2023-08-05T23:04:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"解决方法","slug":"解决方法","link":"#解决方法","children":[]},{"level":2,"title":"其他尝试","slug":"其他尝试","link":"#其他尝试","children":[]},{"level":2,"title":"解决流程 GIF","slug":"解决流程-gif","link":"#解决流程-gif","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":1.27,"words":380},"filePathRelative":"_posts/2022-02-19-microsoft_store_fixed.md","localizedDate":"2022年2月19日","excerpt":"

    Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

    \\n
    \\"\\"
    \\n

    特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4130],{3671:(t,e)=>{e.A=(t,e)=>{const n=t.__vccOpts||t;for(const[t,i]of e)n[t]=i;return n}},7640:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>s,data:()=>l});var i=n(7847);const o=(0,i.Fv)('

    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),r={href:"https://answers.microsoft.com/zh-hans/windows/forum/all/microsoft/43acd62e-a11e-449c-9fa4-50931ad38565",target:"_blank",rel:"noopener noreferrer"},a=(0,i.Lk)("h2",{id:"解决流程-gif",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#解决流程-gif"},[(0,i.Lk)("span",null,"解决流程 GIF")])],-1),p=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/IE_SSL_Setting_win11.webp",alt:"win11-ie 高级设置.gif",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"win11-ie 高级设置.gif")],-1),g={},s=(0,n(3671).A)(g,[["render",function(t,e){const n=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[o,(0,i.Lk)("p",null,[(0,i.eW)("如果你依然无法访问,则尝试重置网络连接、DNS、缓存、应用商店设置,操作参考 "),(0,i.Lk)("a",r,[(0,i.eW)("Microsoft Store 打不开,代码:0x80131500"),(0,i.bF)(n)]),(0,i.eW)("。")]),a,p])}]]),l=JSON.parse('{"path":"/posts/2022-02-19-microsoft_store_fixed.html","title":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11","lang":"zh-CN","frontmatter":{"title":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11","date":"2022-02-19T00:00:00.000Z","category":["系统"],"tag":["Microsoft store"],"order":-40,"description":"Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了。 特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。 解决方法 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。 Inte...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-02-19-microsoft_store_fixed.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11"}],["meta",{"property":"og:description","content":"Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了。 特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。 解决方法 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。 Inte..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-16-48-55.png?imageMogr2/thumbnail/500x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Microsoft store"}],["meta",{"property":"article:published_time","content":"2022-02-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-16-48-55.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2022-05-05-17-01-23.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-05-17-01-48.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-05-17-02-01.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/IE_SSL_Setting_win11.webp\\"],\\"datePublished\\":\\"2022-02-19T00:00:00.000Z\\",\\"dateModified\\":\\"2023-08-05T23:04:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"解决方法","slug":"解决方法","link":"#解决方法","children":[]},{"level":2,"title":"其他尝试","slug":"其他尝试","link":"#其他尝试","children":[]},{"level":2,"title":"解决流程 GIF","slug":"解决流程-gif","link":"#解决流程-gif","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":1.27,"words":380},"filePathRelative":"_posts/2022-02-19-microsoft_store_fixed.md","localizedDate":"2022年2月19日","excerpt":"

    Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

    \\n
    \\"\\"
    \\n

    特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2022-03-09-lenovo_black_card_member.html.d4d39c02.js b/assets/js/2022-03-09-lenovo_black_card_member.html.d4d39c02.js new file mode 100644 index 000000000..ebc5907f0 --- /dev/null +++ b/assets/js/2022-03-09-lenovo_black_card_member.html.d4d39c02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9740],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},7074:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>o});var i=a(7847);const c=[(0,i.Fv)('

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    幻想着花了钱,就可以选自己理想的电脑。

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    好不容易等到优购码预告日,发现只有一种笔记本,而且还是旧款。联想,你确定这要用优购码抢?

    不过,会员费也不能白花了。

    每月我会更新优购码和 99 折的具体购买权限。不能让大家继续步我后尘,因未知而入手联想黑卡了。

    了解最新优购码种类前,一定不要买联想黑卡,否则纯属浪费钱。

    另外,推荐联系当地的联想来酷智生活店,询问是否有现货。来酷渠道属于联想官方,来源有保证。如果来酷店没现货,会在到货后电话通知,送货上门。

    8 月黑卡情报

    7 月黑卡情报

    6 月黑卡情报

    5 月黑卡情报

    4 月黑卡情报

    3 月黑卡情报

    ',23)],p={},n=(0,a(3671).A)(p,[["render",function(e,t){return(0,i.uX)(),(0,i.CE)("div",null,c)}]]),o=JSON.parse('{"path":"/posts/2022-03-09-lenovo_black_card_member.html","title":"联想黑金超核会员情报分享","lang":"zh-CN","frontmatter":{"title":"联想黑金超核会员情报分享","date":"2022-03-09T00:00:00.000Z","category":["购物"],"tag":["联想"],"order":-41,"description":"不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡! 京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。 幻想着花了钱,就可以选自己理想的电脑。 但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。 每月 8 日会员中心 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-03-09-lenovo_black_card_member.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"联想黑金超核会员情报分享"}],["meta",{"property":"og:description","content":"不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡! 京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。 幻想着花了钱,就可以选自己理想的电脑。 但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。 每月 8 日会员中心 ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-d10a6d62f7af9c94ff215a992ca978d8_b.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-08-08T15:51:33.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"联想黑金超核会员情报分享"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"联想"}],["meta",{"property":"article:published_time","content":"2022-03-09T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-08-08T15:51:33.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"联想黑金超核会员情报分享\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-d10a6d62f7af9c94ff215a992ca978d8_b.jpg\\",\\"https://pic2.zhimg.com/v2-1f1cc252dc0961e7bc793c0d0d7a80b5_b.jpg\\",\\"https://pic1.zhimg.com/v2-b996f4204b27ee000b7e390177454b88_r.jpg\\",\\"https://pic1.zhimg.com/v2-01f7ee6a4f8dd5401dc8de6936fd8d04_b.jpg\\",\\"https://pic1.zhimg.com/v2-8b5b328f1eed01c937b841fbad094bdc_b.jpg\\",\\"https://pic3.zhimg.com/v2-7658373e9ba5b75fcce0b890fd407caa_b.jpg\\",\\"https://pic3.zhimg.com/v2-d8184c084b411ecd6ad815e4d6601e42_b.jpg\\"],\\"datePublished\\":\\"2022-03-09T00:00:00.000Z\\",\\"dateModified\\":\\"2022-08-08T15:51:33.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"8 月黑卡情报","slug":"_8-月黑卡情报","link":"#_8-月黑卡情报","children":[]},{"level":2,"title":"7 月黑卡情报","slug":"_7-月黑卡情报","link":"#_7-月黑卡情报","children":[]},{"level":2,"title":"6 月黑卡情报","slug":"_6-月黑卡情报","link":"#_6-月黑卡情报","children":[]},{"level":2,"title":"5 月黑卡情报","slug":"_5-月黑卡情报","link":"#_5-月黑卡情报","children":[]},{"level":2,"title":"4 月黑卡情报","slug":"_4-月黑卡情报","link":"#_4-月黑卡情报","children":[]},{"level":2,"title":"3 月黑卡情报","slug":"_3-月黑卡情报","link":"#_3-月黑卡情报","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1659973893000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.53,"words":458},"filePathRelative":"_posts/2022-03-09-lenovo_black_card_member.md","localizedDate":"2022年3月9日","excerpt":"

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    \\n

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    \\n

    幻想着花了钱,就可以选自己理想的电脑。

    \\n

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    \\n
    \\n

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-f30ed612.ed77da29.js b/assets/js/2022-03-17-rss_persistent_link_collection.html.eaa390b4.js similarity index 73% rename from assets/js/v-f30ed612.ed77da29.js rename to assets/js/2022-03-17-rss_persistent_link_collection.html.eaa390b4.js index c49551e5b..b54c06507 100644 --- a/assets/js/v-f30ed612.ed77da29.js +++ b/assets/js/2022-03-17-rss_persistent_link_collection.html.eaa390b4.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3200],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},9996:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>_});var o=n(3968);const r=(0,o.QD)("p",null,"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。",-1),p=(0,o.QD)("p",null,"如果有兴趣自己制作 RSS,可查看文章底部教程。",-1),l=(0,o.QD)("h2",{id:"每日热点",tabindex:"-1"},[(0,o.QD)("a",{class:"header-anchor",href:"#每日热点"},[(0,o.QD)("span",null,"每日热点")])],-1),a=(0,o.QD)("p",null,"整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。",-1),s=(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("strong",null,"百度实时热点"),(0,o.mY)(":"),(0,o.QD)("code",null,"https://rss.aishort.top/?type=baidu"),(0,o.mY)(" 实时收录百度热搜内容,并显示热搜指数和简介。")]),(0,o.QD)("figure",null,[(0,o.QD)("img",{src:"https://img.newzone.top/2022-05-05-17-21-49.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.QD)("figcaption")])],-1),i=(0,o.QD)("strong",null,"国内应急新闻",-1),g=(0,o.QD)("code",null,"https://rss.aishort.top/?type=cneb",-1),c={href:"http://www.cneb.gov.cn/guoneinews/",target:"_blank",rel:"noopener noreferrer"},h=(0,o.QD)("figure",null,[(0,o.QD)("img",{src:"https://img.newzone.top/2022-05-05-17-22-08.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.QD)("figcaption")],-1),S=(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("strong",null,"瓦斯阅读"),(0,o.mY)(":"),(0,o.QD)("code",null,"https://rss.aishort.top/?type=wasi"),(0,o.mY)(" 通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。")]),(0,o.QD)("figure",null,[(0,o.QD)("img",{src:"https://img.newzone.top/2022-05-05-17-22-32.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.QD)("figcaption")])],-1),m=(0,o.IL)('

    互联网资讯

    整合互联网资讯媒体,偏重于前端科技、电子硬件、手机应用。

    • 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),u={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},D={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},Q={},w=(0,n(9720).c)(Q,[["render",function(e,t){const n=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[r,p,l,a,(0,o.QD)("ul",null,[s,(0,o.QD)("li",null,[(0,o.QD)("p",null,[i,(0,o.mY)(":"),g,(0,o.mY)(" 采集自"),(0,o.QD)("a",c,[(0,o.mY)("国家应急广播"),(0,o.K2)(n)]),(0,o.mY)(",配合 rss 阅读器过滤,及时获取当地应急通知。")]),h]),S]),m,(0,o.QD)("ul",null,[(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("a",u,[(0,o.mY)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,o.K2)(n)])])]),(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("a",d,[(0,o.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,o.K2)(n)])])]),(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("a",f,[(0,o.mY)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,o.K2)(n)])])]),(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("a",D,[(0,o.mY)("RSS 速成篇 2:RSSHub 自部署"),(0,o.K2)(n)])])]),(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("a",R,[(0,o.mY)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,o.K2)(n)])])]),(0,o.QD)("li",null,[(0,o.QD)("p",null,[(0,o.QD)("a",b,[(0,o.mY)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,o.K2)(n)])])])])])}]]),_=JSON.parse('{"path":"/posts/2022-03-17-rss_persistent_link_collection.html","title":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效","lang":"zh-CN","frontmatter":{"title":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效","date":"2022-03-17T00:00:00.000Z","category":["自动化"],"tag":["rss"],"order":-42,"description":"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。 如果有兴趣自己制作 RSS,可查看文章底部教程。 每日热点 整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。 百度实时热点:...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"}],["meta",{"property":"og:description","content":"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。 如果有兴趣自己制作 RSS,可查看文章底部教程。 每日热点 整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。 百度实时热点:..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-17-21-49.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-21T09:30:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2022-03-17T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-21T09:30:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-17-21-49.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-22-08.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-22-32.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-03-17T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-21T09:30:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"每日热点","slug":"每日热点","link":"#每日热点","children":[]},{"level":2,"title":"互联网资讯","slug":"互联网资讯","link":"#互联网资讯","children":[]},{"level":2,"title":"奇思妙想","slug":"奇思妙想","link":"#奇思妙想","children":[]},{"level":2,"title":"教程:自制 RSS","slug":"教程-自制-rss","link":"#教程-自制-rss","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1682069454000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":12}]},"readingTime":{"minutes":1.93,"words":580},"filePathRelative":"_posts/2022-03-17-rss_persistent_link_collection.md","localizedDate":"2022年3月17日","excerpt":"

    越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。

    \\n

    如果有兴趣自己制作 RSS,可查看文章底部教程。

    \\n

    每日热点

    \\n

    整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。

    \\n
      \\n
    • \\n

      百度实时热点https://rss.aishort.top/?type=baidu\\n实时收录百度热搜内容,并显示热搜指数和简介。

      \\n
      \\"\\"
      \\n
    • \\n
    • \\n

      国内应急新闻https://rss.aishort.top/?type=cneb\\n采集自国家应急广播,配合 rss 阅读器过滤,及时获取当地应急通知。

      \\n
      \\"\\"
      \\n
    • \\n
    • \\n

      瓦斯阅读https://rss.aishort.top/?type=wasi\\n通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。

      \\n
      \\"\\"
      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4138],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},8522:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>w,data:()=>_});var o=n(7847);const r=(0,o.Lk)("p",null,"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。",-1),p=(0,o.Lk)("p",null,"如果有兴趣自己制作 RSS,可查看文章底部教程。",-1),l=(0,o.Lk)("h2",{id:"每日热点",tabindex:"-1"},[(0,o.Lk)("a",{class:"header-anchor",href:"#每日热点"},[(0,o.Lk)("span",null,"每日热点")])],-1),a=(0,o.Lk)("p",null,"整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。",-1),s=(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("strong",null,"百度实时热点"),(0,o.eW)(":"),(0,o.Lk)("code",null,"https://rss.aishort.top/?type=baidu"),(0,o.eW)(" 实时收录百度热搜内容,并显示热搜指数和简介。")]),(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/2022-05-05-17-21-49.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")])],-1),i=(0,o.Lk)("strong",null,"国内应急新闻",-1),g=(0,o.Lk)("code",null,"https://rss.aishort.top/?type=cneb",-1),c={href:"http://www.cneb.gov.cn/guoneinews/",target:"_blank",rel:"noopener noreferrer"},h=(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/2022-05-05-17-22-08.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")],-1),S=(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("strong",null,"瓦斯阅读"),(0,o.eW)(":"),(0,o.Lk)("code",null,"https://rss.aishort.top/?type=wasi"),(0,o.eW)(" 通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。")]),(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/2022-05-05-17-22-32.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")])],-1),u=(0,o.Fv)('

    互联网资讯

    整合互联网资讯媒体,偏重于前端科技、电子硬件、手机应用。

    • 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),d={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},L={},w=(0,n(3671).A)(L,[["render",function(e,t){const n=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[r,p,l,a,(0,o.Lk)("ul",null,[s,(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[i,(0,o.eW)(":"),g,(0,o.eW)(" 采集自"),(0,o.Lk)("a",c,[(0,o.eW)("国家应急广播"),(0,o.bF)(n)]),(0,o.eW)(",配合 rss 阅读器过滤,及时获取当地应急通知。")]),h]),S]),u,(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("a",d,[(0,o.eW)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,o.bF)(n)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("a",m,[(0,o.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,o.bF)(n)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("a",k,[(0,o.eW)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,o.bF)(n)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("a",f,[(0,o.eW)("RSS 速成篇 2:RSSHub 自部署"),(0,o.bF)(n)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("a",b,[(0,o.eW)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,o.bF)(n)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.Lk)("a",R,[(0,o.eW)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,o.bF)(n)])])])])])}]]),_=JSON.parse('{"path":"/posts/2022-03-17-rss_persistent_link_collection.html","title":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效","lang":"zh-CN","frontmatter":{"title":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效","date":"2022-03-17T00:00:00.000Z","category":["自动化"],"tag":["rss"],"order":-42,"description":"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。 如果有兴趣自己制作 RSS,可查看文章底部教程。 每日热点 整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。 百度实时热点:...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"}],["meta",{"property":"og:description","content":"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。 如果有兴趣自己制作 RSS,可查看文章底部教程。 每日热点 整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。 百度实时热点:..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-17-21-49.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-21T09:30:54.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2022-03-17T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-21T09:30:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-17-21-49.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-22-08.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-22-32.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-03-17T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-21T09:30:54.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"每日热点","slug":"每日热点","link":"#每日热点","children":[]},{"level":2,"title":"互联网资讯","slug":"互联网资讯","link":"#互联网资讯","children":[]},{"level":2,"title":"奇思妙想","slug":"奇思妙想","link":"#奇思妙想","children":[]},{"level":2,"title":"教程:自制 RSS","slug":"教程-自制-rss","link":"#教程-自制-rss","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1682069454000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":12}]},"readingTime":{"minutes":1.93,"words":580},"filePathRelative":"_posts/2022-03-17-rss_persistent_link_collection.md","localizedDate":"2022年3月17日","excerpt":"

    越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。

    \\n

    如果有兴趣自己制作 RSS,可查看文章底部教程。

    \\n

    每日热点

    \\n

    整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。

    \\n
      \\n
    • \\n

      百度实时热点https://rss.aishort.top/?type=baidu\\n实时收录百度热搜内容,并显示热搜指数和简介。

      \\n
      \\"\\"
      \\n
    • \\n
    • \\n

      国内应急新闻https://rss.aishort.top/?type=cneb\\n采集自国家应急广播,配合 rss 阅读器过滤,及时获取当地应急通知。

      \\n
      \\"\\"
      \\n
    • \\n
    • \\n

      瓦斯阅读https://rss.aishort.top/?type=wasi\\n通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。

      \\n
      \\"\\"
      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-54b35494.26479434.js b/assets/js/2022-03-21-winget_the_strongest_software_manager_for_windows.html.0b8a7f7c.js similarity index 85% rename from assets/js/v-54b35494.26479434.js rename to assets/js/2022-03-21-winget_the_strongest_software_manager_for_windows.html.0b8a7f7c.js index 099f5aafc..c6708f618 100644 --- a/assets/js/v-54b35494.26479434.js +++ b/assets/js/2022-03-21-winget_the_strongest_software_manager_for_windows.html.0b8a7f7c.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3488],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,i]of t)n[e]=i;return n}},1349:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>z,data:()=>D});var i=n(3968);const a=(0,i.QD)("p",null,"矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。",-1),o=(0,i.QD)("p",null,[(0,i.mY)("我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍需逐个进行。此外,把软件系统的管理交给 360、金山或腾讯,你真的放心?相比之下,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,"),(0,i.QD)("strong",null,"它们直接从官方来源下载应用,并支持一键批量静默安装,是快速部署程序的理想选择"),(0,i.mY)("。")],-1),r=(0,i.QD)("h2",{id:"原生程序管理-winget",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#原生程序管理-winget"},[(0,i.QD)("span",null,"原生程序管理-winget")])],-1),l={href:"https://docs.microsoft.com/zh-cn/windows/package-manager/winget/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},g=(0,i.QD)("code",null,".msixbundle",-1),s={href:"https://www.microsoft.com/p/app-installer/9nblggh4nns1#activetab=pivot:overviewtab",target:"_blank",rel:"noopener noreferrer"},c=(0,i.IL)('

    安装应用安装程序后,可在命令提示符 (cmd) 中输入「winget」来运行程序命令。若要使用 PowerShell 命令,请注意修改 PowerShell 的执行策略。重要的是更改 ps1 文件的运行权限,而非 win11 自带的 ps5。以管理员权限运行 PowerShell,执行 Set-ExecutionPolicy RemoteSigned 命令。

    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),w={href:"https://winstall.app/",target:"_blank",rel:"noopener noreferrer"},m=(0,i.IL)('

    操作非常简单,winstall 页面选中程序,即可打包程序组或生成批量安装命令。

    winstall 的应用搜索继承了 winget 的问题,部分国产软件不支持中文搜索,比如「坚果云」只支持英文名称「Nutstore」。希望这一问题,可以随着国内用户群增多而被解决。

    winget 搜索
    winget 搜索
    winstall 搜索
    winstall 搜索

    winstall 页面选好程序后,导出自动生成的批量安装命令,并在命令提示符 (cmd) 中执行,系统将自动下载并静默配置程序。注意保存批量安装命令,winstall 网站服务并不稳定,有可能你后面想用,它却无法导出命令。

    常见问题

    尝试更新源失败

    ',9),d={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},h=(0,i.QD)("code",null,"InternetOpenUrl() failed. 0x80072f7d : unknown error",-1),f={href:"https://newzone.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"},u=(0,i.IL)('

    下载速度慢

    在使用 winget 时,你可能会发现下载速度异常缓慢,例如 4M 数据需要等待十分钟。然而,这种感觉实际上是误解。慢速度通常是因为正在下载 winget 的源数据,而非软件本身。这一过程通常与网络环境无关,因此需要耐心等待。实际下载应用程序时,速度通常会快得多。

    已解决问题

    以下问题是早起版本的 bug,新测试中都解决了。

    • 批量安装应用中,winstall 不定期出现崩溃,原因未知。
    • winget install 不能检测当前版本软件是否安装,容易造成重复安装应用,拖慢部署时间。
    • 部分应用安装后容易有 bug,比如剪映有卡顿问题,手动安装后恢复正常。

    总结

    在我的常用软件列表中有 50 个应用支持 winget 批量静默安装,剩余 10 个需手工安装,覆盖率在 80% 以上,足够满足大部分人的需求。winget 用一个命令行能静默安装上百个软件,节省了大量装机时间。对于系统重装、批量装机、快速设置新工作环境,winget 和 winstall 是必不可少的装机神器。

    ',7),b={href:"https://newzone.top/windows/NewSystem.html",target:"_blank",rel:"noopener noreferrer"},_={},z=(0,n(9720).c)(_,[["render",function(e,t){const n=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[a,o,r,(0,i.QD)("p",null,[(0,i.QD)("a",l,[(0,i.mY)("winget"),(0,i.K2)(n)]),(0,i.mY)(" 是 Windows 的命令行程序包管理器。在 Windows 10 和 Windows 11 上,可以用 winget 来发现、安装、升级、删除和配置应用程序。早期版本的 Windows 不支持 winget,需要在 "),(0,i.QD)("a",p,[(0,i.mY)("winget 官方网站"),(0,i.K2)(n)]),(0,i.mY)(" 下载以 "),g,(0,i.mY)(" 为后缀的安装程序。而在 Win11 上,则可 "),(0,i.QD)("a",s,[(0,i.mY)("通过 Microsoft Store 获取应用安装程序"),(0,i.K2)(n)]),(0,i.mY)("。")]),c,(0,i.QD)("p",null,[(0,i.QD)("a",w,[(0,i.mY)("winstall"),(0,i.K2)(n)]),(0,i.mY)(" 是 winget install 的网页管理工具。借助 winstall,用户不懂代码,也能轻松使用 winget,一次性安装所有应用程序。")]),m,(0,i.QD)("p",null,[(0,i.mY)("在国内使用 winget 时,常遇到「更新源失败」的问题。下载 "),(0,i.QD)("a",d,[(0,i.mY)("winget 最新官方包"),(0,i.K2)(n)]),(0,i.mY)(" 可以有效解决这一问题。")]),(0,i.QD)("p",null,[(0,i.mY)("另一个常见问题是网络连接失败,例如出现 "),h,(0,i.mY)(" 的提示。这通常是因为 Internet 选项中的 TLS 版本设置过低。启用 TLS 1.2 可以解决此问题,具体操作方法请参考 "),(0,i.QD)("a",f,[(0,i.mY)("解决 Windows 应用商店(Microsoft store)无法打开的问题"),(0,i.K2)(n)]),(0,i.mY)("。")]),u,(0,i.QD)("p",null,[(0,i.mY)("这篇文章主要介绍了 winget 的使用原理和方法。如果想直接上手,可以查看我的 "),(0,i.QD)("a",b,[(0,i.mY)("系统重装"),(0,i.K2)(n)]),(0,i.mY)(" 过程记录。")])])}]]),D=JSON.parse('{"path":"/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","title":"一键安装 99 个程序,Windows 最强软件管理器","lang":"zh-CN","frontmatter":{"title":"一键安装 99 个程序,Windows 最强软件管理器","date":"2022-03-21T00:00:00.000Z","category":["系统"],"tag":["winget","winstall"],"order":-43,"description":"矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。 我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"一键安装 99 个程序,Windows 最强软件管理器"}],["meta",{"property":"og:description","content":"矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。 我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-17-13-24.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-13T07:49:15.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"一键安装 99 个程序,Windows 最强软件管理器"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"winget"}],["meta",{"property":"article:tag","content":"winstall"}],["meta",{"property":"article:published_time","content":"2022-03-21T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-13T07:49:15.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"一键安装 99 个程序,Windows 最强软件管理器\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-17-13-24.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-13-45.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-00.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-23.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-35.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-50.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-15-09.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-15-37.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-15-55.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-03-21T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-13T07:49:15.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"原生程序管理-winget","slug":"原生程序管理-winget","link":"#原生程序管理-winget","children":[{"level":3,"title":"winget install appName","slug":"winget-install-appname","link":"#winget-install-appname","children":[]},{"level":3,"title":"winget search appName","slug":"winget-search-appname","link":"#winget-search-appname","children":[]},{"level":3,"title":"winget upgrade --all","slug":"winget-upgrade-all","link":"#winget-upgrade-all","children":[]},{"level":3,"title":"Microsoft Store 应用","slug":"microsoft-store-应用","link":"#microsoft-store-应用","children":[]}]},{"level":2,"title":"批量部署程序-winstall","slug":"批量部署程序-winstall","link":"#批量部署程序-winstall","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"尝试更新源失败","slug":"尝试更新源失败","link":"#尝试更新源失败","children":[]},{"level":3,"title":"下载速度慢","slug":"下载速度慢","link":"#下载速度慢","children":[]},{"level":3,"title":"已解决问题","slug":"已解决问题","link":"#已解决问题","children":[]}]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705132155000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":5.21,"words":1563},"filePathRelative":"_posts/2022-03-21-winget_the_strongest_software_manager_for_windows.md","localizedDate":"2022年3月21日","excerpt":"

    矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。

    \\n

    我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍需逐个进行。此外,把软件系统的管理交给 360、金山或腾讯,你真的放心?相比之下,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,它们直接从官方来源下载应用,并支持一键批量静默安装,是快速部署程序的理想选择

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8458],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,i]of t)n[e]=i;return n}},2528:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>W,data:()=>_});var i=n(7847);const a=(0,i.Lk)("p",null,"矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。",-1),o=(0,i.Lk)("p",null,[(0,i.eW)("我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍需逐个进行。此外,把软件系统的管理交给 360、金山或腾讯,你真的放心?相比之下,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,"),(0,i.Lk)("strong",null,"它们直接从官方来源下载应用,并支持一键批量静默安装,是快速部署程序的理想选择"),(0,i.eW)("。")],-1),r=(0,i.Lk)("h2",{id:"原生程序管理-winget",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#原生程序管理-winget"},[(0,i.Lk)("span",null,"原生程序管理-winget")])],-1),l={href:"https://docs.microsoft.com/zh-cn/windows/package-manager/winget/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},g=(0,i.Lk)("code",null,".msixbundle",-1),s={href:"https://www.microsoft.com/p/app-installer/9nblggh4nns1#activetab=pivot:overviewtab",target:"_blank",rel:"noopener noreferrer"},w=(0,i.Fv)('

    安装应用安装程序后,可在命令提示符 (cmd) 中输入「winget」来运行程序命令。若要使用 PowerShell 命令,请注意修改 PowerShell 的执行策略。重要的是更改 ps1 文件的运行权限,而非 win11 自带的 ps5。以管理员权限运行 PowerShell,执行 Set-ExecutionPolicy RemoteSigned 命令。

    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),c={href:"https://winstall.app/",target:"_blank",rel:"noopener noreferrer"},d=(0,i.Fv)('

    操作非常简单,winstall 页面选中程序,即可打包程序组或生成批量安装命令。

    winstall 的应用搜索继承了 winget 的问题,部分国产软件不支持中文搜索,比如「坚果云」只支持英文名称「Nutstore」。希望这一问题,可以随着国内用户群增多而被解决。

    winget 搜索
    winget 搜索
    winstall 搜索
    winstall 搜索

    winstall 页面选好程序后,导出自动生成的批量安装命令,并在命令提示符 (cmd) 中执行,系统将自动下载并静默配置程序。注意保存批量安装命令,winstall 网站服务并不稳定,有可能你后面想用,它却无法导出命令。

    常见问题

    尝试更新源失败

    ',9),m={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},h=(0,i.Lk)("code",null,"InternetOpenUrl() failed. 0x80072f7d : unknown error",-1),f={href:"https://newzone.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"},u=(0,i.Fv)('

    下载速度慢

    在使用 winget 时,你可能会发现下载速度异常缓慢,例如 4M 数据需要等待十分钟。然而,这种感觉实际上是误解。慢速度通常是因为正在下载 winget 的源数据,而非软件本身。这一过程通常与网络环境无关,因此需要耐心等待。实际下载应用程序时,速度通常会快得多。

    已解决问题

    以下问题是早起版本的 bug,新测试中都解决了。

    • 批量安装应用中,winstall 不定期出现崩溃,原因未知。
    • winget install 不能检测当前版本软件是否安装,容易造成重复安装应用,拖慢部署时间。
    • 部分应用安装后容易有 bug,比如剪映有卡顿问题,手动安装后恢复正常。

    总结

    在我的常用软件列表中有 50 个应用支持 winget 批量静默安装,剩余 10 个需手工安装,覆盖率在 80% 以上,足够满足大部分人的需求。winget 用一个命令行能静默安装上百个软件,节省了大量装机时间。对于系统重装、批量装机、快速设置新工作环境,winget 和 winstall 是必不可少的装机神器。

    ',7),b={href:"https://newzone.top/windows/NewSystem.html",target:"_blank",rel:"noopener noreferrer"},k={},W=(0,n(3671).A)(k,[["render",function(e,t){const n=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[a,o,r,(0,i.Lk)("p",null,[(0,i.Lk)("a",l,[(0,i.eW)("winget"),(0,i.bF)(n)]),(0,i.eW)(" 是 Windows 的命令行程序包管理器。在 Windows 10 和 Windows 11 上,可以用 winget 来发现、安装、升级、删除和配置应用程序。早期版本的 Windows 不支持 winget,需要在 "),(0,i.Lk)("a",p,[(0,i.eW)("winget 官方网站"),(0,i.bF)(n)]),(0,i.eW)(" 下载以 "),g,(0,i.eW)(" 为后缀的安装程序。而在 Win11 上,则可 "),(0,i.Lk)("a",s,[(0,i.eW)("通过 Microsoft Store 获取应用安装程序"),(0,i.bF)(n)]),(0,i.eW)("。")]),w,(0,i.Lk)("p",null,[(0,i.Lk)("a",c,[(0,i.eW)("winstall"),(0,i.bF)(n)]),(0,i.eW)(" 是 winget install 的网页管理工具。借助 winstall,用户不懂代码,也能轻松使用 winget,一次性安装所有应用程序。")]),d,(0,i.Lk)("p",null,[(0,i.eW)("在国内使用 winget 时,常遇到「更新源失败」的问题。下载 "),(0,i.Lk)("a",m,[(0,i.eW)("winget 最新官方包"),(0,i.bF)(n)]),(0,i.eW)(" 可以有效解决这一问题。")]),(0,i.Lk)("p",null,[(0,i.eW)("另一个常见问题是网络连接失败,例如出现 "),h,(0,i.eW)(" 的提示。这通常是因为 Internet 选项中的 TLS 版本设置过低。启用 TLS 1.2 可以解决此问题,具体操作方法请参考 "),(0,i.Lk)("a",f,[(0,i.eW)("解决 Windows 应用商店(Microsoft store)无法打开的问题"),(0,i.bF)(n)]),(0,i.eW)("。")]),u,(0,i.Lk)("p",null,[(0,i.eW)("这篇文章主要介绍了 winget 的使用原理和方法。如果想直接上手,可以查看我的 "),(0,i.Lk)("a",b,[(0,i.eW)("系统重装"),(0,i.bF)(n)]),(0,i.eW)(" 过程记录。")])])}]]),_=JSON.parse('{"path":"/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","title":"一键安装 99 个程序,Windows 最强软件管理器","lang":"zh-CN","frontmatter":{"title":"一键安装 99 个程序,Windows 最强软件管理器","date":"2022-03-21T00:00:00.000Z","category":["系统"],"tag":["winget","winstall"],"order":-43,"description":"矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。 我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"一键安装 99 个程序,Windows 最强软件管理器"}],["meta",{"property":"og:description","content":"矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。 我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-17-13-24.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-13T07:49:15.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"一键安装 99 个程序,Windows 最强软件管理器"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"winget"}],["meta",{"property":"article:tag","content":"winstall"}],["meta",{"property":"article:published_time","content":"2022-03-21T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-13T07:49:15.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"一键安装 99 个程序,Windows 最强软件管理器\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-17-13-24.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-13-45.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-00.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-23.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-35.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-14-50.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-15-09.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-15-37.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-17-15-55.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-03-21T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-13T07:49:15.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"原生程序管理-winget","slug":"原生程序管理-winget","link":"#原生程序管理-winget","children":[{"level":3,"title":"winget install appName","slug":"winget-install-appname","link":"#winget-install-appname","children":[]},{"level":3,"title":"winget search appName","slug":"winget-search-appname","link":"#winget-search-appname","children":[]},{"level":3,"title":"winget upgrade --all","slug":"winget-upgrade-all","link":"#winget-upgrade-all","children":[]},{"level":3,"title":"Microsoft Store 应用","slug":"microsoft-store-应用","link":"#microsoft-store-应用","children":[]}]},{"level":2,"title":"批量部署程序-winstall","slug":"批量部署程序-winstall","link":"#批量部署程序-winstall","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"尝试更新源失败","slug":"尝试更新源失败","link":"#尝试更新源失败","children":[]},{"level":3,"title":"下载速度慢","slug":"下载速度慢","link":"#下载速度慢","children":[]},{"level":3,"title":"已解决问题","slug":"已解决问题","link":"#已解决问题","children":[]}]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705132155000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":5.21,"words":1563},"filePathRelative":"_posts/2022-03-21-winget_the_strongest_software_manager_for_windows.md","localizedDate":"2022年3月21日","excerpt":"

    矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。

    \\n

    我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍需逐个进行。此外,把软件系统的管理交给 360、金山或腾讯,你真的放心?相比之下,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,它们直接从官方来源下载应用,并支持一键批量静默安装,是快速部署程序的理想选择

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2022-04-20-survivorship_bias_in_shanghai_2022.html.f49a6233.js b/assets/js/2022-04-20-survivorship_bias_in_shanghai_2022.html.f49a6233.js new file mode 100644 index 000000000..385430860 --- /dev/null +++ b/assets/js/2022-04-20-survivorship_bias_in_shanghai_2022.html.f49a6233.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[982],{3671:(e,t)=>{t.A=(e,t)=>{const p=e.__vccOpts||e;for(const[e,a]of t)p[e]=a;return p}},6092:(e,t,p)=>{p.r(t),p.d(t,{comp:()=>o,data:()=>i});var a=p(7847);const n=[(0,a.Fv)('

    够吃吗?还能买到东西吗?

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    但真是这样吗?我真的生活在「上海」吗?

    亲身体验 VS 网上「上海」

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    4 月 5 日,小区团购群兴起,开始大量采购,物资可维持三周。同时,街道开始小量发放物资。

    4 月 10 日后,街道开始加大物资发放量,甚至包括厕纸、沐浴露。我完全没想到,街道发这么多物资。其中的蔬菜无法长时间保存,我开始自学做酱菜和蔬菜饼。物资可维持一个月。

    街道发放的部分物资
    街道发放的部分物资

    此时,网上的上海则是另一个世界。“混乱,吃不了饭,快饿死?”

    因为这些谣传,家人、朋友、甚至网友都开始问文章开头的话。「够吃吗?还能买到东西吗?」

    幸存者偏差

    难道物资充足只是我个人的感受,其他人都处于物资短缺的状态吗?

    接着,我问了同在上海的朋友。大家反馈,物资都没我多,但基本的生活是能满足,最少能吃饱。

    那为什么网上关于上海的现状都是「没人管,没吃的」?

    我开始大量查看上海疫情的相关资讯,发现是「幸存者偏差」放大了上海的物资短缺。

    幸存者偏差(Survivorship Bias),人们所获得的有些信息可能会因为信息的提供方的匮乏(只有那些“幸存”下来的人会提供信息,“死人不会说话”),而使得由这些信息得出的结论缺乏普适性。但人们往往会忽视这一点,忽视而把获得的信息过度概括。

    4 月开始,上海 2500 万人全部进入封控状态。这一庞大的供给需求一下子砸到街道社区头上,基层组织关系接近崩溃。

    大多数物资储备充足,能网上抢菜的人,安静地在家封控,自然也不会在网上发言。

    可是,老人等弱势群体大都未接到物资储备的消息,也缺少线上抢购手段,只能通过尽可能多的渠道发声来求救。

    2500 万人即使只有万分之一的遗漏,也有 2500 人遇到困难。

    当这批人开始发声,就形成了「饥饿的上海」形象,这也就是为什么舆论中的上海与实际生活完全不同的原因。

    那么,排除掉「幸存者偏差」因素,上海真实在发生什么?

    上海的困难

    时代中的一粒灰,落在个人头上,就是一座山。

    除了初期的物资匮乏,上海面临的困难还远不止此,核酸混乱、政策多变、食品安全、物价高企、就医困难,都是摆在上海人面前的大山。

    当这些消息集中释放后,即使不是当事人也感到极度压抑。估计解除封控后,大家都得去心理咨询了。

    居家隔离前,我觉得隔离也不错,有吃有喝,还白拿工资。之前,我甚至还写了一篇文章,认为浦东封控放假,而浦西就得住在公司加班,不公平。

    但是,当亲身体验到长时间隔离,才知道失去自由的代价高于一切。

    上海真正面临的困难,是长时间隔离带来的压抑情绪。这是每个上海居民面临的最大困难。物资已经逐渐充裕,困难也逐渐克服,但压抑的情绪却一直在紧绷。

    东方台当时搞抗疫晚会,想必也是想给长时间封控在家里的我们带来一些振奋的情绪吧。

    但它没理解,我们需要的不是晚会,而是真正的好消息 - 疫情结束

    疫情中的希望

    为了写这篇文章,看了许多上海疫情所发生的悲剧,我的情绪也完全进入低谷。可想而知,当事人得有多么痛苦。

    但对普通人,希望大家别去关注,这些坏消息真的会让人抑郁。当这股压抑情绪来临时,我真切地感受到「什么是灾民」。这不是物质上的匮乏,而是精神上的压抑,这给人的创伤更大。开始理解,被网暴的上海女儿为什么要自杀了,想必是压抑至极又碰上网暴而无法承受。

    希望歧视上海的段子能少些,压抑的情绪中已经到了临界。

    希望正能量的消息能多些,我们此刻真的很需要一点激励。

    希望上海疫情能早点结束,让生活恢复正常。

    也希望疫情结束后,上海能好好复盘,记住教训,不要让历史重演。

    ',39)],r={},o=(0,p(3671).A)(r,[["render",function(e,t){return(0,a.uX)(),(0,a.CE)("div",null,n)}]]),i=JSON.parse('{"path":"/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","title":"上海没吃的?割裂的城市,我真的生活在上海吗?","lang":"zh-CN","frontmatter":{"title":"上海没吃的?割裂的城市,我真的生活在上海吗?","subtitle":"疫情中的幸存者偏差思考及压抑情绪","date":"2022-04-20T00:00:00.000Z","category":["观察随笔"],"tag":["幸存者偏差","疫情"],"order":-44,"description":"够吃吗?还能买到东西吗? 所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。 但真是这样吗?我真的生活在「上海」吗? 亲身体验 VS 网上「上海」 3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"上海没吃的?割裂的城市,我真的生活在上海吗?"}],["meta",{"property":"og:description","content":"够吃吗?还能买到东西吗? 所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。 但真是这样吗?我真的生活在「上海」吗? 亲身体验 VS 网上「上海」 3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-04-20-21-43-24.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"上海没吃的?割裂的城市,我真的生活在上海吗?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"幸存者偏差"}],["meta",{"property":"article:tag","content":"疫情"}],["meta",{"property":"article:published_time","content":"2022-04-20T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"上海没吃的?割裂的城市,我真的生活在上海吗?\\",\\"image\\":[\\"https://img.newzone.top/2022-04-20-21-43-24.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-04-20T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"亲身体验 VS 网上「上海」","slug":"亲身体验-vs-网上「上海」","link":"#亲身体验-vs-网上「上海」","children":[]},{"level":2,"title":"幸存者偏差","slug":"幸存者偏差","link":"#幸存者偏差","children":[]},{"level":2,"title":"上海的困难","slug":"上海的困难","link":"#上海的困难","children":[]},{"level":2,"title":"疫情中的希望","slug":"疫情中的希望","link":"#疫情中的希望","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":4.82,"words":1447},"filePathRelative":"_posts/2022-04-20-survivorship_bias_in_shanghai_2022.md","localizedDate":"2022年4月20日","excerpt":"

    够吃吗?还能买到东西吗?

    \\n

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    \\n

    但真是这样吗?我真的生活在「上海」吗?

    \\n

    亲身体验 VS 网上「上海」

    \\n

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    \\n

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-31293c92.b07bc0ff.js b/assets/js/2022-04-21-uivision_rpa.html.0ad3d3fc.js similarity index 90% rename from assets/js/v-31293c92.b07bc0ff.js rename to assets/js/2022-04-21-uivision_rpa.html.0ad3d3fc.js index d99d64072..2bc5a247d 100644 --- a/assets/js/v-31293c92.b07bc0ff.js +++ b/assets/js/2022-04-21-uivision_rpa.html.0ad3d3fc.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2712],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,i]of t)o[e]=i;return o}},2284:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>u,data:()=>f});var i=o(3968);const n=(0,i.IL)('

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    以下内容只适合不想学 Python,不懂编程,又想使用自动化和爬虫的小白,高手可以关闭页面了。

    UI.Vision RPA 是一款开源的全平台自动化工具,无需懂编程,即可完成网页和桌面自动化操作,包括文件上传、表单填写、内容抓取、定时截图、爬虫抓取等。

    安装 UI.Vision

    UI.Vision RPA 的主体是浏览器插件,只需去应用商店即可完成安装。

    ',10),a={href:"https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc",target:"_blank",rel:"noopener noreferrer"},r={href:"https://addons.mozilla.org/zh-CN/firefox/addon/rpa/",target:"_blank",rel:"noopener noreferrer"},l={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"},p=(0,i.IL)('

    零门槛入门

    UI.Vision RPA 的运行脚本叫做「宏」。界面很简单,左侧是宏的范例库和本地文件,右侧是宏的运行和反馈区。

    UI.Vision 应用界面
    UI.Vision 应用界面

    打开 UI.Vision 插件,点击右上角按钮「Record」,插件会把你的操作录制为宏脚本。

    执行时,选中左侧保存的宏,然后点击右上角的按钮「Play Macro」,即可回放指定宏。点击「Play Loop」,则可让宏循环运行。循环次数 ${!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),s={href:"https://ui.vision/rpa/docs/selenium-ide/csvread",target:"_blank",rel:"noopener noreferrer"},c=(0,i.IL)('
    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),d={href:"https://www.appinn.com/ui-vision-rpa/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://ui.vision/rpa/docs/selenium-ide",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/LoveOctocat/UI.Vision-Kantu-ZH",target:"_blank",rel:"noopener noreferrer"},m={},u=(0,o(9720).c)(m,[["render",function(e,t){const o=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[n,(0,i.QD)("ul",null,[(0,i.QD)("li",null,[(0,i.mY)("Chrome 插件:"),(0,i.QD)("a",a,[(0,i.mY)("https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc"),(0,i.K2)(o)])]),(0,i.QD)("li",null,[(0,i.mY)("Firefox 插件:"),(0,i.QD)("a",r,[(0,i.mY)("https://addons.mozilla.org/zh-CN/firefox/addon/rpa/"),(0,i.K2)(o)])]),(0,i.QD)("li",null,[(0,i.mY)("Edge 插件:"),(0,i.QD)("a",l,[(0,i.mY)("https://microsoftedge.microsoft.com/addons/detail/uivision-rpa-浏览器自动化工具/goapmjinbaeomoemgdcnnhoedopjnddd"),(0,i.K2)(o)])])]),p,(0,i.QD)("p",null,[(0,i.mY)("用不同的变量文本进行重复的网页操作,需要使用 UI.Vision 的 "),(0,i.QD)("a",s,[(0,i.mY)("csvRead"),(0,i.K2)(o)]),(0,i.mY)(" 命令。下面以「依次打开不同链接」为例。")]),c,(0,i.QD)("ul",null,[(0,i.QD)("li",null,[(0,i.QD)("a",d,[(0,i.mY)("UI.Vision RPA 浏览器自动化工具:表单填写、网页内容抓取、网页操作录制"),(0,i.K2)(o)])]),(0,i.QD)("li",null,[(0,i.QD)("a",h,[(0,i.mY)("UI.Vision 命令官方文档"),(0,i.K2)(o)])]),(0,i.QD)("li",null,[(0,i.QD)("a",g,[(0,i.mY)("白话 UI.Vision Kantu 插件"),(0,i.K2)(o)])])])])}]]),f=JSON.parse('{"path":"/posts/2022-04-21-uivision_rpa.html","title":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA","lang":"zh-CN","frontmatter":{"title":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA","date":"2022-04-21T00:00:00.000Z","category":["自动化"],"tag":["浏览器插件","UI.Vision","RPA"],"order":-45,"description":" 无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。 Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。 但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个? 当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-04-21-uivision_rpa.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA"}],["meta",{"property":"og:description","content":" 无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。 Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。 但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个? 当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-14-45-43.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"浏览器插件"}],["meta",{"property":"article:tag","content":"UI.Vision"}],["meta",{"property":"article:tag","content":"RPA"}],["meta",{"property":"article:published_time","content":"2022-04-21T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-14-45-43.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-04-21-16-52-29.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-04-21-20-25-31.gif?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-04-21-17-15-59.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-04-21T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"安装 UI.Vision","slug":"安装-ui-vision","link":"#安装-ui-vision","children":[]},{"level":2,"title":"零门槛入门","slug":"零门槛入门","link":"#零门槛入门","children":[]},{"level":2,"title":"第一次使用","slug":"第一次使用","link":"#第一次使用","children":[]},{"level":2,"title":"不同变量重复运行","slug":"不同变量重复运行","link":"#不同变量重复运行","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"录制脚本无法使用","slug":"录制脚本无法使用","link":"#录制脚本无法使用","children":[]},{"level":3,"title":"浏览器外使用 RPA","slug":"浏览器外使用-rpa","link":"#浏览器外使用-rpa","children":[]},{"level":3,"title":"本地运行自动化报错","slug":"本地运行自动化报错","link":"#本地运行自动化报错","children":[]}]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":5.59,"words":1676},"filePathRelative":"_posts/2022-04-21-uivision_rpa.md","localizedDate":"2022年4月21日","excerpt":"
    \\n

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    \\n
    \\n

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    \\n

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    \\n

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    \\n

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2530],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,i]of t)o[e]=i;return o}},9200:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>u,data:()=>f});var i=o(7847);const n=(0,i.Fv)('

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    以下内容只适合不想学 Python,不懂编程,又想使用自动化和爬虫的小白,高手可以关闭页面了。

    UI.Vision RPA 是一款开源的全平台自动化工具,无需懂编程,即可完成网页和桌面自动化操作,包括文件上传、表单填写、内容抓取、定时截图、爬虫抓取等。

    安装 UI.Vision

    UI.Vision RPA 的主体是浏览器插件,只需去应用商店即可完成安装。

    ',10),a={href:"https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc",target:"_blank",rel:"noopener noreferrer"},r={href:"https://addons.mozilla.org/zh-CN/firefox/addon/rpa/",target:"_blank",rel:"noopener noreferrer"},l={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"},p=(0,i.Fv)('

    零门槛入门

    UI.Vision RPA 的运行脚本叫做「宏」。界面很简单,左侧是宏的范例库和本地文件,右侧是宏的运行和反馈区。

    UI.Vision 应用界面
    UI.Vision 应用界面

    打开 UI.Vision 插件,点击右上角按钮「Record」,插件会把你的操作录制为宏脚本。

    执行时,选中左侧保存的宏,然后点击右上角的按钮「Play Macro」,即可回放指定宏。点击「Play Loop」,则可让宏循环运行。循环次数 ${!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),s={href:"https://ui.vision/rpa/docs/selenium-ide/csvread",target:"_blank",rel:"noopener noreferrer"},c=(0,i.Fv)('
    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),d={href:"https://www.appinn.com/ui-vision-rpa/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://ui.vision/rpa/docs/selenium-ide",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/LoveOctocat/UI.Vision-Kantu-ZH",target:"_blank",rel:"noopener noreferrer"},m={},u=(0,o(3671).A)(m,[["render",function(e,t){const o=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[n,(0,i.Lk)("ul",null,[(0,i.Lk)("li",null,[(0,i.eW)("Chrome 插件:"),(0,i.Lk)("a",a,[(0,i.eW)("https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc"),(0,i.bF)(o)])]),(0,i.Lk)("li",null,[(0,i.eW)("Firefox 插件:"),(0,i.Lk)("a",r,[(0,i.eW)("https://addons.mozilla.org/zh-CN/firefox/addon/rpa/"),(0,i.bF)(o)])]),(0,i.Lk)("li",null,[(0,i.eW)("Edge 插件:"),(0,i.Lk)("a",l,[(0,i.eW)("https://microsoftedge.microsoft.com/addons/detail/uivision-rpa-浏览器自动化工具/goapmjinbaeomoemgdcnnhoedopjnddd"),(0,i.bF)(o)])])]),p,(0,i.Lk)("p",null,[(0,i.eW)("用不同的变量文本进行重复的网页操作,需要使用 UI.Vision 的 "),(0,i.Lk)("a",s,[(0,i.eW)("csvRead"),(0,i.bF)(o)]),(0,i.eW)(" 命令。下面以「依次打开不同链接」为例。")]),c,(0,i.Lk)("ul",null,[(0,i.Lk)("li",null,[(0,i.Lk)("a",d,[(0,i.eW)("UI.Vision RPA 浏览器自动化工具:表单填写、网页内容抓取、网页操作录制"),(0,i.bF)(o)])]),(0,i.Lk)("li",null,[(0,i.Lk)("a",h,[(0,i.eW)("UI.Vision 命令官方文档"),(0,i.bF)(o)])]),(0,i.Lk)("li",null,[(0,i.Lk)("a",g,[(0,i.eW)("白话 UI.Vision Kantu 插件"),(0,i.bF)(o)])])])])}]]),f=JSON.parse('{"path":"/posts/2022-04-21-uivision_rpa.html","title":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA","lang":"zh-CN","frontmatter":{"title":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA","date":"2022-04-21T00:00:00.000Z","category":["自动化"],"tag":["浏览器插件","UI.Vision","RPA"],"order":-45,"description":" 无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。 Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。 但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个? 当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-04-21-uivision_rpa.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA"}],["meta",{"property":"og:description","content":" 无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。 Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。 但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个? 当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-14-45-43.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"浏览器插件"}],["meta",{"property":"article:tag","content":"UI.Vision"}],["meta",{"property":"article:tag","content":"RPA"}],["meta",{"property":"article:published_time","content":"2022-04-21T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-14-45-43.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-04-21-16-52-29.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-04-21-20-25-31.gif?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-04-21-17-15-59.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-04-21T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"安装 UI.Vision","slug":"安装-ui-vision","link":"#安装-ui-vision","children":[]},{"level":2,"title":"零门槛入门","slug":"零门槛入门","link":"#零门槛入门","children":[]},{"level":2,"title":"第一次使用","slug":"第一次使用","link":"#第一次使用","children":[]},{"level":2,"title":"不同变量重复运行","slug":"不同变量重复运行","link":"#不同变量重复运行","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"录制脚本无法使用","slug":"录制脚本无法使用","link":"#录制脚本无法使用","children":[]},{"level":3,"title":"浏览器外使用 RPA","slug":"浏览器外使用-rpa","link":"#浏览器外使用-rpa","children":[]},{"level":3,"title":"本地运行自动化报错","slug":"本地运行自动化报错","link":"#本地运行自动化报错","children":[]}]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":5.59,"words":1676},"filePathRelative":"_posts/2022-04-21-uivision_rpa.md","localizedDate":"2022年4月21日","excerpt":"
    \\n

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    \\n
    \\n

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    \\n

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    \\n

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    \\n

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-9b12b53a.15ad3774.js b/assets/js/2022-05-22-surveillance_video_for_myself.html.f294b38f.js similarity index 78% rename from assets/js/v-9b12b53a.15ad3774.js rename to assets/js/2022-05-22-surveillance_video_for_myself.html.f294b38f.js index c6aadd5ad..dbe49db97 100644 --- a/assets/js/v-9b12b53a.15ad3774.js +++ b/assets/js/2022-05-22-surveillance_video_for_myself.html.f294b38f.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5974],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},3028:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>N,data:()=>O});var t=a(3968);const r=(0,t.IL)('

    疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。

    自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。

    寻找监控工具

    • 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。
    • 录屏软件:带移动侦测功能,检测到人则开启录像,无人则自动暂停,无需联网就能使用。
    • 播放软件:自动跳过超过 10s 的静止画面。
    • 直连电脑的摄像机:不联网,不用 SD 卡将视频直接存储在电脑上。虽然萤石、小米有移动侦测功能,但视频需上传云端,风险过大。

    找了许久,始终找不到合适的工具。监控摄像头和行车记录仪能跳过静止画面,但这类工具都不能直连电脑,且限制很多,不方便后期回放剪辑。

    最后靠着少数派群友 @chen 的推荐,尝试 DVR-Scan,补完了自我监控方案。

    自我监控方案

    ',7),l=(0,t.QD)("strong",null,"晨间唤醒",-1),o={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},s=(0,t.QD)("li",null,[(0,t.QD)("strong",null,"录制视频"),(0,t.mY)(":用 VLC 和摄像头录制视频,按计划开始工作学习。")],-1),i=(0,t.QD)("li",null,[(0,t.QD)("strong",null,"过滤视频"),(0,t.mY)(":晚上 11 点,DVR-Scan 过滤静止视频片段,记录录制时长和处理后的视频时长。 "),(0,t.QD)("img",{src:"https://img.newzone.top/2022-05-22-10-05-04.png?imageMogr2/format/webp",alt:"视频时长记录表格",loading:"lazy"})],-1),p=(0,t.QD)("li",null,[(0,t.QD)("strong",null,"视频回放"),(0,t.mY)(":100x 倍速回放工作视频,检查工作效率和成果。如果需要听声音,则使用 PotPlayer 播放降噪,剪辑出要使用的片段。原始视频和过滤视频保存一月,定期清理。")],-1),c=(0,t.QD)("li",null,[(0,t.QD)("strong",null,"当日回顾"),(0,t.mY)(":记录 3 件好事,总结好事发生的原因。 这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。")],-1),m=(0,t.QD)("p",null,"接下来,将详述自我监控方案的准备、流程及遇到的问题。",-1),d=(0,t.QD)("h2",{id:"监控准备",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#监控准备"},[(0,t.QD)("span",null,"监控准备")])],-1),g=(0,t.QD)("p",null,"自我监控方案的硬件需要摄像头、电脑,软件则使用 VLC、DVR-Scan、PotPlayer。",-1),u=(0,t.QD)("p",null,"摄像头预算一百左右就行,之前买过上千的罗技摄像头,画质并未有明显区别。",-1),h=(0,t.QD)("p",null,"收音设备使用的是摄像头自带的麦克风。之所以不用桌面的声卡外接话筒,是因为容易有回音,杂音更重。",-1),b=(0,t.QD)("h2",{id:"录制视频-vlc",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#录制视频-vlc"},[(0,t.QD)("span",null,"录制视频:VLC")])],-1),v=(0,t.QD)("p",null,"摄像头录像方案较少,大多是录屏软件的附带功能,我尝试了以下 9 种:",-1),f=(0,t.QD)("li",null,"相机:Windows 自带应用,录制方便,但输出选项少,限制多。",-1),D={href:"https://www.flashbackrecorder.com/zh/express/",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.bandicam.cn/",target:"_blank",rel:"noopener noreferrer"},w={href:"https://www.bandicam.cn/support/tips/timer-recording/",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://mirillis.com/zh/products/action.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://ohsoft.net/eng/ocam/intro.php?cate=1002",target:"_blank",rel:"noopener noreferrer"},_={href:"https://getsharex.com/",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://github.com/MathewSachin/Captura/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"},C={href:"https://blog.csdn.net/dglx_/article/details/122389601",target:"_blank",rel:"noopener noreferrer"},V={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},S=(0,t.IL)('

    Bandicam、Mirillis Action!录制时,电脑无法进入睡眠,ManicTime 也不能检测到你的离开状态。

    监控方案的单次录制时间在 12 小时以上,需要调低帧率以控制视频大小,选择了 VLC 作为录制软件。如果你要同时录屏和录像,可以使用 OBS、Capture 或 oCam。

    录制过程:

    1. 打开 VLC 的 Media -> Open Capture Device,将 Video device nameAudio device name 选为摄像头,然后点击底部 Play 按钮旁边的下拉菜单,选中 Convert

    2. Settings -> Profile 中选择视频输出方案,推荐选择 Video - H.264 + MP3 (MP4),接着点击旁边的扳手按钮,修改输出方案。

    3. Profile edition -> Video codec -> Encoding parameters,依次调整视频的编码、比特率、画面质量、帧率,编码建议使用 H-264,码率推荐 10 fps。

    4. Destination file 设置输出路径和视频名称。

    剪辑视频:DVR-Scan

    过滤视频的静态画面,是监控方案中的核心环节。开始我考虑用 QuickCut 过滤,但它是通过声音来判断视频是否静止(与飞书妙记的「跳过空白片段」原理类似),监控视频中大部分时间是没声音的,不适合用 QuickCut 剪辑。

    ',6),P={href:"https://github.com/Breakthrough/DVR-Scan",target:"_blank",rel:"noopener noreferrer"},z=(0,t.IL)('

    DVR-Scan 是一个跨平台命令行(CLI)应用程序,可以自动检测视频文件中的运动事件(例如安全摄像头镜头)。除了定位每个运动事件的时间和持续时间外,DVR 扫描还将每个运动事件的片段保存到一个新的单独的视频剪辑中。DVR-Scan 免费开源软件(FOSS)是用 Python 编写的,并且基于 Numpy 和 OpenCV,而且可以扩展和黑客入侵。

    DVR-Scan 操作很简单,视频目录内右键单击「在终端打开」,执行默认输出命令即可得到过滤后的视频。12 小时的视频,处理用时二十分钟,会占用大量 CPU。有点要注意,DVR-Scan 有个限制,只能导出为.avi视频。

    #默认输出命令,不含音频\ndvr-scan -i some_video.mp4 -o some_video_motion_only.avi\n\n#将含音轨的输出视频放于 output 文件夹,但输出会被分为多个视频\ndvr-scan -i some_video.mp4 -d output -m ffmpeg\n#如果只想获取单个输出视频,则使用视频合并命令。(默认终端为 Windows cmd(管理员),其他终端查看 https://trac.ffmpeg.org/wiki/Concatenate#demuxer)\ndvr-scan -i some_video.mp4 -d output -m ffmpeg && (for %i in (output/*.mp4) do @echo file '%i') > output/mylist.txt && ffmpeg -f concat -i output/mylist.txt -c copy output_combine.mp4 -y\n\n# -t 是 DVR-Scan 的动作检测敏感度,默认为 0.15,越低则越敏感\n#下列命令将敏感度调为 0.5,最大程度的删除静止画面帧\ndvr-scan -t 0.5 -i some_video.mp4 -o some_video_motion_only.avi\n\n# -b 是 DVR-Scan 的算法,默认为 MOG,追求速度则使用 CNT\n#最快速度的删除静止画面帧,但会牺牲准确率,有更多的静止画面帧被留存\ndvr-scan -b CNT -i some_video.mp4 -o some_video_motion_only.avi\n

    DVR-Scan 不同命令的测试效果如下:

    命令耗时(s)输出视频(mins)
    默认12407:15
    -t 0.512506:52
    -b CNT10710:05
    -t 0.5 -b CNT10408:39

    另外,DVR-Scan 可以使用 -roi 命令,指定监测区域,只对该区域的动作进行监测。

    ',6),M={href:"https://dvr-scan.readthedocs.io/en/latest/guide/examples/",target:"_blank",rel:"noopener noreferrer"},R=(0,t.IL)('

    播放降噪:PotPlayer

    桌面录音容易有较大的噪音,重新处理的话需要大量时间,因此我将降噪环节放在视频播放器中处理。

    • 开启降噪:风噪等一系列噪声会消失,但是带过降噪耳机的都知道,开启降噪会有一种很糊的感觉,这时视频的声音就会变得无比无比的糊。

    • 开启语音增强:语音增强会在很糊的声音中明显听到人的声音,但是还是略显不足,还是有点杂,而且声音特别大。

    • 关闭规格化:这时声音就不会那么大,也不会过于杂了,这时的声音已经相比处理前干净多了。

    • 开启超高音:打开均衡器,选择「超高音」方案。

      PotPlayer 播放降噪设置
      PotPlayer 播放降噪设置

    设置完成后,播放时 PotPlayer 会自动对视频进行降噪,无需额外花时间处理视频。

    总结

    自我监控分为 5 步,「晨间唤醒:计划」>「录制视频:VLC」>「过滤视频:DVR-Scan」>「视频回放:PotPlayer」>「当日回顾」。搭配脚本,每天开机自动开始录制视频,然后在晚上九点停止录制,并过滤当天视频的静止帧。

    经过一段时间的自我监控,我对自己的活动有了更清晰的认知,从而更方便地进行行为控制和修正。此外,由于视频存储在本地,不向第三方开放,所以可以安心地做自己。在每日回顾中,勇敢地面对自己的缺点和错误,积极地进行调整。

    参考资料:

    ',8),K={href:"https://askubuntu.com/questions/422341/how-can-i-detect-motion-in-a-long-mostly-dull-video/423028#423028",target:"_blank",rel:"noopener noreferrer"},T={href:"https://blog.csdn.net/NeiHan2020/article/details/118368739",target:"_blank",rel:"noopener noreferrer"},L={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},B={},N=(0,a(9720).c)(B,[["render",function(e,n){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[r,(0,t.QD)("ol",null,[(0,t.QD)("li",null,[l,(0,t.mY)(":起床后,用手机单独录一句话。这句话在前一天准备好,包括日期、当日目标,也可以引入美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。 晨间唤醒参考了"),(0,t.QD)("a",o,[(0,t.mY)("积极心理学"),(0,t.K2)(a)]),(0,t.mY)(",收集积极情绪材料,给自己创造美好的情绪。")]),s,i,p,c]),m,d,g,u,h,b,v,(0,t.QD)("ul",null,[f,(0,t.QD)("li",null,[(0,t.QD)("a",D,[(0,t.mY)("FlashBack Express"),(0,t.K2)(a)]),(0,t.mY)(":能调节帧率,镜像,虚化背景,但免费版只支持 2 小时内的录制。")]),(0,t.QD)("li",null,[(0,t.QD)("a",k,[(0,t.mY)("Bandicam"),(0,t.K2)(a)]),(0,t.mY)(":录制时能降噪,内录扬声器音频,自由调节编码、帧率,但免费版只支持录制 10 分钟且有水印,输出文件名自定义规则极少。Bandicam 支持定时录制计划,但录制的开始和结束都必须由该计划执行,否则录制计划将不会执行。比如使用 Bandicam 的开机录制后,定时录制计划就会失效,需借助 Windows 的任务计划程序来定时录制停止,操作参考 "),(0,t.QD)("a",w,[(0,t.mY)("Bandicam 官方文档"),(0,t.K2)(a)]),(0,t.mY)("。")]),(0,t.QD)("li",null,[(0,t.QD)("a",Q,[(0,t.mY)("Mirillis Action!"),(0,t.K2)(a)]),(0,t.mY)(":高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。")]),(0,t.QD)("li",null,[(0,t.QD)("a",y,[(0,t.mY)("oCam"),(0,t.K2)(a)]),(0,t.mY)(":打着免费招牌但有弹窗广告,且录制视频偏大。")]),(0,t.QD)("li",null,[(0,t.QD)("a",_,[(0,t.mY)("ShareX"),(0,t.K2)(a)]),(0,t.mY)(":免费开源强大的截图软件,也具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。")]),(0,t.QD)("li",null,[(0,t.QD)("a",Y,[(0,t.mY)("Capture"),(0,t.K2)(a)]),(0,t.mY)(":免费开源,使用前需手动 "),(0,t.QD)("a",C,[(0,t.mY)("配置 FFmpeg"),(0,t.K2)(a)]),(0,t.mY)(",自定义叠加元素,但项目已停止更新。测试时,Capture 经常莫名其妙的报错,重启大概率恢复正常,只能偶尔用用,不能用于工作环境。")]),(0,t.QD)("li",null,[(0,t.QD)("a",V,[(0,t.mY)("OBS"),(0,t.K2)(a)]),(0,t.mY)(":免费开源直播软件,也可以录制视频,操作性极强,但输出限制多,也难以在直播的同时进行桌面录制。")]),(0,t.QD)("li",null,[(0,t.QD)("a",x,[(0,t.mY)("VLC"),(0,t.K2)(a)]),(0,t.mY)(":免费开源视频软件,能调节输出视频的编码、帧率、格式,但操作麻烦,只能单一录屏或录像,暂停录制容易有 bug。")])]),S,(0,t.QD)("p",null,[(0,t.mY)("群里 @chen 推荐了 "),(0,t.QD)("a",P,[(0,t.mY)("DVR-Scan"),(0,t.K2)(a)]),(0,t.mY)(",能从画面判断是否需要过滤。")]),z,(0,t.QD)("p",null,[(0,t.mY)("DVR-Scan 进阶命令查看"),(0,t.QD)("a",M,[(0,t.mY)("官方文档"),(0,t.K2)(a)]),(0,t.mY)("。")]),R,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",K,[(0,t.mY)("How can I detect motion in a long, mostly dull video?"),(0,t.K2)(a)])]),(0,t.QD)("li",null,[(0,t.QD)("a",T,[(0,t.mY)("如何设置 potplayer 播放器把人声凸显出来并降噪?"),(0,t.K2)(a)])]),(0,t.QD)("li",null,[(0,t.QD)("a",L,[(0,t.mY)("网课:积极心理学"),(0,t.K2)(a)])])])])}]]),O=JSON.parse('{"path":"/posts/2022-05-22-surveillance_video_for_myself.html","title":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像","lang":"zh-CN","frontmatter":{"title":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像","date":"2022-05-22T00:00:00.000Z","category":["头脑驿站"],"tag":["录屏","自我管理"],"order":-46,"description":"疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。 自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。 寻找监控工具: 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。 录屏软件:...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像"}],["meta",{"property":"og:description","content":"疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。 自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。 寻找监控工具: 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。 录屏软件:..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-22-10-05-04.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"录屏"}],["meta",{"property":"article:tag","content":"自我管理"}],["meta",{"property":"article:published_time","content":"2022-05-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"疫情封控两个月后,我对自己开始 24 小时的自我监控录像\\",\\"image\\":[\\"https://img.newzone.top/2022-05-22-10-05-04.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-21-22-09-08.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-21-22-11-09.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-21-22-12-32.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-19-10-47-18.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-05-22T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"自我监控方案","slug":"自我监控方案","link":"#自我监控方案","children":[]},{"level":2,"title":"监控准备","slug":"监控准备","link":"#监控准备","children":[]},{"level":2,"title":"录制视频:VLC","slug":"录制视频-vlc","link":"#录制视频-vlc","children":[]},{"level":2,"title":"剪辑视频:DVR-Scan","slug":"剪辑视频-dvr-scan","link":"#剪辑视频-dvr-scan","children":[]},{"level":2,"title":"播放降噪:PotPlayer","slug":"播放降噪-potplayer","link":"#播放降噪-potplayer","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":8.9,"words":2669},"filePathRelative":"_posts/2022-05-22-surveillance_video_for_myself.md","localizedDate":"2022年5月22日","excerpt":"

    疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。

    \\n

    自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。

    \\n

    寻找监控工具

    \\n
      \\n
    • 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。
    • \\n
    • 录屏软件:带移动侦测功能,检测到人则开启录像,无人则自动暂停,无需联网就能使用。
    • \\n
    • 播放软件:自动跳过超过 10s 的静止画面。
    • \\n
    • 直连电脑的摄像机:不联网,不用 SD 卡将视频直接存储在电脑上。虽然萤石、小米有移动侦测功能,但视频需上传云端,风险过大。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1946],{3671:(e,a)=>{a.A=(e,a)=>{const n=e.__vccOpts||e;for(const[e,t]of a)n[e]=t;return n}},4986:(e,a,n)=>{n.r(a),n.d(a,{comp:()=>O,data:()=>A});var t=n(7847);const r=(0,t.Fv)('

    疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。

    自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。

    寻找监控工具

    • 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。
    • 录屏软件:带移动侦测功能,检测到人则开启录像,无人则自动暂停,无需联网就能使用。
    • 播放软件:自动跳过超过 10s 的静止画面。
    • 直连电脑的摄像机:不联网,不用 SD 卡将视频直接存储在电脑上。虽然萤石、小米有移动侦测功能,但视频需上传云端,风险过大。

    找了许久,始终找不到合适的工具。监控摄像头和行车记录仪能跳过静止画面,但这类工具都不能直连电脑,且限制很多,不方便后期回放剪辑。

    最后靠着少数派群友 @chen 的推荐,尝试 DVR-Scan,补完了自我监控方案。

    自我监控方案

    ',7),l=(0,t.Lk)("strong",null,"晨间唤醒",-1),o={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},s=(0,t.Lk)("li",null,[(0,t.Lk)("strong",null,"录制视频"),(0,t.eW)(":用 VLC 和摄像头录制视频,按计划开始工作学习。")],-1),i=(0,t.Lk)("li",null,[(0,t.Lk)("strong",null,"过滤视频"),(0,t.eW)(":晚上 11 点,DVR-Scan 过滤静止视频片段,记录录制时长和处理后的视频时长。 "),(0,t.Lk)("img",{src:"https://img.newzone.top/2022-05-22-10-05-04.png?imageMogr2/format/webp",alt:"视频时长记录表格",loading:"lazy"})],-1),p=(0,t.Lk)("li",null,[(0,t.Lk)("strong",null,"视频回放"),(0,t.eW)(":100x 倍速回放工作视频,检查工作效率和成果。如果需要听声音,则使用 PotPlayer 播放降噪,剪辑出要使用的片段。原始视频和过滤视频保存一月,定期清理。")],-1),c=(0,t.Lk)("li",null,[(0,t.Lk)("strong",null,"当日回顾"),(0,t.eW)(":记录 3 件好事,总结好事发生的原因。 这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。")],-1),d=(0,t.Lk)("p",null,"接下来,将详述自我监控方案的准备、流程及遇到的问题。",-1),m=(0,t.Lk)("h2",{id:"监控准备",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#监控准备"},[(0,t.Lk)("span",null,"监控准备")])],-1),g=(0,t.Lk)("p",null,"自我监控方案的硬件需要摄像头、电脑,软件则使用 VLC、DVR-Scan、PotPlayer。",-1),u=(0,t.Lk)("p",null,"摄像头预算一百左右就行,之前买过上千的罗技摄像头,画质并未有明显区别。",-1),h=(0,t.Lk)("p",null,"收音设备使用的是摄像头自带的麦克风。之所以不用桌面的声卡外接话筒,是因为容易有回音,杂音更重。",-1),k=(0,t.Lk)("h2",{id:"录制视频-vlc",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#录制视频-vlc"},[(0,t.Lk)("span",null,"录制视频:VLC")])],-1),b=(0,t.Lk)("p",null,"摄像头录像方案较少,大多是录屏软件的附带功能,我尝试了以下 9 种:",-1),v=(0,t.Lk)("li",null,"相机:Windows 自带应用,录制方便,但输出选项少,限制多。",-1),f={href:"https://www.flashbackrecorder.com/zh/express/",target:"_blank",rel:"noopener noreferrer"},L={href:"https://www.bandicam.cn/",target:"_blank",rel:"noopener noreferrer"},w={href:"https://www.bandicam.cn/support/tips/timer-recording/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://mirillis.com/zh/products/action.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://ohsoft.net/eng/ocam/intro.php?cate=1002",target:"_blank",rel:"noopener noreferrer"},W={href:"https://getsharex.com/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/MathewSachin/Captura/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"},V={href:"https://blog.csdn.net/dglx_/article/details/122389601",target:"_blank",rel:"noopener noreferrer"},x={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},S={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},P=(0,t.Fv)('

    Bandicam、Mirillis Action!录制时,电脑无法进入睡眠,ManicTime 也不能检测到你的离开状态。

    监控方案的单次录制时间在 12 小时以上,需要调低帧率以控制视频大小,选择了 VLC 作为录制软件。如果你要同时录屏和录像,可以使用 OBS、Capture 或 oCam。

    录制过程:

    1. 打开 VLC 的 Media -> Open Capture Device,将 Video device nameAudio device name 选为摄像头,然后点击底部 Play 按钮旁边的下拉菜单,选中 Convert

    2. Settings -> Profile 中选择视频输出方案,推荐选择 Video - H.264 + MP3 (MP4),接着点击旁边的扳手按钮,修改输出方案。

    3. Profile edition -> Video codec -> Encoding parameters,依次调整视频的编码、比特率、画面质量、帧率,编码建议使用 H-264,码率推荐 10 fps。

    4. Destination file 设置输出路径和视频名称。

    剪辑视频:DVR-Scan

    过滤视频的静态画面,是监控方案中的核心环节。开始我考虑用 QuickCut 过滤,但它是通过声音来判断视频是否静止(与飞书妙记的「跳过空白片段」原理类似),监控视频中大部分时间是没声音的,不适合用 QuickCut 剪辑。

    ',6),D={href:"https://github.com/Breakthrough/DVR-Scan",target:"_blank",rel:"noopener noreferrer"},F=(0,t.Fv)('

    DVR-Scan 是一个跨平台命令行(CLI)应用程序,可以自动检测视频文件中的运动事件(例如安全摄像头镜头)。除了定位每个运动事件的时间和持续时间外,DVR 扫描还将每个运动事件的片段保存到一个新的单独的视频剪辑中。DVR-Scan 免费开源软件(FOSS)是用 Python 编写的,并且基于 Numpy 和 OpenCV,而且可以扩展和黑客入侵。

    DVR-Scan 操作很简单,视频目录内右键单击「在终端打开」,执行默认输出命令即可得到过滤后的视频。12 小时的视频,处理用时二十分钟,会占用大量 CPU。有点要注意,DVR-Scan 有个限制,只能导出为.avi视频。

    #默认输出命令,不含音频\ndvr-scan -i some_video.mp4 -o some_video_motion_only.avi\n\n#将含音轨的输出视频放于 output 文件夹,但输出会被分为多个视频\ndvr-scan -i some_video.mp4 -d output -m ffmpeg\n#如果只想获取单个输出视频,则使用视频合并命令。(默认终端为 Windows cmd(管理员),其他终端查看 https://trac.ffmpeg.org/wiki/Concatenate#demuxer)\ndvr-scan -i some_video.mp4 -d output -m ffmpeg && (for %i in (output/*.mp4) do @echo file '%i') > output/mylist.txt && ffmpeg -f concat -i output/mylist.txt -c copy output_combine.mp4 -y\n\n# -t 是 DVR-Scan 的动作检测敏感度,默认为 0.15,越低则越敏感\n#下列命令将敏感度调为 0.5,最大程度的删除静止画面帧\ndvr-scan -t 0.5 -i some_video.mp4 -o some_video_motion_only.avi\n\n# -b 是 DVR-Scan 的算法,默认为 MOG,追求速度则使用 CNT\n#最快速度的删除静止画面帧,但会牺牲准确率,有更多的静止画面帧被留存\ndvr-scan -b CNT -i some_video.mp4 -o some_video_motion_only.avi\n

    DVR-Scan 不同命令的测试效果如下:

    命令耗时(s)输出视频(mins)
    默认12407:15
    -t 0.512506:52
    -b CNT10710:05
    -t 0.5 -b CNT10408:39

    另外,DVR-Scan 可以使用 -roi 命令,指定监测区域,只对该区域的动作进行监测。

    ',6),z={href:"https://dvr-scan.readthedocs.io/en/latest/guide/examples/",target:"_blank",rel:"noopener noreferrer"},M=(0,t.Fv)('

    播放降噪:PotPlayer

    桌面录音容易有较大的噪音,重新处理的话需要大量时间,因此我将降噪环节放在视频播放器中处理。

    • 开启降噪:风噪等一系列噪声会消失,但是带过降噪耳机的都知道,开启降噪会有一种很糊的感觉,这时视频的声音就会变得无比无比的糊。

    • 开启语音增强:语音增强会在很糊的声音中明显听到人的声音,但是还是略显不足,还是有点杂,而且声音特别大。

    • 关闭规格化:这时声音就不会那么大,也不会过于杂了,这时的声音已经相比处理前干净多了。

    • 开启超高音:打开均衡器,选择「超高音」方案。

      PotPlayer 播放降噪设置
      PotPlayer 播放降噪设置

    设置完成后,播放时 PotPlayer 会自动对视频进行降噪,无需额外花时间处理视频。

    总结

    自我监控分为 5 步,「晨间唤醒:计划」>「录制视频:VLC」>「过滤视频:DVR-Scan」>「视频回放:PotPlayer」>「当日回顾」。搭配脚本,每天开机自动开始录制视频,然后在晚上九点停止录制,并过滤当天视频的静止帧。

    经过一段时间的自我监控,我对自己的活动有了更清晰的认知,从而更方便地进行行为控制和修正。此外,由于视频存储在本地,不向第三方开放,所以可以安心地做自己。在每日回顾中,勇敢地面对自己的缺点和错误,积极地进行调整。

    参考资料:

    ',8),R={href:"https://askubuntu.com/questions/422341/how-can-i-detect-motion-in-a-long-mostly-dull-video/423028#423028",target:"_blank",rel:"noopener noreferrer"},T={href:"https://blog.csdn.net/NeiHan2020/article/details/118368739",target:"_blank",rel:"noopener noreferrer"},B={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},N={},O=(0,n(3671).A)(N,[["render",function(e,a){const n=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[r,(0,t.Lk)("ol",null,[(0,t.Lk)("li",null,[l,(0,t.eW)(":起床后,用手机单独录一句话。这句话在前一天准备好,包括日期、当日目标,也可以引入美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。 晨间唤醒参考了"),(0,t.Lk)("a",o,[(0,t.eW)("积极心理学"),(0,t.bF)(n)]),(0,t.eW)(",收集积极情绪材料,给自己创造美好的情绪。")]),s,i,p,c]),d,m,g,u,h,k,b,(0,t.Lk)("ul",null,[v,(0,t.Lk)("li",null,[(0,t.Lk)("a",f,[(0,t.eW)("FlashBack Express"),(0,t.bF)(n)]),(0,t.eW)(":能调节帧率,镜像,虚化背景,但免费版只支持 2 小时内的录制。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",L,[(0,t.eW)("Bandicam"),(0,t.bF)(n)]),(0,t.eW)(":录制时能降噪,内录扬声器音频,自由调节编码、帧率,但免费版只支持录制 10 分钟且有水印,输出文件名自定义规则极少。Bandicam 支持定时录制计划,但录制的开始和结束都必须由该计划执行,否则录制计划将不会执行。比如使用 Bandicam 的开机录制后,定时录制计划就会失效,需借助 Windows 的任务计划程序来定时录制停止,操作参考 "),(0,t.Lk)("a",w,[(0,t.eW)("Bandicam 官方文档"),(0,t.bF)(n)]),(0,t.eW)("。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",y,[(0,t.eW)("Mirillis Action!"),(0,t.bF)(n)]),(0,t.eW)(":高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",_,[(0,t.eW)("oCam"),(0,t.bF)(n)]),(0,t.eW)(":打着免费招牌但有弹窗广告,且录制视频偏大。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",W,[(0,t.eW)("ShareX"),(0,t.bF)(n)]),(0,t.eW)(":免费开源强大的截图软件,也具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",C,[(0,t.eW)("Capture"),(0,t.bF)(n)]),(0,t.eW)(":免费开源,使用前需手动 "),(0,t.Lk)("a",V,[(0,t.eW)("配置 FFmpeg"),(0,t.bF)(n)]),(0,t.eW)(",自定义叠加元素,但项目已停止更新。测试时,Capture 经常莫名其妙的报错,重启大概率恢复正常,只能偶尔用用,不能用于工作环境。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",x,[(0,t.eW)("OBS"),(0,t.bF)(n)]),(0,t.eW)(":免费开源直播软件,也可以录制视频,操作性极强,但输出限制多,也难以在直播的同时进行桌面录制。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",S,[(0,t.eW)("VLC"),(0,t.bF)(n)]),(0,t.eW)(":免费开源视频软件,能调节输出视频的编码、帧率、格式,但操作麻烦,只能单一录屏或录像,暂停录制容易有 bug。")])]),P,(0,t.Lk)("p",null,[(0,t.eW)("群里 @chen 推荐了 "),(0,t.Lk)("a",D,[(0,t.eW)("DVR-Scan"),(0,t.bF)(n)]),(0,t.eW)(",能从画面判断是否需要过滤。")]),F,(0,t.Lk)("p",null,[(0,t.eW)("DVR-Scan 进阶命令查看"),(0,t.Lk)("a",z,[(0,t.eW)("官方文档"),(0,t.bF)(n)]),(0,t.eW)("。")]),M,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",R,[(0,t.eW)("How can I detect motion in a long, mostly dull video?"),(0,t.bF)(n)])]),(0,t.Lk)("li",null,[(0,t.Lk)("a",T,[(0,t.eW)("如何设置 potplayer 播放器把人声凸显出来并降噪?"),(0,t.bF)(n)])]),(0,t.Lk)("li",null,[(0,t.Lk)("a",B,[(0,t.eW)("网课:积极心理学"),(0,t.bF)(n)])])])])}]]),A=JSON.parse('{"path":"/posts/2022-05-22-surveillance_video_for_myself.html","title":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像","lang":"zh-CN","frontmatter":{"title":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像","date":"2022-05-22T00:00:00.000Z","category":["头脑驿站"],"tag":["录屏","自我管理"],"order":-46,"description":"疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。 自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。 寻找监控工具: 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。 录屏软件:...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像"}],["meta",{"property":"og:description","content":"疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。 自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。 寻找监控工具: 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。 录屏软件:..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-22-10-05-04.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"疫情封控两个月后,我对自己开始 24 小时的自我监控录像"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"录屏"}],["meta",{"property":"article:tag","content":"自我管理"}],["meta",{"property":"article:published_time","content":"2022-05-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"疫情封控两个月后,我对自己开始 24 小时的自我监控录像\\",\\"image\\":[\\"https://img.newzone.top/2022-05-22-10-05-04.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-21-22-09-08.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-21-22-11-09.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-21-22-12-32.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-19-10-47-18.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-05-22T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"自我监控方案","slug":"自我监控方案","link":"#自我监控方案","children":[]},{"level":2,"title":"监控准备","slug":"监控准备","link":"#监控准备","children":[]},{"level":2,"title":"录制视频:VLC","slug":"录制视频-vlc","link":"#录制视频-vlc","children":[]},{"level":2,"title":"剪辑视频:DVR-Scan","slug":"剪辑视频-dvr-scan","link":"#剪辑视频-dvr-scan","children":[]},{"level":2,"title":"播放降噪:PotPlayer","slug":"播放降噪-potplayer","link":"#播放降噪-potplayer","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":8.9,"words":2669},"filePathRelative":"_posts/2022-05-22-surveillance_video_for_myself.md","localizedDate":"2022年5月22日","excerpt":"

    疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。

    \\n

    自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。

    \\n

    寻找监控工具

    \\n
      \\n
    • 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。
    • \\n
    • 录屏软件:带移动侦测功能,检测到人则开启录像,无人则自动暂停,无需联网就能使用。
    • \\n
    • 播放软件:自动跳过超过 10s 的静止画面。
    • \\n
    • 直连电脑的摄像机:不联网,不用 SD 卡将视频直接存储在电脑上。虽然萤石、小米有移动侦测功能,但视频需上传云端,风险过大。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2022-06-07-blog_md_to_wordpress.html.16015845.js b/assets/js/2022-06-07-blog_md_to_wordpress.html.16015845.js new file mode 100644 index 000000000..f467bb508 --- /dev/null +++ b/assets/js/2022-06-07-blog_md_to_wordpress.html.16015845.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[616],{3671:(e,o)=>{o.A=(e,o)=>{const r=e.__vccOpts||e;for(const[e,n]of o)r[e]=n;return r}},1381:(e,o,r)=>{r.r(o),r.d(o,{comp:()=>Z,data:()=>D});var n=r(7847);const t=(0,n.Lk)("h2",{id:"博客探索",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#博客探索"},[(0,n.Lk)("span",null,"博客探索")])],-1),l=(0,n.Lk)("p",null,"2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​",-1),i={href:"https://jekyllrb.com/",target:"_blank",rel:"noopener noreferrer"},a=(0,n.Fv)('

    到了 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),s={href:"https://github.com/zhaoolee/WordPressXMLRPCTools",target:"_blank",rel:"noopener noreferrer"},d=(0,n.Lk)("p",null,"基于 WordPressXMLRPCTools,我做了三点修改:​",-1),p=(0,n.Fv)("
  • 发布设置:修改 main.py 文件。

    • 修复无法覆盖更新文章的 bug。
    • 调整项目页的时间格式。
    • 页首添加文章编辑时间,默认为格林尼治标准时间,比北京晚 8 小时。
    • 将文章页尾部的本文永久更新地址从标题格式调整为常规字母。
  • 草稿箱:_post 路径内新建 TEMP 文件夹,用于存放文章草稿。WordPress 推送程序会忽略 _post 子文件夹的内容,换言之,TEMP 文件夹不会发布到 WordPress 网站。

  • ",2),c=(0,n.Lk)("code",null,".nojekyll",-1),h=(0,n.Lk)("code",null,"index.html",-1),g=(0,n.Lk)("code",null,"_sidebar.md",-1),u={href:"https://rockbenben.github.io/Blog_WP/",target:"_blank",rel:"noopener noreferrer"},k=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-05-26-20-12-56.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"docsify 页面效果")],-1),m=(0,n.Lk)("h3",{id:"使用流程",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#使用流程"},[(0,n.Lk)("span",null,"使用流程")])],-1),b={href:"https://github.com/rockbenben/Blog_WP",target:"_blank",rel:"noopener noreferrer"},f=(0,n.Lk)("li",null,[(0,n.eW)("回到你新建的 repo,删除 _post 文件夹中的所有文件,参照主目录下 "),(0,n.Lk)("code",null,"example_article.md"),(0,n.eW)(" 的格式编辑文章。注意:md 文件名不能包含大写字母。")],-1),W={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"},w=(0,n.Lk)("li",null,[(0,n.eW)("修改主目录下的 "),(0,n.Lk)("code",null,"index.html"),(0,n.eW)(" 和 "),(0,n.Lk)("code",null,"_sidebar.md"),(0,n.eW)(" 文件,调整 docsify 网页设置。 "),(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("code",null,"index.html"),(0,n.eW)(" 修改 docsify 网页标题、描述和关键词。")]),(0,n.Lk)("li",null,[(0,n.Lk)("code",null,"_sidebar.md"),(0,n.eW)(" 修改 docsify 网页侧边栏,加入博客文章的标题和位置。")])])],-1),y=(0,n.Fv)('

    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),L={href:"https://hui-zz.gitee.io/runany/#/",target:"_blank",rel:"noopener noreferrer"},P=(0,n.Lk)("code",null,"Code.exe",-1),x=(0,n.Lk)("code",null,"notepad++.exe",-1),_=(0,n.Fv)('
    ;将 Runany 主目录下的 RunAny.ini 文件内的「编辑」模块替换为下方命令\n-编辑(&Edit)\n --编程|cmd bat md ahk html js css json yml yaml py\n vscode|Code.exe\n

    docsify 全文检索

    ',2),M={href:"https://docsify.js.org/#/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/rockbenben/Blog_WP",target:"_blank",rel:"noopener noreferrer"},z=(0,n.Lk)("code",null,"docsify serve",-1),A=(0,n.Lk)("code",null,"http://localhost:3000/",-1),E=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-05-30-20-03-19.png?imageMogr2/format/webp",alt:"docsify 本地运行",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"docsify 本地运行")],-1),S={href:"https://rockbenben.github.io/Blog_WP/",target:"_blank",rel:"noopener noreferrer"},N=(0,n.Lk)("h2",{id:"订阅管理-wordpress",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#订阅管理-wordpress"},[(0,n.Lk)("span",null,"订阅管理:WordPress")])],-1),R=(0,n.Lk)("p",null,"40% 的网站基于 WordPress 架构,因此 WordPress 有超多的主题和插件,可以实现你想要的功能,比如 RSS、Newsletter。",-1),B={href:"https://substack.com/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://zhubai.love/",target:"_blank",rel:"noopener noreferrer"},F=(0,n.Lk)("h2",{id:"后续",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#后续"},[(0,n.Lk)("span",null,"后续")])],-1),G=(0,n.Lk)("p",null,"比起原来的 Jekyll,新方案的配置要复杂些,但使用并不难,推荐稿件多的人采用。",-1),C=(0,n.Lk)("p",null,"折腾新方案的过程中,我发现了篇 2021 年初写的文章。当时,稿子写到 90%,我就去忙其他事,忘了这篇文章。等到这次被发现,它已经在草稿箱待了一年半。",-1),J=(0,n.Lk)("p",null,"用了新方案,稿件管理会变得很简单,稿件遗忘、找不到的情况也会减少许多。最近我出稿速度大增,也都跟这有关,都是从草稿箱捡回来的半成品。",-1),j=(0,n.Lk)("p",null,"写完这篇稿子,疫情封控也正好结束,终于可以出门了,希望永远别再给「免费假期」了。",-1),X={},Z=(0,r(3671).A)(X,[["render",function(e,o){const r=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[t,l,(0,n.Lk)("p",null,[(0,n.eW)("2018 年,我偶然接触到 "),(0,n.Lk)("a",i,[(0,n.eW)("Jekyll"),(0,n.bF)(r)]),(0,n.eW)(",被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录转变到知识整理输出。Jekyll 方案需要首先在本地用 Markdown 编辑排版,然后同步到 github 发布,最后以 Markdown 格式手动分发到各个渠道。当文章较少时,这套方案的体验感特别好。​")]),a,(0,n.Lk)("p",null,[(0,n.Lk)("a",s,[(0,n.eW)("WordPressXMLRPCTools"),(0,n.bF)(r)]),(0,n.eW)(" 能用 Markdown 生成博客,推送更新到 Github 后,通过 Github Actions 自动将文章更新到 WordPress,并将 WordPress 网站的文章索引更新到 Github 仓库的 README.md,供搜索引擎收录,方便 Windows 用户使用。iOS 用户有更成熟的发布工具,无需代码即可到同步 WordPress,比如 @ern 推荐的 MWeb/Ulysses。")]),d,(0,n.Lk)("ul",null,[p,(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("文章聚合页:主路径添加 "),c,(0,n.eW)("、"),h,(0,n.eW)(" 和 "),g,(0,n.eW)(" 三个文件,引入了文档生成工具 docsify,使得博客文章能聚合在一个页面,方便快速定位和位置管理。示例:"),(0,n.Lk)("a",u,[(0,n.eW)("https://rockbenben.github.io/Blog_WP/"),(0,n.bF)(r)]),(0,n.eW)("。")]),k])]),m,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.eW)("进入 "),(0,n.Lk)("a",b,[(0,n.eW)("项目页面"),(0,n.bF)(r)]),(0,n.eW)(",点击「Use this template」,复制模板文件。")]),f,(0,n.Lk)("li",null,[(0,n.eW)("按 "),(0,n.Lk)("a",W,[(0,n.eW)("WordPressXMLRPCTools 安装步骤"),(0,n.bF)(r)]),(0,n.eW)(" 执行,如遇报错,查看下方使用问题。注意检查 WordPress 登录授权和 Github Actions secret,这两步极易遗漏。")]),w]),y,(0,n.Lk)("p",null,[(0,n.Lk)("a",L,[(0,n.eW)("RunAny"),(0,n.bF)(r)]),(0,n.eW)(" 是基于 AutoHotkey 的一键启动软件。按下方配置后,点击飞书表格中的「本地位置」,即可使用默认编辑器打开 md 文件。如果你的默认编辑器是 notepad++,则将下方命令中的 "),P,(0,n.eW)(" 替换为 "),x,(0,n.eW)("。")]),_,(0,n.Lk)("p",null,[(0,n.eW)("飞书表格可以搜索关键元素,但不能对检索全文。这时,我们需要使用 "),(0,n.Lk)("a",M,[(0,n.eW)("docsify"),(0,n.bF)(r)]),(0,n.eW)(",一款能将 markdown 文档自动生成网站的工具,相当于轻量级的 GitBook。​")]),(0,n.Lk)("p",null,[(0,n.eW)("docsify 使用简单,如果使用了前文我修改过的"),(0,n.Lk)("a",v,[(0,n.eW)("发布工具"),(0,n.bF)(r)]),(0,n.eW)(",则无需配置。在发布工具文件夹内的空白区域,右键打开终端,执行命令"),z,(0,n.eW)("即可生成全文检索网页,默认管理链接为 "),A,(0,n.eW)("。")]),E,(0,n.Lk)("p",null,[(0,n.eW)("如果你设置了 Github Pages,项目会默认启动在线 docsify 网页,页面链接取决于 Github 的设置。比如我的用户名是 rockbenben,项目名是 Blog_WP,所以 docsify 管理页面就是 "),(0,n.Lk)("a",S,[(0,n.eW)("https://rockbenben.github.io/Blog_WP/"),(0,n.bF)(r)]),(0,n.eW)("。")]),N,R,(0,n.Lk)("p",null,[(0,n.eW)("如果你拥有较多的粉丝,可以使用 "),(0,n.Lk)("a",B,[(0,n.eW)("Substack"),(0,n.bF)(r)]),(0,n.eW)(" 和"),(0,n.Lk)("a",T,[(0,n.eW)("竹白"),(0,n.bF)(r)]),(0,n.eW)("来分发博客。这两者都支持 Newsletter 付费订阅。只针对国内用户的话,竹白可支持微信订阅。")]),F,G,C,J,j])}]]),D=JSON.parse('{"path":"/posts/2022-06-07-blog_md_to_wordpress.html","title":"集自动发布、本地管理于一身:WordPress 博客管理方案分享","lang":"zh-CN","frontmatter":{"title":"集自动发布、本地管理于一身:WordPress 博客管理方案分享","subtitle":"18 年博客探索总结","date":"2022-06-07T00:00:00.000Z","category":["博客"],"tag":["blog","github","WordPress"],"order":-47,"description":"博客探索 2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​ 2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-06-07-blog_md_to_wordpress.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"集自动发布、本地管理于一身:WordPress 博客管理方案分享"}],["meta",{"property":"og:description","content":"博客探索 2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​ 2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"集自动发布、本地管理于一身:WordPress 博客管理方案分享"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"blog"}],["meta",{"property":"article:tag","content":"github"}],["meta",{"property":"article:tag","content":"WordPress"}],["meta",{"property":"article:published_time","content":"2022-06-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"集自动发布、本地管理于一身:WordPress 博客管理方案分享\\",\\"image\\":[\\"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-26-20-12-56.png \\\\\\"docsify 页面效果\\\\\\"\\",\\"https://img.newzone.top/2022-05-26-20-36-56.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-30-19-00-15.png \\\\\\"难以管理的本地文档\\\\\\"\\",\\"https://img.newzone.top/2022-05-06-12-43-36.png \\\\\\"飞书表格视图\\\\\\"\\",\\"https://img.newzone.top/2022-05-06-12-28-41.png \\\\\\"飞书画册视图\\\\\\"\\",\\"https://img.newzone.top/2022-05-30-20-03-19.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-06-07T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"博客探索","slug":"博客探索","link":"#博客探索","children":[]},{"level":2,"title":"博客方案","slug":"博客方案","link":"#博客方案","children":[]},{"level":2,"title":"WP 发布工具","slug":"wp-发布工具","link":"#wp-发布工具","children":[{"level":3,"title":"工具说明","slug":"工具说明","link":"#工具说明","children":[]},{"level":3,"title":"使用流程","slug":"使用流程","link":"#使用流程","children":[]}]},{"level":2,"title":"WP 发布常见问题","slug":"wp-发布常见问题","link":"#wp-发布常见问题","children":[{"level":3,"title":"文章发布不成功","slug":"文章发布不成功","link":"#文章发布不成功","children":[]},{"level":3,"title":"Error: git denied to github-actions[bot]","slug":"error-git-denied-to-github-actions-bot","link":"#error-git-denied-to-github-actions-bot","children":[]},{"level":3,"title":"Error: Process completed with exit code 1","slug":"error-process-completed-with-exit-code-1","link":"#error-process-completed-with-exit-code-1","children":[]},{"level":3,"title":"无法覆盖更新原文章 ​","slug":"无法覆盖更新原文章-​","link":"#无法覆盖更新原文章-​","children":[]},{"level":3,"title":"WordPress 发布时间与实际不符 ​","slug":"wordpress-发布时间与实际不符-​","link":"#wordpress-发布时间与实际不符-​","children":[]},{"level":3,"title":"有序列表编号有误","slug":"有序列表编号有误","link":"#有序列表编号有误","children":[]},{"level":3,"title":"无序列表只有一个层级","slug":"无序列表只有一个层级","link":"#无序列表只有一个层级","children":[]}]},{"level":2,"title":"本地管理 Markdown 文章","slug":"本地管理-markdown-文章","link":"#本地管理-markdown-文章","children":[{"level":3,"title":"飞书文档管理","slug":"飞书文档管理","link":"#飞书文档管理","children":[]},{"level":3,"title":"RunAny 文档直达 ​","slug":"runany-文档直达-​","link":"#runany-文档直达-​","children":[]},{"level":3,"title":"docsify 全文检索","slug":"docsify-全文检索","link":"#docsify-全文检索","children":[]}]},{"level":2,"title":"订阅管理:WordPress","slug":"订阅管理-wordpress","link":"#订阅管理-wordpress","children":[]},{"level":2,"title":"后续","slug":"后续","link":"#后续","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":12}]},"readingTime":{"minutes":9.37,"words":2812},"filePathRelative":"_posts/2022-06-07-blog_md_to_wordpress.md","localizedDate":"2022年6月7日","excerpt":"

    博客探索

    \\n

    2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​

    \\n

    2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录转变到知识整理输出。Jekyll 方案需要首先在本地用 Markdown 编辑排版,然后同步到 github 发布,最后以 Markdown 格式手动分发到各个渠道。当文章较少时,这套方案的体验感特别好。​

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-10f55743.8a6f98d4.js b/assets/js/2022-08-10-new_stuff_shaping_machine.html.7f87fb83.js similarity index 94% rename from assets/js/v-10f55743.8a6f98d4.js rename to assets/js/2022-08-10-new_stuff_shaping_machine.html.7f87fb83.js index e7f1ada56..8e1092ab9 100644 --- a/assets/js/v-10f55743.8a6f98d4.js +++ b/assets/js/2022-08-10-new_stuff_shaping_machine.html.7f87fb83.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1424],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},3756:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>c,data:()=>o});var i=a(3968);const r=[(0,i.IL)('

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    已闲置于墙角

    这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大腿外侧。

    之前我就想练飞鸟,不过龙门架实在太大,而这台机器折叠后只占 0.18 平,还能移动位置,完美匹配屋内使用的需求。虽然这是众筹产品,要等 2 个月,还是心动下单了。

    左侧为龙门架,右侧为塑形机

    等待收货时间内,体重继续上涨,总想着健身器材到了就瘦了。但是当收到货后,我终于理解了「什么叫做众筹」。

    锻炼时必须用身体抵住塑形机,否则机器会跟着你的动作滑走。虽然滑动的原因在于机器较轻,只有 60 KG,但我无法理解的是,厂家连基本的防滑措施也没有做,仿佛生产前从没人真的用过机器。防滑降噪脚垫在拖动时倒蛮好用的,拖起来特别丝滑,完全没有阻抗。为了避免塑形机不断滑走,我只能买了个阻门器,装上后就能避免机器乱滑动了。

    右下方是红色的阻门器,硬拉终于不会滑了

    解决滑动问题后,我打开塑形机官方视频,才发现其中 90% 的动作用不到塑形机,甚至是根本就扯不上关系。买之前,我看着详情页感觉动作特多功能特强,用过后,才发现「这就是所有的动作」。

    官方示例动作图

    不过,机器都收货了,动作少也得跟着练。可是,按照塑形机官方教程锻炼一组后,我的肩膀和手臂都被勒伤。原因是与身体接触的部分都是特粗尼龙绳,没有任何缓冲,一用力就容易勒伤。两千的机器连块 PU 皮都要省,可能是想让大家穿着特别严实来锻炼吧。

    钢板间隙过大,凳子要蛮力打开,锻炼视频无法暂停,APP 没有语音提示,视频教程无法切换动作,几乎机器到处都有问题,只能将原因归于众筹了,第一款模具真的是无语。

    当然,这款塑形机也是有好处的。传统龙门架使用铁块配重,重量最少也得上百公斤,而且占地大无法移动。塑形机采用磁力配重,重量只有 60KG,机器折叠后 0.18 平方,配上防滑降噪脚垫非常方便移动。

    塑形机确实能帮我练到平常少运动的肌肉,目前主要用它练背,等有了新玩具再出闲鱼。

    ',14)],n={},c=(0,a(9720).c)(n,[["render",function(e,t){return(0,i.Wz)(),(0,i.An)("div",null,r)}]]),o=JSON.parse('{"path":"/posts/2022-08-10-new_stuff_shaping_machine.html","title":"新玩意|智能可折叠综合塑形机","lang":"zh-CN","frontmatter":{"title":"新玩意|智能可折叠综合塑形机","date":"2022-08-10T00:00:00.000Z","category":["购物"],"tag":["健身器材"],"order":-0.01,"description":"家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。 已闲置于墙角 这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-08-10-new_stuff_shaping_machine.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"新玩意|智能可折叠综合塑形机"}],["meta",{"property":"og:description","content":"家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。 已闲置于墙角 这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://cdn.sspai.com/2022/08/09/article/74429ae5770ce6fe9b338527105a4744?imageView2/2/w/450/q/90/interlace/1/ignore-error/1 \\"已闲置于墙角\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-27T19:12:11.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"新玩意|智能可折叠综合塑形机"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"健身器材"}],["meta",{"property":"article:published_time","content":"2022-08-10T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-27T19:12:11.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"新玩意|智能可折叠综合塑形机\\",\\"image\\":[\\"https://cdn.sspai.com/2022/08/09/article/74429ae5770ce6fe9b338527105a4744?imageView2/2/w/450/q/90/interlace/1/ignore-error/1 \\\\\\"已闲置于墙角\\\\\\"\\",\\"https://cdn.sspai.com/2022/08/09/37a78274cca974e793582250954c75dc.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1 \\\\\\"左侧为龙门架,右侧为塑形机\\\\\\"\\",\\"https://cdn.sspai.com/2022/08/09/article/6d2731baacf4174c4b7465b11ba715fd?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1 \\\\\\"右下方是红色的阻门器,硬拉终于不会滑了\\\\\\"\\",\\"https://cdn.sspai.com/2022/08/09/article/db951607296d83ce9a0ff181d724de14?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1 \\\\\\"官方示例动作图\\\\\\"\\"],\\"datePublished\\":\\"2022-08-10T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-27T19:12:11.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1660319951000,"updatedTime":1698433931000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":2.83,"words":848},"filePathRelative":"_posts/2022-08-10-new_stuff_shaping_machine.md","localizedDate":"2022年8月10日","excerpt":"

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    \\n
    \\"\\"
    已闲置于墙角
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5496],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},9431:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>c});var i=a(7847);const r=[(0,i.Fv)('

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    已闲置于墙角

    这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大腿外侧。

    之前我就想练飞鸟,不过龙门架实在太大,而这台机器折叠后只占 0.18 平,还能移动位置,完美匹配屋内使用的需求。虽然这是众筹产品,要等 2 个月,还是心动下单了。

    左侧为龙门架,右侧为塑形机

    等待收货时间内,体重继续上涨,总想着健身器材到了就瘦了。但是当收到货后,我终于理解了「什么叫做众筹」。

    锻炼时必须用身体抵住塑形机,否则机器会跟着你的动作滑走。虽然滑动的原因在于机器较轻,只有 60 KG,但我无法理解的是,厂家连基本的防滑措施也没有做,仿佛生产前从没人真的用过机器。防滑降噪脚垫在拖动时倒蛮好用的,拖起来特别丝滑,完全没有阻抗。为了避免塑形机不断滑走,我只能买了个阻门器,装上后就能避免机器乱滑动了。

    右下方是红色的阻门器,硬拉终于不会滑了

    解决滑动问题后,我打开塑形机官方视频,才发现其中 90% 的动作用不到塑形机,甚至是根本就扯不上关系。买之前,我看着详情页感觉动作特多功能特强,用过后,才发现「这就是所有的动作」。

    官方示例动作图

    不过,机器都收货了,动作少也得跟着练。可是,按照塑形机官方教程锻炼一组后,我的肩膀和手臂都被勒伤。原因是与身体接触的部分都是特粗尼龙绳,没有任何缓冲,一用力就容易勒伤。两千的机器连块 PU 皮都要省,可能是想让大家穿着特别严实来锻炼吧。

    钢板间隙过大,凳子要蛮力打开,锻炼视频无法暂停,APP 没有语音提示,视频教程无法切换动作,几乎机器到处都有问题,只能将原因归于众筹了,第一款模具真的是无语。

    当然,这款塑形机也是有好处的。传统龙门架使用铁块配重,重量最少也得上百公斤,而且占地大无法移动。塑形机采用磁力配重,重量只有 60KG,机器折叠后 0.18 平方,配上防滑降噪脚垫非常方便移动。

    塑形机确实能帮我练到平常少运动的肌肉,目前主要用它练背,等有了新玩具再出闲鱼。

    ',14)],n={},o=(0,a(3671).A)(n,[["render",function(e,t){return(0,i.uX)(),(0,i.CE)("div",null,r)}]]),c=JSON.parse('{"path":"/posts/2022-08-10-new_stuff_shaping_machine.html","title":"新玩意|智能可折叠综合塑形机","lang":"zh-CN","frontmatter":{"title":"新玩意|智能可折叠综合塑形机","date":"2022-08-10T00:00:00.000Z","category":["购物"],"tag":["健身器材"],"order":-0.01,"description":"家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。 已闲置于墙角 这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-08-10-new_stuff_shaping_machine.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"新玩意|智能可折叠综合塑形机"}],["meta",{"property":"og:description","content":"家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。 已闲置于墙角 这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://cdn.sspai.com/2022/08/09/article/74429ae5770ce6fe9b338527105a4744?imageView2/2/w/450/q/90/interlace/1/ignore-error/1 \\"已闲置于墙角\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-27T19:12:11.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"新玩意|智能可折叠综合塑形机"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"健身器材"}],["meta",{"property":"article:published_time","content":"2022-08-10T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-27T19:12:11.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"新玩意|智能可折叠综合塑形机\\",\\"image\\":[\\"https://cdn.sspai.com/2022/08/09/article/74429ae5770ce6fe9b338527105a4744?imageView2/2/w/450/q/90/interlace/1/ignore-error/1 \\\\\\"已闲置于墙角\\\\\\"\\",\\"https://cdn.sspai.com/2022/08/09/37a78274cca974e793582250954c75dc.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1 \\\\\\"左侧为龙门架,右侧为塑形机\\\\\\"\\",\\"https://cdn.sspai.com/2022/08/09/article/6d2731baacf4174c4b7465b11ba715fd?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1 \\\\\\"右下方是红色的阻门器,硬拉终于不会滑了\\\\\\"\\",\\"https://cdn.sspai.com/2022/08/09/article/db951607296d83ce9a0ff181d724de14?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1 \\\\\\"官方示例动作图\\\\\\"\\"],\\"datePublished\\":\\"2022-08-10T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-27T19:12:11.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1660319951000,"updatedTime":1698433931000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":2.83,"words":848},"filePathRelative":"_posts/2022-08-10-new_stuff_shaping_machine.md","localizedDate":"2022年8月10日","excerpt":"

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    \\n
    \\"\\"
    已闲置于墙角
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a797e950.31feb1f6.js b/assets/js/2022-08-22-learndata_blog_to_knowledge_management.html.15f2d2b8.js similarity index 89% rename from assets/js/v-a797e950.31feb1f6.js rename to assets/js/2022-08-22-learndata_blog_to_knowledge_management.html.15f2d2b8.js index be90d708d..0adcf22b1 100644 --- a/assets/js/v-a797e950.31feb1f6.js +++ b/assets/js/2022-08-22-learndata_blog_to_knowledge_management.html.15f2d2b8.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7204],{9720:(e,a)=>{a.c=(e,a)=>{const n=e.__vccOpts||e;for(const[e,t]of a)n[e]=t;return n}},5594:(e,a,n)=>{n.r(a),n.d(a,{comp:()=>b,data:()=>D});var t=n(3968);const i=(0,t.QD)("p",null,[(0,t.mY)("知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。"),(0,t.QD)("strong",null,"笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。")],-1),o=(0,t.QD)("p",null,"这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。",-1),r=(0,t.QD)("p",null,[(0,t.mY)("另一方面,我们在使用知识管理软件的美观界面和强大功能的同时,也被这些软件所限制,无法完全按照自己的想法输出笔记。比如,你有了一双翅膀,"),(0,t.QD)("strong",null,"Markdown 文本是自由的天地,而进入 Notion 则被隔成一个个小房间"),(0,t.mY)(",你在房间里待着很舒服,可一旦想去其他房间,就必须脱离 block,不比 Markdown 可以自由飞翔。")],-1),l=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2022-08-22-18-02-07.png",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption",null,"Markdown VS Notion")],-1),p={href:"https://github.com/rockbenben/LearnData",target:"_blank",rel:"noopener noreferrer"},s={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},g=(0,t.IL)('
    笔记/博客自动化发布

    LearnData 的笔记和文章格式是 Markdown,输出不受到应用的局限。LearnData 看起来像由文章组成的博客,但它的笔记是独立的知识点,是所有知识的终点站,是整理后的知识库。通过 LearnData 可以搜索和整理知识,不再需要来回翻找。把博客转为知识库后,我明显感到学习和知识使用的效率得到提高,开始摆脱「工具奴隶」和「效率中毒」陷阱。

    笔记 + 文章 = LearnData 知识库

    为什么用网页管理笔记

    公开想法

    知识管理/笔记软件具有天然的私密性,不对外公开。但是,我的笔记大部分来自互联网,需要对谁保密?

    我非常赞同 Ray Dalio 在《原则》中提到的「头脑极度透明,公开分享想法」。

    让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    作为国内最早一批介绍 Aria2 的人,我曾经写过一篇 Aria2 教程。文章后来被多个网站参考/抄袭,覆盖了 Aria2 某度搜索前三页。在那篇文章的评论区,有好几条留言批评文章逻辑差看不懂的,经常有热心人帮我怼回去。其实,那篇文章的初版真的很糟糕。那篇文章是在大家的反馈下,迭代了三个版本才开始变得完整和逻辑化。这些反馈也是我坚持写博客的原动力。这跟费曼学习法的道理相通,当你写文章帮助其他人时,你也在加深自己对知识的理解。建立 LearnData 不到一个月,但我从中获取的正反馈已超过私有笔记一年的收获。笔记公开化是有百利而无一害。

    输出分享

    ',10),d={href:"https://newzone.top/family/Maintenance.html#%E9%80%9A%E9%A9%AC%E6%A1%B6",target:"_blank",rel:"noopener noreferrer"},c=(0,t.IL)('
    生活知识页面样例

    被动消化知识

    如果只是公开分享,LearnData 与笔记软件并无区别,它的优点更在于网页有限的笔记数量。虽然网页可以无限地存放笔记,但打开页面只能看到少量的几十篇内容。一旦笔记堆积过多,你就像触发了整理开关似的,对笔记开始消化重构。这就是网页容量上的无限性和视觉/直觉上的有限性,存储是无限但视觉上只能有很小的一块。这里的直觉指,看一眼界面就能找到所需知识点的效果。

    比如,当我的代码区块笔记存放超过 10 篇时,每次查找代码笔记都需要 10 选 1,知识查找时间也翻倍了。我意识到节点过多,不能让自己将时间花在查询上。因此,我将代码笔记分为 Basic 和 FrontEnd 两块,总结划分的同时,编程知识也再次得到消化。

    而网页与笔记软件的区别也正在于此,LearnData 的主页、侧边栏和导航栏就是能展示的路径,你必须不断对笔记提纯才能提高使用率。否则,如果你只是「积累」笔记而非消化知识,无论使用什么工具和方法,成效都是 0。

    漂亮决定生产力

    另外,网页可以自由调整外观样式,更换为你喜欢的界面。这也是为什么 LearnData 放弃了初版的 docsify 框架,改为复杂得多的 VuePress 框架。docsify 的官方模板太过简单,没有界面设计模块,难以满足知识管理界面必须直观漂亮的要求,而这一点直接决定了生产力,不能让步。

    知识管理/笔记软件将 Markdown 文件作为一个个区块,而网页可以将其视为一体。LearnData 支持多级侧边栏和目录,让阅读和查找变得更加简单。

    LearnData 页面布局

    为什么不用 Obsidian

    @北鸮 提到「脱离 Notion 可以理解,Markdown 很自由,那为啥不用 Obsidian 呢?也有标题,也有标签,也可以有层级,开源软件还有 Logseq 替代」。

    Obsidian 等双链笔记的设计初衷很好,可以让我们自由地在不同知识点间切换,节省搜索和关联的时间。但是,知识点的联系是靠人工打标签来建立的,而不是根据关键词自动建立图谱关系,这与 URL 链接有什么区别?因此,我认为双链笔记并不适合知识库(如果对双链笔记理解有误,欢迎纠正)。

    我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团

    建立知识点联系后,双链笔记可以轻松处理成千上万个文档,按条件整合文本,便于阅读。但是,大多数人常用的知识范围不会超过一百。如果你的个人笔记超过千篇,要么你是科研大佬,要么你没有消化这些笔记,只是在记笔记。

    除了博客,我只有 37 篇笔记,而且按功能划分为 7 个区块。你觉得这点文件,用树状管理方便,还是用双链笔记打一堆标签来得好?即使有时标题里找不到某个关键词,我也可以用全文搜索达到目的。我个人会倾向于简单方便的树状标题管理。

    抛弃知识软件 ≠ 不用

    选择 Markdown 就得卸载知识软件吗?

    抛弃知识软件并不是不用,而是将其视为知识的中转站。知识软件的趋势是 ALL IN ONE,记录全能成了标榜的主打功能。但是,光收集而不应用的知识等于零,只会增加你后续的使用成本。

    对我来说,知识软件是功能清晰的素材库。我会不断清空素材库,将小的知识点融入 LearnData 笔记区,成体系内容则写成博客,以确保 LearnData 成为知识库的终点。

    知识类素材库
    • Logseq 将信息节点化,能按日期整合文本,因此我用它来记录笔记,并定期生成周报和月报回顾。
    • 飞书文档自带侧边目录栏,对长文档优化很好,因此我用它记录工作心得,定期形成工作流程并在公司分享。
    • WonderPen 带多层级标题,当一点头绪方向都没有时,素材就可以直接放这里。
    • Notion 貌似全能,但其可替代性也最高,知识库迁移到 LearnData 后,Notion 仅用来存放涉及个人信息和不方便转移的旧文档。
    • Airtable 表格功能最强,虽然已经被其他软件赶上,但前期存储的大量数据仍然放在这里。
    • SuperMemo 与 Anki 功能类似,可以帮助定期复习需要重复记忆的知识点。

    而对于 Obsidian,我将其视为笔记的备份站。通过 GoodSync,LearnData 笔记发生修改后,相关更新会实时同步到 Obsidian,完成笔记的备份。期待有一天 Obsidian 完善双链功能,帮助笔记自动打上标签,到时备份笔记就能正式使用,我也能无缝切换到新的知识管理应用。

    如果你也想试试……

    如何把博客转换为知识库,建立属于你的 LearnData 知识管理网站?

    ',24),h={href:"https://newzone.top/#%F0%9F%94%A3-%E9%85%8D%E7%BD%AE-learndata",target:"_blank",rel:"noopener noreferrer"},m=(0,t.IL)('

    笔记结构可以参考我的分类。这没有绝对的界限,只要看到自己觉得有价值的知识点,都可以往 LearnData 里添加。但是,不要全文本地化收藏,简单提取用链接引用即可。除少量精品外,网络时代的文章隔几年就会失效,没必要收藏为一篇篇的笔记。当下次需要使用这个知识点时,再考虑整理事宜,否则,长时间用不到的知识,又有什么整理的价值呢。

    • 置顶:日常习惯、健身、阅读;
    • 代码:常用代码的学习和使用笔记;
    • 软件应用:常用应用、Chrome 扩展和相关教程;
    • 页面开发:页面插件和框架生成工具;
    • 网站部署:网站相关的工具和知识收集;
    • Linux 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
    • 系统问题:Windows 系统优化和相关问题;
    • 生活区:说明书、生活记录和小技巧;
    • 博客区:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

    最后

    两个月前,我在 WordPress 博客篇中喊着「md2wordpress 是最后一次博客方案」,但由于 WordPress 与 Markdown 各种不兼容,写完没多久就换到支持原生 Markdown 解析的 VuePress。

    这次我不想再立 Flag 了,只希望能放过自己。每进行一次知识迁移,真是大伤,休息一段时间吧。

    ',5),u={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},f={},b=(0,n(9720).c)(f,[["render",function(e,a){const n=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[i,o,r,l,(0,t.QD)("p",null,[(0,t.mY)("突破迷思后,我基于 VuePress 和 vuepress-theme-hope 建立了 "),(0,t.QD)("a",p,[(0,t.mY)("LearnData"),(0,t.K2)(n)]),(0,t.mY)(" 项目,将知识笔记、生活记录、博客和任何认为有价值的记录转换为 Markdown 文本,然后推送到 GitHub 生成 Pages 静态页面,并同步到国内云服务器,形成 "),(0,t.QD)("a",s,[(0,t.mY)("LearnData - 开源笔记"),(0,t.K2)(n)]),(0,t.mY)("。")]),g,(0,t.QD)("p",null,[(0,t.mY)("其次,网页形式使笔记更容易分享。除了效率工具的心得,我还在 LearnData 上放置了生活技巧、购物评价和说明书。当家人或朋友需要帮助时,可以直接访问网页,无需安装应用程序或折腾账户分享,比如我经常分享的"),(0,t.QD)("a",d,[(0,t.mY)("通马桶技巧"),(0,t.K2)(n)]),(0,t.mY)(" 和疏通器说明书。")]),c,(0,t.QD)("p",null,[(0,t.mY)("首先,确保你有 GitHub 账号,懂 Markdown 和基础 HTML 知识。然后,按照 "),(0,t.QD)("a",h,[(0,t.mY)("LearnData 部署教程"),(0,t.K2)(n)]),(0,t.mY)("完成搭建和配置。如果你的笔记已经用 Markdown 格式编写,只需把文档放在 docs 目录下,就可以建立自己的知识库。")]),m,(0,t.QD)("p",null,[(0,t.mY)("如果你有兴趣尝试 "),(0,t.QD)("a",u,[(0,t.mY)("LearnData"),(0,t.K2)(n)]),(0,t.mY)(",欢迎通过链接访问并复制模板尝试。具体的操作方法与常见问答我都写在博客中。如果有进一步的问题或讨论,欢迎在评论区留言。")])])}]]),D=JSON.parse('{"path":"/posts/2022-08-22-learndata_blog_to_knowledge_management.html","title":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库","lang":"zh-CN","frontmatter":{"title":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库","date":"2022-08-22T00:00:00.000Z","category":["博客","头脑驿站"],"tag":["VuePress","建站"],"order":-48,"description":"知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。 这么简单的事,我之前却一直没看透,总是把笔记与知识...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-08-22-learndata_blog_to_knowledge_management.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库"}],["meta",{"property":"og:description","content":"知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。 这么简单的事,我之前却一直没看透,总是把笔记与知识..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-08-22-18-02-07.png \\"Markdown VS Notion\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"VuePress"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2022-08-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃 Notion 知识管理软件的尝试:把博客变为知识库\\",\\"image\\":[\\"https://img.newzone.top/2022-08-22-18-02-07.png \\\\\\"Markdown VS Notion\\\\\\"\\",\\"https://img.newzone.top/2022-08-24-19-14-59.png \\\\\\"笔记/博客自动化发布\\\\\\"\\",\\"https://img.newzone.top/2022-08-22-19-28-25.png \\\\\\"笔记 + 文章 = LearnData 知识库\\\\\\"\\",\\"https://img.newzone.top/2022-08-19-22-52-29.png \\\\\\"生活知识页面样例\\\\\\"\\",\\"https://img.newzone.top/2022-08-19-22-42-03.png \\\\\\"LearnData 页面布局\\\\\\"\\",\\"https://img.newzone.top/2022-08-19-21-39-41.png?imageMogr2/thumbnail/500x \\\\\\"我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团\\\\\\"\\",\\"https://img.newzone.top/2022-08-21-21-38-47.png \\\\\\"知识类素材库\\\\\\"\\"],\\"datePublished\\":\\"2022-08-22T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么用网页管理笔记","slug":"为什么用网页管理笔记","link":"#为什么用网页管理笔记","children":[{"level":3,"title":"公开想法","slug":"公开想法","link":"#公开想法","children":[]},{"level":3,"title":"输出分享","slug":"输出分享","link":"#输出分享","children":[]},{"level":3,"title":"被动消化知识","slug":"被动消化知识","link":"#被动消化知识","children":[]},{"level":3,"title":"漂亮决定生产力","slug":"漂亮决定生产力","link":"#漂亮决定生产力","children":[]}]},{"level":2,"title":"为什么不用 Obsidian","slug":"为什么不用-obsidian","link":"#为什么不用-obsidian","children":[]},{"level":2,"title":"抛弃知识软件 ≠ 不用","slug":"抛弃知识软件-不用","link":"#抛弃知识软件-不用","children":[]},{"level":2,"title":"如果你也想试试……","slug":"如果你也想试试","link":"#如果你也想试试","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1661358617000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":10.14,"words":3043},"filePathRelative":"_posts/2022-08-22-learndata_blog_to_knowledge_management.md","localizedDate":"2022年8月22日","excerpt":"

    知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。

    \\n

    这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5845],{3671:(e,a)=>{a.A=(e,a)=>{const n=e.__vccOpts||e;for(const[e,t]of a)n[e]=t;return n}},2091:(e,a,n)=>{n.r(a),n.d(a,{comp:()=>f,data:()=>k});var t=n(7847);const i=(0,t.Lk)("p",null,[(0,t.eW)("知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。"),(0,t.Lk)("strong",null,"笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。")],-1),o=(0,t.Lk)("p",null,"这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。",-1),r=(0,t.Lk)("p",null,[(0,t.eW)("另一方面,我们在使用知识管理软件的美观界面和强大功能的同时,也被这些软件所限制,无法完全按照自己的想法输出笔记。比如,你有了一双翅膀,"),(0,t.Lk)("strong",null,"Markdown 文本是自由的天地,而进入 Notion 则被隔成一个个小房间"),(0,t.eW)(",你在房间里待着很舒服,可一旦想去其他房间,就必须脱离 block,不比 Markdown 可以自由飞翔。")],-1),l=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2022-08-22-18-02-07.png",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption",null,"Markdown VS Notion")],-1),p={href:"https://github.com/rockbenben/LearnData",target:"_blank",rel:"noopener noreferrer"},s={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},g=(0,t.Fv)('
    笔记/博客自动化发布

    LearnData 的笔记和文章格式是 Markdown,输出不受到应用的局限。LearnData 看起来像由文章组成的博客,但它的笔记是独立的知识点,是所有知识的终点站,是整理后的知识库。通过 LearnData 可以搜索和整理知识,不再需要来回翻找。把博客转为知识库后,我明显感到学习和知识使用的效率得到提高,开始摆脱「工具奴隶」和「效率中毒」陷阱。

    笔记 + 文章 = LearnData 知识库

    为什么用网页管理笔记

    公开想法

    知识管理/笔记软件具有天然的私密性,不对外公开。但是,我的笔记大部分来自互联网,需要对谁保密?

    我非常赞同 Ray Dalio 在《原则》中提到的「头脑极度透明,公开分享想法」。

    让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    作为国内最早一批介绍 Aria2 的人,我曾经写过一篇 Aria2 教程。文章后来被多个网站参考/抄袭,覆盖了 Aria2 某度搜索前三页。在那篇文章的评论区,有好几条留言批评文章逻辑差看不懂的,经常有热心人帮我怼回去。其实,那篇文章的初版真的很糟糕。那篇文章是在大家的反馈下,迭代了三个版本才开始变得完整和逻辑化。这些反馈也是我坚持写博客的原动力。这跟费曼学习法的道理相通,当你写文章帮助其他人时,你也在加深自己对知识的理解。建立 LearnData 不到一个月,但我从中获取的正反馈已超过私有笔记一年的收获。笔记公开化是有百利而无一害。

    输出分享

    ',10),d={href:"https://newzone.top/family/Maintenance.html#%E9%80%9A%E9%A9%AC%E6%A1%B6",target:"_blank",rel:"noopener noreferrer"},c=(0,t.Fv)('
    生活知识页面样例

    被动消化知识

    如果只是公开分享,LearnData 与笔记软件并无区别,它的优点更在于网页有限的笔记数量。虽然网页可以无限地存放笔记,但打开页面只能看到少量的几十篇内容。一旦笔记堆积过多,你就像触发了整理开关似的,对笔记开始消化重构。这就是网页容量上的无限性和视觉/直觉上的有限性,存储是无限但视觉上只能有很小的一块。这里的直觉指,看一眼界面就能找到所需知识点的效果。

    比如,当我的代码区块笔记存放超过 10 篇时,每次查找代码笔记都需要 10 选 1,知识查找时间也翻倍了。我意识到节点过多,不能让自己将时间花在查询上。因此,我将代码笔记分为 Basic 和 FrontEnd 两块,总结划分的同时,编程知识也再次得到消化。

    而网页与笔记软件的区别也正在于此,LearnData 的主页、侧边栏和导航栏就是能展示的路径,你必须不断对笔记提纯才能提高使用率。否则,如果你只是「积累」笔记而非消化知识,无论使用什么工具和方法,成效都是 0。

    漂亮决定生产力

    另外,网页可以自由调整外观样式,更换为你喜欢的界面。这也是为什么 LearnData 放弃了初版的 docsify 框架,改为复杂得多的 VuePress 框架。docsify 的官方模板太过简单,没有界面设计模块,难以满足知识管理界面必须直观漂亮的要求,而这一点直接决定了生产力,不能让步。

    知识管理/笔记软件将 Markdown 文件作为一个个区块,而网页可以将其视为一体。LearnData 支持多级侧边栏和目录,让阅读和查找变得更加简单。

    LearnData 页面布局

    为什么不用 Obsidian

    @北鸮 提到「脱离 Notion 可以理解,Markdown 很自由,那为啥不用 Obsidian 呢?也有标题,也有标签,也可以有层级,开源软件还有 Logseq 替代」。

    Obsidian 等双链笔记的设计初衷很好,可以让我们自由地在不同知识点间切换,节省搜索和关联的时间。但是,知识点的联系是靠人工打标签来建立的,而不是根据关键词自动建立图谱关系,这与 URL 链接有什么区别?因此,我认为双链笔记并不适合知识库(如果对双链笔记理解有误,欢迎纠正)。

    我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团

    建立知识点联系后,双链笔记可以轻松处理成千上万个文档,按条件整合文本,便于阅读。但是,大多数人常用的知识范围不会超过一百。如果你的个人笔记超过千篇,要么你是科研大佬,要么你没有消化这些笔记,只是在记笔记。

    除了博客,我只有 37 篇笔记,而且按功能划分为 7 个区块。你觉得这点文件,用树状管理方便,还是用双链笔记打一堆标签来得好?即使有时标题里找不到某个关键词,我也可以用全文搜索达到目的。我个人会倾向于简单方便的树状标题管理。

    抛弃知识软件 ≠ 不用

    选择 Markdown 就得卸载知识软件吗?

    抛弃知识软件并不是不用,而是将其视为知识的中转站。知识软件的趋势是 ALL IN ONE,记录全能成了标榜的主打功能。但是,光收集而不应用的知识等于零,只会增加你后续的使用成本。

    对我来说,知识软件是功能清晰的素材库。我会不断清空素材库,将小的知识点融入 LearnData 笔记区,成体系内容则写成博客,以确保 LearnData 成为知识库的终点。

    知识类素材库
    • Logseq 将信息节点化,能按日期整合文本,因此我用它来记录笔记,并定期生成周报和月报回顾。
    • 飞书文档自带侧边目录栏,对长文档优化很好,因此我用它记录工作心得,定期形成工作流程并在公司分享。
    • WonderPen 带多层级标题,当一点头绪方向都没有时,素材就可以直接放这里。
    • Notion 貌似全能,但其可替代性也最高,知识库迁移到 LearnData 后,Notion 仅用来存放涉及个人信息和不方便转移的旧文档。
    • Airtable 表格功能最强,虽然已经被其他软件赶上,但前期存储的大量数据仍然放在这里。
    • SuperMemo 与 Anki 功能类似,可以帮助定期复习需要重复记忆的知识点。

    而对于 Obsidian,我将其视为笔记的备份站。通过 GoodSync,LearnData 笔记发生修改后,相关更新会实时同步到 Obsidian,完成笔记的备份。期待有一天 Obsidian 完善双链功能,帮助笔记自动打上标签,到时备份笔记就能正式使用,我也能无缝切换到新的知识管理应用。

    如果你也想试试……

    如何把博客转换为知识库,建立属于你的 LearnData 知识管理网站?

    ',24),h={href:"https://newzone.top/#%F0%9F%94%A3-%E9%85%8D%E7%BD%AE-learndata",target:"_blank",rel:"noopener noreferrer"},m=(0,t.Fv)('

    笔记结构可以参考我的分类。这没有绝对的界限,只要看到自己觉得有价值的知识点,都可以往 LearnData 里添加。但是,不要全文本地化收藏,简单提取用链接引用即可。除少量精品外,网络时代的文章隔几年就会失效,没必要收藏为一篇篇的笔记。当下次需要使用这个知识点时,再考虑整理事宜,否则,长时间用不到的知识,又有什么整理的价值呢。

    • 置顶:日常习惯、健身、阅读;
    • 代码:常用代码的学习和使用笔记;
    • 软件应用:常用应用、Chrome 扩展和相关教程;
    • 页面开发:页面插件和框架生成工具;
    • 网站部署:网站相关的工具和知识收集;
    • Linux 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
    • 系统问题:Windows 系统优化和相关问题;
    • 生活区:说明书、生活记录和小技巧;
    • 博客区:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

    最后

    两个月前,我在 WordPress 博客篇中喊着「md2wordpress 是最后一次博客方案」,但由于 WordPress 与 Markdown 各种不兼容,写完没多久就换到支持原生 Markdown 解析的 VuePress。

    这次我不想再立 Flag 了,只希望能放过自己。每进行一次知识迁移,真是大伤,休息一段时间吧。

    ',5),u={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},b={},f=(0,n(3671).A)(b,[["render",function(e,a){const n=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[i,o,r,l,(0,t.Lk)("p",null,[(0,t.eW)("突破迷思后,我基于 VuePress 和 vuepress-theme-hope 建立了 "),(0,t.Lk)("a",p,[(0,t.eW)("LearnData"),(0,t.bF)(n)]),(0,t.eW)(" 项目,将知识笔记、生活记录、博客和任何认为有价值的记录转换为 Markdown 文本,然后推送到 GitHub 生成 Pages 静态页面,并同步到国内云服务器,形成 "),(0,t.Lk)("a",s,[(0,t.eW)("LearnData - 开源笔记"),(0,t.bF)(n)]),(0,t.eW)("。")]),g,(0,t.Lk)("p",null,[(0,t.eW)("其次,网页形式使笔记更容易分享。除了效率工具的心得,我还在 LearnData 上放置了生活技巧、购物评价和说明书。当家人或朋友需要帮助时,可以直接访问网页,无需安装应用程序或折腾账户分享,比如我经常分享的"),(0,t.Lk)("a",d,[(0,t.eW)("通马桶技巧"),(0,t.bF)(n)]),(0,t.eW)(" 和疏通器说明书。")]),c,(0,t.Lk)("p",null,[(0,t.eW)("首先,确保你有 GitHub 账号,懂 Markdown 和基础 HTML 知识。然后,按照 "),(0,t.Lk)("a",h,[(0,t.eW)("LearnData 部署教程"),(0,t.bF)(n)]),(0,t.eW)("完成搭建和配置。如果你的笔记已经用 Markdown 格式编写,只需把文档放在 docs 目录下,就可以建立自己的知识库。")]),m,(0,t.Lk)("p",null,[(0,t.eW)("如果你有兴趣尝试 "),(0,t.Lk)("a",u,[(0,t.eW)("LearnData"),(0,t.bF)(n)]),(0,t.eW)(",欢迎通过链接访问并复制模板尝试。具体的操作方法与常见问答我都写在博客中。如果有进一步的问题或讨论,欢迎在评论区留言。")])])}]]),k=JSON.parse('{"path":"/posts/2022-08-22-learndata_blog_to_knowledge_management.html","title":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库","lang":"zh-CN","frontmatter":{"title":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库","date":"2022-08-22T00:00:00.000Z","category":["博客","头脑驿站"],"tag":["VuePress","建站"],"order":-48,"description":"知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。 这么简单的事,我之前却一直没看透,总是把笔记与知识...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-08-22-learndata_blog_to_knowledge_management.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库"}],["meta",{"property":"og:description","content":"知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。 这么简单的事,我之前却一直没看透,总是把笔记与知识..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-08-22-18-02-07.png \\"Markdown VS Notion\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃 Notion 知识管理软件的尝试:把博客变为知识库"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"VuePress"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2022-08-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃 Notion 知识管理软件的尝试:把博客变为知识库\\",\\"image\\":[\\"https://img.newzone.top/2022-08-22-18-02-07.png \\\\\\"Markdown VS Notion\\\\\\"\\",\\"https://img.newzone.top/2022-08-24-19-14-59.png \\\\\\"笔记/博客自动化发布\\\\\\"\\",\\"https://img.newzone.top/2022-08-22-19-28-25.png \\\\\\"笔记 + 文章 = LearnData 知识库\\\\\\"\\",\\"https://img.newzone.top/2022-08-19-22-52-29.png \\\\\\"生活知识页面样例\\\\\\"\\",\\"https://img.newzone.top/2022-08-19-22-42-03.png \\\\\\"LearnData 页面布局\\\\\\"\\",\\"https://img.newzone.top/2022-08-19-21-39-41.png?imageMogr2/thumbnail/500x \\\\\\"我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团\\\\\\"\\",\\"https://img.newzone.top/2022-08-21-21-38-47.png \\\\\\"知识类素材库\\\\\\"\\"],\\"datePublished\\":\\"2022-08-22T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么用网页管理笔记","slug":"为什么用网页管理笔记","link":"#为什么用网页管理笔记","children":[{"level":3,"title":"公开想法","slug":"公开想法","link":"#公开想法","children":[]},{"level":3,"title":"输出分享","slug":"输出分享","link":"#输出分享","children":[]},{"level":3,"title":"被动消化知识","slug":"被动消化知识","link":"#被动消化知识","children":[]},{"level":3,"title":"漂亮决定生产力","slug":"漂亮决定生产力","link":"#漂亮决定生产力","children":[]}]},{"level":2,"title":"为什么不用 Obsidian","slug":"为什么不用-obsidian","link":"#为什么不用-obsidian","children":[]},{"level":2,"title":"抛弃知识软件 ≠ 不用","slug":"抛弃知识软件-不用","link":"#抛弃知识软件-不用","children":[]},{"level":2,"title":"如果你也想试试……","slug":"如果你也想试试","link":"#如果你也想试试","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1661358617000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":10.14,"words":3043},"filePathRelative":"_posts/2022-08-22-learndata_blog_to_knowledge_management.md","localizedDate":"2022年8月22日","excerpt":"

    知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。

    \\n

    这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2022-09-05-stable_diffusion_ai_painting.html.25652bff.js b/assets/js/2022-09-05-stable_diffusion_ai_painting.html.25652bff.js new file mode 100644 index 000000000..0781f11b7 --- /dev/null +++ b/assets/js/2022-09-05-stable_diffusion_ai_painting.html.25652bff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9836],{3671:(e,o)=>{o.A=(e,o)=>{const t=e.__vccOpts||e;for(const[e,a]of o)t[e]=a;return t}},9893:(e,o,t)=>{t.r(o),t.d(o,{comp:()=>ze,data:()=>Ce});var a=t(7847);const n=(0,a.Lk)("p",null,"我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。",-1),i=(0,a.Lk)("figure",null,[(0,a.Lk)("img",{src:"https://img.newzone.top/2022-09-04-11-53-20.png",alt:"",tabindex:"0",loading:"lazy"}),(0,a.Lk)("figcaption",null,"丁老头进化旅程")],-1),r=(0,a.Lk)("p",null,"Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用 Stable Diffusion,你可以在拥有 6GB 显存显卡,16GB 内存或只依赖 CPU 的电脑上生成图像,并且仅需几秒钟的时间,无需进行预处理或后处理。",-1),l={href:"https://huggingface.co/spaces/stabilityai/stable-diffusion",target:"_blank",rel:"noopener noreferrer"},s={href:"https://beta.dreamstudio.ai/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://wenxin.baidu.com/moduleApi/ernieVilg",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/AbdBarho/stable-diffusion-webui-docker",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/invoke-ai/InvokeAI/blob/main/docs/installation/INSTALL_MAC.md#doesnt-work-anymore",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.charl-e.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://sspai.com/post/75682",target:"_blank",rel:"noopener noreferrer"},h=(0,a.Fv)('
    Stable Diffusion 部署流程

    以 Windows 平台为例,本文将依次介绍 Docker 环境配置、Stable Diffusion 安装及基本使用方法。

    Docker 环境配置

    本方案基于 Docker 配置,Docker 实质上是在运行的 Linux 系统中创建了一个隔离的文件环境。因此,Docker 必须部署在基于 Linux 内核的系统上。[1] 对于 Mac 用户,无需特别配置即可使用。而对于 Windows 用户,若想部署 Docker,则需要安装一个虚拟 Linux 环境,配置 WSL 或启用 Hyper-V 二选一。我推荐使用 Windows 子系统 WSL,它需要占用系统盘 30G 的空间。

    安装 WSL

    在管理员 PowerShell 输入命令 wsl --install,之后终端会默认安装 Ubuntu。系统下载时间较长,注意别关机。[2] 安装 Ubuntu 完成后,按提示设置 Ubuntu 账户和密码。

    启用 Hyper-V

    以管理员身份打开 PowerShell 控制台,输入命令 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All[3] 重启电脑后,将开启 Hyper-V。

    Linux 路径(Windows)

    配置 WebUI Docker 要进入 Linux 环境,因此 Windows 用户需要将其路径转换为 Linux 路径。而 Mac 和 Linux 用户则可以忽略此步骤。

    假设容器位于 D:\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker

    1. 把磁盘符号改为小写,并去除磁盘的冒号,转换为 d\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker
    2. 添加 /mnt/ 前缀,转换为 /mnt/d\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker。因为 Windows 本地磁盘是挂载在 Linux 的 mnt 目录下的。
    3. 将反斜扛 \\ 替换为 /。最终得到 Linux 路径 /mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker

    配置 Stable Diffusion

    安装 Docker Desktop

    ',14),k={href:"https://docs.docker.com/get-docker/",target:"_blank",rel:"noopener noreferrer"},b=(0,a.Lk)("div",{class:"hint-container warning"},[(0,a.Lk)("p",{class:"hint-container-title"},"注意"),(0,a.Lk)("p",null,[(0,a.eW)("Docker Desktop 需在 4.18.0 或以上版本。Docker Desktop 4.17.1 存在 bug,可能会导致 "),(0,a.Lk)("code",null,"Attaching to webui-docker-auto-1"),(0,a.eW)(" 报错。")])],-1),g=(0,a.Lk)("h3",{id:"下载-webui-docker",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#下载-webui-docker"},[(0,a.Lk)("span",null,"下载 WebUI Docker")])],-1),m={href:"https://github.com/AbdBarho/stable-diffusion-webui-docker/releases/",target:"_blank",rel:"noopener noreferrer"},L={href:"https://www.aliyundrive.com/s/EKmK7MGrHdn",target:"_blank",rel:"noopener noreferrer"},w=(0,a.Lk)("h3",{id:"分支介绍",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#分支介绍"},[(0,a.Lk)("span",null,"分支介绍")])],-1),v=(0,a.Lk)("p",null,[(0,a.eW)("目前,Stable Diffusion Docker 支持 AUTOMATIC1111、InvokeAI、ComfyUI 三种分支。如果需要更换分支,可以修改镜像构建命令 "),(0,a.Lk)("code",null,"docker compose --profile [ui] up --build"),(0,a.eW)(" 中的 "),(0,a.Lk)("code",null,"[ui]"),(0,a.eW)(",将其替换为所需的镜像名即可。")],-1),D=(0,a.Lk)("strong",null,"auto",-1),x=(0,a.Lk)("code",null,"docker compose --profile auto up --build",-1),W=(0,a.Lk)("code",null,"--medvram",-1),S=(0,a.Lk)("code",null,"--lowvram",-1),y={href:"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs#running-inside-docker",target:"_blank",rel:"noopener noreferrer"},I=(0,a.Fv)("
  • auto-cpu:不依赖显卡的 auto 分支。如果没有符合要求的显卡,可以使用 CPU 模式,内存配置需满足 16G 以上,构建镜像的命令为 docker compose --profile auto-cpu up --build
  • comfy:基于图形的工作流 UI,非常强大,镜像构建命令为 docker compose --profile comfy up --build。comfy 也有不依赖显卡的分支,构建镜像的命令为 docker compose --profile comfy-cpu up --build
  • invoke:原名为 lstein,其 cli 端非常成熟,WebUI 端参数较少,能自动读取图片记录,适合无进阶需求的新手和 Mac 用户使用,镜像构建命令为 docker compose --profile invoke up --build。(最新版 invoke 构建有问题,配置包尚未修复)
  • sygil(已停更):即原本的 hlky, 界面直观,最高分辨率为 1024x1024,镜像构建命令为 docker compose --profile sygil up --build
  • ",4),A=(0,a.Fv)('

    构建 Stable Diffusion

    在启动 Docker Desktop 后,打开 WSL(Ubuntu)或 Mac 终端,输入路径切换命令 cd /mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker(路径为 Stable Diffusion WebUI Docker 解压文件目录)。接着,输入以下的部署命令:

    # 自动下载采样模型和依赖包\ndocker compose --profile download up --build\n# 上方命令需要 20 分钟或更长,完成后执行镜像构建命令\n\ndocker compose --profile auto up --build\n# auto 是功能最多的分支,可以选择 auto | auto-cpu | invoke | comfy | comfy-cpu\ndocker compose --profile auto-cpu up --build\ndocker compose --profile comfy up --build\ndocker compose --profile comfy-cpu up --build\ndocker compose --profile invoke up --build\n

    等待构建完成后,在终端中会提示访问 http://localhost:7860/,你就可以在本地电脑上用 AI 生成图片了。[4]

    使用说明

    以下示例以 auto 分支为例,其他分支的主题界面略有不同,但在功能上并没有根本性的差异。

    启动 Stable Diffusion

    1. 打开 Docker Desktop。
    2. 在 Containers 中选中分支容器,点击启动。
    3. 浏览器中访问 http://localhost:7860/
    Docker Desktop 界面

    Text-to-Image

    Text-to-Image(文生图)是 Stable Diffusion 依据文字描述来生成图像的方法。对于崇尚空间结构的画作类型,如风景、创意画等,推荐使用竖图或横图。对于人像类画作,推荐使用 1:1 的方形图像,否则可能会出现多个人脸叠加的情况。生成的图片分辨率受到一定限制,你可以使用 Upscale 对结果图片进行放大处理。

    Text-to-Image 界面

    默认情况下使用的是 Simple 简单模式。如果你想要使用更多的功能,你可以点击右侧的 Advanced 按钮,进入进阶选项。在进阶选项中,你可以使用场景矩阵、面部修复和分辨率放大等多种高级功能。

    Image-to-Image

    Image-to-Image(图生图)是依据文字描述和输入源图来生成相关图像。如果输入源图是 Text-to-Image、素描或结构画,该模式可充分填充图像细节。而如果输入源图是细节充分的照片,生成的结果与原图差异较大。此外,你还可以限定区域来生成图像,这非常适合进行图像修改。

    Image-to-Image 界面

    CLIP interrogator 会根据图像来生成文字描述。Denoising Strength 指与原图的差异度,建议设置在 0.75-0.9 之间。若要魔改图片,可将 Denoising Strength 设为 0.5 或以下。下图中的 Denoising Strength 只有 0.44,整体图片结构及要素未变,但结果如何,你看到了。

    超级魔改图片

    Image-to-Image 还可以用来移除、替换或修复图像,甚至可以将源图作为结果图的一部分,利用 Stable Diffusion 扩展绘画。高精度重绘的采样方法推荐 DPM++ 2S a karrars,并将采样迭代步数调整到 40 以上。

    Image Lab

    Image Lab 有批量修正面孔和放大图片分辨率的功能。

    Fix Faces 是通过 GFPGAN 模型来改善图片中的面孔,Effect strength 滑块可以控制效果的强度。但实际效果别报太高期许,下图右侧开启了 Fix Faces,只能说勉强有了五官。

    A woman flying in the air laughing

    Upscale 可以通过 RealESRGAN、GoBIG、Latent Diffusion Super Resolution 和 GoLatent 四种模型来放大图片分辨率。其中,RealESRGAN 有普通和卡通两种模式,你可以根据需要进行选择。放大图片主要消耗 CPU 和内存资源。

    参数解释

    Classifier Free Guidance

    Classifier Free Guidance (CFG) 的默认值为 7。数字越小,创作自由度越高,模型与 Prompt 相关性越低。CFG 参数不影响所需的 VRAM 或生成时间。

    • CFG 2-6:虽然有创意,但可能不符合提示。
    • CFG 7-10:这些提示适用于大多数情况,既富有创意又具有指导性。
    • CFG 10-15:当你确信 Prompt 足够好、足够具体时可以使用。
    • CFG 16-20:除非提示非常详细,否则不建议使用。这可能会影响连贯性和质量。

    Step

    Step(采样步长/精度)的默认值为 50。Stable Diffusion 通过充满噪音的画布开始创建图像,并逐步去噪以达到最终输出。Step 参数控制这些去噪步骤的数量。通常情况下,越高越好。对于初学者来说,建议使用默认值。Step 参数不影响所需的 VRAM,但 Step 数值的变化会与生成图像的时间成正比。

    Seed

    Seed(种子)的默认值为 -1,代表随机值。Seed 是控制初始噪声的数字,在其他参数固定的情况下,每次生成的图像都会不同,这就是种子的作用。如果你保持提示、种子和所有其他参数不变,你可以得到相同的结果。如果一个 Seed 生成了高质量图片,保存该 Seed 并将其应用到其他图片上,以保持高质量。

    Sampler

    Sampling method/Diffusion Sampler(扩散采样器)是用来在生成图像过程中对图像进行去噪的方法。由于不同的扩散采样器在计算图像下一步的方式不同,因此它们需要不同的持续时间和步骤来生成可用的图像。建议初学者使用 DDIM,因为它速度快,通常只需要 10 步就能生成好的图像,因此可以很容易和快速地进行试验和改进。

    文字描述图像

    Stable Diffusion 通过英文文字内容来描述场景或物体,以此来决定生成的图像中会出现什么。文字描述是决定图像生成质量的关键因素。[5]

    样例:A beautiful painting {画作种类} of a singular lighthouse, shining its light across a tumultuous sea of blood {画面描述} by greg rutkowski and thomas kinkade {画家/画风}, Trending on artstation {参考平台}, yellow color scheme {配色}[6]

    ',38),F={href:"https://prompt.newzone.top/",target:"_blank",rel:"noopener noreferrer"},_=(0,a.Fv)('

    常规描述

    1. 输入图像的对象、主体,比如一只熊猫、一个持剑的战士,不要描述动作、情绪和事件[7]
    2. 图像种类:一幅画(a painting of + raw prompt)还是一张照片(a photograph of + raw prompt),或者 Watercolor(水彩)、Oil Paint(油画)、Comic(漫画)、Digital Art(数码艺术)、Illustration(插画)、realistic painting(写实画)、photorealistic(写实照片)、Portrait photogram(肖像照)、Low Poly(低面建模)、3D Item Rende(三维渲染)、sculpture (雕塑) 等等,图像种类可以叠加。
    3. 画家/画风:建议混合多个画家的风格,比如 Studio Ghibli, Van Gogh, Monet,或描述风格种类,比如 very coherent symmetrical artwork,将作品结构设为「连贯且对称」。
    4. 色调:yellow color scheme 指整个画面的主色调为黄色。
    5. 参考平台:Trending on ArtStation,也可以替换为「Facebook」「Pixiv」「Pixbay」等。

    特征描述

    除画面主体外,可以用其他具象物体和形容词来填充画面细节。描述词要具体,讲出你要的物体和它的特征。

    • 次要元素:物体不要太多,两到三个就好。若要特别强调某个元素,可以加很多括号或者惊叹号,比如 beautiful forest background, desert!!, (((sunset))) 中会优先体现「desert」和「sunset」元素。
    • 人物特征:detailed gorgeous face, delicate features, elegant, Googly Eyes, Bone, big tits, silver hair, olive skin, Mini smile
    • 特定润色:insanely detailed and intricate, gorgeous, surrealism, smooth, sharp focus, Painting, Digital Art, Concept Art, Illustration, Artstation, in a symbolic and meaningful style, 8K
    • 光线描述:Natural Lighting, Studio Lighting, Cinematic Lighting, Crepuscular Rays, X-Ray, Backlight
    • 镜头视角:Cinematic, Magazine, Golden Hour, F/22, Depth of Field, Side-View,虚化背景 Bokeh
    • 画面质量:professional, award winning, breathtaking, groundbreaking, superb, outstanding,或虚幻引擎 Unreal Engine
    • 其他描述:细节和纹理、物体占据画面的大小、年代、渲染 / 建模工具等,比如 Vivid Colors(艳丽色彩)。

    prompt 权重

    假设你在提示词中使用了 mountain,生成的图像很可能会有树。但如果你想要生成没有树的山的图像,可以使用 mountain | tree:-10。其中 tree:-10 表示对于树的权重非常负,因此生成的图像中不会出现树。通过权重词,我们还能生成更复杂的图像,例如 A planet in space:10 | bursting with color red, blue, and purple:4 | aliens:-10 | 4K, high quality[8]

    Prompt 中的词语顺序代表其权重,越靠前权重越大。如若某物未出现在图像中,可以将该名词放在首位。

    否定提示

    auto/auto-cpu 分支中可以设置 Negative prompt(否定提示),以避免画面中出现指定元素。

    • 修正畸形:disfigured, deformed hands, blurry, grainy, broken, cross-eyed, undead, photoshopped, overexposed, underexposed, lowres, bad anatomy, bad hands, extra digits, fewer digits, bad digit, bad ears, bad eyes, bad face, cropped: -5
    • 避免裸体:nudity, bare breasts
    • 避免黑白照:black and white,monochrome

    prompt 参考

    除画面主体描述外,其他要素并非必须。如果你只是简单尝试,输入主体「apples」即可。

    ',13),G={href:"https://promptomania.com/stable-diffusion-prompt-builder/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://weirdwonderfulai.art/resources/disco-diffusion-modifiers/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://prompthero.com/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://openart.ai/",target:"_blank",rel:"noopener noreferrer"},C=(0,a.Lk)("blockquote",null,[(0,a.Lk)("p",null,"goddess close-up portrait skull with mohawk, ram skull, skeleton, thorax, x-ray, backbone, jellyfish phoenix head, nautilus, orchid, skull, betta fish, bioluminiscent creatures, intricate artwork by Tooth Wu and wlop and beeple, highly detailed, digital painting, Trending on artstation, very coherent symmetrical artwork, concept art, smooth, sharp focus, illustration, 8k")],-1),M=(0,a.Lk)("h2",{id:"prompt-matrix",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#prompt-matrix"},[(0,a.Lk)("span",null,"Prompt matrix")])],-1),R=(0,a.Lk)("sup",{class:"footnote-ref"},[(0,a.Lk)("a",{href:"#footnote9"},"[9]"),(0,a.Lk)("a",{class:"footnote-anchor",id:"footnote-ref9"})],-1),B={href:"https://github.com/HelixNGC7293/DeforumStableDiffusionLocal",target:"_blank",rel:"noopener noreferrer"},E=(0,a.Fv)('

    上方视频的调教词为 A mecha robot in World War II in realistic style|Shoot with another mecha robot|Bombed by planes|Missile drop|broken|Repaired|cinematic lighting| 符号后的场景条件将进行排列组合,视频样例有 6 个场景条件生成 64 张图。

    另外,我们可以指定场景条件位置,比如 @(moba|rpg|rts) character (2d|3d) model 表示 (moba|rpg|rts 三选一) character (2d|3d 二选一) model,也就是会生成 3*2 张图片。开头的 @ 是触发指定场景条件位置的符号,不能省略。

    Textual Inversion

    Textual Inversion(文本倒置)是 auto/auto-cpu 分支提供的功能,可以个人定制单词在模型中的含义。比如大众模型中医生多是白人男性,而我们可以输入 5 张亚洲女性照片并将其与 doctor 关联,经过 Textual Inversion 处理后的模型生成的医生形象将以亚洲女性为主。[10]

    Textual Inversion 定制流程:

    1. Preprocess images:设置源图目录和输出目录。
    2. Create embedding(新建嵌入):建立模型属性。
    3. 待续。

    常见问题

    Docker Desktop failed

    未正常安装/关闭 Docker 容器时,可能会报错 Docker Desktop failed to start/stop

    先删除 %AppData% 路径下的 Docker 文件夹,然后在 PowerShell 中输入下方命令,关闭 WSL 和 docker-desktop。最后,手动重启 Docker Desktop。

    wsl --shutdown\nwsl -l -v\nwsl --unregister docker-desktop\nwsl -l -v\n

    Docker Desktop cannot start

    Hardware assisted virtualization and data execution protection must be enabled in the BIOS 报错说明电脑没开启虚拟化。

    在开机的时候多按几次 F2DEL 进入 BIOS,然后设置中开启「Intel Virtual Technology」,AMD 则是将「SVM Support」设置为设置为「Enable」的状态;最后点击「F10」保存退出即可。

    docker 命令失败

    The command 'docker' could not be found 说明当前命令行确实 Docker 环境缺失,检查 Docker Desktop 是否启动。

    Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:7860 -> 0.0.0.0:0: listen tcp 0.0.0.0:7860: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 说明端口启用失败。Windows 可使用 net stop winnat 重置端口,Linux 则使用 sudo fuser -k 7860/tcp

    exited with code 137

    通常来说,exited with code 137 意味着内存不足,超出内存限制导致进程被关闭。建议硬件配置最低为 16G 内存,尤其是在使用 auto-cpu 模式时。

    端口访问被拒

    Docker 容器原本运行正常,端口访问突然被拒绝了,显示 Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:7860 -> 0.0.0.0:0: listen tcp 0.0.0.0:7860: bind: An attempt was made to access a socket in a way forbidden by its access permissions

    在 Powershell 中输入 netsh int ipv4 show excludedportrange protocol=tcp 检查是否处于被排除端口范围,然后输入 reg add HKLM\\SYSTEM\\CurrentControlSet\\Services\\hns\\State /v EnableExcludedPortRange /d 0 /f 开启端口。操作完成后,重启电脑即可解封端口。[11]

    FileNotFoundError

    再次架构容器时报错 FileNotFoundError: [Errno 2] No such file or directory: '/models/model.ckpt',这是架构位置错误导致的。此时,我们需要检查是否通过 WSL 输入的架构命令,并且 Stable Diffusion WebUI Docker 解压路径是否配置正确。

    采样模型

    采样模型是 AI 绘画的核心。2022.09.10 已支持自动下载采样模型,下方列表仅做参考。

    ',26),U={href:"https://www.googleapis.com/storage/v1/b/aai-blog-files/o/sd-v1-4.ckpt?alt=media",target:"_blank",rel:"noopener noreferrer"},N=(0,a.Lk)("code",null,"model.ckpt",-1),V={href:"https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth",target:"_blank",rel:"noopener noreferrer"},H={href:"https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.2.4/RealESRGAN_x4plus_anime_6B.pth",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://heibox.uni-heidelberg.de/f/578df07c8fc04ffbadf3/?dl=1",target:"_blank",rel:"noopener noreferrer"},K={href:"https://heibox.uni-heidelberg.de/f/31a76b13ea27482981b4/?dl=1",target:"_blank",rel:"noopener noreferrer"},q=(0,a.Lk)("code",null,"LDSR.ckpt",-1),j=(0,a.Lk)("code",null,"LDSR.yaml",-1),X=(0,a.Lk)("h2",{id:"最后",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#最后"},[(0,a.Lk)("span",null,"最后")])],-1),Y=(0,a.Lk)("p",null,"尽管 Stable Diffusion 目前还不能作为生产力工具,但它使设计变得更加简单,也为普通人开启了 AI 绘画的可能性。建议你亲自体验,实际部署一下,让自己拥有更多的可能性。",-1),J=(0,a.Lk)("hr",{class:"footnotes-sep"},null,-1),Q={class:"footnotes"},$={class:"footnotes-list"},ee={id:"footnote1",class:"footnote-item"},oe={href:"https://www.runoob.com/docker/windows-docker-install.html",target:"_blank",rel:"noopener noreferrer"},te=(0,a.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),ae={id:"footnote2",class:"footnote-item"},ne={href:"https://docs.microsoft.com/zh-cn/windows/wsl/install#install-wsl-command",target:"_blank",rel:"noopener noreferrer"},ie=(0,a.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),re={id:"footnote3",class:"footnote-item"},le={href:"https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v#enable-hyper-v-using-powershell",target:"_blank",rel:"noopener noreferrer"},se=(0,a.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),pe={id:"footnote4",class:"footnote-item"},ce={href:"https://github.com/AbdBarho/stable-diffusion-webui-docker/wiki/Setup",target:"_blank",rel:"noopener noreferrer"},de=(0,a.Lk)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),fe={id:"footnote5",class:"footnote-item"},ue={href:"https://openart.ai/promptbook",target:"_blank",rel:"noopener noreferrer"},he=(0,a.Lk)("a",{href:"#footnote-ref5",class:"footnote-backref"},"↩︎",-1),ke={id:"footnote6",class:"footnote-item"},be={href:"https://www.ifanr.com/app/1484403",target:"_blank",rel:"noopener noreferrer"},ge=(0,a.Lk)("a",{href:"#footnote-ref6",class:"footnote-backref"},"↩︎",-1),me={id:"footnote7",class:"footnote-item"},Le={href:"https://www.guokr.com/article/462587/",target:"_blank",rel:"noopener noreferrer"},we=(0,a.Lk)("a",{href:"#footnote-ref7",class:"footnote-backref"},"↩︎",-1),ve={id:"footnote8",class:"footnote-item"},De={href:"https://learnprompting.org/docs/Images/weighted_terms",target:"_blank",rel:"noopener noreferrer"},xe=(0,a.Lk)("a",{href:"#footnote-ref8",class:"footnote-backref"},"↩︎",-1),We={id:"footnote9",class:"footnote-item"},Se={href:"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#prompt-matrix",target:"_blank",rel:"noopener noreferrer"},ye=(0,a.Lk)("a",{href:"#footnote-ref9",class:"footnote-backref"},"↩︎",-1),Ie={id:"footnote10",class:"footnote-item"},Ae={href:"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion",target:"_blank",rel:"noopener noreferrer"},Fe=(0,a.Lk)("a",{href:"#footnote-ref10",class:"footnote-backref"},"↩︎",-1),_e={id:"footnote11",class:"footnote-item"},Ge={href:"https://github.com/docker/for-win/issues/3171#issuecomment-572571882",target:"_blank",rel:"noopener noreferrer"},Te=(0,a.Lk)("a",{href:"#footnote-ref11",class:"footnote-backref"},"↩︎",-1),Pe={},ze=(0,t(3671).A)(Pe,[["render",function(e,o){const t=(0,a.g2)("ExternalLinkIcon"),Pe=(0,a.g2)("BiliBili");return(0,a.uX)(),(0,a.CE)("div",null,[n,i,r,(0,a.Lk)("p",null,[(0,a.eW)("想要体验 AI 绘图,你可以使用在线工具 "),(0,a.Lk)("a",l,[(0,a.eW)("Hugging Face"),(0,a.bF)(t)]),(0,a.eW)("、"),(0,a.Lk)("a",s,[(0,a.eW)("DreamStudio"),(0,a.bF)(t)]),(0,a.eW)(" 或"),(0,a.Lk)("a",p,[(0,a.eW)("百度文心"),(0,a.bF)(t)]),(0,a.eW)("。但相对于本地部署来说,Hugging Face 需要排队,生成一张图约 5 分钟;DreamStudio 可以免费生成 200 张图片,之后需要缴费;百度文心能用中文生成图片,但仍处于 beta 阶段,未正式商用。此外,这些在线工具的图片调整功能比较有限,无法批量生成图片,只适用于测试和体验。")]),(0,a.Lk)("p",null,[(0,a.eW)("如果你需要生成大量的 AI 图片,可以通过 Docker Desktop 将 "),(0,a.Lk)("a",c,[(0,a.eW)("Stable Diffusion WebUI Docker"),(0,a.bF)(t)]),(0,a.eW)(" 部署到家用电脑上,从而实现免费的 AI 文字绘画,并摆脱在线工具的限制。对于 Mac 用户,推荐选择 Stable Diffusion 的 invoke 分支,如果在部署过程中出现错误,你可以参考 "),(0,a.Lk)("a",d,[(0,a.eW)("InvokeAI 文档"),(0,a.bF)(t)]),(0,a.eW)("进行排查。对于 M1/M2 Mac 用户,推荐使用更简便的 "),(0,a.Lk)("a",f,[(0,a.eW)("CHARL-E"),(0,a.bF)(t)]),(0,a.eW)(" 或 "),(0,a.Lk)("a",u,[(0,a.eW)("DiffusionBee"),(0,a.bF)(t)]),(0,a.eW)("。")]),h,(0,a.Lk)("p",null,[(0,a.eW)("按平台选 "),(0,a.Lk)("a",k,[(0,a.eW)("Docker Desktop"),(0,a.bF)(t)]),(0,a.eW)(" 版本,安装后点击左侧的 Add Extensions,推荐安装 Disk usage 扩展,这将便于管理 Docker 的存储空间。")]),b,g,(0,a.Lk)("p",null,[(0,a.eW)("下载 "),(0,a.Lk)("a",m,[(0,a.eW)("Stable Diffusion WebUI Docker 配置包"),(0,a.bF)(t)]),(0,a.eW)("或"),(0,a.Lk)("a",L,[(0,a.eW)("阿里云盘聚合版"),(0,a.bF)(t)]),(0,a.eW)("(2024.01.22 更新),然后将其解压到指定路径。聚合版包括相关依赖和模型,因此文件较大。如果需要更新 Stable Diffusion WebUI Docker,你可以按照上述步骤重新构建容器。")]),w,v,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[D,(0,a.eW)("(推荐):设置模块最丰富,显示绘画过程,支持随机插入艺术家、参数读取和否定描述,最高分辨率为 2048x2048(高分辨率对显存要求更高),镜像构建命令为 "),x,(0,a.eW)("。默认使用 6GB 以上的显存,如果你的显卡内存较低,则将配置中的 "),W,(0,a.eW)(" 改为 "),S,(0,a.eW)("。A 卡用户注意修改"),(0,a.Lk)("a",y,[(0,a.eW)("显卡设置"),(0,a.bF)(t)]),(0,a.eW)("。")]),I]),A,(0,a.Lk)("p",null,[(0,a.eW)("描述图像需要多种描述,因此我开发了一个开源工具 "),(0,a.Lk)("a",F,[(0,a.eW)("IMGPrompt"),(0,a.bF)(t)]),(0,a.eW)(",以便生成图像提示词。")]),_,(0,a.Lk)("p",null,[(0,a.eW)("如果你不知道生成什么图像,可以使用 "),(0,a.Lk)("a",G,[(0,a.eW)("promptoMANIA"),(0,a.bF)(t)]),(0,a.eW)(" 、"),(0,a.Lk)("a",T,[(0,a.eW)("WEIRD WONDERFUL AI ART"),(0,a.bF)(t)]),(0,a.eW)(" 按提示组合描述,或参考 AI 图库 "),(0,a.Lk)("a",P,[(0,a.eW)("PromptHero"),(0,a.bF)(t)]),(0,a.eW)(" 和 "),(0,a.Lk)("a",z,[(0,a.eW)("OpenArt"),(0,a.bF)(t)]),(0,a.eW)(" 上其他人分享的成品图和描述文案,比如")]),C,M,(0,a.Lk)("p",null,[(0,a.eW)("Prompt matrix 可以按不同条件组合生成多张相关但不同的画面,适合用于制作视频素材。"),R,(0,a.eW)(" 此时,批次数量的设置会被忽略。如果你对将图像转化为视频有兴趣,可以尝试使用 "),(0,a.Lk)("a",B,[(0,a.eW)("Deforum Stable Diffusion Local Version"),(0,a.bF)(t)]),(0,a.eW)("。")]),(0,a.bF)(Pe,{bvid:"BV1YP411V7vV"}),E,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("a",U,[(0,a.eW)("Stable Diffusion v1.4 (4GB)"),(0,a.bF)(t)]),(0,a.eW)(", 将压缩包文件重命名为 "),N,(0,a.eW)("。")]),(0,a.Lk)("li",null,[(0,a.eW)("(可选) "),(0,a.Lk)("a",V,[(0,a.eW)("GFPGANv1.4.pth (340MB)"),(0,a.bF)(t)]),(0,a.eW)("。")]),(0,a.Lk)("li",null,[(0,a.eW)("(可选) "),(0,a.Lk)("a",H,[(0,a.eW)("RealESRGAN_x4plus.pth (64MB)"),(0,a.bF)(t)]),(0,a.eW)(" 和 "),(0,a.Lk)("a",O,[(0,a.eW)("RealESRGAN_x4plus_anime_6B.pth (18MB)"),(0,a.bF)(t)]),(0,a.eW)("。")]),(0,a.Lk)("li",null,[(0,a.eW)("(可选) "),(0,a.Lk)("a",Z,[(0,a.eW)("LDSR (2GB)"),(0,a.bF)(t)]),(0,a.eW)(" 和 "),(0,a.Lk)("a",K,[(0,a.eW)("LDSR 配置"),(0,a.bF)(t)]),(0,a.eW)(",分别重命名为 "),q,(0,a.eW)(" 和 "),j,(0,a.eW)("。")])]),X,Y,J,(0,a.Lk)("section",Q,[(0,a.Lk)("ol",$,[(0,a.Lk)("li",ee,[(0,a.Lk)("p",null,[(0,a.Lk)("a",oe,[(0,a.eW)("Windows Docker 安装"),(0,a.bF)(t)]),(0,a.eW)(),te])]),(0,a.Lk)("li",ae,[(0,a.Lk)("p",null,[(0,a.Lk)("a",ne,[(0,a.eW)("使用 WSL 在 Windows 上安装 Linux"),(0,a.bF)(t)]),(0,a.eW)(),ie])]),(0,a.Lk)("li",re,[(0,a.Lk)("p",null,[(0,a.Lk)("a",le,[(0,a.eW)("在 Windows 10 上安装 Hyper-V"),(0,a.bF)(t)]),(0,a.eW)(),se])]),(0,a.Lk)("li",pe,[(0,a.Lk)("p",null,[(0,a.Lk)("a",ce,[(0,a.eW)("Setup Stable Diffusion WebUI Docker"),(0,a.bF)(t)]),(0,a.eW)(),de])]),(0,a.Lk)("li",fe,[(0,a.Lk)("p",null,[(0,a.Lk)("a",ue,[(0,a.eW)("Stable Diffusion Prompt Book - OpenArt"),(0,a.bF)(t)]),(0,a.eW)(),he])]),(0,a.Lk)("li",ke,[(0,a.Lk)("p",null,[(0,a.Lk)("a",be,[(0,a.eW)("外网爆火的 4 款「你说我画」自动作画工具,我们测了下,有 1 款的确超强"),(0,a.bF)(t)]),(0,a.eW)(),ge])]),(0,a.Lk)("li",me,[(0,a.Lk)("p",null,[(0,a.Lk)("a",Le,[(0,a.eW)("最时髦的 AI 画画,一文包教包会"),(0,a.bF)(t)]),(0,a.eW)(),we])]),(0,a.Lk)("li",ve,[(0,a.Lk)("p",null,[(0,a.Lk)("a",De,[(0,a.eW)("Learn Prompting: Weighted Terms"),(0,a.bF)(t)]),(0,a.eW)(),xe])]),(0,a.Lk)("li",We,[(0,a.Lk)("p",null,[(0,a.Lk)("a",Se,[(0,a.eW)("stable-diffusion Prompt matrix"),(0,a.bF)(t)]),(0,a.eW)(),ye])]),(0,a.Lk)("li",Ie,[(0,a.Lk)("p",null,[(0,a.Lk)("a",Ae,[(0,a.eW)("Textual Inversion"),(0,a.bF)(t)]),(0,a.eW)(),Fe])]),(0,a.Lk)("li",_e,[(0,a.Lk)("p",null,[(0,a.Lk)("a",Ge,[(0,a.eW)("Windows 端口访问被拒"),(0,a.bF)(t)]),(0,a.eW)(),Te])])])])])}]]),Ce=JSON.parse('{"path":"/posts/2022-09-05-stable_diffusion_ai_painting.html","title":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑","lang":"zh-CN","frontmatter":{"title":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑","date":"2022-09-05T00:00:00.000Z","category":["工具"],"tag":["AI","Docker","Stable Diffusion"],"order":-49,"description":"我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。 丁老头进化旅程 Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑"}],["meta",{"property":"og:description","content":"我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。 丁老头进化旅程 Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-09-04-11-53-20.png \\"丁老头进化旅程\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"Docker"}],["meta",{"property":"article:tag","content":"Stable Diffusion"}],["meta",{"property":"article:published_time","content":"2022-09-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑\\",\\"image\\":[\\"https://img.newzone.top/2022-09-04-11-53-20.png \\\\\\"丁老头进化旅程\\\\\\"\\",\\"https://img.newzone.top/2022-09-05-16-22-45.png \\\\\\"Stable Diffusion 部署流程\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-18-32-31.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-09-04-17-06-27.png \\\\\\"Docker Desktop 界面\\\\\\"\\",\\"https://img.newzone.top/2022-09-05-08-28-23.png \\\\\\"Text-to-Image 界面\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-15-39-00.png \\\\\\"Image-to-Image 界面\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-15-40-26.png \\\\\\"超级魔改图片\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-15-47-14.png \\\\\\"A woman flying in the air laughing\\\\\\"\\",\\"https://img.newzone.top/2022-09-16-22-33-26.png \\\\\\"相同参数下,不同平台生成的图片\\\\\\"\\"],\\"datePublished\\":\\"2022-09-05T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-29T12:26:51.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"Docker 环境配置","slug":"docker-环境配置","link":"#docker-环境配置","children":[{"level":3,"title":"安装 WSL","slug":"安装-wsl","link":"#安装-wsl","children":[]},{"level":3,"title":"启用 Hyper-V","slug":"启用-hyper-v","link":"#启用-hyper-v","children":[]},{"level":3,"title":"Linux 路径(Windows)","slug":"linux-路径-windows","link":"#linux-路径-windows","children":[]}]},{"level":2,"title":"配置 Stable Diffusion","slug":"配置-stable-diffusion","link":"#配置-stable-diffusion","children":[{"level":3,"title":"安装 Docker Desktop","slug":"安装-docker-desktop","link":"#安装-docker-desktop","children":[]},{"level":3,"title":"下载 WebUI Docker","slug":"下载-webui-docker","link":"#下载-webui-docker","children":[]},{"level":3,"title":"分支介绍","slug":"分支介绍","link":"#分支介绍","children":[]},{"level":3,"title":"构建 Stable Diffusion","slug":"构建-stable-diffusion","link":"#构建-stable-diffusion","children":[]}]},{"level":2,"title":"使用说明","slug":"使用说明","link":"#使用说明","children":[{"level":3,"title":"启动 Stable Diffusion","slug":"启动-stable-diffusion","link":"#启动-stable-diffusion","children":[]},{"level":3,"title":"Text-to-Image","slug":"text-to-image","link":"#text-to-image","children":[]},{"level":3,"title":"Image-to-Image","slug":"image-to-image","link":"#image-to-image","children":[]},{"level":3,"title":"Image Lab","slug":"image-lab","link":"#image-lab","children":[]}]},{"level":2,"title":"参数解释","slug":"参数解释","link":"#参数解释","children":[{"level":3,"title":"Classifier Free Guidance","slug":"classifier-free-guidance","link":"#classifier-free-guidance","children":[]},{"level":3,"title":"Step","slug":"step","link":"#step","children":[]},{"level":3,"title":"Seed","slug":"seed","link":"#seed","children":[]},{"level":3,"title":"Sampler","slug":"sampler","link":"#sampler","children":[]}]},{"level":2,"title":"文字描述图像","slug":"文字描述图像","link":"#文字描述图像","children":[{"level":3,"title":"常规描述","slug":"常规描述","link":"#常规描述","children":[]},{"level":3,"title":"特征描述","slug":"特征描述","link":"#特征描述","children":[]},{"level":3,"title":"prompt 权重","slug":"prompt-权重","link":"#prompt-权重","children":[]},{"level":3,"title":"否定提示","slug":"否定提示","link":"#否定提示","children":[]},{"level":3,"title":"prompt 参考","slug":"prompt-参考","link":"#prompt-参考","children":[]}]},{"level":2,"title":"Prompt matrix","slug":"prompt-matrix","link":"#prompt-matrix","children":[]},{"level":2,"title":"Textual Inversion","slug":"textual-inversion","link":"#textual-inversion","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"Docker Desktop failed","slug":"docker-desktop-failed","link":"#docker-desktop-failed","children":[]},{"level":3,"title":"Docker Desktop cannot start","slug":"docker-desktop-cannot-start","link":"#docker-desktop-cannot-start","children":[]},{"level":3,"title":"docker 命令失败","slug":"docker-命令失败","link":"#docker-命令失败","children":[]},{"level":3,"title":"exited with code 137","slug":"exited-with-code-137","link":"#exited-with-code-137","children":[]},{"level":3,"title":"端口访问被拒","slug":"端口访问被拒","link":"#端口访问被拒","children":[]},{"level":3,"title":"FileNotFoundError","slug":"filenotfounderror","link":"#filenotfounderror","children":[]},{"level":3,"title":"采样模型","slug":"采样模型","link":"#采样模型","children":[]}]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1662386371000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":41}]},"readingTime":{"minutes":16.76,"words":5027},"filePathRelative":"_posts/2022-09-05-stable_diffusion_ai_painting.md","localizedDate":"2022年9月5日","excerpt":"

    我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。

    \\n
    \\"\\"
    丁老头进化旅程
    \\n

    Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用 Stable Diffusion,你可以在拥有 6GB 显存显卡,16GB 内存或只依赖 CPU 的电脑上生成图像,并且仅需几秒钟的时间,无需进行预处理或后处理。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2022-09-07-extreme_branding_thinking_with_mate50.html.ddc4bf18.js b/assets/js/2022-09-07-extreme_branding_thinking_with_mate50.html.ddc4bf18.js new file mode 100644 index 000000000..18e86bde2 --- /dev/null +++ b/assets/js/2022-09-07-extreme_branding_thinking_with_mate50.html.ddc4bf18.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5048],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,a]of t)n[e]=a;return n}},2293:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>o,data:()=>r});var a=n(7847);const i=[(0,a.Fv)('

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    个人观察

    我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这款手机的好感直接 -1

    当然,华为发布会上从没说过「没电也能打电话」,官方说法是「在 1% 低电量下智能启动聚能泵,待机可达三小时或者通话 12 分钟,或亮码 10 次,或扫码 4 次。」这个应急功能实际上是不错的,能缓解充电焦虑。历过数次 2% 直接关机后,我很喜欢这种关机前再榨一把的充电技术。

    有种黑的说法是,「只是把电池低电量保护分级罢了,比如,低电量 15% 电池进入保护,那么,后台只需将 85% 的电量重新显示为 100%,即手机显示的 1% 绝不是真实的 1%,小技俩而已。」

    而我对这种想法是不信的,如果真是这样的套壳宣传,随便检测都能发现,对于华为来说完全是得不偿失。

    华为需要极端宣传吗?

    「走极端才能创造话题」是品牌成功和营销的第一步,但这只是第一步。

    在美国打压下,华为已经是民族主义的顶流了,正常宣传就能拥有一大堆的拥趸,不必每天打鸡血造话题,更不需要用震惊体来吸引流量。

    那为什么华为依然用「没电也能打电话」这类极端的宣传方式?

    我猜测是被自媒体绑架了。

    除打包合作外,媒体宣传费用是建立在播放、阅读、互动的基础上。即使是固定价格的打包合作,这次的流量也会决定是否有下次的合作。因此,对自媒体来说,它不在乎观众对品牌的观感是否被消耗,它在乎的是流量,是互动。即使有黑子,那也是互动啊。有了互动,平台会持续给宣传载体进行加权并推流,自媒体的议价能力也持续提高。

    宣传流量图

    华为总被嘲笑有海军,可能有它自身的原因,但这些极端化媒体的绑架也少不了。

    过多的极端宣传,舆论引起的反噬会远超你获得的利益。不是每个人都会仔细查看你的宣传稿,看到上百篇高级写着华为「没电也能打电话」,真有人会以为你有什么黑科技了。

    手机行业的底线

    原本以为只是华为这样,但 @Dean 提供了另一个梗「iPhone 没电也能刷公交卡」,理由是门禁卡等 NFC 设备没电也能使用。这个梗从 2018 开始每年都要吹一波,门禁卡没电,那么黑科技加持的 iPhone 没电自然也能刷公交卡。这乍听蛮像一回事的,网上也有一堆人相信,但苹果官方文档直接打脸,「即使您的 iPhone 需要充电,您或许也能够在设备上使用“快捷模式”卡片、凭证和钥匙。如果将 iPhone 关机,这项功能将不可用。」

    可能事实就像 @VirtualProsperity 和 @弘隐 说的一样,「作为前手机行业营销从业者,很负责的说,几乎任何手机品牌不会被媒体绑架。因为营销的时候媒体只是其中一个环节,但绝非重要到要为媒体去绑架的程度」,「手机行业的营销很多时候是很 LOW 的 LOW 到你不敢想象是真的」。

    我也身处广告行业,面对的甲方多为快消品。快消品购买频次高,因此品牌方把品牌商誉和防黑放在首位,而手机更换需要 1-3 年,等到下次购买顾客已经遗忘了前几年的极端宣传。或许手机品牌正因为这点而肆意妄为,一切宣传以传播效果为先,以眼前销量为主。一次两次还行,多次之后你还会上当?还会购买这类品牌?我不会。然而,手机行业的想法可能真的不一样,底线有点低。

    最后

    如果你是刚起家的自媒体和品牌,尽管去用走极端的宣传方式,毕竟营销不是道德审判,活下去才是第一步。

    但如果你已经有一定的知名度了,请先想清楚,你真的需要「走极端」的垃圾流量吗?真的要赌互联网记忆?

    ',23)],p={},o=(0,n(3671).A)(p,[["render",function(e,t){return(0,a.uX)(),(0,a.CE)("div",null,i)}]]),r=JSON.parse('{"path":"/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","title":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?","lang":"zh-CN","frontmatter":{"title":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?","date":"2022-09-07T00:00:00.000Z","category":["观察随笔"],"tag":["媒体"],"order":-0.02,"description":"华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费? 个人观察 我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-09-07-extreme_branding_thinking_with_mate50.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?"}],["meta",{"property":"og:description","content":"华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费? 个人观察 我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-09-07-11-29-53.png?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-27T19:12:11.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"媒体"}],["meta",{"property":"article:published_time","content":"2022-09-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-27T19:12:11.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?\\",\\"image\\":[\\"https://img.newzone.top/2022-09-07-11-29-53.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-09-07-13-24-33.png \\\\\\"宣传流量图\\\\\\"\\"],\\"datePublished\\":\\"2022-09-07T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-27T19:12:11.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"个人观察","slug":"个人观察","link":"#个人观察","children":[]},{"level":2,"title":"华为需要极端宣传吗?","slug":"华为需要极端宣传吗","link":"#华为需要极端宣传吗","children":[]},{"level":2,"title":"手机行业的底线","slug":"手机行业的底线","link":"#手机行业的底线","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1662528297000,"updatedTime":1698433931000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":4.4,"words":1319},"filePathRelative":"_posts/2022-09-07-extreme_branding_thinking_with_mate50.md","localizedDate":"2022年9月7日","excerpt":"

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    \\n
    \\"\\"
    \\n

    个人观察

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2022-11-03-ffmpeg_screen_recording.html.4fbc2c48.js b/assets/js/2022-11-03-ffmpeg_screen_recording.html.4fbc2c48.js new file mode 100644 index 000000000..94722f674 --- /dev/null +++ b/assets/js/2022-11-03-ffmpeg_screen_recording.html.4fbc2c48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8356],{3671:(e,o)=>{o.A=(e,o)=>{const t=e.__vccOpts||e;for(const[e,r]of o)t[e]=r;return t}},1629:(e,o,t)=>{t.r(o),t.d(o,{comp:()=>se,data:()=>fe});var r=t(7847);const n=(0,r.Lk)("blockquote",null,[(0,r.Lk)("p",null,"当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。")],-1),a={href:"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},l={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/MathewSachin/Captura/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"},s=(0,r.Lk)("p",null,"免费的不行,那么收费的会不会好点呢?",-1),f={href:"https://www.bandicam.cn/",target:"_blank",rel:"noopener noreferrer"},c=(0,r.Lk)("p",null,"再后,我测试了其他几款录屏应用:",-1),d=(0,r.Lk)("li",null,"相机:Windows 自带应用,录制方便,但输出选项较少,限制多。",-1),g={href:"https://www.flashbackrecorder.com/zh/express/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://mirillis.com/zh/products/action.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://ohsoft.net/eng/ocam/intro.php?cate=1002",target:"_blank",rel:"noopener noreferrer"},u={href:"https://getsharex.com/",target:"_blank",rel:"noopener noreferrer"},k=(0,r.Fv)('

    我一共试了 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),b={href:"https://github.com/BtbN/FFmpeg-Builds/releases/tag/latest",target:"_blank",rel:"noopener noreferrer"},F=(0,r.Lk)("code",null,"ffmpeg-master-latest-win64-gpl.zip",-1),L=(0,r.Fv)('
  • 将 FFmpeg 解压到任意文件夹,比如 D:\\Backup\\Libraries\\Documents\\ffmpeg

  • 开始栏搜索「编辑系统环境变量」,点击进入「环境变量」。

  • 新建用户变量 FFMPEG_HOME,变量值设为刚才的解压路径 D:\\Backup\\Libraries\\Documents\\ffmpeg

    FFmpeg 全局变量设置
  • ',3),_=(0,r.Lk)("p",null,"配置完成后,在终端输入 ffmpeg 即可启动。",-1),W=(0,r.Lk)("figure",null,[(0,r.Lk)("img",{src:"https://img.newzone.top/2022-11-01-18-17-13.png",alt:"",tabindex:"0",loading:"lazy"}),(0,r.Lk)("figcaption",null,"FFmpeg 配置成功")],-1),v=(0,r.Lk)("h3",{id:"配置视频-音频设备",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#配置视频-音频设备"},[(0,r.Lk)("span",null,"配置视频/音频设备")])],-1),w={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases",target:"_blank",rel:"noopener noreferrer"},x=(0,r.Fv)('

    通过命令 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),y=(0,r.Lk)("code",null,"-f gdigrab",-1),C={href:"https://ffmpeg.org/ffmpeg-all.html#gdigrab",target:"_blank",rel:"noopener noreferrer"},z={href:"https://ffmpeg.org/ffmpeg-devices.html#avfoundation",target:"_blank",rel:"noopener noreferrer"},A={href:"https://ffmpeg.org/ffmpeg-all.html#x11grab",target:"_blank",rel:"noopener noreferrer"},S=(0,r.Fv)('
  • -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
  • ',7),B=(0,r.Fv)('

    除上方命令外,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),D=(0,r.Lk)("code",null,"real-time buffer [xxxxxx] [video input] too full or near too full (181% of size: 3041280 [rtbufsize parameter])! frame dropped!",-1),M={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/issues/136",target:"_blank",rel:"noopener noreferrer"},P=(0,r.Fv)('

    摄像头分辨率错误

    如果摄像头画面出现裁切,分辨率与预期不同,可以检查摄像头录制属性和摄像头应用输出分辨率。例如,部分版本的 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),E={href:"https://ffmpeg.guide/",target:"_blank",rel:"noopener noreferrer"},T=(0,r.Lk)("p",null,"当然,本文的目的是分享我监控自己的延伸,分享使用 FFmpeg 录屏的入门方法,而非完全掌握,因此只介绍了录屏相关的核心命令。如果有需要,还是推荐研究一下官方文档,或者跟着我做的试一试,说不定就有新收获。",-1),O={href:"https://sspai.com/post/76637",target:"_blank",rel:"noopener noreferrer"},R=(0,r.Lk)("hr",{class:"footnotes-sep"},null,-1),q={class:"footnotes"},U={class:"footnotes-list"},H={id:"footnote1",class:"footnote-item"},Z={href:"https://blog.csdn.net/m0_60352504/article/details/126762161",target:"_blank",rel:"noopener noreferrer"},V=(0,r.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),N={id:"footnote2",class:"footnote-item"},j={href:"https://blog.csdn.net/JineD/article/details/123057086",target:"_blank",rel:"noopener noreferrer"},G=(0,r.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),I={id:"footnote3",class:"footnote-item"},J={href:"https://ffmpeg.org/ffmpeg-codecs.html#libx265",target:"_blank",rel:"noopener noreferrer"},X=(0,r.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),Y={id:"footnote4",class:"footnote-item"},K={href:"https://magiclen.org/x265-preset/",target:"_blank",rel:"noopener noreferrer"},Q=(0,r.Lk)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),$={id:"footnote5",class:"footnote-item"},ee={href:"https://blog.csdn.net/zhying719/article/details/123059209",target:"_blank",rel:"noopener noreferrer"},oe=(0,r.Lk)("a",{href:"#footnote-ref5",class:"footnote-backref"},"↩︎",-1),te={id:"footnote6",class:"footnote-item"},re={href:"https://www.cnblogs.com/leisure_chn/p/10434209.html",target:"_blank",rel:"noopener noreferrer"},ne=(0,r.Lk)("a",{href:"#footnote-ref6",class:"footnote-backref"},"↩︎",-1),ae={id:"footnote7",class:"footnote-item"},le={href:"https://blog.csdn.net/guanyijun123/article/details/121270650",target:"_blank",rel:"noopener noreferrer"},pe=(0,r.Lk)("a",{href:"#footnote-ref7",class:"footnote-backref"},"↩︎",-1),ie={},se=(0,t(3671).A)(ie,[["render",function(e,o){const t=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[n,(0,r.Lk)("p",null,[(0,r.eW)("开始"),(0,r.Lk)("a",a,[(0,r.eW)("自我监控"),(0,r.bF)(t)]),(0,r.eW)("后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。")]),(0,r.Lk)("p",null,[(0,r.eW)("最初,我使用了免费开源的 "),(0,r.Lk)("a",l,[(0,r.eW)("VLC"),(0,r.bF)(t)]),(0,r.eW)(",这也是我监控文章中采用的方案。它能调节输出视频的编码、帧率、格式,但操作麻烦,而且不能同时录屏和摄像头,暂停录制也容易导致程序崩溃。")]),(0,r.Lk)("p",null,[(0,r.eW)("然后,我尝试了 "),(0,r.Lk)("a",p,[(0,r.eW)("OBS"),(0,r.bF)(t)]),(0,r.eW)(",它的录制功能极其强大,可以任意添加摄像头、文字、图像等,但输出限制多,生成的视频体积过大。同时,OBS 不支持录制画面与直播画面分开,而我平常习惯边开直播边工作,这令我只能放弃 OBS 录屏。")]),(0,r.Lk)("p",null,[(0,r.eW)("接着,我发现了 7.8k Star 的 "),(0,r.Lk)("a",i,[(0,r.eW)("Captura"),(0,r.bF)(t)]),(0,r.eW)(",它的自由度较高,能自定义叠加元素,但项目已于 2018 年停止更新,使用时经常碰到莫名其妙的报错,很不稳定。")]),s,(0,r.Lk)("p",null,[(0,r.eW)("我用 "),(0,r.Lk)("a",f,[(0,r.eW)("Bandicam"),(0,r.bF)(t)]),(0,r.eW)(" 录制了一周的视频。与 Captura 相比,Bandicam 的稳定性有了很大的提升,不会突然崩溃,还有降噪和内录扬声器功能,但它偶尔会丢失摄像头,导致无法自动录屏。")]),c,(0,r.Lk)("ul",null,[d,(0,r.Lk)("li",null,[(0,r.Lk)("a",g,[(0,r.eW)("FlashBack Express"),(0,r.bF)(t)]),(0,r.eW)(":能调节帧率,画面镜像,虚化背景,但免费版只支持 2 小时内的录制。")]),(0,r.Lk)("li",null,[(0,r.Lk)("a",h,[(0,r.eW)("Mirillis Action!"),(0,r.bF)(t)]),(0,r.eW)(":高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。")]),(0,r.Lk)("li",null,[(0,r.Lk)("a",m,[(0,r.eW)("oCam"),(0,r.bF)(t)]),(0,r.eW)(":打着免费招牌但有弹窗广告,且输出视频偏大。")]),(0,r.Lk)("li",null,[(0,r.Lk)("a",u,[(0,r.eW)("ShareX"),(0,r.bF)(t)]),(0,r.eW)(":免费开源强大的截图软件,具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。")])]),k,(0,r.Lk)("ol",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("下载最新版 "),(0,r.Lk)("a",b,[(0,r.eW)("FFmpeg"),(0,r.bF)(t)]),(0,r.eW)(",Windows 环境选择 "),F,(0,r.eW)(",GPL 版本包含了所有依赖项。")])]),L]),_,W,v,(0,r.Lk)("p",null,[(0,r.eW)("FFmpeg 的录制命令 gdigrab 不支持音频录制,也不支持直接调用摄像头,此时需使用开源的 "),(0,r.Lk)("a",w,[(0,r.eW)("screen-capture-recorder-to-video-windows-free"),(0,r.bF)(t)]),(0,r.eW)(" 增强 FFmpeg 的录制功能,其最新版本为 0.12.12。")]),x,(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,[y,(0,r.eW)(" 使用 FFmpeg 内置的 Windows 屏幕录制命令 "),(0,r.Lk)("a",C,[(0,r.eW)("gdigrab"),(0,r.bF)(t)]),(0,r.eW)(",录制对象可为全屏、指定范围和指定程序。MacOS 录屏方法为 "),(0,r.Lk)("a",z,[(0,r.eW)("AVFoundation"),(0,r.bF)(t)]),(0,r.eW)(",Linux 录屏方法为 "),(0,r.Lk)("a",A,[(0,r.eW)("x11grab"),(0,r.bF)(t)]),(0,r.eW)("。")]),S]),B,(0,r.Lk)("p",null,[(0,r.eW)("报错 "),D,(0,r.eW)(",解决方案参考 "),(0,r.Lk)("a",M,[(0,r.eW)("issue 136"),(0,r.bF)(t)]),(0,r.eW)("。尽管我仍然遇到了这个错误,但它并未影响录屏的效果。")]),P,(0,r.Lk)("p",null,[(0,r.eW)("前几天,群里有人分享了快速生成 FFmpeg 命令的工具 "),(0,r.Lk)("a",E,[(0,r.eW)("FFmpeg.guide"),(0,r.bF)(t)]),(0,r.eW)("。本以为能帮新手快速入门,使用后却感觉不实用。FFmpeg 最快入门的方法还是得看官方文档,也有一些爱好者整理翻译了相关的中文/视频教程。前期会耗费一些时间,但只要定制好自己要的命令,之后就能一直使用。")]),T,(0,r.Lk)("p",null,[(0,r.eW)("本文于「"),(0,r.Lk)("a",O,[(0,r.eW)("少数派首发"),(0,r.bF)(t)]),(0,r.eW)("」。")]),R,(0,r.Lk)("section",q,[(0,r.Lk)("ol",U,[(0,r.Lk)("li",H,[(0,r.Lk)("p",null,[(0,r.Lk)("a",Z,[(0,r.eW)("ffmpeg 录屏命令"),(0,r.bF)(t)]),(0,r.eW)(),V])]),(0,r.Lk)("li",N,[(0,r.Lk)("p",null,[(0,r.Lk)("a",j,[(0,r.eW)("ffmpeg 基础使用"),(0,r.bF)(t)]),(0,r.eW)(),G])]),(0,r.Lk)("li",I,[(0,r.Lk)("p",null,[(0,r.Lk)("a",J,[(0,r.eW)("libx265 编码说明"),(0,r.bF)(t)]),(0,r.eW)(),X])]),(0,r.Lk)("li",Y,[(0,r.Lk)("p",null,[(0,r.Lk)("a",K,[(0,r.eW)("x265 的 preset 与编码速度、视频画质以及比特率的关联"),(0,r.bF)(t)]),(0,r.eW)(),Q])]),(0,r.Lk)("li",$,[(0,r.Lk)("p",null,[(0,r.Lk)("a",ee,[(0,r.eW)("FFmpeg 音视频倍速控制"),(0,r.bF)(t)]),(0,r.eW)(),oe])]),(0,r.Lk)("li",te,[(0,r.Lk)("p",null,[(0,r.Lk)("a",re,[(0,r.eW)("FFmpeg 中 overlay 滤镜用法 - 水印及画中画"),(0,r.bF)(t)]),(0,r.eW)(),ne])]),(0,r.Lk)("li",ae,[(0,r.Lk)("p",null,[(0,r.Lk)("a",le,[(0,r.eW)("ffmpeg 调整缩放裁剪视频的基础知识 (转)"),(0,r.bF)(t)]),(0,r.eW)(),pe])])])])])}]]),fe=JSON.parse('{"path":"/posts/2022-11-03-ffmpeg_screen_recording.html","title":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg","lang":"zh-CN","frontmatter":{"title":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg","date":"2022-11-03T00:00:00.000Z","category":["工具"],"tag":["录屏"],"order":-50,"description":" 当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。 开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。 最初,我使用了免费开源的 VLC,这也是我监控文章中采用的方案。它能调节输...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg"}],["meta",{"property":"og:description","content":" 当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。 开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。 最初,我使用了免费开源的 VLC,这也是我监控文章中采用的方案。它能调节输..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-11-03-13-16-44.png \\"输出画面如图例\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"录屏"}],["meta",{"property":"article:published_time","content":"2022-11-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg\\",\\"image\\":[\\"https://img.newzone.top/2022-11-03-13-16-44.png \\\\\\"输出画面如图例\\\\\\"\\",\\"https://img.newzone.top/2022-11-01-18-13-49.png \\\\\\"FFmpeg 全局变量设置\\\\\\"\\",\\"https://img.newzone.top/2022-11-01-18-17-13.png \\\\\\"FFmpeg 配置成功\\\\\\"\\",\\"https://img.newzone.top/2022-11-03-10-33-52.png \\\\\\"查看视频/音频设备列表\\\\\\"\\"],\\"datePublished\\":\\"2022-11-03T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么 FFmpeg","slug":"为什么-ffmpeg","link":"#为什么-ffmpeg","children":[]},{"level":2,"title":"录屏准备","slug":"录屏准备","link":"#录屏准备","children":[{"level":3,"title":"配置 FFmpeg","slug":"配置-ffmpeg","link":"#配置-ffmpeg","children":[]},{"level":3,"title":"配置视频/音频设备","slug":"配置视频-音频设备","link":"#配置视频-音频设备","children":[]}]},{"level":2,"title":"录制屏幕","slug":"录制屏幕","link":"#录制屏幕","children":[]},{"level":2,"title":"录制摄像头","slug":"录制摄像头","link":"#录制摄像头","children":[]},{"level":2,"title":"输出视频:画中画","slug":"输出视频-画中画","link":"#输出视频-画中画","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"Could not set video options","slug":"could-not-set-video-options","link":"#could-not-set-video-options","children":[]},{"level":3,"title":"real-time buffer","slug":"real-time-buffer","link":"#real-time-buffer","children":[]},{"level":3,"title":"摄像头分辨率错误","slug":"摄像头分辨率错误","link":"#摄像头分辨率错误","children":[]},{"level":3,"title":"录制画面偏移","slug":"录制画面偏移","link":"#录制画面偏移","children":[]},{"level":3,"title":"脚本启动报错","slug":"脚本启动报错","link":"#脚本启动报错","children":[]}]},{"level":2,"title":"后续","slug":"后续","link":"#后续","children":[]}],"git":{"createdTime":1667619665000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":12}]},"readingTime":{"minutes":10.37,"words":3111},"filePathRelative":"_posts/2022-11-03-ffmpeg_screen_recording.md","localizedDate":"2022年11月3日","excerpt":"
    \\n

    当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。

    \\n
    \\n

    开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7311b4a2.715c5ab4.js b/assets/js/2022-11-18-whisper_ai_subtitles.html.cbcbd292.js similarity index 73% rename from assets/js/v-7311b4a2.715c5ab4.js rename to assets/js/2022-11-18-whisper_ai_subtitles.html.cbcbd292.js index 1db4dde9a..008a3055b 100644 --- a/assets/js/v-7311b4a2.715c5ab4.js +++ b/assets/js/2022-11-18-whisper_ai_subtitles.html.cbcbd292.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7698],{9720:(e,t)=>{t.c=(e,t)=>{const r=e.__vccOpts||e;for(const[e,n]of t)r[e]=n;return r}},3512:(e,t,r)=>{r.r(t),r.d(t,{comp:()=>oe,data:()=>se});var n=r(3968);const l=(0,n.QD)("p",null,"从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。",-1),a=(0,n.QD)("p",null,[(0,n.mY)("Whisper 是今年 9 月被 OpenAI 开源的自动语音识别系统,除了可以用于语音识别,Whisper 还能实现多种语言的转录,并将这些语言翻译成英语。「语言识别」「转录」听起来很高级,但 transcribe(转录)指的是将语音转为文字,Whisper 会为音视频生成带时间轴的字幕文件,是"),(0,n.QD)("strong",null,"支持 99 种语言 AI 字幕工具"),(0,n.mY)("。")],-1),o={href:"https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html#%E9%85%8D%E7%BD%AE-ffmpeg",target:"_blank",rel:"noopener noreferrer"},s={href:"https://github.com/openai/whisper",target:"_blank",rel:"noopener noreferrer"},i=(0,n.IL)('
    pip install -U openai-whisper\n\n# on MacOS using Homebrew (https://brew.sh/)\nbrew install ffmpeg\n\n# on Windows using Scoop (https://scoop.sh/)\nscoop install ffmpeg\n

    接下来,我会分享如何使用 Whisper 为外语视频自动生成字幕,以日本综艺节目「中森明菜デビュー 40 周年 女神の熱唱!喝采は今も」为例。

    音视频转录

    在文件所在目录下打开终端,运行 whisper jp.mp4 即可执行音视频转录。测试视频名原本为日语,我将其更改为「jp.mp4」,原因是我的系统中只安装了中英语言包,因此使用其他语言或文件名中含有空格的文件会导致出现 Invalid argument 错误,从而导致转录失败。Whisper 的媒体分析环节调用了 FFmpeg,因此支持大多数主流音视频格式。

    whisper 命令

    测试视频时长 90 分钟,我使用了 3080Ti 显卡进行转录,用时 10 分钟。转录过程中,不要进行游戏或直播等占显存较多的行为,否则可能会导致显存不足而无法继续转录。Whisper 对设备的要求不高,但设备的性能会影响转录时长和可使用的转录模型。如果你使用 CPU 进行转录,则需要的时间会增加 5-10 倍。

    转录完成后,Whisper 将生成原生字幕文件,例如,日语视频将被转录为日语字幕,西班牙语视频将得到西班牙语字幕。

    字幕翻译

    通过 Whisper 获得原生字幕后,接着要将其翻译为中文。这一步需借助 SubtitleEdit Online,它支持免费在线翻译字幕,可使用 Google 和 Yandex 两种翻译引擎。[1]

    ',9),p={href:"https://www.nikse.dk/subtitleedit/online",target:"_blank",rel:"noopener noreferrer"},c=(0,n.QD)("li",null,[(0,n.mY)("点击「Auto-translate」,选择翻译引擎,然后在弹出窗口中选择字幕要翻译的语言,并"),(0,n.QD)("strong",null,"将页面拖动到最下方"),(0,n.mY)("(非常重要),确定所有文字都被翻译后点击 OK 按钮。")],-1),d=(0,n.QD)("li",null,"点击「Subtitle」>「Save/download...」,即可保存翻译好的字幕文件。",-1),h={href:"https://tools.newzone.top/subtitle-translator",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/argosopentech/argos-translate",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Helsinki-NLP/Opus-MT",target:"_blank",rel:"noopener noreferrer"},u=(0,n.IL)('

    Whisper 进阶命令

    task

    --task 分为 transcribe(语音转录)和 translate。Whisper 默认使用 --task transcribe 模式,将语音转录为对应的语言字幕。--task translate 是所有语言翻译为英文,目前尚未支持翻译为其他语言。

    language

    ',4),b=(0,n.QD)("code",null,"--language",-1),f={href:"https://github.com/openai/whisper/blob/main/whisper/tokenizer.py",target:"_blank",rel:"noopener noreferrer"},D=(0,n.QD)("code",null,"--language Japanese",-1),_=(0,n.IL)('

    如果指定语种与文件中的语种并不相同,Whisper 会强制翻译,但 10 分钟以上的音视频会出现大量的重复无意义字幕。[2] 假设你把日语视频的转录语言设为汉语,前 8 分钟 Whisper 会正确转录到中文,但 8 分钟后的转录字幕会一直重复,并与实际片段无关。

    model

    --model 指 Whisper 的转录模型,转录效果为 tiny < base < small < medium < large,默认使用 small。添加参数 --model medium--model large 可以切换到更大的模型,但转录时间也会变长。如果你是对英文视频进行转录,则在模型参数上添加后缀 .en,能提升转录速度。

    模型大小单英语模型多语言模型最低显存转录速率
    tiny39 Mtiny.entiny~1 GB~32x
    base74 Mbase.enbase~1 GB~16x
    small244 Msmall.ensmall~2 GB~6x
    medium769 Mmedium.enmedium~5 GB~2x
    large1550 MN/Alarge~10 GB1x

    上方表格是 Whisper 官方提供的数据,但目前的模型实际增大了 50%-100%,要求也相应提高了。因此,该表格仅供参考。

    辅助参数

    ',6),Q=(0,n.IL)("
  • --device 指 whisper 运行算法所用的硬件,默认为 cuda 即显存,或者指定 --device cpu 。特别当你显存不够,又想使用较大模型时,推荐指定 CPU 转录。
  • --temperature temperature 决定了生成模型的贪婪程度,默认为 0。如果 temperature 低,概率最高的词将远高于其他低概率,模型将可能输出最正确的文本,变化很小。如果 temperature 较高,该模型会输出概率较高的其他单词,而不是概率最高的单词,生成的文本将更加多样化,但有更高的可能性出现语法错误和生成无意义的文本。
  • --temperature_increment_on_fallback 当解码失败时,回推时要增加的 temperature,默认为 0.2。
  • --best_of temperature 不为零时的侯选个数,默认为 5。
  • --beam_size temperature 为零时,number of beams in beam search,默认为 5。beam 直译是光束,但没理解具体意思,我简单理解其为侯选数。
  • ",5),y=(0,n.QD)("code",null,"--patience",-1),x={href:"https://arxiv.org/abs/2204.05424",target:"_blank",rel:"noopener noreferrer"},k=(0,n.QD)("code",null,"--length_penalty",-1),Y={href:"https://arxiv.org/abs/1609.08144",target:"_blank",rel:"noopener noreferrer"},v=(0,n.IL)("
  • --suppress_tokens 逗号分隔的标记 ID 列表,以便在采样过程中进行抑制; 默认为 -1,这会抑制除常见标点符号外的大多数特殊字符的出现。
  • --initial_prompt 可选的文本提示,在命令首行出现,默认为空。
  • --condition_on_previous_text 默认为 True,为下一个窗口提供模型之前的输出作为提示;禁用可能会使不同窗口的文本不一致,但模型变得不容易陷入失败循环。
  • --fp16 是否启用半精度 fp16 进行推理运算,默认为 True,否则为单精度 fp32,运行时间延长。
  • --threads 指定 CPU 运算的线程数,会取代 MKL_NUM_THREADS/OMP_NUM_THREADS (默认:0)。
  • --output_format 用于指定转录后的字幕格式,支持的格式有 txt、vtt、srt、tsv、json 和 all,可以使用 -f 缩写。我通常只需要 srt 格式的文件,所以我将其设置为 -f srt
  • ",6),W=(0,n.QD)("h3",{id:"幻听参数",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#幻听参数"},[(0,n.QD)("span",null,"幻听参数")])],-1),w={href:"https://github.com/snakers4/silero-vad",target:"_blank",rel:"noopener noreferrer"},A=(0,n.IL)('
    • --no_speech_threshold 无声识别的阈值,默认为 0.6。当 no_speech_threshold 高于阈值且 logprob_threshold 低于预设时,该片段将被标记为静默。对于非英语长视频来说,建议将其调低,否则经常出现大段的重复识别。
    • --logprob_threshold 转录频次的阈值,默认为 -1.0。当 logprob_threshold 低于预设时,将不对该片段进行转录。建议修改为 None 或更低的值。
    • --compression_ratio_threshold 压缩比的阈值,默认为 2.4。当 compression_ratio_threshold 高于预设时,将不对该片段进行转录。

    --no_speech_threshold 0.5 --logprob_threshold None --compression_ratio_threshold 2.2 是我常用的参数,你可以根据视频情况调整。在转录命令后面添加幻听参数即可。转录指令示例:whisper jp.mp4 --language Japanese --model large-v2 -f srt --no_speech_threshold 0.5 --logprob_threshold None --compression_ratio_threshold 2.2。需要注意的是,幻听参数并不适用于每个视频。如果你发现添加参数后的字幕内容大量重复,请将幻听参数移除或将调整幻听参数,比如 whisper jp.mp4 --language Japanese --model large-v2 -f srt --no_speech_threshold 0.1 --logprob_threshold None --compression_ratio_threshold 1.0

    转录成果

    「夜のヒットスタジオ・スペシャル」:

    ',4),T=(0,n.QD)("p",null,"「中森明菜デビュー 40 周年 女神の熱唱!喝采は今も」:",-1),z=(0,n.QD)("p",null,"上方是我用 Whisper 转录的日语视频,不过哔哩哔哩不支持站外嵌套字幕,查看字幕效果需跳转回 B 站。测试视频中 Whisper 对谈话片段识别不错,但歌曲转录与原意相差甚远。而我特别喜欢中森明菜的歌,所以在转录第二个视频后,特意花了几个小时重新比对歌词。",-1),K=(0,n.QD)("p",null,"但视频发布后,B 站给我推送了明菜歌迷会在一周前发布的带字幕视频。原本我有些沮丧,想着白花工夫了。但我看过对方专业的字幕视频后,心情立马变好了。歌迷会版本的字幕遣词造句都非常讲究,明显是日语精通级别,而我连五十音都没背全,用 10 分钟就能做出能看懂的字幕,质量也没相差巨大,我非常满足。之后,我也可以看没字幕的生肉节目了,不用再傻等字幕组的宠幸。我甚至可以帮中文节目添加字幕,毕竟与声音相比,我们从文字中汲取信息要轻松许多。",-1),I=(0,n.QD)("h2",{id:"其他工具",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#其他工具"},[(0,n.QD)("span",null,"其他工具")])],-1),P={href:"https://colab.research.google.com/github/Ayanaminn/N46Whisper/blob/main/N46Whisper.ipynb",target:"_blank",rel:"noopener noreferrer"},N=(0,n.QD)("code",null,"is_vad_filter",-1),S={href:"https://github.com/guillaumekln/faster-whisper",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/m-bain/whisperX",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/abdeladim-s/subsai",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/chidiwilliams/buzz",target:"_blank",rel:"noopener noreferrer"},B=(0,n.QD)("p",null,"不过,目前第三方套壳工具存在各种问题。如果你只是想批量转录,可以使用「whisper + 音视频绝对路径」的方式,来将多个文件按序批量转录出字幕文件。注意,命令行的最后一行需要换行,否则最后一个文件不会自动转录。",-1),G=(0,n.QD)("h2",{id:"更多",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#更多"},[(0,n.QD)("span",null,"更多")])],-1),E={href:"https://marcoshuerta.com/dash/atp_search/",target:"_blank",rel:"noopener noreferrer"},L=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-11-18-23-21-25.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"ATP Podcast Search 搜索界面")],-1),F={href:"http://xlrocket.com/%e7%9c%8b%e8%bf%87%e4%b8%8d%e4%bb%a3%e8%a1%a8%e5%ad%a6%e8%bf%87%ef%bc%8c%e7%8e%b0%e5%9c%a8%e8%83%bd%e8%be%b9%e7%9c%8b%e8%a7%86%e9%a2%91%ef%bc%8c%e8%be%b9%e5%81%9a%e7%ac%94%e8%ae%b0%ef%bc%8c-%e9%9d%9e/",target:"_blank",rel:"noopener noreferrer"},j=(0,n.QD)("p",null,"总体上,还没出现能用字幕/时间戳管理视频的「全视频网站/本地视频」的笔记工具,暂时只能记录下这个想法。笔记软件们继续卷起来,把字幕文件作为数据库索引,通过关键词搜索即可定位到音视频的时间戳,绝对是杀手级功能。",-1),U=(0,n.QD)("h2",{id:"最后",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#最后"},[(0,n.QD)("span",null,"最后")])],-1),V=(0,n.QD)("p",null,"今年是 AI 工具的爆发年,多个领域都出现优质的开源工具,极大地提升了我的生活、学习和工作效率。",-1),H=(0,n.QD)("p",null,[(0,n.mY)("在遇到 Whisper 前,我用 YouTube 的实时字幕看在线视频,但它是通过语言实时转录而非整句转录,导致效果远差于 Whisper。我使用飞书妙记管理本地视频,但飞书只支持中日英语,机器翻译较死板。Whisper 解决了两者存在的问题,转录效果更好,支持语言更多。此外,Whisper 是语言直译,所以你对字幕语言有基础认知的话,可以将语言与翻译文本匹配,可以进行语音学习。更重要的是,Whisper 是本地端应用,"),(0,n.QD)("strong",null,"没有任何在线审查"),(0,n.mY)("。")],-1),Z=(0,n.QD)("p",null,"然而,与 Whisper 完美的英语转录效果相比,其对非英语视频的转录还有很大的提升空间,期待它的后续更新,也希望字幕组都使用上 Whisper,节省字幕转录时间,加快出片速度。",-1),J={href:"https://sspai.com/post/76899",target:"_blank",rel:"noopener noreferrer"},R=(0,n.QD)("hr",{class:"footnotes-sep"},null,-1),X={class:"footnotes"},q={class:"footnotes-list"},$={id:"footnote1",class:"footnote-item"},ee={href:"https://www.jihosoft.cn/zimu/tutorial/translate-subtitles/",target:"_blank",rel:"noopener noreferrer"},te=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),re={id:"footnote2",class:"footnote-item"},ne={href:"https://github.com/openai/whisper/discussions/397",target:"_blank",rel:"noopener noreferrer"},le=(0,n.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ae={},oe=(0,r(9720).c)(ae,[["render",function(e,t){const r=(0,n.E1)("ExternalLinkIcon"),ae=(0,n.E1)("BiliBili");return(0,n.Wz)(),(0,n.An)("div",null,[l,a,(0,n.QD)("p",null,[(0,n.mY)("虽然与 Stable Diffusion 同样归属 AI 工具,但是 Whisper 安装非常简单。只需在终端输入两行代码,安装 Whisper 和 FFmpeg,就可以开始使用了。如你不清楚如何安装 FFmpeg,可以参考 "),(0,n.QD)("a",o,[(0,n.mY)("FFmpeg 配置步骤"),(0,n.K2)(r)]),(0,n.mY)("。这部分我不多做赘述,具体可以参考 "),(0,n.QD)("a",s,[(0,n.mY)("Whisper 官方文档"),(0,n.K2)(r)]),(0,n.mY)("。")]),i,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.mY)("打开 "),(0,n.QD)("a",p,[(0,n.mY)("SubtitleEdit Online"),(0,n.K2)(r)]),(0,n.mY)(",点击「Subtitle」>「Open...」,选择要导入的字幕文件。")]),c,d]),(0,n.QD)("p",null,[(0,n.mY)("如果你开通了 Google Translate API,还可以使用我的"),(0,n.QD)("a",h,[(0,n.mY)("字幕翻译"),(0,n.K2)(r)]),(0,n.mY)("工具,批量将 .srt 字幕文件进行翻译。除了网页翻译和 ChatGPT API 字幕,本地端的神经机器翻译也是一个好的选择。如果你是 macOS 用户,推荐使用 "),(0,n.QD)("a",m,[(0,n.mY)("Argos Translate"),(0,n.K2)(r)]),(0,n.mY)(",这是基于 OpenNMT 的开源神经机器翻译。如果你具备一定的编程能力,可以尝试 "),(0,n.QD)("a",g,[(0,n.mY)("Opus-MT"),(0,n.K2)(r)]),(0,n.mY)("。不管使用哪种方式,都是将字幕以文本方式导出,然后复制到翻译引擎中翻译,即可得到与 Google Translate 不同的翻译结果。")]),u,(0,n.QD)("p",null,[b,(0,n.mY)(" 是设置语音转录的语种,支持语种范围查看 "),(0,n.QD)("a",f,[(0,n.mY)("tokenizer.py"),(0,n.K2)(r)]),(0,n.mY)(",比如指定日语 "),D,(0,n.mY)("。如果你没指定语种,Whisper 会截取音频的前 30 秒来判断语种。")]),_,(0,n.QD)("ul",null,[Q,(0,n.QD)("li",null,[y,(0,n.mY)(" 用于 beam decoding 的 patience value,as in "),(0,n.QD)("a",x,[(0,n.mY)("https://arxiv.org/abs/2204.05424"),(0,n.K2)(r)]),(0,n.mY)(", 其默认值为 1.0,相当于 conventional beam search(default: None)默认的 simple length normalization(default: None)。")]),(0,n.QD)("li",null,[k,(0,n.mY)(" optional token length penalty coefficient (alpha) as in "),(0,n.QD)("a",Y,[(0,n.mY)("https://arxiv.org/abs/1609.08144"),(0,n.K2)(r)]),(0,n.mY)(", 默认使用 simple length normalization (default: None)")]),v]),W,(0,n.QD)("p",null,[(0,n.mY)("非英语视频的转录有时会出现幻听,即静默片段被识别出语音,或是转录结果与该片段无关。这些问题是由于语气停顿参数引起的。幻听的解决方案是引入 "),(0,n.QD)("a",w,[(0,n.mY)("VAD"),(0,n.K2)(r)]),(0,n.mY)(",但 VAD 对动手能力要求较高。如果你的视频转录出现了严重的幻听,建议尝试调节参数阈值。")]),A,(0,n.K2)(ae,{bvid:"BV1EP4y117bh"}),T,(0,n.K2)(ae,{bvid:"BV1yG4y1x7Qy"}),z,K,I,(0,n.QD)("p",null,[(0,n.mY)("如果你的电脑配置不足,但又想翻译非英语(如日语)的长视频,可以使用 Google Colab 的免费 GPU 运行 "),(0,n.QD)("a",P,[(0,n.mY)("N46Whisper"),(0,n.K2)(r)]),(0,n.mY)(" 来在线转录字幕。转录出的字幕可以在 N46Whisper 中使用 ChatGPT API 进行翻译,也可以通过上文的机器翻译方式进行免费翻译。需要注意的是,在处理日语长视频时可以开启 "),N,(0,n.mY)(",减少幻听的出现。")]),(0,n.QD)("p",null,[(0,n.QD)("a",S,[(0,n.mY)("faster-whisper"),(0,n.K2)(r)]),(0,n.mY)(" 和 "),(0,n.QD)("a",O,[(0,n.mY)("whisperX"),(0,n.K2)(r)]),(0,n.mY)(" 内置了 VAD,并拥有更快的处理速度。如果你对命令行工具不熟悉,也可以利用 "),(0,n.QD)("a",C,[(0,n.mY)("Subs AI"),(0,n.K2)(r)]),(0,n.mY)("、"),(0,n.QD)("a",M,[(0,n.mY)("Buzz"),(0,n.K2)(r)]),(0,n.mY)(" 来进行 Whisper 转录。")]),B,G,(0,n.QD)("p",null,[(0,n.mY)("除了用 Whisper 转录的字幕来看视频和视频剪辑外,还能将来管理音视频。@PlatyHsu 分享的 "),(0,n.QD)("a",E,[(0,n.mY)("ATP Podcast Search"),(0,n.K2)(r)]),(0,n.mY)(" 启发了我,ATP 用 Whisper 转录给一个做了十年的英文播客做了可搜索的索引。那是否有应用在本地端用字幕管理视频文件?")]),L,(0,n.QD)("p",null,[(0,n.mY)("这个想法在技术上实现起来不难,甚至飞书妙记已经起到类似效果,但它是在线应用,不支持上传字幕,而且仅支持原生字幕搜索。换句话说,上传日语视频,你必须用日语搜索,即使妙记提供了中文翻译查看,你也不能中文搜索。而其他的视频笔记,只有 B 站专属的站内视频笔记和只支持 YouTube 的 "),(0,n.QD)("a",F,[(0,n.mY)("ClarityNotes"),(0,n.K2)(r)]),(0,n.mY)("。")]),j,U,V,H,Z,(0,n.QD)("p",null,[(0,n.mY)("本文于「"),(0,n.QD)("a",J,[(0,n.mY)("少数派首发"),(0,n.K2)(r)]),(0,n.mY)("」。")]),R,(0,n.QD)("section",X,[(0,n.QD)("ol",q,[(0,n.QD)("li",$,[(0,n.QD)("p",null,[(0,n.QD)("a",ee,[(0,n.mY)("如何自动翻译字幕:6 个好用的视频字幕翻译工具"),(0,n.K2)(r)]),(0,n.mY)(),te])]),(0,n.QD)("li",re,[(0,n.QD)("p",null,[(0,n.QD)("a",ne,[(0,n.mY)("For longer audio files (>10 minutes) not in English, Silero VAD (Voice Activity Detector)"),(0,n.K2)(r)]),(0,n.mY)(),le])])])])])}]]),se=JSON.parse('{"path":"/posts/2022-11-18-whisper_ai_subtitles.html","title":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧","lang":"zh-CN","frontmatter":{"title":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧","date":"2022-11-18T00:00:00.000Z","category":["工具"],"tag":["AI","Whisper","字幕"],"order":-51,"description":"从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。 Whisper 是今年 9 月被 OpenAI 开...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-11-18-whisper_ai_subtitles.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧"}],["meta",{"property":"og:description","content":"从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。 Whisper 是今年 9 月被 OpenAI 开..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-11-18-09-25-29.png \\"whisper 命令\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-11T02:31:57.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"Whisper"}],["meta",{"property":"article:tag","content":"字幕"}],["meta",{"property":"article:published_time","content":"2022-11-18T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-11T02:31:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"找不到字幕?Whisper 让不懂外语的你也能看懂日剧\\",\\"image\\":[\\"https://img.newzone.top/2022-11-18-09-25-29.png \\\\\\"whisper 命令\\\\\\"\\",\\"https://img.newzone.top/2022-11-18-23-21-25.png \\\\\\"ATP Podcast Search 搜索界面\\\\\\"\\"],\\"datePublished\\":\\"2022-11-18T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-11T02:31:57.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"音视频转录","slug":"音视频转录","link":"#音视频转录","children":[]},{"level":2,"title":"字幕翻译","slug":"字幕翻译","link":"#字幕翻译","children":[]},{"level":2,"title":"Whisper 进阶命令","slug":"whisper-进阶命令","link":"#whisper-进阶命令","children":[{"level":3,"title":"task","slug":"task","link":"#task","children":[]},{"level":3,"title":"language","slug":"language","link":"#language","children":[]},{"level":3,"title":"model","slug":"model","link":"#model","children":[]},{"level":3,"title":"辅助参数","slug":"辅助参数","link":"#辅助参数","children":[]},{"level":3,"title":"幻听参数","slug":"幻听参数","link":"#幻听参数","children":[]}]},{"level":2,"title":"转录成果","slug":"转录成果","link":"#转录成果","children":[]},{"level":2,"title":"其他工具","slug":"其他工具","link":"#其他工具","children":[]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1668932235000,"updatedTime":1696991517000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":12.12,"words":3636},"filePathRelative":"_posts/2022-11-18-whisper_ai_subtitles.md","localizedDate":"2022年11月18日","excerpt":"

    从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。

    \\n

    Whisper 是今年 9 月被 OpenAI 开源的自动语音识别系统,除了可以用于语音识别,Whisper 还能实现多种语言的转录,并将这些语言翻译成英语。「语言识别」「转录」听起来很高级,但 transcribe(转录)指的是将语音转为文字,Whisper 会为音视频生成带时间轴的字幕文件,是支持 99 种语言 AI 字幕工具

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4971],{3671:(e,t)=>{t.A=(e,t)=>{const r=e.__vccOpts||e;for(const[e,n]of t)r[e]=n;return r}},9549:(e,t,r)=>{r.r(t),r.d(t,{comp:()=>oe,data:()=>se});var n=r(7847);const l=(0,n.Lk)("p",null,"从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。",-1),a=(0,n.Lk)("p",null,[(0,n.eW)("Whisper 是今年 9 月被 OpenAI 开源的自动语音识别系统,除了可以用于语音识别,Whisper 还能实现多种语言的转录,并将这些语言翻译成英语。「语言识别」「转录」听起来很高级,但 transcribe(转录)指的是将语音转为文字,Whisper 会为音视频生成带时间轴的字幕文件,是"),(0,n.Lk)("strong",null,"支持 99 种语言 AI 字幕工具"),(0,n.eW)("。")],-1),o={href:"https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html#%E9%85%8D%E7%BD%AE-ffmpeg",target:"_blank",rel:"noopener noreferrer"},s={href:"https://github.com/openai/whisper",target:"_blank",rel:"noopener noreferrer"},i=(0,n.Fv)('
    pip install -U openai-whisper\n\n# on MacOS using Homebrew (https://brew.sh/)\nbrew install ffmpeg\n\n# on Windows using Scoop (https://scoop.sh/)\nscoop install ffmpeg\n

    接下来,我会分享如何使用 Whisper 为外语视频自动生成字幕,以日本综艺节目「中森明菜デビュー 40 周年 女神の熱唱!喝采は今も」为例。

    音视频转录

    在文件所在目录下打开终端,运行 whisper jp.mp4 即可执行音视频转录。测试视频名原本为日语,我将其更改为「jp.mp4」,原因是我的系统中只安装了中英语言包,因此使用其他语言或文件名中含有空格的文件会导致出现 Invalid argument 错误,从而导致转录失败。Whisper 的媒体分析环节调用了 FFmpeg,因此支持大多数主流音视频格式。

    whisper 命令

    测试视频时长 90 分钟,我使用了 3080Ti 显卡进行转录,用时 10 分钟。转录过程中,不要进行游戏或直播等占显存较多的行为,否则可能会导致显存不足而无法继续转录。Whisper 对设备的要求不高,但设备的性能会影响转录时长和可使用的转录模型。如果你使用 CPU 进行转录,则需要的时间会增加 5-10 倍。

    转录完成后,Whisper 将生成原生字幕文件,例如,日语视频将被转录为日语字幕,西班牙语视频将得到西班牙语字幕。

    字幕翻译

    通过 Whisper 获得原生字幕后,接着要将其翻译为中文。这一步需借助 SubtitleEdit Online,它支持免费在线翻译字幕,可使用 Google 和 Yandex 两种翻译引擎。[1]

    ',9),p={href:"https://www.nikse.dk/subtitleedit/online",target:"_blank",rel:"noopener noreferrer"},c=(0,n.Lk)("li",null,[(0,n.eW)("点击「Auto-translate」,选择翻译引擎,然后在弹出窗口中选择字幕要翻译的语言,并"),(0,n.Lk)("strong",null,"将页面拖动到最下方"),(0,n.eW)("(非常重要),确定所有文字都被翻译后点击 OK 按钮。")],-1),d=(0,n.Lk)("li",null,"点击「Subtitle」>「Save/download...」,即可保存翻译好的字幕文件。",-1),h={href:"https://tools.newzone.top/subtitle-translator",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/argosopentech/argos-translate",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/Helsinki-NLP/Opus-MT",target:"_blank",rel:"noopener noreferrer"},m=(0,n.Fv)('

    Whisper 进阶命令

    task

    --task 分为 transcribe(语音转录)和 translate。Whisper 默认使用 --task transcribe 模式,将语音转录为对应的语言字幕。--task translate 是所有语言翻译为英文,目前尚未支持翻译为其他语言。

    language

    ',4),b=(0,n.Lk)("code",null,"--language",-1),k={href:"https://github.com/openai/whisper/blob/main/whisper/tokenizer.py",target:"_blank",rel:"noopener noreferrer"},f=(0,n.Lk)("code",null,"--language Japanese",-1),W=(0,n.Fv)('

    如果指定语种与文件中的语种并不相同,Whisper 会强制翻译,但 10 分钟以上的音视频会出现大量的重复无意义字幕。[2] 假设你把日语视频的转录语言设为汉语,前 8 分钟 Whisper 会正确转录到中文,但 8 分钟后的转录字幕会一直重复,并与实际片段无关。

    model

    --model 指 Whisper 的转录模型,转录效果为 tiny < base < small < medium < large,默认使用 small。添加参数 --model medium--model large 可以切换到更大的模型,但转录时间也会变长。如果你是对英文视频进行转录,则在模型参数上添加后缀 .en,能提升转录速度。

    模型大小单英语模型多语言模型最低显存转录速率
    tiny39 Mtiny.entiny~1 GB~32x
    base74 Mbase.enbase~1 GB~16x
    small244 Msmall.ensmall~2 GB~6x
    medium769 Mmedium.enmedium~5 GB~2x
    large1550 MN/Alarge~10 GB1x

    上方表格是 Whisper 官方提供的数据,但目前的模型实际增大了 50%-100%,要求也相应提高了。因此,该表格仅供参考。

    辅助参数

    ',6),_=(0,n.Fv)("
  • --device 指 whisper 运行算法所用的硬件,默认为 cuda 即显存,或者指定 --device cpu 。特别当你显存不够,又想使用较大模型时,推荐指定 CPU 转录。
  • --temperature temperature 决定了生成模型的贪婪程度,默认为 0。如果 temperature 低,概率最高的词将远高于其他低概率,模型将可能输出最正确的文本,变化很小。如果 temperature 较高,该模型会输出概率较高的其他单词,而不是概率最高的单词,生成的文本将更加多样化,但有更高的可能性出现语法错误和生成无意义的文本。
  • --temperature_increment_on_fallback 当解码失败时,回推时要增加的 temperature,默认为 0.2。
  • --best_of temperature 不为零时的侯选个数,默认为 5。
  • --beam_size temperature 为零时,number of beams in beam search,默认为 5。beam 直译是光束,但没理解具体意思,我简单理解其为侯选数。
  • ",5),L=(0,n.Lk)("code",null,"--patience",-1),y={href:"https://arxiv.org/abs/2204.05424",target:"_blank",rel:"noopener noreferrer"},x=(0,n.Lk)("code",null,"--length_penalty",-1),v={href:"https://arxiv.org/abs/1609.08144",target:"_blank",rel:"noopener noreferrer"},w=(0,n.Fv)("
  • --suppress_tokens 逗号分隔的标记 ID 列表,以便在采样过程中进行抑制; 默认为 -1,这会抑制除常见标点符号外的大多数特殊字符的出现。
  • --initial_prompt 可选的文本提示,在命令首行出现,默认为空。
  • --condition_on_previous_text 默认为 True,为下一个窗口提供模型之前的输出作为提示;禁用可能会使不同窗口的文本不一致,但模型变得不容易陷入失败循环。
  • --fp16 是否启用半精度 fp16 进行推理运算,默认为 True,否则为单精度 fp32,运行时间延长。
  • --threads 指定 CPU 运算的线程数,会取代 MKL_NUM_THREADS/OMP_NUM_THREADS (默认:0)。
  • --output_format 用于指定转录后的字幕格式,支持的格式有 txt、vtt、srt、tsv、json 和 all,可以使用 -f 缩写。我通常只需要 srt 格式的文件,所以我将其设置为 -f srt
  • ",6),A=(0,n.Lk)("h3",{id:"幻听参数",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#幻听参数"},[(0,n.Lk)("span",null,"幻听参数")])],-1),F={href:"https://github.com/snakers4/silero-vad",target:"_blank",rel:"noopener noreferrer"},T=(0,n.Fv)('
    • --no_speech_threshold 无声识别的阈值,默认为 0.6。当 no_speech_threshold 高于阈值且 logprob_threshold 低于预设时,该片段将被标记为静默。对于非英语长视频来说,建议将其调低,否则经常出现大段的重复识别。
    • --logprob_threshold 转录频次的阈值,默认为 -1.0。当 logprob_threshold 低于预设时,将不对该片段进行转录。建议修改为 None 或更低的值。
    • --compression_ratio_threshold 压缩比的阈值,默认为 2.4。当 compression_ratio_threshold 高于预设时,将不对该片段进行转录。

    --no_speech_threshold 0.5 --logprob_threshold None --compression_ratio_threshold 2.2 是我常用的参数,你可以根据视频情况调整。在转录命令后面添加幻听参数即可。转录指令示例:whisper jp.mp4 --language Japanese --model large-v2 -f srt --no_speech_threshold 0.5 --logprob_threshold None --compression_ratio_threshold 2.2。需要注意的是,幻听参数并不适用于每个视频。如果你发现添加参数后的字幕内容大量重复,请将幻听参数移除或将调整幻听参数,比如 whisper jp.mp4 --language Japanese --model large-v2 -f srt --no_speech_threshold 0.1 --logprob_threshold None --compression_ratio_threshold 1.0

    转录成果

    「夜のヒットスタジオ・スペシャル」:

    ',4),z=(0,n.Lk)("p",null,"「中森明菜デビュー 40 周年 女神の熱唱!喝采は今も」:",-1),P=(0,n.Lk)("p",null,"上方是我用 Whisper 转录的日语视频,不过哔哩哔哩不支持站外嵌套字幕,查看字幕效果需跳转回 B 站。测试视频中 Whisper 对谈话片段识别不错,但歌曲转录与原意相差甚远。而我特别喜欢中森明菜的歌,所以在转录第二个视频后,特意花了几个小时重新比对歌词。",-1),N=(0,n.Lk)("p",null,"但视频发布后,B 站给我推送了明菜歌迷会在一周前发布的带字幕视频。原本我有些沮丧,想着白花工夫了。但我看过对方专业的字幕视频后,心情立马变好了。歌迷会版本的字幕遣词造句都非常讲究,明显是日语精通级别,而我连五十音都没背全,用 10 分钟就能做出能看懂的字幕,质量也没相差巨大,我非常满足。之后,我也可以看没字幕的生肉节目了,不用再傻等字幕组的宠幸。我甚至可以帮中文节目添加字幕,毕竟与声音相比,我们从文字中汲取信息要轻松许多。",-1),I=(0,n.Lk)("h2",{id:"其他工具",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#其他工具"},[(0,n.Lk)("span",null,"其他工具")])],-1),S={href:"https://colab.research.google.com/github/Ayanaminn/N46Whisper/blob/main/N46Whisper.ipynb",target:"_blank",rel:"noopener noreferrer"},C=(0,n.Lk)("code",null,"is_vad_filter",-1),O={href:"https://github.com/guillaumekln/faster-whisper",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/m-bain/whisperX",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/abdeladim-s/subsai",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/chidiwilliams/buzz",target:"_blank",rel:"noopener noreferrer"},G=(0,n.Lk)("p",null,"不过,目前第三方套壳工具存在各种问题。如果你只是想批量转录,可以使用「whisper + 音视频绝对路径」的方式,来将多个文件按序批量转录出字幕文件。注意,命令行的最后一行需要换行,否则最后一个文件不会自动转录。",-1),E=(0,n.Lk)("h2",{id:"更多",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#更多"},[(0,n.Lk)("span",null,"更多")])],-1),j={href:"https://marcoshuerta.com/dash/atp_search/",target:"_blank",rel:"noopener noreferrer"},U=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-11-18-23-21-25.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"ATP Podcast Search 搜索界面")],-1),V={href:"http://xlrocket.com/%e7%9c%8b%e8%bf%87%e4%b8%8d%e4%bb%a3%e8%a1%a8%e5%ad%a6%e8%bf%87%ef%bc%8c%e7%8e%b0%e5%9c%a8%e8%83%bd%e8%be%b9%e7%9c%8b%e8%a7%86%e9%a2%91%ef%bc%8c%e8%be%b9%e5%81%9a%e7%ac%94%e8%ae%b0%ef%bc%8c-%e9%9d%9e/",target:"_blank",rel:"noopener noreferrer"},H=(0,n.Lk)("p",null,"总体上,还没出现能用字幕/时间戳管理视频的「全视频网站/本地视频」的笔记工具,暂时只能记录下这个想法。笔记软件们继续卷起来,把字幕文件作为数据库索引,通过关键词搜索即可定位到音视频的时间戳,绝对是杀手级功能。",-1),Z=(0,n.Lk)("h2",{id:"最后",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#最后"},[(0,n.Lk)("span",null,"最后")])],-1),J=(0,n.Lk)("p",null,"今年是 AI 工具的爆发年,多个领域都出现优质的开源工具,极大地提升了我的生活、学习和工作效率。",-1),R=(0,n.Lk)("p",null,[(0,n.eW)("在遇到 Whisper 前,我用 YouTube 的实时字幕看在线视频,但它是通过语言实时转录而非整句转录,导致效果远差于 Whisper。我使用飞书妙记管理本地视频,但飞书只支持中日英语,机器翻译较死板。Whisper 解决了两者存在的问题,转录效果更好,支持语言更多。此外,Whisper 是语言直译,所以你对字幕语言有基础认知的话,可以将语言与翻译文本匹配,可以进行语音学习。更重要的是,Whisper 是本地端应用,"),(0,n.Lk)("strong",null,"没有任何在线审查"),(0,n.eW)("。")],-1),X=(0,n.Lk)("p",null,"然而,与 Whisper 完美的英语转录效果相比,其对非英语视频的转录还有很大的提升空间,期待它的后续更新,也希望字幕组都使用上 Whisper,节省字幕转录时间,加快出片速度。",-1),Y={href:"https://sspai.com/post/76899",target:"_blank",rel:"noopener noreferrer"},K=(0,n.Lk)("hr",{class:"footnotes-sep"},null,-1),q={class:"footnotes"},Q={class:"footnotes-list"},$={id:"footnote1",class:"footnote-item"},ee={href:"https://www.jihosoft.cn/zimu/tutorial/translate-subtitles/",target:"_blank",rel:"noopener noreferrer"},te=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),re={id:"footnote2",class:"footnote-item"},ne={href:"https://github.com/openai/whisper/discussions/397",target:"_blank",rel:"noopener noreferrer"},le=(0,n.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ae={},oe=(0,r(3671).A)(ae,[["render",function(e,t){const r=(0,n.g2)("ExternalLinkIcon"),ae=(0,n.g2)("BiliBili");return(0,n.uX)(),(0,n.CE)("div",null,[l,a,(0,n.Lk)("p",null,[(0,n.eW)("虽然与 Stable Diffusion 同样归属 AI 工具,但是 Whisper 安装非常简单。只需在终端输入两行代码,安装 Whisper 和 FFmpeg,就可以开始使用了。如你不清楚如何安装 FFmpeg,可以参考 "),(0,n.Lk)("a",o,[(0,n.eW)("FFmpeg 配置步骤"),(0,n.bF)(r)]),(0,n.eW)("。这部分我不多做赘述,具体可以参考 "),(0,n.Lk)("a",s,[(0,n.eW)("Whisper 官方文档"),(0,n.bF)(r)]),(0,n.eW)("。")]),i,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.eW)("打开 "),(0,n.Lk)("a",p,[(0,n.eW)("SubtitleEdit Online"),(0,n.bF)(r)]),(0,n.eW)(",点击「Subtitle」>「Open...」,选择要导入的字幕文件。")]),c,d]),(0,n.Lk)("p",null,[(0,n.eW)("如果你开通了 Google Translate API,还可以使用我的"),(0,n.Lk)("a",h,[(0,n.eW)("字幕翻译"),(0,n.bF)(r)]),(0,n.eW)("工具,批量将 .srt 字幕文件进行翻译。除了网页翻译和 ChatGPT API 字幕,本地端的神经机器翻译也是一个好的选择。如果你是 macOS 用户,推荐使用 "),(0,n.Lk)("a",g,[(0,n.eW)("Argos Translate"),(0,n.bF)(r)]),(0,n.eW)(",这是基于 OpenNMT 的开源神经机器翻译。如果你具备一定的编程能力,可以尝试 "),(0,n.Lk)("a",u,[(0,n.eW)("Opus-MT"),(0,n.bF)(r)]),(0,n.eW)("。不管使用哪种方式,都是将字幕以文本方式导出,然后复制到翻译引擎中翻译,即可得到与 Google Translate 不同的翻译结果。")]),m,(0,n.Lk)("p",null,[b,(0,n.eW)(" 是设置语音转录的语种,支持语种范围查看 "),(0,n.Lk)("a",k,[(0,n.eW)("tokenizer.py"),(0,n.bF)(r)]),(0,n.eW)(",比如指定日语 "),f,(0,n.eW)("。如果你没指定语种,Whisper 会截取音频的前 30 秒来判断语种。")]),W,(0,n.Lk)("ul",null,[_,(0,n.Lk)("li",null,[L,(0,n.eW)(" 用于 beam decoding 的 patience value,as in "),(0,n.Lk)("a",y,[(0,n.eW)("https://arxiv.org/abs/2204.05424"),(0,n.bF)(r)]),(0,n.eW)(", 其默认值为 1.0,相当于 conventional beam search(default: None)默认的 simple length normalization(default: None)。")]),(0,n.Lk)("li",null,[x,(0,n.eW)(" optional token length penalty coefficient (alpha) as in "),(0,n.Lk)("a",v,[(0,n.eW)("https://arxiv.org/abs/1609.08144"),(0,n.bF)(r)]),(0,n.eW)(", 默认使用 simple length normalization (default: None)")]),w]),A,(0,n.Lk)("p",null,[(0,n.eW)("非英语视频的转录有时会出现幻听,即静默片段被识别出语音,或是转录结果与该片段无关。这些问题是由于语气停顿参数引起的。幻听的解决方案是引入 "),(0,n.Lk)("a",F,[(0,n.eW)("VAD"),(0,n.bF)(r)]),(0,n.eW)(",但 VAD 对动手能力要求较高。如果你的视频转录出现了严重的幻听,建议尝试调节参数阈值。")]),T,(0,n.bF)(ae,{bvid:"BV1EP4y117bh"}),z,(0,n.bF)(ae,{bvid:"BV1yG4y1x7Qy"}),P,N,I,(0,n.Lk)("p",null,[(0,n.eW)("如果你的电脑配置不足,但又想翻译非英语(如日语)的长视频,可以使用 Google Colab 的免费 GPU 运行 "),(0,n.Lk)("a",S,[(0,n.eW)("N46Whisper"),(0,n.bF)(r)]),(0,n.eW)(" 来在线转录字幕。转录出的字幕可以在 N46Whisper 中使用 ChatGPT API 进行翻译,也可以通过上文的机器翻译方式进行免费翻译。需要注意的是,在处理日语长视频时可以开启 "),C,(0,n.eW)(",减少幻听的出现。")]),(0,n.Lk)("p",null,[(0,n.Lk)("a",O,[(0,n.eW)("faster-whisper"),(0,n.bF)(r)]),(0,n.eW)(" 和 "),(0,n.Lk)("a",M,[(0,n.eW)("whisperX"),(0,n.bF)(r)]),(0,n.eW)(" 内置了 VAD,并拥有更快的处理速度。如果你对命令行工具不熟悉,也可以利用 "),(0,n.Lk)("a",B,[(0,n.eW)("Subs AI"),(0,n.bF)(r)]),(0,n.eW)("、"),(0,n.Lk)("a",D,[(0,n.eW)("Buzz"),(0,n.bF)(r)]),(0,n.eW)(" 来进行 Whisper 转录。")]),G,E,(0,n.Lk)("p",null,[(0,n.eW)("除了用 Whisper 转录的字幕来看视频和视频剪辑外,还能将来管理音视频。@PlatyHsu 分享的 "),(0,n.Lk)("a",j,[(0,n.eW)("ATP Podcast Search"),(0,n.bF)(r)]),(0,n.eW)(" 启发了我,ATP 用 Whisper 转录给一个做了十年的英文播客做了可搜索的索引。那是否有应用在本地端用字幕管理视频文件?")]),U,(0,n.Lk)("p",null,[(0,n.eW)("这个想法在技术上实现起来不难,甚至飞书妙记已经起到类似效果,但它是在线应用,不支持上传字幕,而且仅支持原生字幕搜索。换句话说,上传日语视频,你必须用日语搜索,即使妙记提供了中文翻译查看,你也不能中文搜索。而其他的视频笔记,只有 B 站专属的站内视频笔记和只支持 YouTube 的 "),(0,n.Lk)("a",V,[(0,n.eW)("ClarityNotes"),(0,n.bF)(r)]),(0,n.eW)("。")]),H,Z,J,R,X,(0,n.Lk)("p",null,[(0,n.eW)("本文于「"),(0,n.Lk)("a",Y,[(0,n.eW)("少数派首发"),(0,n.bF)(r)]),(0,n.eW)("」。")]),K,(0,n.Lk)("section",q,[(0,n.Lk)("ol",Q,[(0,n.Lk)("li",$,[(0,n.Lk)("p",null,[(0,n.Lk)("a",ee,[(0,n.eW)("如何自动翻译字幕:6 个好用的视频字幕翻译工具"),(0,n.bF)(r)]),(0,n.eW)(),te])]),(0,n.Lk)("li",re,[(0,n.Lk)("p",null,[(0,n.Lk)("a",ne,[(0,n.eW)("For longer audio files (>10 minutes) not in English, Silero VAD (Voice Activity Detector)"),(0,n.bF)(r)]),(0,n.eW)(),le])])])])])}]]),se=JSON.parse('{"path":"/posts/2022-11-18-whisper_ai_subtitles.html","title":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧","lang":"zh-CN","frontmatter":{"title":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧","date":"2022-11-18T00:00:00.000Z","category":["工具"],"tag":["AI","Whisper","字幕"],"order":-51,"description":"从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。 Whisper 是今年 9 月被 OpenAI 开...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-11-18-whisper_ai_subtitles.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧"}],["meta",{"property":"og:description","content":"从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。 Whisper 是今年 9 月被 OpenAI 开..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-11-18-09-25-29.png \\"whisper 命令\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-11T02:31:57.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"找不到字幕?Whisper 让不懂外语的你也能看懂日剧"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"Whisper"}],["meta",{"property":"article:tag","content":"字幕"}],["meta",{"property":"article:published_time","content":"2022-11-18T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-11T02:31:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"找不到字幕?Whisper 让不懂外语的你也能看懂日剧\\",\\"image\\":[\\"https://img.newzone.top/2022-11-18-09-25-29.png \\\\\\"whisper 命令\\\\\\"\\",\\"https://img.newzone.top/2022-11-18-23-21-25.png \\\\\\"ATP Podcast Search 搜索界面\\\\\\"\\"],\\"datePublished\\":\\"2022-11-18T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-11T02:31:57.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"音视频转录","slug":"音视频转录","link":"#音视频转录","children":[]},{"level":2,"title":"字幕翻译","slug":"字幕翻译","link":"#字幕翻译","children":[]},{"level":2,"title":"Whisper 进阶命令","slug":"whisper-进阶命令","link":"#whisper-进阶命令","children":[{"level":3,"title":"task","slug":"task","link":"#task","children":[]},{"level":3,"title":"language","slug":"language","link":"#language","children":[]},{"level":3,"title":"model","slug":"model","link":"#model","children":[]},{"level":3,"title":"辅助参数","slug":"辅助参数","link":"#辅助参数","children":[]},{"level":3,"title":"幻听参数","slug":"幻听参数","link":"#幻听参数","children":[]}]},{"level":2,"title":"转录成果","slug":"转录成果","link":"#转录成果","children":[]},{"level":2,"title":"其他工具","slug":"其他工具","link":"#其他工具","children":[]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1668932235000,"updatedTime":1696991517000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":13},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":12.12,"words":3636},"filePathRelative":"_posts/2022-11-18-whisper_ai_subtitles.md","localizedDate":"2022年11月18日","excerpt":"

    从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。

    \\n

    Whisper 是今年 9 月被 OpenAI 开源的自动语音识别系统,除了可以用于语音识别,Whisper 还能实现多种语言的转录,并将这些语言翻译成英语。「语言识别」「转录」听起来很高级,但 transcribe(转录)指的是将语音转为文字,Whisper 会为音视频生成带时间轴的字幕文件,是支持 99 种语言 AI 字幕工具

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-32ad112a.8db221da.js b/assets/js/2023-01-26-whiteboard_gtd.html.18799b75.js similarity index 96% rename from assets/js/v-32ad112a.8db221da.js rename to assets/js/2023-01-26-whiteboard_gtd.html.18799b75.js index 60c68b14b..a39a7ba06 100644 --- a/assets/js/v-32ad112a.8db221da.js +++ b/assets/js/2023-01-26-whiteboard_gtd.html.18799b75.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2264],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},1667:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>p,data:()=>r});var n=a(3968);const i=[(0,n.IL)('

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 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)],o={},p=(0,a(9720).c)(o,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,i)}]]),r=JSON.parse('{"path":"/posts/2023-01-26-whiteboard_gtd.html","title":"为什么我把日常任务放回墙上,而不是手机里?","lang":"zh-CN","frontmatter":{"title":"为什么我把日常任务放回墙上,而不是手机里?","date":"2023-01-22T00:00:00.000Z","category":["工具"],"tag":["白板","GTD"],"order":-52,"description":" 摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。 在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-01-26-whiteboard_gtd.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"为什么我把日常任务放回墙上,而不是手机里?"}],["meta",{"property":"og:description","content":" 摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。 在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-27-05-13-50.png \\"源图:Storyset\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-22T11:48:34.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"为什么我把日常任务放回墙上,而不是手机里?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"白板"}],["meta",{"property":"article:tag","content":"GTD"}],["meta",{"property":"article:published_time","content":"2023-01-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-22T11:48:34.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"为什么我把日常任务放回墙上,而不是手机里?\\",\\"image\\":[\\"https://img.newzone.top/2023-01-27-05-13-50.png \\\\\\"源图:Storyset\\\\\\"\\",\\"https://img.newzone.top/2023-01-26-12-28-36.png?imageMogr2/format/webp \\\\\\"透明/白色静电墙贴\\\\\\"\\",\\"https://img.newzone.top/2023-01-25-19-21-12.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-03-20-58-05.png \\\\\\"记录输入流\\\\\\"\\",\\"https://img.newzone.top/2023-01-23-20-58-00.png \\\\\\"书房白板\\\\\\"\\",\\"https://img.newzone.top/2023-01-28-10-42-47.png \\\\\\"PVC 墙贴(非静电)\\\\\\"\\",\\"https://img.newzone.top/2023-01-23-20-53-36.png \\\\\\"走廊白板\\\\\\"\\"],\\"datePublished\\":\\"2023-01-22T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-22T11:48:34.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么是白板?","slug":"为什么是白板","link":"#为什么是白板","children":[]},{"level":2,"title":"白板类型","slug":"白板类型","link":"#白板类型","children":[]},{"level":2,"title":"我的方案","slug":"我的方案","link":"#我的方案","children":[{"level":3,"title":"书房白板","slug":"书房白板","link":"#书房白板","children":[]},{"level":3,"title":"走廊白板","slug":"走廊白板","link":"#走廊白板","children":[]},{"level":3,"title":"电子记录","slug":"电子记录","link":"#电子记录","children":[]}]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]}],"git":{"createdTime":1674742111000,"updatedTime":1697975314000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":4.86,"words":1458},"filePathRelative":"_posts/2023-01-26-whiteboard_gtd.md","localizedDate":"2023年1月22日","excerpt":"
    \\n

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

    \\n
    \\n

    在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

    \\n
    \\"Website
    源图:Storyset
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9366],{3671:(t,e)=>{e.A=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},8290:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>p,data:()=>r});var n=a(7847);const i=[(0,n.Fv)('

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 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)],o={},p=(0,a(3671).A)(o,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,i)}]]),r=JSON.parse('{"path":"/posts/2023-01-26-whiteboard_gtd.html","title":"为什么我把日常任务放回墙上,而不是手机里?","lang":"zh-CN","frontmatter":{"title":"为什么我把日常任务放回墙上,而不是手机里?","date":"2023-01-22T00:00:00.000Z","category":["工具"],"tag":["白板","GTD"],"order":-52,"description":" 摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。 在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-01-26-whiteboard_gtd.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"为什么我把日常任务放回墙上,而不是手机里?"}],["meta",{"property":"og:description","content":" 摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。 在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-27-05-13-50.png \\"源图:Storyset\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-22T11:48:34.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"为什么我把日常任务放回墙上,而不是手机里?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"白板"}],["meta",{"property":"article:tag","content":"GTD"}],["meta",{"property":"article:published_time","content":"2023-01-22T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-22T11:48:34.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"为什么我把日常任务放回墙上,而不是手机里?\\",\\"image\\":[\\"https://img.newzone.top/2023-01-27-05-13-50.png \\\\\\"源图:Storyset\\\\\\"\\",\\"https://img.newzone.top/2023-01-26-12-28-36.png?imageMogr2/format/webp \\\\\\"透明/白色静电墙贴\\\\\\"\\",\\"https://img.newzone.top/2023-01-25-19-21-12.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-03-20-58-05.png \\\\\\"记录输入流\\\\\\"\\",\\"https://img.newzone.top/2023-01-23-20-58-00.png \\\\\\"书房白板\\\\\\"\\",\\"https://img.newzone.top/2023-01-28-10-42-47.png \\\\\\"PVC 墙贴(非静电)\\\\\\"\\",\\"https://img.newzone.top/2023-01-23-20-53-36.png \\\\\\"走廊白板\\\\\\"\\"],\\"datePublished\\":\\"2023-01-22T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-22T11:48:34.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么是白板?","slug":"为什么是白板","link":"#为什么是白板","children":[]},{"level":2,"title":"白板类型","slug":"白板类型","link":"#白板类型","children":[]},{"level":2,"title":"我的方案","slug":"我的方案","link":"#我的方案","children":[{"level":3,"title":"书房白板","slug":"书房白板","link":"#书房白板","children":[]},{"level":3,"title":"走廊白板","slug":"走廊白板","link":"#走廊白板","children":[]},{"level":3,"title":"电子记录","slug":"电子记录","link":"#电子记录","children":[]}]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]}],"git":{"createdTime":1674742111000,"updatedTime":1697975314000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":4.86,"words":1458},"filePathRelative":"_posts/2023-01-26-whiteboard_gtd.md","localizedDate":"2023年1月22日","excerpt":"
    \\n

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

    \\n
    \\n

    在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

    \\n
    \\"Website
    源图:Storyset
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a5f2e3de.012f6165.js b/assets/js/2023-02-27-chatgpt_shortcuts.html.a3f7f80f.js similarity index 88% rename from assets/js/v-a5f2e3de.012f6165.js rename to assets/js/2023-02-27-chatgpt_shortcuts.html.a3f7f80f.js index f0464164e..61c78c355 100644 --- a/assets/js/v-a5f2e3de.012f6165.js +++ b/assets/js/2023-02-27-chatgpt_shortcuts.html.a3f7f80f.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6224],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,r]of e)a[t]=r;return a}},8812:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>G,data:()=>b});var r=a(3968);const n=(0,r.QD)("p",null,"最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。",-1),o={href:"https://platform.openai.com/examples",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/f/awesome-chatgpt-prompts",target:"_blank",rel:"noopener noreferrer"},h={href:"https://learnprompting.org/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.aishort.top",target:"_blank",rel:"noopener noreferrer"},l=(0,r.IL)('

    使用说明

    ChatGPT Shortcut 页面默认显示全部的提示词,页面分为标签区、搜索区和提示词展示区。

    标签筛选

    标签区按提示词的领域和功能进行划分,可根据不同场景和需求进行选择。与标签区右上方的「标签筛选规则切换」按钮配合使用,可进行多标签筛选。默认状态为 OR,即选中标签下的所有提示词。切换到 AND 后,将筛选出具备已选中的多个标签的提示词。

    关键词搜索

    关键词搜索范围包括提示词的标题、简介、内容和中文翻译。输入关键词后,提示词展示区将立即展示筛选出的内容。如果已选中标签,则关键词搜索仅限于标签筛选范围内。对于 PC 端,搜索框内容变化后,新的搜索结果会在 800 毫秒后显示。移动端则为即时刷新。

    展示区复制

    通过标签筛选和关键词搜索,点击卡片右上方的「复制」按钮即可获取提示词,将其粘贴到 ChatGPT 中,参考中文提示调整需求文本,即可得到指定领域的回复。如果提示词中的中文备注没有解释清楚,可以点击提示词的绿色标题查看来源网页。

    语言切换

    默认情况下,提示词内容会显示为英文。如果你想查看中文释义,可以点击提示词内容将其切换到中文,再次点击即可切回英文。请注意,语言切换只在文字上点击有效,点击空白区域无效。中文释义为机器翻译,仅供参考。

    中英文切换
    中英文切换

    如果想让提示词默认显示为中文,你可以点击标签区右上方的 CN 按钮。需要注意的是,即使切换到中文翻译,复制按钮也仅针对英文提示词复制。下方会有解释原因。

    热门排序

    现在页面会显示 Prompt 的使用次数,使用次数排名靠前的 Prompt 将会被标记为「favorite」。同时,Prompt 的标签排序也将以热力值为主。热力值将会定期更新。

    常见问题

    为什么提示词用英文?

    ChatGPT Shortcut 是为方便中文母语人士使用 ChatGPT 而创建的,但是提示词却全部是英文。这是因为相较于中文,ChatGPT 对英文的理解更为出色。即使是国内第一个对话式大型语言模型 MOSS,也承认 MOSS 的英文回答水平比中文高,建议使用英文。(MOSS 已不对外开放)

    使用中文提示词可能会得到不错的结果,但是当你再次输入相同的中文提示时,结果可能与之前大相径庭。因为 ChatGPT 对中文的理解每次都不同,所以建议大家在生产力型提示词的输入中使用英文提示词,以保证输出效果。此外,英文提示词带来的回复也很可能是英文的,你可以在提示词结尾添加 respond in Chinese,将回复指定为中文。

    每次都要输入 Promot?

    API 中可以将提示词设为「system prompt」,这样后续就不需要输入提示词了,ChatGPT 会按照 system prompt 来执行操作。

    在网页版 ChatGPT 中,如果没有切换主提示词,只需用引号将后续回复内容框选即可,这样就不需要每次都输入提示词。当回复内容不符合提示词要求时,说明 ChatGPT 已经忘记了提示词,此时需要重新输入提示词以唤醒它。另外,每个对话的链接都是唯一的,你可以将常用的对话保存为书签,以便日后使用。

    中文搜索延迟

    搜索功能基于 Docusaurus 的 showcase,存在 PC 端中文输入法焦点丢失问题。向 Docusaurus 反馈后,对方表示会尝试修复和 FWIW, you should not be using Chinese anyway, since the showcase is not localized。但问题始终没有解决。因此,我将搜索组件分为移动端和 PC 端两类。移动端搜索逻辑保持不变,而屏幕宽度阈值 768px 以上的 PC 端浏览引入 debounce 函数解决中文输入问题。但这在 PC 端产生两个问题:一是中文输入需在 800 毫秒内完成;二是 PC 端搜索刷新从即时变为 800 毫秒延迟。若你有更好的解决方案,欢迎提供反馈。

    输出虚假信息

    ChatGPT 虽然非常强大,但并不是万能的。有时它会输出虚假信息。例如,当我需要将上百条信息录入到 ChatGPT Shortcut 中时,我让 ChatGPT 按指定格式转换数据。但是在转换过程中,我发现其中一些信息被 ChatGPT 误写。例如,在文本中一条标签是 movie critic,而 ChatGPT 将其更改为 film critic。尽管这在文本中不会造成什么影响,但放在代码中会报错。因此,在使用 ChatGPT 时,务必检查其输出内容。

    提示词不好用

    ',30),s={href:"https://platform.openai.com/examples",target:"_blank",rel:"noopener noreferrer"},c={href:"https://xq7pd3qu17.feishu.cn/share/base/form/shrcnK7oaSPaAcj1YAHfy4jo0Jh",target:"_blank",rel:"noopener noreferrer"},m=(0,r.QD)("p",null,"如果你是进行摘要总结,可以使用 GPT 对原有回答进行再次修正,以提高回答的精度。此外,提示词不仅能用于工作生产,更重要的是帮助你开拓思路、发散思维,从多个角度考虑问题,并解决人们在思考时容易忽略的问题。",-1),g=(0,r.QD)("h2",{id:"为什么执着于-chatgpt",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#为什么执着于-chatgpt"},[(0,r.QD)("span",null,"为什么执着于 ChatGPT?")])],-1),d=(0,r.QD)("p",null,"家人看到我每天把大量时间花在 ChatGPT,实际上并不能理解。因为这看起来跟我的工作关系不大。ChatGPT 帮我节省的时间远少于我的投入,帮我写的代码和文章都需要大幅修改,而查找的资料也基本上只是基础知识,而对于具体的问题我还需要去专业网站进行查询。那么,ChatGPT 究竟有什么用呢?等它成熟了再去使用不好吗?",-1),P=(0,r.QD)("p",null,"但是,我们需要明确的是,使用 ChatGPT 等 AI 工具可以提高我们的工作效率和解放我们的时间,让我们可以更专注于创造性的工作和创新性的思考。比如,ChatGPT 在文章修订、语气转换、语音录入、代码解释、创意思维等方面已经成为我不可或缺的工具。虽然 ChatGPT 目前的功能和表现还有待提高和改进,但它毕竟是未来工具的一部分,是我们不断提高自己和适应未来的必要工具。我相信随着时间的推移,ChatGPT 的表现会越来越优秀,让我们的工作更高效,更具有创造性。",-1),C=(0,r.QD)("h2",{id:"最后",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#最后"},[(0,r.QD)("span",null,"最后")])],-1),f=(0,r.QD)("p",null,"目前,ChatGPT 已经有 1 亿用户,但这仅仅是 80 亿人口中很小的一部分。无论你身处哪个行业,你使用 ChatGPT 都代表着你在行业前沿。尽管你可能认为这看起来似乎与你的行业无关,但使用它就代表着你比别人更早地迈出了这一步,可以探索更多的可能性。",-1),u=(0,r.QD)("p",null,"我并不期待 ChatGPT Shortcut 成为完美的工具,而是希望它能为大家推开使用 AI 的一道门缝。我希望让更多人了解和使用 ChatGPT,摆脱对其聊天机器人的刻板印象,以提高工作效率。因为我相信,在未来,ChatGPT 和其他 AI 工具将扮演越来越重要的角色,成为我们生产力的强大工具。",-1),T={},G=(0,a(9720).c)(T,[["render",function(t,e){const a=(0,r.E1)("ExternalLinkIcon"),T=(0,r.E1)("BiliBili");return(0,r.Wz)(),(0,r.An)("div",null,[n,(0,r.QD)("p",null,[(0,r.mY)("ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 "),(0,r.QD)("a",o,[(0,r.mY)("ChatGPT Prompt Examples"),(0,r.K2)(a)]),(0,r.mY)("、"),(0,r.QD)("a",p,[(0,r.mY)("Awesome ChatGPT Prompts"),(0,r.K2)(a)]),(0,r.mY)("、"),(0,r.QD)("a",h,[(0,r.mY)("Learn Prompting"),(0,r.K2)(a)]),(0,r.mY)(" 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。")]),(0,r.QD)("p",null,[(0,r.mY)("为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 项目。即使是初学者,你只需"),(0,r.QD)("strong",null,[(0,r.mY)("打开 "),(0,r.QD)("a",i,[(0,r.mY)("ChatGPT Shortcut"),(0,r.K2)(a)]),(0,r.mY)(",复制提示词,稍加修改后发送给 ChatGPT")]),(0,r.mY)(",就能获得指定输出,让你的生产力加倍!")]),(0,r.K2)(T,{bvid:"BV1os4y137WH"}),l,(0,r.QD)("p",null,[(0,r.mY)("所有提示词均来自互联网,会定期进行更新。虽然我测试过每一条提示词,但实际效果可能因需求而有所偏差。你可以参考页面和 "),(0,r.QD)("a",s,[(0,r.mY)("ChatGPT Prompt Examples"),(0,r.K2)(a)]),(0,r.mY)(" 进行调整。如果你发现任何错误、有创意的想法或有好的提示词,欢迎"),(0,r.QD)("a",c,[(0,r.mY)("反馈和投稿"),(0,r.K2)(a)]),(0,r.mY)("。")]),m,g,d,P,C,f,u])}]]),b=JSON.parse('{"path":"/posts/2023-02-27-chatgpt_shortcuts.html","title":"为了帮你用好 ChatGPT,我做了一个「咒语库]","lang":"zh-CN","frontmatter":{"title":"为了帮你用好 ChatGPT,我做了一个「咒语库]","date":"2023-02-27T00:00:00.000Z","category":["工具"],"tag":["AI","ChatGPT"],"order":-53,"description":"最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。 ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-02-27-chatgpt_shortcuts.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"为了帮你用好 ChatGPT,我做了一个「咒语库]"}],["meta",{"property":"og:description","content":"最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。 ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-02-28-10-30-20.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-15T03:06:36.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"为了帮你用好 ChatGPT,我做了一个「咒语库]"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"ChatGPT"}],["meta",{"property":"article:published_time","content":"2023-02-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-05-15T03:06:36.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"为了帮你用好 ChatGPT,我做了一个「咒语库]\\",\\"image\\":[\\"https://img.newzone.top/2023-02-28-10-30-20.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-28-10-31-01.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-28-10-31-10.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-28-10-31-19.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/chatgptshortcut_encn.gif\\"],\\"datePublished\\":\\"2023-02-27T00:00:00.000Z\\",\\"dateModified\\":\\"2023-05-15T03:06:36.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"使用说明","slug":"使用说明","link":"#使用说明","children":[{"level":3,"title":"标签筛选","slug":"标签筛选","link":"#标签筛选","children":[]},{"level":3,"title":"关键词搜索","slug":"关键词搜索","link":"#关键词搜索","children":[]},{"level":3,"title":"展示区复制","slug":"展示区复制","link":"#展示区复制","children":[]},{"level":3,"title":"语言切换","slug":"语言切换","link":"#语言切换","children":[]},{"level":3,"title":"热门排序","slug":"热门排序","link":"#热门排序","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"为什么提示词用英文?","slug":"为什么提示词用英文","link":"#为什么提示词用英文","children":[]},{"level":3,"title":"每次都要输入 Promot?","slug":"每次都要输入-promot","link":"#每次都要输入-promot","children":[]},{"level":3,"title":"中文搜索延迟","slug":"中文搜索延迟","link":"#中文搜索延迟","children":[]},{"level":3,"title":"输出虚假信息","slug":"输出虚假信息","link":"#输出虚假信息","children":[]},{"level":3,"title":"提示词不好用","slug":"提示词不好用","link":"#提示词不好用","children":[]}]},{"level":2,"title":"为什么执着于 ChatGPT?","slug":"为什么执着于-chatgpt","link":"#为什么执着于-chatgpt","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1677644474000,"updatedTime":1684119996000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":15}]},"readingTime":{"minutes":8.59,"words":2577},"filePathRelative":"_posts/2023-02-27-chatgpt_shortcuts.md","localizedDate":"2023年2月27日","excerpt":"

    最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。

    \\n

    ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 ChatGPT Prompt ExamplesAwesome ChatGPT PromptsLearn Prompting 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3652],{3671:(t,e)=>{e.A=(t,e)=>{const a=t.__vccOpts||t;for(const[t,r]of e)a[t]=r;return a}},2683:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>G,data:()=>b});var r=a(7847);const n=(0,r.Lk)("p",null,"最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。",-1),o={href:"https://platform.openai.com/examples",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/f/awesome-chatgpt-prompts",target:"_blank",rel:"noopener noreferrer"},h={href:"https://learnprompting.org/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.aishort.top",target:"_blank",rel:"noopener noreferrer"},l=(0,r.Fv)('

    使用说明

    ChatGPT Shortcut 页面默认显示全部的提示词,页面分为标签区、搜索区和提示词展示区。

    标签筛选

    标签区按提示词的领域和功能进行划分,可根据不同场景和需求进行选择。与标签区右上方的「标签筛选规则切换」按钮配合使用,可进行多标签筛选。默认状态为 OR,即选中标签下的所有提示词。切换到 AND 后,将筛选出具备已选中的多个标签的提示词。

    关键词搜索

    关键词搜索范围包括提示词的标题、简介、内容和中文翻译。输入关键词后,提示词展示区将立即展示筛选出的内容。如果已选中标签,则关键词搜索仅限于标签筛选范围内。对于 PC 端,搜索框内容变化后,新的搜索结果会在 800 毫秒后显示。移动端则为即时刷新。

    展示区复制

    通过标签筛选和关键词搜索,点击卡片右上方的「复制」按钮即可获取提示词,将其粘贴到 ChatGPT 中,参考中文提示调整需求文本,即可得到指定领域的回复。如果提示词中的中文备注没有解释清楚,可以点击提示词的绿色标题查看来源网页。

    语言切换

    默认情况下,提示词内容会显示为英文。如果你想查看中文释义,可以点击提示词内容将其切换到中文,再次点击即可切回英文。请注意,语言切换只在文字上点击有效,点击空白区域无效。中文释义为机器翻译,仅供参考。

    中英文切换
    中英文切换

    如果想让提示词默认显示为中文,你可以点击标签区右上方的 CN 按钮。需要注意的是,即使切换到中文翻译,复制按钮也仅针对英文提示词复制。下方会有解释原因。

    热门排序

    现在页面会显示 Prompt 的使用次数,使用次数排名靠前的 Prompt 将会被标记为「favorite」。同时,Prompt 的标签排序也将以热力值为主。热力值将会定期更新。

    常见问题

    为什么提示词用英文?

    ChatGPT Shortcut 是为方便中文母语人士使用 ChatGPT 而创建的,但是提示词却全部是英文。这是因为相较于中文,ChatGPT 对英文的理解更为出色。即使是国内第一个对话式大型语言模型 MOSS,也承认 MOSS 的英文回答水平比中文高,建议使用英文。(MOSS 已不对外开放)

    使用中文提示词可能会得到不错的结果,但是当你再次输入相同的中文提示时,结果可能与之前大相径庭。因为 ChatGPT 对中文的理解每次都不同,所以建议大家在生产力型提示词的输入中使用英文提示词,以保证输出效果。此外,英文提示词带来的回复也很可能是英文的,你可以在提示词结尾添加 respond in Chinese,将回复指定为中文。

    每次都要输入 Promot?

    API 中可以将提示词设为「system prompt」,这样后续就不需要输入提示词了,ChatGPT 会按照 system prompt 来执行操作。

    在网页版 ChatGPT 中,如果没有切换主提示词,只需用引号将后续回复内容框选即可,这样就不需要每次都输入提示词。当回复内容不符合提示词要求时,说明 ChatGPT 已经忘记了提示词,此时需要重新输入提示词以唤醒它。另外,每个对话的链接都是唯一的,你可以将常用的对话保存为书签,以便日后使用。

    中文搜索延迟

    搜索功能基于 Docusaurus 的 showcase,存在 PC 端中文输入法焦点丢失问题。向 Docusaurus 反馈后,对方表示会尝试修复和 FWIW, you should not be using Chinese anyway, since the showcase is not localized。但问题始终没有解决。因此,我将搜索组件分为移动端和 PC 端两类。移动端搜索逻辑保持不变,而屏幕宽度阈值 768px 以上的 PC 端浏览引入 debounce 函数解决中文输入问题。但这在 PC 端产生两个问题:一是中文输入需在 800 毫秒内完成;二是 PC 端搜索刷新从即时变为 800 毫秒延迟。若你有更好的解决方案,欢迎提供反馈。

    输出虚假信息

    ChatGPT 虽然非常强大,但并不是万能的。有时它会输出虚假信息。例如,当我需要将上百条信息录入到 ChatGPT Shortcut 中时,我让 ChatGPT 按指定格式转换数据。但是在转换过程中,我发现其中一些信息被 ChatGPT 误写。例如,在文本中一条标签是 movie critic,而 ChatGPT 将其更改为 film critic。尽管这在文本中不会造成什么影响,但放在代码中会报错。因此,在使用 ChatGPT 时,务必检查其输出内容。

    提示词不好用

    ',30),s={href:"https://platform.openai.com/examples",target:"_blank",rel:"noopener noreferrer"},c={href:"https://xq7pd3qu17.feishu.cn/share/base/form/shrcnK7oaSPaAcj1YAHfy4jo0Jh",target:"_blank",rel:"noopener noreferrer"},g=(0,r.Lk)("p",null,"如果你是进行摘要总结,可以使用 GPT 对原有回答进行再次修正,以提高回答的精度。此外,提示词不仅能用于工作生产,更重要的是帮助你开拓思路、发散思维,从多个角度考虑问题,并解决人们在思考时容易忽略的问题。",-1),m=(0,r.Lk)("h2",{id:"为什么执着于-chatgpt",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#为什么执着于-chatgpt"},[(0,r.Lk)("span",null,"为什么执着于 ChatGPT?")])],-1),d=(0,r.Lk)("p",null,"家人看到我每天把大量时间花在 ChatGPT,实际上并不能理解。因为这看起来跟我的工作关系不大。ChatGPT 帮我节省的时间远少于我的投入,帮我写的代码和文章都需要大幅修改,而查找的资料也基本上只是基础知识,而对于具体的问题我还需要去专业网站进行查询。那么,ChatGPT 究竟有什么用呢?等它成熟了再去使用不好吗?",-1),P=(0,r.Lk)("p",null,"但是,我们需要明确的是,使用 ChatGPT 等 AI 工具可以提高我们的工作效率和解放我们的时间,让我们可以更专注于创造性的工作和创新性的思考。比如,ChatGPT 在文章修订、语气转换、语音录入、代码解释、创意思维等方面已经成为我不可或缺的工具。虽然 ChatGPT 目前的功能和表现还有待提高和改进,但它毕竟是未来工具的一部分,是我们不断提高自己和适应未来的必要工具。我相信随着时间的推移,ChatGPT 的表现会越来越优秀,让我们的工作更高效,更具有创造性。",-1),C=(0,r.Lk)("h2",{id:"最后",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#最后"},[(0,r.Lk)("span",null,"最后")])],-1),u=(0,r.Lk)("p",null,"目前,ChatGPT 已经有 1 亿用户,但这仅仅是 80 亿人口中很小的一部分。无论你身处哪个行业,你使用 ChatGPT 都代表着你在行业前沿。尽管你可能认为这看起来似乎与你的行业无关,但使用它就代表着你比别人更早地迈出了这一步,可以探索更多的可能性。",-1),f=(0,r.Lk)("p",null,"我并不期待 ChatGPT Shortcut 成为完美的工具,而是希望它能为大家推开使用 AI 的一道门缝。我希望让更多人了解和使用 ChatGPT,摆脱对其聊天机器人的刻板印象,以提高工作效率。因为我相信,在未来,ChatGPT 和其他 AI 工具将扮演越来越重要的角色,成为我们生产力的强大工具。",-1),T={},G=(0,a(3671).A)(T,[["render",function(t,e){const a=(0,r.g2)("ExternalLinkIcon"),T=(0,r.g2)("BiliBili");return(0,r.uX)(),(0,r.CE)("div",null,[n,(0,r.Lk)("p",null,[(0,r.eW)("ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 "),(0,r.Lk)("a",o,[(0,r.eW)("ChatGPT Prompt Examples"),(0,r.bF)(a)]),(0,r.eW)("、"),(0,r.Lk)("a",p,[(0,r.eW)("Awesome ChatGPT Prompts"),(0,r.bF)(a)]),(0,r.eW)("、"),(0,r.Lk)("a",h,[(0,r.eW)("Learn Prompting"),(0,r.bF)(a)]),(0,r.eW)(" 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。")]),(0,r.Lk)("p",null,[(0,r.eW)("为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 项目。即使是初学者,你只需"),(0,r.Lk)("strong",null,[(0,r.eW)("打开 "),(0,r.Lk)("a",i,[(0,r.eW)("ChatGPT Shortcut"),(0,r.bF)(a)]),(0,r.eW)(",复制提示词,稍加修改后发送给 ChatGPT")]),(0,r.eW)(",就能获得指定输出,让你的生产力加倍!")]),(0,r.bF)(T,{bvid:"BV1os4y137WH"}),l,(0,r.Lk)("p",null,[(0,r.eW)("所有提示词均来自互联网,会定期进行更新。虽然我测试过每一条提示词,但实际效果可能因需求而有所偏差。你可以参考页面和 "),(0,r.Lk)("a",s,[(0,r.eW)("ChatGPT Prompt Examples"),(0,r.bF)(a)]),(0,r.eW)(" 进行调整。如果你发现任何错误、有创意的想法或有好的提示词,欢迎"),(0,r.Lk)("a",c,[(0,r.eW)("反馈和投稿"),(0,r.bF)(a)]),(0,r.eW)("。")]),g,m,d,P,C,u,f])}]]),b=JSON.parse('{"path":"/posts/2023-02-27-chatgpt_shortcuts.html","title":"为了帮你用好 ChatGPT,我做了一个「咒语库]","lang":"zh-CN","frontmatter":{"title":"为了帮你用好 ChatGPT,我做了一个「咒语库]","date":"2023-02-27T00:00:00.000Z","category":["工具"],"tag":["AI","ChatGPT"],"order":-53,"description":"最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。 ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-02-27-chatgpt_shortcuts.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"为了帮你用好 ChatGPT,我做了一个「咒语库]"}],["meta",{"property":"og:description","content":"最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。 ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-02-28-10-30-20.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-15T03:06:36.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"为了帮你用好 ChatGPT,我做了一个「咒语库]"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"ChatGPT"}],["meta",{"property":"article:published_time","content":"2023-02-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-05-15T03:06:36.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"为了帮你用好 ChatGPT,我做了一个「咒语库]\\",\\"image\\":[\\"https://img.newzone.top/2023-02-28-10-30-20.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-28-10-31-01.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-28-10-31-10.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-02-28-10-31-19.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/chatgptshortcut_encn.gif\\"],\\"datePublished\\":\\"2023-02-27T00:00:00.000Z\\",\\"dateModified\\":\\"2023-05-15T03:06:36.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"使用说明","slug":"使用说明","link":"#使用说明","children":[{"level":3,"title":"标签筛选","slug":"标签筛选","link":"#标签筛选","children":[]},{"level":3,"title":"关键词搜索","slug":"关键词搜索","link":"#关键词搜索","children":[]},{"level":3,"title":"展示区复制","slug":"展示区复制","link":"#展示区复制","children":[]},{"level":3,"title":"语言切换","slug":"语言切换","link":"#语言切换","children":[]},{"level":3,"title":"热门排序","slug":"热门排序","link":"#热门排序","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"为什么提示词用英文?","slug":"为什么提示词用英文","link":"#为什么提示词用英文","children":[]},{"level":3,"title":"每次都要输入 Promot?","slug":"每次都要输入-promot","link":"#每次都要输入-promot","children":[]},{"level":3,"title":"中文搜索延迟","slug":"中文搜索延迟","link":"#中文搜索延迟","children":[]},{"level":3,"title":"输出虚假信息","slug":"输出虚假信息","link":"#输出虚假信息","children":[]},{"level":3,"title":"提示词不好用","slug":"提示词不好用","link":"#提示词不好用","children":[]}]},{"level":2,"title":"为什么执着于 ChatGPT?","slug":"为什么执着于-chatgpt","link":"#为什么执着于-chatgpt","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1677644474000,"updatedTime":1684119996000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":15}]},"readingTime":{"minutes":8.59,"words":2577},"filePathRelative":"_posts/2023-02-27-chatgpt_shortcuts.md","localizedDate":"2023年2月27日","excerpt":"

    最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。

    \\n

    ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 ChatGPT Prompt ExamplesAwesome ChatGPT PromptsLearn Prompting 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0b82596b.3e5b3c71.js b/assets/js/2023-03-31-efficient_morning_5am_club.html.5571bb36.js similarity index 94% rename from assets/js/v-0b82596b.3e5b3c71.js rename to assets/js/2023-03-31-efficient_morning_5am_club.html.5571bb36.js index f1d34bf82..45e5b29e0 100644 --- a/assets/js/v-0b82596b.3e5b3c71.js +++ b/assets/js/2023-03-31-efficient_morning_5am_club.html.5571bb36.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9480],{9720:(n,a)=>{a.c=(n,a)=>{const e=n.__vccOpts||n;for(const[n,t]of a)e[n]=t;return e}},4200:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>f,data:()=>k});var t=e(3968);const s=(0,t.IL)('

    失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何况早上 5 点起床呢?即使成功在 5 点起床,我又如何保证自己的状态?如何保证可以高效地学习和工作呢?但当时我正处于效率低谷,总是被其他事情干扰,作息时间完全被打乱。迷信理论的我,只能去相信它。因此,我结合心流理论制定了自己的「5AM Club」计划。

    5AM Club 计划

    1. 早上 5 点起床,使用手环震动闹钟。
    2. 泡杯咖啡,准备早餐,开始第一个工作番茄。
    3. 工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。
    4. 每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。
    5. 晚上 10 点睡觉,保证充足的睡眠时间。
    图源:Storyset

    执行计划一个月后,我在早晨完成了以下事项:读完了 6 本书;推出开源项目 ChatGPT Shortcut,整合了 200 个 prompts 并将 ChatGPT 融入我的日常工作中;从零开始熟悉了 Docusaurus,对 10 个页面组件进行了魔改,并顺利将三个工作网站迁移到了 Docusaurus 上。而几年前,我使用国内一个商用模板花费整整一个月的时间才建成了公司官网。

    5AM Club 给我的效率带来了显著提升。接下来,我将分享 5AM Club 的理论以及我的个人心得。

    5 点的奥秘

    5 点起,身体受得了吗?

    5AM Club 最大的误解,可能是睡眠时间被减少了。5 点起床可能确实减少了睡眠时间,但它也会强迫我们早睡从而提高睡眠质量

    充足的睡眠对于 5AM Club 至关重要,否则谈何高效率工作。睡眠时间至少要保证 6 小时以上。为了能在早上 5 点起床,晚上 9 点半就需要上床,10 点入睡。初开始,生物钟可能无法立即调整到 10 点入睡,可以以半小时为单位逐渐调整。或者提前上床,我刚开始实行 5AM Club 时通常晚上 8 点就上床做准备,强迫自己提早入睡。晚八点入睡会让你在凌晨三点左右醒来,但依旧比晚睡早起要好。当你养成了早睡的习惯后,最后再把就寝时间调整到 10 点则容易得多。

    研究人员发现学生的平均睡眠时间是 6.5 小时。研究人员还发现,睡眠不足 6 小时的学生成绩明显下降,每减少一小时睡眠期末 GPA 分数降 0.07。研究人员称,睡眠不足的负面影响是难以消除的,它会持续存在,五到九周后睡眠不足可能会影响学生在课堂上的学习能力。[1]

    之前,我睡眠时间为凌晨一点到早上九点,总共有八个小时。然而,我的睡眠质量并不高,手环得分只有 75-85 分。后来,我改变了睡眠作息时间,每晚十点准时睡觉,睡眠时间减少到七个小时,而手环得分始终保持在 90 分以上。

    睡眠时间对比

    为什么 5 点起?做什么?

    虽然名字是 5AM Club,但我一般都早于 5 点起床,具体时间根据自身情况自由调节。有时候如果比较疲劳,我晚上 8 点就上床睡觉,早上 2、3 点醒来,然后开始进入当天的工作。偶尔一两次睡眠不足并不会对身体造成多大的影响,不用过于焦虑。

    早上 5 点到 8 点是我留给自己的完全属于自己的时间块,用来处理那些对自己来说重要且长期能产生重大影响的任务。我选择将它安排在早上 5 点是因为这时的精力最佳,也没有其他人的干扰,能让我在一天开始之前拥有完全属于自己的时间。相比之下,晚上的效率较低。

    当天早上要做的事要提前计划并做好准备,这样能够持续不断地、不受干扰地进行工作。最重要的是,要把精力集中在你负责的最重要的工作上。可以专注于个人项目,例如阅读、写作、考证和你特别想做的事情。早起时间不应该用于处理邮件和微信等日常性任务。这类任务虽然占用时间短,但却占用心力。

    图源:Storyset

    最近 Facebook 进行了第二轮大裁员,扎克伯格表示:「自从我们去年裁员以来,一个令人惊讶的结果是许多事情进展得更快了。」员工减少了,项目反而进展更快了?他的解释是,裁员使公司取消了许多低优先级的项目,集中资源于最重要的事情上。不做日常任务的原因也类似于此,不要将自己的宝贵精力浪费在日常任务上。如果你在 5AM Club 的时间内处理日常性任务,那么早起也就没有什么必要了。此外,如果你已经有属于自己的整块时间,也没有必要特意早起。

    工作前的准备

    大脑唤醒

    根据《心流管理魔方》的介绍,血压、血糖和血氧是保持心流的基础。[2] 开始晨间的高效学习/工作前,可以做以下准备:

    • 血压:1-2 分钟 HIIT(高强度间歇性运动),让心率达到 130。或是在工作番茄的间隙,进行俯卧撑、拉伸等轻量运动。

    • 血糖:早上起床后,优先吃早餐,预防性进食以补充能量。工作过程中每隔 2 个小时加餐一次,比如酸奶、坚果、水果等。

    • 血氧:大脑的高效运转同样需要充足的氧气。我在书桌旁放了一支瓶装氧气(非必须),起床后吸一大口氧气,让自己进入清醒状态。

    • 口算:心流开始前,可通过口算、思考进行大脑热身。下方是我用 AutoHotkey 编写的随机口算题。

      Random, num1, 0, 10\nRandom, num2, 0, 10\nRandom, num3, 0, 10\nRandom, num4, 0, 10\nRandom, num5, 0, 10\nRandom, num6, 10, 100\nMsgBox, 262148, , %num1%x%num2%= `n%num3%x%num4%= `n%num5%x%num6%=\n

    打卡监督

    朋友圈打卡是为了增加自我监督。这就跟自习直播和自我监控视频一样,都是为了增加自己行为的透明度,让外界了解自己的行动。此外,通过照片数量来统计打卡频次,可以方便进行事后总结,同时也能增加自身的成就感。我不喜欢打卡应用,通过应用来打卡是一件很累的事情,因为它们会不断提醒你的错过,这会给你带来压力。我之前买过 Habitity,但现在已经不用了。

    打卡照片,总被认为是同一张

    为了减轻负担,我通常只拍书房外街道的照片进行日常打卡,并且没有加上文字。由于每天都是类似的照片,经常会有人问我「你为什么总是发一张照片?」对此,我只能尽量改变拍摄角度,让它看起来不完全一样。此外,每隔一段时间,我会对最近的学习和工作成果进行阶段性总结,并在打卡中进行展示。

    如果你不喜欢发朋友圈,那么可以将照片仅用作自我记录,不要因为打卡而给自己增加负担。

    工作时间安排

    我使用番茄工作法来安排时间。将任务分解成 25 分钟的小任务,并在每个任务之间休息 5 分钟,这种工作方式可以让你更专注于手头的任务,并在短时间内保持高效的工作状态。工作 25 分钟后休息 5 分钟,工作时间可以适当延长,但不要超过 1 小时。根据统计,大部分强脑力工作者的专注时间平均为 53 分钟。过于追求长时间工作会降低工作效率。

    刚开始 5AM Club 时,我一连工作几个小时,到了下午就会变得极度疲惫,没精力继续工作。现在,我工作 25 分钟,就会强制自己休息 5 分钟。这样一天的精力都得到了很好的保持。

    不是所有工作都是紧急的。放下工作休息一会儿,不会对工作有多大的影响。你想想,很多情况下,是你自己给自己施加了过多的压力吧?

    工作很重要,但休息同样重要。虽然有时需要处理紧急工作,但不是每项工作都需要立即处理。对身体来说,一整天都紧绷着高效运转,也许一两个月还能勉强支撑,但如果长期坚持高强度工作,身体肯定会受不了,精力也会下降。工作间隙让自己休息几分钟,会让你的精力得到良好的补充。通常我早上工作后和下午会进行半小时的小憩,用按摩椅和按摩眼罩来缓解身体的疲劳。

    休息清单

    ',34),o=(0,t.QD)("strong",null,"2-3 个事项",-1),l={href:"https://newzone.top/posts/2023-01-26-whiteboard_gtd.html",target:"_blank",rel:"noopener noreferrer"},i=(0,t.IL)('
    - 做早餐\n- 洗杯子\n- 倒水、喝水……\n- 吃点东西\n- 简单整理一下桌面\n- 眺望远方\n- 听/唱一首你喜欢的音乐\n- 上厕所\n- 在走廊里溜达\n- 哑铃\n- 做一下拉伸动作\n- 做 3 个深呼吸\n

    下午的疲劳

    高效的学习工作也会带来较大的精神消耗。就像 @Dsmileyi 曾问我的:「会不会因为起来的早并且已经工作了一段时间,导致白天工作的时候感到疲惫,降低效率?」与早晨相比,下午的精力会减少不少。因此,我将 90% 的工作时间放在早上

    在过去,我工作时间超过 8 小时,从早上 9 点一直工作到晚上 9 点,但期间不断受到干扰,导致工作成果不多。现在,每天只有 4-6 小时的全力工作时间,但工作成果相当于之前三天的量。虽然下午效率降低了,但整体而言,这是值得的。

    值得一提的是,在新的作息时间中,休息和娱乐不再让我感到愧疚。到了下午,我会放松一下,可以做家务、锻炼或者娱乐,想做什么就做什么。而以前,如果我在白天工作时间内偷懒摸鱼,我会感到内疚,然后把这种负面情绪带到工作中,给自己的心理造成负担。

    图源:Storyset

    晚上十点睡觉

    如何在晚上十点入睡?这对于很多人来说是一个奢望,尤其是当你已经出现了失眠症状后,更加难以实现。一开始,为了能早睡,我得强迫自己在晚上八点上床,这样才能在晚上十点入睡。然而,绝大多数人都有着自己的工作,很难控制自己的上床时间。

    在执行 5AM Club 计划的过程中,我们无需过于强求精准的作息时间,也不要担心偶尔的早起失败。关键在于逐步养成这个习惯,从而提高生活质量和工作效率。如果你认为自己暂时做不到在晚上十点前入睡,那就将早上五点起床顺延到六点或七点,逐步调整你的生活习惯,直到养成早起的习惯。

    最后

    本文的心流部分设计参考了少数派的《心流管理魔方》栏目,而时间管理部分则受到了《吃掉那只青蛙》的启发。如果你感兴趣,建议完整阅读它们。

    我实施 5AM Club 计划一个月以来,生活和工作效率得到了显著提高。通过早起,我得到了宝贵的属于自己的时间块,用来处理那些对自己来说重要且长期能产生重大影响的任务。同时,我调整了作息时间,优化了睡眠质量。在工作时间安排上,采用番茄工作法,让我保持高效工作状态的同时,确保了充足的休息。不过,睡眠和个人的习惯/体质密切相关,夜型人请慎重执行,随便尝试可能会把自己弄得更混乱。

    虽然 5AM Club 并非人人都适用,但它确实帮助我从失眠问题中走出来,提高了工作和学习效率。我相信,只要你能找到适合自己的方法和节奏,你也可以通过早起和合理安排时间,实现从失眠到高效早晨的转变。希望我的 5AM Club 计划分享对你有所启发,祝你早晨愉快、充满活力!


    ',14),p={class:"footnotes"},r={class:"footnotes-list"},c={id:"footnote1",class:"footnote-item"},u={href:"https://www.solidot.org/story?sid=74167",target:"_blank",rel:"noopener noreferrer"},m=(0,t.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),d={id:"footnote2",class:"footnote-item"},g={href:"https://sspai.com/post/77435",target:"_blank",rel:"noopener noreferrer"},h=(0,t.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),b={},f=(0,e(9720).c)(b,[["render",function(n,a){const e=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[s,(0,t.QD)("p",null,[(0,t.mY)("为了让你始终保持放松,无需费心思考休息时要做什么,你可以参考下面的列表,制定一份适合自己的休息清单,并将其打印并放在桌边。需要休息时,从清单中挑选 "),o,(0,t.mY)("执行即可。我把我的休息清单记录在书房白板上,这样方便随时查看。这个方案之前在《"),(0,t.QD)("a",l,[(0,t.mY)("用白板墙贴记录日常生活"),(0,t.K2)(e)]),(0,t.mY)("》一文中有详细介绍。")]),i,(0,t.QD)("section",p,[(0,t.QD)("ol",r,[(0,t.QD)("li",c,[(0,t.QD)("p",null,[(0,t.QD)("a",u,[(0,t.mY)("研究发现睡眠时间低于六小时会影响学习成绩"),(0,t.K2)(e)]),(0,t.mY)(),m])]),(0,t.QD)("li",d,[(0,t.QD)("p",null,[(0,t.QD)("a",g,[(0,t.mY)("04 保持心流 - 心流管理魔方"),(0,t.K2)(e)]),(0,t.mY)(),h])])])])])}]]),k=JSON.parse('{"path":"/posts/2023-03-31-efficient_morning_5am_club.html","title":"从失眠到高效早晨:我的 5AM Club 计划分享","lang":"zh-CN","frontmatter":{"title":"从失眠到高效早晨:我的 5AM Club 计划分享","date":"2023-03-31T00:00:00.000Z","category":["头脑驿站"],"tag":["时间","工作流"],"order":-54,"description":"失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-03-31-efficient_morning_5am_club.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"从失眠到高效早晨:我的 5AM Club 计划分享"}],["meta",{"property":"og:description","content":"失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-04-07-17-19-27.png?imageMogr2/thumbnail/500x \\"图源:Storyset\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"从失眠到高效早晨:我的 5AM Club 计划分享"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"时间"}],["meta",{"property":"article:tag","content":"工作流"}],["meta",{"property":"article:published_time","content":"2023-03-31T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从失眠到高效早晨:我的 5AM Club 计划分享\\",\\"image\\":[\\"https://img.newzone.top/2023-04-07-17-19-27.png?imageMogr2/thumbnail/500x \\\\\\"图源:Storyset\\\\\\"\\",\\"https://img.newzone.top/2023-03-31-11-23-57.png?imageMogr2/thumbnail/500x \\\\\\"睡眠时间对比\\\\\\"\\",\\"https://img.newzone.top/2023-04-07-17-20-19.png?imageMogr2/thumbnail/500x \\\\\\"图源:Storyset\\\\\\"\\",\\"https://img.newzone.top/2023-03-31-16-15-42.jpg?imageMogr2/thumbnail/500x/format/webp \\\\\\"打卡照片,总被认为是同一张\\\\\\"\\",\\"https://img.newzone.top/2023-04-07-17-20-58.png?imageMogr2/thumbnail/500x \\\\\\"图源:Storyset\\\\\\"\\"],\\"datePublished\\":\\"2023-03-31T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"5 点的奥秘","slug":"_5-点的奥秘","link":"#_5-点的奥秘","children":[{"level":3,"title":"5 点起,身体受得了吗?","slug":"_5-点起-身体受得了吗","link":"#_5-点起-身体受得了吗","children":[]},{"level":3,"title":"为什么 5 点起?做什么?","slug":"为什么-5-点起-做什么","link":"#为什么-5-点起-做什么","children":[]}]},{"level":2,"title":"工作前的准备","slug":"工作前的准备","link":"#工作前的准备","children":[{"level":3,"title":"大脑唤醒","slug":"大脑唤醒","link":"#大脑唤醒","children":[]},{"level":3,"title":"打卡监督","slug":"打卡监督","link":"#打卡监督","children":[]}]},{"level":2,"title":"工作时间安排","slug":"工作时间安排","link":"#工作时间安排","children":[]},{"level":2,"title":"休息清单","slug":"休息清单","link":"#休息清单","children":[]},{"level":2,"title":"下午的疲劳","slug":"下午的疲劳","link":"#下午的疲劳","children":[]},{"level":2,"title":"晚上十点睡觉","slug":"晚上十点睡觉","link":"#晚上十点睡觉","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1680225472000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":12.24,"words":3671},"filePathRelative":"_posts/2023-03-31-efficient_morning_5am_club.md","localizedDate":"2023年3月31日","excerpt":"

    失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何况早上 5 点起床呢?即使成功在 5 点起床,我又如何保证自己的状态?如何保证可以高效地学习和工作呢?但当时我正处于效率低谷,总是被其他事情干扰,作息时间完全被打乱。迷信理论的我,只能去相信它。因此,我结合心流理论制定了自己的「5AM Club」计划。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5974],{3671:(n,a)=>{a.A=(n,a)=>{const e=n.__vccOpts||n;for(const[n,t]of a)e[n]=t;return e}},3791:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>k,data:()=>f});var t=e(7847);const s=(0,t.Fv)('

    失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何况早上 5 点起床呢?即使成功在 5 点起床,我又如何保证自己的状态?如何保证可以高效地学习和工作呢?但当时我正处于效率低谷,总是被其他事情干扰,作息时间完全被打乱。迷信理论的我,只能去相信它。因此,我结合心流理论制定了自己的「5AM Club」计划。

    5AM Club 计划

    1. 早上 5 点起床,使用手环震动闹钟。
    2. 泡杯咖啡,准备早餐,开始第一个工作番茄。
    3. 工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。
    4. 每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。
    5. 晚上 10 点睡觉,保证充足的睡眠时间。
    图源:Storyset

    执行计划一个月后,我在早晨完成了以下事项:读完了 6 本书;推出开源项目 ChatGPT Shortcut,整合了 200 个 prompts 并将 ChatGPT 融入我的日常工作中;从零开始熟悉了 Docusaurus,对 10 个页面组件进行了魔改,并顺利将三个工作网站迁移到了 Docusaurus 上。而几年前,我使用国内一个商用模板花费整整一个月的时间才建成了公司官网。

    5AM Club 给我的效率带来了显著提升。接下来,我将分享 5AM Club 的理论以及我的个人心得。

    5 点的奥秘

    5 点起,身体受得了吗?

    5AM Club 最大的误解,可能是睡眠时间被减少了。5 点起床可能确实减少了睡眠时间,但它也会强迫我们早睡从而提高睡眠质量

    充足的睡眠对于 5AM Club 至关重要,否则谈何高效率工作。睡眠时间至少要保证 6 小时以上。为了能在早上 5 点起床,晚上 9 点半就需要上床,10 点入睡。初开始,生物钟可能无法立即调整到 10 点入睡,可以以半小时为单位逐渐调整。或者提前上床,我刚开始实行 5AM Club 时通常晚上 8 点就上床做准备,强迫自己提早入睡。晚八点入睡会让你在凌晨三点左右醒来,但依旧比晚睡早起要好。当你养成了早睡的习惯后,最后再把就寝时间调整到 10 点则容易得多。

    研究人员发现学生的平均睡眠时间是 6.5 小时。研究人员还发现,睡眠不足 6 小时的学生成绩明显下降,每减少一小时睡眠期末 GPA 分数降 0.07。研究人员称,睡眠不足的负面影响是难以消除的,它会持续存在,五到九周后睡眠不足可能会影响学生在课堂上的学习能力。[1]

    之前,我睡眠时间为凌晨一点到早上九点,总共有八个小时。然而,我的睡眠质量并不高,手环得分只有 75-85 分。后来,我改变了睡眠作息时间,每晚十点准时睡觉,睡眠时间减少到七个小时,而手环得分始终保持在 90 分以上。

    睡眠时间对比

    为什么 5 点起?做什么?

    虽然名字是 5AM Club,但我一般都早于 5 点起床,具体时间根据自身情况自由调节。有时候如果比较疲劳,我晚上 8 点就上床睡觉,早上 2、3 点醒来,然后开始进入当天的工作。偶尔一两次睡眠不足并不会对身体造成多大的影响,不用过于焦虑。

    早上 5 点到 8 点是我留给自己的完全属于自己的时间块,用来处理那些对自己来说重要且长期能产生重大影响的任务。我选择将它安排在早上 5 点是因为这时的精力最佳,也没有其他人的干扰,能让我在一天开始之前拥有完全属于自己的时间。相比之下,晚上的效率较低。

    当天早上要做的事要提前计划并做好准备,这样能够持续不断地、不受干扰地进行工作。最重要的是,要把精力集中在你负责的最重要的工作上。可以专注于个人项目,例如阅读、写作、考证和你特别想做的事情。早起时间不应该用于处理邮件和微信等日常性任务。这类任务虽然占用时间短,但却占用心力。

    图源:Storyset

    最近 Facebook 进行了第二轮大裁员,扎克伯格表示:「自从我们去年裁员以来,一个令人惊讶的结果是许多事情进展得更快了。」员工减少了,项目反而进展更快了?他的解释是,裁员使公司取消了许多低优先级的项目,集中资源于最重要的事情上。不做日常任务的原因也类似于此,不要将自己的宝贵精力浪费在日常任务上。如果你在 5AM Club 的时间内处理日常性任务,那么早起也就没有什么必要了。此外,如果你已经有属于自己的整块时间,也没有必要特意早起。

    工作前的准备

    大脑唤醒

    根据《心流管理魔方》的介绍,血压、血糖和血氧是保持心流的基础。[2] 开始晨间的高效学习/工作前,可以做以下准备:

    • 血压:1-2 分钟 HIIT(高强度间歇性运动),让心率达到 130。或是在工作番茄的间隙,进行俯卧撑、拉伸等轻量运动。

    • 血糖:早上起床后,优先吃早餐,预防性进食以补充能量。工作过程中每隔 2 个小时加餐一次,比如酸奶、坚果、水果等。

    • 血氧:大脑的高效运转同样需要充足的氧气。我在书桌旁放了一支瓶装氧气(非必须),起床后吸一大口氧气,让自己进入清醒状态。

    • 口算:心流开始前,可通过口算、思考进行大脑热身。下方是我用 AutoHotkey 编写的随机口算题。

      Random, num1, 0, 10\nRandom, num2, 0, 10\nRandom, num3, 0, 10\nRandom, num4, 0, 10\nRandom, num5, 0, 10\nRandom, num6, 10, 100\nMsgBox, 262148, , %num1%x%num2%= `n%num3%x%num4%= `n%num5%x%num6%=\n

    打卡监督

    朋友圈打卡是为了增加自我监督。这就跟自习直播和自我监控视频一样,都是为了增加自己行为的透明度,让外界了解自己的行动。此外,通过照片数量来统计打卡频次,可以方便进行事后总结,同时也能增加自身的成就感。我不喜欢打卡应用,通过应用来打卡是一件很累的事情,因为它们会不断提醒你的错过,这会给你带来压力。我之前买过 Habitity,但现在已经不用了。

    打卡照片,总被认为是同一张

    为了减轻负担,我通常只拍书房外街道的照片进行日常打卡,并且没有加上文字。由于每天都是类似的照片,经常会有人问我「你为什么总是发一张照片?」对此,我只能尽量改变拍摄角度,让它看起来不完全一样。此外,每隔一段时间,我会对最近的学习和工作成果进行阶段性总结,并在打卡中进行展示。

    如果你不喜欢发朋友圈,那么可以将照片仅用作自我记录,不要因为打卡而给自己增加负担。

    工作时间安排

    我使用番茄工作法来安排时间。将任务分解成 25 分钟的小任务,并在每个任务之间休息 5 分钟,这种工作方式可以让你更专注于手头的任务,并在短时间内保持高效的工作状态。工作 25 分钟后休息 5 分钟,工作时间可以适当延长,但不要超过 1 小时。根据统计,大部分强脑力工作者的专注时间平均为 53 分钟。过于追求长时间工作会降低工作效率。

    刚开始 5AM Club 时,我一连工作几个小时,到了下午就会变得极度疲惫,没精力继续工作。现在,我工作 25 分钟,就会强制自己休息 5 分钟。这样一天的精力都得到了很好的保持。

    不是所有工作都是紧急的。放下工作休息一会儿,不会对工作有多大的影响。你想想,很多情况下,是你自己给自己施加了过多的压力吧?

    工作很重要,但休息同样重要。虽然有时需要处理紧急工作,但不是每项工作都需要立即处理。对身体来说,一整天都紧绷着高效运转,也许一两个月还能勉强支撑,但如果长期坚持高强度工作,身体肯定会受不了,精力也会下降。工作间隙让自己休息几分钟,会让你的精力得到良好的补充。通常我早上工作后和下午会进行半小时的小憩,用按摩椅和按摩眼罩来缓解身体的疲劳。

    休息清单

    ',34),o=(0,t.Lk)("strong",null,"2-3 个事项",-1),l={href:"https://newzone.top/posts/2023-01-26-whiteboard_gtd.html",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Fv)('
    - 做早餐\n- 洗杯子\n- 倒水、喝水……\n- 吃点东西\n- 简单整理一下桌面\n- 眺望远方\n- 听/唱一首你喜欢的音乐\n- 上厕所\n- 在走廊里溜达\n- 哑铃\n- 做一下拉伸动作\n- 做 3 个深呼吸\n

    下午的疲劳

    高效的学习工作也会带来较大的精神消耗。就像 @Dsmileyi 曾问我的:「会不会因为起来的早并且已经工作了一段时间,导致白天工作的时候感到疲惫,降低效率?」与早晨相比,下午的精力会减少不少。因此,我将 90% 的工作时间放在早上

    在过去,我工作时间超过 8 小时,从早上 9 点一直工作到晚上 9 点,但期间不断受到干扰,导致工作成果不多。现在,每天只有 4-6 小时的全力工作时间,但工作成果相当于之前三天的量。虽然下午效率降低了,但整体而言,这是值得的。

    值得一提的是,在新的作息时间中,休息和娱乐不再让我感到愧疚。到了下午,我会放松一下,可以做家务、锻炼或者娱乐,想做什么就做什么。而以前,如果我在白天工作时间内偷懒摸鱼,我会感到内疚,然后把这种负面情绪带到工作中,给自己的心理造成负担。

    图源:Storyset

    晚上十点睡觉

    如何在晚上十点入睡?这对于很多人来说是一个奢望,尤其是当你已经出现了失眠症状后,更加难以实现。一开始,为了能早睡,我得强迫自己在晚上八点上床,这样才能在晚上十点入睡。然而,绝大多数人都有着自己的工作,很难控制自己的上床时间。

    在执行 5AM Club 计划的过程中,我们无需过于强求精准的作息时间,也不要担心偶尔的早起失败。关键在于逐步养成这个习惯,从而提高生活质量和工作效率。如果你认为自己暂时做不到在晚上十点前入睡,那就将早上五点起床顺延到六点或七点,逐步调整你的生活习惯,直到养成早起的习惯。

    最后

    本文的心流部分设计参考了少数派的《心流管理魔方》栏目,而时间管理部分则受到了《吃掉那只青蛙》的启发。如果你感兴趣,建议完整阅读它们。

    我实施 5AM Club 计划一个月以来,生活和工作效率得到了显著提高。通过早起,我得到了宝贵的属于自己的时间块,用来处理那些对自己来说重要且长期能产生重大影响的任务。同时,我调整了作息时间,优化了睡眠质量。在工作时间安排上,采用番茄工作法,让我保持高效工作状态的同时,确保了充足的休息。不过,睡眠和个人的习惯/体质密切相关,夜型人请慎重执行,随便尝试可能会把自己弄得更混乱。

    虽然 5AM Club 并非人人都适用,但它确实帮助我从失眠问题中走出来,提高了工作和学习效率。我相信,只要你能找到适合自己的方法和节奏,你也可以通过早起和合理安排时间,实现从失眠到高效早晨的转变。希望我的 5AM Club 计划分享对你有所启发,祝你早晨愉快、充满活力!


    ',14),p={class:"footnotes"},r={class:"footnotes-list"},c={id:"footnote1",class:"footnote-item"},u={href:"https://www.solidot.org/story?sid=74167",target:"_blank",rel:"noopener noreferrer"},m=(0,t.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),d={id:"footnote2",class:"footnote-item"},g={href:"https://sspai.com/post/77435",target:"_blank",rel:"noopener noreferrer"},h=(0,t.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),b={},k=(0,e(3671).A)(b,[["render",function(n,a){const e=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[s,(0,t.Lk)("p",null,[(0,t.eW)("为了让你始终保持放松,无需费心思考休息时要做什么,你可以参考下面的列表,制定一份适合自己的休息清单,并将其打印并放在桌边。需要休息时,从清单中挑选 "),o,(0,t.eW)("执行即可。我把我的休息清单记录在书房白板上,这样方便随时查看。这个方案之前在《"),(0,t.Lk)("a",l,[(0,t.eW)("用白板墙贴记录日常生活"),(0,t.bF)(e)]),(0,t.eW)("》一文中有详细介绍。")]),i,(0,t.Lk)("section",p,[(0,t.Lk)("ol",r,[(0,t.Lk)("li",c,[(0,t.Lk)("p",null,[(0,t.Lk)("a",u,[(0,t.eW)("研究发现睡眠时间低于六小时会影响学习成绩"),(0,t.bF)(e)]),(0,t.eW)(),m])]),(0,t.Lk)("li",d,[(0,t.Lk)("p",null,[(0,t.Lk)("a",g,[(0,t.eW)("04 保持心流 - 心流管理魔方"),(0,t.bF)(e)]),(0,t.eW)(),h])])])])])}]]),f=JSON.parse('{"path":"/posts/2023-03-31-efficient_morning_5am_club.html","title":"从失眠到高效早晨:我的 5AM Club 计划分享","lang":"zh-CN","frontmatter":{"title":"从失眠到高效早晨:我的 5AM Club 计划分享","date":"2023-03-31T00:00:00.000Z","category":["头脑驿站"],"tag":["时间","工作流"],"order":-54,"description":"失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-03-31-efficient_morning_5am_club.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"从失眠到高效早晨:我的 5AM Club 计划分享"}],["meta",{"property":"og:description","content":"失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-04-07-17-19-27.png?imageMogr2/thumbnail/500x \\"图源:Storyset\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"从失眠到高效早晨:我的 5AM Club 计划分享"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"时间"}],["meta",{"property":"article:tag","content":"工作流"}],["meta",{"property":"article:published_time","content":"2023-03-31T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"从失眠到高效早晨:我的 5AM Club 计划分享\\",\\"image\\":[\\"https://img.newzone.top/2023-04-07-17-19-27.png?imageMogr2/thumbnail/500x \\\\\\"图源:Storyset\\\\\\"\\",\\"https://img.newzone.top/2023-03-31-11-23-57.png?imageMogr2/thumbnail/500x \\\\\\"睡眠时间对比\\\\\\"\\",\\"https://img.newzone.top/2023-04-07-17-20-19.png?imageMogr2/thumbnail/500x \\\\\\"图源:Storyset\\\\\\"\\",\\"https://img.newzone.top/2023-03-31-16-15-42.jpg?imageMogr2/thumbnail/500x/format/webp \\\\\\"打卡照片,总被认为是同一张\\\\\\"\\",\\"https://img.newzone.top/2023-04-07-17-20-58.png?imageMogr2/thumbnail/500x \\\\\\"图源:Storyset\\\\\\"\\"],\\"datePublished\\":\\"2023-03-31T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"5 点的奥秘","slug":"_5-点的奥秘","link":"#_5-点的奥秘","children":[{"level":3,"title":"5 点起,身体受得了吗?","slug":"_5-点起-身体受得了吗","link":"#_5-点起-身体受得了吗","children":[]},{"level":3,"title":"为什么 5 点起?做什么?","slug":"为什么-5-点起-做什么","link":"#为什么-5-点起-做什么","children":[]}]},{"level":2,"title":"工作前的准备","slug":"工作前的准备","link":"#工作前的准备","children":[{"level":3,"title":"大脑唤醒","slug":"大脑唤醒","link":"#大脑唤醒","children":[]},{"level":3,"title":"打卡监督","slug":"打卡监督","link":"#打卡监督","children":[]}]},{"level":2,"title":"工作时间安排","slug":"工作时间安排","link":"#工作时间安排","children":[]},{"level":2,"title":"休息清单","slug":"休息清单","link":"#休息清单","children":[]},{"level":2,"title":"下午的疲劳","slug":"下午的疲劳","link":"#下午的疲劳","children":[]},{"level":2,"title":"晚上十点睡觉","slug":"晚上十点睡觉","link":"#晚上十点睡觉","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1680225472000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":12.24,"words":3671},"filePathRelative":"_posts/2023-03-31-efficient_morning_5am_club.md","localizedDate":"2023年3月31日","excerpt":"

    失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何况早上 5 点起床呢?即使成功在 5 点起床,我又如何保证自己的状态?如何保证可以高效地学习和工作呢?但当时我正处于效率低谷,总是被其他事情干扰,作息时间完全被打乱。迷信理论的我,只能去相信它。因此,我结合心流理论制定了自己的「5AM Club」计划。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2023-09-05-virtual_positioning.html.90007db2.js b/assets/js/2023-09-05-virtual_positioning.html.90007db2.js new file mode 100644 index 000000000..14fe26902 --- /dev/null +++ b/assets/js/2023-09-05-virtual_positioning.html.90007db2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3753],{3671:(t,e)=>{e.A=(t,e)=>{const n=t.__vccOpts||t;for(const[t,i]of e)n[t]=i;return n}},152:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>o,data:()=>l});var i=n(7847);const a=[(0,i.Fv)('

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    虚拟定位

    1. 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

    2. 在模拟器中打开要修改定位的应用,点击应用的定位图标。

    3. 选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

    4. 更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

    常见问题

    无法虚拟定位

    如果你已经按照上述步骤进行设置,但仍然不能虚拟定位,这可能是由于模拟器没有正确获取位置信息。为了验证这一点,你可以在模拟器中的微信应用里,给好友发送实时位置分享,看是否能正确显示。

    手机修改定位

    我曾尝试在手机上使用如 fakegps 这样的工具来修改位置,但只有高德地图更改成功,其他都失败了。据了解,这可能与 Android 10 或更高版本的系统有关。如果你使用的是 Android 9 或更早版本的手机,你或许可以尝试使用旧版本的微信来更改定位。

    关于虚拟签到

    虽然企业微信、钉钉等打卡软件也可用此法签到,但请勿滥用。有记者曾在三家价格分别为 5 元、10 元、20 元的网店购买更改定位服务,结果发现这些商家仅是远程登录客户的微信账号,然后使用特定工具修改定位,操作流程与上文所述类似。

    ',11)],p={},o=(0,n(3671).A)(p,[["render",function(t,e){return(0,i.uX)(),(0,i.CE)("div",null,a)}]]),l=JSON.parse('{"path":"/posts/2023-09-05-virtual_positioning.html","title":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT","lang":"zh-CN","frontmatter":{"title":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT","date":"2023-09-05T00:00:00.000Z","category":["工具"],"tag":["虚拟定位"],"order":-55,"description":" 这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。 家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗? 虚拟定位 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-09-05-virtual_positioning.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT"}],["meta",{"property":"og:description","content":" 这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。 家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗? 虚拟定位 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-06-11-17-47.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-04T22:50:34.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"虚拟定位"}],["meta",{"property":"article:published_time","content":"2023-09-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-09-04T22:50:34.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT\\",\\"image\\":[\\"https://img.newzone.top/2022-05-06-11-17-47.png\\",\\"https://img.newzone.top/2022-05-06-11-18-08.png\\",\\"https://img.newzone.top/2022-05-06-11-18-26.png\\"],\\"datePublished\\":\\"2023-09-05T00:00:00.000Z\\",\\"dateModified\\":\\"2023-09-04T22:50:34.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"虚拟定位","slug":"虚拟定位","link":"#虚拟定位","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"无法虚拟定位","slug":"无法虚拟定位","link":"#无法虚拟定位","children":[]},{"level":3,"title":"手机修改定位","slug":"手机修改定位","link":"#手机修改定位","children":[]},{"level":3,"title":"关于虚拟签到","slug":"关于虚拟签到","link":"#关于虚拟签到","children":[]}]}],"git":{"createdTime":1693867834000,"updatedTime":1693867834000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.26,"words":677},"filePathRelative":"_posts/2023-09-05-virtual_positioning.md","localizedDate":"2023年9月5日","excerpt":"
    \\n

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    \\n
    \\n

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    \\n

    虚拟定位

    \\n
      \\n
    1. \\n

      首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

      在模拟器中打开要修改定位的应用,点击应用的定位图标。

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

      选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

      更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-302172cb.5507aed2.js b/assets/js/2023-10-07-clone-voice.html.cf9a4d51.js similarity index 70% rename from assets/js/v-302172cb.5507aed2.js rename to assets/js/2023-10-07-clone-voice.html.cf9a4d51.js index f9ce08ab0..84490dc48 100644 --- a/assets/js/v-302172cb.5507aed2.js +++ b/assets/js/2023-10-07-clone-voice.html.cf9a4d51.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8688],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},4168:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>q,data:()=>R});var t=a(3968);const r=(0,t.QD)("p",null,"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。",-1),i=(0,t.QD)("p",null,"你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。",-1),l=(0,t.QD)("p",null,"艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。",-1),o={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning",target:"_blank",rel:"noopener noreferrer"},s=(0,t.QD)("h2",{id:"收集语音样本",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#收集语音样本"},[(0,t.QD)("span",null,"收集语音样本")])],-1),p=(0,t.QD)("p",null,[(0,t.mY)("克隆声音的第一步是准备自己的声音样本。确保录音中只有你的声音,且语音清晰、语速均匀。录音完成后,需检查 "),(0,t.QD)("code",null,"final_annotation"),(0,t.mY)(" 等 txt 文件的音频转写情况,确认停顿和文字是否正确。")],-1),c=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),h={href:"https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar",target:"_blank",rel:"noopener noreferrer"},m=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2023-10-11-10-22-27.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),d=(0,t.QD)("h2",{id:"云端训练模型",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#云端训练模型"},[(0,t.QD)("span",null,"云端训练模型")])],-1),g={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/README_ZH.md",target:"_blank",rel:"noopener noreferrer"},u={href:"https://colab.research.google.com/drive/1pn1xnFfdLK63gVXDwV4zCXfVeo8c-I-0?usp=sharing",target:"_blank",rel:"noopener noreferrer"},f=(0,t.QD)("code",null,"max_epochs",-1),_=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2023-10-07-07-37-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),b=(0,t.QD)("p",null,"我曾在 Colab 上用 8 分钟的 B 站视频进行训练,但三小时后由于超出免费额度被终止。后来我在配备了 3080Ti 的本地设备上进行训练,4 小时后便完成了调试。",-1),D=(0,t.QD)("h2",{id:"本地训练模型",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#本地训练模型"},[(0,t.QD)("span",null,"本地训练模型")])],-1),v={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/LOCAL.md",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/",target:"_blank",rel:"noopener noreferrer"},Y=(0,t.QD)("code",null,"pip install --upgrade numpy",-1),k={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/sampled_audio4ft_v2.zip",target:"_blank",rel:"noopener noreferrer"},y=(0,t.QD)("p",null,"第 7 步 (下载模型与配置):",-1),w={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/D_0.pth",target:"_blank",rel:"noopener noreferrer"},x={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/G_0.pth",target:"_blank",rel:"noopener noreferrer"},z={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/config.json",target:"_blank",rel:"noopener noreferrer"},T={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/D_0-p.pth",target:"_blank",rel:"noopener noreferrer"},I={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/G_0-p.pth",target:"_blank",rel:"noopener noreferrer"},C={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/config.json",target:"_blank",rel:"noopener noreferrer"},K={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/D_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},P={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/G_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},j={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/configs/uma_trilingual.json",target:"_blank",rel:"noopener noreferrer"},A=(0,t.IL)("
  • 选择上方一种模型进行下载。完成下载后,将 G 模型重命名为 G_0.pth,将 D 模型重命名为 D_0.pth,并将配置文件 .json 重命名为 finetune_speaker.jsonG_0.pthD_0.pth 放入 pretrained_models 目录,finetune_speaker.json 放入 config 目录。特别注意,要保证 json 文件是直接下载而非复制粘贴,以防后续步骤中打开 inference 出现问题。
  • ",1),M=(0,t.IL)('
  • 第 8 步:由于 LOCAL.md 教程中未包含在线视频,所以需要将相关视频文件下载到本地。

  • 第 9 步:运行以下命令:

    python scripts/video2audio.py\npython scripts/denoise_audio.py\n\npython scripts/long_audio_transcribe.py --languages C --whisper_size large-v2\npython scripts/short_audio_transcribe.py --languages C --whisper_size large-v2\n\npython scripts/resample.py\n
  • 第 10 步:执行 python preprocess_v2.py --add_auxiliary_data True --languages C

  • 第 11 步:

    • 开始训练:python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs 5000 --drop_speaker_embed True
    • 如果训练过程中断,要继续训练,执行 python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs 10000 --drop_speaker_embed False --cont True
  • ',4),S=(0,t.QD)("h2",{id:"文字生成语音",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#文字生成语音"},[(0,t.QD)("span",null,"文字生成语音")])],-1),V=(0,t.QD)("code",null,"OUTPUT_MODEL",-1),L={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/releases",target:"_blank",rel:"noopener noreferrer"},E=(0,t.QD)("code",null,"G_latest.pth",-1),O=(0,t.QD)("code",null,"finetune_speaker.json",-1),G=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2023-10-09-09-08-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),U=(0,t.QD)("code",null,"finetune_speaker.json",-1),Z=(0,t.QD)("code",null,'File "inference.py", line 99',-1),J={href:"https://wwva.lanzouq.com/iIy5m1b4bosf",target:"_blank",rel:"noopener noreferrer"},F=(0,t.QD)("code",null,"config.json",-1),H=(0,t.QD)("code",null,"finetune_speaker.json",-1),N=(0,t.IL)('

    声音微调

    生成声音与原声无关

    在检查语料转写文本时,尽量减少对 short_character_anno.txtlong_character_anno.txt 文件的非必要修改。过多的修改可能会导致生成的声音与原始声音产生明显差异。最初的训练中,可以将 max_epochs 设置为 200。在确生成声音符合预期后,再进行后续的训练。

    例如:因个人语调的不同,我读的是「假语村言」,但 whisper 将其识别为「甲乙寸言」。如果我保留 whisper 的识别结果不做修改,最终生成的声音与我本人的声音非常接近。但当我将 whisper 识别结果修改为原文本后,生成的声音产生了显著变化,几乎听不出与原声音的相似性。我们只需要对那些发音明显错误的部分做出修改。例如,「假」和「甲」的发音相同,无需更改;「语」和「乙」之间的差异较大,但由于是个人发音的特点,也无需更改;对于「村」和「寸」这样声调不同的词汇,可以在检查录音后做出相应更改。

    语音克隆的「口音」问题

    ',5),B=(0,t.IL)('

    这个示例是使用 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 识别,但已经标注。这与训练次数无关,出现此问题后,需重新检查语料。

    ',10),W={},q=(0,a(9720).c)(W,[["render",function(e,n){const a=(0,t.E1)("VidStack"),W=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[r,i,l,(0,t.K2)(a,{src:"https://oss.newzone.top/audio/clonevoice00.wav",title:"克隆音频实例"}),(0,t.QD)("p",null,[(0,t.mY)("我使用了 "),(0,t.QD)("a",o,[(0,t.mY)("VITS-fast-fine-tuning"),(0,t.K2)(W)]),(0,t.mY)(" 来克隆我的声音。这款工具能从短音频、长音频或视频中克隆特定角色的声音,只需几小时即可完成预训练的 VITS 模型的微调。微调后的模型不仅能进行声线转换,还能完成中、日、英三种语言的文本到语音的转换。")]),s,p,c,(0,t.QD)("p",null,[(0,t.mY)("为增加语音样本的多样性,选择不同主题和领域的文本材料。我使用的文本来自"),(0,t.QD)("a",h,[(0,t.mY)("标贝数据集"),(0,t.K2)(W)]),(0,t.mY)(",该数据集包含 10000 条文本和对应的读音。我选了 300 条用于短音频录制,每条录音时长在 2 至 10 秒之间。语料的质量优于数量,如果需要,可以减少语料条数或使用长视频。VITS-fast-fine-tuning 工具会自动将长音频剪切成短音频。")]),m,d,(0,t.QD)("p",null,[(0,t.mY)("关于模型的微调和部署,你可以参考官方 GitHub "),(0,t.QD)("a",g,[(0,t.mY)("页面"),(0,t.K2)(W)]),(0,t.mY)("的详细操作指南。")]),(0,t.QD)("p",null,[(0,t.mY)("在 "),(0,t.QD)("a",u,[(0,t.mY)("Google Colab"),(0,t.K2)(W)]),(0,t.mY)(" 进行模型微调时,可能会因长时间未连接或超出免费配置限制而中断。为防止数据丢失,应提前选择「STEP 5 下载模型」的下载选项。在 Colab 进行云端训练时,建议长音频时长控制在 20 分钟以内,"),f,(0,t.mY)(" 设置为 100。如需进一步提升模型质量,可继续训练模型,再进行 100 次 epochs。")]),_,b,D,(0,t.QD)("p",null,[(0,t.mY)("如果需要进行深入的模型调整,比如执行 5000 次 epochs,可能需要数天的时间。为此,你可以参考 "),(0,t.QD)("a",v,[(0,t.mY)("LOCAL.md"),(0,t.K2)(W)]),(0,t.mY)(" 来在本地环境进行训练。而针对其中可能存在的不明确部分,以下补充具体步骤和建议。")]),(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.mY)("第 0 步:预先确认本地环境的 Python 版本为 3.8,并且已经安装了 "),(0,t.QD)("a",Q,[(0,t.mY)("Microsoft C++ 生成工具"),(0,t.K2)(W)]),(0,t.mY)(" 和 ffmpeg。这样可以预防潜在错误。在启动本地运行之前,执行 "),Y,(0,t.mY)(" 来更新 numpy 版本。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.mY)("第 6 步:鉴于 wget 下载命令在 Windows 中可能不起作用,建议手动下载 "),(0,t.QD)("a",k,[(0,t.mY)("sampled_audio4ft_v2.zip"),(0,t.K2)(W)]),(0,t.mY)(",随后将文件解压至运行路径。")])]),(0,t.QD)("li",null,[y,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.mY)("C 模型(纯中文):下载 HuggingFace 平台上的 "),(0,t.QD)("a",w,[(0,t.mY)("D_0.pth"),(0,t.K2)(W)]),(0,t.mY)("、"),(0,t.QD)("a",x,[(0,t.mY)("G_0.pth"),(0,t.K2)(W)]),(0,t.mY)(" 和 "),(0,t.QD)("a",z,[(0,t.mY)("config.json"),(0,t.K2)(W)]),(0,t.mY)("。")]),(0,t.QD)("li",null,[(0,t.mY)("CJ 模型(中日):下载 "),(0,t.QD)("a",T,[(0,t.mY)("D_0-p.pth"),(0,t.K2)(W)]),(0,t.mY)("、"),(0,t.QD)("a",I,[(0,t.mY)("G_0-p.pth"),(0,t.K2)(W)]),(0,t.mY)(" 和 "),(0,t.QD)("a",C,[(0,t.mY)("config.json"),(0,t.K2)(W)]),(0,t.mY)("。")]),(0,t.QD)("li",null,[(0,t.mY)("CJE 模型(中日英):下载 "),(0,t.QD)("a",K,[(0,t.mY)("D_trilingual.pth"),(0,t.K2)(W)]),(0,t.mY)("、"),(0,t.QD)("a",P,[(0,t.mY)("G_trilingual.pth"),(0,t.K2)(W)]),(0,t.mY)(" 和 "),(0,t.QD)("a",j,[(0,t.mY)("uma_trilingual.json"),(0,t.K2)(W)]),(0,t.mY)("。")]),A])]),M]),S,(0,t.QD)("p",null,[(0,t.mY)("微调完成后,将 "),V,(0,t.mY)(" 下的模型文件和 config 文件放在语音生成工具 "),(0,t.QD)("a",L,[(0,t.mY)("inference"),(0,t.K2)(W)]),(0,t.mY)(" 解压文件夹下,其文件名分别为 "),E,(0,t.mY)(" 和 "),O,(0,t.mY)("。一切准备就绪后,运行 inference.exe, 浏览器会自动弹出窗口,即可在本地环境下生成个性化的语音内容。注意其所在路径不能有中文字符或者空格。")]),G,(0,t.QD)("p",null,[(0,t.mY)("在这个阶段,特别注意中文模型(即 languages C)的 "),U,(0,t.mY)(" 格式问题。确保「speaks」部分被修改为字典格式,否则在运行 inference 时,你可能会遇到 "),Z,(0,t.mY)(" 的报错。为方便,你可以直接点击"),(0,t.QD)("a",J,[(0,t.mY)("这里"),(0,t.K2)(W)]),(0,t.mY)("下载我调整好的 json 文件。如果你不需要二次元声音,可以直接使用 OUTPUT_MODEL 下的 "),F,(0,t.mY)(" 替代 "),H,(0,t.mY)("。")]),N,(0,t.K2)(a,{src:"https://oss.newzone.top/audio/clonevoice01.wav",title:"克隆音频实例 2"}),B])}]]),R=JSON.parse('{"path":"/posts/2023-10-07-clone-voice.html","title":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!","lang":"zh-CN","frontmatter":{"title":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!","date":"2023-10-07T00:00:00.000Z","category":["工具"],"tag":["AI","VITS","声音克隆"],"order":-56,"description":"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。 你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-10-07-clone-voice.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!"}],["meta",{"property":"og:description","content":"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。 你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"VITS"}],["meta",{"property":"article:tag","content":"声音克隆"}],["meta",{"property":"article:published_time","content":"2023-10-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!\\",\\"image\\":[\\"https://img.newzone.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x\\",\\"https://img.newzone.top/2023-10-11-10-22-27.png?imageMogr2/format/webp/thumbnail/400x\\",\\"https://img.newzone.top/2023-10-07-07-37-52.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-10-10-05-01-08.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-10-09-09-08-31.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2023-10-07T00:00:00.000Z\\",\\"dateModified\\":\\"2023-12-18T04:53:57.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"收集语音样本","slug":"收集语音样本","link":"#收集语音样本","children":[]},{"level":2,"title":"云端训练模型","slug":"云端训练模型","link":"#云端训练模型","children":[]},{"level":2,"title":"本地训练模型","slug":"本地训练模型","link":"#本地训练模型","children":[]},{"level":2,"title":"文字生成语音","slug":"文字生成语音","link":"#文字生成语音","children":[]},{"level":2,"title":"声音微调","slug":"声音微调","link":"#声音微调","children":[{"level":3,"title":"生成声音与原声无关","slug":"生成声音与原声无关","link":"#生成声音与原声无关","children":[]},{"level":3,"title":"语音克隆的「口音」问题","slug":"语音克隆的「口音」问题","link":"#语音克隆的「口音」问题","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"无法启动 inference","slug":"无法启动-inference","link":"#无法启动-inference","children":[]},{"level":3,"title":"长音频识别问题","slug":"长音频识别问题","link":"#长音频识别问题","children":[]},{"level":3,"title":"录音中出现 zh","slug":"录音中出现-zh","link":"#录音中出现-zh","children":[]},{"level":3,"title":"长句读音含糊","slug":"长句读音含糊","link":"#长句读音含糊","children":[]}]}],"git":{"createdTime":1696991517000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":7.93,"words":2379},"filePathRelative":"_posts/2023-10-07-clone-voice.md","localizedDate":"2023年10月7日","excerpt":"

    每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。

    \\n

    你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。

    \\n

    艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8106],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},5922:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>R,data:()=>Y});var t=a(7847);const r=(0,t.Lk)("p",null,"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。",-1),i=(0,t.Lk)("p",null,"你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。",-1),l=(0,t.Lk)("p",null,"艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。",-1),o={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning",target:"_blank",rel:"noopener noreferrer"},s=(0,t.Lk)("h2",{id:"收集语音样本",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#收集语音样本"},[(0,t.Lk)("span",null,"收集语音样本")])],-1),p=(0,t.Lk)("p",null,[(0,t.eW)("克隆声音的第一步是准备自己的声音样本。确保录音中只有你的声音,且语音清晰、语速均匀。录音完成后,需检查 "),(0,t.Lk)("code",null,"final_annotation"),(0,t.eW)(" 等 txt 文件的音频转写情况,确认停顿和文字是否正确。")],-1),c=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption")],-1),h={href:"https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar",target:"_blank",rel:"noopener noreferrer"},d=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2023-10-11-10-22-27.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption")],-1),g=(0,t.Lk)("h2",{id:"云端训练模型",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#云端训练模型"},[(0,t.Lk)("span",null,"云端训练模型")])],-1),u={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/README_ZH.md",target:"_blank",rel:"noopener noreferrer"},m={href:"https://colab.research.google.com/drive/1pn1xnFfdLK63gVXDwV4zCXfVeo8c-I-0?usp=sharing",target:"_blank",rel:"noopener noreferrer"},f=(0,t.Lk)("code",null,"max_epochs",-1),k=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2023-10-07-07-37-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption")],-1),b=(0,t.Lk)("p",null,"我曾在 Colab 上用 8 分钟的 B 站视频进行训练,但三小时后由于超出免费额度被终止。后来我在配备了 3080Ti 的本地设备上进行训练,4 小时后便完成了调试。",-1),_=(0,t.Lk)("h2",{id:"本地训练模型",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#本地训练模型"},[(0,t.Lk)("span",null,"本地训练模型")])],-1),L={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/LOCAL.md",target:"_blank",rel:"noopener noreferrer"},v={href:"https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/",target:"_blank",rel:"noopener noreferrer"},W=(0,t.Lk)("code",null,"pip install --upgrade numpy",-1),y={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/sampled_audio4ft_v2.zip",target:"_blank",rel:"noopener noreferrer"},w=(0,t.Lk)("p",null,"第 7 步 (下载模型与配置):",-1),x={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/D_0.pth",target:"_blank",rel:"noopener noreferrer"},z={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/G_0.pth",target:"_blank",rel:"noopener noreferrer"},T={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/config.json",target:"_blank",rel:"noopener noreferrer"},I={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/D_0-p.pth",target:"_blank",rel:"noopener noreferrer"},F={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/G_0-p.pth",target:"_blank",rel:"noopener noreferrer"},C={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/config.json",target:"_blank",rel:"noopener noreferrer"},P={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/D_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},j={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/G_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},A={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/configs/uma_trilingual.json",target:"_blank",rel:"noopener noreferrer"},M=(0,t.Fv)("
  • 选择上方一种模型进行下载。完成下载后,将 G 模型重命名为 G_0.pth,将 D 模型重命名为 D_0.pth,并将配置文件 .json 重命名为 finetune_speaker.jsonG_0.pthD_0.pth 放入 pretrained_models 目录,finetune_speaker.json 放入 config 目录。特别注意,要保证 json 文件是直接下载而非复制粘贴,以防后续步骤中打开 inference 出现问题。
  • ",1),S=(0,t.Fv)('
  • 第 8 步:由于 LOCAL.md 教程中未包含在线视频,所以需要将相关视频文件下载到本地。

  • 第 9 步:运行以下命令:

    python scripts/video2audio.py\npython scripts/denoise_audio.py\n\npython scripts/long_audio_transcribe.py --languages C --whisper_size large-v2\npython scripts/short_audio_transcribe.py --languages C --whisper_size large-v2\n\npython scripts/resample.py\n
  • 第 10 步:执行 python preprocess_v2.py --add_auxiliary_data True --languages C

  • 第 11 步:

    • 开始训练:python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs 5000 --drop_speaker_embed True
    • 如果训练过程中断,要继续训练,执行 python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs 10000 --drop_speaker_embed False --cont True
  • ',4),V=(0,t.Lk)("h2",{id:"文字生成语音",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#文字生成语音"},[(0,t.Lk)("span",null,"文字生成语音")])],-1),D=(0,t.Lk)("code",null,"OUTPUT_MODEL",-1),O={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/releases",target:"_blank",rel:"noopener noreferrer"},E=(0,t.Lk)("code",null,"G_latest.pth",-1),G=(0,t.Lk)("code",null,"finetune_speaker.json",-1),U=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2023-10-09-09-08-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption")],-1),Z=(0,t.Lk)("code",null,"finetune_speaker.json",-1),J=(0,t.Lk)("code",null,'File "inference.py", line 99',-1),H={href:"https://wwva.lanzouq.com/iIy5m1b4bosf",target:"_blank",rel:"noopener noreferrer"},N=(0,t.Lk)("code",null,"config.json",-1),B=(0,t.Lk)("code",null,"finetune_speaker.json",-1),X=(0,t.Fv)('

    声音微调

    生成声音与原声无关

    在检查语料转写文本时,尽量减少对 short_character_anno.txtlong_character_anno.txt 文件的非必要修改。过多的修改可能会导致生成的声音与原始声音产生明显差异。最初的训练中,可以将 max_epochs 设置为 200。在确生成声音符合预期后,再进行后续的训练。

    例如:因个人语调的不同,我读的是「假语村言」,但 whisper 将其识别为「甲乙寸言」。如果我保留 whisper 的识别结果不做修改,最终生成的声音与我本人的声音非常接近。但当我将 whisper 识别结果修改为原文本后,生成的声音产生了显著变化,几乎听不出与原声音的相似性。我们只需要对那些发音明显错误的部分做出修改。例如,「假」和「甲」的发音相同,无需更改;「语」和「乙」之间的差异较大,但由于是个人发音的特点,也无需更改;对于「村」和「寸」这样声调不同的词汇,可以在检查录音后做出相应更改。

    语音克隆的「口音」问题

    ',5),q=(0,t.Fv)('

    这个示例是使用 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 识别,但已经标注。这与训练次数无关,出现此问题后,需重新检查语料。

    ',10),K={},R=(0,a(3671).A)(K,[["render",function(e,n){const a=(0,t.g2)("VidStack"),K=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[r,i,l,(0,t.bF)(a,{src:"https://oss.newzone.top/audio/clonevoice00.wav",title:"克隆音频实例"}),(0,t.Lk)("p",null,[(0,t.eW)("我使用了 "),(0,t.Lk)("a",o,[(0,t.eW)("VITS-fast-fine-tuning"),(0,t.bF)(K)]),(0,t.eW)(" 来克隆我的声音。这款工具能从短音频、长音频或视频中克隆特定角色的声音,只需几小时即可完成预训练的 VITS 模型的微调。微调后的模型不仅能进行声线转换,还能完成中、日、英三种语言的文本到语音的转换。")]),s,p,c,(0,t.Lk)("p",null,[(0,t.eW)("为增加语音样本的多样性,选择不同主题和领域的文本材料。我使用的文本来自"),(0,t.Lk)("a",h,[(0,t.eW)("标贝数据集"),(0,t.bF)(K)]),(0,t.eW)(",该数据集包含 10000 条文本和对应的读音。我选了 300 条用于短音频录制,每条录音时长在 2 至 10 秒之间。语料的质量优于数量,如果需要,可以减少语料条数或使用长视频。VITS-fast-fine-tuning 工具会自动将长音频剪切成短音频。")]),d,g,(0,t.Lk)("p",null,[(0,t.eW)("关于模型的微调和部署,你可以参考官方 GitHub "),(0,t.Lk)("a",u,[(0,t.eW)("页面"),(0,t.bF)(K)]),(0,t.eW)("的详细操作指南。")]),(0,t.Lk)("p",null,[(0,t.eW)("在 "),(0,t.Lk)("a",m,[(0,t.eW)("Google Colab"),(0,t.bF)(K)]),(0,t.eW)(" 进行模型微调时,可能会因长时间未连接或超出免费配置限制而中断。为防止数据丢失,应提前选择「STEP 5 下载模型」的下载选项。在 Colab 进行云端训练时,建议长音频时长控制在 20 分钟以内,"),f,(0,t.eW)(" 设置为 100。如需进一步提升模型质量,可继续训练模型,再进行 100 次 epochs。")]),k,b,_,(0,t.Lk)("p",null,[(0,t.eW)("如果需要进行深入的模型调整,比如执行 5000 次 epochs,可能需要数天的时间。为此,你可以参考 "),(0,t.Lk)("a",L,[(0,t.eW)("LOCAL.md"),(0,t.bF)(K)]),(0,t.eW)(" 来在本地环境进行训练。而针对其中可能存在的不明确部分,以下补充具体步骤和建议。")]),(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.eW)("第 0 步:预先确认本地环境的 Python 版本为 3.8,并且已经安装了 "),(0,t.Lk)("a",v,[(0,t.eW)("Microsoft C++ 生成工具"),(0,t.bF)(K)]),(0,t.eW)(" 和 ffmpeg。这样可以预防潜在错误。在启动本地运行之前,执行 "),W,(0,t.eW)(" 来更新 numpy 版本。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.eW)("第 6 步:鉴于 wget 下载命令在 Windows 中可能不起作用,建议手动下载 "),(0,t.Lk)("a",y,[(0,t.eW)("sampled_audio4ft_v2.zip"),(0,t.bF)(K)]),(0,t.eW)(",随后将文件解压至运行路径。")])]),(0,t.Lk)("li",null,[w,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.eW)("C 模型(纯中文):下载 HuggingFace 平台上的 "),(0,t.Lk)("a",x,[(0,t.eW)("D_0.pth"),(0,t.bF)(K)]),(0,t.eW)("、"),(0,t.Lk)("a",z,[(0,t.eW)("G_0.pth"),(0,t.bF)(K)]),(0,t.eW)(" 和 "),(0,t.Lk)("a",T,[(0,t.eW)("config.json"),(0,t.bF)(K)]),(0,t.eW)("。")]),(0,t.Lk)("li",null,[(0,t.eW)("CJ 模型(中日):下载 "),(0,t.Lk)("a",I,[(0,t.eW)("D_0-p.pth"),(0,t.bF)(K)]),(0,t.eW)("、"),(0,t.Lk)("a",F,[(0,t.eW)("G_0-p.pth"),(0,t.bF)(K)]),(0,t.eW)(" 和 "),(0,t.Lk)("a",C,[(0,t.eW)("config.json"),(0,t.bF)(K)]),(0,t.eW)("。")]),(0,t.Lk)("li",null,[(0,t.eW)("CJE 模型(中日英):下载 "),(0,t.Lk)("a",P,[(0,t.eW)("D_trilingual.pth"),(0,t.bF)(K)]),(0,t.eW)("、"),(0,t.Lk)("a",j,[(0,t.eW)("G_trilingual.pth"),(0,t.bF)(K)]),(0,t.eW)(" 和 "),(0,t.Lk)("a",A,[(0,t.eW)("uma_trilingual.json"),(0,t.bF)(K)]),(0,t.eW)("。")]),M])]),S]),V,(0,t.Lk)("p",null,[(0,t.eW)("微调完成后,将 "),D,(0,t.eW)(" 下的模型文件和 config 文件放在语音生成工具 "),(0,t.Lk)("a",O,[(0,t.eW)("inference"),(0,t.bF)(K)]),(0,t.eW)(" 解压文件夹下,其文件名分别为 "),E,(0,t.eW)(" 和 "),G,(0,t.eW)("。一切准备就绪后,运行 inference.exe, 浏览器会自动弹出窗口,即可在本地环境下生成个性化的语音内容。注意其所在路径不能有中文字符或者空格。")]),U,(0,t.Lk)("p",null,[(0,t.eW)("在这个阶段,特别注意中文模型(即 languages C)的 "),Z,(0,t.eW)(" 格式问题。确保「speaks」部分被修改为字典格式,否则在运行 inference 时,你可能会遇到 "),J,(0,t.eW)(" 的报错。为方便,你可以直接点击"),(0,t.Lk)("a",H,[(0,t.eW)("这里"),(0,t.bF)(K)]),(0,t.eW)("下载我调整好的 json 文件。如果你不需要二次元声音,可以直接使用 OUTPUT_MODEL 下的 "),N,(0,t.eW)(" 替代 "),B,(0,t.eW)("。")]),X,(0,t.bF)(a,{src:"https://oss.newzone.top/audio/clonevoice01.wav",title:"克隆音频实例 2"}),q])}]]),Y=JSON.parse('{"path":"/posts/2023-10-07-clone-voice.html","title":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!","lang":"zh-CN","frontmatter":{"title":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!","date":"2023-10-07T00:00:00.000Z","category":["工具"],"tag":["AI","VITS","声音克隆"],"order":-56,"description":"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。 你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-10-07-clone-voice.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!"}],["meta",{"property":"og:description","content":"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。 你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"VITS"}],["meta",{"property":"article:tag","content":"声音克隆"}],["meta",{"property":"article:published_time","content":"2023-10-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!\\",\\"image\\":[\\"https://img.newzone.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x\\",\\"https://img.newzone.top/2023-10-11-10-22-27.png?imageMogr2/format/webp/thumbnail/400x\\",\\"https://img.newzone.top/2023-10-07-07-37-52.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-10-10-05-01-08.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-10-09-09-08-31.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2023-10-07T00:00:00.000Z\\",\\"dateModified\\":\\"2023-12-18T04:53:57.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"收集语音样本","slug":"收集语音样本","link":"#收集语音样本","children":[]},{"level":2,"title":"云端训练模型","slug":"云端训练模型","link":"#云端训练模型","children":[]},{"level":2,"title":"本地训练模型","slug":"本地训练模型","link":"#本地训练模型","children":[]},{"level":2,"title":"文字生成语音","slug":"文字生成语音","link":"#文字生成语音","children":[]},{"level":2,"title":"声音微调","slug":"声音微调","link":"#声音微调","children":[{"level":3,"title":"生成声音与原声无关","slug":"生成声音与原声无关","link":"#生成声音与原声无关","children":[]},{"level":3,"title":"语音克隆的「口音」问题","slug":"语音克隆的「口音」问题","link":"#语音克隆的「口音」问题","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"无法启动 inference","slug":"无法启动-inference","link":"#无法启动-inference","children":[]},{"level":3,"title":"长音频识别问题","slug":"长音频识别问题","link":"#长音频识别问题","children":[]},{"level":3,"title":"录音中出现 zh","slug":"录音中出现-zh","link":"#录音中出现-zh","children":[]},{"level":3,"title":"长句读音含糊","slug":"长句读音含糊","link":"#长句读音含糊","children":[]}]}],"git":{"createdTime":1696991517000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":7.93,"words":2379},"filePathRelative":"_posts/2023-10-07-clone-voice.md","localizedDate":"2023年10月7日","excerpt":"

    每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。

    \\n

    你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。

    \\n

    艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1ee1827c.b90db4fc.js b/assets/js/2023-10-29-switch-firmware-updates.html.5bc0da67.js similarity index 60% rename from assets/js/v-1ee1827c.b90db4fc.js rename to assets/js/2023-10-29-switch-firmware-updates.html.5bc0da67.js index 6e0925702..07ad04628 100644 --- a/assets/js/v-1ee1827c.b90db4fc.js +++ b/assets/js/2023-10-29-switch-firmware-updates.html.5bc0da67.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5476],{9720:(e,t)=>{t.c=(e,t)=>{const l=e.__vccOpts||e;for(const[e,r]of t)l[e]=r;return l}},7432:(e,t,l)=>{l.r(t),l.d(t,{comp:()=>V,data:()=>$});var r=l(3968);const n=(0,r.QD)("p",null,"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。",-1),a=(0,r.QD)("p",null,"注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。",-1),o=(0,r.QD)("p",null,"以下是我进行升级的步骤:",-1),i=(0,r.QD)("h2",{id:"更新注入器",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#更新注入器"},[(0,r.QD)("span",null,"更新注入器")])],-1),s=(0,r.QD)("p",null,"首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。",-1),h={href:"https://www.mediafire.com/file/av2yur8zse5h016/Setup+NS-Atmosphere+programmer+v0.3.exe/file",target:"_blank",rel:"noopener noreferrer"},c={href:"https://gbatemp.net/attachments/ns-atmosphere-v0-4-rar.274028/",target:"_blank",rel:"noopener noreferrer"},p=(0,r.QD)("sup",{class:"footnote-ref"},[(0,r.QD)("a",{href:"#footnote1"},"[1]"),(0,r.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),m=(0,r.QD)("li",null,[(0,r.QD)("p",null,"打开 ns-ATMOSPHERE 的 ON 按钮,双击 RST 按钮,然后使用 USB 连接到 PC 端。此时 ns-ATMOSPHERE 将亮起粉灯。如果未出现粉灯,表示未被识别,可以尝试更换 USB 端口或重新尝试之前的操作。")],-1),d={href:"https://github.com/CTCaer/hekate/releases",target:"_blank",rel:"noopener noreferrer"},u=(0,r.QD)("code",null,"hekate_ctcaer_6.0.7_Nyx_1.5.6.zip",-1),D=(0,r.QD)("code",null,"hekate_ctcaer_6.0.7.bin",-1),Q={href:"https://www.twitch.tv/videos/346892592",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.cnblogs.com/letleon/p/NS_Atmosphere_payload_Programmer_aliyundrive_backup.html",target:"_blank",rel:"noopener noreferrer"},S=(0,r.QD)("h2",{id:"大气层-主机升级",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#大气层-主机升级"},[(0,r.QD)("span",null,"大气层&主机升级")])],-1),w=(0,r.QD)("h3",{id:"固件准备",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#固件准备"},[(0,r.QD)("span",null,"固件准备")])],-1),g={href:"https://github.com/Yuanbanba/Atmosphere/releases",target:"_blank",rel:"noopener noreferrer"},b={href:"https://darthsternie.net/switch-firmwares/",target:"_blank",rel:"noopener noreferrer"},Y=(0,r.QD)("h3",{id:"升级流程",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#升级流程"},[(0,r.QD)("span",null,"升级流程")])],-1),k=(0,r.QD)("li",null,"关机后,取出后盖板上的 SD 卡,并将其连接到计算机。",-1),T=(0,r.QD)("li",null,"在 SD 卡的根目录保留可能存在的 emuMMC 和 nintendo 文件夹,其他文件全部删除。(如果你有补丁或金手指,请务必自行备份。)",-1),_=(0,r.QD)("li",null,"复制大气层文件和解压后的离线升级固件到 SD 卡的根目录。",-1),B=(0,r.QD)("code",null,"虚拟(破解)系统",-1),M={href:"https://switch.homebrew.guide/emummc/emummc.html",target:"_blank",rel:"noopener noreferrer"},y=(0,r.QD)("li",null,"最后,进入系统后,打开「相册」,启动 daybreak 插件,然后选择安装离线固件包。随后全部选择右侧的选项并按下 A,安装完成后重启系统即完成升级。",-1),A=(0,r.IL)('

    进入大气层系统

    1. 在关机状态下,拆下右侧手柄(红色手柄)。如果已经开机,长按电源键约 8 秒,选择关闭电源。
    2. 将短接器插入右侧手柄的空槽中,确保插到底。
    3. 打开注入器的开关,等到灯亮起后插入 ns 的充电口。
    4. 按住音量键 +,然后按下电源键,稍等片刻,大气层界面将会出现,此时可以拔下盒子和短接器,然后接上右手柄。
    5. 大气层系统中点击「启动」,选择第二个选项 - 虚拟(破解)系统。

    安装游戏

    DBI

    ',4),C={href:"https://nswtl.info/switch-eng/games.html",target:"_blank",rel:"noopener noreferrer"},N=(0,r.IL)("
    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),v={href:"https://github.com/rashevskyv/dbi/blob/main/README_ENG.md",target:"_blank",rel:"noopener noreferrer"},I=(0,r.QD)("h3",{id:"ns-usbloader",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#ns-usbloader"},[(0,r.QD)("span",null,"NS-USBloader")])],-1),P={href:"https://github.com/developersu/ns-usbloader",target:"_blank",rel:"noopener noreferrer"},R=(0,r.QD)("p",null,"然而,在安装游戏前,你需要在 NS-USBloader 的左侧,点击设置按钮,然后选择右侧的「下载并安装驱动程序」。如果不执行此步,Switch 可能会提示 USB 设备不兼容。",-1),E=(0,r.QD)("h2",{id:"游戏资源",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#游戏资源"},[(0,r.QD)("span",null,"游戏资源")])],-1),K={href:"https://nswtl.info/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://www.3dmgame.com/games/ns_all_1/",target:"_blank",rel:"noopener noreferrer"},O=(0,r.QD)("code",null,"1: SD Card\\atmosphere\\contents",-1),U=(0,r.QD)("code",null,"L",-1),z=(0,r.QD)("code",null,"L",-1),L={href:"https://www.gamer520.com/jinshouzhi",target:"_blank",rel:"noopener noreferrer"},F=(0,r.QD)("p",null,"部分游戏列表:",-1),H=(0,r.QD)("ul",null,[(0,r.QD)("li",null,"健身游戏:舞力全开(Just Dance),有氧拳击 2(Fitness Boxing 2),健身拳击:北斗神拳(Fitness Boxing - Fist of the North Star),健身环大冒险(Ring Fit Adventure),健身巡游(Fitness Circuit),吾家健身趣,Nintendo Switch Sports。"),(0,r.QD)("li",null,"Mario 系列:超级马里奥兄弟:惊奇(Super Mario Bros. Wonder),马里奥派对:超级巨星(Mario Party Superstars),马里奥和疯狂兔子:星耀之愿(Mario plus Rabbids - Sparks of Hope)。"),(0,r.QD)("li",null,"休闲游戏:世界游戏大全 51(Clubhouse Games 51 Worldwide Classics),太鼓达人(Taiko no Tatsujin),胡闹厨房(Overcooked),大富翁 11。"),(0,r.QD)("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)。"),(0,r.QD)("li",null,"格斗游戏:真人快打 1(Mortal Kombat 1),IGS 经典街机合集(IGS Classic Arcade Collection)。"),(0,r.QD)("li",null,"竞技游戏:FIFA 23,NBA 2K24,曼岛 TT 赛:边缘竞速 3(TT Isle Of Man: Ride on the Edge 3)。"),(0,r.QD)("li",null,"真人影视互动:春逝百年抄(The Centennial Case: a Shijima Story),十个约会(Ten Dates)。")],-1),G=(0,r.QD)("hr",{class:"footnotes-sep"},null,-1),Z={class:"footnotes"},W={class:"footnotes-list"},j={id:"footnote1",class:"footnote-item"},J={href:"https://gbatemp.net/threads/ns-atmosphere-software-mirror.571116/",target:"_blank",rel:"noopener noreferrer"},q=(0,r.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),X={},V=(0,l(9720).c)(X,[["render",function(e,t){const l=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[n,a,o,i,s,(0,r.QD)("ol",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("在 Windows 系统上安装 NS-Atmosphere Programmer。由于该应用的开发商已经跑路,我在 GBATEMP 论坛上找到两个版本,可以自行选择:"),(0,r.QD)("a",h,[(0,r.mY)("0.3 STEUP"),(0,r.K2)(l)]),(0,r.mY)(","),(0,r.QD)("a",c,[(0,r.mY)("0.4 Protable"),(0,r.K2)(l)]),(0,r.mY)("。"),p])]),m,(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("打开下载好的 NS-Atmosphere Programmer,点击 Refresh 来识别端口,然后点击 Browse 选择需要注入的 payload bin。在这里使用的是 "),(0,r.QD)("a",d,[(0,r.mY)("hekate"),(0,r.K2)(l)]),(0,r.mY)(",从其发布页面下载最新版本的 "),u,(0,r.mY)(",然后解压得到 "),D,(0,r.mY)(",这就是要注入的 bin。")])])]),(0,r.QD)("p",null,[(0,r.mY)("如果有不清楚的地方,你可以观看 "),(0,r.QD)("a",Q,[(0,r.mY)("NS Atmosphere Dongle Tutorial!"),(0,r.K2)(l)]),(0,r.mY)(" 这个视频教程,或者查看这篇更详细的"),(0,r.QD)("a",f,[(0,r.mY)("注入器更新教程"),(0,r.K2)(l)]),(0,r.mY)("。")]),S,w,(0,r.QD)("p",null,[(0,r.mY)("接下来,我需要准备大气层和主机的升级。我使用了 "),(0,r.QD)("a",g,[(0,r.mY)("Yuanbanba/Atmosphere"),(0,r.K2)(l)]),(0,r.mY)(" 这个整合包,其中包含了大气层的迷你版本、Tesla 插件包以及相册 NRO 软件包,非常适合懒人使用。")]),(0,r.QD)("p",null,[(0,r.mY)("至于 Switch 最新的离线升级固件,我在 "),(0,r.QD)("a",b,[(0,r.mY)("Switch Firmwares"),(0,r.K2)(l)]),(0,r.mY)(" 上找到了。需要注意的是,这些固件分为全球版和国行版,建议选择全球版。")]),Y,(0,r.QD)("ol",null,[k,T,_,(0,r.QD)("li",null,[(0,r.mY)("按下方步骤进入大气层系统。如果你有 emuMMC 文件夹,则选择启动 "),B,(0,r.mY)(";如果没有,则参考 "),(0,r.QD)("a",M,[(0,r.mY)("Create an emuMMC"),(0,r.K2)(l)]),(0,r.mY)(" 教程创建 emuMMC 虚拟系统。请注意,创建 emuMMC 虚拟系统将占据 SD 卡 29G 的空间,并清空和重新分区 SD 卡,创建后需重新复制大气层文件和固件。")]),y]),A,(0,r.QD)("p",null,[(0,r.mY)("关于大气层安装游戏和 DLC 的方法,请参考 "),(0,r.QD)("a",C,[(0,r.mY)("Installation of games, DLC, updates"),(0,r.K2)(l)]),(0,r.mY)(":")]),N,(0,r.QD)("p",null,[(0,r.mY)("DBI 是大气层增强包的内置插件。如果不使用增强包,你也可以手动安装 DBI,具体流程请参考 "),(0,r.QD)("a",v,[(0,r.mY)("DBI 安装及使用说明"),(0,r.K2)(l)]),(0,r.mY)("。")]),I,(0,r.QD)("p",null,[(0,r.mY)("如果你不喜欢 DBI 的界面,也可以使用 Awoo Installer 通过 "),(0,r.QD)("a",P,[(0,r.mY)("NS-USBloader"),(0,r.K2)(l)]),(0,r.mY)(" 来安装 Switch 游戏。")]),R,E,(0,r.QD)("p",null,[(0,r.mY)("游戏资源可在 "),(0,r.QD)("a",K,[(0,r.mY)("SWITCH TORRENT LIBRARY"),(0,r.K2)(l)]),(0,r.mY)(" 上获取。这是最大且免费的游戏库,适用于 Nintendo Switch 和其他平台。在测试中,我找到了所有需要的游戏。")]),(0,r.QD)("p",null,[(0,r.mY)("点击页面上的标题区域,将跳转至 Telegram Bot。向机器人发送游戏的英文名称,机器人将回复游戏的种子文件和版本说明。游戏的英文名称可以在 "),(0,r.QD)("a",x,[(0,r.mY)("3DMGAME Switch 专区"),(0,r.K2)(l)]),(0,r.mY)("中查找。")]),(0,r.QD)("p",null,[(0,r.mY)("如果需要金手指,可以在 DBI 游戏安装的第三步将金手指文件复制到 "),O,(0,r.mY)(" 文件夹中。然后,进入相册,打开 Edizon,按下 "),U,(0,r.mY)(" 键进入系统模块管理,开启 Tesla 插件。在需要开启金手指的游戏中,按住 "),z,(0,r.mY)(" 键再按向下方向键,即可激活金手指菜单。金手指资源见 "),(0,r.QD)("a",L,[(0,r.mY)("Switch520"),(0,r.K2)(l)]),(0,r.mY)("。")]),F,H,G,(0,r.QD)("section",Z,[(0,r.QD)("ol",W,[(0,r.QD)("li",j,[(0,r.QD)("p",null,[(0,r.QD)("a",J,[(0,r.mY)("NS Atmosphere Software Mirror"),(0,r.K2)(l)]),(0,r.mY)(),q])])])])])}]]),$=JSON.parse('{"path":"/posts/2023-10-29-switch-firmware-updates.html","title":"Switch 升级记录与资源汇编","lang":"zh-CN","frontmatter":{"title":"Switch 升级记录与资源汇编","date":"2023-10-29T00:00:00.000Z","category":["工具"],"tag":["games"],"order":-0.03,"description":"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。 注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-10-29-switch-firmware-updates.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Switch 升级记录与资源汇编"}],["meta",{"property":"og:description","content":"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。 注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"games"}],["meta",{"property":"article:published_time","content":"2023-10-29T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Switch 升级记录与资源汇编\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-10-29T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-06T13:15:26.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"更新注入器","slug":"更新注入器","link":"#更新注入器","children":[]},{"level":2,"title":"大气层&主机升级","slug":"大气层-主机升级","link":"#大气层-主机升级","children":[{"level":3,"title":"固件准备","slug":"固件准备","link":"#固件准备","children":[]},{"level":3,"title":"升级流程","slug":"升级流程","link":"#升级流程","children":[]}]},{"level":2,"title":"进入大气层系统","slug":"进入大气层系统","link":"#进入大气层系统","children":[]},{"level":2,"title":"安装游戏","slug":"安装游戏","link":"#安装游戏","children":[{"level":3,"title":"DBI","slug":"dbi","link":"#dbi","children":[]},{"level":3,"title":"NS-USBloader","slug":"ns-usbloader","link":"#ns-usbloader","children":[]}]},{"level":2,"title":"游戏资源","slug":"游戏资源","link":"#游戏资源","children":[]}],"git":{"createdTime":1698547487000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":6.18,"words":1854},"filePathRelative":"_posts/2023-10-29-switch-firmware-updates.md","localizedDate":"2023年10月29日","excerpt":"

    家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。

    \\n

    注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。

    \\n

    以下是我进行升级的步骤:

    \\n

    更新注入器

    \\n

    首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7085],{3671:(e,t)=>{t.A=(e,t)=>{const l=e.__vccOpts||e;for(const[e,r]of t)l[e]=r;return l}},1567:(e,t,l)=>{l.r(t),l.d(t,{comp:()=>V,data:()=>$});var r=l(7847);const n=(0,r.Lk)("p",null,"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。",-1),a=(0,r.Lk)("p",null,"注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。",-1),o=(0,r.Lk)("p",null,"以下是我进行升级的步骤:",-1),i=(0,r.Lk)("h2",{id:"更新注入器",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#更新注入器"},[(0,r.Lk)("span",null,"更新注入器")])],-1),s=(0,r.Lk)("p",null,"首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。",-1),h={href:"https://www.mediafire.com/file/av2yur8zse5h016/Setup+NS-Atmosphere+programmer+v0.3.exe/file",target:"_blank",rel:"noopener noreferrer"},c={href:"https://gbatemp.net/attachments/ns-atmosphere-v0-4-rar.274028/",target:"_blank",rel:"noopener noreferrer"},p=(0,r.Lk)("sup",{class:"footnote-ref"},[(0,r.Lk)("a",{href:"#footnote1"},"[1]"),(0,r.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),d=(0,r.Lk)("li",null,[(0,r.Lk)("p",null,"打开 ns-ATMOSPHERE 的 ON 按钮,双击 RST 按钮,然后使用 USB 连接到 PC 端。此时 ns-ATMOSPHERE 将亮起粉灯。如果未出现粉灯,表示未被识别,可以尝试更换 USB 端口或重新尝试之前的操作。")],-1),k={href:"https://github.com/CTCaer/hekate/releases",target:"_blank",rel:"noopener noreferrer"},u=(0,r.Lk)("code",null,"hekate_ctcaer_6.0.7_Nyx_1.5.6.zip",-1),m=(0,r.Lk)("code",null,"hekate_ctcaer_6.0.7.bin",-1),L={href:"https://www.twitch.tv/videos/346892592",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.cnblogs.com/letleon/p/NS_Atmosphere_payload_Programmer_aliyundrive_backup.html",target:"_blank",rel:"noopener noreferrer"},b=(0,r.Lk)("h2",{id:"大气层-主机升级",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#大气层-主机升级"},[(0,r.Lk)("span",null,"大气层&主机升级")])],-1),S=(0,r.Lk)("h3",{id:"固件准备",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#固件准备"},[(0,r.Lk)("span",null,"固件准备")])],-1),g={href:"https://github.com/Yuanbanba/Atmosphere/releases",target:"_blank",rel:"noopener noreferrer"},w={href:"https://darthsternie.net/switch-firmwares/",target:"_blank",rel:"noopener noreferrer"},W=(0,r.Lk)("h3",{id:"升级流程",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#升级流程"},[(0,r.Lk)("span",null,"升级流程")])],-1),T=(0,r.Lk)("li",null,"关机后,取出后盖板上的 SD 卡,并将其连接到计算机。",-1),_=(0,r.Lk)("li",null,"在 SD 卡的根目录保留可能存在的 emuMMC 和 nintendo 文件夹,其他文件全部删除。(如果你有补丁或金手指,请务必自行备份。)",-1),B=(0,r.Lk)("li",null,"复制大气层文件和解压后的离线升级固件到 SD 卡的根目录。",-1),M=(0,r.Lk)("code",null,"虚拟(破解)系统",-1),A={href:"https://switch.homebrew.guide/emummc/emummc.html",target:"_blank",rel:"noopener noreferrer"},C=(0,r.Lk)("li",null,"最后,进入系统后,打开「相册」,启动 daybreak 插件,然后选择安装离线固件包。随后全部选择右侧的选项并按下 A,安装完成后重启系统即完成升级。",-1),D=(0,r.Fv)('

    进入大气层系统

    1. 在关机状态下,拆下右侧手柄(红色手柄)。如果已经开机,长按电源键约 8 秒,选择关闭电源。
    2. 将短接器插入右侧手柄的空槽中,确保插到底。
    3. 打开注入器的开关,等到灯亮起后插入 ns 的充电口。
    4. 按住音量键 +,然后按下电源键,稍等片刻,大气层界面将会出现,此时可以拔下盒子和短接器,然后接上右手柄。
    5. 大气层系统中点击「启动」,选择第二个选项 - 虚拟(破解)系统。

    安装游戏

    DBI

    ',4),y={href:"https://nswtl.info/switch-eng/games.html",target:"_blank",rel:"noopener noreferrer"},N=(0,r.Fv)("
    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),v={href:"https://github.com/rashevskyv/dbi/blob/main/README_ENG.md",target:"_blank",rel:"noopener noreferrer"},F=(0,r.Lk)("h3",{id:"ns-usbloader",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#ns-usbloader"},[(0,r.Lk)("span",null,"NS-USBloader")])],-1),P={href:"https://github.com/developersu/ns-usbloader",target:"_blank",rel:"noopener noreferrer"},R=(0,r.Lk)("p",null,"然而,在安装游戏前,你需要在 NS-USBloader 的左侧,点击设置按钮,然后选择右侧的「下载并安装驱动程序」。如果不执行此步,Switch 可能会提示 USB 设备不兼容。",-1),I=(0,r.Lk)("h2",{id:"游戏资源",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#游戏资源"},[(0,r.Lk)("span",null,"游戏资源")])],-1),E={href:"https://nswtl.info/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://www.3dmgame.com/games/ns_all_1/",target:"_blank",rel:"noopener noreferrer"},O=(0,r.Lk)("code",null,"1: SD Card\\atmosphere\\contents",-1),U=(0,r.Lk)("code",null,"L",-1),z=(0,r.Lk)("code",null,"L",-1),H={href:"https://www.gamer520.com/jinshouzhi",target:"_blank",rel:"noopener noreferrer"},G=(0,r.Lk)("p",null,"部分游戏列表:",-1),Z=(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,"健身游戏:舞力全开(Just Dance),有氧拳击 2(Fitness Boxing 2),健身拳击:北斗神拳(Fitness Boxing - Fist of the North Star),健身环大冒险(Ring Fit Adventure),健身巡游(Fitness Circuit),吾家健身趣,Nintendo Switch Sports。"),(0,r.Lk)("li",null,"Mario 系列:超级马里奥兄弟:惊奇(Super Mario Bros. Wonder),马里奥派对:超级巨星(Mario Party Superstars),马里奥和疯狂兔子:星耀之愿(Mario plus Rabbids - Sparks of Hope)。"),(0,r.Lk)("li",null,"休闲游戏:世界游戏大全 51(Clubhouse Games 51 Worldwide Classics),太鼓达人(Taiko no Tatsujin),胡闹厨房(Overcooked),大富翁 11。"),(0,r.Lk)("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)。"),(0,r.Lk)("li",null,"格斗游戏:真人快打 1(Mortal Kombat 1),IGS 经典街机合集(IGS Classic Arcade Collection)。"),(0,r.Lk)("li",null,"竞技游戏:FIFA 23,NBA 2K24,曼岛 TT 赛:边缘竞速 3(TT Isle Of Man: Ride on the Edge 3)。"),(0,r.Lk)("li",null,"真人影视互动:春逝百年抄(The Centennial Case: a Shijima Story),十个约会(Ten Dates)。")],-1),j=(0,r.Lk)("hr",{class:"footnotes-sep"},null,-1),J={class:"footnotes"},Y={class:"footnotes-list"},K={id:"footnote1",class:"footnote-item"},X={href:"https://gbatemp.net/threads/ns-atmosphere-software-mirror.571116/",target:"_blank",rel:"noopener noreferrer"},q=(0,r.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Q={},V=(0,l(3671).A)(Q,[["render",function(e,t){const l=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[n,a,o,i,s,(0,r.Lk)("ol",null,[(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("在 Windows 系统上安装 NS-Atmosphere Programmer。由于该应用的开发商已经跑路,我在 GBATEMP 论坛上找到两个版本,可以自行选择:"),(0,r.Lk)("a",h,[(0,r.eW)("0.3 STEUP"),(0,r.bF)(l)]),(0,r.eW)(","),(0,r.Lk)("a",c,[(0,r.eW)("0.4 Protable"),(0,r.bF)(l)]),(0,r.eW)("。"),p])]),d,(0,r.Lk)("li",null,[(0,r.Lk)("p",null,[(0,r.eW)("打开下载好的 NS-Atmosphere Programmer,点击 Refresh 来识别端口,然后点击 Browse 选择需要注入的 payload bin。在这里使用的是 "),(0,r.Lk)("a",k,[(0,r.eW)("hekate"),(0,r.bF)(l)]),(0,r.eW)(",从其发布页面下载最新版本的 "),u,(0,r.eW)(",然后解压得到 "),m,(0,r.eW)(",这就是要注入的 bin。")])])]),(0,r.Lk)("p",null,[(0,r.eW)("如果有不清楚的地方,你可以观看 "),(0,r.Lk)("a",L,[(0,r.eW)("NS Atmosphere Dongle Tutorial!"),(0,r.bF)(l)]),(0,r.eW)(" 这个视频教程,或者查看这篇更详细的"),(0,r.Lk)("a",f,[(0,r.eW)("注入器更新教程"),(0,r.bF)(l)]),(0,r.eW)("。")]),b,S,(0,r.Lk)("p",null,[(0,r.eW)("接下来,我需要准备大气层和主机的升级。我使用了 "),(0,r.Lk)("a",g,[(0,r.eW)("Yuanbanba/Atmosphere"),(0,r.bF)(l)]),(0,r.eW)(" 这个整合包,其中包含了大气层的迷你版本、Tesla 插件包以及相册 NRO 软件包,非常适合懒人使用。")]),(0,r.Lk)("p",null,[(0,r.eW)("至于 Switch 最新的离线升级固件,我在 "),(0,r.Lk)("a",w,[(0,r.eW)("Switch Firmwares"),(0,r.bF)(l)]),(0,r.eW)(" 上找到了。需要注意的是,这些固件分为全球版和国行版,建议选择全球版。")]),W,(0,r.Lk)("ol",null,[T,_,B,(0,r.Lk)("li",null,[(0,r.eW)("按下方步骤进入大气层系统。如果你有 emuMMC 文件夹,则选择启动 "),M,(0,r.eW)(";如果没有,则参考 "),(0,r.Lk)("a",A,[(0,r.eW)("Create an emuMMC"),(0,r.bF)(l)]),(0,r.eW)(" 教程创建 emuMMC 虚拟系统。请注意,创建 emuMMC 虚拟系统将占据 SD 卡 29G 的空间,并清空和重新分区 SD 卡,创建后需重新复制大气层文件和固件。")]),C]),D,(0,r.Lk)("p",null,[(0,r.eW)("关于大气层安装游戏和 DLC 的方法,请参考 "),(0,r.Lk)("a",y,[(0,r.eW)("Installation of games, DLC, updates"),(0,r.bF)(l)]),(0,r.eW)(":")]),N,(0,r.Lk)("p",null,[(0,r.eW)("DBI 是大气层增强包的内置插件。如果不使用增强包,你也可以手动安装 DBI,具体流程请参考 "),(0,r.Lk)("a",v,[(0,r.eW)("DBI 安装及使用说明"),(0,r.bF)(l)]),(0,r.eW)("。")]),F,(0,r.Lk)("p",null,[(0,r.eW)("如果你不喜欢 DBI 的界面,也可以使用 Awoo Installer 通过 "),(0,r.Lk)("a",P,[(0,r.eW)("NS-USBloader"),(0,r.bF)(l)]),(0,r.eW)(" 来安装 Switch 游戏。")]),R,I,(0,r.Lk)("p",null,[(0,r.eW)("游戏资源可在 "),(0,r.Lk)("a",E,[(0,r.eW)("SWITCH TORRENT LIBRARY"),(0,r.bF)(l)]),(0,r.eW)(" 上获取。这是最大且免费的游戏库,适用于 Nintendo Switch 和其他平台。在测试中,我找到了所有需要的游戏。")]),(0,r.Lk)("p",null,[(0,r.eW)("点击页面上的标题区域,将跳转至 Telegram Bot。向机器人发送游戏的英文名称,机器人将回复游戏的种子文件和版本说明。游戏的英文名称可以在 "),(0,r.Lk)("a",x,[(0,r.eW)("3DMGAME Switch 专区"),(0,r.bF)(l)]),(0,r.eW)("中查找。")]),(0,r.Lk)("p",null,[(0,r.eW)("如果需要金手指,可以在 DBI 游戏安装的第三步将金手指文件复制到 "),O,(0,r.eW)(" 文件夹中。然后,进入相册,打开 Edizon,按下 "),U,(0,r.eW)(" 键进入系统模块管理,开启 Tesla 插件。在需要开启金手指的游戏中,按住 "),z,(0,r.eW)(" 键再按向下方向键,即可激活金手指菜单。金手指资源见 "),(0,r.Lk)("a",H,[(0,r.eW)("Switch520"),(0,r.bF)(l)]),(0,r.eW)("。")]),G,Z,j,(0,r.Lk)("section",J,[(0,r.Lk)("ol",Y,[(0,r.Lk)("li",K,[(0,r.Lk)("p",null,[(0,r.Lk)("a",X,[(0,r.eW)("NS Atmosphere Software Mirror"),(0,r.bF)(l)]),(0,r.eW)(),q])])])])])}]]),$=JSON.parse('{"path":"/posts/2023-10-29-switch-firmware-updates.html","title":"Switch 升级记录与资源汇编","lang":"zh-CN","frontmatter":{"title":"Switch 升级记录与资源汇编","date":"2023-10-29T00:00:00.000Z","category":["工具"],"tag":["games"],"order":-0.03,"description":"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。 注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-10-29-switch-firmware-updates.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Switch 升级记录与资源汇编"}],["meta",{"property":"og:description","content":"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。 注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"games"}],["meta",{"property":"article:published_time","content":"2023-10-29T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Switch 升级记录与资源汇编\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-10-29T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-06T13:15:26.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"更新注入器","slug":"更新注入器","link":"#更新注入器","children":[]},{"level":2,"title":"大气层&主机升级","slug":"大气层-主机升级","link":"#大气层-主机升级","children":[{"level":3,"title":"固件准备","slug":"固件准备","link":"#固件准备","children":[]},{"level":3,"title":"升级流程","slug":"升级流程","link":"#升级流程","children":[]}]},{"level":2,"title":"进入大气层系统","slug":"进入大气层系统","link":"#进入大气层系统","children":[]},{"level":2,"title":"安装游戏","slug":"安装游戏","link":"#安装游戏","children":[{"level":3,"title":"DBI","slug":"dbi","link":"#dbi","children":[]},{"level":3,"title":"NS-USBloader","slug":"ns-usbloader","link":"#ns-usbloader","children":[]}]},{"level":2,"title":"游戏资源","slug":"游戏资源","link":"#游戏资源","children":[]}],"git":{"createdTime":1698547487000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":6.18,"words":1854},"filePathRelative":"_posts/2023-10-29-switch-firmware-updates.md","localizedDate":"2023年10月29日","excerpt":"

    家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。

    \\n

    注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。

    \\n

    以下是我进行升级的步骤:

    \\n

    更新注入器

    \\n

    首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/2024-01-28-learndata-advanced.html.56a78250.js b/assets/js/2024-01-28-learndata-advanced.html.56a78250.js new file mode 100644 index 000000000..f0004123f --- /dev/null +++ b/assets/js/2024-01-28-learndata-advanced.html.56a78250.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2705],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},9939:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>w,data:()=>D});var o=a(7847);const n=(0,o.Lk)("blockquote",null,[(0,o.Lk)("p",null,"本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。")],-1),r={href:"https://newzone.top/posts/2022-08-22-learndata_blog_to_knowledge_management.html",target:"_blank",rel:"noopener noreferrer"},l=(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/2023-12-12-19-00-11.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")],-1),i=(0,o.Lk)("p",null,"但随着使用频率的提升,我也逐渐发现了一些效率上的问题。接下来,我将进一步介绍关于知识搜索和管理方面的 LearnData 博客进阶经验。",-1),p=(0,o.Lk)("h2",{id:"本地搜索与网页端搜索的权衡",tabindex:"-1"},[(0,o.Lk)("a",{class:"header-anchor",href:"#本地搜索与网页端搜索的权衡"},[(0,o.Lk)("span",null,"本地搜索与网页端搜索的权衡")])],-1),d={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},c=(0,o.Fv)('

    随着笔记量的增加,传统的全文本搜索方法开始显得力不从心,我越来越难找到需要的文章。因此,我转而采用了 LearnData 博客集成的 Algolia 和 SearchPro 这两款节点搜索工具进行文章的查询和管理。与 VS Code 的全文本搜索相比,节点搜索不仅提高了搜索效率,更使得大量文章的管理和定位变得更加便捷高效。

    左侧为 VS Code 本地搜索,右侧为网站搜索

    尽管我曾尝试利用 Algolia API 实现本地搜索功能,但由于过于复杂的程序结构和不尽如人意的效果,我最终决定专注于网站端的节点搜索,以此高效地定位所需知识点。

    网页查询与本地文件修改的融合

    虽然用网站搜索文章效率极高,但它引出了一个新问题:如何修改找到的网页内容?

    之前,我需要根据网页链接在本地逐一对照文件,才能进行修改,这一流程随着笔记数量的增长变得异常繁琐。我甚至尝试过将笔记同步到双链笔记工具如 Logseq、Obsidian 中进行管理,但这样做既背离了 LearnData 旨在简单、高效的初衷,同时也缺失了网页博客的分享特性,并容易导致文章结构混乱。

    最终,我采取了一种新的方法:通过脚本将网页路径直接转换为本地路径。这样一来,当我在网页端发现需要修改的内容时,只需运行脚本即可快速定位到本地文件,让网页查询与本地文件修改完美融合。

    LearnData 博客页面直接跳转到本地
    ',8),g={href:"https://getquicker.net/Sharedaction?code=7cd28948-74cb-433c-53de-08dbf9f189d3",target:"_blank",rel:"noopener noreferrer"},s=(0,o.Fv)('

    网址链接转换为本地路径的原理如下:

    1. 获取当前网页的网址。
    2. 替换网址中的固定域名 https://newzone.top/ 为空,并将网页路径的 / 转换为本地路径符号 \\
    3. .html 为分界,取分割后列表的第一部分。
    4. 在文本开头添加本地项目路径 D:\\Backup\\Libraries\\Documents\\GitHub\\LearnData\\docs\\,并在结尾添加 .md
    5. 为解决目录文档路径问题,将 \\.md 替换为 \\README.md

    VS Code 文件排序

    有时,我们可能需要在海量文章中定位最新的文件。VS Code 虽然默认按文件名排序,不支持自定义排序,但以下方法可以帮你实现按最新修改日期排序,优化你的文件管理效率:

    ',4),m=(0,o.Fv)('
  • 通过设置修改排序

    • 使用快捷键 Ctrl+, 或通过菜单「文件」>「首选项」>「设置」进入设置。
    • 在设置中搜索 Explorer: Sort Order 并选择 modified 选项,即可使文件按最后修改日期降序排列。
    VS Code 文件排序设置
    VS Code 文件排序设置
  • ',1),h=(0,o.Lk)("p",null,[(0,o.Lk)("strong",null,"使用 VS Code 扩展"),(0,o.eW)(":")],-1),u={href:"https://marketplace.visualstudio.com/items?itemName=qingshun.explorer-sort-order",target:"_blank",rel:"noopener noreferrer"},f=(0,o.Lk)("li",null,[(0,o.eW)("使用热键 "),(0,o.Lk)("code",null,"Ctrl+F10"),(0,o.eW)(" 即可在名称排序和时间排序之间快速切换。")],-1),b={href:"https://github.com/microsoft/vscode/issues/27286",target:"_blank",rel:"noopener noreferrer"},L=(0,o.Fv)('

    主题笔记的引入

    LearnData 的另一大改变是引入了主题笔记的概念,它允许部分文章同时在博客中更新,并在特定领域的树状栏中展示,打破了传统主侧边栏的限制。

    以文章「飞书迁移记录」为例,它被放在 apps/tutorials/feishu 路径下,在侧边栏中被归类为应用笔记,而不仅仅是博客文章。通过在文章中加入 article 标签,文章内容既能在博客页面展示,也能出现在 RSS 订阅中。

    飞书迁移记录示例
    飞书迁移记录示例

    这种分类方式的优势在于,我可以将新文章有效地归类于树状侧边栏中。同时,article 标签下的文章按 data 排序,时间越新,文章越靠前。因此,只需为笔记添加创建时间 date 标签,文章便会同时出现在 https://newzone.top/article/https://newzone.top/blog.html 以及 RSS 地址 https://newzone.top/rss.xml 下,并且不会干扰原有的排序逻辑。

    结语

    随着 LearnData 博客的持续优化,改变了一些我对双链笔记的看法,它在海量笔记的管理方面优势明显。但我仍然认为,双链笔记并不适合知识库

    这是因为,在大多数情况下,笔记的积累变成了一种简单的堆砌过程,而不是一个持续的修改、整合和消化的过程。真正的知识管理不应该仅仅是对信息的收集和堆积。拿这篇文章来说,初稿早在 2023 年 12 月就已完成。但为了对外分享,我必须将那些只有我自己能理解的内容进行重构和规范化。正是在这个过程中,我对 LearnData 的思考变得更加清晰,并且想出了用脚本一键定位文章的新方法。如果这篇文章仅仅是我的私人笔记,它可能就会永远停留在初稿阶段,我也不会意识到进一步利用它的必要性。

    在今天这个双链笔记看似无所不能的时代,作为坚持博客形式的少数派,我的做法可能会被一些人视为不必要的复杂和折腾。然而,正是用博客管理知识库的方法,让我的个人效率得到了显著的提升。希望我的这些经验和思考,能为同样致力于高效知识管理的朋友们带来一些新的启示和帮助。

    ',9),k={},w=(0,a(3671).A)(k,[["render",function(e,t){const a=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[n,(0,o.Lk)("p",null,[(0,o.eW)("自从我放弃了 Notion 等传统知识管理工具,转而尝试将"),(0,o.Lk)("a",r,[(0,o.eW)("博客转化为知识库"),(0,o.bF)(a)]),(0,o.eW)("以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。")]),l,i,p,(0,o.Lk)("p",null,[(0,o.eW)("在 "),(0,o.Lk)("a",d,[(0,o.eW)("LearnData 开源笔记"),(0,o.bF)(a)]),(0,o.eW)(" 的早期,只有 37 篇笔记和一些博客文章。当我开始将笔记主题化,用短篇形式记录具体知识点时,内容数量迅速增长,例如,关于 Docker 容器的部署笔记就超过了 20 篇。")]),c,(0,o.Lk)("p",null,[(0,o.eW)("如果你安装了 Quicker,可以通过安装 "),(0,o.Lk)("a",g,[(0,o.eW)("博客定位本地"),(0,o.bF)(a)]),(0,o.eW)(" 动作来实现这一功能。这个脚本不仅适用于 LearnData 项目,同样可以应用于其他静态博客。")]),s,(0,o.Lk)("ol",null,[m,(0,o.Lk)("li",null,[h,(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.eW)("安装我开发的 "),(0,o.Lk)("a",u,[(0,o.eW)("Explorer Sort Order"),(0,o.bF)(a)]),(0,o.eW)(" 扩展。")]),f])])]),(0,o.Lk)("p",null,[(0,o.eW)("尽管社区早在 2017 年的 "),(0,o.Lk)("a",b,[(0,o.eW)("Explorer/Opened Editors Sorting"),(0,o.bF)(a)]),(0,o.eW)(" 讨论中提出了自定义排序的需求,但由于官方尚未采纳相关解决方案,我们仍需依赖这些小技巧来优化文件管理体验。")]),L])}]]),D=JSON.parse('{"path":"/posts/2024-01-28-learndata-advanced.html","title":"LearnData 博客:高效知识管理和进阶应用技巧","lang":"zh-CN","frontmatter":{"title":"LearnData 博客:高效知识管理和进阶应用技巧","date":"2024-01-28T00:00:00.000Z","category":["博客"],"order":-57,"description":" 本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。 自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。 但随着使用频...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2024-01-28-learndata-advanced.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"LearnData 博客:高效知识管理和进阶应用技巧"}],["meta",{"property":"og:description","content":" 本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。 自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。 但随着使用频..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-12-19-00-11.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"LearnData 博客:高效知识管理和进阶应用技巧"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:published_time","content":"2024-01-28T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"LearnData 博客:高效知识管理和进阶应用技巧\\",\\"image\\":[\\"https://img.newzone.top/2023-12-12-19-00-11.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-12-08-01-10.png?imageMogr2/format/webp \\\\\\"左侧为 VS Code 本地搜索,右侧为网站搜索\\\\\\"\\",\\"https://img.newzone.top/learndata2local.gif?imageMogr2/format/webp \\\\\\"LearnData 博客页面直接跳转到本地\\\\\\"\\",\\"https://img.newzone.top/2024-01-23-05-29-33.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2024-01-23-05-45-34.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2024-01-28T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-06T13:15:26.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"本地搜索与网页端搜索的权衡","slug":"本地搜索与网页端搜索的权衡","link":"#本地搜索与网页端搜索的权衡","children":[]},{"level":2,"title":"网页查询与本地文件修改的融合","slug":"网页查询与本地文件修改的融合","link":"#网页查询与本地文件修改的融合","children":[]},{"level":2,"title":"VS Code 文件排序","slug":"vs-code-文件排序","link":"#vs-code-文件排序","children":[]},{"level":2,"title":"主题笔记的引入","slug":"主题笔记的引入","link":"#主题笔记的引入","children":[]},{"level":2,"title":"结语","slug":"结语","link":"#结语","children":[]}],"git":{"createdTime":1706531262000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":6.18,"words":1855},"filePathRelative":"_posts/2024-01-28-learndata-advanced.md","localizedDate":"2024年1月28日","excerpt":"
    \\n

    本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。

    \\n
    \\n

    自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/216.e132ea28.js b/assets/js/216.e132ea28.js new file mode 100644 index 000000000..ceb1db843 --- /dev/null +++ b/assets/js/216.e132ea28.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[216],{8457:(t,e,s)=>{s.d(e,{L:()=>a,P:()=>w,T:()=>h,a:()=>l,m:()=>p,s:()=>d,u:()=>f});var i=s(5781),n=s(4158);Symbol(0);var r;class a extends n.O{constructor(){super(...arguments),this.r=[],this[r]=!1}get length(){return this.r.length}get readonly(){return this[i.L.Zb]}toArray(){return[...this.r]}[(r=i.L.Zb,Symbol.iterator)](){return this.r.values()}[i.L.oa](t,e){const s=this.r.length;""+s in this||Object.defineProperty(this,s,{get(){return this.r[s]}}),this.r.includes(t)||(this.r.push(t),this.dispatchEvent(new n.D("add",{detail:t,trigger:e})))}[i.L.Yb](t,e){const s=this.r.indexOf(t);s>=0&&(this[i.L.oe]?.(t,e),this.r.splice(s,1),this.dispatchEvent(new n.D("remove",{detail:t,trigger:e})))}[i.L.H](t){for(const e of[...this.r])this[i.L.Yb](e,t);this.r=[],this[i.L.Mc](!1,t),this[i.L.ne]?.()}[i.L.Mc](t,e){this[i.L.Zb]!==t&&(this[i.L.Zb]=t,this.dispatchEvent(new n.D("readonly-change",{detail:t,trigger:e})))}}class h{get length(){return this.$.length}constructor(t,e){(0,n.w)(t)?this.$=t:(0,n.i)(t)||(0,n.i)(e)?this.$=[]:this.$=[[t,e]]}start(t){return this.$[t][0]??1/0}end(t){return this.$[t][1]??1/0}}function o(t){if(!t.length)return null;let e=t.start(0);for(let s=1;se&&(e=i)}return e}const l=new n.S({audioTracks:[],audioTrack:null,autoplay:!1,autoplayError:null,buffered:new h,duration:0,canLoad:!1,canFullscreen:!1,canOrientScreen:(0,i.a)(),canPictureInPicture:!1,canPlay:!1,controls:!1,controlsVisible:!1,crossorigin:null,currentTime:0,ended:!1,error:null,fullscreen:!1,loop:!1,logLevel:"silent",mediaType:"unknown",muted:!1,paused:!0,played:new h,playing:!1,playsinline:!1,pictureInPicture:!1,preload:"metadata",playbackRate:1,qualities:[],quality:null,autoQuality:!1,canSetQuality:!0,canSetPlaybackRate:!0,canSetVolume:!1,seekable:new h,seeking:!1,source:{src:"",type:""},sources:[],started:!1,textTracks:[],textTrack:null,volume:1,waiting:!1,get title(){return this.providedTitle||this.inferredTitle},get poster(){return this.providedPoster||this.inferredPoster},get viewType(){return"unknown"!==this.providedViewType?this.providedViewType:this.inferredViewType},get streamType(){return"unknown"!==this.providedStreamType?this.providedStreamType:this.inferredStreamType},get currentSrc(){return this.source},get bufferedStart(){return o(this.buffered)??0},get bufferedEnd(){return c(this.buffered)??0},get seekableStart(){return o(this.seekable)??0},get seekableEnd(){return this.canPlay?c(this.seekable)??1/0:0},get seekableWindow(){return Math.max(0,this.seekableEnd-this.seekableStart)},pointer:"fine",orientation:"landscape",width:0,height:0,mediaWidth:0,mediaHeight:0,userBehindLiveEdge:!1,liveEdgeTolerance:10,minLiveDVRWindow:60,get canSeek(){return/unknown|on-demand|:dvr/.test(this.streamType)&&Number.isFinite(this.seekableWindow)&&(!this.live||/:dvr/.test(this.streamType)&&this.seekableWindow>=this.minLiveDVRWindow)},get live(){return this.streamType.includes("live")||!Number.isFinite(this.duration)},get liveEdgeStart(){return this.live&&Number.isFinite(this.seekableEnd)?Math.max(0,(this.liveSyncPosition??this.seekableEnd)-this.liveEdgeTolerance):0},get liveEdge(){return this.live&&(!this.canSeek||!this.userBehindLiveEdge&&this.currentTime>=this.liveEdgeStart)},get liveEdgeWindow(){return this.live&&Number.isFinite(this.seekableEnd)?this.seekableEnd-this.liveEdgeStart:0},autoplaying:!1,providedTitle:"",inferredTitle:"",providedPoster:"",inferredPoster:"",inferredViewType:"unknown",providedViewType:"unknown",providedStreamType:"unknown",inferredStreamType:"unknown",liveSyncPosition:null}),u=new Set(["autoplay","canFullscreen","canLoad","canPictureInPicture","canSetVolume","controls","crossorigin","fullscreen","height","inferredViewType","logLevel","loop","mediaHeight","mediaType","mediaWidth","muted","orientation","pictureInPicture","playsinline","pointer","preload","providedPoster","providedStreamType","providedTitle","providedViewType","source","sources","textTrack","textTracks","volume","width"]);function d(t){l.reset(t,(t=>!u.has(t))),(0,n.P)()}const p=(0,n.Q)();function f(){return(0,n.J)(p)}const g=eval,b=/:\s+'?"?(.*?)'?"?\)/g,m=/\s+not\s+/g,y=/\s+and\s+/g,$=/\s+or\s+/g,v=/(\d)px/g;class w extends n.O{constructor(t,e){super(),this.ec=(0,n.m)("true"),this.Xc=new Set,this.Yc=(0,n.m)(!0),this.$matches=(0,n.n)((()=>{let t=this.ec();if("never"===t)return!1;for(const e of this.Xc){const s=this.Le[e](),i=(0,n.r)(s)?`'${s}'`:s+"";t=t.replace((0,n.K)(e),i)}return g(`!!(${t})`)&&this.Yc()})),this.Ke=e,this.Le=t,(0,n.R)((t=>{(0,n.e)(this.jg.bind(this)),(0,n.e)(this.kg.bind(this)),this.Me=t}))}static{this.create=t=>{const e=f();return new w(e.$state,t)}}get query(){return(0,n.T)(this.Ke)}get matches(){return this.$matches()}jg(){const t=this.query;if(""===t)return;if("never"===t)return void this.ec.set(t);const e=t.trim().split(/\s*,\s*/g),s=e.filter((t=>t.startsWith("@media"))).join(","),i=e.filter((t=>!t.startsWith("@media")));if(s.length){const t=window.matchMedia(s.replace(/@media\s/g,"")),e=()=>{this.Yc.set(t.matches)};e(),(0,n.l)(t,"change",e)}if(i.length){const t=this.lg(i),e=Object.keys(l.record);for(const s of t.matchAll(/\(([-a-zA-Z]+)\s/g)){const t=(0,n.U)(s[1]);e.includes(t)&&this.Xc.add(t)}this.ec.set(t)}return()=>{this.Xc.clear(),this.ec.set("true"),this.Yc.set(!0)}}kg(){this.$matches(),this.dispatchEvent(new Event("change"))}lg(t){return t.map((t=>"("+t.replace(b,' == "$1")').replace(m,"!").replace(y," && ").replace($," || ").replace(v,"$1").trim()+")")).join(" || ")}destroy(){this.Me()}}},9724:(t,e,s)=>{s.d(e,{a:()=>u,b:()=>l,c:()=>d,d:()=>p,e:()=>r,f:()=>a,h:()=>f,i:()=>o,o:()=>h,r:()=>c,s:()=>n});var i=s(4158);function n(t,e,s){t.hasAttribute(e)||t.setAttribute(e,s)}function r(t,e){t.hasAttribute("aria-label")||(0,i.e)((function(){(0,i.k)(t,"aria-label",e())}))}function a(t,e,s){for(;e;){if(e===t)return!0;if(s?.(e))break;e=e.parentElement}return!1}function h(t,e){(0,i.l)(t,"pointerup",(t=>{0===t.button&&e(t)})),(0,i.l)(t,"keydown",(t=>{(0,i.b)(t)&&e(t)}))}function o(t){return(0,i.c)(t)&&(t.touches.length>1||t.changedTouches.length>1)}function c(t){let e=(0,i.g)(),s=window.requestAnimationFrame((()=>{(0,i.s)(t,e),s=-1}));return()=>{window.cancelAnimationFrame(s)}}function l(t,e,s){let n,r=t,a=t.parentElement,h=t.content.firstElementChild,o=[];!h&&t.firstElementChild&&(t.innerHTML=t.firstElementChild.outerHTML,t.firstElementChild.remove(),h=t.content.firstElementChild);for(let t=0;t{for(let t=0;ts.includes("top")?`calc(-1 * ${t})`:t;return(0,i.h)(e,t,(()=>{(0,i.j)(e,t,{placement:o,...h}).then((({x:e,y:s})=>{Object.assign(t.style,{top:`calc(${s+"px"} + ${c(a?a+"px":`var(--${n}-y-offset, 0px)`)})`,left:`calc(${e+"px"} + ${r?r+"px":`var(--${n}-x-offset, 0px)`})`})}))}))}function f(t){return"none"!==getComputedStyle(t).animationName}},4123:(t,e,s)=>{s.d(e,{T:()=>c,a:()=>n,b:()=>b,c:()=>$,d:()=>u,f:()=>l,g:()=>o,i:()=>y,l:()=>h,o:()=>d,p:()=>r});var i=s(4158);function n(t,e){const s=new URLSearchParams;for(const t of Object.keys(e))s.set(t,e[t]+"");return t+"?"+s.toString()}function r(t,e="preconnect"){const s=document.querySelector(`link[href="${t}"]`);if(!(0,i.N)(s))return!0;const n=document.createElement("link");return n.rel=e,n.href=t,n.crossOrigin="true",document.head.append(n),!0}const a={};function h(t){if(a[t])return a[t].promise;const e=(0,i.v)(),s=document.querySelector(`script[src="${t}"]`);if(!(0,i.N)(s))return e.resolve(),e.promise;const n=document.createElement("script");return n.src=t,n.onload=()=>{e.resolve(),delete a[t]},n.onerror=()=>{e.reject(),delete a[t]},setTimeout((()=>document.head.append(n)),0),e.promise}function o(t){return"use-credentials"===t?"include":(0,i.r)(t)?"same-origin":void 0}const c={Sa:Symbol(0),M:Symbol(0),Ta:Symbol(0),P:Symbol(0),Ua:Symbol(0),T:Symbol(0),te:Symbol(0)};function l(t,e){for(let s=0,i=t.length;s=t.startTime&&er.includes(t.kind)&&"showing"===t.mode));if(a!==n){if(!a)return s(null),void(n=null);2==a.readyState?s(a):(s(null),a.addEventListener("load",(()=>s(a)),{once:!0})),n=a}}return r(),(0,i.l)(t,"mode-change",r)}var p,f,g;class b extends i.O{constructor(t){super(),this.id="",this.label="",this.language="",this.default=!1,this.P=!1,this.Va=0,this.I="disabled",this.ue={},this.ac=[],this.J=[],this.Wa=[],this[p]=0,this[f]=null,this[g]=null;for(const e of Object.keys(t))this[e]=t[e];this.type||(this.type="vtt"),t.content?s.e(9701).then(s.bind(s,9701)).then((({parseText:e,VTTCue:s,VTTRegion:i})=>{"json"===t.type?this.ve(t.content,s,i):e(t.content,{type:t.type}).then((({cues:t,regions:e})=>{this.J=t,this.ac=e,this.M()}))})):t.src||(this[c.M]=2)}static createId(t){return`id::${t.type}-${t.kind}-${t.src??t.label}`}get metadata(){return this.ue}get regions(){return this.ac}get cues(){return this.J}get activeCues(){return this.Wa}get readyState(){return this[c.M]}get mode(){return this.I}set mode(t){this.setMode(t)}addCue(t,e){let s=0,n=this.J.length;for(s=0;s=0){const n=this.Wa.includes(t);this.J.splice(s,1),this[c.T]?.track.removeCue(t),this.dispatchEvent(new i.D("remove-cue",{detail:t,trigger:e})),n&&this[c.Ta](this.Va,e)}}setMode(t,e){this.I!==t&&(this.I=t,"disabled"===t?(this.Wa=[],this.we()):2===this.readyState?this[c.Ta](this.Va,e):this.xe(),this.dispatchEvent(new i.D("mode-change",{detail:this,trigger:e})),this[c.Ua]?.())}[(p=c.M,f=c.Ua,g=c.T,c.Ta)](t,e){if(this.Va=t,"disabled"===this.mode||!this.J.length)return;const s=[];for(let e=0,i=this.J.length;e0)){this[c.M]=1,this.dispatchEvent(new i.D("load-start"));try{const{parseResponse:t,VTTCue:e,VTTRegion:i}=await s.e(9701).then(s.bind(s,9701)),n=this[c.Sa]?.(),r=fetch(this.src,{headers:"json"===this.type?{"Content-Type":"application/json"}:void 0,credentials:o(n)});if("json"===this.type)this.ve(await(await r).text(),e,i);else{const{errors:e,metadata:s,regions:i,cues:n}=await t(r,{type:this.type,encoding:this.encoding});if(0===e[0]?.code)throw e[0];this.ue=s,this.ac=i,this.J=n}this.M()}catch(t){this.ye(t)}}}M(){if(this[c.M]=2,!this.src||"vtt"!==this.type){const t=this[c.T]?.track;if(t)for(const e of this.J)t.addCue(e)}const t=new i.D("load");this[c.Ta](this.Va,t),this.dispatchEvent(t)}ye(t){this[c.M]=3,this.dispatchEvent(new i.D("error",{detail:t}))}ve(t,e,s){try{const{regions:i,cues:n}=$(t,e,s);this.ac=i,this.J=n}catch(t){this.ye(t)}}we(t){this.dispatchEvent(new i.D("cue-change",{trigger:t}))}}const m=/captions|subtitles/;function y(t){return m.test(t.kind)}function $(t,e,s){const n=JSON.parse(t);let r=[],a=[];return n.regions&&s&&(r=n.regions.map((t=>Object.assign(new s,t)))),(n.cues||(0,i.w)(n))&&(a=((0,i.w)(n)?n:n.cues).filter((t=>(0,i.a)(t.startTime)&&(0,i.a)(t.endTime))).map((t=>Object.assign(new e(0,0,""),t)))),{regions:r,cues:a}}},449:(t,e,s)=>{s.d(e,{A:()=>n,V:()=>a,a:()=>u,b:()=>r,c:()=>h,d:()=>f,g:()=>p,i:()=>l,r:()=>d});var i=s(4158);const n=/\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i,r=new Set(["audio/mpeg","audio/ogg","audio/3gp","audio/mp4","audio/webm","audio/flac"]),a=/\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i,h=new Set(["video/mp4","video/webm","video/3gp","video/ogg","video/avi","video/mpeg"]),o=/\.(m3u8)($|\?)/i,c=new Set(["application/vnd.apple.mpegurl","audio/mpegurl","audio/x-mpegurl","application/x-mpegurl","video/x-mpegurl","video/mpegurl","application/mpegurl"]);function l({src:t,type:e}){return(0,i.r)(t)&&o.test(t)||c.has(e)}function u(t){return void 0!==window.MediaStream&&t instanceof window.MediaStream}function d(t,e=2){return Number(t.toFixed(e))}function p(t){return String(t).split(".")[1]?.length??0}function f(t,e,s){return Math.max(t,Math.min(s,e))}},5781:(t,e,s)=>{s.d(e,{I:()=>o,L:()=>n,a:()=>l,b:()=>u,c:()=>f,d:()=>d,e:()=>p,g:()=>c,h:()=>h,i:()=>g});var i=s(4158);const n={oa:Symbol(0),Yb:Symbol(0),H:Symbol(0),pa:Symbol(0),Zb:Symbol(0),Mc:Symbol(0),ne:Symbol(0),oe:Symbol(0),pe:Symbol(0)},r=navigator?.userAgent.toLowerCase()||"",a=/iphone|ipad|ipod|ios|crios|fxios/i.test(r),h=/(iphone|ipod)/gi.test(navigator?.platform||""),o=!!window.chrome,c=!!window.safari||a;function l(){return!(0,i.i)(window.screen.orientation)&&!(0,i.i)(window.screen.orientation.lock)&&(0,i.x)(screen.orientation.unlock)}function u(t){return t||(t=document.createElement("video")),t.canPlayType("application/vnd.apple.mpegurl").length>0}function d(t){return!!document.pictureInPictureEnabled&&!t.disablePictureInPicture}function p(t){return(0,i.x)(t?.webkitSupportsPresentationMode)&&(0,i.x)(t?.webkitSetPresentationMode)}async function f(){const t=document.createElement("video");return t.volume=.5,await(0,i.y)(0),.5===t.volume}function g(){const t=window?.MediaSource??window?.WebKitMediaSource;if((0,i.i)(t))return!1;const e=t&&(0,i.x)(t.isTypeSupported)&&t.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),s=window?.SourceBuffer??window?.WebKitSourceBuffer,n=(0,i.i)(s)||!(0,i.i)(s.prototype)&&(0,i.x)(s.prototype.appendBuffer)&&(0,i.x)(s.prototype.remove);return!!e&&!!n}},4158:(t,e,s)=>{s.d(e,{$:()=>Mt,D:()=>rt,F:()=>ct,G:()=>dt,H:()=>Xe,I:()=>Ot,J:()=>kt,K:()=>Ft,L:()=>Kt,M:()=>U,N:()=>J,O:()=>ht,P:()=>w,Q:()=>vt,R:()=>$,S:()=>Dt,T:()=>Vt,U:()=>Rt,V:()=>Bt,W:()=>Ne,X:()=>Ct,Y:()=>Xt,Z:()=>wt,_:()=>Nt,a:()=>_,a0:()=>qt,a1:()=>B,a2:()=>Ht,a3:()=>yt,a4:()=>xt,a5:()=>ut,a6:()=>Wt,b:()=>pt,c:()=>lt,d:()=>Ye,e:()=>$t,f:()=>gt,g:()=>k,h:()=>qe,i:()=>X,j:()=>De,k:()=>ft,l:()=>ot,m:()=>bt,n:()=>mt,o:()=>P,p:()=>v,q:()=>I,r:()=>Y,s:()=>x,t:()=>Z,u:()=>G,v:()=>Qt,w:()=>et,x:()=>tt,y:()=>zt,z:()=>It});const i=Symbol(0);let n=!1,r=!1,a=null,h=null,o=null,c=0,l=[],u={};const d=()=>{},p=0,f=1,g=2,b=3;function m(){if(l.length){r=!0;for(let t=0;t=0;t--)H(e[t])}function $(t){const e=I();return j(e,t.length?t.bind(null,S.bind(e)):t,null)}function v(t){return j(a,t,null)}function w(){r||m()}function k(){return a}function x(t,e){try{return j(e,t,null)}catch(t){return void L(e,t)}}function T(t,e=a){return e?.$cx[t]}function P(t){if(!t||!a)return t||d;const e=a;return e.$d?Array.isArray(e.$d)?e.$d.push(t):e.$d=[e.$d,t]:e.$d=t,function(){e.$st!==b&&(t.call(null),V(e.$d)?e.$d=null:Array.isArray(e.$d)&&e.$d.splice(e.$d.indexOf(t),1))}}function S(t=!0){if(this.$st===b)return;let e=t?this.$ps||this[i]:this,s=this.$ns,n=null;for(;s&&s[i]===this;)S.call(s,!0),E(s),n=s.$ns,s.$ns=null,s=n;t&&E(this),s&&(s.$ps=t?this.$ps:this),e&&(e.$ns=s)}function E(t){t.$st=b,t.$d&&A(t),t.$s&&z(t,0),t.$ps&&(t.$ps.$ns=null),t[i]=null,t.$s=null,t.$o=null,t.$ps=null,t.$cx=u,t.$eh=null}function A(t){try{if(Array.isArray(t.$d))for(let e=t.$d.length-1;e>=0;e--){const s=t.$d[e];s.call(s)}else t.$d.call(t.$d);t.$d=null}catch(e){L(t,e)}}function j(t,e,s){const i=a,n=h;a=t,h=s;try{return e.call(t)}finally{a=i,h=n}}function L(t,e){if(!t||!t.$eh)throw e;let s=0,i=t.$eh.length,n=C(e);for(s=0;s0){t.$s.length=c+o.length;for(let e=0;e=e)&&(t.$e&&t.$st===p&&(l.push(t),n||(n=!0,queueMicrotask(m))),t.$st=e,t.$o))for(let e=0;ee===t))}hasType(t){return!!this.findType(t)}findType(t){return this.chain.find((e=>e.type===t))}walk(t){for(const e of this.chain){const s=t(e);if(s)return[e,s]}}[Symbol.iterator](){return this.chain.values()}}class ht extends EventTarget{addEventListener(t,e,s){return super.addEventListener(t,e,s)}removeEventListener(t,e,s){return super.removeEventListener(t,e,s)}}function ot(t,e,s,i){return t.addEventListener(e,s,i),P((()=>t.removeEventListener(e,s,i)))}function ct(t){return!!t?.type.startsWith("pointer")}function lt(t){return!!t?.type.startsWith("touch")}function ut(t){return/^(click|mouse)/.test(t?.type??"")}function dt(t){return!!t?.type.startsWith("key")}function pt(t){return dt(t)&&("Enter"===t.key||" "===t.key)}function ft(t,e,s){if(t)if(s||""===s||0===s){const i=!0===s?"":s+"";t.getAttribute(e)!==i&&t.setAttribute(e,i)}else t.removeAttribute(e)}function gt(t,e,s){t&&(s||0===s?t.style.setProperty(e,s+""):t.style.removeProperty(e))}function bt(t,e){const s=N(t,null,e),n=O.bind(s);return n[i]=!0,n.set=M.bind(s),n}function mt(t,e){const s=N(e?.initial,t,e),n=O.bind(s);return n[i]=!0,n}function yt(t){return function(t){return V(t)&&i in t}(t)&&"set"in t}const $t=function(t,e){const s=N(null,(function(){let e=t();return V(e)&&P(e),null}),void 0);return s.$e=!0,K(s),S.bind(s,!0)};function vt(t){return{id:Symbol(),provide:t}}function wt(t,e,s=k()){const i=!X(e);!function(t,e,s=a){s&&(s.$cx={...s.$cx,[t]:e})}(t.id,i?e:t.provide?.(),s)}function kt(t){return T(t.id)}function xt(t){return!X(T(t.id))}const Tt=Symbol(0),Pt=Symbol(0),St=Symbol(0);var Et;const At={};class jt{constructor(t,e,s){this[Et]=null,this.$el=bt(null),this.a=null,this.d=null,this.f=null,this.g=null,this.e=null,this.o=!1,this.i=At,this.b=null,this.c=null,this.l=[],this.m=[],this.j=[],this.n=[],this.d=e,s?.scope&&s.scope.append(e);let i=t.state,n=t.props;if(i&&(this.h=i.create(),this.k=new Proxy(this.h,{get:(t,e)=>this.h[e]()}),wt(i,this.h)),n&&(this.i=function(t){const e={};for(const s of Object.keys(t)){const i=t[s];e[s]=bt(i,i)}return e}(n),s?.props))for(const t of Object.keys(s.props))this.i[t]?.set(s.props[t]);P(this.p.bind(this))}static{Et=St}w(){x((()=>{for(const t of this.l)t()}),this.d)}x(t){this.a||(this.a=t,this.$el.set(t),x((()=>{this.f=I(),x((()=>{for(const t of this.m)t(this.a);this.q(),this.r()}),this.f)}),this.d),t.dispatchEvent(new Event("attached")))}s(){this.f?.dispose(),this.f=null,this.g=null,this.a=null,this.$el.set(null)}y(){this.a&&this.f&&this.j.length&&x((()=>{this.g=I(),x((()=>{for(const t of this.j)t(this.a)}),this.g)}),this.f)}z(){this.g?.dispose(),this.g=null}p(){if(this.o)return;this.o=!0,x((()=>{for(const t of this.n)t(this.a)}),this.d);const t=this.a;this.s(),this.d.dispose(),this.l.length=0,this.m.length=0,this.j.length=0,this.n.length=0,this.e=null,this.b=null,this.c=null,this.i=At,this.d=null,this.k=At,this.h=null,t&&delete t.$}t(t){t.onSetup&&this.l.push(t.onSetup.bind(t)),t.onAttach&&this.m.push(t.onAttach.bind(t)),t.onConnect&&this.j.push(t.onConnect.bind(t)),t.onDestroy&&this.n.push(t.onDestroy.bind(t))}q(){if(this.b)for(const t of Object.keys(this.b))tt(this.b[t])?$t(this.u.bind(this,t)):ft(this.a,t,this.b[t])}r(){if(this.c)for(const t of Object.keys(this.c))tt(this.c[t])?$t(this.v.bind(this,t)):gt(this.a,t,this.c[t])}u(t){ft(this.a,t,this.b[t].call(this.e))}v(t){gt(this.a,t,this.c[t].call(this.e))}}let Lt={$$:null};class Ct extends EventTarget{constructor(){super(),Lt.$$&&this.attach(Lt)}get el(){return this.$$.a}get $el(){return this.$$.$el()}get scope(){return this.$$.d}get attachScope(){return this.$$.f}get connectScope(){return this.$$.g}get $props(){return this.$$.i}get $state(){return this.$$.h}get state(){return this.$$.k}attach({$$:t}){return this.$$=t,t.t(this),this}addEventListener(t,e,s){this.listen(t,e,s)}removeEventListener(t,e,s){this.el?.removeEventListener(t,e,s)}setAttributes(t){this.$$.b||(this.$$.b={}),Object.assign(this.$$.b,t)}setStyles(t){this.$$.c||(this.$$.c={}),Object.assign(this.$$.c,t)}setCSSVars(t){this.setStyles(t)}createEvent(t,...e){return new rt(t,e[0])}dispatch(t,...e){if(!this.el)return!1;const s=t instanceof Event?t:new rt(t,e[0]);return Object.defineProperty(s,"target",{get:()=>this.$$.e}),j(null,(()=>(this.$$[St]?.(s),this.el.dispatchEvent(s))),null)}dispatchEvent(t){return this.dispatch(t)}listen(t,e,s){return this.el?ot(this.el,t,e,s):B}}class Ot extends Ct{subscribe(t){return x((()=>$t((()=>t(this.state)))),this.$$.d)}destroy(){this.$$.p()}}function Mt(t,e,s){t[Tt]||(t[Tt]=new Set),t[Tt].add(e)}function qt(t,e,s){t[Pt]||(t[Pt]=new Set),t[Pt].add(e)}class Dt{constructor(t){this.id=Symbol(0),this.record=t,this.A=Object.getOwnPropertyDescriptors(t)}create(){const t={},e=new Proxy(t,{get:(e,s)=>t[s]()});for(const s of Object.keys(this.record)){const i=this.A[s].get;t[s]=i?mt(i.bind(e)):bt(this.record[s])}return t}reset(t,e){for(const s of Object.keys(t))this.A[s].get||e&&!e(s)||t[s].set(this.record[s])}}function It(t){return kt(t)}function Ft(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Rt(t){return t.replace(/-./g,(t=>t[1].toUpperCase()))}function Nt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function Vt(t){return tt(t)?t():t}function Ht(t){return t?"true":"false"}function Wt(){const t=new Set;return{add(...e){for(const s of e)t.add(s)},empty(){for(const e of t)e();t.clear()}}}function Kt(){const t=Wt();return P(t.empty),t}function Qt(){let t,e;return{promise:new Promise(((s,i)=>{t=s,e=i})),resolve:t,reject:e}}function zt(t){return new Promise((e=>setTimeout(e,t)))}function Bt(t){let e,s=-1;return function(...i){e=i,s>=0||(s=window.requestAnimationFrame((()=>{t.apply(this,e),s=-1,e=void 0})))}}const Jt="undefined"!=typeof window?"requestIdleCallback"in window?window.requestIdleCallback:t=>window.setTimeout(t,1):B;function Xt(t,e){return new Promise((s=>{Jt((e=>{t?.(e),s()}),e)}))}const Ut=Math.min,Zt=Math.max,_t=Math.round,Yt=Math.floor,Gt=t=>({x:t,y:t});function te(t){return t.split("-")[0]}function ee(t){return["top","bottom"].includes(te(t))?"y":"x"}function se(t){return{...t,top:t.y,left:t.x,right:t.x+t.width,bottom:t.y+t.height}}function ie(t,e,s){let{reference:i,floating:n}=t;const r=ee(e),a=function(t){return"x"===ee(t)?"y":"x"}(e),h="y"===a?"height":"width",o=te(e),c="y"===r,l=i.x+i.width/2-n.width/2,u=i.y+i.height/2-n.height/2,d=i[h]/2-n[h]/2;let p;switch(o){case"top":p={x:l,y:i.y-n.height};break;case"bottom":p={x:l,y:i.y+i.height};break;case"right":p={x:i.x+i.width,y:u};break;case"left":p={x:i.x-n.width,y:u};break;default:p={x:i.x,y:i.y}}switch(function(t){return t.split("-")[1]}(e)){case"start":p[a]-=d*(s&&c?-1:1);break;case"end":p[a]+=d*(s&&c?-1:1)}return p}function ne(t){return he(t)?(t.nodeName||"").toLowerCase():"#document"}function re(t){var e;return(null==t||null==(e=t.ownerDocument)?void 0:e.defaultView)||window}function ae(t){var e;return null==(e=(he(t)?t.ownerDocument:t.document)||window.document)?void 0:e.documentElement}function he(t){return t instanceof Node||t instanceof re(t).Node}function oe(t){return t instanceof Element||t instanceof re(t).Element}function ce(t){return t instanceof HTMLElement||t instanceof re(t).HTMLElement}function le(t){return"undefined"!=typeof ShadowRoot&&(t instanceof ShadowRoot||t instanceof re(t).ShadowRoot)}function ue(t){const{overflow:e,overflowX:s,overflowY:i,display:n}=be(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+s)&&!["inline","contents"].includes(n)}function de(t){return["table","td","th"].includes(ne(t))}function pe(t){const e=fe(),s=be(t);return"none"!==s.transform||"none"!==s.perspective||!!s.containerType&&"normal"!==s.containerType||!e&&!!s.backdropFilter&&"none"!==s.backdropFilter||!e&&!!s.filter&&"none"!==s.filter||["transform","perspective","filter"].some((t=>(s.willChange||"").includes(t)))||["paint","layout","strict","content"].some((t=>(s.contain||"").includes(t)))}function fe(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function ge(t){return["html","body","#document"].includes(ne(t))}function be(t){return re(t).getComputedStyle(t)}function me(t){return oe(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function ye(t){if("html"===ne(t))return t;const e=t.assignedSlot||t.parentNode||le(t)&&t.host||ae(t);return le(e)?e.host:e}function $e(t){const e=ye(t);return ge(e)?t.ownerDocument?t.ownerDocument.body:t.body:ce(e)&&ue(e)?e:$e(e)}function ve(t,e,s){var i;void 0===e&&(e=[]),void 0===s&&(s=!0);const n=$e(t),r=n===(null==(i=t.ownerDocument)?void 0:i.body),a=re(n);return r?e.concat(a,a.visualViewport||[],ue(n)?n:[],a.frameElement&&s?ve(a.frameElement):[]):e.concat(n,ve(n,[],s))}function we(t){const e=be(t);let s=parseFloat(e.width)||0,i=parseFloat(e.height)||0;const n=ce(t),r=n?t.offsetWidth:s,a=n?t.offsetHeight:i,h=_t(s)!==r||_t(i)!==a;return h&&(s=r,i=a),{width:s,height:i,$:h}}function ke(t){return oe(t)?t:t.contextElement}function xe(t){const e=ke(t);if(!ce(e))return Gt(1);const s=e.getBoundingClientRect(),{width:i,height:n,$:r}=we(e);let a=(r?_t(s.width):s.width)/i,h=(r?_t(s.height):s.height)/n;return a&&Number.isFinite(a)||(a=1),h&&Number.isFinite(h)||(h=1),{x:a,y:h}}const Te=Gt(0);function Pe(t){const e=re(t);return fe()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:Te}function Se(t,e,s,i){void 0===e&&(e=!1),void 0===s&&(s=!1);const n=t.getBoundingClientRect(),r=ke(t);let a=Gt(1);e&&(i?oe(i)&&(a=xe(i)):a=xe(t));const h=function(t,e,s){return void 0===e&&(e=!1),!(!s||e&&s!==re(t))&&e}(r,s,i)?Pe(r):Gt(0);let o=(n.left+h.x)/a.x,c=(n.top+h.y)/a.y,l=n.width/a.x,u=n.height/a.y;if(r){const t=re(r),e=i&&oe(i)?re(i):i;let s=t.frameElement;for(;s&&i&&e!==t;){const t=xe(s),e=s.getBoundingClientRect(),i=be(s),n=e.left+(s.clientLeft+parseFloat(i.paddingLeft))*t.x,r=e.top+(s.clientTop+parseFloat(i.paddingTop))*t.y;o*=t.x,c*=t.y,l*=t.x,u*=t.y,o+=n,c+=r,s=re(s).frameElement}}return se({width:l,height:u,x:o,y:c})}function Ee(t){return Se(ae(t)).left+me(t).scrollLeft}function Ae(t,e,s){let i;if("viewport"===e)i=function(t,e){const s=re(t),i=ae(t),n=s.visualViewport;let r=i.clientWidth,a=i.clientHeight,h=0,o=0;if(n){r=n.width,a=n.height;const t=fe();(!t||t&&"fixed"===e)&&(h=n.offsetLeft,o=n.offsetTop)}return{width:r,height:a,x:h,y:o}}(t,s);else if("document"===e)i=function(t){const e=ae(t),s=me(t),i=t.ownerDocument.body,n=Zt(e.scrollWidth,e.clientWidth,i.scrollWidth,i.clientWidth),r=Zt(e.scrollHeight,e.clientHeight,i.scrollHeight,i.clientHeight);let a=-s.scrollLeft+Ee(t);const h=-s.scrollTop;return"rtl"===be(i).direction&&(a+=Zt(e.clientWidth,i.clientWidth)-n),{width:n,height:r,x:a,y:h}}(ae(t));else if(oe(e))i=function(t,e){const s=Se(t,!0,"fixed"===e),i=s.top+t.clientTop,n=s.left+t.clientLeft,r=ce(t)?xe(t):Gt(1);return{width:t.clientWidth*r.x,height:t.clientHeight*r.y,x:n*r.x,y:i*r.y}}(e,s);else{const s=Pe(t);i={...e,x:e.x-s.x,y:e.y-s.y}}return se(i)}function je(t,e){const s=ye(t);return!(s===e||!oe(s)||ge(s))&&("fixed"===be(s).position||je(s,e))}function Le(t,e,s){const i=ce(e),n=ae(e),r="fixed"===s,a=Se(t,!0,r,e);let h={scrollLeft:0,scrollTop:0};const o=Gt(0);if(i||!i&&!r)if(("body"!==ne(e)||ue(n))&&(h=me(e)),i){const t=Se(e,!0,r,e);o.x=t.x+e.clientLeft,o.y=t.y+e.clientTop}else n&&(o.x=Ee(n));return{x:a.left+h.scrollLeft-o.x,y:a.top+h.scrollTop-o.y,width:a.width,height:a.height}}function Ce(t,e){return ce(t)&&"fixed"!==be(t).position?e?e(t):t.offsetParent:null}function Oe(t,e){const s=re(t);if(!ce(t))return s;let i=Ce(t,e);for(;i&&de(i)&&"static"===be(i).position;)i=Ce(i,e);return i&&("html"===ne(i)||"body"===ne(i)&&"static"===be(i).position&&!pe(i))?s:i||function(t){let e=ye(t);for(;ce(e)&&!ge(e);){if(pe(e))return e;e=ye(e)}return null}(t)||s}const Me={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){let{rect:e,offsetParent:s,strategy:i}=t;const n=ce(s),r=ae(s);if(s===r)return e;let a={scrollLeft:0,scrollTop:0},h=Gt(1);const o=Gt(0);if((n||!n&&"fixed"!==i)&&(("body"!==ne(s)||ue(r))&&(a=me(s)),ce(s))){const t=Se(s);h=xe(s),o.x=t.x+s.clientLeft,o.y=t.y+s.clientTop}return{width:e.width*h.x,height:e.height*h.y,x:e.x*h.x-a.scrollLeft*h.x+o.x,y:e.y*h.y-a.scrollTop*h.y+o.y}},getDocumentElement:ae,getClippingRect:function(t){let{element:e,boundary:s,rootBoundary:i,strategy:n}=t;const r=[..."clippingAncestors"===s?function(t,e){const s=e.get(t);if(s)return s;let i=ve(t,[],!1).filter((t=>oe(t)&&"body"!==ne(t))),n=null;const r="fixed"===be(t).position;let a=r?ye(t):t;for(;oe(a)&&!ge(a);){const e=be(a),s=pe(a);s||"fixed"!==e.position||(n=null),(r?!s&&!n:!s&&"static"===e.position&&n&&["absolute","fixed"].includes(n.position)||ue(a)&&!s&&je(t,a))?i=i.filter((t=>t!==a)):n=e,a=ye(a)}return e.set(t,i),i}(e,this._c):[].concat(s),i],a=r[0],h=r.reduce(((t,s)=>{const i=Ae(e,s,n);return t.top=Zt(i.top,t.top),t.right=Ut(i.right,t.right),t.bottom=Ut(i.bottom,t.bottom),t.left=Zt(i.left,t.left),t}),Ae(e,a,n));return{width:h.right-h.left,height:h.bottom-h.top,x:h.left,y:h.top}},getOffsetParent:Oe,getElementRects:async function(t){let{reference:e,floating:s,strategy:i}=t;const n=this.getOffsetParent||Oe,r=this.getDimensions;return{reference:Le(e,await n(s),i),floating:{x:0,y:0,...await r(s)}}},getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){return we(t)},getScale:xe,isElement:oe,isRTL:function(t){return"rtl"===be(t).direction}};function qe(t,e,s,i){void 0===i&&(i={});const{ancestorScroll:n=!0,ancestorResize:r=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:h="function"==typeof IntersectionObserver,animationFrame:o=!1}=i,c=ke(t),l=n||r?[...c?ve(c):[],...ve(e)]:[];l.forEach((t=>{n&&t.addEventListener("scroll",s,{passive:!0}),r&&t.addEventListener("resize",s)}));const u=c&&h?function(t,e){let s,i=null;const n=ae(t);function r(){clearTimeout(s),i&&i.disconnect(),i=null}return function a(h,o){void 0===h&&(h=!1),void 0===o&&(o=1),r();const{left:c,top:l,width:u,height:d}=t.getBoundingClientRect();if(h||e(),!u||!d)return;const p={rootMargin:-Yt(l)+"px "+-Yt(n.clientWidth-(c+u))+"px "+-Yt(n.clientHeight-(l+d))+"px "+-Yt(c)+"px",threshold:Zt(0,Ut(1,o))||1};let f=!0;function g(t){const e=t[0].intersectionRatio;if(e!==o){if(!f)return a();e?a(!1,e):s=setTimeout((()=>{a(!1,1e-7)}),100)}f=!1}try{i=new IntersectionObserver(g,{...p,root:n.ownerDocument})}catch(t){i=new IntersectionObserver(g,p)}i.observe(t)}(!0),r}(c,s):null;let d,p=-1,f=null;a&&(f=new ResizeObserver((t=>{let[i]=t;i&&i.target===c&&f&&(f.unobserve(e),cancelAnimationFrame(p),p=requestAnimationFrame((()=>{f&&f.observe(e)}))),s()})),c&&!o&&f.observe(c),f.observe(e));let g=o?Se(t):null;return o&&function e(){const i=Se(t);!g||i.x===g.x&&i.y===g.y&&i.width===g.width&&i.height===g.height||s(),g=i,d=requestAnimationFrame(e)}(),s(),()=>{l.forEach((t=>{n&&t.removeEventListener("scroll",s),r&&t.removeEventListener("resize",s)})),u&&u(),f&&f.disconnect(),f=null,o&&cancelAnimationFrame(d)}}const De=(t,e,s)=>{const i=new Map,n={platform:Me,...s},r={...n.platform,_c:i};return(async(t,e,s)=>{const{placement:i="bottom",strategy:n="absolute",middleware:r=[],platform:a}=s,h=r.filter(Boolean),o=await(null==a.isRTL?void 0:a.isRTL(e));let c=await a.getElementRects({reference:t,floating:e,strategy:n}),{x:l,y:u}=ie(c,i,o),d=i,p={},f=0;for(let s=0;snull===t?"":t+"",Fe=t=>null===t?null:t+"",Re=t=>null===t?0:Number(t),Ne=t=>null!==t,Ve=()=>null,He=t=>null===t?[]:JSON.parse(t),We=t=>null===t?{}:JSON.parse(t);function Ke(t){if(null===t)return Fe;switch(typeof t){case"undefined":case"string":default:return Ie;case"boolean":return Ne;case"number":return Re;case"function":return Ve;case"object":return et(t)?He:We}}const Qe=Symbol(0),ze=Symbol(0),Be=Symbol(0),Je=Symbol(0);function Xe(t,e){var s,i,n;class r extends t{constructor(...t){if(super(...t),this[i]=0,this[n]=null,this.keepAlive=!1,this.forwardKeepAlive=!0,this.$=x((()=>function(t,e){return $((()=>{Lt.$$=new jt(t,k(),undefined);const e=new t;return Lt.$$.e=e,Lt.$$=null,e}))}(e)),null),this.$.$$.t(this),e.props){const t=this.$props,s=Object.getOwnPropertyDescriptors(this);for(const i of Object.keys(s))i in e.props&&(t[i].set(this[i]),delete this[i])}}static{this[s]=null}static get observedAttributes(){if(!this[Qe]&&e.props){const t=new Map;for(const s of Object.keys(e.props)){let i=this.attrs?.[s],n=Y(i)?i:i?i?.attr:i;!1!==n&&(n||(n=Ft(s)),t.set(n,{C:s,B:i&&!Y(i)&&i?.converter||Ke(e.props[s])}))}this[Qe]=t}return this[Qe]?Array.from(this[Qe].keys()):[]}get scope(){return this.$.$$.d}get attachScope(){return this.$.$$.f}get connectScope(){return this.$.$$.g}get $props(){return this.$.$$.i}get $state(){return this.$.$$.h}get state(){return this.$.state}attributeChangedCallback(t,e,s){const i=this.constructor;if(!i[Qe])return void super.attributeChangedCallback?.(t,e,s);const n=i[Qe].get(t);n&&(this[n.C]=n.B(s))}connectedCallback(){const t=this.$?.$$;if(!t||t.o)return;if(2!==this[Be])return void Ue.call(this);if(!this.isConnected)return;this.hasAttribute("keep-alive")&&(this.keepAlive=!0),t.y(),et(this[Je])&&function(t,e){for(const s of t)s(e)}(this[Je],this),this[Je]=null;const e=super.connectedCallback;e&&x((()=>e.call(this)),this.connectScope)}disconnectedCallback(){const t=this.$?.$$;if(!t||t.o)return;t.z();const e=super.disconnectedCallback;e&&e.call(this),this.keepAlive||this.hasAttribute("keep-alive")||setTimeout((()=>{requestAnimationFrame((()=>{this.isConnected||t.p()}))}),0)}[(s=Qe,i=Be,n=Je,ze)](){const t=this.$.$$,e=this.constructor;if(t.o)return;const s=e[Qe];if(s)for(const e of this.attributes){let i=s.get(e.name);i&&i.B&&t.i[i.C].set(i.B(this.getAttribute(e.name)))}t.w(),t.x(this),this[Be]=2,this.connectedCallback()}subscribe(t){return this.$.subscribe(t)}destroy(){this.disconnectedCallback(),this.$.destroy()}}return function(t,e){const s=t.prototype,i=e.prototype;if(e.props)for(const t of Object.keys(e.props))Object.defineProperty(s,t,{enumerable:!0,configurable:!0,get(){return this.$props[t]()},set(e){this.$props[t].set(e)}});if(i[Tt])for(const t of i[Tt])Object.defineProperty(s,t,{enumerable:!0,configurable:!0,get(){return this.$[t]},set(e){this.$[t]=e}});if(i[Pt])for(const t of i[Pt])s[t]=function(...e){return this.$[t](...e)}}(r,e),r}function Ue(){if(0!==this[Be])return;this[Be]=1;const t=function(t){let e=t.parentNode,s=t.localName.split("-",1)[0]+"-";for(;e;){if(1===e.nodeType&&e.localName.startsWith(s))return e;e=e.parentNode}return null}(this),e=t&&window.customElements.get(t.localName),s=t&&2===t[Be];!t||e&&s?_e.call(this,t):Ze.call(this,t)}async function Ze(t){await window.customElements.whenDefined(t.localName),2!==t[Be]&&await new Promise((e=>(t[Je]??=[]).push(e))),_e.call(this,t)}function _e(t){if(this.isConnected){if(t){t.keepAlive&&t.forwardKeepAlive&&(this.keepAlive=!0,this.setAttribute("keep-alive",""));const e=this.$.$$.d;e&&t.$.$$.f.append(e)}this[ze]()}}function Ye(t,e=!1){!e&&window.customElements.get(t.tagName)||window.customElements.define(t.tagName,t)}},216:(t,e,s)=>{s.d(e,{$:()=>ce,D:()=>gs,E:()=>ms,G:()=>kt,I:()=>St,J:()=>Et,K:()=>Ct,L:()=>qt,M:()=>wt,N:()=>Dt,O:()=>It,P:()=>Ot,Q:()=>Ft,R:()=>Rt,S:()=>Jt,T:()=>Yt,U:()=>Nt,Z:()=>ee,_:()=>oe,a:()=>dt,a1:()=>le,a2:()=>ue,a3:()=>ge,a4:()=>Te,a5:()=>Ee,a6:()=>Ae,a8:()=>Le,a9:()=>Ie,aa:()=>Ne,ab:()=>Ke,ac:()=>Je,ad:()=>_e,ae:()=>es,af:()=>rs,ag:()=>as,ah:()=>os,ai:()=>cs,aj:()=>ls,al:()=>rt,am:()=>Tt,b:()=>bs,u:()=>$s});var i=s(4158),n=s(8457),r=s(4123),a=s(9724),h=s(5781),o=s(5145),c=s(449),l={fullscreenEnabled:0,fullscreenElement:1,requestFullscreen:2,exitFullscreen:3,fullscreenchange:4,fullscreenerror:5,fullscreen:6},u=["webkitFullscreenEnabled","webkitFullscreenElement","webkitRequestFullscreen","webkitExitFullscreen","webkitfullscreenchange","webkitfullscreenerror","-webkit-full-screen"],d=["mozFullScreenEnabled","mozFullScreenElement","mozRequestFullScreen","mozCancelFullScreen","mozfullscreenchange","mozfullscreenerror","-moz-full-screen"],p=["msFullscreenEnabled","msFullscreenElement","msRequestFullscreen","msExitFullscreen","MSFullscreenChange","MSFullscreenError","-ms-fullscreen"],f="undefined"!=typeof window&&void 0!==window.document?window.document:{},g="fullscreenEnabled"in f&&Object.keys(l)||u[0]in f&&u||d[0]in f&&d||p[0]in f&&p||[],b={requestFullscreen:function(t){return t[g[l.requestFullscreen]]()},requestFullscreenFunction:function(t){return t[g[l.requestFullscreen]]},get exitFullscreen(){return f[g[l.exitFullscreen]].bind(f)},get fullscreenPseudoClass(){return":"+g[l.fullscreen]},addEventListener:function(t,e,s){return f.addEventListener(g[l[t]],e,s)},removeEventListener:function(t,e,s){return f.removeEventListener(g[l[t]],e,s)},get fullscreenEnabled(){return Boolean(f[g[l.fullscreenEnabled]])},set fullscreenEnabled(t){},get fullscreenElement(){return f[g[l.fullscreenElement]]},set fullscreenElement(t){},get onfullscreenchange(){return f[("on"+g[l.fullscreenchange]).toLowerCase()]},set onfullscreenchange(t){return f[("on"+g[l.fullscreenchange]).toLowerCase()]=t},get onfullscreenerror(){return f[("on"+g[l.fullscreenerror]).toLowerCase()]},set onfullscreenerror(t){return f[("on"+g[l.fullscreenerror]).toLowerCase()]=t}};const m=b.fullscreenEnabled;class y extends i.X{constructor(){super(...arguments),this.ub=!1,this.Nc=!1}get active(){return this.Nc}get supported(){return m}onConnect(){(0,i.l)(b,"fullscreenchange",this.Oc.bind(this)),(0,i.l)(b,"fullscreenerror",this._b.bind(this)),(0,i.o)(this.ya.bind(this))}async ya(){m&&await this.exit()}Oc(t){const e=$(this.el);e!==this.Nc&&(e||(this.ub=!1),this.Nc=e,this.dispatch("fullscreen-change",{detail:e,trigger:t}))}_b(t){this.ub&&(this.dispatch("fullscreen-error",{detail:null,trigger:t}),this.ub=!1)}async enter(){try{if(this.ub=!0,!this.el||$(this.el))return;return v(),b.requestFullscreen(this.el)}catch(t){throw this.ub=!1,t}}async exit(){if(this.el&&$(this.el))return v(),b.exitFullscreen()}}function $(t){if(b.fullscreenElement===t)return!0;try{return t.matches(b.fullscreenPseudoClass)}catch(t){return!1}}function v(){if(!m)throw Error("[vidstack] no fullscreen API")}class w extends i.X{constructor(){super(...arguments),this.vb=(0,i.m)(this.qe()),this.Ra=(0,i.m)(!1)}get type(){return this.vb()}get locked(){return this.Ra()}get portrait(){return this.vb().startsWith("portrait")}get landscape(){return this.vb().startsWith("landscape")}static{this.supported=(0,h.a)()}get supported(){return w.supported}onConnect(){if(this.supported)(0,i.l)(screen.orientation,"change",this.re.bind(this));else{const t=window.matchMedia("(orientation: landscape)");t.onchange=this.re.bind(this),(0,i.o)((()=>t.onchange=null))}(0,i.o)(this.ya.bind(this))}async ya(){this.supported&&this.Ra()&&await this.unlock()}re(t){this.vb.set(this.qe()),this.dispatch("orientation-change",{detail:{orientation:(0,i.p)(this.vb),lock:this.$b},trigger:t})}async lock(t){(0,i.p)(this.Ra)||this.$b===t||(this.se(),await screen.orientation.lock(t),this.Ra.set(!0),this.$b=t)}async unlock(){(0,i.p)(this.Ra)&&(this.se(),this.$b=void 0,await screen.orientation.unlock(),this.Ra.set(!1))}se(){if(!this.supported)throw Error("[vidstack] no orientation API")}qe(){return this.supported?window.screen.orientation.type:window.innerWidth>=window.innerHeight?"landscape-primary":"portrait-primary"}}class k{constructor(t=void 0){this.tb=t,this.A=null,this.aa=null,this.Pc=-1}setTarget(t){this.A=t}getPlayer(t){return this.aa||(t??this.A)?.dispatchEvent(new i.D("find-media-player",{detail:t=>{this.aa=t},bubbles:!0,composed:!0})),this.aa}setPlayer(t){this.aa=t}startLoading(t){this.s("media-start-loading",t)}play(t){this.s("media-play-request",t)}pause(t){this.s("media-pause-request",t)}mute(t){this.s("media-mute-request",t)}unmute(t){this.s("media-unmute-request",t)}enterFullscreen(t,e){this.s("media-enter-fullscreen-request",e,t)}exitFullscreen(t,e){this.s("media-exit-fullscreen-request",e,t)}lockScreenOrientation(t,e){this.s("media-orientation-lock-request",e,t)}unlockScreenOrientation(t){this.s("media-orientation-unlock-request",t)}enterPictureInPicture(t){this.s("media-enter-pip-request",t)}exitPictureInPicture(t){this.s("media-exit-pip-request",t)}seeking(t,e){this.s("media-seeking-request",e,t)}seek(t,e){this.s("media-seek-request",e,t)}seekToLiveEdge(t){this.s("media-live-edge-request",t)}changeVolume(t,e){this.s("media-volume-change-request",e,Math.max(0,Math.min(1,t)))}changeAudioTrack(t,e){this.s("media-audio-track-change-request",e,t)}changeQuality(t,e){this.s("media-quality-change-request",e,t)}requestAutoQuality(t){this.changeQuality(-1,t)}changeTextTrackMode(t,e,s){this.s("media-text-track-change-request",s,{index:t,mode:e})}changePlaybackRate(t,e){this.s("media-rate-change-request",e,t)}resumeControls(t){this.s("media-resume-controls-request",t)}pauseControls(t){this.s("media-pause-controls-request",t)}togglePaused(t){const e=this.getPlayer(t?.target);e&&(e.state.paused?this.play(t):this.pause(t))}toggleControls(t){const e=this.getPlayer(t?.target);e&&(e.controls.showing?e.controls.hide(0,t):e.controls.show(0,t))}toggleMuted(t){const e=this.getPlayer(t?.target);e&&(e.state.muted?this.unmute(t):this.mute(t))}toggleFullscreen(t,e){const s=this.getPlayer(e?.target);s&&(s.state.fullscreen?this.exitFullscreen(t,e):this.enterFullscreen(t,e))}togglePictureInPicture(t){const e=this.getPlayer(t?.target);e&&(e.state.pictureInPicture?this.exitPictureInPicture(t):this.enterPictureInPicture(t))}disableCaptions(t){const e=this.getPlayer(t?.target);if(!e)return;const s=e.state.textTracks,i=e.state.textTrack;if(i){const e=s.indexOf(i);this.changeTextTrackMode(e,"disabled",t)}}toggleCaptions(t){const e=this.getPlayer(t?.target);if(!e)return;const s=e.state.textTracks,i=e.state.textTrack;if(i){const e=s.indexOf(i);this.changeTextTrackMode(e,"disabled",t),this.Pc=e}else{let e=this.Pc;s[e]&&(0,r.i)(s[e])||(e=-1),-1===e&&(e=s.findIndex((t=>(0,r.i)(t)&&t.default))),-1===e&&(e=s.findIndex((t=>(0,r.i)(t)))),e>=0&&this.changeTextTrackMode(e,"showing",t),this.Pc=-1}}s(t,e,s){const n=new i.D(t,{bubbles:!0,composed:!0,detail:s,trigger:e});let r=e?.target||null;r&&r instanceof i.I&&(r=r.el);const a=!r||r===document||r===window||r===document.body||this.aa?.el&&r instanceof Node&&!this.aa.el.contains(r);r=a?this.A??this.getPlayer()?.el:r??this.A,this.aa?this.aa.canPlayQueue.k(t,(()=>r?.dispatchEvent(n))):r?.dispatchEvent(n)}za(t){}}class x extends i.X{}class T extends x{constructor(){super(...arguments),this.Qc=-2,this.Xa=!1,this.ze=(0,i.m)(!1),this.Rc=(0,i.m)(!1),this.wb=null,this.defaultDelay=2e3}get hideOnMouseLeave(){const{hideControlsOnMouseLeave:t}=this.$props;return this.ze()||t()}set hideOnMouseLeave(t){this.ze.set(t)}get showing(){return this.$state.controlsVisible()}show(t=0,e){this.Sc(),this.Xa||this.bc(!0,t,e)}hide(t=this.defaultDelay,e){this.Sc(),this.Xa||this.bc(!1,t,e)}pause(t){this.Xa=!0,this.Sc(),this.bc(!0,0,t)}resume(t){this.Xa=!1,this.$state.paused()||this.bc(!1,this.defaultDelay,t)}onConnect(){(0,i.e)(this.bg.bind(this)),(0,i.e)(this.Tc.bind(this));const t=this.xb.bind(this),e=this.Aa.bind(this);this.listen("can-play",(t=>this.show(0,t))),this.listen("play",t),this.listen("pause",e),this.listen("autoplay-fail",e)}bg(){const{started:t,pointer:e,paused:s}=this.$state;if(!t()||"fine"!==e())return;const n=this.hideOnMouseLeave;n&&this.Rc()||(0,i.e)((()=>{s()||this.listen("pointermove",this.Ae.bind(this))})),n&&(this.listen("mouseenter",this.cg.bind(this)),this.listen("mouseleave",this.dg.bind(this)))}Tc(){const{paused:t,started:e,autoplayError:s}=this.$state;if(t()||s()&&!e())return;const n=this.Ae.bind(this);(0,i.e)((()=>{const t=["coarse"===this.$state.pointer()?"touchend":"pointerup","keydown"];for(const e of t)this.listen(e,n,{passive:!1})}))}xb(t){this.show(0,t),this.hide(void 0,t)}Aa(t){this.show(0,t)}cg(t){this.Rc.set(!1),this.show(0,t),this.hide(void 0,t)}dg(t){this.Rc.set(!0),this.hide(0,t)}Sc(){window.clearTimeout(this.Qc),this.Qc=-1}Ae(t){t.MEDIA_GESTURE||this.Xa||(0,a.i)(t)||((0,i.G)(t)&&("Escape"===t.key?(this.el?.focus(),this.wb=null):this.wb&&(t.preventDefault(),requestAnimationFrame((()=>{this.wb?.focus(),this.wb=null})))),this.show(0,t),this.hide(this.defaultDelay,t))}bc(t,e,s){0!==e?this.Qc=window.setTimeout((()=>{this.scope&&this.B(t&&!this.Xa,s)}),e):this.B(t,s)}B(t,e){this.$state.controlsVisible()!==t&&(this.$state.controlsVisible.set(t),!t&&document.activeElement&&this.el?.contains(document.activeElement)&&(this.wb=document.activeElement,requestAnimationFrame((()=>this.el?.focus()))),this.dispatch("controls-change",{detail:t,trigger:e}))}}class P{constructor(){this.priority=0,this.Be=!0,this.m=null,this.z=null,this.yb=new Set}canRender(t,e){return!!e}attach(t){this.m=t,t&&(t.textTracks.onchange=this.B.bind(this))}addTrack(t){this.yb.add(t),this.eg(t)}removeTrack(t){t[r.T.T]?.remove?.(),t[r.T.T]=null,this.yb.delete(t)}changeTrack(t){const e=t?.[r.T.T];e&&"showing"!==e.track.mode&&(e.track.mode="showing"),this.z=t}setDisplay(t){this.Be=t,this.B()}detach(){this.m&&(this.m.textTracks.onchange=null);for(const t of this.yb)this.removeTrack(t);this.yb.clear(),this.m=null,this.z=null}eg(t){if(!this.m)return;const e=t[r.T.T]??=this.fg(t);e instanceof HTMLElement&&(this.m.append(e),e.track.mode=e.default?"showing":"hidden")}fg(t){const e=document.createElement("track"),s=t.default||"showing"===t.mode,i=t.src&&"vtt"===t.type;return e.id=t.id,e.src=i?t.src:"https://cdn.jsdelivr.net/npm/vidstack@next/empty.vtt",e.label=t.label,e.kind=t.kind,e.default=s,t.language&&(e.srclang=t.language),s&&!i&&this.Ce(t,e.track),e}Ce(t,e){if(!(t.src&&"vtt"===t.type||e.cues?.length))for(const s of t.cues)e.addCue(s)}B(t){for(const e of this.yb){const s=e[r.T.T]?.track;if(!s)continue;if(!this.Be){s.mode="disabled";continue}const i="showing"===s.mode;i&&this.Ce(e,s),e.setMode(i?"showing":"disabled",t)}}}class S{constructor(t){this.a=t,this.m=null,this.cc=[],this.De=!1,this.ba=null,this.Ba=null;const e=t.textTracks;this.Uc=e,(0,i.e)(this.Vc.bind(this)),(0,i.o)(this.Ee.bind(this)),(0,i.l)(e,"add",this.Wc.bind(this)),(0,i.l)(e,"remove",this.gg.bind(this)),(0,i.l)(e,"mode-change",this.ea.bind(this))}Vc(){const{$state:t,$iosControls:e}=this.a;this.De=t.controls()||e(),this.ea()}add(t){this.cc.push(t),this.ea()}remove(t){t.detach(),this.cc.splice(this.cc.indexOf(t),1),this.ea()}Fe(t){requestAnimationFrame((()=>{if(this.m=t,t){this.ba=new P,this.ba.attach(t);for(const t of this.Uc)this.Ge(t)}this.ea()}))}Ge(t){(0,r.i)(t)&&this.ba?.addTrack(t)}hg(t){(0,r.i)(t)&&this.ba?.removeTrack(t)}Wc(t){this.Ge(t.detail)}gg(t){this.hg(t.detail)}ea(){const t=this.Uc.selected;if(this.m&&(this.De||t?.[r.T.te]))return this.Ba?.changeTrack(null),this.ba?.setDisplay(!0),void this.ba?.changeTrack(t);if(this.ba?.setDisplay(!1),this.ba?.changeTrack(null),!t)return void this.Ba?.changeTrack(null);const e=this.cc.sort(((t,e)=>t.priority-e.priority)).find((e=>e.canRender(t,this.m)));this.Ba!==e&&(this.Ba?.detach(),e?.attach(this.m),this.Ba=e??null),e?.changeTrack(t)}Ee(){this.ba?.detach(),this.ba=null,this.Ba?.detach(),this.Ba=null}}class E extends n.L{constructor(){super(...arguments),this.P=!1,this.dc={},this.Je=this.ig.bind(this)}get selected(){return this.r.find((t=>"showing"===t.mode&&(0,r.i)(t)))??null}add(t,e){const s=t instanceof r.b?t:new r.b(t);return this.dc[t.kind]&&t.default&&delete t.default,s.addEventListener("mode-change",this.Je),this[h.L.oa](s,e),s[r.T.Sa]=this[r.T.Sa],this.P&&s[r.T.P](),t.default&&(this.dc[t.kind]=s,s.mode="showing"),this}remove(t,e){if(this.r.includes(t))return t===this.dc[t.kind]&&delete this.dc[t.kind],t.mode="disabled",t[r.T.Ua]=null,t.removeEventListener("mode-change",this.Je),this[h.L.Yb](t,e),this}clear(t){for(const e of[...this.r])this.remove(e,t);return this}getById(t){return this.r.find((e=>e.id===t))??null}getByKind(t){const e=Array.isArray(t)?t:[t];return this.r.filter((t=>e.includes(t.kind)))}[r.T.P](){if(!this.P){for(const t of this.r)t[r.T.P]();this.P=!0}}ig(t){const e=t.detail;if("showing"===e.mode){const t=(0,r.i)(e)?["captions","subtitles"]:[e.kind];for(const s of this.r)"showing"===s.mode&&s!=e&&t.includes(s.kind)&&(s.mode="disabled")}this.dispatchEvent(new i.D("mode-change",{detail:t.detail,trigger:t}))}}const A=Symbol(0);class j extends n.L{get selected(){return this.r.find((t=>t.selected))??null}get selectedIndex(){return this.r.findIndex((t=>t.selected))}[h.L.oe](t,e){this[h.L.pa](t,!1,e)}[h.L.oa](t,e){t[A]=!1,Object.defineProperty(t,"selected",{get(){return this[A]},set:e=>{this.readonly||(this[h.L.pe]?.(),this[h.L.pa](t,e))}}),super[h.L.oa](t,e)}[h.L.pa](t,e,s){if(e===t?.[A])return;const n=this.selected;t&&(t[A]=e),(e?n!==t:n===t)&&(n&&(n[A]=!1),this.dispatchEvent(new i.D("change",{detail:{prev:n,current:this.selected},trigger:s})))}}class L extends j{getById(t){return""===t?null:this.r.find((e=>e.id===t))??null}}class C extends j{constructor(){super(...arguments),this.fc=!1,this.switch="current"}get auto(){return this.fc||this.readonly}[h.L.pe](){this[o.Q.Ya](!1)}[h.L.ne](t){this[o.Q.Ya](!1,t)}autoSelect(t){this.readonly||this.fc||!this[o.Q.Za]||(this[o.Q.Za]?.(),this[o.Q.Ya](!0,t))}[o.Q.Ya](t,e){this.fc!==t&&(this.fc=t,this.dispatchEvent(new i.D("auto-change",{detail:t,trigger:e})))}}const O=new Set(["Shift","Alt","Meta","Control"]),M='input, textarea, select, [contenteditable], [role^="menuitem"]';class q extends x{constructor(t){super(),this.a=t,this._a=null}onConnect(){(0,i.e)(this.mg.bind(this))}mg(){const{keyDisabled:t,keyTarget:e}=this.$props;if(t())return;const s="player"===e()?this.el:document,n=(0,i.m)(!1);s===this.el?(this.listen("focusin",(()=>n.set(!0))),this.listen("focusout",(t=>{this.el.contains(t.target)||n.set(!1)}))):((0,i.p)(n)||n.set(document.querySelector("[data-media-player]")===this.el),(0,i.l)(document,"focusin",(t=>{const e=t.composedPath().find((t=>t instanceof Element&&"media-player"===t.localName));void 0!==e&&n.set(this.el===e)}))),(0,i.e)((()=>{n()&&((0,i.l)(s,"keyup",this.zb.bind(this)),(0,i.l)(s,"keydown",this.Ab.bind(this)),(0,i.l)(s,"keydown",this.ng.bind(this),{capture:!0}))}))}zb(t){const e=document.activeElement;if(!t.key||!this.$state.canSeek()||e?.matches(M))return;let{method:s,value:n}=this.Zc(t);if((0,i.r)(n)||(0,i.w)(n)){if(s?.startsWith("seek")&&(t.preventDefault(),t.stopPropagation(),this._a?(this.Ne(t,"seekForward"===s),this._a=null):(this.a.remote.seek(this.gc,t),this.gc=void 0)),s?.startsWith("volume")){const e=this.el.querySelector("[data-media-volume-slider]");e?.dispatchEvent(new KeyboardEvent("keyup",{key:"volumeUp"===s?"Up":"Down",shiftKey:t.shiftKey,trigger:t}))}}else n?.callback(t)}Ab(t){if(!t.key||O.has(t.key))return;const e=document.activeElement;if(e?.matches(M)||(0,i.b)(t)&&e?.matches('button, [role="button"]'))return;let{method:s,value:n}=this.Zc(t);if((0,i.r)(n)||(0,i.w)(n)){if(!s&&!t.metaKey&&/[0-9]/.test(t.key))return t.preventDefault(),t.stopPropagation(),void this.a.remote.seek(this.$state.duration()/10*Number(t.key),t);if(s)switch(t.preventDefault(),t.stopPropagation(),s){case"seekForward":case"seekBackward":this.qa(t,s,"seekForward"===s);break;case"volumeUp":case"volumeDown":const e=this.el.querySelector("[data-media-volume-slider]");if(e)e.dispatchEvent(new KeyboardEvent("keydown",{key:"volumeUp"===s?"Up":"Down",shiftKey:t.shiftKey,trigger:t}));else{const e=t.shiftKey?.1:.05;this.a.remote.changeVolume(this.$state.volume()+("volumeUp"===s?+e:-e),t)}break;case"toggleFullscreen":this.a.remote.toggleFullscreen("prefer-media",t);break;case"speedUp":case"slowDown":const i=this.$state.playbackRate();this.a.remote.changePlaybackRate(Math.max(.25,Math.min(2,i+("speedUp"===s?.25:-.25))),t);break;default:this.a.remote[s]?.(t)}}else n?.callback(t)}ng(t){var e;(function(t){return t instanceof HTMLAudioElement}(e=t.target)||function(t){return t instanceof HTMLVideoElement}(e))&&this.Zc(t).method&&t.preventDefault()}Zc(t){const e={...this.$props.keyShortcuts(),...this.a.ariaKeys},s=Object.keys(e).find((s=>{const n=e[s],r=(0,i.w)(n)?n.join(" "):(0,i.r)(n)?n:n?.keys;return((0,i.w)(r)?r:r?.split(" "))?.some((e=>function(t){return t.replace(/Shift\+(\d)/g,((t,e)=>D[e-1]))}(e).replace(/Control/g,"Ctrl").split("+").every((e=>O.has(e)?t[e.toLowerCase()+"Key"]:t.key===e.replace("Space"," ")))))}));return{method:s,value:s?e[s]:null}}og(t,e){const s=t.shiftKey?10:5;return this.gc=Math.max(0,Math.min((this.gc??this.$state.currentTime())+("seekForward"===e?+s:-s),this.$state.duration()))}Ne(t,e){this._a?.dispatchEvent(new KeyboardEvent(t.type,{key:e?"Right":"Left",shiftKey:t.shiftKey,trigger:t}))}qa(t,e,s){this.$state.canSeek()&&(this._a||(this._a=this.el.querySelector("[data-media-time-slider]")),this._a?this.Ne(t,s):this.a.remote.seeking(this.og(t,e),t))}}const D=["!","@","#","$","%","^","&","*","(",")"];class I extends i.X{constructor(t){super(),this._c=t}onAttach(t){const{$props:e,ariaKeys:s}=(0,n.u)(),r=t.getAttribute("aria-keyshortcuts");if(r)return s[this._c]=r,void(0,i.o)((()=>{delete s[this._c]}));const a=e.keyShortcuts()[this._c];if(a){const e=(0,i.w)(a)?a.join(" "):(0,i.r)(a)?a:a?.keys;t.setAttribute("aria-keyshortcuts",(0,i.w)(e)?e.join(" "):e)}}}class F{canPlay({src:t,type:e}){return(0,i.r)(t)?c.A.test(t)||c.b.has(e)||t.startsWith("blob:")&&"audio/object"===e:"audio/object"===e}mediaType(){return"audio"}async load(){return new((await s.e(2626).then(s.bind(s,2626))).AudioProvider)(this.target)}}class R{canPlay(t){return(0,i.r)(t.src)?c.V.test(t.src)||c.c.has(t.type)||t.src.startsWith("blob:")&&"video/object"===t.type||(0,c.i)(t)&&(0,h.b)():"video/object"===t.type}mediaType(){return"video"}async load(t){return new((await s.e(4699).then(s.bind(s,4699))).VideoProvider)(this.target,t)}}class N{canPlay(t){return(0,i.r)(t.src)&&"video/youtube"===t.type}mediaType(){return"video"}async load(t){return new((await s.e(8073).then(s.bind(s,8073))).YouTubeProvider)(this.target)}}class V extends R{static{this.supported=(0,h.i)()}canPlay(t){return V.supported&&(0,c.i)(t)}async load(t){return new((await s.e(9713).then(s.bind(s,9713))).HLSProvider)(this.target,t)}}class H{canPlay(t){return(0,i.r)(t.src)&&"video/vimeo"===t.type}mediaType(){return"video"}async load(t){return new((await s.e(5032).then(s.bind(s,5032))).VimeoProvider)(this.target)}}const W=Symbol(0),K=["autoplay","canFullscreen","canPictureInPicture","canLoad","canPlay","canSeek","ended","fullscreen","loop","live","liveEdge","mediaType","muted","paused","pictureInPicture","playing","playsinline","seeking","started","streamType","viewType","waiting"],Q={autoplay:!1,controls:!1,currentTime:0,crossorigin:null,fullscreenOrientation:"landscape",load:"visible",logLevel:"silent",loop:!1,muted:!1,paused:!0,playsinline:!1,playbackRate:1,poster:"",preload:"metadata",preferNativeHLS:!1,src:"",title:"",controlsDelay:2e3,hideControlsOnMouseLeave:!1,viewType:"unknown",streamType:"unknown",volume:1,liveEdgeTolerance:10,minLiveDVRWindow:60,keyDisabled:!1,keyTarget:"player",keyShortcuts:{togglePaused:"k Space",toggleMuted:"m",toggleFullscreen:"f",togglePictureInPicture:"i",toggleCaptions:"c",seekBackward:"j J ArrowLeft",seekForward:"l L ArrowRight",volumeUp:"ArrowUp",volumeDown:"ArrowDown",speedUp:">",slowDown:"<"}};class z extends x{constructor(t){super(),this.Ca=t}async onAttach(t){const e=this.$props.load();if("eager"===e)requestAnimationFrame(this.Ca);else if("idle"===e)(0,i.Y)(this.Ca);else if("visible"===e){const e=new IntersectionObserver((t=>{this.scope&&t[0].isIntersecting&&(e.disconnect(),this.Ca())}));return e.observe(t),e.disconnect.bind(e)}}}class B{constructor(t,e){this.X=t,this.a=e,this.c=(t,...e)=>{this.X(new i.D(t,{detail:e?.[0],trigger:e?.[1]}))}}async jc(t,e){const{$state:s,logger:n}=this.a;if((0,i.p)(s.canPlay))return;const r={duration:t?.duration??(0,i.p)(s.duration),seekable:t?.seekable??(0,i.p)(s.seekable),buffered:t?.buffered??(0,i.p)(s.buffered),provider:(0,i.p)(this.a.$provider)};this.c("can-play",r,e),(0,i.P)();const a=(0,i.p)(this.a.$provider),{muted:h,volume:o,playsinline:c}=this.a.$props;a&&(a.setVolume((0,i.p)(o)),a.setMuted((0,i.p)(h)),a.setPlaysinline?.((0,i.p)(c))),s.canPlay()&&s.autoplay()&&!s.started()&&await this.oh(e)}async oh(t){const{player:e,$state:s}=this.a;s.autoplaying.set(!0);const n=new i.D("autoplay-attempt",{trigger:t});try{await e.play(n)}catch(t){}}}class J{constructor(){this.e=new Map}k(t,e){this.e.has(t)||this.e.set(t,new Set),this.e.get(t).add(e)}td(t,e){const s=this.e.get(t);if(s)for(const t of s)e(t);this.e.delete(t)}qc(t){this.e.delete(t)}ph(t){return this.e.get(t)?.size??0}H(){this.e.clear()}}class X{constructor(){this.Mb=!1,this.Ed=(0,i.v)(),this.e=new Map}get ph(){return this.e.size}get Rj(){return this.Mb}async Sj(){this.Mb||await this.Ed.promise}k(t,e){this.Mb?e():(this.e.delete(t),this.e.set(t,e))}td(t){this.e.get(t)?.(),this.e.delete(t)}Bb(){this.jf(),this.Mb=!0,this.e.size>0&&this.jf()}ra(){this.Mb=!1}H(){this.ra(),this.e.clear(),this.kf()}jf(){for(const t of this.e.keys())this.td(t);this.kf()}kf(){this.Ed.resolve(),this.Ed=(0,i.v)()}}class U extends x{constructor(t,e,s){super(),this.ga=t,this.f=e,this.a=s,this.vk=new X,this.vd=!1,this.uk=s.$provider,this.Ib=new T,this.rc=new y,this.ta=new w}onAttach(){this.listen("fullscreen-change",this.Oc.bind(this))}onConnect(){const t=Object.getOwnPropertyNames(Object.getPrototypeOf(this)),e=this.qh.bind(this);for(const s of t)s.startsWith("media-")&&this.listen(s,e);(0,i.e)(this.wk.bind(this)),(0,i.e)(this.rh.bind(this)),(0,i.e)(this.sh.bind(this)),(0,i.e)(this.th.bind(this))}onDestroy(){this.vk.H()}wk(){const t=this.uk(),e=this.$state.canPlay();return t&&e&&this.vk.Bb(),()=>{this.vk.ra()}}qh(t){t.stopPropagation(),this[t.type]&&((0,i.p)(this.uk)?this[t.type](t):this.vk.k(t.type,(()=>{(0,i.p)(this.uk)&&this[t.type](t)})))}async sc(t){const{canPlay:e,paused:s,ended:n,autoplaying:r,seekableStart:a}=this.$state;if((0,i.p)(s)){"media-play-request"===t?.type&&this.f.e.k("play",t);try{const t=(0,i.p)(this.uk);return Z(t,(0,i.p)(e)),(0,i.p)(n)&&t.setCurrentTime(a()+.1),await t.play()}catch(e){const s=this.createEvent("play-fail",{detail:(0,o.c)(e),trigger:t});throw s.autoplay=r(),this.ga.X(s),e}}}async ud(t){const{canPlay:e,paused:s}=this.$state;if((0,i.p)(s))return;"media-pause-request"===t?.type&&this.f.e.k("pause",t);const n=(0,i.p)(this.uk);return Z(n,(0,i.p)(e)),n.pause()}Ze(t){const{canPlay:e,live:s,liveEdge:n,canSeek:r,liveSyncPosition:a,seekableEnd:h,userBehindLiveEdge:o}=this.$state;if(o.set(!1),(0,i.p)((()=>!s()||n()||!r())))return;const c=(0,i.p)(this.uk);Z(c,(0,i.p)(e)),c.setCurrentTime(a()??h()-2)}async _e(t="prefer-media",e){const s=this.$e(t);if(_(0,s),!s.active)return(0,i.p)(this.$state.pictureInPicture)&&(this.vd=!0,await this.wd(e)),"media-enter-fullscreen-request"===e?.type&&this.f.e.k("fullscreen",e),s.enter()}async af(t="prefer-media",e){const s=this.$e(t);if(_(0,s),s.active){"media-exit-fullscreen-request"===e?.type&&this.f.e.k("fullscreen",e);try{const t=await s.exit();return this.vd&&(0,i.p)(this.$state.canPictureInPicture)&&await this.xd(),t}finally{this.vd=!1}}}$e(t){const e=(0,i.p)(this.uk);return"prefer-media"===t&&this.rc.supported||"media"===t?this.rc:e?.fullscreen}async xd(t){if(this.bf(),!this.$state.pictureInPicture())return"media-enter-pip-request"===t?.type&&this.f.e.k("pip",t),await this.uk().pictureInPicture.enter()}async wd(t){if(this.bf(),this.$state.pictureInPicture())return"media-exit-pip-request"===t?.type&&this.f.e.k("pip",t),await this.uk().pictureInPicture.exit()}bf(){if(!this.$state.canPictureInPicture())throw Error("[vidstack] no pip support")}rh(){this.Ib.defaultDelay=this.$props.controlsDelay()}sh(){const{canLoad:t,canFullscreen:e}=this.$state,s=this.rc.supported||this.uk()?.fullscreen?.supported||!1;t()&&(0,i.p)(e)===s||e.set(s)}th(){const{canLoad:t,canPictureInPicture:e}=this.$state,s=this.uk()?.pictureInPicture?.supported||!1;t()&&(0,i.p)(e)===s||e.set(s)}"media-audio-track-change-request"(t){if(this.a.audioTracks.readonly)return;const e=t.detail,s=this.a.audioTracks[e];s&&(this.f.e.k("audioTrack",t),s.selected=!0)}async"media-enter-fullscreen-request"(t){try{await this._e(t.detail,t)}catch(e){this._b(e,t)}}async"media-exit-fullscreen-request"(t){try{await this.af(t.detail,t)}catch(e){this._b(e,t)}}async Oc(t){const e=(0,i.p)(this.$props.fullscreenOrientation),s=t.detail;if(!(0,i.i)(e)&&this.ta.supported)if(s){if(this.ta.locked)return;this.dispatch("media-orientation-lock-request",{detail:e,trigger:t})}else this.ta.locked&&this.dispatch("media-orientation-unlock-request",{trigger:t})}_b(t,e){this.ga.X(this.createEvent("fullscreen-error",{detail:(0,o.c)(t)}))}async"media-orientation-lock-request"(t){try{this.f.e.k("orientation",t),await this.ta.lock(t.detail)}catch(t){this.f.e.qc("orientation")}}async"media-orientation-unlock-request"(t){try{this.f.e.k("orientation",t),await this.ta.unlock()}catch(t){this.f.e.qc("orientation")}}async"media-enter-pip-request"(t){try{await this.xd(t)}catch(e){this.cf(e,t)}}async"media-exit-pip-request"(t){try{await this.wd(t)}catch(e){this.cf(e,t)}}cf(t,e){this.ga.X(this.createEvent("picture-in-picture-error",{detail:(0,o.c)(t)}))}"media-live-edge-request"(t){const{live:e,liveEdge:s,canSeek:i}=this.$state;if(e()&&!s()&&i()){this.f.e.k("seeked",t);try{this.Ze()}catch(t){}}}async"media-loop-request"(t){try{this.f.Ha=!0,this.f.gb=!0,await this.sc(t)}catch(t){this.f.Ha=!1,this.f.gb=!1}}async"media-pause-request"(t){if(!this.$state.paused())try{await this.ud(t)}catch(t){this.f.e.qc("pause")}}async"media-play-request"(t){if(this.$state.paused())try{await this.sc(t)}catch(t){}}"media-rate-change-request"(t){const{playbackRate:e,canSetPlaybackRate:s}=this.$state;if(e()===t.detail||!s())return;const i=this.uk();i?.setPlaybackRate&&(this.f.e.k("rate",t),i.setPlaybackRate(t.detail))}"media-quality-change-request"(t){if(this.a.qualities.readonly)return;this.f.e.k("quality",t);const e=t.detail;if(e<0)this.a.qualities.autoSelect(t);else{const t=this.a.qualities[e];t&&(t.selected=!0)}}"media-pause-controls-request"(t){this.f.e.k("controls",t),this.Ib.pause(t)}"media-resume-controls-request"(t){this.f.e.k("controls",t),this.Ib.resume(t)}"media-seek-request"(t){const{seekableStart:e,seekableEnd:s,ended:i,canSeek:n,live:r,userBehindLiveEdge:a}=this.$state;i()&&(this.f.gb=!0),this.f.qa=!1,this.f.e.qc("seeking");const h=Math.min(Math.max(e()+.1,t.detail),s()-.1);Number.isFinite(h)&&n()&&(this.f.e.k("seeked",t),this.uk().setCurrentTime(h),r()&&t.isOriginTrusted&&Math.abs(s()-h)>=2&&a.set(!0))}"media-seeking-request"(t){this.f.e.k("seeking",t),this.$state.seeking.set(!0),this.f.qa=!0}"media-start-loading"(t){this.$state.canLoad()||(this.f.e.k("load",t),this.ga.X(this.createEvent("can-load")))}"media-text-track-change-request"(t){const{index:e,mode:s}=t.detail,i=this.a.textTracks[e];i&&(this.f.e.k("textTrack",t),i.setMode(s,t))}"media-mute-request"(t){this.$state.muted()||(this.f.e.k("volume",t),this.uk().setMuted(!0))}"media-unmute-request"(t){const{muted:e,volume:s}=this.$state;e()&&(this.f.e.k("volume",t),this.a.$provider().setMuted(!1),0===s()&&(this.f.e.k("volume",t),this.uk().setVolume(.25)))}"media-volume-change-request"(t){const{muted:e,volume:s}=this.$state,i=t.detail;s()!==i&&(this.f.e.k("volume",t),this.uk().setVolume(i),i>0&&e()&&(this.f.e.k("volume",t),this.uk().setMuted(!1)))}}function Z(t,e){if(!t||!e)throw Error("[vidstack] media not ready")}function _(t,e){if(!e?.supported)throw Error("[vidstack] no fullscreen support")}class Y{constructor(){this.qa=!1,this.Ha=!1,this.gb=!1,this.e=new J}}var G=function(t,e,s){var i=null,n=null,r=function(){i&&(clearTimeout(i),n=null,i=null)},a=function(){if(!e)return t.apply(this,arguments);var a=this,h=arguments,o=s&&!i;return r(),n=function(){t.apply(a,h)},i=setTimeout((function(){if(i=null,!o){var t=n;return n=null,t()}}),e),o?n():void 0};return a.cancel=r,a.flush=function(){var t=n;r(),t&&t()},a},tt=function(t,e,s){var i=null,n=null,r=s&&s.leading,a=s&&s.trailing;null==r&&(r=!0),null==a&&(a=!r),1==r&&(a=!1);var h=function(){i&&(clearTimeout(i),i=null)},o=function(){var s=r&&!i,h=this,o=arguments;if(n=function(){return t.apply(h,o)},i||(i=setTimeout((function(){if(i=null,a)return n()}),e)),s)return s=!1,n()};return o.cancel=h,o.flush=function(){var t=n;h(),t&&t()},o};const et=new Set(["autoplay","autoplay-fail","can-load","sources-change","source-change","load-start","abort","error","loaded-metadata","loaded-data","can-play","play","play-fail","pause","playing","seeking","seeked","waiting"]);class st extends x{constructor(t,e){super(),this.f=t,this.a=e,this.p=new Map,this.tc=!1,this.Jb=!1,this.seeking=tt((t=>{const{seeking:e,currentTime:s,paused:i}=this.$state;e.set(!0),s.set(t.detail),this.F("seeking",t),i()&&(this.hb=t,this.zd())}),150,{leading:!0}),this.zd=G((()=>{if(!this.hb)return;this.tc=!0;const{waiting:t,playing:e}=this.$state;t.set(!0),e.set(!1);const s=this.createEvent("waiting",{trigger:this.hb});this.p.set("waiting",s),this.dispatch(s),this.hb=void 0,this.tc=!1}),300)}onAttach(t){t.setAttribute("aria-busy","true"),this.listen("fullscreen-change",this["fullscreen-change"].bind(this)),this.listen("fullscreen-error",this["fullscreen-error"].bind(this)),this.listen("orientation-change",this["orientation-change"].bind(this))}onConnect(t){this.uh(),this.vh(),this.wh(),this.xh(),(0,i.o)(this.yh.bind(this))}X(t){if(!this.scope)return;const e=t.type;this[t.type]?.(t),et.has(e)&&this.p.set(e,t),this.dispatch(t)}xh(){this.Jb&&(this.a.$provider()?.paused&&requestAnimationFrame((()=>{this.scope&&this.a.remote.play(new i.D("dom-connect"))})),this.Jb=!1)}yh(){this.Jb||(this.Jb=!this.a.$state.paused(),this.a.$provider()?.pause())}ib(){this.df(),this.f.gb=!1,this.f.Ha=!1,this.tc=!1,this.hb=void 0,this.p.clear()}F(t,e){this.f.e.td(t,(t=>{e.request=t,e.triggers.add(t)}))}uh(){this.yd(),this.ef();const t=this.a.textTracks;(0,i.l)(t,"add",this.yd.bind(this)),(0,i.l)(t,"remove",this.yd.bind(this)),(0,i.l)(t,"mode-change",this.ef.bind(this))}vh(){const t=this.a.qualities;(0,i.l)(t,"add",this.pc.bind(this)),(0,i.l)(t,"remove",this.pc.bind(this)),(0,i.l)(t,"change",this.fb.bind(this)),(0,i.l)(t,"auto-change",this.zh.bind(this)),(0,i.l)(t,"readonly-change",this.Ah.bind(this))}wh(){const t=this.a.audioTracks;(0,i.l)(t,"add",this.ff.bind(this)),(0,i.l)(t,"remove",this.ff.bind(this)),(0,i.l)(t,"change",this.Bh.bind(this))}yd(t){const{textTracks:e}=this.$state;e.set(this.a.textTracks.toArray()),this.dispatch("text-tracks-change",{detail:e(),trigger:t})}ef(t){t&&this.F("textTrack",t);const e=this.a.textTracks.selected,{textTrack:s}=this.$state;s()!==e&&(s.set(e),this.dispatch("text-track-change",{detail:e,trigger:t}))}ff(t){const{audioTracks:e}=this.$state;e.set(this.a.audioTracks.toArray()),this.dispatch("audio-tracks-change",{detail:e(),trigger:t})}Bh(t){const{audioTrack:e}=this.$state;e.set(this.a.audioTracks.selected),this.F("audioTrack",t),this.dispatch("audio-track-change",{detail:e(),trigger:t})}pc(t){const{qualities:e}=this.$state;e.set(this.a.qualities.toArray()),this.dispatch("qualities-change",{detail:e(),trigger:t})}fb(t){const{quality:e}=this.$state;e.set(this.a.qualities.selected),this.F("quality",t),this.dispatch("quality-change",{detail:e(),trigger:t})}zh(){this.$state.autoQuality.set(this.a.qualities.auto)}Ah(){this.$state.canSetQuality.set(!this.a.qualities.readonly)}"provider-change"(t){const e=this.a.$provider(),s=t.detail;e?.type!==s?.type&&(e?.destroy?.(),e?.scope?.dispose(),this.a.$provider.set(t.detail),e&&null===t.detail&&this.gf(t))}"provider-loader-change"(t){}autoplay(t){this.$state.autoplayError.set(null)}"autoplay-fail"(t){this.$state.autoplayError.set(t.detail),this.ib()}"can-load"(t){this.$state.canLoad.set(!0),this.p.set("can-load",t),this.F("load",t),this.a.textTracks[r.T.P]()}"media-type-change"(t){const e=this.p.get("source-change");e&&t.triggers.add(e);const s=this.$state.viewType();this.$state.mediaType.set(t.detail);const i=this.$state.providedViewType(),n="unknown"===i?t.detail:i;s!==n&&setTimeout((()=>{requestAnimationFrame((()=>{this.scope&&(this.$state.inferredViewType.set(t.detail),this.dispatch("view-type-change",{detail:n,trigger:t}))}))}),0)}"stream-type-change"(t){const e=this.p.get("source-change");e&&t.triggers.add(e);const{streamType:s,inferredStreamType:i}=this.$state;i.set(t.detail),t.detail=s()}"rate-change"(t){this.$state.playbackRate.set(t.detail),this.F("rate",t)}"sources-change"(t){this.$state.sources.set(t.detail)}"source-change"(t){const e=this.p.get("sources-change");e&&t.triggers.add(e),this.gf(t),this.p.set(t.type,t),this.$state.source.set(t.detail),this.el?.setAttribute("aria-busy","true")}gf(t){this.a.audioTracks[h.L.H](t),this.a.qualities[h.L.H](t),this.ib(),(0,n.s)(this.a.$state)}abort(t){const e=this.p.get("source-change");e&&t.triggers.add(e);const s=this.p.get("can-load");s&&!t.triggers.hasType("can-load")&&t.triggers.add(s)}"load-start"(t){const e=this.p.get("source-change");e&&t.triggers.add(e)}error(t){this.$state.error.set(t.detail);const e=this.p.get("abort");e&&t.triggers.add(e)}"loaded-metadata"(t){const e=this.p.get("load-start");e&&t.triggers.add(e)}"loaded-data"(t){const e=this.p.get("load-start");e&&t.triggers.add(e)}"can-play"(t){const e=this.p.get("loaded-metadata");e&&t.triggers.add(e),this.hf(t.detail),this.el?.setAttribute("aria-busy","false")}"can-play-through"(t){this.hf(t.detail);const e=this.p.get("can-play");e&&t.triggers.add(e)}hf(t){const{seekable:e,seekableEnd:s,buffered:i,duration:n,canPlay:r}=this.$state;r.set(!0),i.set(t.buffered),e.set(t.seekable),n.set(s())}"duration-change"(t){const{live:e,duration:s}=this.$state,i=t.detail;e()||s.set(Number.isNaN(i)?0:i)}progress(t){const{buffered:e,seekable:s,live:i,duration:n,seekableEnd:r}=this.$state,a=t.detail;e.set(a.buffered),s.set(a.seekable),i()&&(n.set(r),this.dispatch("duration-change",{detail:r(),trigger:t}))}play(t){const{paused:e,autoplayError:s,ended:i,autoplaying:n,playsinline:r,pointer:a,muted:h,viewType:o}=this.$state;if(t.autoplay=n(),this.f.Ha||!e())return void t.stopImmediatePropagation();const c=this.p.get("waiting");c&&t.triggers.add(c),this.F("play",t),this.p.set("play",t),e.set(!1),s.set(null),t.autoplay&&(this.X(this.createEvent("autoplay",{detail:{muted:h()},trigger:t})),n.set(!1)),(i()||this.f.gb)&&(this.f.gb=!1,i.set(!1),this.X(this.createEvent("replay",{trigger:t}))),r()||"video"!==o()||"coarse"!==a()||this.a.remote.enterFullscreen("prefer-media",t)}"play-fail"(t){const{muted:e,autoplaying:s}=this.$state,i=this.p.get("play");i&&t.triggers.add(i),this.F("play",t);const{paused:n,playing:r}=this.$state;n.set(!0),r.set(!1),this.ib(),this.p.set("play-fail",t),t.autoplay&&(this.X(this.createEvent("autoplay-fail",{detail:{muted:e(),error:t.detail},trigger:t})),s.set(!1))}playing(t){const e=this.p.get("play"),s=this.p.get("seeked");e?t.triggers.add(e):s&&t.triggers.add(s),setTimeout((()=>this.ib()),0);const{paused:i,playing:n,live:r,liveSyncPosition:a,seekableEnd:h,started:o,currentTime:c,seeking:l,ended:u}=this.$state;if(i.set(!1),n.set(!0),l.set(!1),u.set(!1),this.f.Ha)return t.stopImmediatePropagation(),void(this.f.Ha=!1);if(r()&&!o()&&0===c()){const t=a()??h()-2;Number.isFinite(t)&&this.a.$provider().setCurrentTime(t)}this.started(t)}started(t){const{started:e}=this.$state;e()||(e.set(!0),this.X(this.createEvent("started",{trigger:t})))}pause(t){if(this.el?.isConnected||(this.Jb=!0),this.f.Ha)return void t.stopImmediatePropagation();const e=this.p.get("seeked");e&&t.triggers.add(e),this.F("pause",t);const{paused:s,playing:i}=this.$state;s.set(!0),i.set(!1),this.ib()}"time-update"(t){const{currentTime:e,played:s,waiting:i}=this.$state,n=t.detail;e.set(n.currentTime),s.set(n.played),i.set(!1);for(const e of this.a.textTracks)e[r.T.Ta](n.currentTime,t)}"volume-change"(t){const{volume:e,muted:s}=this.$state,i=t.detail;e.set(i.volume),s.set(i.muted||0===i.volume),this.F("volume",t)}seeked(t){const{seeking:e,currentTime:s,paused:i,duration:n,ended:r}=this.$state;if(this.f.qa)e.set(!0),t.stopImmediatePropagation();else if(e()){const a=this.p.get("waiting");a&&t.triggers.add(a);const h=this.p.get("seeking");h&&!t.triggers.has(h)&&t.triggers.add(h),i()&&this.df(),e.set(!1),t.detail!==n()&&r.set(!1),s.set(t.detail),this.F("seeked",t);const o=t?.originEvent;o?.isTrusted&&!/seek/.test(o.type)&&this.started(t)}}waiting(t){this.tc||this.f.qa||(t.stopImmediatePropagation(),this.hb=t,this.zd())}end(t){const{loop:e}=this.$state;e()?setTimeout((()=>{requestAnimationFrame((()=>{this.dispatch("media-loop-request",{trigger:t})}))}),0):this.Db(t)}Db(t){const{paused:e,seeking:s,ended:i,duration:n}=this.$state;e()||this.dispatch("pause",{trigger:t}),s()&&this.dispatch("seeked",{detail:n(),trigger:t}),i.set(!0),this.ib(),this.dispatch("ended",{trigger:t})}df(){this.zd.cancel(),this.$state.waiting.set(!1)}"fullscreen-change"(t){this.$state.fullscreen.set(t.detail),this.F("fullscreen",t)}"fullscreen-error"(t){this.F("fullscreen",t)}"orientation-change"(t){this.F("orientation",t)}"picture-in-picture-change"(t){this.$state.pictureInPicture.set(t.detail),this.F("pip",t)}"picture-in-picture-error"(t){this.F("pip",t)}"title-change"(t){t.stopImmediatePropagation(),this.$state.inferredTitle.set(t.detail)}"poster-change"(t){t.stopImmediatePropagation(),this.$state.inferredPoster.set(t.detail)}}class it extends x{onSetup(){this.Ch(),(0,i.e)(this.Eh.bind(this)),(0,i.e)(this.uc.bind(this)),(0,i.e)(this.Fh.bind(this)),(0,i.e)(this.ld.bind(this)),(0,i.e)(this.Gh.bind(this)),(0,i.e)(this.Vc.bind(this)),(0,i.e)(this.Hh.bind(this)),(0,i.e)(this.Ad.bind(this)),(0,i.e)(this.Ih.bind(this)),(0,i.e)(this.Jh.bind(this)),(0,i.e)(this.Kh.bind(this))}Ch(){const t={poster:"providedPoster",streamType:"providedStreamType",title:"providedTitle",viewType:"providedViewType"};for(const e of Object.keys(this.$props))this.$state[t[e]??e]?.set(this.$props[e]());this.$state.muted.set(this.$props.muted()||0===this.$props.volume())}Eh(){const{viewType:t,streamType:e,title:s,poster:i}=this.$props;this.$state.providedPoster.set(i()),this.$state.providedStreamType.set(e()),this.$state.providedViewType.set(t()),this.$state.providedTitle.set(s())}Dh(){}uc(){const{title:t}=this.$state;this.dispatch("title-change",{detail:t()})}Fh(){const t=this.$props.autoplay();this.$state.autoplay.set(t),this.dispatch("autoplay-change",{detail:t})}Gh(){const t=this.$props.loop();this.$state.loop.set(t),this.dispatch("loop-change",{detail:t})}Vc(){const t=this.$props.controls();this.$state.controls.set(t)}ld(){const{poster:t}=this.$state;this.dispatch("poster-change",{detail:t()})}Hh(){const t=this.$props.crossorigin();this.$state.crossorigin.set(!0===t?"":t)}Ad(){const t=this.$props.playsinline();this.$state.playsinline.set(t),this.dispatch("playsinline-change",{detail:t})}Jh(){this.dispatch("live-change",{detail:this.$state.live()})}Ih(){this.$state.liveEdgeTolerance.set(this.$props.liveEdgeTolerance()),this.$state.minLiveDVRWindow.set(this.$props.minLiveDVRWindow())}Kh(){this.dispatch("live-edge-change",{detail:this.$state.liveEdge()})}}let nt=(0,i.m)(!1);(0,i.l)(document,"pointerdown",(()=>{nt.set(!1)})),(0,i.l)(document,"keydown",(t=>{t.metaKey||t.altKey||t.ctrlKey||nt.set(!0)}));class rt extends i.X{constructor(){super(...arguments),this.Kb=(0,i.m)(!1)}onConnect(t){(0,i.e)((()=>{if(!nt())return this.Kb.set(!1),at(t,!1),this.listen("pointerenter",this.Cd.bind(this)),void this.listen("pointerleave",this.Dd.bind(this));const e=document.activeElement===t;this.Kb.set(e),at(t,e),this.listen("focus",this.Lb.bind(this)),this.listen("blur",this.Nh.bind(this))}))}focused(){return this.Kb()}Lb(){this.Kb.set(!0),at(this.el,!0)}Nh(){this.Kb.set(!1),at(this.el,!1)}Cd(){ht(this.el,!0)}Dd(){ht(this.el,!1)}}function at(t,e){(0,i.k)(t,"data-focus",e),(0,i.k)(t,"data-hocus",e)}function ht(t,e){(0,i.k)(t,"data-hocus",e),(0,i.k)(t,"data-hover",e)}var ot=Object.defineProperty,ct=Object.getOwnPropertyDescriptor,lt=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?ct(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&ot(e,s,r),r};const ut=class t extends i.I{constructor(){super(),this.canPlayQueue=new X,this.wc=!1,new it;const t={player:this,scope:(0,i.g)(),qualities:new C,audioTracks:new L,$provider:(0,i.m)(null),$providerSetup:(0,i.m)(!1),$props:this.$props,$state:this.$state};t.remote=new k(void 0),t.remote.setPlayer(this),t.$iosControls=(0,i.n)(this.Oh.bind(this)),t.textTracks=new E,t.textTracks[r.T.Sa]=this.$state.crossorigin,t.textRenderers=new S(t),t.ariaKeys={},this.a=t,(0,i.Z)(n.m,t),this.orientation=new w,new rt,new q(t);const e=new Y;this.ga=new st(e,t),this.Y=new U(this.ga,e,t),t.delegate=new B(this.ga.X.bind(this.ga),t),new z(this.startLoading.bind(this))}static{this.props=Q}static{this.state=n.a}get i(){return this.a.$provider()}onSetup(){this.Ph(),(0,i.e)(this.Qh.bind(this)),(0,i.e)(this.Rh.bind(this)),(0,i.e)(this.Tc.bind(this)),(0,i.e)(this.Fd.bind(this)),(0,i.e)(this.jb.bind(this)),(0,i.e)(this.Ad.bind(this)),(0,i.e)(this.Sh.bind(this))}onAttach(t){t.setAttribute("data-media-player",""),(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","region"),(0,i.e)(this.uc.bind(this)),(0,i.e)(this.lf.bind(this)),(0,i.l)(t,"find-media-player",this.Th.bind(this))}onConnect(t){h.h&&(0,i.k)(t,"data-iphone",""),(0,h.c)().then(this.$state.canSetVolume.set);const e=window.matchMedia("(pointer: coarse)");this.mf(e),e.onchange=this.mf.bind(this);const s=new ResizeObserver((0,i.V)(this.O.bind(this)));s.observe(t),(0,i.e)(this.O.bind(this)),this.dispatch("media-player-connect",{detail:this,bubbles:!0,composed:!0}),(0,i.o)((()=>{s.disconnect(),e.onchange=null}))}onDestroy(){this.a.player=null,this.canPlayQueue.H()}uc(){if(this.wc)return void(this.wc=!1);const{title:t,live:e,viewType:s}=this.$state,n=e(),r=(0,i._)(s()),a="Unknown"!==r?`${n?"Live ":""}${r}`:n?"Live":"Media",h=t();(0,i.k)(this.el,"aria-label",h?`${a} - ${h}`:a+" Player"),this.el&&customElements.get(this.el.localName)&&(this.wc=!0),this.el?.removeAttribute("title")}lf(){const t=this.orientation.landscape?"landscape":"portrait";this.$state.orientation.set(t),(0,i.k)(this.el,"data-orientation",t),this.O()}Qh(){this.$state.canPlay()&&this.i?this.canPlayQueue.Bb():this.canPlayQueue.ra()}Ph(){if(t[W])return void this.setAttributes(t[W]);const e={"data-captions":function(){const t=this.$state.textTrack();return!!t&&(0,r.i)(t)},"data-ios-controls":function(){return this.a.$iosControls()},"data-controls":function(){return this.controls.showing},"data-buffering":function(){const{canPlay:t,waiting:e}=this.$state;return!t()||e()},"data-error":function(){const{error:t}=this.$state;return!!t()},"data-autoplay-error":function(){const{autoplayError:t}=this.$state;return!!t()}},s={canPictureInPicture:"can-pip",pictureInPicture:"pip"};for(const t of K)e["data-"+(s[t]??(0,i.K)(t))]=function(){return this.$state[t]()};delete e.title,t[W]=e,this.setAttributes(e)}Th(t){t.detail(this)}O(){if(!this.el)return;const t=this.el.clientWidth,e=this.el.clientHeight;this.$state.width.set(t),this.$state.height.set(e),(0,i.f)(this.el,"--player-width",t+"px"),(0,i.f)(this.el,"--player-height",e+"px")}mf(t){const e=t.matches?"coarse":"fine";(0,i.k)(this.el,"data-pointer",e),this.$state.pointer.set(e),this.O()}Oh(){const{playsinline:t,fullscreen:e}=this.$state;return h.h&&!m&&"video"===this.$state.mediaType()&&(!t()||e())}get provider(){return this.i}get controls(){return this.Y.Ib}get title(){return(0,i.p)(this.$state.providedTitle)}set title(t){this.wc||this.$state.providedTitle.set(t)}get qualities(){return this.a.qualities}get audioTracks(){return this.a.audioTracks}get textTracks(){return this.a.textTracks}get textRenderers(){return this.a.textRenderers}get paused(){return(0,i.p)(this.$state.paused)}set paused(t){this.nf(t)}Tc(){this.nf(this.$props.paused())}nf(t){t?this.canPlayQueue.k("paused",(()=>this.Y.ud())):this.canPlayQueue.k("paused",(()=>this.Y.sc()))}get muted(){return(0,i.p)(this.$state.muted)}set muted(t){this.$props.muted.set(t)}Rh(){this.Uh(this.$props.muted())}Uh(t){this.canPlayQueue.k("muted",(()=>{this.i&&this.i.setMuted(t)}))}get currentTime(){return(0,i.p)(this.$state.currentTime)}set currentTime(t){this.of(t)}jb(){this.of(this.$props.currentTime())}of(t){this.canPlayQueue.k("currentTime",(()=>{t!==(0,i.p)(this.$state.currentTime)&&(0,i.p)((()=>{if(!this.i)return;const e=Math.min(Math.max(this.$state.seekableStart()+.1,t),this.$state.seekableEnd()-.1);Number.isFinite(e)&&this.i.setCurrentTime(e)}))}))}get volume(){return(0,i.p)(this.$state.volume)}set volume(t){this.$props.volume.set(t)}Fd(){this.Vh(this.$props.volume())}Vh(t){const e=(0,c.d)(0,t,1);this.canPlayQueue.k("volume",(()=>{this.i&&this.i.setVolume(e)}))}get playbackRate(){return(0,i.p)(this.$state.playbackRate)}set playbackRate(t){this.pf(t)}Sh(){this.pf(this.$props.playbackRate())}pf(t){this.canPlayQueue.k("rate",(()=>{this.i&&this.i.setPlaybackRate?.(t)}))}Ad(){this.Wh(this.$props.playsinline())}Wh(t){this.canPlayQueue.k("playsinline",(()=>{this.i&&this.i.setPlaysinline?.(t)}))}async play(t){return this.Y.sc(t)}async pause(t){return this.Y.ud(t)}async enterFullscreen(t,e){return this.Y._e(t,e)}async exitFullscreen(t,e){return this.Y.af(t,e)}enterPictureInPicture(t){return this.Y.xd(t)}exitPictureInPicture(t){return this.Y.wd(t)}seekToLiveEdge(t){this.Y.Ze(t)}startLoading(t){this.a.delegate.c("can-load",void 0,t)}matchQuery(t){return(0,i.s)((()=>n.P.create(t)),this.scope)}destroy(){this.a.remote.setPlayer(null),this.dispatch("destroy")}};lt([i.$],ut.prototype,"canPlayQueue",2),lt([i.$],ut.prototype,"provider",1),lt([i.$],ut.prototype,"controls",1),lt([i.$],ut.prototype,"orientation",2),lt([i.$],ut.prototype,"title",1),lt([i.$],ut.prototype,"qualities",1),lt([i.$],ut.prototype,"audioTracks",1),lt([i.$],ut.prototype,"textTracks",1),lt([i.$],ut.prototype,"textRenderers",1),lt([i.$],ut.prototype,"paused",1),lt([i.$],ut.prototype,"muted",1),lt([i.$],ut.prototype,"currentTime",1),lt([i.$],ut.prototype,"volume",1),lt([i.$],ut.prototype,"playbackRate",1),lt([i.a0],ut.prototype,"play",1),lt([i.a0],ut.prototype,"pause",1),lt([i.a0],ut.prototype,"enterFullscreen",1),lt([i.a0],ut.prototype,"exitFullscreen",1),lt([i.a0],ut.prototype,"enterPictureInPicture",1),lt([i.a0],ut.prototype,"exitPictureInPicture",1),lt([i.a0],ut.prototype,"seekToLiveEdge",1),lt([i.a0],ut.prototype,"startLoading",1),lt([i.a0],ut.prototype,"matchQuery",1);let dt=ut;function pt(t,e){return fetch(t,e).then((t=>t.text())).then((s=>{const i=function(t){const e=t.match(/#EXT-X-STREAM-INF:[^\n]+(\n[^\n]+)*/g);return e?e[0].split("\n")[1].trim():null}(s);if(i)return pt(/^https?:/.test(i)?i:new URL(i,t).href,e);const n=/EXT-X-PLAYLIST-TYPE:\s*VOD/.test(s)?"on-demand":"live";return"live"===n&&function(t){const e=t.split("\n");for(const t of e)if(t.startsWith("#EXT-X-TARGETDURATION")){const e=parseFloat(t.split(":")[1]);if(!isNaN(e))return e}return-1}(s)>=10&&(/#EXT-X-DVR-ENABLED:\s*true/.test(s)||s.includes("#EXT-X-DISCONTINUITY"))?"live:dvr":n}))}const ft=new Map;class gt{constructor(t,e,s,n=[]){this.xc=t,this.a=e,this.ha=s,this.Gd=!1;const r=new V,a=new R,h=new F,o=[new N,new H];this.Hd=(0,i.n)((()=>e.$props.preferNativeHLS()?[a,h,r,...o,...n]:[r,a,h,...o,...n]));const{$state:c}=e;c.sources.set(bt(e.$props.src()));for(const t of c.sources()){const e=this.Hd().find((e=>e.canPlay(t)));if(!e)continue;const s=e.mediaType(t);this.a.$state.source.set(t),this.a.$state.mediaType.set(s),this.a.$state.inferredViewType.set(s),this.ha.set(e),this.Gd=!0}}get c(){return this.a.delegate.c}connect(){const t=this.ha();this.Gd&&(this.qf(this.a.$state.source(),t),this.rf(t),this.Gd=!1),(0,i.e)(this.Xh.bind(this)),(0,i.e)(this.Yh.bind(this)),(0,i.e)(this.Zh.bind(this)),(0,i.e)(this._h.bind(this))}Xh(){this.c("sources-change",[...bt(this.a.$props.src()),...this.xc()])}Yh(){const{$state:t}=this.a,e=t.sources(),s=(0,i.p)(t.source),n=this.sf(s,e);if(e[0]?.src&&!n.src&&!n.type){const{crossorigin:s}=t,n=(0,r.g)(s()),a=new AbortController;return Promise.all(e.map((t=>(0,i.r)(t.src)&&"?"===t.type?fetch(t.src,{method:"HEAD",credentials:n,signal:a.signal}).then((e=>(t.type=e.headers.get("content-type")||"??",ft.set(t.src,t.type),t))).catch((()=>t)):t))).then((e=>{a.signal.aborted||(this.sf((0,i.p)(t.source),e),(0,i.P)())})),()=>a.abort()}(0,i.P)()}sf(t,e){let s={src:"",type:""},n=null;for(const t of e){const e=(0,i.p)(this.Hd).find((e=>e.canPlay(t)));e&&(s=t,n=e)}return mt(t,s)||this.qf(s,n),n!==(0,i.p)(this.ha)&&this.rf(n),s}qf(t,e){this.c("source-change",t),this.c("media-type-change",e?.mediaType(t)||"unknown")}rf(t){this.a.$providerSetup.set(!1),this.c("provider-change",null),t&&(0,i.p)((()=>t.preconnect?.(this.a))),this.ha.set(t),this.c("provider-loader-change",t)}Zh(){const t=this.a.$provider();if(t&&!(0,i.p)(this.a.$providerSetup))return this.a.$state.canLoad()?((0,i.s)((()=>t.setup(this.a)),t.scope),void this.a.$providerSetup.set(!0)):void(0,i.p)((()=>t.preconnect?.(this.a)))}_h(){if(!this.a.$providerSetup())return;const t=this.a.$provider(),e=this.a.$state.source(),s=(0,i.p)(this.a.$state.crossorigin);if(!mt(t?.currentSrc,e)){if(this.a.$state.canLoad()){const n=new AbortController;return(0,c.i)(e)?(0,h.i)()||pt(e.src,{credentials:(0,r.g)(s),signal:n.signal}).then((t=>{this.c("stream-type-change",t)})).catch(i.a1):this.c("stream-type-change","on-demand"),(0,i.p)((()=>t?.loadSource(e,(0,i.p)(this.a.$state.preload)))),()=>n.abort()}try{(0,i.r)(e.src)&&(0,r.p)(new URL(e.src).origin,"preconnect")}catch(t){}}}}function bt(t){return((0,i.w)(t)?t:[!(0,i.r)(t)&&"src"in t?t:{src:t}]).map((({src:t,type:e,...s})=>({src:t,type:e??((0,i.r)(t)?ft.get(t):null)??(!(0,i.r)(t)||t.startsWith("blob:")?"video/object":t.includes("youtube")?"video/youtube":t.includes("vimeo")?"video/vimeo":"?"),...s})))}function mt(t,e){return t?.src===e?.src&&t?.type===e?.type}class yt{constructor(t,e){this.yc=t,this.a=e,this.tf=[],(0,i.e)(this.$h.bind(this))}$h(){const t=this.yc();for(const e of this.tf)if(!t.some((t=>t.id===e.id))){const t=e.id&&this.a.textTracks.getById(e.id);t&&this.a.textTracks.remove(t)}for(const e of t){const t=e.id||r.b.createId(e);this.a.textTracks.getById(t)||(e.id=t,this.a.textTracks.add(e))}this.tf=t}}var $t=Object.defineProperty,vt=Object.getOwnPropertyDescriptor;class wt extends i.I{constructor(){super(...arguments),this.xc=(0,i.m)([]),this.yc=(0,i.m)([]),this.ha=null,this.Id=-1}static{this.props={loaders:[]}}static{this.state=new i.S({loader:null})}onSetup(){this.a=(0,n.u)(),this.uf=new gt(this.xc,this.a,this.$state.loader,this.$props.loaders())}onAttach(t){t.setAttribute("data-media-provider","")}onConnect(t){this.uf.connect(),new yt(this.yc,this.a);const e=new ResizeObserver((0,i.V)(this.O.bind(this)));e.observe(t);const s=new MutationObserver(this.vf.bind(this));s.observe(t,{attributes:!0,childList:!0}),this.O(),this.vf(),(0,i.o)((()=>{e.disconnect(),s.disconnect()}))}load(t){window.cancelAnimationFrame(this.Id),this.Id=requestAnimationFrame((()=>this.ai(t))),(0,i.o)((()=>{window.cancelAnimationFrame(this.Id)}))}ai(t){if(!this.scope)return;const e=this.$state.loader(),{$provider:s}=this.a;this.ha===e&&e?.target===t&&(0,i.p)(s)||(this.wf(),this.ha=e,e&&(e.target=t||null),e&&t&&e.load(this.a).then((t=>{this.scope&&(0,i.p)(this.$state.loader)===e&&this.a.delegate.c("provider-change",t)})))}onDestroy(){this.ha=null,this.wf()}wf(){this.a.delegate.c("provider-change",null)}O(){if(!this.el)return;const t=this.a.player,e=this.el.offsetWidth,s=this.el.offsetHeight;t&&(t.$state.mediaWidth.set(e),t.$state.mediaHeight.set(s),t.el&&((0,i.f)(t.el,"--media-width",e+"px"),(0,i.f)(t.el,"--media-height",s+"px")))}vf(){const t=[],e=[],s=this.el.children;for(const i of s)i instanceof HTMLSourceElement?t.push({src:i.src,type:i.type}):i instanceof HTMLTrackElement&&e.push({id:i.id,src:i.src,kind:i.track.kind,language:i.srclang,label:i.label,default:i.default,type:i.getAttribute("data-type")});this.xc.set(t),this.yc.set(e),(0,i.P)()}}((t,e,s,i)=>{for(var n,r=vt(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&$t(e,s,r)})([i.a0],wt.prototype,"load");class kt extends i.I{static{this.props={hideDelay:2e3,hideOnMouseLeave:!1}}onSetup(){this.a=(0,n.u)(),(0,i.e)(this.bi.bind(this))}onAttach(t){const{pictureInPicture:e,fullscreen:s}=this.a.$state;(0,i.f)(t,"pointer-events","none"),(0,a.s)(t,"role","group"),this.setAttributes({"data-visible":this.xf.bind(this),"data-fullscreen":s,"data-pip":e}),(0,i.e)((()=>{this.dispatch("change",{detail:this.xf()})})),(0,i.e)(this.ci.bind(this)),(0,i.e)((()=>{const e=s();for(const s of["top","right","bottom","left"])(0,i.f)(t,`padding-${s}`,e&&`env(safe-area-inset-${s})`)}))}ci(){if(!this.el)return;const{$iosControls:t}=this.a,{controls:e}=this.a.$state,s=e()||t();(0,i.k)(this.el,"aria-hidden",s?"true":null),(0,i.f)(this.el,"display",s?"none":null)}bi(){const{controls:t}=this.a.player,{hideDelay:e,hideOnMouseLeave:s}=this.$props;t.defaultDelay=2e3===e()?this.a.$props.controlsDelay():e(),t.hideOnMouseLeave=s()}xf(){const{controlsVisible:t}=this.a.$state;return t()}}class xt extends i.X{constructor(t){super(),this.j=t,this.Ac=-1,this.Bc=-1,this.Ia=null,(0,i.e)(this.di.bind(this))}onDestroy(){this.Ia?.(),this.Ia=null}di(){const t=this.j.C();if(!t)return void this.hide();const e=this.show.bind(this),s=this.hide.bind(this);this.j.zc(t,e,s)}show(t){window.cancelAnimationFrame(this.Bc),this.Bc=-1,this.Ia?.(),this.Ia=null,this.Ac=window.setTimeout((()=>{this.Ac=-1;const e=this.j.u();e&&e.style.removeProperty("display"),(0,i.p)((()=>this.j.B(!0,t)))}),this.j.yf?.()??0)}hide(t){window.clearTimeout(this.Ac),this.Ac=-1,(0,i.p)((()=>this.j.B(!1,t))),this.Bc=requestAnimationFrame((()=>{this.Bc=-1;const t=this.j.u();if(t){const e=()=>{t.style.display="none",this.Ia=null};if((0,a.h)(t)){this.Ia?.();const s=(0,i.l)(t,"animationend",e,{once:!0});this.Ia=s}else e()}}))}}const Tt=(0,i.Q)();let Pt=0;class St extends i.I{constructor(){super(),this.ca="media-tooltip-"+ ++Pt,this.C=(0,i.m)(null),this.u=(0,i.m)(null),new rt;const{showDelay:t}=this.$props;new xt({C:this.C,u:this.u,yf:t,zc(t,e,s){(0,i.l)(t,"touchstart",(t=>t.preventDefault()),{passive:!1}),(0,i.l)(t,"focus",e),(0,i.l)(t,"blur",s),(0,i.l)(t,"mouseenter",e),(0,i.l)(t,"mouseleave",s)},B:this.ei.bind(this)})}static{this.props={showDelay:500}}onAttach(t){t.style.setProperty("display","contents")}onSetup(){(0,i.Z)(Tt,{C:this.C,u:this.u,Jd:this.Jd.bind(this),Kd:this.Kd.bind(this),Ld:this.Ld.bind(this),Md:this.Md.bind(this)})}Jd(t){this.C.set(t);let e=t.getAttribute("data-media-tooltip");e&&this.el?.setAttribute(`data-media-${e}-tooltip`,""),(0,i.k)(t,"data-describedby",this.ca)}Kd(t){t.removeAttribute("data-describedby"),t.removeAttribute("aria-describedby"),this.C.set(null)}Ld(t){t.setAttribute("id",this.ca),t.style.display="none",(0,a.s)(t,"role","tooltip"),this.u.set(t)}Md(t){t.removeAttribute("id"),t.removeAttribute("role"),this.u.set(null)}ei(t){const e=this.C(),s=this.u();e&&(0,i.k)(e,"aria-describedby",t?this.ca:null);for(const n of[this.el,e,s])n&&(0,i.k)(n,"data-visible",t)}}class Et extends i.I{static{this.props={placement:"top center",offset:0,alignOffset:0}}constructor(){super(),new rt;const{placement:t}=this.$props;this.setAttributes({"data-placement":t})}onAttach(t){this.Ja(t),Object.assign(t.style,{position:"absolute",top:0,left:0,width:"max-content"})}onConnect(t){this.Ja(t);const e=(0,i.J)(Tt);(0,i.o)((()=>e.Md(t))),(0,i.o)((0,a.r)((()=>{this.connectScope&&(0,i.e)(this.Nd.bind(this))})))}Ja(t){(0,i.J)(Tt).Ld(t)}Nd(){const{placement:t,offset:e,alignOffset:s}=this.$props;return(0,a.d)(this.el,this.fi(),t(),{offsetVarName:"media-tooltip",xOffset:s(),yOffset:e()})}fi(){return(0,i.J)(Tt).C()}}class At extends i.X{constructor(t){super(),this.j=t,new rt,t.kb&&new I(t.kb)}static{this.props={disabled:!1}}onSetup(){const{disabled:t}=this.$props;this.setAttributes({"data-pressed":this.j.n,"aria-pressed":this.gi.bind(this),"aria-disabled":()=>t()?"true":null})}onAttach(t){(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","button"),(0,a.s)(t,"type","button")}onConnect(t){(0,a.o)(t,this.hi.bind(this));for(const t of["click","touchstart"])this.listen(t,this.ii.bind(this))}gi(){return(0,i.a2)(this.j.n())}ji(t){(0,i.a3)(this.j.n)&&this.j.n.set((t=>!t))}hi(t){if(this.$props.disabled()||this.el.hasAttribute("data-disabled"))return t.preventDefault(),void t.stopImmediatePropagation();t.preventDefault(),(this.j.v??this.ji).call(this,t)}ii(t){this.$props.disabled()&&(t.preventDefault(),t.stopImmediatePropagation())}}var jt=Object.defineProperty,Lt=Object.getOwnPropertyDescriptor;class Ct extends i.I{constructor(){super(),this.zf=(0,i.m)(!1),new At({n:this.zf})}static{this.props={disabled:!1,defaultPressed:!1}}get pressed(){return this.zf()}}((t,e,s,i)=>{for(var n,r=Lt(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&jt(e,s,r)})([i.$],Ct.prototype,"pressed");class Ot extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"togglePaused",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)();const{paused:t,ended:e}=this.a.$state;this.setAttributes({"data-paused":t,"data-ended":e})}onAttach(t){t.setAttribute("data-media-tooltip","play"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote;this.n()?e.pause(t):e.play(t)}n(){const{paused:t}=this.a.$state;return!t()}Z(){const{paused:t}=this.a.$state;return t()?"Play":"Pause"}}function Mt(t){return()=>t()?"true":"false"}class qt extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"toggleCaptions",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)(),this.setAttributes({"data-active":this.n.bind(this),"data-supported":()=>!this.lb(),"aria-hidden":Mt(this.lb.bind(this))})}onAttach(t){t.setAttribute("data-media-tooltip","caption"),(0,a.e)(t,this.Z.bind(this))}v(t){this.a.remote.toggleCaptions(t)}n(){const{textTrack:t}=this.a.$state,e=t();return!!e&&(0,r.i)(e)}lb(){const{textTracks:t}=this.a.$state;return 0==t().filter(r.i).length}Z(){const{textTrack:t}=this.a.$state;return t()?"Closed-Captions Off":"Closed-Captions On"}}class Dt extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"toggleFullscreen",v:this.v.bind(this)})}static{this.props={...At.props,target:"prefer-media"}}onSetup(){this.a=(0,n.u)();const{fullscreen:t}=this.a.$state,e=this.Nb.bind(this);this.setAttributes({"data-active":t,"data-supported":e,"aria-hidden":Mt((()=>!e()))})}onAttach(t){t.setAttribute("data-media-tooltip","fullscreen"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote,s=this.$props.target();this.n()?e.exitFullscreen(s,t):e.enterFullscreen(s,t)}n(){const{fullscreen:t}=this.a.$state;return t()}Nb(){const{canFullscreen:t}=this.a.$state;return t()}Z(){const{fullscreen:t}=this.a.$state;return t()?"Exit Fullscreen":"Enter Fullscreen"}}class It extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"toggleMuted",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)(),this.setAttributes({"data-muted":this.n.bind(this),"data-state":this.ki.bind(this)})}onAttach(t){t.setAttribute("data-media-mute-button",""),t.setAttribute("data-media-tooltip","mute"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote;this.n()?e.unmute(t):e.mute(t)}n(){const{muted:t,volume:e}=this.a.$state;return t()||0===e()}Z(){return this.n()?"Unmute":"Mute"}ki(){const{muted:t,volume:e}=this.a.$state,s=e();return t()||0===s?"muted":s>=.5?"high":s<.5?"low":void 0}}class Ft extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"togglePictureInPicture",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)();const{pictureInPicture:t}=this.a.$state,e=this.Nb.bind(this);this.setAttributes({"data-active":t,"data-supported":e,"aria-hidden":Mt((()=>!e()))})}onAttach(t){t.setAttribute("data-media-tooltip","pip"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote;this.n()?e.exitPictureInPicture(t):e.enterPictureInPicture(t)}n(){const{pictureInPicture:t}=this.a.$state;return t()}Nb(){const{canPictureInPicture:t}=this.a.$state;return t()}Z(){const{pictureInPicture:t}=this.a.$state;return t()?"Exit Picture In Picture":"Enter Picture In Picture"}}class Rt extends i.I{constructor(){super(),new rt}static{this.props={disabled:!1,seconds:30}}onSetup(){this.a=(0,n.u)();const{seeking:t}=this.a.$state,{seconds:e}=this.$props,s=this.Nb.bind(this);this.setAttributes({seconds:e,"data-seeking":t,"data-supported":s,"aria-hidden":Mt((()=>!s()))})}onAttach(t){(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","button"),(0,a.s)(t,"type","button"),t.setAttribute("data-media-tooltip","seek"),(0,a.e)(t,this.Z.bind(this))}onConnect(t){(0,a.o)(t,this.v.bind(this))}Nb(){const{canSeek:t}=this.a.$state;return t()}Z(){const{seconds:t}=this.$props;return`Seek ${t()>0?"forward":"backward"} ${t()} seconds`}v(t){const{seconds:e,disabled:s}=this.$props;if(s())return;const{currentTime:i}=this.a.$state,n=i()+e();this.a.remote.seek(n,t)}}class Nt extends i.I{constructor(){super(),new rt}static{this.props={disabled:!1}}onSetup(){this.a=(0,n.u)();const{disabled:t}=this.$props,{live:e,liveEdge:s}=this.a.$state,i=()=>!e();this.setAttributes({"data-edge":s,"data-hidden":i,"aria-disabled":Mt((()=>t()||s())),"aria-hidden":Mt(i)})}onAttach(t){(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","button"),(0,a.s)(t,"type","button"),t.setAttribute("data-media-tooltip","live")}onConnect(t){(0,a.o)(t,this.v.bind(this))}v(t){const{disabled:e}=this.$props,{liveEdge:s}=this.a.$state;e()||s()||this.a.remote.seekToLiveEdge(t)}}const Vt=new i.S({min:0,max:100,value:0,pointerValue:0,focused:!1,dragging:!1,pointing:!1,get active(){return this.dragging||this.focused||this.pointing},get fillRate(){return Ht(this.min,this.max,this.value)},get fillPercent(){return 100*this.fillRate},get pointerRate(){return Ht(this.min,this.max,this.pointerValue)},get pointerPercent(){return 100*this.pointerRate}});function Ht(t,e,s){const i=e-t;return i>0?(s-t)/i:0}const Wt={Left:-1,ArrowLeft:-1,Up:1,ArrowUp:1,Right:1,ArrowRight:1,Down:-1,ArrowDown:-1};class Kt extends i.X{constructor(t,e){super(),this.j=t,this.a=e,this.i=null,this.ua=null,this.mb=null,this.ti=tt((t=>{this.va(this.Dc(t),t)}),20,{leading:!0})}onConnect(){if((0,i.e)(this.li.bind(this)),(0,i.e)(this.mi.bind(this)),this.j.ni){const t=this.a.player.el?.querySelector("media-provider,[data-media-provider]");t&&(this.i=t,(0,i.l)(t,"touchstart",this.oi.bind(this),{passive:!0}),(0,i.l)(t,"touchmove",this.pi.bind(this),{passive:!1}))}}oi(t){this.ua=t.touches[0]}pi(t){if((0,i.N)(this.ua)||(0,a.i)(t))return;const e=t.touches[0],s=e.clientX-this.ua.clientX,n=e.clientY-this.ua.clientY,r=this.$state.dragging();!r&&Math.abs(n)>20||r||Math.abs(s)>20&&(this.ua=e,this.mb=this.$state.value(),this.Od(this.mb,t))}li(){this.j.K()||(this.listen("focus",this.Lb.bind(this)),this.listen("pointerenter",this.Cd.bind(this)),this.listen("pointermove",this.qi.bind(this)),this.listen("pointerleave",this.Dd.bind(this)),this.listen("pointerdown",this.ri.bind(this)),this.listen("keydown",this.Ab.bind(this)),this.listen("keyup",this.zb.bind(this)))}mi(){!this.j.K()&&this.$state.dragging()&&((0,i.l)(document,"pointerup",this.si.bind(this)),(0,i.l)(document,"pointermove",this.ti.bind(this)),h.g&&(0,i.l)(document,"touchmove",this.ui.bind(this),{passive:!1}))}Lb(){this.va(this.$state.value())}Pd(t,e){const{value:s,min:i,max:n,dragging:r}=this.$state,a=Math.max(i(),Math.min(t,n()));s.set(a);const h=this.createEvent("value-change",{detail:a,trigger:e});if(this.dispatch(h),this.j.o?.(h),r()){const t=this.createEvent("drag-value-change",{detail:a,trigger:e});this.dispatch(t),this.j.nb?.(t)}}va(t,e){const{pointerValue:s,dragging:i}=this.$state;s.set(t),this.dispatch("pointer-value-change",{detail:t,trigger:e}),i()&&this.Pd(t,e)}Dc(t){let e,s=this.el.getBoundingClientRect(),{min:n,max:r}=this.$state;if("vertical"===this.$props.orientation()){const{bottom:i,height:n}=s;e=(i-t.clientY)/n}else if(this.ua&&(0,i.a)(this.mb)){const{width:s}=this.i.getBoundingClientRect(),i=(t.clientX-this.ua.clientX)/s,a=r()-n(),h=a*Math.abs(i);e=(i<0?this.mb-h:this.mb+h)/a}else{const{left:i,width:n}=s;e=(t.clientX-i)/n}return Math.max(n(),Math.min(r(),this.j.Ob(function(t,e,s,i){return t+i*((e-t)*(0,c.d)(0,s,1)/i)}(n(),r(),e,this.j.Ka()))))}Cd(t){this.$state.pointing.set(!0)}qi(t){const{dragging:e}=this.$state;e()||this.va(this.Dc(t),t)}Dd(t){this.$state.pointing.set(!1)}ri(t){if(0!==t.button)return;const e=this.Dc(t);this.Od(e,t),this.va(e,t)}Od(t,e){const{dragging:s}=this.$state;if(s())return;s.set(!0),this.a.remote.pauseControls(e);const i=this.createEvent("drag-start",{detail:t,trigger:e});this.dispatch(i),this.j.Qd?.(i)}Af(t,e){const{dragging:s}=this.$state;if(!s())return;s.set(!1),this.a.remote.resumeControls(e);const i=this.createEvent("drag-end",{detail:t,trigger:e});this.dispatch(i),this.j.Ec?.(i),this.ua=null,this.mb=null}Ab(t){const{key:e}=t,{min:s,max:n}=this.$state;let r;if("Home"===e||"PageUp"===e?r=s():"End"===e||"PageDown"===e?r=n():!t.metaKey&&/[0-9]/.test(e)&&(r=(n()-s())/10*Number(e)),!(0,i.i)(r))return this.va(r,t),void this.Pd(r,t);const a=this.Bf(t);if((0,i.i)(a))return;const h=e===this.Rd;!this.$state.dragging()&&h&&this.Od(a,t),this.va(a,t),h||this.Pd(a,t),this.Rd=e}zb(t){this.Rd="";const{dragging:e,value:s}=this.$state;if(!e())return;const i=this.Bf(t)??s();this.va(i),this.Af(i,t)}Bf(t){const{key:e,shiftKey:s}=t;if(!Object.keys(Wt).includes(e))return;t.preventDefault(),t.stopPropagation();const{shiftKeyMultiplier:i}=this.$props,{value:n,min:r,max:a}=this.$state,h=this.j.Ka(),o=this.j.Pb(),c=(s?o*i():o)*Number(Wt[e]),l=(n()+c)/h;return Math.max(r(),Math.min(a(),Number((h*l).toFixed(3))))}si(t){if(0!==t.button)return;const e=this.Dc(t);this.va(e,t),this.Af(e,t)}ui(t){t.preventDefault()}}const Qt=(0,i.Q)((()=>({}))),zt=(0,i.Q)();class Bt extends i.X{constructor(t){super(),this.j=t,this.xi=(0,i.V)(((t,e)=>{this.el?.style.setProperty("--slider-fill",t+"%"),this.el?.style.setProperty("--slider-pointer",e+"%")}))}static{this.props={disabled:!1,step:1,keyStep:1,orientation:"horizontal",shiftKeyMultiplier:5}}onSetup(){this.a=(0,n.u)();const t=new rt;t.attach(this),this.$state.focused=t.focused.bind(t),(0,i.a4)(Qt)||(0,i.Z)(Qt,{default:"value"}),(0,i.Z)(zt,{ta:this.$props.orientation,Fc:this.j.K,Cf:(0,i.m)(null)}),(0,i.e)(this.D.bind(this)),(0,i.e)(this.Qb.bind(this)),this.vi(),new Kt(this.j,this.a).attach(this)}onAttach(t){(0,a.s)(t,"role","slider"),(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"autocomplete","off"),(0,i.e)(this.Df.bind(this))}D(){const{dragging:t,value:e,min:s,max:n}=this.$state;(0,i.p)(t)||e.set(function(t,e,s,i){return(0,c.d)(t,(0,c.r)(s,(0,c.g)(i)),e)}(s(),n(),e(),this.j.Ka()))}Qb(){if(!this.j.K())return;const{dragging:t,pointing:e}=this.$state;t.set(!1),e.set(!1)}wi(){return(0,i.a2)(this.j.K())}vi(){const{orientation:t}=this.$props,{dragging:e,active:s,pointing:i}=this.$state;this.setAttributes({"data-dragging":e,"data-pointing":i,"data-active":s,"aria-disabled":this.wi.bind(this),"aria-valuemin":this.$state.min,"aria-valuemax":this.$state.max,"aria-valuenow":this.j.ia,"aria-valuetext":this.j.ja,"aria-orientation":t})}Df(){const{fillPercent:t,pointerPercent:e}=this.$state;this.xi((0,c.r)(t(),3),(0,c.r)(e(),3))}}class Jt extends i.I{static{this.props={...Bt.props,min:0,max:100,value:0}}static{this.state=Vt}constructor(){super(),new Bt({Ka:this.$props.step,Pb:this.$props.keyStep,Ob:Math.round,K:this.$props.disabled,ia:this.ia.bind(this),ja:this.ja.bind(this)})}onSetup(){(0,i.e)(this.D.bind(this)),(0,i.e)(this.yi.bind(this))}ia(){const{value:t}=this.$state;return Math.round(t())}ja(){const{value:t,max:e}=this.$state;return(0,c.r)(t()/e()*100,2)+"%"}D(){const{value:t}=this.$props;this.$state.value.set(t())}yi(){const{min:t,max:e}=this.$props;this.$state.min.set(t()),this.$state.max.set(e())}}const Xt=new Map,Ut=new Set,Zt=new Set;class _t{constructor(t,e){this.$src=t,this.a=e,this.$cues=(0,i.m)([]),(0,i.e)(this.zi.bind(this)),Zt.add(this),(0,i.o)((()=>Zt.delete(this)))}static create(t){const e=(0,n.u)();return new _t(t,e)}zi(){const{canLoad:t}=this.a.$state;if(!t())return;const e=new AbortController,{crossorigin:i}=this.a.$state,n=this.$src();if(n){if(Xt.has(n)){const t=Xt.get(n);if(Xt.delete(n),Xt.set(n,t),Xt.size>30){const t=Xt.keys().next().value;Xt.delete(t)}this.$cues.set(Xt.get(n))}else Ut.has(n)||(Ut.add(n),s.e(9701).then(s.bind(s,9701)).then((async({parseResponse:t})=>{try{const s=await fetch(n,{signal:e.signal,credentials:(0,r.g)(i())});if("application/json"===s.headers.get("content-type")){try{const{cues:t}=(0,r.c)(await s.text(),window.VTTCue);this.Ef(n,t)}catch(t){}return}const{cues:a}=await t(s);this.Ef(n,a)}catch(t){}})));return()=>{e.abort(),this.$cues.set([])}}}Ef(t,e){this.$cues.set(e);for(const s of Zt)(0,i.p)(s.$src)===t&&s.$cues.set(e);Xt.set(t,e),Ut.delete(t)}}class Yt extends i.I{constructor(){super(...arguments),this.Td=[],this.Ff=(0,i.V)(this.Fi.bind(this))}static{this.props={src:"",time:0}}static{this.state=new i.S({src:"",img:null,coords:null,activeCue:null,loading:!1,error:null,hidden:!1})}onSetup(){this.a=(0,n.u)(),this.Sd=_t.create(this.$props.src),this.setAttributes({"data-loading":this.Rb.bind(this),"data-error":this.wa.bind(this),"data-hidden":this.$state.hidden,"aria-hidden":Mt(this.$state.hidden)})}onConnect(t){(0,i.e)(this.Ud.bind(this)),(0,i.e)(this.ob.bind(this)),(0,i.e)(this.Ea.bind(this)),(0,i.e)(this.Ai.bind(this)),(0,i.e)(this.Bi.bind(this))}Ud(){const t=this.$state.img();t&&((0,i.l)(t,"load",this.qd.bind(this)),(0,i.l)(t,"error",this.U.bind(this)))}Ea(){const{src:t,loading:e,error:s}=this.$state;t(),e.set(!0),s.set(null)}qd(){const{loading:t,error:e}=this.$state;t.set(!1),e.set(null),this.Ff()}U(t){const{loading:e,error:s}=this.$state;e.set(!1),s.set(t)}Rb(){const{loading:t,hidden:e}=this.$state;return!e()&&t()}wa(){const{error:t}=this.$state;return!(0,i.N)(t())}ob(){const{hidden:t}=this.$state,{duration:e}=this.a.$state,s=this.Sd.$cues();t.set(this.wa()||!Number.isFinite(e())||0===s.length)}Gf(){return this.$props.time()}Ai(){const t=this.Gf(),{activeCue:e}=this.$state,{duration:s}=this.a.$state,i=this.Sd.$cues();i&&Number.isFinite(s())?e.set((0,r.f)(i,t)):e.set(null)}Bi(){let{activeCue:t}=this.$state,e=t(),s=(0,i.p)(this.$props.src);if(/^https?:/.test(s)||(s=location.href),!s||!e)return this.$state.src.set(""),void this.Ci();const[n,r=""]=(e.text||"").split("#");this.$state.coords.set(this.Di(r)),this.$state.src.set(this.Ei(n,s)),this.Ff()}Ei(t,e){return/^https?:/.test(t)?t:new URL(t,e).href}Di(t){const[e,s]=t.split("="),i={},n=s?.split(",");if(!e||!s)return null;for(let t=0;t1?o:1;this.pb(this.el,"--thumbnail-width",s*l+"px"),this.pb(this.el,"--thumbnail-height",i*l+"px"),this.pb(t,"width",t.naturalWidth*l+"px"),this.pb(t,"height",t.naturalHeight*l+"px"),this.pb(t,"transform",e?`translate(-${e.x*l}px, -${e.y*l}px)`:""),this.pb(t,"max-width","none")}pb(t,e,s){t.style.setProperty(e,s),this.Td.push((()=>t.style.removeProperty(e)))}Ci(){for(const t of this.Td)t();this.Td=[]}}var Gt=Object.defineProperty,te=Object.getOwnPropertyDescriptor;class ee extends i.I{static{this.props={src:null}}static{this.state=new i.S({video:null,src:null,canPlay:!1,error:null,hidden:!1})}get video(){return this.$state.video()}onSetup(){this.a=(0,n.u)(),this.Q=(0,i.z)(Jt.state),this.setAttributes({"data-loading":this.Rb.bind(this),"data-hidden":this.$state.hidden,"data-error":this.wa.bind(this),"aria-hidden":Mt(this.$state.hidden)})}onAttach(t){(0,i.e)(this.Gi.bind(this)),(0,i.e)(this.fd.bind(this)),(0,i.e)(this.ob.bind(this)),(0,i.e)(this.Hi.bind(this)),(0,i.e)(this.Ii.bind(this))}Gi(){const t=this.$state.video();t&&(t.readyState>=2&&this.hc(),(0,i.l)(t,"canplay",this.hc.bind(this)),(0,i.l)(t,"error",this.U.bind(this)))}fd(){const{src:t}=this.$state,{canLoad:e}=this.a.$state;t.set(e()?this.$props.src():null)}Rb(){const{canPlay:t,hidden:e}=this.$state;return!t()&&!e()}wa(){const{error:t}=this.$state;return!(0,i.N)(t)}ob(){const{src:t,hidden:e}=this.$state,{canLoad:s,duration:i}=this.a.$state;e.set(s()&&(!t()||this.wa()||!Number.isFinite(i())))}Hi(){const{src:t,canPlay:e,error:s}=this.$state;t(),e.set(!1),s.set(null)}hc(t){const{canPlay:e,error:s}=this.$state;e.set(!0),s.set(null),this.dispatch("can-play",{trigger:t})}U(t){const{canPlay:e,error:s}=this.$state;e.set(!1),s.set(t),this.dispatch("error",{trigger:t})}Ii(){const{video:t,canPlay:e}=this.$state,{duration:s}=this.a.$state,{pointerRate:i}=this.Q,n=t();e()&&n&&Number.isFinite(s())&&Number.isFinite(i())&&(n.currentTime=i()*s())}}function se(t,e){const s=String(t),i=s.length;return i=3600?se(a,2):a,l=se(h,2);return r>0||n?`${o}:${c}:${l}`:`${c}:${l}`}function re(t){const e=[],{hours:s,minutes:i,seconds:n}=ie(t);return s>0&&e.push(`${s} hour`),i>0&&e.push(`${i} min`),(n>0||0===e.length)&&e.push(`${n} sec`),e.join(" ")}((t,e,s,i)=>{for(var n,r=te(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&Gt(e,s,r)})([i.$],ee.prototype,"video");var ae=Object.defineProperty,he=Object.getOwnPropertyDescriptor;class oe extends i.I{static{this.props={type:"pointer",format:null,showHours:!1,padHours:null,padMinutes:null,decimalPlaces:2}}onSetup(){this.Q=(0,i.z)(Jt.state),this.Sb=(0,i.J)(Qt),this.Ji=(0,i.n)(this.getValueText.bind(this))}getValueText(){const{type:t,format:e,decimalPlaces:s,padHours:i,padMinutes:n,showHours:r}=this.$props,{value:a,pointerValue:h,min:o,max:l}=this.Q,u=e()??this.Sb.default,d="current"===t()?a():h();if("percent"===u){const t=d/(l()-o())*100;return(this.Sb.percent??c.r)(t,s())+"﹪"}return"time"===u?(this.Sb.time??ne)(d,i(),n(),r()):this.Sb.value?.(d)??d.toFixed(2)}}((t,e,s,i)=>{for(var n,r=he(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&ae(e,s,r)})([i.a0],oe.prototype,"getValueText");class ce extends i.I{static{this.props={offset:0,noClamp:!1}}onSetup(){this.Q=(0,i.J)(zt);const{active:t}=(0,i.z)(Jt.state);this.setAttributes({"data-visible":t})}onAttach(t){Object.assign(t.style,{position:"absolute",top:0,left:0,width:"max-content"})}onConnect(t){const{Cf:e}=this.Q;e.set(t),(0,i.o)((()=>e.set(null))),(0,i.e)(this.Hf.bind(this));const s=new ResizeObserver(this.Hf.bind(this));s.observe(t),(0,i.o)((()=>s.disconnect()))}Hf(){const{Fc:t,ta:e}=this.Q;if(t())return;const s=this.el,{offset:i,noClamp:n}=this.$props;!function(t,{clamp:e,offset:s,orientation:i}){const{width:n,height:r}=t.getBoundingClientRect(),a={top:null,right:null,bottom:null,left:null};if(a["horizontal"===i?"bottom":"left"]=`calc(100% + var(--media-slider-preview-offset, ${s}px))`,"horizontal"===i){const t=n/2;if(e){const e=`max(0px, calc(var(--slider-pointer) - ${t}px))`,s=`calc(100% - ${n}px)`;a.left=`min(${e}, ${s})`}else a.left=`calc(var(--slider-pointer) - ${t}px)`}else{const t=r/2;if(e){const e=`max(${t}px, calc(var(--slider-pointer) - ${t}px))`,s=`calc(100% - ${r}px)`;a.bottom=`min(${e}, ${s})`}else a.bottom=`calc(var(--slider-pointer) - ${t}px)`}Object.assign(t.style,a)}(s,{clamp:!n(),offset:i(),orientation:e()})}}class le extends i.I{constructor(){super(...arguments),this.If=tt(this.ab.bind(this),25)}static{this.props={...Bt.props,keyStep:5,shiftKeyMultiplier:2}}static{this.state=Vt}onSetup(){this.a=(0,n.u)(),(0,i.Z)(Qt,{default:"percent"}),new Bt({Ka:this.$props.step,Pb:this.$props.keyStep,K:this.$props.disabled,Ob:Math.round,ia:this.ia.bind(this),ja:this.ja.bind(this),nb:this.nb.bind(this),o:this.o.bind(this)}).attach(this),(0,i.e)(this.Fd.bind(this))}onAttach(t){t.setAttribute("data-media-volume-slider",""),(0,a.s)(t,"aria-label","Volume");const{canSetVolume:e}=this.a.$state;this.setAttributes({"data-supported":e,"aria-hidden":Mt((()=>!e()))})}ia(){const{value:t}=this.$state;return Math.round(t())}ja(){const{value:t,max:e}=this.$state;return(0,c.r)(t()/e()*100,2)+"%"}Fd(){const{muted:t,volume:e}=this.a.$state,s=t()?0:100*e();this.$state.value.set(s),this.dispatch("value-change",{detail:s})}ab(t){if(!t.trigger)return;const e=(0,c.r)(t.detail/100,3);this.a.remote.changeVolume(e,t)}o(t){this.If(t)}nb(t){this.If(t)}}class ue extends i.I{constructor(){super(),this.Jf=(0,i.m)(null),this.Wd=!1,new Bt({ni:!0,Ka:this.Ka.bind(this),Pb:this.Pb.bind(this),K:this.K.bind(this),Ob:this.Ob,ia:this.ia.bind(this),ja:this.ja.bind(this),Qd:this.Qd.bind(this),nb:this.nb.bind(this),Ec:this.Ec.bind(this),o:this.o.bind(this)})}static{this.props={...Bt.props,step:.1,keyStep:5,shiftKeyMultiplier:2,pauseWhileDragging:!1,seekingRequestThrottle:100}}static{this.state=Vt}onSetup(){this.a=(0,n.u)(),(0,i.Z)(Qt,{default:"time",value:this.Ki.bind(this),time:this.Li.bind(this)}),this.setAttributes({"data-chapters":this.Mi.bind(this)}),this.setStyles({"--slider-progress":this.Ni.bind(this)}),(0,i.e)(this.jb.bind(this)),(0,i.e)(this.Oi.bind(this))}onAttach(t){t.setAttribute("data-media-time-slider",""),(0,a.s)(t,"aria-label","Seek")}onConnect(t){(0,i.e)(this.Pi.bind(this)),(0,r.o)(this.a.textTracks,"chapters",this.Jf.set)}Ni(){const{bufferedEnd:t,duration:e}=this.a.$state;return(0,c.r)(100*Math.min(t()/Math.max(e(),1),1),3)+"%"}Mi(){const{duration:t}=this.a.$state;return this.Jf()?.cues.length&&Number.isFinite(t())&&t()>0}Oi(){this.Vd=tt(this.qa.bind(this),this.$props.seekingRequestThrottle())}jb(){const{currentTime:t}=this.a.$state,{value:e,dragging:s}=this.$state,n=this.Qi(t());(0,i.p)(s)||(e.set(n),this.dispatch("value-change",{detail:n}))}Pi(){const t=this.a.player.el,{Cf:e}=(0,i.J)(zt);t&&e()&&(0,i.k)(t,"data-preview",this.$state.active())}qa(t,e){this.a.remote.seeking(t,e)}Ri(t,e,s){this.Vd.cancel();const{live:i}=this.a.$state;i()&&e>=99?this.a.remote.seekToLiveEdge(s):this.a.remote.seek(t,s)}Qd(t){const{pauseWhileDragging:e}=this.$props;if(e()){const{paused:e}=this.a.$state;this.Wd=!e(),this.a.remote.pause(t)}}nb(t){this.Vd(this.Tb(t.detail),t)}Ec(t){const e=t.detail;this.Ri(this.Tb(e),e,t);const{pauseWhileDragging:s}=this.$props;s()&&this.Wd&&(this.a.remote.play(t),this.Wd=!1)}o(t){const{dragging:e}=this.$state;!e()&&t.trigger&&this.Ec(t)}Ka(){const t=this.$props.step()/this.a.$state.duration()*100;return Number.isFinite(t)?t:1}Pb(){const t=this.$props.keyStep()/this.a.$state.duration()*100;return Number.isFinite(t)?t:1}Ob(t){return(0,c.r)(t,3)}K(){const{canSeek:t}=this.a.$state;return this.$props.disabled()||!t()}ia(){const{value:t}=this.$state;return Math.round(t())}ja(){const t=this.Tb(this.$state.value()),{duration:e}=this.a.$state;return Number.isFinite(t)?`${re(t)} out of ${re(e())}`:"live"}Tb(t){const{duration:e}=this.a.$state;return(0,c.r)(t/100*e(),5)}Qi(t){const{liveEdge:e,duration:s}=this.a.$state,i=Math.max(0,Math.min(1,e()?1:Math.min(t,s())/s()));return Number.isNaN(i)?0:Number.isFinite(i)?100*i:100}Ki(t){const e=this.Tb(t),{live:s,duration:i}=this.a.$state;return Number.isFinite(e)?(s()?e-i():e).toFixed(0):"LIVE"}Li(t,e,s,i){const n=this.Tb(t),{live:r,duration:a}=this.a.$state,h=r()?n-a():n;return Number.isFinite(n)?`${h<0?"-":""}${ne(Math.abs(h),e,s,i)}`:"LIVE"}}var de=Object.defineProperty,pe=Object.getOwnPropertyDescriptor,fe=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?pe(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&de(e,s,r),r};class ge extends i.I{constructor(){super(...arguments),this.La=null,this.R=[],this.Gc=(0,i.m)(null),this._=(0,i.m)([]),this.Ub=(0,i.m)(-1),this.Hc=(0,i.m)(-1),this.Zd=0,this.Xi=(0,i.V)((t=>{let e,s=this._();for(let i=this.Zd;i{const t=(0,i.p)(this.Gc);this.scope&&t&&t.cues.length&&(this._.set(this._i(t.cues)),this.Ub.set(0))}),150,!0)}static{this.props={disabled:!1}}get cues(){return this._()}get activeCue(){return this._()[this.Ub()]||null}get activePointerCue(){return this._()[this.Hc()]||null}onSetup(){this.a=(0,n.u)(),this.Xd=(0,i.z)(ue.state)}onAttach(t){(0,r.o)(this.a.textTracks,"chapters",this.Kf.bind(this)),(0,i.e)(this._d.bind(this))}onConnect(){(0,i.o)((()=>this.H.bind(this)))}onDestroy(){this.Kf(null)}setRefs(t){if(this.R=t,this.Yd?.dispose(),1===this.R.length){const t=this.R[0];t.style.width="100%",t.style.setProperty("--chapter-fill","var(--slider-fill)"),t.style.setProperty("--chapter-progress","var(--slider-progress)")}else this.R.length>0&&(0,i.s)((()=>this.Si()),this.Yd=(0,i.q)())}Kf(t){(0,i.p)(this.Gc)!==t&&(this.H(),this.Gc.set(t))}H(){this.R=[],this._.set([]),this.Ub.set(-1),this.Hc.set(-1),this.Zd=0,this.Yd?.dispose()}Si(){this.R.length&&((0,i.e)(this.Ti.bind(this)),(0,i.e)(this.Ui.bind(this)),(0,i.e)(this.Vi.bind(this)),(0,i.e)(this.Wi.bind(this)))}Ti(){let t,e=this._(),s=e[e.length-1].endTime;for(let i=0;ih?this.$d(h,c,"100%"):c=0&&s<100)return n;return 0}Wi(){this.Xi(this.Yi())}Zi(){const{bufferedEnd:t,duration:e}=this.a.$state;return 100*(0,c.r)(Math.min(t()/Math.max(e(),1),1),3)}ae(t,e){const s=this._();if(0===s.length)return 0;const i=s[s.length-1],n=t.startTime/i.endTime*100,r=t.endTime/i.endTime*100;return Math.max(0,(0,c.r)(e>=r?100:(e-n)/(r-n)*100,3))}_i(t){const e=[];0!==t[0].startTime&&e.push(new window.VTTCue(0,t[0].startTime,""));for(let s=0;s0&&e.push(new window.VTTCue(i.endTime,i.endTime+t,""))}}return e.push(t[t.length-1]),e}_d(){if(!this.scope)return;const{disabled:t}=this.$props;if(t())return;const e=this.Gc();if(e){const t=this.$i.bind(this);t(),(0,i.o)((0,i.l)(e,"add-cue",t)),(0,i.o)((0,i.l)(e,"remove-cue",t))}return this.La=this.aj(),this.La&&(0,i.e)(this.bj.bind(this)),()=>{this.La&&(this.La.textContent="",this.La=null)}}bj(){const t=this.activePointerCue||this.activeCue;this.La&&(this.La.textContent=t?.text||"")}cj(){let t=this.el;for(;t&&"slider"!==t.getAttribute("role");)t=t.parentElement;return t}aj(){const t=this.cj();return t?t.querySelector('[data-part="chapter-title"]'):null}}fe([i.$],ge.prototype,"cues",1),fe([i.$],ge.prototype,"activeCue",1),fe([i.$],ge.prototype,"activePointerCue",1),fe([i.a0],ge.prototype,"setRefs",1);const be=(0,i.Q)(),me=["a[href]","[tabindex]","input","select","button"].map((t=>`${t}:not([aria-hidden])`)).join(","),ye=new Set(["Escape","Tab","ArrowUp","ArrowDown","Home","PageUp","End","PageDown","Enter"," "]);class $e{constructor(t){this.j=t,this.ka=0,this.xa=null,this.da=[]}get r(){return this.da}Nf(t){return(0,i.l)(t,"focus",this.Lb.bind(this)),this.xa=t,(0,i.o)((()=>{this.xa=null})),this}zc(){this.xa&&(this.ea(),(0,i.l)(this.xa,"keyup",this.zb.bind(this)),(0,i.l)(this.xa,"keydown",this.Ab.bind(this)),(0,i.o)((()=>{this.ka=0,this.da=[]})))}ea(){this.ka=0,this.da=this.dj()}Of(t=this.Pf()){const e=this.da[t],s=this.j.ej();e&&s&&requestAnimationFrame((()=>{s.scrollTop=e.offsetTop-s.offsetHeight/2+e.offsetHeight/2}))}qb(t){this.ka=t,this.da[t]?.focus(),this.Of(t)}Pf(){return this.da.findIndex((t=>"true"===t.getAttribute("aria-checked")))}Lb(){this.ea(),setTimeout((()=>{const t=this.Pf();this.qb(t>=0?t:0)}),100)}zb(t){ye.has(t.key)&&(t.stopPropagation(),t.preventDefault())}Ab(t){if(ye.has(t.key))switch(t.stopPropagation(),t.preventDefault(),t.key){case"Escape":this.j.fj(t);break;case"Tab":this.qb(this.be(t.shiftKey?-1:1));break;case"ArrowUp":this.qb(this.be(-1));break;case"ArrowDown":this.qb(this.be(1));break;case"Home":case"PageUp":this.qb(0);break;case"End":case"PageDown":this.qb(this.da.length-1)}}be(t){let e=this.ka;do{e=(e+t+this.da.length)%this.da.length}while(null===this.da[e]?.offsetParent);return e}dj(){if(!this.xa)return[];const t=this.xa.querySelectorAll(me),e=[],s=t=>"menu"===t.getAttribute("role");for(const i of t)i instanceof HTMLElement&&null!==i.offsetParent&&(0,a.f)(this.xa,i,s)&&e.push(i);return e}}var ve=Object.defineProperty,we=Object.getOwnPropertyDescriptor,ke=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?we(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&ve(e,s,r),r};let xe=0;class Te extends i.I{constructor(){super(),this.L=(0,i.m)(!1),this.Fc=(0,i.m)(!1),this.C=(0,i.m)(null),this.u=(0,i.m)(null),this.Qf=(0,i.m)(!1),this.Vb=new Set,this.Ic=null,this.rj=this.sj.bind(this),this.pj=this.tj.bind(this),this.qj=this.uj.bind(this);const{showDelay:t}=this.$props;this.Jc=new xt({C:this.C,u:this.u,yf:t,zc:(t,e,s)=>{(0,a.o)(t,(t=>{this.L()?s(t):e(t)}));const i=this.gj();i&&(0,a.o)(i,(t=>{t.stopPropagation(),s(t)}))},B:this.hj.bind(this)})}static{this.props={showDelay:0}}get triggerElement(){return this.C()}get contentElement(){return this.u()}get isSubmenu(){return!!this.ee}onSetup(){this.a=(0,n.u)();const t=++xe;this.ce=`media-menu-${t}`,this.de=`media-menu-button-${t}`,this.rb=new $e({ej:this.ij.bind(this),fj:this.close.bind(this)}),(0,i.a4)(be)&&(this.ee=(0,i.J)(be)),this.setAttributes({"data-open":this.L,"data-submenu":this.isSubmenu,"data-disabled":this.K.bind(this)}),(0,i.Z)(be,{jj:this.C,L:this.L,Wb:(0,i.m)(""),Ma:this.Ma.bind(this),fe:this.fe.bind(this),ge:this.ge.bind(this),he:this.he.bind(this),ie:this.ie.bind(this),je:this.je.bind(this)})}onAttach(t){t.style.setProperty("display","contents"),this.rb.Nf(t)}onConnect(t){(0,i.e)(this.kj.bind(this)),this.isSubmenu&&this.ee?.je(this),requestAnimationFrame((()=>{this.O()}))}onDestroy(){this.C.set(null),this.u.set(null),this.Ic=null}kj(){const t=this.lj();this.O(),this.Rf(t),t&&((0,i.e)((()=>{const{height:t}=this.a.$state,e=this.u();e&&(0,i.f)(e,"--player-height",t()+"px")})),this.rb.zc(),this.listen("pointerup",this.mj.bind(this)),(0,i.l)(window,"pointerup",this.nj.bind(this)))}fe(t){const e=t.el,s=this.isSubmenu,n=Mt(this.K.bind(this));(0,a.s)(e,"tabindex",s?"-1":"0"),(0,a.s)(e,"role",s?"menuitem":"button"),(0,i.k)(e,"id",this.de),(0,i.k)(e,"aria-haspopup","menu"),(0,i.k)(e,"aria-expanded","false"),(0,i.k)(e,"data-submenu",this.isSubmenu),this.isSubmenu||this.Sf(e),(0,i.e)((()=>{(0,i.k)(e,"data-open",this.L()),(0,i.k)(e,"aria-disabled",n())})),this.C.set(e),(0,i.o)((()=>{this.C.set(null)}))}ge(t){const e=t.el;e.style.setProperty("display","none"),(0,i.k)(e,"id",this.ce),(0,a.s)(e,"role","menu"),(0,a.s)(e,"tabindex","-1"),(0,i.k)(e,"data-submenu",this.isSubmenu),this.u.set(e),(0,i.o)((()=>this.u.set(null))),this.isSubmenu||this.Sf(e),(0,i.e)((()=>{(0,i.k)(e,"data-open",this.L())})),this.rb.Nf(e),this.Rf(!1);{const t=(0,i.V)(this.O.bind(this)),s=new MutationObserver(t);t(),s.observe(e,{childList:!0,subtree:!0}),(0,i.o)((()=>s.disconnect()))}}he(t){this.Ic=t}Sf(t){(0,i.l)(t,"click",(t=>t.stopPropagation())),(0,i.l)(t,"pointerup",(t=>t.stopPropagation()))}Rf(t){const e=(0,i.p)(this.u);e&&(0,i.k)(e,"aria-hidden",(0,i.a2)(!t))}ie(t){this.Qf.set(t)}hj(t,e){if(e?.stopPropagation(),this.L()===t)return;if(this.K())return void(t&&this.Jc.hide(e));const s=this.C(),n=this.u();if(s&&((0,i.k)(s,"aria-controls",t&&this.ce),(0,i.k)(s,"aria-expanded",(0,i.a2)(t))),n&&(0,i.k)(n,"aria-labelledby",t&&this.de),this.L.set(t),this.oj(e),(0,i.P)(),(0,i.G)(e)){t?n?.focus():s?.focus();for(const t of[this.el,n])t&&t.setAttribute("data-keyboard","")}else for(const t of[this.el,n])t&&t.removeAttribute("data-keyboard");this.dispatch(t?"open":"close",{trigger:e}),t?(this.isSubmenu||this.a.activeMenu===this||(this.a.activeMenu?.close(e),this.a.activeMenu=this),this.Ic?.ke?.(e)):(this.isSubmenu?setTimeout((()=>{for(const t of this.Vb)t.close(e)}),300):this.a.activeMenu=null,this.Ic?.Tj?.(e)),t&&!(0,i.G)(e)&&requestAnimationFrame((()=>{this.rb.ea(),setTimeout((()=>{this.rb.Of()}),100)}))}lj(){return!this.K()&&this.L()}K(){return this.Fc()||this.Qf()}Ma(t){this.Fc.set(t)}mj(t){t.stopPropagation()}nj(t){if(this.isSubmenu)return setTimeout(this.close.bind(this,t),800);this.close(t)}gj(){const t=this.el.querySelector('[data-part="close-target"]');return(0,a.f)(this.el,t,(t=>"menu"===t.getAttribute("role")))?t:null}ij(){if(this.isSubmenu){let t=this.el;for(;t&&"media-menu"!==t.tagName&&t.hasAttribute("data-submenu");)t=t.parentNode;return t}return(0,i.p)(this.u)||null}oj(t){this.isSubmenu||(this.L()?this.a.remote.pauseControls(t):this.a.remote.resumeControls(t))}je(t){this.Vb.add(t),(0,i.l)(t,"open",this.pj),(0,i.l)(t,"close",this.qj),(0,i.o)(this.rj)}sj(t){this.Vb.delete(t)}tj(t){for(const e of this.Vb)if(e!==t.target)for(const t of[e.el,e.triggerElement])t?.setAttribute("aria-hidden","true");requestAnimationFrame((()=>{this.O()}))}uj(){for(const t of this.Vb)for(const e of[t.el,t.triggerElement])e?.setAttribute("aria-hidden","false");requestAnimationFrame((()=>{this.O()}))}O(){const t=(0,i.p)(this.u);if(!t)return;let{paddingTop:e,paddingBottom:s,borderTopWidth:n,borderBottomWidth:r}=getComputedStyle(t),a=parseFloat(e)+parseFloat(s)+parseFloat(n)+parseFloat(r),h=[...t.children];for(const t of h)t instanceof HTMLElement&&"contents"===t.style.display?h.push(...t.children):3===t.nodeType?a+=parseInt(window.getComputedStyle(t).fontSize,10):a+=t.offsetHeight||0;requestAnimationFrame((()=>{t&&((0,i.k)(t,"data-resizing",""),setTimeout((()=>{t&&(0,i.k)(t,"data-resizing",!1)}),400),(0,i.f)(t,"--menu-height",a+"px"))}))}open(t){(0,i.p)(this.L)||(this.Jc.show(t),(0,i.P)())}close(t){(0,i.p)(this.L)&&(this.Jc.hide(t),(0,i.P)())}}ke([i.$],Te.prototype,"triggerElement",1),ke([i.$],Te.prototype,"contentElement",1),ke([i.$],Te.prototype,"isSubmenu",1),ke([i.a0],Te.prototype,"open",1),ke([i.a0],Te.prototype,"close",1);var Pe=Object.defineProperty,Se=Object.getOwnPropertyDescriptor;class Ee extends i.I{constructor(){super(),new rt}static{this.props={disabled:!1}}get expanded(){return this.l?.L()??!1}onSetup(){this.l=(0,i.J)(be)}onAttach(t){this.l.fe(this),(0,i.e)(this.Qb.bind(this)),(0,a.s)(t,"type","button")}onConnect(t){const e=Array.from(t.querySelectorAll('[data-part="hint"]')).pop();e&&(0,i.e)((()=>{const t=this.l.Wb();t&&(e.textContent=t)})),(0,a.o)(t,(t=>{this.dispatch("select",{trigger:t})}))}Qb(){this.l.ie(this.$props.disabled())}}((t,e,s,i)=>{for(var n,r=Se(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&Pe(e,s,r)})([i.$],Ee.prototype,"expanded");class Ae extends i.I{constructor(){super(...arguments),this.A=null}static{this.props={container:null,disabled:!1}}onSetup(){this.a=(0,n.u)(),(0,i.Z)(je,{Ja:this.vj.bind(this)})}onAttach(t){t.style.setProperty("display","contents")}onConnect(t){}onDestroy(){this.A?.remove(),this.A=null}vj(t){this.Tf(!1),this.A=t,(0,a.r)((()=>{(0,a.r)((()=>{this.connectScope&&(0,i.e)(this.Qb.bind(this))}))}))}Qb(){const{fullscreen:t}=this.a.$state,{disabled:e}=this.$props,s=e();this.Tf("fullscreen"===s?!t():!s)}Tf(t){if(!this.A)return;let e=this.wj(this.$props.container());if(!e)return;const s=this.A.parentElement===e;(0,i.k)(this.A,"data-portal",t),t?s||(this.A.remove(),e.append(this.A)):s&&this.A.parentElement===e&&(this.A.remove(),this.el?.append(this.A))}wj(t){return t instanceof HTMLElement?t:t?document.querySelector(t):document.body}}const je=(0,i.Q)();class Le extends i.I{constructor(){super(),new rt;const{placement:t}=this.$props;this.setAttributes({"data-placement":t})}static{this.props={placement:null,offset:0,alignOffset:0}}onAttach(t){if(this.l=(0,i.J)(be),this.l.ge(this),(0,i.a4)(je)){const e=(0,i.J)(je);e&&((0,i.Z)(je,null),e.Ja(t),(0,i.o)((()=>e.Ja(null))))}}onConnect(t){(0,i.e)(this.Nd.bind(this))}Nd(){if(!this.el)return;const t=this.$props.placement();if(t){Object.assign(this.el.style,{position:"absolute",top:0,left:0,width:"max-content"});const{offset:e,alignOffset:s}=this.$props;return(0,a.d)(this.el,this.Cc(),t,{offsetVarName:"media-menu",xOffset:s(),yOffset:e()})}this.el.removeAttribute("style"),this.el.style.display="none"}Cc(){return this.l.jj()}}const Ce=(0,i.Q)();class Oe extends i.X{constructor(){super(...arguments),this.sb=new Set,this.la=(0,i.m)(""),this.d=null,this.Aj=this.B.bind(this)}get xj(){return Array.from(this.sb).map((t=>t.la()))}get value(){return this.la()}set value(t){this.B(t)}onSetup(){(0,i.Z)(Ce,{add:this.yj.bind(this),remove:this.zj.bind(this)})}onAttach(t){(0,i.a4)(be)||(0,a.s)(t,"role","radiogroup"),this.setAttributes({value:this.la})}onDestroy(){this.sb.clear()}yj(t){this.sb.has(t)||(this.sb.add(t),t.Kc=this.Aj,t.Xb(t.la()===this.la()))}zj(t){t.Kc=null,this.sb.delete(t)}B(t,e){const s=(0,i.p)(this.la);if(!t||t===s)return;const n=this.Uf(s),r=this.Uf(t);n?.Xb(!1,e),r?.Xb(!0,e),this.la.set(t),this.o?.(t,e)}Uf(t){for(const e of this.sb)if(t===(0,i.p)(e.la))return e;return null}}var Me=Object.defineProperty,qe=Object.getOwnPropertyDescriptor,De=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?qe(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Me(e,s,r),r};class Ie extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={value:""}}get values(){return this.d.xj}get value(){return this.d.value}set value(t){this.d.value=t}onSetup(){(0,i.e)(this.D.bind(this))}D(){this.d.value=this.$props.value()}o(t,e){const s=this.createEvent("change",{detail:t,trigger:e});this.dispatch(s)}}De([i.$],Ie.prototype,"values",1),De([i.$],Ie.prototype,"value",1);var Fe=Object.defineProperty,Re=Object.getOwnPropertyDescriptor;class Ne extends i.I{constructor(){super(),this.Na=(0,i.m)(!1),this.d={la:this.$props.value,Xb:this.Xb.bind(this),Kc:null},new rt}static{this.props={value:""}}get checked(){return this.Na()}onSetup(){this.setAttributes({value:this.$props.value,"data-checked":this.Na,"aria-checked":Mt(this.Na)})}onAttach(t){const e=(0,i.a4)(be);(0,a.s)(t,"tabindex",e?"-1":"0"),(0,a.s)(t,"role",e?"menuitemradio":"radio"),(0,i.e)(this.D.bind(this))}onConnect(t){this.Bj(),(0,a.o)(t,this.v.bind(this)),(0,i.o)(this.ya.bind(this))}ya(){(0,i.s)((()=>{(0,i.J)(Ce).remove(this.d)}),this.connectScope)}Bj(){(0,i.J)(Ce).add(this.d)}D(){const{value:t}=this.$props,e=t();(0,i.p)(this.Na)&&this.d.Kc?.(e)}v(t){(0,i.p)(this.Na)||(this.B(!0,t),this.Cj(t),this.d.Kc?.((0,i.p)(this.$props.value),t))}Xb(t,e){(0,i.p)(this.Na)!==t&&this.B(t,e)}B(t,e){this.Na.set(t),this.dispatch("change",{detail:t,trigger:e})}Cj(t){this.dispatch("select",{trigger:t})}}((t,e,s,i)=>{for(var n,r=Re(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&Fe(e,s,r)})([i.$],Ne.prototype,"checked");var Ve=Object.defineProperty,He=Object.getOwnPropertyDescriptor,We=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?He(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Ve(e,s,r),r};class Ke extends i.I{constructor(){super(),this.ka=(0,i.m)(0),this.z=(0,i.m)(null),this.J=(0,i.m)([]),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={thumbnails:""}}get value(){return this.d.value}get disabled(){return!this.J()?.length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be));const{thumbnails:t}=this.$props;this.setAttributes({"data-thumbnails":()=>!!t()})}onAttach(t){this.l?.he({ke:this.ke.bind(this)})}getOptions(){return this.J().map(((t,e)=>({cue:t,value:e+"",label:t.text,startTime:ne(t.startTime,!1),duration:re(t.endTime-t.startTime)})))}ke(){(0,i.p)((()=>this.jb()))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.jb.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.tk.bind(this)),(0,r.o)(this.a.textTracks,"chapters",this.z.set)}tk(){const t=this.z();if(!t)return;const e=this.$i.bind(this,t);return e(),(0,i.l)(t,"add-cue",e),(0,i.l)(t,"remove-cue",e),()=>{this.J.set([])}}$i(t){this.J.set([...t.cues])}D(){this.d.value=this.na()}jb(){if(!this.l?.L())return;const t=this.z();if(!t)return void this.ka.set(-1);const{currentTime:e}=this.a.$state,s=e(),n=t.cues.findIndex((t=>(0,r.d)(t,s)));if(this.ka.set(n),n>=0){const e=t.cues[n],r=this.el.querySelector("[aria-checked='true']"),a=(s-e.startTime)/(e.endTime-e.startTime)*100;r&&(0,i.f)(r,"--progress",(0,c.r)(a,3)+"%")}}ma(){this.l?.Ma(this.disabled)}na(){return this.ka()+""}o(t,e){if(this.disabled||!e)return;const s=+t,n=this.z()?.cues;(0,i.a)(s)&&n?.[s]&&(this.ka.set(s),this.a.remote.seek(n[s].startTime,e),this.dispatch("change",{detail:n[s],trigger:e}))}}We([i.$],Ke.prototype,"value",1),We([i.$],Ke.prototype,"disabled",1),We([i.a0],Ke.prototype,"getOptions",1);var Qe=Object.defineProperty,ze=Object.getOwnPropertyDescriptor,Be=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?ze(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Qe(e,s,r),r};class Je extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={emptyLabel:"Default"}}get value(){return this.d.value}get disabled(){const{audioTracks:t}=this.a.$state;return 0===t().length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.Oa.bind(this))}getOptions(){const{audioTracks:t}=this.a.$state;return t().map((t=>({track:t,label:t.label,value:t.label.toLowerCase()})))}D(){this.d.value=this.na()}Oa(){const{emptyLabel:t}=this.$props,{audioTrack:e}=this.a.$state,s=e();this.l?.Wb.set(s?.label??t())}ma(){this.l?.Ma(this.disabled)}na(){const{audioTrack:t}=this.a.$state,e=t();return e?e.label.toLowerCase():""}o(t,e){if(this.disabled)return;const s=this.a.audioTracks.toArray().findIndex((e=>e.label.toLowerCase()===t));if(s>=0){const t=this.a.audioTracks[s];this.a.remote.changeAudioTrack(s,e),this.dispatch("change",{detail:t,trigger:e})}}}Be([i.$],Je.prototype,"value",1),Be([i.$],Je.prototype,"disabled",1),Be([i.a0],Je.prototype,"getOptions",1);var Xe=Object.defineProperty,Ue=Object.getOwnPropertyDescriptor,Ze=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?Ue(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Xe(e,s,r),r};class _e extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={offLabel:"Off"}}get value(){return this.d.value}get disabled(){const{textTracks:t}=this.a.$state;return 0===t().filter(r.i).length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){super.onConnect?.(t),(0,i.e)(this.D.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.Oa.bind(this))}getOptions(){const{offLabel:t}=this.$props,{textTracks:e}=this.a.$state;return[{value:"off",label:t},...e().filter(r.i).map((t=>({track:t,label:t.label,value:this.xk(t)})))]}D(){this.d.value=this.na()}Oa(){const{offLabel:t}=this.$props,{textTrack:e}=this.a.$state,s=e();this.l?.Wb.set(s&&(0,r.i)(s)&&"showing"===s.mode?s.label:t())}ma(){this.l?.Ma(this.disabled)}na(){const{textTrack:t}=this.a.$state,e=t();return e&&(0,r.i)(e)&&"showing"===e.mode?this.xk(e):"off"}o(t,e){if(this.disabled)return;if("off"===t){const t=this.a.textTracks.selected;if(t){const s=this.a.textTracks.toArray().indexOf(t);this.a.remote.changeTextTrackMode(s,"disabled",e),this.dispatch("change",{detail:null,trigger:e})}return}const s=this.a.textTracks.toArray().findIndex((e=>this.xk(e)===t));if(s>=0){const t=this.a.textTracks[s];this.a.remote.changeTextTrackMode(s,"showing",e),this.dispatch("change",{detail:t,trigger:e})}}xk(t){return t.id+":"+t.kind+"-"+t.label.toLowerCase()}}Ze([i.$],_e.prototype,"value",1),Ze([i.$],_e.prototype,"disabled",1),Ze([i.a0],_e.prototype,"getOptions",1);var Ye=Object.defineProperty,Ge=Object.getOwnPropertyDescriptor,ts=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?Ge(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Ye(e,s,r),r};class es extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={normalLabel:"Normal",rates:[.25,.5,.75,1,1.25,1.5,1.75,2]}}get value(){return this.d.value}get disabled(){const{rates:t}=this.$props,{canSetPlaybackRate:e}=this.a.$state;return!e()||0===t().length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.Oa.bind(this)),(0,i.e)(this.ma.bind(this))}getOptions(){const{rates:t,normalLabel:e}=this.$props;return t().map((t=>({label:1===t?e:t+"×",value:t+""})))}D(){this.d.value=this.na()}Oa(){const{normalLabel:t}=this.$props,{playbackRate:e}=this.a.$state,s=e();this.l?.Wb.set(1===s?t():s+"×")}ma(){this.l?.Ma(this.disabled)}na(){const{playbackRate:t}=this.a.$state;return t()+""}o(t,e){if(this.disabled)return;const s=+t;this.a.remote.changePlaybackRate(s,e),this.dispatch("change",{detail:s,trigger:e})}}ts([i.$],es.prototype,"value",1),ts([i.$],es.prototype,"disabled",1),ts([i.a0],es.prototype,"getOptions",1);var ss=Object.defineProperty,is=Object.getOwnPropertyDescriptor,ns=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?is(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&ss(e,s,r),r};class rs extends i.I{constructor(){super(),this.Dj=(0,i.n)((()=>{const{qualities:t}=this.a.$state;return[...t()].sort(((t,e)=>e.height===t.height?e.bitrate-t.bitrate:e.height-t.height))})),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={autoLabel:"Auto",hideBitrate:!1}}get value(){return this.d.value}get disabled(){const{canSetQuality:t,qualities:e}=this.a.$state;return!t()||0===e().length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.Oa.bind(this))}getOptions(){const{autoLabel:t,hideBitrate:e}=this.$props;return[{value:"auto",label:t},...this.Dj().map((t=>{const s=t.bitrate>=0?`${(0,c.r)(t.bitrate/1e6,2)} Mbps`:null;return{quality:t,label:t.height+"p",value:this.le(t),bitrate:()=>e()?null:s}}))]}D(){this.d.value=this.na()}Oa(){const{autoLabel:t}=this.$props,{autoQuality:e,quality:s}=this.a.$state,i=s()?s().height+"p":"";this.l?.Wb.set(e()?t()+(i?` (${i})`:""):i)}ma(){this.l?.Ma(this.disabled)}o(t,e){if(this.disabled)return;if("auto"===t)return this.a.remote.changeQuality(-1,e),void this.dispatch("change",{detail:"auto",trigger:e});const{qualities:s}=this.a.$state,n=(0,i.p)(s).findIndex((e=>this.le(e)===t));if(n>=0){const t=(0,i.p)(s)[n];this.a.remote.changeQuality(n,e),this.dispatch("change",{detail:t,trigger:e})}}na(){const{quality:t,autoQuality:e}=this.a.$state;if(e())return"auto";const s=t();return s?this.le(s):"auto"}le(t){return t.height+"_"+t.bitrate}}ns([i.$],rs.prototype,"value",1),ns([i.$],rs.prototype,"disabled",1),ns([i.a0],rs.prototype,"getOptions",1);class as extends i.I{constructor(){super(...arguments),this.i=null,this.Pa=0,this.Vf=-1}static{this.props={event:void 0,action:void 0}}onSetup(){this.a=(0,n.u)();const{event:t,action:e}=this.$props;this.setAttributes({event:t,action:e})}onAttach(t){t.setAttribute("data-media-gesture",""),t.style.setProperty("pointer-events","none")}onConnect(t){this.i=this.a.player.el?.querySelector("[data-media-provider]"),(0,i.e)(this.Ej.bind(this))}Ej(){let t=this.$props.event();this.i&&t&&(/^dbl/.test(t)&&(t=t.split(/^dbl/)[1]),("pointerup"===t||"pointerdown"===t)&&"coarse"===this.a.$state.pointer()&&(t="pointerup"===t?"touchend":"touchstart"),(0,i.l)(this.i,t,this.Fj.bind(this),{passive:!1}))}Fj(t){if((0,i.F)(t)&&(0!==t.button||this.a.activeMenu)||(0,i.c)(t)&&this.a.activeMenu||(0,a.i)(t)||!this.Gj(t))return;t.MEDIA_GESTURE=!0,t.preventDefault();const e=(0,i.p)(this.$props.event),s=e?.startsWith("dbl");if(s){if(1===this.Pa)return queueMicrotask((()=>this.Wf(t))),clearTimeout(this.Vf),void(this.Pa=0)}else 0===this.Pa&&setTimeout((()=>{1===this.Pa&&this.Wf(t)}),250);0===this.Pa&&(this.Vf=window.setTimeout((()=>{this.Pa=0}),275)),this.Pa++}Wf(t){this.el.setAttribute("data-triggered",""),requestAnimationFrame((()=>{this.Hj()&&this.Ij((0,i.p)(this.$props.action),t),requestAnimationFrame((()=>{this.el.removeAttribute("data-triggered")}))}))}Gj(t){if(!this.el)return!1;if((0,i.F)(t)||(0,i.a5)(t)||(0,i.c)(t)){const e=(0,i.c)(t)?t.changedTouches[0]??t.touches[0]:void 0,s=e?.clientX??t.clientX,n=e?.clientY??t.clientY,r=this.el.getBoundingClientRect(),a=n>=r.top&&n<=r.bottom&&s>=r.left&&s<=r.right;return t.type.includes("leave")?!a:a}return!0}Hj(){const t=this.a.player.el.querySelectorAll("[data-media-gesture][data-triggered]");return Array.from(t).sort(((t,e)=>+getComputedStyle(e).zIndex-+getComputedStyle(t).zIndex))[0]===this.el}Ij(t,e){if(!t)return;const s=new i.D("will-trigger",{detail:t,cancelable:!0,trigger:e});if(this.dispatchEvent(s),s.defaultPrevented)return;const[n,r]=t.replace(/:([a-z])/,"-$1").split(":");t.includes(":fullscreen")?this.a.remote.toggleFullscreen("prefer-media",e):t.includes("seek:")?this.a.remote.seek((0,i.p)(this.a.$state.currentTime)+(+r||0),e):this.a.remote[(0,i.U)(n)](e),this.dispatch("trigger",{detail:t,trigger:e})}}class hs{constructor(t){this.S=t,this.priority=10,this.z=null,this.sa=(0,i.a6)()}attach(){}canRender(){return!0}detach(){this.sa.empty(),this.S.reset(),this.z=null}changeTrack(t){t&&this.z!==t&&(this.sa.empty(),t.readyState<2?(this.S.reset(),this.sa.add((0,i.l)(t,"load",(()=>this.Xf(t)),{once:!0}))):this.Xf(t),this.sa.add((0,i.l)(t,"add-cue",(t=>{this.S.addCue(t.detail)})),(0,i.l)(t,"remove-cue",(t=>{this.S.removeCue(t.detail)}))),this.z=t)}Xf(t){this.S.changeTrack({cues:[...t.cues],regions:[...t.regions]})}}class os extends i.I{static{this.props={textDir:"ltr"}}onSetup(){this.a=(0,n.u)(),this.setAttributes({"aria-hidden":Mt(this.lb.bind(this))})}onAttach(t){t.style.setProperty("pointer-events","none")}onConnect(t){this.S?(0,i.e)(this.Yf.bind(this)):s.e(9701).then(s.bind(s,9701)).then((e=>{this.connectScope&&(0,i.s)((()=>{this.W=e;const{CaptionsRenderer:s}=this.W;this.S=new s(t),this.Qa=new hs(this.S),(0,i.e)(this.Yf.bind(this))}),this.connectScope)}))}onDestroy(){this.Qa&&(this.Qa.detach(),this.a.textRenderers.remove(this.Qa)),this.S?.destroy()}lb(){const{textTrack:t}=this.a.$state,e=t();return this.a.$iosControls()||!e||!(0,r.i)(e)}Yf(){const{viewType:t}=this.a.$state;return"audio"===t()?this.Jj():this.Kj()}Jj(){return(0,i.e)(this._d.bind(this)),()=>{this.el.textContent=""}}_d(){if(this.lb())return;const{textTrack:t}=this.a.$state;this.Zf(),(0,i.l)(t(),"cue-change",this.Zf.bind(this)),(0,i.e)(this.Lj.bind(this))}Zf(){this.el.textContent="";const{currentTime:t,textTrack:e}=this.a.$state,s=(0,i.p)(t),n=(0,i.p)(e).activeCues,{renderVTTCueString:r}=this.W;for(const t of n){const e=document.createElement("div");e.setAttribute("data-part","cue"),e.innerHTML=r(t,s),this.el.append(e)}}Lj(){const{currentTime:t}=this.a.$state,{updateTimedVTTCueNodes:e}=this.W;e(this.el,t())}Kj(){return(0,i.e)(this.Mj.bind(this)),(0,i.e)(this.Nj.bind(this)),this.a.textRenderers.add(this.Qa),()=>{this.el.textContent="",this.Qa.detach(),this.a.textRenderers.remove(this.Qa)}}Mj(){this.S.dir=this.$props.textDir()}Nj(){if(this.lb())return;const{currentTime:t}=this.a.$state;this.S.currentTime=t()}}class cs extends i.I{static{this.props={src:void 0,alt:void 0}}static{this.state=new i.S({img:null,src:null,alt:null,loading:!0,error:null,hidden:!1})}onSetup(){this.a=(0,n.u)(),this._f(),this.$f(),this.ob()}onAttach(t){t.style.setProperty("pointer-events","none"),(0,i.e)(this.Ud.bind(this)),(0,i.e)(this._f.bind(this)),(0,i.e)(this.$f.bind(this)),(0,i.e)(this.ob.bind(this));const{started:e}=this.a.$state;this.setAttributes({"data-visible":()=>!e(),"data-loading":this.Rb.bind(this),"data-error":this.wa.bind(this),"data-hidden":this.$state.hidden})}onConnect(t){const{canLoad:e,poster:s}=this.a.$state;window.requestAnimationFrame((()=>{e()||(0,r.p)(s())})),(0,i.e)(this.Ea.bind(this))}wa(){const{error:t}=this.$state;return!(0,i.N)(t())}ob(){const{src:t}=this.$props,{$iosControls:e}=this.a,{poster:s}=this.a.$state;this.el&&(0,i.k)(this.el,"display",e()?"none":null),this.$state.hidden.set(this.wa()||!(t()||s())||e())}Rb(){const{loading:t,hidden:e}=this.$state;return!e()&&t()}Ud(){const t=this.$state.img();t&&((0,i.l)(t,"load",this.lc.bind(this)),(0,i.l)(t,"error",this.U.bind(this)))}_f(){const{canLoad:t,poster:e}=this.a.$state,s=this.$props.src(),i=s||e();s&&e()!==s&&this.a.$state.providedPoster.set(s),this.$state.src.set(t()&&i.length?i:null)}$f(){const{src:t,alt:e}=this.$state;e.set(t()?this.$props.alt():null)}Ea(){const{loading:t,error:e}=this.$state,{canLoad:s,poster:i}=this.a.$state;t.set(s()&&!!i()),e.set(null)}lc(){const{loading:t,error:e}=this.$state;t.set(!1),e.set(null)}U(t){const{loading:e,error:s}=this.$state;e.set(!1),s.set(t)}}class ls extends i.I{static{this.props={type:"current",showHours:!1,padHours:null,padMinutes:null,remainder:!1}}static{this.state=new i.S({timeText:""})}onSetup(){this.a=(0,n.u)(),this.ag();const{type:t,remainder:e}=this.$props;this.setAttributes({"data-type":t,"data-remainder":e})}onAttach(t){(0,i.e)(this.ag.bind(this))}ag(){const{type:t,remainder:e,padHours:s,padMinutes:i,showHours:n}=this.$props,r=this.Oj(t()),a=this.a.$state.duration();if(!Number.isFinite(r+a))return void this.$state.timeText.set("LIVE");const h=ne(e()?Math.max(0,a-r):r,s(),i(),n());this.$state.timeText.set(h)}Oj(t){const{bufferedEnd:e,duration:s,currentTime:i}=this.a.$state;switch(t){case"buffered":return e();case"duration":return s();default:return i()}}}var us=Object.defineProperty,ds=Object.getOwnPropertyDescriptor,ps=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?ds(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&us(e,s,r),r};class fs extends i.I{constructor(){super(...arguments),this.menuContainer=null}static{this.props={when:"",smallWhen:"",thumbnails:"",customIcons:!1,translations:null,menuGroup:"bottom",noModal:!1}}get isMatch(){return this.me.matches}get isSmallLayout(){return this.Lc.matches}onSetup(){const{when:t,smallWhen:e,thumbnails:s,translations:r,menuGroup:a,noModal:h}=this.$props;this.me=n.P.create(t),this.Lc=n.P.create(e),this.setAttributes({"data-match":this.me.$matches,"data-size":()=>this.Lc.matches?"sm":null});const o=this;(0,i.Z)(ys,{smQueryList:this.Lc,thumbnails:s,translations:r,menuGroup:a,noModal:h,get menuContainer(){return o.menuContainer}})}}ps([i.$],fs.prototype,"menuContainer",2),ps([i.$],fs.prototype,"isMatch",1),ps([i.$],fs.prototype,"isSmallLayout",1);class gs extends fs{static{this.props={...super.props,when:"(view-type: audio)",smallWhen:"(width < 576)"}}}class bs extends fs{static{this.props={...super.props,when:"(view-type: video)",smallWhen:"(width < 576) or (height < 380)"}}}function ms(t,e){return t()?.[e]??e}const ys=(0,i.Q)();function $s(){return(0,i.J)(ys)}},5145:(t,e,s)=>{s.d(e,{Q:()=>i,c:()=>n});const i={Ya:Symbol(0),Za:Symbol(0)};function n(t){return t instanceof Error?t:Error(JSON.stringify(t))}}}]); \ No newline at end of file diff --git a/assets/js/2388.29bc0632.js b/assets/js/2388.29bc0632.js deleted file mode 100644 index d41044536..000000000 --- a/assets/js/2388.29bc0632.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2388],{7224:(t,e,s)=>{s.d(e,{L:()=>a,P:()=>w,T:()=>h,a:()=>l,m:()=>p,s:()=>d,u:()=>f});var i=s(1716),n=s(348);Symbol(0);var r;class a extends n.O{constructor(){super(...arguments),this.r=[],this[r]=!1}get length(){return this.r.length}get readonly(){return this[i.L.Zb]}toArray(){return[...this.r]}[(r=i.L.Zb,Symbol.iterator)](){return this.r.values()}[i.L.oa](t,e){const s=this.r.length;""+s in this||Object.defineProperty(this,s,{get(){return this.r[s]}}),this.r.includes(t)||(this.r.push(t),this.dispatchEvent(new n.D("add",{detail:t,trigger:e})))}[i.L.Yb](t,e){const s=this.r.indexOf(t);s>=0&&(this[i.L.oe]?.(t,e),this.r.splice(s,1),this.dispatchEvent(new n.D("remove",{detail:t,trigger:e})))}[i.L.H](t){for(const e of[...this.r])this[i.L.Yb](e,t);this.r=[],this[i.L.Mc](!1,t),this[i.L.ne]?.()}[i.L.Mc](t,e){this[i.L.Zb]!==t&&(this[i.L.Zb]=t,this.dispatchEvent(new n.D("readonly-change",{detail:t,trigger:e})))}}class h{get length(){return this.$.length}constructor(t,e){(0,n.w)(t)?this.$=t:(0,n.i)(t)||(0,n.i)(e)?this.$=[]:this.$=[[t,e]]}start(t){return this.$[t][0]??1/0}end(t){return this.$[t][1]??1/0}}function o(t){if(!t.length)return null;let e=t.start(0);for(let s=1;se&&(e=i)}return e}const l=new n.S({audioTracks:[],audioTrack:null,autoplay:!1,autoplayError:null,buffered:new h,duration:0,canLoad:!1,canFullscreen:!1,canOrientScreen:(0,i.a)(),canPictureInPicture:!1,canPlay:!1,controls:!1,controlsVisible:!1,crossorigin:null,currentTime:0,ended:!1,error:null,fullscreen:!1,loop:!1,logLevel:"silent",mediaType:"unknown",muted:!1,paused:!0,played:new h,playing:!1,playsinline:!1,pictureInPicture:!1,preload:"metadata",playbackRate:1,qualities:[],quality:null,autoQuality:!1,canSetQuality:!0,canSetPlaybackRate:!0,canSetVolume:!1,seekable:new h,seeking:!1,source:{src:"",type:""},sources:[],started:!1,textTracks:[],textTrack:null,volume:1,waiting:!1,get title(){return this.providedTitle||this.inferredTitle},get poster(){return this.providedPoster||this.inferredPoster},get viewType(){return"unknown"!==this.providedViewType?this.providedViewType:this.inferredViewType},get streamType(){return"unknown"!==this.providedStreamType?this.providedStreamType:this.inferredStreamType},get currentSrc(){return this.source},get bufferedStart(){return o(this.buffered)??0},get bufferedEnd(){return c(this.buffered)??0},get seekableStart(){return o(this.seekable)??0},get seekableEnd(){return this.canPlay?c(this.seekable)??1/0:0},get seekableWindow(){return Math.max(0,this.seekableEnd-this.seekableStart)},pointer:"fine",orientation:"landscape",width:0,height:0,mediaWidth:0,mediaHeight:0,userBehindLiveEdge:!1,liveEdgeTolerance:10,minLiveDVRWindow:60,get canSeek(){return/unknown|on-demand|:dvr/.test(this.streamType)&&Number.isFinite(this.seekableWindow)&&(!this.live||/:dvr/.test(this.streamType)&&this.seekableWindow>=this.minLiveDVRWindow)},get live(){return this.streamType.includes("live")||!Number.isFinite(this.duration)},get liveEdgeStart(){return this.live&&Number.isFinite(this.seekableEnd)?Math.max(0,(this.liveSyncPosition??this.seekableEnd)-this.liveEdgeTolerance):0},get liveEdge(){return this.live&&(!this.canSeek||!this.userBehindLiveEdge&&this.currentTime>=this.liveEdgeStart)},get liveEdgeWindow(){return this.live&&Number.isFinite(this.seekableEnd)?this.seekableEnd-this.liveEdgeStart:0},autoplaying:!1,providedTitle:"",inferredTitle:"",providedPoster:"",inferredPoster:"",inferredViewType:"unknown",providedViewType:"unknown",providedStreamType:"unknown",inferredStreamType:"unknown",liveSyncPosition:null}),u=new Set(["autoplay","canFullscreen","canLoad","canPictureInPicture","canSetVolume","controls","crossorigin","fullscreen","height","inferredViewType","logLevel","loop","mediaHeight","mediaType","mediaWidth","muted","orientation","pictureInPicture","playsinline","pointer","preload","providedPoster","providedStreamType","providedTitle","providedViewType","source","sources","textTrack","textTracks","volume","width"]);function d(t){l.reset(t,(t=>!u.has(t))),(0,n.P)()}const p=(0,n.Q)();function f(){return(0,n.J)(p)}const g=eval,b=/:\s+'?"?(.*?)'?"?\)/g,m=/\s+not\s+/g,y=/\s+and\s+/g,$=/\s+or\s+/g,v=/(\d)px/g;class w extends n.O{constructor(t,e){super(),this.ec=(0,n.m)("true"),this.Xc=new Set,this.Yc=(0,n.m)(!0),this.$matches=(0,n.n)((()=>{let t=this.ec();if("never"===t)return!1;for(const e of this.Xc){const s=this.Le[e](),i=(0,n.r)(s)?`'${s}'`:s+"";t=t.replace((0,n.K)(e),i)}return g(`!!(${t})`)&&this.Yc()})),this.Ke=e,this.Le=t,(0,n.R)((t=>{(0,n.e)(this.jg.bind(this)),(0,n.e)(this.kg.bind(this)),this.Me=t}))}static{this.create=t=>{const e=f();return new w(e.$state,t)}}get query(){return(0,n.T)(this.Ke)}get matches(){return this.$matches()}jg(){const t=this.query;if(""===t)return;if("never"===t)return void this.ec.set(t);const e=t.trim().split(/\s*,\s*/g),s=e.filter((t=>t.startsWith("@media"))).join(","),i=e.filter((t=>!t.startsWith("@media")));if(s.length){const t=window.matchMedia(s.replace(/@media\s/g,"")),e=()=>{this.Yc.set(t.matches)};e(),(0,n.l)(t,"change",e)}if(i.length){const t=this.lg(i),e=Object.keys(l.record);for(const s of t.matchAll(/\(([-a-zA-Z]+)\s/g)){const t=(0,n.U)(s[1]);e.includes(t)&&this.Xc.add(t)}this.ec.set(t)}return()=>{this.Xc.clear(),this.ec.set("true"),this.Yc.set(!0)}}kg(){this.$matches(),this.dispatchEvent(new Event("change"))}lg(t){return t.map((t=>"("+t.replace(b,' == "$1")').replace(m,"!").replace(y," && ").replace($," || ").replace(v,"$1").trim()+")")).join(" || ")}destroy(){this.Me()}}},3659:(t,e,s)=>{s.d(e,{a:()=>u,b:()=>l,c:()=>d,d:()=>p,e:()=>r,f:()=>a,h:()=>f,i:()=>o,o:()=>h,r:()=>c,s:()=>n});var i=s(348);function n(t,e,s){t.hasAttribute(e)||t.setAttribute(e,s)}function r(t,e){t.hasAttribute("aria-label")||(0,i.e)((function(){(0,i.k)(t,"aria-label",e())}))}function a(t,e,s){for(;e;){if(e===t)return!0;if(s?.(e))break;e=e.parentElement}return!1}function h(t,e){(0,i.l)(t,"pointerup",(t=>{0===t.button&&e(t)})),(0,i.l)(t,"keydown",(t=>{(0,i.b)(t)&&e(t)}))}function o(t){return(0,i.c)(t)&&(t.touches.length>1||t.changedTouches.length>1)}function c(t){let e=(0,i.g)(),s=window.requestAnimationFrame((()=>{(0,i.s)(t,e),s=-1}));return()=>{window.cancelAnimationFrame(s)}}function l(t,e,s){let n,r=t,a=t.parentElement,h=t.content.firstElementChild,o=[];!h&&t.firstElementChild&&(t.innerHTML=t.firstElementChild.outerHTML,t.firstElementChild.remove(),h=t.content.firstElementChild);for(let t=0;t{for(let t=0;ts.includes("top")?`calc(-1 * ${t})`:t;return(0,i.h)(e,t,(()=>{(0,i.j)(e,t,{placement:o,...h}).then((({x:e,y:s})=>{Object.assign(t.style,{top:`calc(${s+"px"} + ${c(a?a+"px":`var(--${n}-y-offset, 0px)`)})`,left:`calc(${e+"px"} + ${r?r+"px":`var(--${n}-x-offset, 0px)`})`})}))}))}function f(t){return"none"!==getComputedStyle(t).animationName}},352:(t,e,s)=>{s.d(e,{T:()=>c,a:()=>n,b:()=>b,c:()=>$,d:()=>u,f:()=>l,g:()=>o,i:()=>y,l:()=>h,o:()=>d,p:()=>r});var i=s(348);function n(t,e){const s=new URLSearchParams;for(const t of Object.keys(e))s.set(t,e[t]+"");return t+"?"+s.toString()}function r(t,e="preconnect"){const s=document.querySelector(`link[href="${t}"]`);if(!(0,i.N)(s))return!0;const n=document.createElement("link");return n.rel=e,n.href=t,n.crossOrigin="true",document.head.append(n),!0}const a={};function h(t){if(a[t])return a[t].promise;const e=(0,i.v)(),s=document.querySelector(`script[src="${t}"]`);if(!(0,i.N)(s))return e.resolve(),e.promise;const n=document.createElement("script");return n.src=t,n.onload=()=>{e.resolve(),delete a[t]},n.onerror=()=>{e.reject(),delete a[t]},setTimeout((()=>document.head.append(n)),0),e.promise}function o(t){return"use-credentials"===t?"include":(0,i.r)(t)?"same-origin":void 0}const c={Sa:Symbol(0),M:Symbol(0),Ta:Symbol(0),P:Symbol(0),Ua:Symbol(0),T:Symbol(0),te:Symbol(0)};function l(t,e){for(let s=0,i=t.length;s=t.startTime&&er.includes(t.kind)&&"showing"===t.mode));if(a!==n){if(!a)return s(null),void(n=null);2==a.readyState?s(a):(s(null),a.addEventListener("load",(()=>s(a)),{once:!0})),n=a}}return r(),(0,i.l)(t,"mode-change",r)}var p,f,g;class b extends i.O{constructor(t){super(),this.id="",this.label="",this.language="",this.default=!1,this.P=!1,this.Va=0,this.I="disabled",this.ue={},this.ac=[],this.J=[],this.Wa=[],this[p]=0,this[f]=null,this[g]=null;for(const e of Object.keys(t))this[e]=t[e];this.type||(this.type="vtt"),t.content?s.e(1264).then(s.bind(s,1264)).then((({parseText:e,VTTCue:s,VTTRegion:i})=>{"json"===t.type?this.ve(t.content,s,i):e(t.content,{type:t.type}).then((({cues:t,regions:e})=>{this.J=t,this.ac=e,this.M()}))})):t.src||(this[c.M]=2)}static createId(t){return`id::${t.type}-${t.kind}-${t.src??t.label}`}get metadata(){return this.ue}get regions(){return this.ac}get cues(){return this.J}get activeCues(){return this.Wa}get readyState(){return this[c.M]}get mode(){return this.I}set mode(t){this.setMode(t)}addCue(t,e){let s=0,n=this.J.length;for(s=0;s=0){const n=this.Wa.includes(t);this.J.splice(s,1),this[c.T]?.track.removeCue(t),this.dispatchEvent(new i.D("remove-cue",{detail:t,trigger:e})),n&&this[c.Ta](this.Va,e)}}setMode(t,e){this.I!==t&&(this.I=t,"disabled"===t?(this.Wa=[],this.we()):2===this.readyState?this[c.Ta](this.Va,e):this.xe(),this.dispatchEvent(new i.D("mode-change",{detail:this,trigger:e})),this[c.Ua]?.())}[(p=c.M,f=c.Ua,g=c.T,c.Ta)](t,e){if(this.Va=t,"disabled"===this.mode||!this.J.length)return;const s=[];for(let e=0,i=this.J.length;e0)){this[c.M]=1,this.dispatchEvent(new i.D("load-start"));try{const{parseResponse:t,VTTCue:e,VTTRegion:i}=await s.e(1264).then(s.bind(s,1264)),n=this[c.Sa]?.(),r=fetch(this.src,{headers:"json"===this.type?{"Content-Type":"application/json"}:void 0,credentials:o(n)});if("json"===this.type)this.ve(await(await r).text(),e,i);else{const{errors:e,metadata:s,regions:i,cues:n}=await t(r,{type:this.type,encoding:this.encoding});if(0===e[0]?.code)throw e[0];this.ue=s,this.ac=i,this.J=n}this.M()}catch(t){this.ye(t)}}}M(){if(this[c.M]=2,!this.src||"vtt"!==this.type){const t=this[c.T]?.track;if(t)for(const e of this.J)t.addCue(e)}const t=new i.D("load");this[c.Ta](this.Va,t),this.dispatchEvent(t)}ye(t){this[c.M]=3,this.dispatchEvent(new i.D("error",{detail:t}))}ve(t,e,s){try{const{regions:i,cues:n}=$(t,e,s);this.ac=i,this.J=n}catch(t){this.ye(t)}}we(t){this.dispatchEvent(new i.D("cue-change",{trigger:t}))}}const m=/captions|subtitles/;function y(t){return m.test(t.kind)}function $(t,e,s){const n=JSON.parse(t);let r=[],a=[];return n.regions&&s&&(r=n.regions.map((t=>Object.assign(new s,t)))),(n.cues||(0,i.w)(n))&&(a=((0,i.w)(n)?n:n.cues).filter((t=>(0,i.a)(t.startTime)&&(0,i.a)(t.endTime))).map((t=>Object.assign(new e(0,0,""),t)))),{regions:r,cues:a}}},8648:(t,e,s)=>{s.d(e,{A:()=>n,V:()=>a,a:()=>u,b:()=>r,c:()=>h,d:()=>f,g:()=>p,i:()=>l,r:()=>d});var i=s(348);const n=/\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i,r=new Set(["audio/mpeg","audio/ogg","audio/3gp","audio/mp4","audio/webm","audio/flac"]),a=/\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i,h=new Set(["video/mp4","video/webm","video/3gp","video/ogg","video/avi","video/mpeg"]),o=/\.(m3u8)($|\?)/i,c=new Set(["application/vnd.apple.mpegurl","audio/mpegurl","audio/x-mpegurl","application/x-mpegurl","video/x-mpegurl","video/mpegurl","application/mpegurl"]);function l({src:t,type:e}){return(0,i.r)(t)&&o.test(t)||c.has(e)}function u(t){return void 0!==window.MediaStream&&t instanceof window.MediaStream}function d(t,e=2){return Number(t.toFixed(e))}function p(t){return String(t).split(".")[1]?.length??0}function f(t,e,s){return Math.max(t,Math.min(s,e))}},1716:(t,e,s)=>{s.d(e,{I:()=>o,L:()=>n,a:()=>l,b:()=>u,c:()=>f,d:()=>d,e:()=>p,g:()=>c,h:()=>h,i:()=>g});var i=s(348);const n={oa:Symbol(0),Yb:Symbol(0),H:Symbol(0),pa:Symbol(0),Zb:Symbol(0),Mc:Symbol(0),ne:Symbol(0),oe:Symbol(0),pe:Symbol(0)},r=navigator?.userAgent.toLowerCase()||"",a=/iphone|ipad|ipod|ios|crios|fxios/i.test(r),h=/(iphone|ipod)/gi.test(navigator?.platform||""),o=!!window.chrome,c=!!window.safari||a;function l(){return!(0,i.i)(window.screen.orientation)&&!(0,i.i)(window.screen.orientation.lock)&&(0,i.x)(screen.orientation.unlock)}function u(t){return t||(t=document.createElement("video")),t.canPlayType("application/vnd.apple.mpegurl").length>0}function d(t){return!!document.pictureInPictureEnabled&&!t.disablePictureInPicture}function p(t){return(0,i.x)(t?.webkitSupportsPresentationMode)&&(0,i.x)(t?.webkitSetPresentationMode)}async function f(){const t=document.createElement("video");return t.volume=.5,await(0,i.y)(0),.5===t.volume}function g(){const t=window?.MediaSource??window?.WebKitMediaSource;if((0,i.i)(t))return!1;const e=t&&(0,i.x)(t.isTypeSupported)&&t.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),s=window?.SourceBuffer??window?.WebKitSourceBuffer,n=(0,i.i)(s)||!(0,i.i)(s.prototype)&&(0,i.x)(s.prototype.appendBuffer)&&(0,i.x)(s.prototype.remove);return!!e&&!!n}},348:(t,e,s)=>{s.d(e,{$:()=>Mt,D:()=>rt,F:()=>ct,G:()=>dt,H:()=>Xe,I:()=>Ot,J:()=>kt,K:()=>Ft,L:()=>Kt,M:()=>U,N:()=>J,O:()=>ht,P:()=>w,Q:()=>vt,R:()=>$,S:()=>Dt,T:()=>Vt,U:()=>Rt,V:()=>Bt,W:()=>Ne,X:()=>Ct,Y:()=>Xt,Z:()=>wt,_:()=>Nt,a:()=>_,a0:()=>qt,a1:()=>B,a2:()=>Ht,a3:()=>yt,a4:()=>xt,a5:()=>ut,a6:()=>Wt,b:()=>pt,c:()=>lt,d:()=>Ye,e:()=>$t,f:()=>gt,g:()=>k,h:()=>qe,i:()=>X,j:()=>De,k:()=>ft,l:()=>ot,m:()=>bt,n:()=>mt,o:()=>P,p:()=>v,q:()=>I,r:()=>Y,s:()=>x,t:()=>Z,u:()=>G,v:()=>Qt,w:()=>et,x:()=>tt,y:()=>zt,z:()=>It});const i=Symbol(0);let n=!1,r=!1,a=null,h=null,o=null,c=0,l=[],u={};const d=()=>{},p=0,f=1,g=2,b=3;function m(){if(l.length){r=!0;for(let t=0;t=0;t--)H(e[t])}function $(t){const e=I();return j(e,t.length?t.bind(null,S.bind(e)):t,null)}function v(t){return j(a,t,null)}function w(){r||m()}function k(){return a}function x(t,e){try{return j(e,t,null)}catch(t){return void L(e,t)}}function T(t,e=a){return e?.$cx[t]}function P(t){if(!t||!a)return t||d;const e=a;return e.$d?Array.isArray(e.$d)?e.$d.push(t):e.$d=[e.$d,t]:e.$d=t,function(){e.$st!==b&&(t.call(null),V(e.$d)?e.$d=null:Array.isArray(e.$d)&&e.$d.splice(e.$d.indexOf(t),1))}}function S(t=!0){if(this.$st===b)return;let e=t?this.$ps||this[i]:this,s=this.$ns,n=null;for(;s&&s[i]===this;)S.call(s,!0),E(s),n=s.$ns,s.$ns=null,s=n;t&&E(this),s&&(s.$ps=t?this.$ps:this),e&&(e.$ns=s)}function E(t){t.$st=b,t.$d&&A(t),t.$s&&z(t,0),t.$ps&&(t.$ps.$ns=null),t[i]=null,t.$s=null,t.$o=null,t.$ps=null,t.$cx=u,t.$eh=null}function A(t){try{if(Array.isArray(t.$d))for(let e=t.$d.length-1;e>=0;e--){const s=t.$d[e];s.call(s)}else t.$d.call(t.$d);t.$d=null}catch(e){L(t,e)}}function j(t,e,s){const i=a,n=h;a=t,h=s;try{return e.call(t)}finally{a=i,h=n}}function L(t,e){if(!t||!t.$eh)throw e;let s=0,i=t.$eh.length,n=C(e);for(s=0;s0){t.$s.length=c+o.length;for(let e=0;e=e)&&(t.$e&&t.$st===p&&(l.push(t),n||(n=!0,queueMicrotask(m))),t.$st=e,t.$o))for(let e=0;ee===t))}hasType(t){return!!this.findType(t)}findType(t){return this.chain.find((e=>e.type===t))}walk(t){for(const e of this.chain){const s=t(e);if(s)return[e,s]}}[Symbol.iterator](){return this.chain.values()}}class ht extends EventTarget{addEventListener(t,e,s){return super.addEventListener(t,e,s)}removeEventListener(t,e,s){return super.removeEventListener(t,e,s)}}function ot(t,e,s,i){return t.addEventListener(e,s,i),P((()=>t.removeEventListener(e,s,i)))}function ct(t){return!!t?.type.startsWith("pointer")}function lt(t){return!!t?.type.startsWith("touch")}function ut(t){return/^(click|mouse)/.test(t?.type??"")}function dt(t){return!!t?.type.startsWith("key")}function pt(t){return dt(t)&&("Enter"===t.key||" "===t.key)}function ft(t,e,s){if(t)if(s||""===s||0===s){const i=!0===s?"":s+"";t.getAttribute(e)!==i&&t.setAttribute(e,i)}else t.removeAttribute(e)}function gt(t,e,s){t&&(s||0===s?t.style.setProperty(e,s+""):t.style.removeProperty(e))}function bt(t,e){const s=N(t,null,e),n=O.bind(s);return n[i]=!0,n.set=M.bind(s),n}function mt(t,e){const s=N(e?.initial,t,e),n=O.bind(s);return n[i]=!0,n}function yt(t){return function(t){return V(t)&&i in t}(t)&&"set"in t}const $t=function(t,e){const s=N(null,(function(){let e=t();return V(e)&&P(e),null}),void 0);return s.$e=!0,K(s),S.bind(s,!0)};function vt(t){return{id:Symbol(),provide:t}}function wt(t,e,s=k()){const i=!X(e);!function(t,e,s=a){s&&(s.$cx={...s.$cx,[t]:e})}(t.id,i?e:t.provide?.(),s)}function kt(t){return T(t.id)}function xt(t){return!X(T(t.id))}const Tt=Symbol(0),Pt=Symbol(0),St=Symbol(0);var Et;const At={};class jt{constructor(t,e,s){this[Et]=null,this.$el=bt(null),this.a=null,this.d=null,this.f=null,this.g=null,this.e=null,this.o=!1,this.i=At,this.b=null,this.c=null,this.l=[],this.m=[],this.j=[],this.n=[],this.d=e,s?.scope&&s.scope.append(e);let i=t.state,n=t.props;if(i&&(this.h=i.create(),this.k=new Proxy(this.h,{get:(t,e)=>this.h[e]()}),wt(i,this.h)),n&&(this.i=function(t){const e={};for(const s of Object.keys(t)){const i=t[s];e[s]=bt(i,i)}return e}(n),s?.props))for(const t of Object.keys(s.props))this.i[t]?.set(s.props[t]);P(this.p.bind(this))}static{Et=St}w(){x((()=>{for(const t of this.l)t()}),this.d)}x(t){this.a||(this.a=t,this.$el.set(t),x((()=>{this.f=I(),x((()=>{for(const t of this.m)t(this.a);this.q(),this.r()}),this.f)}),this.d),t.dispatchEvent(new Event("attached")))}s(){this.f?.dispose(),this.f=null,this.g=null,this.a=null,this.$el.set(null)}y(){this.a&&this.f&&this.j.length&&x((()=>{this.g=I(),x((()=>{for(const t of this.j)t(this.a)}),this.g)}),this.f)}z(){this.g?.dispose(),this.g=null}p(){if(this.o)return;this.o=!0,x((()=>{for(const t of this.n)t(this.a)}),this.d);const t=this.a;this.s(),this.d.dispose(),this.l.length=0,this.m.length=0,this.j.length=0,this.n.length=0,this.e=null,this.b=null,this.c=null,this.i=At,this.d=null,this.k=At,this.h=null,t&&delete t.$}t(t){t.onSetup&&this.l.push(t.onSetup.bind(t)),t.onAttach&&this.m.push(t.onAttach.bind(t)),t.onConnect&&this.j.push(t.onConnect.bind(t)),t.onDestroy&&this.n.push(t.onDestroy.bind(t))}q(){if(this.b)for(const t of Object.keys(this.b))tt(this.b[t])?$t(this.u.bind(this,t)):ft(this.a,t,this.b[t])}r(){if(this.c)for(const t of Object.keys(this.c))tt(this.c[t])?$t(this.v.bind(this,t)):gt(this.a,t,this.c[t])}u(t){ft(this.a,t,this.b[t].call(this.e))}v(t){gt(this.a,t,this.c[t].call(this.e))}}let Lt={$$:null};class Ct extends EventTarget{constructor(){super(),Lt.$$&&this.attach(Lt)}get el(){return this.$$.a}get $el(){return this.$$.$el()}get scope(){return this.$$.d}get attachScope(){return this.$$.f}get connectScope(){return this.$$.g}get $props(){return this.$$.i}get $state(){return this.$$.h}get state(){return this.$$.k}attach({$$:t}){return this.$$=t,t.t(this),this}addEventListener(t,e,s){this.listen(t,e,s)}removeEventListener(t,e,s){this.el?.removeEventListener(t,e,s)}setAttributes(t){this.$$.b||(this.$$.b={}),Object.assign(this.$$.b,t)}setStyles(t){this.$$.c||(this.$$.c={}),Object.assign(this.$$.c,t)}setCSSVars(t){this.setStyles(t)}createEvent(t,...e){return new rt(t,e[0])}dispatch(t,...e){if(!this.el)return!1;const s=t instanceof Event?t:new rt(t,e[0]);return Object.defineProperty(s,"target",{get:()=>this.$$.e}),j(null,(()=>(this.$$[St]?.(s),this.el.dispatchEvent(s))),null)}dispatchEvent(t){return this.dispatch(t)}listen(t,e,s){return this.el?ot(this.el,t,e,s):B}}class Ot extends Ct{subscribe(t){return x((()=>$t((()=>t(this.state)))),this.$$.d)}destroy(){this.$$.p()}}function Mt(t,e,s){t[Tt]||(t[Tt]=new Set),t[Tt].add(e)}function qt(t,e,s){t[Pt]||(t[Pt]=new Set),t[Pt].add(e)}class Dt{constructor(t){this.id=Symbol(0),this.record=t,this.A=Object.getOwnPropertyDescriptors(t)}create(){const t={},e=new Proxy(t,{get:(e,s)=>t[s]()});for(const s of Object.keys(this.record)){const i=this.A[s].get;t[s]=i?mt(i.bind(e)):bt(this.record[s])}return t}reset(t,e){for(const s of Object.keys(t))this.A[s].get||e&&!e(s)||t[s].set(this.record[s])}}function It(t){return kt(t)}function Ft(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Rt(t){return t.replace(/-./g,(t=>t[1].toUpperCase()))}function Nt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function Vt(t){return tt(t)?t():t}function Ht(t){return t?"true":"false"}function Wt(){const t=new Set;return{add(...e){for(const s of e)t.add(s)},empty(){for(const e of t)e();t.clear()}}}function Kt(){const t=Wt();return P(t.empty),t}function Qt(){let t,e;return{promise:new Promise(((s,i)=>{t=s,e=i})),resolve:t,reject:e}}function zt(t){return new Promise((e=>setTimeout(e,t)))}function Bt(t){let e,s=-1;return function(...i){e=i,s>=0||(s=window.requestAnimationFrame((()=>{t.apply(this,e),s=-1,e=void 0})))}}const Jt="undefined"!=typeof window?"requestIdleCallback"in window?window.requestIdleCallback:t=>window.setTimeout(t,1):B;function Xt(t,e){return new Promise((s=>{Jt((e=>{t?.(e),s()}),e)}))}const Ut=Math.min,Zt=Math.max,_t=Math.round,Yt=Math.floor,Gt=t=>({x:t,y:t});function te(t){return t.split("-")[0]}function ee(t){return["top","bottom"].includes(te(t))?"y":"x"}function se(t){return{...t,top:t.y,left:t.x,right:t.x+t.width,bottom:t.y+t.height}}function ie(t,e,s){let{reference:i,floating:n}=t;const r=ee(e),a=function(t){return"x"===ee(t)?"y":"x"}(e),h="y"===a?"height":"width",o=te(e),c="y"===r,l=i.x+i.width/2-n.width/2,u=i.y+i.height/2-n.height/2,d=i[h]/2-n[h]/2;let p;switch(o){case"top":p={x:l,y:i.y-n.height};break;case"bottom":p={x:l,y:i.y+i.height};break;case"right":p={x:i.x+i.width,y:u};break;case"left":p={x:i.x-n.width,y:u};break;default:p={x:i.x,y:i.y}}switch(function(t){return t.split("-")[1]}(e)){case"start":p[a]-=d*(s&&c?-1:1);break;case"end":p[a]+=d*(s&&c?-1:1)}return p}function ne(t){return he(t)?(t.nodeName||"").toLowerCase():"#document"}function re(t){var e;return(null==t||null==(e=t.ownerDocument)?void 0:e.defaultView)||window}function ae(t){var e;return null==(e=(he(t)?t.ownerDocument:t.document)||window.document)?void 0:e.documentElement}function he(t){return t instanceof Node||t instanceof re(t).Node}function oe(t){return t instanceof Element||t instanceof re(t).Element}function ce(t){return t instanceof HTMLElement||t instanceof re(t).HTMLElement}function le(t){return"undefined"!=typeof ShadowRoot&&(t instanceof ShadowRoot||t instanceof re(t).ShadowRoot)}function ue(t){const{overflow:e,overflowX:s,overflowY:i,display:n}=be(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+s)&&!["inline","contents"].includes(n)}function de(t){return["table","td","th"].includes(ne(t))}function pe(t){const e=fe(),s=be(t);return"none"!==s.transform||"none"!==s.perspective||!!s.containerType&&"normal"!==s.containerType||!e&&!!s.backdropFilter&&"none"!==s.backdropFilter||!e&&!!s.filter&&"none"!==s.filter||["transform","perspective","filter"].some((t=>(s.willChange||"").includes(t)))||["paint","layout","strict","content"].some((t=>(s.contain||"").includes(t)))}function fe(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function ge(t){return["html","body","#document"].includes(ne(t))}function be(t){return re(t).getComputedStyle(t)}function me(t){return oe(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function ye(t){if("html"===ne(t))return t;const e=t.assignedSlot||t.parentNode||le(t)&&t.host||ae(t);return le(e)?e.host:e}function $e(t){const e=ye(t);return ge(e)?t.ownerDocument?t.ownerDocument.body:t.body:ce(e)&&ue(e)?e:$e(e)}function ve(t,e,s){var i;void 0===e&&(e=[]),void 0===s&&(s=!0);const n=$e(t),r=n===(null==(i=t.ownerDocument)?void 0:i.body),a=re(n);return r?e.concat(a,a.visualViewport||[],ue(n)?n:[],a.frameElement&&s?ve(a.frameElement):[]):e.concat(n,ve(n,[],s))}function we(t){const e=be(t);let s=parseFloat(e.width)||0,i=parseFloat(e.height)||0;const n=ce(t),r=n?t.offsetWidth:s,a=n?t.offsetHeight:i,h=_t(s)!==r||_t(i)!==a;return h&&(s=r,i=a),{width:s,height:i,$:h}}function ke(t){return oe(t)?t:t.contextElement}function xe(t){const e=ke(t);if(!ce(e))return Gt(1);const s=e.getBoundingClientRect(),{width:i,height:n,$:r}=we(e);let a=(r?_t(s.width):s.width)/i,h=(r?_t(s.height):s.height)/n;return a&&Number.isFinite(a)||(a=1),h&&Number.isFinite(h)||(h=1),{x:a,y:h}}const Te=Gt(0);function Pe(t){const e=re(t);return fe()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:Te}function Se(t,e,s,i){void 0===e&&(e=!1),void 0===s&&(s=!1);const n=t.getBoundingClientRect(),r=ke(t);let a=Gt(1);e&&(i?oe(i)&&(a=xe(i)):a=xe(t));const h=function(t,e,s){return void 0===e&&(e=!1),!(!s||e&&s!==re(t))&&e}(r,s,i)?Pe(r):Gt(0);let o=(n.left+h.x)/a.x,c=(n.top+h.y)/a.y,l=n.width/a.x,u=n.height/a.y;if(r){const t=re(r),e=i&&oe(i)?re(i):i;let s=t.frameElement;for(;s&&i&&e!==t;){const t=xe(s),e=s.getBoundingClientRect(),i=be(s),n=e.left+(s.clientLeft+parseFloat(i.paddingLeft))*t.x,r=e.top+(s.clientTop+parseFloat(i.paddingTop))*t.y;o*=t.x,c*=t.y,l*=t.x,u*=t.y,o+=n,c+=r,s=re(s).frameElement}}return se({width:l,height:u,x:o,y:c})}function Ee(t){return Se(ae(t)).left+me(t).scrollLeft}function Ae(t,e,s){let i;if("viewport"===e)i=function(t,e){const s=re(t),i=ae(t),n=s.visualViewport;let r=i.clientWidth,a=i.clientHeight,h=0,o=0;if(n){r=n.width,a=n.height;const t=fe();(!t||t&&"fixed"===e)&&(h=n.offsetLeft,o=n.offsetTop)}return{width:r,height:a,x:h,y:o}}(t,s);else if("document"===e)i=function(t){const e=ae(t),s=me(t),i=t.ownerDocument.body,n=Zt(e.scrollWidth,e.clientWidth,i.scrollWidth,i.clientWidth),r=Zt(e.scrollHeight,e.clientHeight,i.scrollHeight,i.clientHeight);let a=-s.scrollLeft+Ee(t);const h=-s.scrollTop;return"rtl"===be(i).direction&&(a+=Zt(e.clientWidth,i.clientWidth)-n),{width:n,height:r,x:a,y:h}}(ae(t));else if(oe(e))i=function(t,e){const s=Se(t,!0,"fixed"===e),i=s.top+t.clientTop,n=s.left+t.clientLeft,r=ce(t)?xe(t):Gt(1);return{width:t.clientWidth*r.x,height:t.clientHeight*r.y,x:n*r.x,y:i*r.y}}(e,s);else{const s=Pe(t);i={...e,x:e.x-s.x,y:e.y-s.y}}return se(i)}function je(t,e){const s=ye(t);return!(s===e||!oe(s)||ge(s))&&("fixed"===be(s).position||je(s,e))}function Le(t,e,s){const i=ce(e),n=ae(e),r="fixed"===s,a=Se(t,!0,r,e);let h={scrollLeft:0,scrollTop:0};const o=Gt(0);if(i||!i&&!r)if(("body"!==ne(e)||ue(n))&&(h=me(e)),i){const t=Se(e,!0,r,e);o.x=t.x+e.clientLeft,o.y=t.y+e.clientTop}else n&&(o.x=Ee(n));return{x:a.left+h.scrollLeft-o.x,y:a.top+h.scrollTop-o.y,width:a.width,height:a.height}}function Ce(t,e){return ce(t)&&"fixed"!==be(t).position?e?e(t):t.offsetParent:null}function Oe(t,e){const s=re(t);if(!ce(t))return s;let i=Ce(t,e);for(;i&&de(i)&&"static"===be(i).position;)i=Ce(i,e);return i&&("html"===ne(i)||"body"===ne(i)&&"static"===be(i).position&&!pe(i))?s:i||function(t){let e=ye(t);for(;ce(e)&&!ge(e);){if(pe(e))return e;e=ye(e)}return null}(t)||s}const Me={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){let{rect:e,offsetParent:s,strategy:i}=t;const n=ce(s),r=ae(s);if(s===r)return e;let a={scrollLeft:0,scrollTop:0},h=Gt(1);const o=Gt(0);if((n||!n&&"fixed"!==i)&&(("body"!==ne(s)||ue(r))&&(a=me(s)),ce(s))){const t=Se(s);h=xe(s),o.x=t.x+s.clientLeft,o.y=t.y+s.clientTop}return{width:e.width*h.x,height:e.height*h.y,x:e.x*h.x-a.scrollLeft*h.x+o.x,y:e.y*h.y-a.scrollTop*h.y+o.y}},getDocumentElement:ae,getClippingRect:function(t){let{element:e,boundary:s,rootBoundary:i,strategy:n}=t;const r=[..."clippingAncestors"===s?function(t,e){const s=e.get(t);if(s)return s;let i=ve(t,[],!1).filter((t=>oe(t)&&"body"!==ne(t))),n=null;const r="fixed"===be(t).position;let a=r?ye(t):t;for(;oe(a)&&!ge(a);){const e=be(a),s=pe(a);s||"fixed"!==e.position||(n=null),(r?!s&&!n:!s&&"static"===e.position&&n&&["absolute","fixed"].includes(n.position)||ue(a)&&!s&&je(t,a))?i=i.filter((t=>t!==a)):n=e,a=ye(a)}return e.set(t,i),i}(e,this._c):[].concat(s),i],a=r[0],h=r.reduce(((t,s)=>{const i=Ae(e,s,n);return t.top=Zt(i.top,t.top),t.right=Ut(i.right,t.right),t.bottom=Ut(i.bottom,t.bottom),t.left=Zt(i.left,t.left),t}),Ae(e,a,n));return{width:h.right-h.left,height:h.bottom-h.top,x:h.left,y:h.top}},getOffsetParent:Oe,getElementRects:async function(t){let{reference:e,floating:s,strategy:i}=t;const n=this.getOffsetParent||Oe,r=this.getDimensions;return{reference:Le(e,await n(s),i),floating:{x:0,y:0,...await r(s)}}},getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){return we(t)},getScale:xe,isElement:oe,isRTL:function(t){return"rtl"===be(t).direction}};function qe(t,e,s,i){void 0===i&&(i={});const{ancestorScroll:n=!0,ancestorResize:r=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:h="function"==typeof IntersectionObserver,animationFrame:o=!1}=i,c=ke(t),l=n||r?[...c?ve(c):[],...ve(e)]:[];l.forEach((t=>{n&&t.addEventListener("scroll",s,{passive:!0}),r&&t.addEventListener("resize",s)}));const u=c&&h?function(t,e){let s,i=null;const n=ae(t);function r(){clearTimeout(s),i&&i.disconnect(),i=null}return function a(h,o){void 0===h&&(h=!1),void 0===o&&(o=1),r();const{left:c,top:l,width:u,height:d}=t.getBoundingClientRect();if(h||e(),!u||!d)return;const p={rootMargin:-Yt(l)+"px "+-Yt(n.clientWidth-(c+u))+"px "+-Yt(n.clientHeight-(l+d))+"px "+-Yt(c)+"px",threshold:Zt(0,Ut(1,o))||1};let f=!0;function g(t){const e=t[0].intersectionRatio;if(e!==o){if(!f)return a();e?a(!1,e):s=setTimeout((()=>{a(!1,1e-7)}),100)}f=!1}try{i=new IntersectionObserver(g,{...p,root:n.ownerDocument})}catch(t){i=new IntersectionObserver(g,p)}i.observe(t)}(!0),r}(c,s):null;let d,p=-1,f=null;a&&(f=new ResizeObserver((t=>{let[i]=t;i&&i.target===c&&f&&(f.unobserve(e),cancelAnimationFrame(p),p=requestAnimationFrame((()=>{f&&f.observe(e)}))),s()})),c&&!o&&f.observe(c),f.observe(e));let g=o?Se(t):null;return o&&function e(){const i=Se(t);!g||i.x===g.x&&i.y===g.y&&i.width===g.width&&i.height===g.height||s(),g=i,d=requestAnimationFrame(e)}(),s(),()=>{l.forEach((t=>{n&&t.removeEventListener("scroll",s),r&&t.removeEventListener("resize",s)})),u&&u(),f&&f.disconnect(),f=null,o&&cancelAnimationFrame(d)}}const De=(t,e,s)=>{const i=new Map,n={platform:Me,...s},r={...n.platform,_c:i};return(async(t,e,s)=>{const{placement:i="bottom",strategy:n="absolute",middleware:r=[],platform:a}=s,h=r.filter(Boolean),o=await(null==a.isRTL?void 0:a.isRTL(e));let c=await a.getElementRects({reference:t,floating:e,strategy:n}),{x:l,y:u}=ie(c,i,o),d=i,p={},f=0;for(let s=0;snull===t?"":t+"",Fe=t=>null===t?null:t+"",Re=t=>null===t?0:Number(t),Ne=t=>null!==t,Ve=()=>null,He=t=>null===t?[]:JSON.parse(t),We=t=>null===t?{}:JSON.parse(t);function Ke(t){if(null===t)return Fe;switch(typeof t){case"undefined":case"string":default:return Ie;case"boolean":return Ne;case"number":return Re;case"function":return Ve;case"object":return et(t)?He:We}}const Qe=Symbol(0),ze=Symbol(0),Be=Symbol(0),Je=Symbol(0);function Xe(t,e){var s,i,n;class r extends t{constructor(...t){if(super(...t),this[i]=0,this[n]=null,this.keepAlive=!1,this.forwardKeepAlive=!0,this.$=x((()=>function(t,e){return $((()=>{Lt.$$=new jt(t,k(),undefined);const e=new t;return Lt.$$.e=e,Lt.$$=null,e}))}(e)),null),this.$.$$.t(this),e.props){const t=this.$props,s=Object.getOwnPropertyDescriptors(this);for(const i of Object.keys(s))i in e.props&&(t[i].set(this[i]),delete this[i])}}static{this[s]=null}static get observedAttributes(){if(!this[Qe]&&e.props){const t=new Map;for(const s of Object.keys(e.props)){let i=this.attrs?.[s],n=Y(i)?i:i?i?.attr:i;!1!==n&&(n||(n=Ft(s)),t.set(n,{C:s,B:i&&!Y(i)&&i?.converter||Ke(e.props[s])}))}this[Qe]=t}return this[Qe]?Array.from(this[Qe].keys()):[]}get scope(){return this.$.$$.d}get attachScope(){return this.$.$$.f}get connectScope(){return this.$.$$.g}get $props(){return this.$.$$.i}get $state(){return this.$.$$.h}get state(){return this.$.state}attributeChangedCallback(t,e,s){const i=this.constructor;if(!i[Qe])return void super.attributeChangedCallback?.(t,e,s);const n=i[Qe].get(t);n&&(this[n.C]=n.B(s))}connectedCallback(){const t=this.$?.$$;if(!t||t.o)return;if(2!==this[Be])return void Ue.call(this);if(!this.isConnected)return;this.hasAttribute("keep-alive")&&(this.keepAlive=!0),t.y(),et(this[Je])&&function(t,e){for(const s of t)s(e)}(this[Je],this),this[Je]=null;const e=super.connectedCallback;e&&x((()=>e.call(this)),this.connectScope)}disconnectedCallback(){const t=this.$?.$$;if(!t||t.o)return;t.z();const e=super.disconnectedCallback;e&&e.call(this),this.keepAlive||this.hasAttribute("keep-alive")||setTimeout((()=>{requestAnimationFrame((()=>{this.isConnected||t.p()}))}),0)}[(s=Qe,i=Be,n=Je,ze)](){const t=this.$.$$,e=this.constructor;if(t.o)return;const s=e[Qe];if(s)for(const e of this.attributes){let i=s.get(e.name);i&&i.B&&t.i[i.C].set(i.B(this.getAttribute(e.name)))}t.w(),t.x(this),this[Be]=2,this.connectedCallback()}subscribe(t){return this.$.subscribe(t)}destroy(){this.disconnectedCallback(),this.$.destroy()}}return function(t,e){const s=t.prototype,i=e.prototype;if(e.props)for(const t of Object.keys(e.props))Object.defineProperty(s,t,{enumerable:!0,configurable:!0,get(){return this.$props[t]()},set(e){this.$props[t].set(e)}});if(i[Tt])for(const t of i[Tt])Object.defineProperty(s,t,{enumerable:!0,configurable:!0,get(){return this.$[t]},set(e){this.$[t]=e}});if(i[Pt])for(const t of i[Pt])s[t]=function(...e){return this.$[t](...e)}}(r,e),r}function Ue(){if(0!==this[Be])return;this[Be]=1;const t=function(t){let e=t.parentNode,s=t.localName.split("-",1)[0]+"-";for(;e;){if(1===e.nodeType&&e.localName.startsWith(s))return e;e=e.parentNode}return null}(this),e=t&&window.customElements.get(t.localName),s=t&&2===t[Be];!t||e&&s?_e.call(this,t):Ze.call(this,t)}async function Ze(t){await window.customElements.whenDefined(t.localName),2!==t[Be]&&await new Promise((e=>(t[Je]??=[]).push(e))),_e.call(this,t)}function _e(t){if(this.isConnected){if(t){t.keepAlive&&t.forwardKeepAlive&&(this.keepAlive=!0,this.setAttribute("keep-alive",""));const e=this.$.$$.d;e&&t.$.$$.f.append(e)}this[ze]()}}function Ye(t,e=!1){!e&&window.customElements.get(t.tagName)||window.customElements.define(t.tagName,t)}},8:(t,e,s)=>{s.d(e,{$:()=>ce,D:()=>gs,E:()=>ms,G:()=>kt,I:()=>St,J:()=>Et,K:()=>Ct,L:()=>qt,M:()=>wt,N:()=>Dt,O:()=>It,P:()=>Ot,Q:()=>Ft,R:()=>Rt,S:()=>Jt,T:()=>Yt,U:()=>Nt,Z:()=>ee,_:()=>oe,a:()=>dt,a1:()=>le,a2:()=>ue,a3:()=>ge,a4:()=>Te,a5:()=>Ee,a6:()=>Ae,a8:()=>Le,a9:()=>Ie,aa:()=>Ne,ab:()=>Ke,ac:()=>Je,ad:()=>_e,ae:()=>es,af:()=>rs,ag:()=>as,ah:()=>os,ai:()=>cs,aj:()=>ls,al:()=>rt,am:()=>Tt,b:()=>bs,u:()=>$s});var i=s(348),n=s(7224),r=s(352),a=s(3659),h=s(1716),o=s(4276),c=s(8648),l={fullscreenEnabled:0,fullscreenElement:1,requestFullscreen:2,exitFullscreen:3,fullscreenchange:4,fullscreenerror:5,fullscreen:6},u=["webkitFullscreenEnabled","webkitFullscreenElement","webkitRequestFullscreen","webkitExitFullscreen","webkitfullscreenchange","webkitfullscreenerror","-webkit-full-screen"],d=["mozFullScreenEnabled","mozFullScreenElement","mozRequestFullScreen","mozCancelFullScreen","mozfullscreenchange","mozfullscreenerror","-moz-full-screen"],p=["msFullscreenEnabled","msFullscreenElement","msRequestFullscreen","msExitFullscreen","MSFullscreenChange","MSFullscreenError","-ms-fullscreen"],f="undefined"!=typeof window&&void 0!==window.document?window.document:{},g="fullscreenEnabled"in f&&Object.keys(l)||u[0]in f&&u||d[0]in f&&d||p[0]in f&&p||[],b={requestFullscreen:function(t){return t[g[l.requestFullscreen]]()},requestFullscreenFunction:function(t){return t[g[l.requestFullscreen]]},get exitFullscreen(){return f[g[l.exitFullscreen]].bind(f)},get fullscreenPseudoClass(){return":"+g[l.fullscreen]},addEventListener:function(t,e,s){return f.addEventListener(g[l[t]],e,s)},removeEventListener:function(t,e,s){return f.removeEventListener(g[l[t]],e,s)},get fullscreenEnabled(){return Boolean(f[g[l.fullscreenEnabled]])},set fullscreenEnabled(t){},get fullscreenElement(){return f[g[l.fullscreenElement]]},set fullscreenElement(t){},get onfullscreenchange(){return f[("on"+g[l.fullscreenchange]).toLowerCase()]},set onfullscreenchange(t){return f[("on"+g[l.fullscreenchange]).toLowerCase()]=t},get onfullscreenerror(){return f[("on"+g[l.fullscreenerror]).toLowerCase()]},set onfullscreenerror(t){return f[("on"+g[l.fullscreenerror]).toLowerCase()]=t}};const m=b.fullscreenEnabled;class y extends i.X{constructor(){super(...arguments),this.ub=!1,this.Nc=!1}get active(){return this.Nc}get supported(){return m}onConnect(){(0,i.l)(b,"fullscreenchange",this.Oc.bind(this)),(0,i.l)(b,"fullscreenerror",this._b.bind(this)),(0,i.o)(this.ya.bind(this))}async ya(){m&&await this.exit()}Oc(t){const e=$(this.el);e!==this.Nc&&(e||(this.ub=!1),this.Nc=e,this.dispatch("fullscreen-change",{detail:e,trigger:t}))}_b(t){this.ub&&(this.dispatch("fullscreen-error",{detail:null,trigger:t}),this.ub=!1)}async enter(){try{if(this.ub=!0,!this.el||$(this.el))return;return v(),b.requestFullscreen(this.el)}catch(t){throw this.ub=!1,t}}async exit(){if(this.el&&$(this.el))return v(),b.exitFullscreen()}}function $(t){if(b.fullscreenElement===t)return!0;try{return t.matches(b.fullscreenPseudoClass)}catch(t){return!1}}function v(){if(!m)throw Error("[vidstack] no fullscreen API")}class w extends i.X{constructor(){super(...arguments),this.vb=(0,i.m)(this.qe()),this.Ra=(0,i.m)(!1)}get type(){return this.vb()}get locked(){return this.Ra()}get portrait(){return this.vb().startsWith("portrait")}get landscape(){return this.vb().startsWith("landscape")}static{this.supported=(0,h.a)()}get supported(){return w.supported}onConnect(){if(this.supported)(0,i.l)(screen.orientation,"change",this.re.bind(this));else{const t=window.matchMedia("(orientation: landscape)");t.onchange=this.re.bind(this),(0,i.o)((()=>t.onchange=null))}(0,i.o)(this.ya.bind(this))}async ya(){this.supported&&this.Ra()&&await this.unlock()}re(t){this.vb.set(this.qe()),this.dispatch("orientation-change",{detail:{orientation:(0,i.p)(this.vb),lock:this.$b},trigger:t})}async lock(t){(0,i.p)(this.Ra)||this.$b===t||(this.se(),await screen.orientation.lock(t),this.Ra.set(!0),this.$b=t)}async unlock(){(0,i.p)(this.Ra)&&(this.se(),this.$b=void 0,await screen.orientation.unlock(),this.Ra.set(!1))}se(){if(!this.supported)throw Error("[vidstack] no orientation API")}qe(){return this.supported?window.screen.orientation.type:window.innerWidth>=window.innerHeight?"landscape-primary":"portrait-primary"}}class k{constructor(t=void 0){this.tb=t,this.A=null,this.aa=null,this.Pc=-1}setTarget(t){this.A=t}getPlayer(t){return this.aa||(t??this.A)?.dispatchEvent(new i.D("find-media-player",{detail:t=>{this.aa=t},bubbles:!0,composed:!0})),this.aa}setPlayer(t){this.aa=t}startLoading(t){this.s("media-start-loading",t)}play(t){this.s("media-play-request",t)}pause(t){this.s("media-pause-request",t)}mute(t){this.s("media-mute-request",t)}unmute(t){this.s("media-unmute-request",t)}enterFullscreen(t,e){this.s("media-enter-fullscreen-request",e,t)}exitFullscreen(t,e){this.s("media-exit-fullscreen-request",e,t)}lockScreenOrientation(t,e){this.s("media-orientation-lock-request",e,t)}unlockScreenOrientation(t){this.s("media-orientation-unlock-request",t)}enterPictureInPicture(t){this.s("media-enter-pip-request",t)}exitPictureInPicture(t){this.s("media-exit-pip-request",t)}seeking(t,e){this.s("media-seeking-request",e,t)}seek(t,e){this.s("media-seek-request",e,t)}seekToLiveEdge(t){this.s("media-live-edge-request",t)}changeVolume(t,e){this.s("media-volume-change-request",e,Math.max(0,Math.min(1,t)))}changeAudioTrack(t,e){this.s("media-audio-track-change-request",e,t)}changeQuality(t,e){this.s("media-quality-change-request",e,t)}requestAutoQuality(t){this.changeQuality(-1,t)}changeTextTrackMode(t,e,s){this.s("media-text-track-change-request",s,{index:t,mode:e})}changePlaybackRate(t,e){this.s("media-rate-change-request",e,t)}resumeControls(t){this.s("media-resume-controls-request",t)}pauseControls(t){this.s("media-pause-controls-request",t)}togglePaused(t){const e=this.getPlayer(t?.target);e&&(e.state.paused?this.play(t):this.pause(t))}toggleControls(t){const e=this.getPlayer(t?.target);e&&(e.controls.showing?e.controls.hide(0,t):e.controls.show(0,t))}toggleMuted(t){const e=this.getPlayer(t?.target);e&&(e.state.muted?this.unmute(t):this.mute(t))}toggleFullscreen(t,e){const s=this.getPlayer(e?.target);s&&(s.state.fullscreen?this.exitFullscreen(t,e):this.enterFullscreen(t,e))}togglePictureInPicture(t){const e=this.getPlayer(t?.target);e&&(e.state.pictureInPicture?this.exitPictureInPicture(t):this.enterPictureInPicture(t))}disableCaptions(t){const e=this.getPlayer(t?.target);if(!e)return;const s=e.state.textTracks,i=e.state.textTrack;if(i){const e=s.indexOf(i);this.changeTextTrackMode(e,"disabled",t)}}toggleCaptions(t){const e=this.getPlayer(t?.target);if(!e)return;const s=e.state.textTracks,i=e.state.textTrack;if(i){const e=s.indexOf(i);this.changeTextTrackMode(e,"disabled",t),this.Pc=e}else{let e=this.Pc;s[e]&&(0,r.i)(s[e])||(e=-1),-1===e&&(e=s.findIndex((t=>(0,r.i)(t)&&t.default))),-1===e&&(e=s.findIndex((t=>(0,r.i)(t)))),e>=0&&this.changeTextTrackMode(e,"showing",t),this.Pc=-1}}s(t,e,s){const n=new i.D(t,{bubbles:!0,composed:!0,detail:s,trigger:e});let r=e?.target||null;r&&r instanceof i.I&&(r=r.el);const a=!r||r===document||r===window||r===document.body||this.aa?.el&&r instanceof Node&&!this.aa.el.contains(r);r=a?this.A??this.getPlayer()?.el:r??this.A,this.aa?this.aa.canPlayQueue.k(t,(()=>r?.dispatchEvent(n))):r?.dispatchEvent(n)}za(t){}}class x extends i.X{}class T extends x{constructor(){super(...arguments),this.Qc=-2,this.Xa=!1,this.ze=(0,i.m)(!1),this.Rc=(0,i.m)(!1),this.wb=null,this.defaultDelay=2e3}get hideOnMouseLeave(){const{hideControlsOnMouseLeave:t}=this.$props;return this.ze()||t()}set hideOnMouseLeave(t){this.ze.set(t)}get showing(){return this.$state.controlsVisible()}show(t=0,e){this.Sc(),this.Xa||this.bc(!0,t,e)}hide(t=this.defaultDelay,e){this.Sc(),this.Xa||this.bc(!1,t,e)}pause(t){this.Xa=!0,this.Sc(),this.bc(!0,0,t)}resume(t){this.Xa=!1,this.$state.paused()||this.bc(!1,this.defaultDelay,t)}onConnect(){(0,i.e)(this.bg.bind(this)),(0,i.e)(this.Tc.bind(this));const t=this.xb.bind(this),e=this.Aa.bind(this);this.listen("can-play",(t=>this.show(0,t))),this.listen("play",t),this.listen("pause",e),this.listen("autoplay-fail",e)}bg(){const{started:t,pointer:e,paused:s}=this.$state;if(!t()||"fine"!==e())return;const n=this.hideOnMouseLeave;n&&this.Rc()||(0,i.e)((()=>{s()||this.listen("pointermove",this.Ae.bind(this))})),n&&(this.listen("mouseenter",this.cg.bind(this)),this.listen("mouseleave",this.dg.bind(this)))}Tc(){const{paused:t,started:e,autoplayError:s}=this.$state;if(t()||s()&&!e())return;const n=this.Ae.bind(this);(0,i.e)((()=>{const t=["coarse"===this.$state.pointer()?"touchend":"pointerup","keydown"];for(const e of t)this.listen(e,n,{passive:!1})}))}xb(t){this.show(0,t),this.hide(void 0,t)}Aa(t){this.show(0,t)}cg(t){this.Rc.set(!1),this.show(0,t),this.hide(void 0,t)}dg(t){this.Rc.set(!0),this.hide(0,t)}Sc(){window.clearTimeout(this.Qc),this.Qc=-1}Ae(t){t.MEDIA_GESTURE||this.Xa||(0,a.i)(t)||((0,i.G)(t)&&("Escape"===t.key?(this.el?.focus(),this.wb=null):this.wb&&(t.preventDefault(),requestAnimationFrame((()=>{this.wb?.focus(),this.wb=null})))),this.show(0,t),this.hide(this.defaultDelay,t))}bc(t,e,s){0!==e?this.Qc=window.setTimeout((()=>{this.scope&&this.B(t&&!this.Xa,s)}),e):this.B(t,s)}B(t,e){this.$state.controlsVisible()!==t&&(this.$state.controlsVisible.set(t),!t&&document.activeElement&&this.el?.contains(document.activeElement)&&(this.wb=document.activeElement,requestAnimationFrame((()=>this.el?.focus()))),this.dispatch("controls-change",{detail:t,trigger:e}))}}class P{constructor(){this.priority=0,this.Be=!0,this.m=null,this.z=null,this.yb=new Set}canRender(t,e){return!!e}attach(t){this.m=t,t&&(t.textTracks.onchange=this.B.bind(this))}addTrack(t){this.yb.add(t),this.eg(t)}removeTrack(t){t[r.T.T]?.remove?.(),t[r.T.T]=null,this.yb.delete(t)}changeTrack(t){const e=t?.[r.T.T];e&&"showing"!==e.track.mode&&(e.track.mode="showing"),this.z=t}setDisplay(t){this.Be=t,this.B()}detach(){this.m&&(this.m.textTracks.onchange=null);for(const t of this.yb)this.removeTrack(t);this.yb.clear(),this.m=null,this.z=null}eg(t){if(!this.m)return;const e=t[r.T.T]??=this.fg(t);e instanceof HTMLElement&&(this.m.append(e),e.track.mode=e.default?"showing":"hidden")}fg(t){const e=document.createElement("track"),s=t.default||"showing"===t.mode,i=t.src&&"vtt"===t.type;return e.id=t.id,e.src=i?t.src:"https://cdn.jsdelivr.net/npm/vidstack@next/empty.vtt",e.label=t.label,e.kind=t.kind,e.default=s,t.language&&(e.srclang=t.language),s&&!i&&this.Ce(t,e.track),e}Ce(t,e){if(!(t.src&&"vtt"===t.type||e.cues?.length))for(const s of t.cues)e.addCue(s)}B(t){for(const e of this.yb){const s=e[r.T.T]?.track;if(!s)continue;if(!this.Be){s.mode="disabled";continue}const i="showing"===s.mode;i&&this.Ce(e,s),e.setMode(i?"showing":"disabled",t)}}}class S{constructor(t){this.a=t,this.m=null,this.cc=[],this.De=!1,this.ba=null,this.Ba=null;const e=t.textTracks;this.Uc=e,(0,i.e)(this.Vc.bind(this)),(0,i.o)(this.Ee.bind(this)),(0,i.l)(e,"add",this.Wc.bind(this)),(0,i.l)(e,"remove",this.gg.bind(this)),(0,i.l)(e,"mode-change",this.ea.bind(this))}Vc(){const{$state:t,$iosControls:e}=this.a;this.De=t.controls()||e(),this.ea()}add(t){this.cc.push(t),this.ea()}remove(t){t.detach(),this.cc.splice(this.cc.indexOf(t),1),this.ea()}Fe(t){requestAnimationFrame((()=>{if(this.m=t,t){this.ba=new P,this.ba.attach(t);for(const t of this.Uc)this.Ge(t)}this.ea()}))}Ge(t){(0,r.i)(t)&&this.ba?.addTrack(t)}hg(t){(0,r.i)(t)&&this.ba?.removeTrack(t)}Wc(t){this.Ge(t.detail)}gg(t){this.hg(t.detail)}ea(){const t=this.Uc.selected;if(this.m&&(this.De||t?.[r.T.te]))return this.Ba?.changeTrack(null),this.ba?.setDisplay(!0),void this.ba?.changeTrack(t);if(this.ba?.setDisplay(!1),this.ba?.changeTrack(null),!t)return void this.Ba?.changeTrack(null);const e=this.cc.sort(((t,e)=>t.priority-e.priority)).find((e=>e.canRender(t,this.m)));this.Ba!==e&&(this.Ba?.detach(),e?.attach(this.m),this.Ba=e??null),e?.changeTrack(t)}Ee(){this.ba?.detach(),this.ba=null,this.Ba?.detach(),this.Ba=null}}class E extends n.L{constructor(){super(...arguments),this.P=!1,this.dc={},this.Je=this.ig.bind(this)}get selected(){return this.r.find((t=>"showing"===t.mode&&(0,r.i)(t)))??null}add(t,e){const s=t instanceof r.b?t:new r.b(t);return this.dc[t.kind]&&t.default&&delete t.default,s.addEventListener("mode-change",this.Je),this[h.L.oa](s,e),s[r.T.Sa]=this[r.T.Sa],this.P&&s[r.T.P](),t.default&&(this.dc[t.kind]=s,s.mode="showing"),this}remove(t,e){if(this.r.includes(t))return t===this.dc[t.kind]&&delete this.dc[t.kind],t.mode="disabled",t[r.T.Ua]=null,t.removeEventListener("mode-change",this.Je),this[h.L.Yb](t,e),this}clear(t){for(const e of[...this.r])this.remove(e,t);return this}getById(t){return this.r.find((e=>e.id===t))??null}getByKind(t){const e=Array.isArray(t)?t:[t];return this.r.filter((t=>e.includes(t.kind)))}[r.T.P](){if(!this.P){for(const t of this.r)t[r.T.P]();this.P=!0}}ig(t){const e=t.detail;if("showing"===e.mode){const t=(0,r.i)(e)?["captions","subtitles"]:[e.kind];for(const s of this.r)"showing"===s.mode&&s!=e&&t.includes(s.kind)&&(s.mode="disabled")}this.dispatchEvent(new i.D("mode-change",{detail:t.detail,trigger:t}))}}const A=Symbol(0);class j extends n.L{get selected(){return this.r.find((t=>t.selected))??null}get selectedIndex(){return this.r.findIndex((t=>t.selected))}[h.L.oe](t,e){this[h.L.pa](t,!1,e)}[h.L.oa](t,e){t[A]=!1,Object.defineProperty(t,"selected",{get(){return this[A]},set:e=>{this.readonly||(this[h.L.pe]?.(),this[h.L.pa](t,e))}}),super[h.L.oa](t,e)}[h.L.pa](t,e,s){if(e===t?.[A])return;const n=this.selected;t&&(t[A]=e),(e?n!==t:n===t)&&(n&&(n[A]=!1),this.dispatchEvent(new i.D("change",{detail:{prev:n,current:this.selected},trigger:s})))}}class L extends j{getById(t){return""===t?null:this.r.find((e=>e.id===t))??null}}class C extends j{constructor(){super(...arguments),this.fc=!1,this.switch="current"}get auto(){return this.fc||this.readonly}[h.L.pe](){this[o.Q.Ya](!1)}[h.L.ne](t){this[o.Q.Ya](!1,t)}autoSelect(t){this.readonly||this.fc||!this[o.Q.Za]||(this[o.Q.Za]?.(),this[o.Q.Ya](!0,t))}[o.Q.Ya](t,e){this.fc!==t&&(this.fc=t,this.dispatchEvent(new i.D("auto-change",{detail:t,trigger:e})))}}const O=new Set(["Shift","Alt","Meta","Control"]),M='input, textarea, select, [contenteditable], [role^="menuitem"]';class q extends x{constructor(t){super(),this.a=t,this._a=null}onConnect(){(0,i.e)(this.mg.bind(this))}mg(){const{keyDisabled:t,keyTarget:e}=this.$props;if(t())return;const s="player"===e()?this.el:document,n=(0,i.m)(!1);s===this.el?(this.listen("focusin",(()=>n.set(!0))),this.listen("focusout",(t=>{this.el.contains(t.target)||n.set(!1)}))):((0,i.p)(n)||n.set(document.querySelector("[data-media-player]")===this.el),(0,i.l)(document,"focusin",(t=>{const e=t.composedPath().find((t=>t instanceof Element&&"media-player"===t.localName));void 0!==e&&n.set(this.el===e)}))),(0,i.e)((()=>{n()&&((0,i.l)(s,"keyup",this.zb.bind(this)),(0,i.l)(s,"keydown",this.Ab.bind(this)),(0,i.l)(s,"keydown",this.ng.bind(this),{capture:!0}))}))}zb(t){const e=document.activeElement;if(!t.key||!this.$state.canSeek()||e?.matches(M))return;let{method:s,value:n}=this.Zc(t);if((0,i.r)(n)||(0,i.w)(n)){if(s?.startsWith("seek")&&(t.preventDefault(),t.stopPropagation(),this._a?(this.Ne(t,"seekForward"===s),this._a=null):(this.a.remote.seek(this.gc,t),this.gc=void 0)),s?.startsWith("volume")){const e=this.el.querySelector("[data-media-volume-slider]");e?.dispatchEvent(new KeyboardEvent("keyup",{key:"volumeUp"===s?"Up":"Down",shiftKey:t.shiftKey,trigger:t}))}}else n?.callback(t)}Ab(t){if(!t.key||O.has(t.key))return;const e=document.activeElement;if(e?.matches(M)||(0,i.b)(t)&&e?.matches('button, [role="button"]'))return;let{method:s,value:n}=this.Zc(t);if((0,i.r)(n)||(0,i.w)(n)){if(!s&&!t.metaKey&&/[0-9]/.test(t.key))return t.preventDefault(),t.stopPropagation(),void this.a.remote.seek(this.$state.duration()/10*Number(t.key),t);if(s)switch(t.preventDefault(),t.stopPropagation(),s){case"seekForward":case"seekBackward":this.qa(t,s,"seekForward"===s);break;case"volumeUp":case"volumeDown":const e=this.el.querySelector("[data-media-volume-slider]");if(e)e.dispatchEvent(new KeyboardEvent("keydown",{key:"volumeUp"===s?"Up":"Down",shiftKey:t.shiftKey,trigger:t}));else{const e=t.shiftKey?.1:.05;this.a.remote.changeVolume(this.$state.volume()+("volumeUp"===s?+e:-e),t)}break;case"toggleFullscreen":this.a.remote.toggleFullscreen("prefer-media",t);break;case"speedUp":case"slowDown":const i=this.$state.playbackRate();this.a.remote.changePlaybackRate(Math.max(.25,Math.min(2,i+("speedUp"===s?.25:-.25))),t);break;default:this.a.remote[s]?.(t)}}else n?.callback(t)}ng(t){var e;(function(t){return t instanceof HTMLAudioElement}(e=t.target)||function(t){return t instanceof HTMLVideoElement}(e))&&this.Zc(t).method&&t.preventDefault()}Zc(t){const e={...this.$props.keyShortcuts(),...this.a.ariaKeys},s=Object.keys(e).find((s=>{const n=e[s],r=(0,i.w)(n)?n.join(" "):(0,i.r)(n)?n:n?.keys;return((0,i.w)(r)?r:r?.split(" "))?.some((e=>function(t){return t.replace(/Shift\+(\d)/g,((t,e)=>D[e-1]))}(e).replace(/Control/g,"Ctrl").split("+").every((e=>O.has(e)?t[e.toLowerCase()+"Key"]:t.key===e.replace("Space"," ")))))}));return{method:s,value:s?e[s]:null}}og(t,e){const s=t.shiftKey?10:5;return this.gc=Math.max(0,Math.min((this.gc??this.$state.currentTime())+("seekForward"===e?+s:-s),this.$state.duration()))}Ne(t,e){this._a?.dispatchEvent(new KeyboardEvent(t.type,{key:e?"Right":"Left",shiftKey:t.shiftKey,trigger:t}))}qa(t,e,s){this.$state.canSeek()&&(this._a||(this._a=this.el.querySelector("[data-media-time-slider]")),this._a?this.Ne(t,s):this.a.remote.seeking(this.og(t,e),t))}}const D=["!","@","#","$","%","^","&","*","(",")"];class I extends i.X{constructor(t){super(),this._c=t}onAttach(t){const{$props:e,ariaKeys:s}=(0,n.u)(),r=t.getAttribute("aria-keyshortcuts");if(r)return s[this._c]=r,void(0,i.o)((()=>{delete s[this._c]}));const a=e.keyShortcuts()[this._c];if(a){const e=(0,i.w)(a)?a.join(" "):(0,i.r)(a)?a:a?.keys;t.setAttribute("aria-keyshortcuts",(0,i.w)(e)?e.join(" "):e)}}}class F{canPlay({src:t,type:e}){return(0,i.r)(t)?c.A.test(t)||c.b.has(e)||t.startsWith("blob:")&&"audio/object"===e:"audio/object"===e}mediaType(){return"audio"}async load(){return new((await s.e(6180).then(s.bind(s,6180))).AudioProvider)(this.target)}}class R{canPlay(t){return(0,i.r)(t.src)?c.V.test(t.src)||c.c.has(t.type)||t.src.startsWith("blob:")&&"video/object"===t.type||(0,c.i)(t)&&(0,h.b)():"video/object"===t.type}mediaType(){return"video"}async load(t){return new((await s.e(1984).then(s.bind(s,9604))).VideoProvider)(this.target,t)}}class N{canPlay(t){return(0,i.r)(t.src)&&"video/youtube"===t.type}mediaType(){return"video"}async load(t){return new((await s.e(1868).then(s.bind(s,9488))).YouTubeProvider)(this.target)}}class V extends R{static{this.supported=(0,h.i)()}canPlay(t){return V.supported&&(0,c.i)(t)}async load(t){return new((await s.e(6128).then(s.bind(s,6128))).HLSProvider)(this.target,t)}}class H{canPlay(t){return(0,i.r)(t.src)&&"video/vimeo"===t.type}mediaType(){return"video"}async load(t){return new((await s.e(552).then(s.bind(s,552))).VimeoProvider)(this.target)}}const W=Symbol(0),K=["autoplay","canFullscreen","canPictureInPicture","canLoad","canPlay","canSeek","ended","fullscreen","loop","live","liveEdge","mediaType","muted","paused","pictureInPicture","playing","playsinline","seeking","started","streamType","viewType","waiting"],Q={autoplay:!1,controls:!1,currentTime:0,crossorigin:null,fullscreenOrientation:"landscape",load:"visible",logLevel:"silent",loop:!1,muted:!1,paused:!0,playsinline:!1,playbackRate:1,poster:"",preload:"metadata",preferNativeHLS:!1,src:"",title:"",controlsDelay:2e3,hideControlsOnMouseLeave:!1,viewType:"unknown",streamType:"unknown",volume:1,liveEdgeTolerance:10,minLiveDVRWindow:60,keyDisabled:!1,keyTarget:"player",keyShortcuts:{togglePaused:"k Space",toggleMuted:"m",toggleFullscreen:"f",togglePictureInPicture:"i",toggleCaptions:"c",seekBackward:"j J ArrowLeft",seekForward:"l L ArrowRight",volumeUp:"ArrowUp",volumeDown:"ArrowDown",speedUp:">",slowDown:"<"}};class z extends x{constructor(t){super(),this.Ca=t}async onAttach(t){const e=this.$props.load();if("eager"===e)requestAnimationFrame(this.Ca);else if("idle"===e)(0,i.Y)(this.Ca);else if("visible"===e){const e=new IntersectionObserver((t=>{this.scope&&t[0].isIntersecting&&(e.disconnect(),this.Ca())}));return e.observe(t),e.disconnect.bind(e)}}}class B{constructor(t,e){this.X=t,this.a=e,this.c=(t,...e)=>{this.X(new i.D(t,{detail:e?.[0],trigger:e?.[1]}))}}async jc(t,e){const{$state:s,logger:n}=this.a;if((0,i.p)(s.canPlay))return;const r={duration:t?.duration??(0,i.p)(s.duration),seekable:t?.seekable??(0,i.p)(s.seekable),buffered:t?.buffered??(0,i.p)(s.buffered),provider:(0,i.p)(this.a.$provider)};this.c("can-play",r,e),(0,i.P)();const a=(0,i.p)(this.a.$provider),{muted:h,volume:o,playsinline:c}=this.a.$props;a&&(a.setVolume((0,i.p)(o)),a.setMuted((0,i.p)(h)),a.setPlaysinline?.((0,i.p)(c))),s.canPlay()&&s.autoplay()&&!s.started()&&await this.oh(e)}async oh(t){const{player:e,$state:s}=this.a;s.autoplaying.set(!0);const n=new i.D("autoplay-attempt",{trigger:t});try{await e.play(n)}catch(t){}}}class J{constructor(){this.e=new Map}k(t,e){this.e.has(t)||this.e.set(t,new Set),this.e.get(t).add(e)}td(t,e){const s=this.e.get(t);if(s)for(const t of s)e(t);this.e.delete(t)}qc(t){this.e.delete(t)}ph(t){return this.e.get(t)?.size??0}H(){this.e.clear()}}class X{constructor(){this.Mb=!1,this.Ed=(0,i.v)(),this.e=new Map}get ph(){return this.e.size}get Rj(){return this.Mb}async Sj(){this.Mb||await this.Ed.promise}k(t,e){this.Mb?e():(this.e.delete(t),this.e.set(t,e))}td(t){this.e.get(t)?.(),this.e.delete(t)}Bb(){this.jf(),this.Mb=!0,this.e.size>0&&this.jf()}ra(){this.Mb=!1}H(){this.ra(),this.e.clear(),this.kf()}jf(){for(const t of this.e.keys())this.td(t);this.kf()}kf(){this.Ed.resolve(),this.Ed=(0,i.v)()}}class U extends x{constructor(t,e,s){super(),this.ga=t,this.f=e,this.a=s,this.vk=new X,this.vd=!1,this.uk=s.$provider,this.Ib=new T,this.rc=new y,this.ta=new w}onAttach(){this.listen("fullscreen-change",this.Oc.bind(this))}onConnect(){const t=Object.getOwnPropertyNames(Object.getPrototypeOf(this)),e=this.qh.bind(this);for(const s of t)s.startsWith("media-")&&this.listen(s,e);(0,i.e)(this.wk.bind(this)),(0,i.e)(this.rh.bind(this)),(0,i.e)(this.sh.bind(this)),(0,i.e)(this.th.bind(this))}onDestroy(){this.vk.H()}wk(){const t=this.uk(),e=this.$state.canPlay();return t&&e&&this.vk.Bb(),()=>{this.vk.ra()}}qh(t){t.stopPropagation(),this[t.type]&&((0,i.p)(this.uk)?this[t.type](t):this.vk.k(t.type,(()=>{(0,i.p)(this.uk)&&this[t.type](t)})))}async sc(t){const{canPlay:e,paused:s,ended:n,autoplaying:r,seekableStart:a}=this.$state;if((0,i.p)(s)){"media-play-request"===t?.type&&this.f.e.k("play",t);try{const t=(0,i.p)(this.uk);return Z(t,(0,i.p)(e)),(0,i.p)(n)&&t.setCurrentTime(a()+.1),await t.play()}catch(e){const s=this.createEvent("play-fail",{detail:(0,o.c)(e),trigger:t});throw s.autoplay=r(),this.ga.X(s),e}}}async ud(t){const{canPlay:e,paused:s}=this.$state;if((0,i.p)(s))return;"media-pause-request"===t?.type&&this.f.e.k("pause",t);const n=(0,i.p)(this.uk);return Z(n,(0,i.p)(e)),n.pause()}Ze(t){const{canPlay:e,live:s,liveEdge:n,canSeek:r,liveSyncPosition:a,seekableEnd:h,userBehindLiveEdge:o}=this.$state;if(o.set(!1),(0,i.p)((()=>!s()||n()||!r())))return;const c=(0,i.p)(this.uk);Z(c,(0,i.p)(e)),c.setCurrentTime(a()??h()-2)}async _e(t="prefer-media",e){const s=this.$e(t);if(_(0,s),!s.active)return(0,i.p)(this.$state.pictureInPicture)&&(this.vd=!0,await this.wd(e)),"media-enter-fullscreen-request"===e?.type&&this.f.e.k("fullscreen",e),s.enter()}async af(t="prefer-media",e){const s=this.$e(t);if(_(0,s),s.active){"media-exit-fullscreen-request"===e?.type&&this.f.e.k("fullscreen",e);try{const t=await s.exit();return this.vd&&(0,i.p)(this.$state.canPictureInPicture)&&await this.xd(),t}finally{this.vd=!1}}}$e(t){const e=(0,i.p)(this.uk);return"prefer-media"===t&&this.rc.supported||"media"===t?this.rc:e?.fullscreen}async xd(t){if(this.bf(),!this.$state.pictureInPicture())return"media-enter-pip-request"===t?.type&&this.f.e.k("pip",t),await this.uk().pictureInPicture.enter()}async wd(t){if(this.bf(),this.$state.pictureInPicture())return"media-exit-pip-request"===t?.type&&this.f.e.k("pip",t),await this.uk().pictureInPicture.exit()}bf(){if(!this.$state.canPictureInPicture())throw Error("[vidstack] no pip support")}rh(){this.Ib.defaultDelay=this.$props.controlsDelay()}sh(){const{canLoad:t,canFullscreen:e}=this.$state,s=this.rc.supported||this.uk()?.fullscreen?.supported||!1;t()&&(0,i.p)(e)===s||e.set(s)}th(){const{canLoad:t,canPictureInPicture:e}=this.$state,s=this.uk()?.pictureInPicture?.supported||!1;t()&&(0,i.p)(e)===s||e.set(s)}"media-audio-track-change-request"(t){if(this.a.audioTracks.readonly)return;const e=t.detail,s=this.a.audioTracks[e];s&&(this.f.e.k("audioTrack",t),s.selected=!0)}async"media-enter-fullscreen-request"(t){try{await this._e(t.detail,t)}catch(e){this._b(e,t)}}async"media-exit-fullscreen-request"(t){try{await this.af(t.detail,t)}catch(e){this._b(e,t)}}async Oc(t){const e=(0,i.p)(this.$props.fullscreenOrientation),s=t.detail;if(!(0,i.i)(e)&&this.ta.supported)if(s){if(this.ta.locked)return;this.dispatch("media-orientation-lock-request",{detail:e,trigger:t})}else this.ta.locked&&this.dispatch("media-orientation-unlock-request",{trigger:t})}_b(t,e){this.ga.X(this.createEvent("fullscreen-error",{detail:(0,o.c)(t)}))}async"media-orientation-lock-request"(t){try{this.f.e.k("orientation",t),await this.ta.lock(t.detail)}catch(t){this.f.e.qc("orientation")}}async"media-orientation-unlock-request"(t){try{this.f.e.k("orientation",t),await this.ta.unlock()}catch(t){this.f.e.qc("orientation")}}async"media-enter-pip-request"(t){try{await this.xd(t)}catch(e){this.cf(e,t)}}async"media-exit-pip-request"(t){try{await this.wd(t)}catch(e){this.cf(e,t)}}cf(t,e){this.ga.X(this.createEvent("picture-in-picture-error",{detail:(0,o.c)(t)}))}"media-live-edge-request"(t){const{live:e,liveEdge:s,canSeek:i}=this.$state;if(e()&&!s()&&i()){this.f.e.k("seeked",t);try{this.Ze()}catch(t){}}}async"media-loop-request"(t){try{this.f.Ha=!0,this.f.gb=!0,await this.sc(t)}catch(t){this.f.Ha=!1,this.f.gb=!1}}async"media-pause-request"(t){if(!this.$state.paused())try{await this.ud(t)}catch(t){this.f.e.qc("pause")}}async"media-play-request"(t){if(this.$state.paused())try{await this.sc(t)}catch(t){}}"media-rate-change-request"(t){const{playbackRate:e,canSetPlaybackRate:s}=this.$state;if(e()===t.detail||!s())return;const i=this.uk();i?.setPlaybackRate&&(this.f.e.k("rate",t),i.setPlaybackRate(t.detail))}"media-quality-change-request"(t){if(this.a.qualities.readonly)return;this.f.e.k("quality",t);const e=t.detail;if(e<0)this.a.qualities.autoSelect(t);else{const t=this.a.qualities[e];t&&(t.selected=!0)}}"media-pause-controls-request"(t){this.f.e.k("controls",t),this.Ib.pause(t)}"media-resume-controls-request"(t){this.f.e.k("controls",t),this.Ib.resume(t)}"media-seek-request"(t){const{seekableStart:e,seekableEnd:s,ended:i,canSeek:n,live:r,userBehindLiveEdge:a}=this.$state;i()&&(this.f.gb=!0),this.f.qa=!1,this.f.e.qc("seeking");const h=Math.min(Math.max(e()+.1,t.detail),s()-.1);Number.isFinite(h)&&n()&&(this.f.e.k("seeked",t),this.uk().setCurrentTime(h),r()&&t.isOriginTrusted&&Math.abs(s()-h)>=2&&a.set(!0))}"media-seeking-request"(t){this.f.e.k("seeking",t),this.$state.seeking.set(!0),this.f.qa=!0}"media-start-loading"(t){this.$state.canLoad()||(this.f.e.k("load",t),this.ga.X(this.createEvent("can-load")))}"media-text-track-change-request"(t){const{index:e,mode:s}=t.detail,i=this.a.textTracks[e];i&&(this.f.e.k("textTrack",t),i.setMode(s,t))}"media-mute-request"(t){this.$state.muted()||(this.f.e.k("volume",t),this.uk().setMuted(!0))}"media-unmute-request"(t){const{muted:e,volume:s}=this.$state;e()&&(this.f.e.k("volume",t),this.a.$provider().setMuted(!1),0===s()&&(this.f.e.k("volume",t),this.uk().setVolume(.25)))}"media-volume-change-request"(t){const{muted:e,volume:s}=this.$state,i=t.detail;s()!==i&&(this.f.e.k("volume",t),this.uk().setVolume(i),i>0&&e()&&(this.f.e.k("volume",t),this.uk().setMuted(!1)))}}function Z(t,e){if(!t||!e)throw Error("[vidstack] media not ready")}function _(t,e){if(!e?.supported)throw Error("[vidstack] no fullscreen support")}class Y{constructor(){this.qa=!1,this.Ha=!1,this.gb=!1,this.e=new J}}var G=function(t,e,s){var i=null,n=null,r=function(){i&&(clearTimeout(i),n=null,i=null)},a=function(){if(!e)return t.apply(this,arguments);var a=this,h=arguments,o=s&&!i;return r(),n=function(){t.apply(a,h)},i=setTimeout((function(){if(i=null,!o){var t=n;return n=null,t()}}),e),o?n():void 0};return a.cancel=r,a.flush=function(){var t=n;r(),t&&t()},a},tt=function(t,e,s){var i=null,n=null,r=s&&s.leading,a=s&&s.trailing;null==r&&(r=!0),null==a&&(a=!r),1==r&&(a=!1);var h=function(){i&&(clearTimeout(i),i=null)},o=function(){var s=r&&!i,h=this,o=arguments;if(n=function(){return t.apply(h,o)},i||(i=setTimeout((function(){if(i=null,a)return n()}),e)),s)return s=!1,n()};return o.cancel=h,o.flush=function(){var t=n;h(),t&&t()},o};const et=new Set(["autoplay","autoplay-fail","can-load","sources-change","source-change","load-start","abort","error","loaded-metadata","loaded-data","can-play","play","play-fail","pause","playing","seeking","seeked","waiting"]);class st extends x{constructor(t,e){super(),this.f=t,this.a=e,this.p=new Map,this.tc=!1,this.Jb=!1,this.seeking=tt((t=>{const{seeking:e,currentTime:s,paused:i}=this.$state;e.set(!0),s.set(t.detail),this.F("seeking",t),i()&&(this.hb=t,this.zd())}),150,{leading:!0}),this.zd=G((()=>{if(!this.hb)return;this.tc=!0;const{waiting:t,playing:e}=this.$state;t.set(!0),e.set(!1);const s=this.createEvent("waiting",{trigger:this.hb});this.p.set("waiting",s),this.dispatch(s),this.hb=void 0,this.tc=!1}),300)}onAttach(t){t.setAttribute("aria-busy","true"),this.listen("fullscreen-change",this["fullscreen-change"].bind(this)),this.listen("fullscreen-error",this["fullscreen-error"].bind(this)),this.listen("orientation-change",this["orientation-change"].bind(this))}onConnect(t){this.uh(),this.vh(),this.wh(),this.xh(),(0,i.o)(this.yh.bind(this))}X(t){if(!this.scope)return;const e=t.type;this[t.type]?.(t),et.has(e)&&this.p.set(e,t),this.dispatch(t)}xh(){this.Jb&&(this.a.$provider()?.paused&&requestAnimationFrame((()=>{this.scope&&this.a.remote.play(new i.D("dom-connect"))})),this.Jb=!1)}yh(){this.Jb||(this.Jb=!this.a.$state.paused(),this.a.$provider()?.pause())}ib(){this.df(),this.f.gb=!1,this.f.Ha=!1,this.tc=!1,this.hb=void 0,this.p.clear()}F(t,e){this.f.e.td(t,(t=>{e.request=t,e.triggers.add(t)}))}uh(){this.yd(),this.ef();const t=this.a.textTracks;(0,i.l)(t,"add",this.yd.bind(this)),(0,i.l)(t,"remove",this.yd.bind(this)),(0,i.l)(t,"mode-change",this.ef.bind(this))}vh(){const t=this.a.qualities;(0,i.l)(t,"add",this.pc.bind(this)),(0,i.l)(t,"remove",this.pc.bind(this)),(0,i.l)(t,"change",this.fb.bind(this)),(0,i.l)(t,"auto-change",this.zh.bind(this)),(0,i.l)(t,"readonly-change",this.Ah.bind(this))}wh(){const t=this.a.audioTracks;(0,i.l)(t,"add",this.ff.bind(this)),(0,i.l)(t,"remove",this.ff.bind(this)),(0,i.l)(t,"change",this.Bh.bind(this))}yd(t){const{textTracks:e}=this.$state;e.set(this.a.textTracks.toArray()),this.dispatch("text-tracks-change",{detail:e(),trigger:t})}ef(t){t&&this.F("textTrack",t);const e=this.a.textTracks.selected,{textTrack:s}=this.$state;s()!==e&&(s.set(e),this.dispatch("text-track-change",{detail:e,trigger:t}))}ff(t){const{audioTracks:e}=this.$state;e.set(this.a.audioTracks.toArray()),this.dispatch("audio-tracks-change",{detail:e(),trigger:t})}Bh(t){const{audioTrack:e}=this.$state;e.set(this.a.audioTracks.selected),this.F("audioTrack",t),this.dispatch("audio-track-change",{detail:e(),trigger:t})}pc(t){const{qualities:e}=this.$state;e.set(this.a.qualities.toArray()),this.dispatch("qualities-change",{detail:e(),trigger:t})}fb(t){const{quality:e}=this.$state;e.set(this.a.qualities.selected),this.F("quality",t),this.dispatch("quality-change",{detail:e(),trigger:t})}zh(){this.$state.autoQuality.set(this.a.qualities.auto)}Ah(){this.$state.canSetQuality.set(!this.a.qualities.readonly)}"provider-change"(t){const e=this.a.$provider(),s=t.detail;e?.type!==s?.type&&(e?.destroy?.(),e?.scope?.dispose(),this.a.$provider.set(t.detail),e&&null===t.detail&&this.gf(t))}"provider-loader-change"(t){}autoplay(t){this.$state.autoplayError.set(null)}"autoplay-fail"(t){this.$state.autoplayError.set(t.detail),this.ib()}"can-load"(t){this.$state.canLoad.set(!0),this.p.set("can-load",t),this.F("load",t),this.a.textTracks[r.T.P]()}"media-type-change"(t){const e=this.p.get("source-change");e&&t.triggers.add(e);const s=this.$state.viewType();this.$state.mediaType.set(t.detail);const i=this.$state.providedViewType(),n="unknown"===i?t.detail:i;s!==n&&setTimeout((()=>{requestAnimationFrame((()=>{this.scope&&(this.$state.inferredViewType.set(t.detail),this.dispatch("view-type-change",{detail:n,trigger:t}))}))}),0)}"stream-type-change"(t){const e=this.p.get("source-change");e&&t.triggers.add(e);const{streamType:s,inferredStreamType:i}=this.$state;i.set(t.detail),t.detail=s()}"rate-change"(t){this.$state.playbackRate.set(t.detail),this.F("rate",t)}"sources-change"(t){this.$state.sources.set(t.detail)}"source-change"(t){const e=this.p.get("sources-change");e&&t.triggers.add(e),this.gf(t),this.p.set(t.type,t),this.$state.source.set(t.detail),this.el?.setAttribute("aria-busy","true")}gf(t){this.a.audioTracks[h.L.H](t),this.a.qualities[h.L.H](t),this.ib(),(0,n.s)(this.a.$state)}abort(t){const e=this.p.get("source-change");e&&t.triggers.add(e);const s=this.p.get("can-load");s&&!t.triggers.hasType("can-load")&&t.triggers.add(s)}"load-start"(t){const e=this.p.get("source-change");e&&t.triggers.add(e)}error(t){this.$state.error.set(t.detail);const e=this.p.get("abort");e&&t.triggers.add(e)}"loaded-metadata"(t){const e=this.p.get("load-start");e&&t.triggers.add(e)}"loaded-data"(t){const e=this.p.get("load-start");e&&t.triggers.add(e)}"can-play"(t){const e=this.p.get("loaded-metadata");e&&t.triggers.add(e),this.hf(t.detail),this.el?.setAttribute("aria-busy","false")}"can-play-through"(t){this.hf(t.detail);const e=this.p.get("can-play");e&&t.triggers.add(e)}hf(t){const{seekable:e,seekableEnd:s,buffered:i,duration:n,canPlay:r}=this.$state;r.set(!0),i.set(t.buffered),e.set(t.seekable),n.set(s())}"duration-change"(t){const{live:e,duration:s}=this.$state,i=t.detail;e()||s.set(Number.isNaN(i)?0:i)}progress(t){const{buffered:e,seekable:s,live:i,duration:n,seekableEnd:r}=this.$state,a=t.detail;e.set(a.buffered),s.set(a.seekable),i()&&(n.set(r),this.dispatch("duration-change",{detail:r(),trigger:t}))}play(t){const{paused:e,autoplayError:s,ended:i,autoplaying:n,playsinline:r,pointer:a,muted:h,viewType:o}=this.$state;if(t.autoplay=n(),this.f.Ha||!e())return void t.stopImmediatePropagation();const c=this.p.get("waiting");c&&t.triggers.add(c),this.F("play",t),this.p.set("play",t),e.set(!1),s.set(null),t.autoplay&&(this.X(this.createEvent("autoplay",{detail:{muted:h()},trigger:t})),n.set(!1)),(i()||this.f.gb)&&(this.f.gb=!1,i.set(!1),this.X(this.createEvent("replay",{trigger:t}))),r()||"video"!==o()||"coarse"!==a()||this.a.remote.enterFullscreen("prefer-media",t)}"play-fail"(t){const{muted:e,autoplaying:s}=this.$state,i=this.p.get("play");i&&t.triggers.add(i),this.F("play",t);const{paused:n,playing:r}=this.$state;n.set(!0),r.set(!1),this.ib(),this.p.set("play-fail",t),t.autoplay&&(this.X(this.createEvent("autoplay-fail",{detail:{muted:e(),error:t.detail},trigger:t})),s.set(!1))}playing(t){const e=this.p.get("play"),s=this.p.get("seeked");e?t.triggers.add(e):s&&t.triggers.add(s),setTimeout((()=>this.ib()),0);const{paused:i,playing:n,live:r,liveSyncPosition:a,seekableEnd:h,started:o,currentTime:c,seeking:l,ended:u}=this.$state;if(i.set(!1),n.set(!0),l.set(!1),u.set(!1),this.f.Ha)return t.stopImmediatePropagation(),void(this.f.Ha=!1);if(r()&&!o()&&0===c()){const t=a()??h()-2;Number.isFinite(t)&&this.a.$provider().setCurrentTime(t)}this.started(t)}started(t){const{started:e}=this.$state;e()||(e.set(!0),this.X(this.createEvent("started",{trigger:t})))}pause(t){if(this.el?.isConnected||(this.Jb=!0),this.f.Ha)return void t.stopImmediatePropagation();const e=this.p.get("seeked");e&&t.triggers.add(e),this.F("pause",t);const{paused:s,playing:i}=this.$state;s.set(!0),i.set(!1),this.ib()}"time-update"(t){const{currentTime:e,played:s,waiting:i}=this.$state,n=t.detail;e.set(n.currentTime),s.set(n.played),i.set(!1);for(const e of this.a.textTracks)e[r.T.Ta](n.currentTime,t)}"volume-change"(t){const{volume:e,muted:s}=this.$state,i=t.detail;e.set(i.volume),s.set(i.muted||0===i.volume),this.F("volume",t)}seeked(t){const{seeking:e,currentTime:s,paused:i,duration:n,ended:r}=this.$state;if(this.f.qa)e.set(!0),t.stopImmediatePropagation();else if(e()){const a=this.p.get("waiting");a&&t.triggers.add(a);const h=this.p.get("seeking");h&&!t.triggers.has(h)&&t.triggers.add(h),i()&&this.df(),e.set(!1),t.detail!==n()&&r.set(!1),s.set(t.detail),this.F("seeked",t);const o=t?.originEvent;o?.isTrusted&&!/seek/.test(o.type)&&this.started(t)}}waiting(t){this.tc||this.f.qa||(t.stopImmediatePropagation(),this.hb=t,this.zd())}end(t){const{loop:e}=this.$state;e()?setTimeout((()=>{requestAnimationFrame((()=>{this.dispatch("media-loop-request",{trigger:t})}))}),0):this.Db(t)}Db(t){const{paused:e,seeking:s,ended:i,duration:n}=this.$state;e()||this.dispatch("pause",{trigger:t}),s()&&this.dispatch("seeked",{detail:n(),trigger:t}),i.set(!0),this.ib(),this.dispatch("ended",{trigger:t})}df(){this.zd.cancel(),this.$state.waiting.set(!1)}"fullscreen-change"(t){this.$state.fullscreen.set(t.detail),this.F("fullscreen",t)}"fullscreen-error"(t){this.F("fullscreen",t)}"orientation-change"(t){this.F("orientation",t)}"picture-in-picture-change"(t){this.$state.pictureInPicture.set(t.detail),this.F("pip",t)}"picture-in-picture-error"(t){this.F("pip",t)}"title-change"(t){t.stopImmediatePropagation(),this.$state.inferredTitle.set(t.detail)}"poster-change"(t){t.stopImmediatePropagation(),this.$state.inferredPoster.set(t.detail)}}class it extends x{onSetup(){this.Ch(),(0,i.e)(this.Eh.bind(this)),(0,i.e)(this.uc.bind(this)),(0,i.e)(this.Fh.bind(this)),(0,i.e)(this.ld.bind(this)),(0,i.e)(this.Gh.bind(this)),(0,i.e)(this.Vc.bind(this)),(0,i.e)(this.Hh.bind(this)),(0,i.e)(this.Ad.bind(this)),(0,i.e)(this.Ih.bind(this)),(0,i.e)(this.Jh.bind(this)),(0,i.e)(this.Kh.bind(this))}Ch(){const t={poster:"providedPoster",streamType:"providedStreamType",title:"providedTitle",viewType:"providedViewType"};for(const e of Object.keys(this.$props))this.$state[t[e]??e]?.set(this.$props[e]());this.$state.muted.set(this.$props.muted()||0===this.$props.volume())}Eh(){const{viewType:t,streamType:e,title:s,poster:i}=this.$props;this.$state.providedPoster.set(i()),this.$state.providedStreamType.set(e()),this.$state.providedViewType.set(t()),this.$state.providedTitle.set(s())}Dh(){}uc(){const{title:t}=this.$state;this.dispatch("title-change",{detail:t()})}Fh(){const t=this.$props.autoplay();this.$state.autoplay.set(t),this.dispatch("autoplay-change",{detail:t})}Gh(){const t=this.$props.loop();this.$state.loop.set(t),this.dispatch("loop-change",{detail:t})}Vc(){const t=this.$props.controls();this.$state.controls.set(t)}ld(){const{poster:t}=this.$state;this.dispatch("poster-change",{detail:t()})}Hh(){const t=this.$props.crossorigin();this.$state.crossorigin.set(!0===t?"":t)}Ad(){const t=this.$props.playsinline();this.$state.playsinline.set(t),this.dispatch("playsinline-change",{detail:t})}Jh(){this.dispatch("live-change",{detail:this.$state.live()})}Ih(){this.$state.liveEdgeTolerance.set(this.$props.liveEdgeTolerance()),this.$state.minLiveDVRWindow.set(this.$props.minLiveDVRWindow())}Kh(){this.dispatch("live-edge-change",{detail:this.$state.liveEdge()})}}let nt=(0,i.m)(!1);(0,i.l)(document,"pointerdown",(()=>{nt.set(!1)})),(0,i.l)(document,"keydown",(t=>{t.metaKey||t.altKey||t.ctrlKey||nt.set(!0)}));class rt extends i.X{constructor(){super(...arguments),this.Kb=(0,i.m)(!1)}onConnect(t){(0,i.e)((()=>{if(!nt())return this.Kb.set(!1),at(t,!1),this.listen("pointerenter",this.Cd.bind(this)),void this.listen("pointerleave",this.Dd.bind(this));const e=document.activeElement===t;this.Kb.set(e),at(t,e),this.listen("focus",this.Lb.bind(this)),this.listen("blur",this.Nh.bind(this))}))}focused(){return this.Kb()}Lb(){this.Kb.set(!0),at(this.el,!0)}Nh(){this.Kb.set(!1),at(this.el,!1)}Cd(){ht(this.el,!0)}Dd(){ht(this.el,!1)}}function at(t,e){(0,i.k)(t,"data-focus",e),(0,i.k)(t,"data-hocus",e)}function ht(t,e){(0,i.k)(t,"data-hocus",e),(0,i.k)(t,"data-hover",e)}var ot=Object.defineProperty,ct=Object.getOwnPropertyDescriptor,lt=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?ct(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&ot(e,s,r),r};const ut=class t extends i.I{constructor(){super(),this.canPlayQueue=new X,this.wc=!1,new it;const t={player:this,scope:(0,i.g)(),qualities:new C,audioTracks:new L,$provider:(0,i.m)(null),$providerSetup:(0,i.m)(!1),$props:this.$props,$state:this.$state};t.remote=new k(void 0),t.remote.setPlayer(this),t.$iosControls=(0,i.n)(this.Oh.bind(this)),t.textTracks=new E,t.textTracks[r.T.Sa]=this.$state.crossorigin,t.textRenderers=new S(t),t.ariaKeys={},this.a=t,(0,i.Z)(n.m,t),this.orientation=new w,new rt,new q(t);const e=new Y;this.ga=new st(e,t),this.Y=new U(this.ga,e,t),t.delegate=new B(this.ga.X.bind(this.ga),t),new z(this.startLoading.bind(this))}static{this.props=Q}static{this.state=n.a}get i(){return this.a.$provider()}onSetup(){this.Ph(),(0,i.e)(this.Qh.bind(this)),(0,i.e)(this.Rh.bind(this)),(0,i.e)(this.Tc.bind(this)),(0,i.e)(this.Fd.bind(this)),(0,i.e)(this.jb.bind(this)),(0,i.e)(this.Ad.bind(this)),(0,i.e)(this.Sh.bind(this))}onAttach(t){t.setAttribute("data-media-player",""),(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","region"),(0,i.e)(this.uc.bind(this)),(0,i.e)(this.lf.bind(this)),(0,i.l)(t,"find-media-player",this.Th.bind(this))}onConnect(t){h.h&&(0,i.k)(t,"data-iphone",""),(0,h.c)().then(this.$state.canSetVolume.set);const e=window.matchMedia("(pointer: coarse)");this.mf(e),e.onchange=this.mf.bind(this);const s=new ResizeObserver((0,i.V)(this.O.bind(this)));s.observe(t),(0,i.e)(this.O.bind(this)),this.dispatch("media-player-connect",{detail:this,bubbles:!0,composed:!0}),(0,i.o)((()=>{s.disconnect(),e.onchange=null}))}onDestroy(){this.a.player=null,this.canPlayQueue.H()}uc(){if(this.wc)return void(this.wc=!1);const{title:t,live:e,viewType:s}=this.$state,n=e(),r=(0,i._)(s()),a="Unknown"!==r?`${n?"Live ":""}${r}`:n?"Live":"Media",h=t();(0,i.k)(this.el,"aria-label",h?`${a} - ${h}`:a+" Player"),this.el&&customElements.get(this.el.localName)&&(this.wc=!0),this.el?.removeAttribute("title")}lf(){const t=this.orientation.landscape?"landscape":"portrait";this.$state.orientation.set(t),(0,i.k)(this.el,"data-orientation",t),this.O()}Qh(){this.$state.canPlay()&&this.i?this.canPlayQueue.Bb():this.canPlayQueue.ra()}Ph(){if(t[W])return void this.setAttributes(t[W]);const e={"data-captions":function(){const t=this.$state.textTrack();return!!t&&(0,r.i)(t)},"data-ios-controls":function(){return this.a.$iosControls()},"data-controls":function(){return this.controls.showing},"data-buffering":function(){const{canPlay:t,waiting:e}=this.$state;return!t()||e()},"data-error":function(){const{error:t}=this.$state;return!!t()},"data-autoplay-error":function(){const{autoplayError:t}=this.$state;return!!t()}},s={canPictureInPicture:"can-pip",pictureInPicture:"pip"};for(const t of K)e["data-"+(s[t]??(0,i.K)(t))]=function(){return this.$state[t]()};delete e.title,t[W]=e,this.setAttributes(e)}Th(t){t.detail(this)}O(){if(!this.el)return;const t=this.el.clientWidth,e=this.el.clientHeight;this.$state.width.set(t),this.$state.height.set(e),(0,i.f)(this.el,"--player-width",t+"px"),(0,i.f)(this.el,"--player-height",e+"px")}mf(t){const e=t.matches?"coarse":"fine";(0,i.k)(this.el,"data-pointer",e),this.$state.pointer.set(e),this.O()}Oh(){const{playsinline:t,fullscreen:e}=this.$state;return h.h&&!m&&"video"===this.$state.mediaType()&&(!t()||e())}get provider(){return this.i}get controls(){return this.Y.Ib}get title(){return(0,i.p)(this.$state.providedTitle)}set title(t){this.wc||this.$state.providedTitle.set(t)}get qualities(){return this.a.qualities}get audioTracks(){return this.a.audioTracks}get textTracks(){return this.a.textTracks}get textRenderers(){return this.a.textRenderers}get paused(){return(0,i.p)(this.$state.paused)}set paused(t){this.nf(t)}Tc(){this.nf(this.$props.paused())}nf(t){t?this.canPlayQueue.k("paused",(()=>this.Y.ud())):this.canPlayQueue.k("paused",(()=>this.Y.sc()))}get muted(){return(0,i.p)(this.$state.muted)}set muted(t){this.$props.muted.set(t)}Rh(){this.Uh(this.$props.muted())}Uh(t){this.canPlayQueue.k("muted",(()=>{this.i&&this.i.setMuted(t)}))}get currentTime(){return(0,i.p)(this.$state.currentTime)}set currentTime(t){this.of(t)}jb(){this.of(this.$props.currentTime())}of(t){this.canPlayQueue.k("currentTime",(()=>{t!==(0,i.p)(this.$state.currentTime)&&(0,i.p)((()=>{if(!this.i)return;const e=Math.min(Math.max(this.$state.seekableStart()+.1,t),this.$state.seekableEnd()-.1);Number.isFinite(e)&&this.i.setCurrentTime(e)}))}))}get volume(){return(0,i.p)(this.$state.volume)}set volume(t){this.$props.volume.set(t)}Fd(){this.Vh(this.$props.volume())}Vh(t){const e=(0,c.d)(0,t,1);this.canPlayQueue.k("volume",(()=>{this.i&&this.i.setVolume(e)}))}get playbackRate(){return(0,i.p)(this.$state.playbackRate)}set playbackRate(t){this.pf(t)}Sh(){this.pf(this.$props.playbackRate())}pf(t){this.canPlayQueue.k("rate",(()=>{this.i&&this.i.setPlaybackRate?.(t)}))}Ad(){this.Wh(this.$props.playsinline())}Wh(t){this.canPlayQueue.k("playsinline",(()=>{this.i&&this.i.setPlaysinline?.(t)}))}async play(t){return this.Y.sc(t)}async pause(t){return this.Y.ud(t)}async enterFullscreen(t,e){return this.Y._e(t,e)}async exitFullscreen(t,e){return this.Y.af(t,e)}enterPictureInPicture(t){return this.Y.xd(t)}exitPictureInPicture(t){return this.Y.wd(t)}seekToLiveEdge(t){this.Y.Ze(t)}startLoading(t){this.a.delegate.c("can-load",void 0,t)}matchQuery(t){return(0,i.s)((()=>n.P.create(t)),this.scope)}destroy(){this.a.remote.setPlayer(null),this.dispatch("destroy")}};lt([i.$],ut.prototype,"canPlayQueue",2),lt([i.$],ut.prototype,"provider",1),lt([i.$],ut.prototype,"controls",1),lt([i.$],ut.prototype,"orientation",2),lt([i.$],ut.prototype,"title",1),lt([i.$],ut.prototype,"qualities",1),lt([i.$],ut.prototype,"audioTracks",1),lt([i.$],ut.prototype,"textTracks",1),lt([i.$],ut.prototype,"textRenderers",1),lt([i.$],ut.prototype,"paused",1),lt([i.$],ut.prototype,"muted",1),lt([i.$],ut.prototype,"currentTime",1),lt([i.$],ut.prototype,"volume",1),lt([i.$],ut.prototype,"playbackRate",1),lt([i.a0],ut.prototype,"play",1),lt([i.a0],ut.prototype,"pause",1),lt([i.a0],ut.prototype,"enterFullscreen",1),lt([i.a0],ut.prototype,"exitFullscreen",1),lt([i.a0],ut.prototype,"enterPictureInPicture",1),lt([i.a0],ut.prototype,"exitPictureInPicture",1),lt([i.a0],ut.prototype,"seekToLiveEdge",1),lt([i.a0],ut.prototype,"startLoading",1),lt([i.a0],ut.prototype,"matchQuery",1);let dt=ut;function pt(t,e){return fetch(t,e).then((t=>t.text())).then((s=>{const i=function(t){const e=t.match(/#EXT-X-STREAM-INF:[^\n]+(\n[^\n]+)*/g);return e?e[0].split("\n")[1].trim():null}(s);if(i)return pt(/^https?:/.test(i)?i:new URL(i,t).href,e);const n=/EXT-X-PLAYLIST-TYPE:\s*VOD/.test(s)?"on-demand":"live";return"live"===n&&function(t){const e=t.split("\n");for(const t of e)if(t.startsWith("#EXT-X-TARGETDURATION")){const e=parseFloat(t.split(":")[1]);if(!isNaN(e))return e}return-1}(s)>=10&&(/#EXT-X-DVR-ENABLED:\s*true/.test(s)||s.includes("#EXT-X-DISCONTINUITY"))?"live:dvr":n}))}const ft=new Map;class gt{constructor(t,e,s,n=[]){this.xc=t,this.a=e,this.ha=s,this.Gd=!1;const r=new V,a=new R,h=new F,o=[new N,new H];this.Hd=(0,i.n)((()=>e.$props.preferNativeHLS()?[a,h,r,...o,...n]:[r,a,h,...o,...n]));const{$state:c}=e;c.sources.set(bt(e.$props.src()));for(const t of c.sources()){const e=this.Hd().find((e=>e.canPlay(t)));if(!e)continue;const s=e.mediaType(t);this.a.$state.source.set(t),this.a.$state.mediaType.set(s),this.a.$state.inferredViewType.set(s),this.ha.set(e),this.Gd=!0}}get c(){return this.a.delegate.c}connect(){const t=this.ha();this.Gd&&(this.qf(this.a.$state.source(),t),this.rf(t),this.Gd=!1),(0,i.e)(this.Xh.bind(this)),(0,i.e)(this.Yh.bind(this)),(0,i.e)(this.Zh.bind(this)),(0,i.e)(this._h.bind(this))}Xh(){this.c("sources-change",[...bt(this.a.$props.src()),...this.xc()])}Yh(){const{$state:t}=this.a,e=t.sources(),s=(0,i.p)(t.source),n=this.sf(s,e);if(e[0]?.src&&!n.src&&!n.type){const{crossorigin:s}=t,n=(0,r.g)(s()),a=new AbortController;return Promise.all(e.map((t=>(0,i.r)(t.src)&&"?"===t.type?fetch(t.src,{method:"HEAD",credentials:n,signal:a.signal}).then((e=>(t.type=e.headers.get("content-type")||"??",ft.set(t.src,t.type),t))).catch((()=>t)):t))).then((e=>{a.signal.aborted||(this.sf((0,i.p)(t.source),e),(0,i.P)())})),()=>a.abort()}(0,i.P)()}sf(t,e){let s={src:"",type:""},n=null;for(const t of e){const e=(0,i.p)(this.Hd).find((e=>e.canPlay(t)));e&&(s=t,n=e)}return mt(t,s)||this.qf(s,n),n!==(0,i.p)(this.ha)&&this.rf(n),s}qf(t,e){this.c("source-change",t),this.c("media-type-change",e?.mediaType(t)||"unknown")}rf(t){this.a.$providerSetup.set(!1),this.c("provider-change",null),t&&(0,i.p)((()=>t.preconnect?.(this.a))),this.ha.set(t),this.c("provider-loader-change",t)}Zh(){const t=this.a.$provider();if(t&&!(0,i.p)(this.a.$providerSetup))return this.a.$state.canLoad()?((0,i.s)((()=>t.setup(this.a)),t.scope),void this.a.$providerSetup.set(!0)):void(0,i.p)((()=>t.preconnect?.(this.a)))}_h(){if(!this.a.$providerSetup())return;const t=this.a.$provider(),e=this.a.$state.source(),s=(0,i.p)(this.a.$state.crossorigin);if(!mt(t?.currentSrc,e)){if(this.a.$state.canLoad()){const n=new AbortController;return(0,c.i)(e)?(0,h.i)()||pt(e.src,{credentials:(0,r.g)(s),signal:n.signal}).then((t=>{this.c("stream-type-change",t)})).catch(i.a1):this.c("stream-type-change","on-demand"),(0,i.p)((()=>t?.loadSource(e,(0,i.p)(this.a.$state.preload)))),()=>n.abort()}try{(0,i.r)(e.src)&&(0,r.p)(new URL(e.src).origin,"preconnect")}catch(t){}}}}function bt(t){return((0,i.w)(t)?t:[!(0,i.r)(t)&&"src"in t?t:{src:t}]).map((({src:t,type:e,...s})=>({src:t,type:e??((0,i.r)(t)?ft.get(t):null)??(!(0,i.r)(t)||t.startsWith("blob:")?"video/object":t.includes("youtube")?"video/youtube":t.includes("vimeo")?"video/vimeo":"?"),...s})))}function mt(t,e){return t?.src===e?.src&&t?.type===e?.type}class yt{constructor(t,e){this.yc=t,this.a=e,this.tf=[],(0,i.e)(this.$h.bind(this))}$h(){const t=this.yc();for(const e of this.tf)if(!t.some((t=>t.id===e.id))){const t=e.id&&this.a.textTracks.getById(e.id);t&&this.a.textTracks.remove(t)}for(const e of t){const t=e.id||r.b.createId(e);this.a.textTracks.getById(t)||(e.id=t,this.a.textTracks.add(e))}this.tf=t}}var $t=Object.defineProperty,vt=Object.getOwnPropertyDescriptor;class wt extends i.I{constructor(){super(...arguments),this.xc=(0,i.m)([]),this.yc=(0,i.m)([]),this.ha=null,this.Id=-1}static{this.props={loaders:[]}}static{this.state=new i.S({loader:null})}onSetup(){this.a=(0,n.u)(),this.uf=new gt(this.xc,this.a,this.$state.loader,this.$props.loaders())}onAttach(t){t.setAttribute("data-media-provider","")}onConnect(t){this.uf.connect(),new yt(this.yc,this.a);const e=new ResizeObserver((0,i.V)(this.O.bind(this)));e.observe(t);const s=new MutationObserver(this.vf.bind(this));s.observe(t,{attributes:!0,childList:!0}),this.O(),this.vf(),(0,i.o)((()=>{e.disconnect(),s.disconnect()}))}load(t){window.cancelAnimationFrame(this.Id),this.Id=requestAnimationFrame((()=>this.ai(t))),(0,i.o)((()=>{window.cancelAnimationFrame(this.Id)}))}ai(t){if(!this.scope)return;const e=this.$state.loader(),{$provider:s}=this.a;this.ha===e&&e?.target===t&&(0,i.p)(s)||(this.wf(),this.ha=e,e&&(e.target=t||null),e&&t&&e.load(this.a).then((t=>{this.scope&&(0,i.p)(this.$state.loader)===e&&this.a.delegate.c("provider-change",t)})))}onDestroy(){this.ha=null,this.wf()}wf(){this.a.delegate.c("provider-change",null)}O(){if(!this.el)return;const t=this.a.player,e=this.el.offsetWidth,s=this.el.offsetHeight;t&&(t.$state.mediaWidth.set(e),t.$state.mediaHeight.set(s),t.el&&((0,i.f)(t.el,"--media-width",e+"px"),(0,i.f)(t.el,"--media-height",s+"px")))}vf(){const t=[],e=[],s=this.el.children;for(const i of s)i instanceof HTMLSourceElement?t.push({src:i.src,type:i.type}):i instanceof HTMLTrackElement&&e.push({id:i.id,src:i.src,kind:i.track.kind,language:i.srclang,label:i.label,default:i.default,type:i.getAttribute("data-type")});this.xc.set(t),this.yc.set(e),(0,i.P)()}}((t,e,s,i)=>{for(var n,r=vt(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&$t(e,s,r)})([i.a0],wt.prototype,"load");class kt extends i.I{static{this.props={hideDelay:2e3,hideOnMouseLeave:!1}}onSetup(){this.a=(0,n.u)(),(0,i.e)(this.bi.bind(this))}onAttach(t){const{pictureInPicture:e,fullscreen:s}=this.a.$state;(0,i.f)(t,"pointer-events","none"),(0,a.s)(t,"role","group"),this.setAttributes({"data-visible":this.xf.bind(this),"data-fullscreen":s,"data-pip":e}),(0,i.e)((()=>{this.dispatch("change",{detail:this.xf()})})),(0,i.e)(this.ci.bind(this)),(0,i.e)((()=>{const e=s();for(const s of["top","right","bottom","left"])(0,i.f)(t,`padding-${s}`,e&&`env(safe-area-inset-${s})`)}))}ci(){if(!this.el)return;const{$iosControls:t}=this.a,{controls:e}=this.a.$state,s=e()||t();(0,i.k)(this.el,"aria-hidden",s?"true":null),(0,i.f)(this.el,"display",s?"none":null)}bi(){const{controls:t}=this.a.player,{hideDelay:e,hideOnMouseLeave:s}=this.$props;t.defaultDelay=2e3===e()?this.a.$props.controlsDelay():e(),t.hideOnMouseLeave=s()}xf(){const{controlsVisible:t}=this.a.$state;return t()}}class xt extends i.X{constructor(t){super(),this.j=t,this.Ac=-1,this.Bc=-1,this.Ia=null,(0,i.e)(this.di.bind(this))}onDestroy(){this.Ia?.(),this.Ia=null}di(){const t=this.j.C();if(!t)return void this.hide();const e=this.show.bind(this),s=this.hide.bind(this);this.j.zc(t,e,s)}show(t){window.cancelAnimationFrame(this.Bc),this.Bc=-1,this.Ia?.(),this.Ia=null,this.Ac=window.setTimeout((()=>{this.Ac=-1;const e=this.j.u();e&&e.style.removeProperty("display"),(0,i.p)((()=>this.j.B(!0,t)))}),this.j.yf?.()??0)}hide(t){window.clearTimeout(this.Ac),this.Ac=-1,(0,i.p)((()=>this.j.B(!1,t))),this.Bc=requestAnimationFrame((()=>{this.Bc=-1;const t=this.j.u();if(t){const e=()=>{t.style.display="none",this.Ia=null};if((0,a.h)(t)){this.Ia?.();const s=(0,i.l)(t,"animationend",e,{once:!0});this.Ia=s}else e()}}))}}const Tt=(0,i.Q)();let Pt=0;class St extends i.I{constructor(){super(),this.ca="media-tooltip-"+ ++Pt,this.C=(0,i.m)(null),this.u=(0,i.m)(null),new rt;const{showDelay:t}=this.$props;new xt({C:this.C,u:this.u,yf:t,zc(t,e,s){(0,i.l)(t,"touchstart",(t=>t.preventDefault()),{passive:!1}),(0,i.l)(t,"focus",e),(0,i.l)(t,"blur",s),(0,i.l)(t,"mouseenter",e),(0,i.l)(t,"mouseleave",s)},B:this.ei.bind(this)})}static{this.props={showDelay:500}}onAttach(t){t.style.setProperty("display","contents")}onSetup(){(0,i.Z)(Tt,{C:this.C,u:this.u,Jd:this.Jd.bind(this),Kd:this.Kd.bind(this),Ld:this.Ld.bind(this),Md:this.Md.bind(this)})}Jd(t){this.C.set(t);let e=t.getAttribute("data-media-tooltip");e&&this.el?.setAttribute(`data-media-${e}-tooltip`,""),(0,i.k)(t,"data-describedby",this.ca)}Kd(t){t.removeAttribute("data-describedby"),t.removeAttribute("aria-describedby"),this.C.set(null)}Ld(t){t.setAttribute("id",this.ca),t.style.display="none",(0,a.s)(t,"role","tooltip"),this.u.set(t)}Md(t){t.removeAttribute("id"),t.removeAttribute("role"),this.u.set(null)}ei(t){const e=this.C(),s=this.u();e&&(0,i.k)(e,"aria-describedby",t?this.ca:null);for(const n of[this.el,e,s])n&&(0,i.k)(n,"data-visible",t)}}class Et extends i.I{static{this.props={placement:"top center",offset:0,alignOffset:0}}constructor(){super(),new rt;const{placement:t}=this.$props;this.setAttributes({"data-placement":t})}onAttach(t){this.Ja(t),Object.assign(t.style,{position:"absolute",top:0,left:0,width:"max-content"})}onConnect(t){this.Ja(t);const e=(0,i.J)(Tt);(0,i.o)((()=>e.Md(t))),(0,i.o)((0,a.r)((()=>{this.connectScope&&(0,i.e)(this.Nd.bind(this))})))}Ja(t){(0,i.J)(Tt).Ld(t)}Nd(){const{placement:t,offset:e,alignOffset:s}=this.$props;return(0,a.d)(this.el,this.fi(),t(),{offsetVarName:"media-tooltip",xOffset:s(),yOffset:e()})}fi(){return(0,i.J)(Tt).C()}}class At extends i.X{constructor(t){super(),this.j=t,new rt,t.kb&&new I(t.kb)}static{this.props={disabled:!1}}onSetup(){const{disabled:t}=this.$props;this.setAttributes({"data-pressed":this.j.n,"aria-pressed":this.gi.bind(this),"aria-disabled":()=>t()?"true":null})}onAttach(t){(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","button"),(0,a.s)(t,"type","button")}onConnect(t){(0,a.o)(t,this.hi.bind(this));for(const t of["click","touchstart"])this.listen(t,this.ii.bind(this))}gi(){return(0,i.a2)(this.j.n())}ji(t){(0,i.a3)(this.j.n)&&this.j.n.set((t=>!t))}hi(t){if(this.$props.disabled()||this.el.hasAttribute("data-disabled"))return t.preventDefault(),void t.stopImmediatePropagation();t.preventDefault(),(this.j.v??this.ji).call(this,t)}ii(t){this.$props.disabled()&&(t.preventDefault(),t.stopImmediatePropagation())}}var jt=Object.defineProperty,Lt=Object.getOwnPropertyDescriptor;class Ct extends i.I{constructor(){super(),this.zf=(0,i.m)(!1),new At({n:this.zf})}static{this.props={disabled:!1,defaultPressed:!1}}get pressed(){return this.zf()}}((t,e,s,i)=>{for(var n,r=Lt(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&jt(e,s,r)})([i.$],Ct.prototype,"pressed");class Ot extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"togglePaused",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)();const{paused:t,ended:e}=this.a.$state;this.setAttributes({"data-paused":t,"data-ended":e})}onAttach(t){t.setAttribute("data-media-tooltip","play"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote;this.n()?e.pause(t):e.play(t)}n(){const{paused:t}=this.a.$state;return!t()}Z(){const{paused:t}=this.a.$state;return t()?"Play":"Pause"}}function Mt(t){return()=>t()?"true":"false"}class qt extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"toggleCaptions",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)(),this.setAttributes({"data-active":this.n.bind(this),"data-supported":()=>!this.lb(),"aria-hidden":Mt(this.lb.bind(this))})}onAttach(t){t.setAttribute("data-media-tooltip","caption"),(0,a.e)(t,this.Z.bind(this))}v(t){this.a.remote.toggleCaptions(t)}n(){const{textTrack:t}=this.a.$state,e=t();return!!e&&(0,r.i)(e)}lb(){const{textTracks:t}=this.a.$state;return 0==t().filter(r.i).length}Z(){const{textTrack:t}=this.a.$state;return t()?"Closed-Captions Off":"Closed-Captions On"}}class Dt extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"toggleFullscreen",v:this.v.bind(this)})}static{this.props={...At.props,target:"prefer-media"}}onSetup(){this.a=(0,n.u)();const{fullscreen:t}=this.a.$state,e=this.Nb.bind(this);this.setAttributes({"data-active":t,"data-supported":e,"aria-hidden":Mt((()=>!e()))})}onAttach(t){t.setAttribute("data-media-tooltip","fullscreen"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote,s=this.$props.target();this.n()?e.exitFullscreen(s,t):e.enterFullscreen(s,t)}n(){const{fullscreen:t}=this.a.$state;return t()}Nb(){const{canFullscreen:t}=this.a.$state;return t()}Z(){const{fullscreen:t}=this.a.$state;return t()?"Exit Fullscreen":"Enter Fullscreen"}}class It extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"toggleMuted",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)(),this.setAttributes({"data-muted":this.n.bind(this),"data-state":this.ki.bind(this)})}onAttach(t){t.setAttribute("data-media-mute-button",""),t.setAttribute("data-media-tooltip","mute"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote;this.n()?e.unmute(t):e.mute(t)}n(){const{muted:t,volume:e}=this.a.$state;return t()||0===e()}Z(){return this.n()?"Unmute":"Mute"}ki(){const{muted:t,volume:e}=this.a.$state,s=e();return t()||0===s?"muted":s>=.5?"high":s<.5?"low":void 0}}class Ft extends i.I{constructor(){super(),new At({n:this.n.bind(this),kb:"togglePictureInPicture",v:this.v.bind(this)})}static{this.props=At.props}onSetup(){this.a=(0,n.u)();const{pictureInPicture:t}=this.a.$state,e=this.Nb.bind(this);this.setAttributes({"data-active":t,"data-supported":e,"aria-hidden":Mt((()=>!e()))})}onAttach(t){t.setAttribute("data-media-tooltip","pip"),(0,a.e)(t,this.Z.bind(this))}v(t){const e=this.a.remote;this.n()?e.exitPictureInPicture(t):e.enterPictureInPicture(t)}n(){const{pictureInPicture:t}=this.a.$state;return t()}Nb(){const{canPictureInPicture:t}=this.a.$state;return t()}Z(){const{pictureInPicture:t}=this.a.$state;return t()?"Exit Picture In Picture":"Enter Picture In Picture"}}class Rt extends i.I{constructor(){super(),new rt}static{this.props={disabled:!1,seconds:30}}onSetup(){this.a=(0,n.u)();const{seeking:t}=this.a.$state,{seconds:e}=this.$props,s=this.Nb.bind(this);this.setAttributes({seconds:e,"data-seeking":t,"data-supported":s,"aria-hidden":Mt((()=>!s()))})}onAttach(t){(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","button"),(0,a.s)(t,"type","button"),t.setAttribute("data-media-tooltip","seek"),(0,a.e)(t,this.Z.bind(this))}onConnect(t){(0,a.o)(t,this.v.bind(this))}Nb(){const{canSeek:t}=this.a.$state;return t()}Z(){const{seconds:t}=this.$props;return`Seek ${t()>0?"forward":"backward"} ${t()} seconds`}v(t){const{seconds:e,disabled:s}=this.$props;if(s())return;const{currentTime:i}=this.a.$state,n=i()+e();this.a.remote.seek(n,t)}}class Nt extends i.I{constructor(){super(),new rt}static{this.props={disabled:!1}}onSetup(){this.a=(0,n.u)();const{disabled:t}=this.$props,{live:e,liveEdge:s}=this.a.$state,i=()=>!e();this.setAttributes({"data-edge":s,"data-hidden":i,"aria-disabled":Mt((()=>t()||s())),"aria-hidden":Mt(i)})}onAttach(t){(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"role","button"),(0,a.s)(t,"type","button"),t.setAttribute("data-media-tooltip","live")}onConnect(t){(0,a.o)(t,this.v.bind(this))}v(t){const{disabled:e}=this.$props,{liveEdge:s}=this.a.$state;e()||s()||this.a.remote.seekToLiveEdge(t)}}const Vt=new i.S({min:0,max:100,value:0,pointerValue:0,focused:!1,dragging:!1,pointing:!1,get active(){return this.dragging||this.focused||this.pointing},get fillRate(){return Ht(this.min,this.max,this.value)},get fillPercent(){return 100*this.fillRate},get pointerRate(){return Ht(this.min,this.max,this.pointerValue)},get pointerPercent(){return 100*this.pointerRate}});function Ht(t,e,s){const i=e-t;return i>0?(s-t)/i:0}const Wt={Left:-1,ArrowLeft:-1,Up:1,ArrowUp:1,Right:1,ArrowRight:1,Down:-1,ArrowDown:-1};class Kt extends i.X{constructor(t,e){super(),this.j=t,this.a=e,this.i=null,this.ua=null,this.mb=null,this.ti=tt((t=>{this.va(this.Dc(t),t)}),20,{leading:!0})}onConnect(){if((0,i.e)(this.li.bind(this)),(0,i.e)(this.mi.bind(this)),this.j.ni){const t=this.a.player.el?.querySelector("media-provider,[data-media-provider]");t&&(this.i=t,(0,i.l)(t,"touchstart",this.oi.bind(this),{passive:!0}),(0,i.l)(t,"touchmove",this.pi.bind(this),{passive:!1}))}}oi(t){this.ua=t.touches[0]}pi(t){if((0,i.N)(this.ua)||(0,a.i)(t))return;const e=t.touches[0],s=e.clientX-this.ua.clientX,n=e.clientY-this.ua.clientY,r=this.$state.dragging();!r&&Math.abs(n)>20||r||Math.abs(s)>20&&(this.ua=e,this.mb=this.$state.value(),this.Od(this.mb,t))}li(){this.j.K()||(this.listen("focus",this.Lb.bind(this)),this.listen("pointerenter",this.Cd.bind(this)),this.listen("pointermove",this.qi.bind(this)),this.listen("pointerleave",this.Dd.bind(this)),this.listen("pointerdown",this.ri.bind(this)),this.listen("keydown",this.Ab.bind(this)),this.listen("keyup",this.zb.bind(this)))}mi(){!this.j.K()&&this.$state.dragging()&&((0,i.l)(document,"pointerup",this.si.bind(this)),(0,i.l)(document,"pointermove",this.ti.bind(this)),h.g&&(0,i.l)(document,"touchmove",this.ui.bind(this),{passive:!1}))}Lb(){this.va(this.$state.value())}Pd(t,e){const{value:s,min:i,max:n,dragging:r}=this.$state,a=Math.max(i(),Math.min(t,n()));s.set(a);const h=this.createEvent("value-change",{detail:a,trigger:e});if(this.dispatch(h),this.j.o?.(h),r()){const t=this.createEvent("drag-value-change",{detail:a,trigger:e});this.dispatch(t),this.j.nb?.(t)}}va(t,e){const{pointerValue:s,dragging:i}=this.$state;s.set(t),this.dispatch("pointer-value-change",{detail:t,trigger:e}),i()&&this.Pd(t,e)}Dc(t){let e,s=this.el.getBoundingClientRect(),{min:n,max:r}=this.$state;if("vertical"===this.$props.orientation()){const{bottom:i,height:n}=s;e=(i-t.clientY)/n}else if(this.ua&&(0,i.a)(this.mb)){const{width:s}=this.i.getBoundingClientRect(),i=(t.clientX-this.ua.clientX)/s,a=r()-n(),h=a*Math.abs(i);e=(i<0?this.mb-h:this.mb+h)/a}else{const{left:i,width:n}=s;e=(t.clientX-i)/n}return Math.max(n(),Math.min(r(),this.j.Ob(function(t,e,s,i){return t+i*((e-t)*(0,c.d)(0,s,1)/i)}(n(),r(),e,this.j.Ka()))))}Cd(t){this.$state.pointing.set(!0)}qi(t){const{dragging:e}=this.$state;e()||this.va(this.Dc(t),t)}Dd(t){this.$state.pointing.set(!1)}ri(t){if(0!==t.button)return;const e=this.Dc(t);this.Od(e,t),this.va(e,t)}Od(t,e){const{dragging:s}=this.$state;if(s())return;s.set(!0),this.a.remote.pauseControls(e);const i=this.createEvent("drag-start",{detail:t,trigger:e});this.dispatch(i),this.j.Qd?.(i)}Af(t,e){const{dragging:s}=this.$state;if(!s())return;s.set(!1),this.a.remote.resumeControls(e);const i=this.createEvent("drag-end",{detail:t,trigger:e});this.dispatch(i),this.j.Ec?.(i),this.ua=null,this.mb=null}Ab(t){const{key:e}=t,{min:s,max:n}=this.$state;let r;if("Home"===e||"PageUp"===e?r=s():"End"===e||"PageDown"===e?r=n():!t.metaKey&&/[0-9]/.test(e)&&(r=(n()-s())/10*Number(e)),!(0,i.i)(r))return this.va(r,t),void this.Pd(r,t);const a=this.Bf(t);if((0,i.i)(a))return;const h=e===this.Rd;!this.$state.dragging()&&h&&this.Od(a,t),this.va(a,t),h||this.Pd(a,t),this.Rd=e}zb(t){this.Rd="";const{dragging:e,value:s}=this.$state;if(!e())return;const i=this.Bf(t)??s();this.va(i),this.Af(i,t)}Bf(t){const{key:e,shiftKey:s}=t;if(!Object.keys(Wt).includes(e))return;t.preventDefault(),t.stopPropagation();const{shiftKeyMultiplier:i}=this.$props,{value:n,min:r,max:a}=this.$state,h=this.j.Ka(),o=this.j.Pb(),c=(s?o*i():o)*Number(Wt[e]),l=(n()+c)/h;return Math.max(r(),Math.min(a(),Number((h*l).toFixed(3))))}si(t){if(0!==t.button)return;const e=this.Dc(t);this.va(e,t),this.Af(e,t)}ui(t){t.preventDefault()}}const Qt=(0,i.Q)((()=>({}))),zt=(0,i.Q)();class Bt extends i.X{constructor(t){super(),this.j=t,this.xi=(0,i.V)(((t,e)=>{this.el?.style.setProperty("--slider-fill",t+"%"),this.el?.style.setProperty("--slider-pointer",e+"%")}))}static{this.props={disabled:!1,step:1,keyStep:1,orientation:"horizontal",shiftKeyMultiplier:5}}onSetup(){this.a=(0,n.u)();const t=new rt;t.attach(this),this.$state.focused=t.focused.bind(t),(0,i.a4)(Qt)||(0,i.Z)(Qt,{default:"value"}),(0,i.Z)(zt,{ta:this.$props.orientation,Fc:this.j.K,Cf:(0,i.m)(null)}),(0,i.e)(this.D.bind(this)),(0,i.e)(this.Qb.bind(this)),this.vi(),new Kt(this.j,this.a).attach(this)}onAttach(t){(0,a.s)(t,"role","slider"),(0,a.s)(t,"tabindex","0"),(0,a.s)(t,"autocomplete","off"),(0,i.e)(this.Df.bind(this))}D(){const{dragging:t,value:e,min:s,max:n}=this.$state;(0,i.p)(t)||e.set(function(t,e,s,i){return(0,c.d)(t,(0,c.r)(s,(0,c.g)(i)),e)}(s(),n(),e(),this.j.Ka()))}Qb(){if(!this.j.K())return;const{dragging:t,pointing:e}=this.$state;t.set(!1),e.set(!1)}wi(){return(0,i.a2)(this.j.K())}vi(){const{orientation:t}=this.$props,{dragging:e,active:s,pointing:i}=this.$state;this.setAttributes({"data-dragging":e,"data-pointing":i,"data-active":s,"aria-disabled":this.wi.bind(this),"aria-valuemin":this.$state.min,"aria-valuemax":this.$state.max,"aria-valuenow":this.j.ia,"aria-valuetext":this.j.ja,"aria-orientation":t})}Df(){const{fillPercent:t,pointerPercent:e}=this.$state;this.xi((0,c.r)(t(),3),(0,c.r)(e(),3))}}class Jt extends i.I{static{this.props={...Bt.props,min:0,max:100,value:0}}static{this.state=Vt}constructor(){super(),new Bt({Ka:this.$props.step,Pb:this.$props.keyStep,Ob:Math.round,K:this.$props.disabled,ia:this.ia.bind(this),ja:this.ja.bind(this)})}onSetup(){(0,i.e)(this.D.bind(this)),(0,i.e)(this.yi.bind(this))}ia(){const{value:t}=this.$state;return Math.round(t())}ja(){const{value:t,max:e}=this.$state;return(0,c.r)(t()/e()*100,2)+"%"}D(){const{value:t}=this.$props;this.$state.value.set(t())}yi(){const{min:t,max:e}=this.$props;this.$state.min.set(t()),this.$state.max.set(e())}}const Xt=new Map,Ut=new Set,Zt=new Set;class _t{constructor(t,e){this.$src=t,this.a=e,this.$cues=(0,i.m)([]),(0,i.e)(this.zi.bind(this)),Zt.add(this),(0,i.o)((()=>Zt.delete(this)))}static create(t){const e=(0,n.u)();return new _t(t,e)}zi(){const{canLoad:t}=this.a.$state;if(!t())return;const e=new AbortController,{crossorigin:i}=this.a.$state,n=this.$src();if(n){if(Xt.has(n)){const t=Xt.get(n);if(Xt.delete(n),Xt.set(n,t),Xt.size>30){const t=Xt.keys().next().value;Xt.delete(t)}this.$cues.set(Xt.get(n))}else Ut.has(n)||(Ut.add(n),s.e(1264).then(s.bind(s,1264)).then((async({parseResponse:t})=>{try{const s=await fetch(n,{signal:e.signal,credentials:(0,r.g)(i())});if("application/json"===s.headers.get("content-type")){try{const{cues:t}=(0,r.c)(await s.text(),window.VTTCue);this.Ef(n,t)}catch(t){}return}const{cues:a}=await t(s);this.Ef(n,a)}catch(t){}})));return()=>{e.abort(),this.$cues.set([])}}}Ef(t,e){this.$cues.set(e);for(const s of Zt)(0,i.p)(s.$src)===t&&s.$cues.set(e);Xt.set(t,e),Ut.delete(t)}}class Yt extends i.I{constructor(){super(...arguments),this.Td=[],this.Ff=(0,i.V)(this.Fi.bind(this))}static{this.props={src:"",time:0}}static{this.state=new i.S({src:"",img:null,coords:null,activeCue:null,loading:!1,error:null,hidden:!1})}onSetup(){this.a=(0,n.u)(),this.Sd=_t.create(this.$props.src),this.setAttributes({"data-loading":this.Rb.bind(this),"data-error":this.wa.bind(this),"data-hidden":this.$state.hidden,"aria-hidden":Mt(this.$state.hidden)})}onConnect(t){(0,i.e)(this.Ud.bind(this)),(0,i.e)(this.ob.bind(this)),(0,i.e)(this.Ea.bind(this)),(0,i.e)(this.Ai.bind(this)),(0,i.e)(this.Bi.bind(this))}Ud(){const t=this.$state.img();t&&((0,i.l)(t,"load",this.qd.bind(this)),(0,i.l)(t,"error",this.U.bind(this)))}Ea(){const{src:t,loading:e,error:s}=this.$state;t(),e.set(!0),s.set(null)}qd(){const{loading:t,error:e}=this.$state;t.set(!1),e.set(null),this.Ff()}U(t){const{loading:e,error:s}=this.$state;e.set(!1),s.set(t)}Rb(){const{loading:t,hidden:e}=this.$state;return!e()&&t()}wa(){const{error:t}=this.$state;return!(0,i.N)(t())}ob(){const{hidden:t}=this.$state,{duration:e}=this.a.$state,s=this.Sd.$cues();t.set(this.wa()||!Number.isFinite(e())||0===s.length)}Gf(){return this.$props.time()}Ai(){const t=this.Gf(),{activeCue:e}=this.$state,{duration:s}=this.a.$state,i=this.Sd.$cues();i&&Number.isFinite(s())?e.set((0,r.f)(i,t)):e.set(null)}Bi(){let{activeCue:t}=this.$state,e=t(),s=(0,i.p)(this.$props.src);if(/^https?:/.test(s)||(s=location.href),!s||!e)return this.$state.src.set(""),void this.Ci();const[n,r=""]=(e.text||"").split("#");this.$state.coords.set(this.Di(r)),this.$state.src.set(this.Ei(n,s)),this.Ff()}Ei(t,e){return/^https?:/.test(t)?t:new URL(t,e).href}Di(t){const[e,s]=t.split("="),i={},n=s?.split(",");if(!e||!s)return null;for(let t=0;t1?o:1;this.pb(this.el,"--thumbnail-width",s*l+"px"),this.pb(this.el,"--thumbnail-height",i*l+"px"),this.pb(t,"width",t.naturalWidth*l+"px"),this.pb(t,"height",t.naturalHeight*l+"px"),this.pb(t,"transform",e?`translate(-${e.x*l}px, -${e.y*l}px)`:""),this.pb(t,"max-width","none")}pb(t,e,s){t.style.setProperty(e,s),this.Td.push((()=>t.style.removeProperty(e)))}Ci(){for(const t of this.Td)t();this.Td=[]}}var Gt=Object.defineProperty,te=Object.getOwnPropertyDescriptor;class ee extends i.I{static{this.props={src:null}}static{this.state=new i.S({video:null,src:null,canPlay:!1,error:null,hidden:!1})}get video(){return this.$state.video()}onSetup(){this.a=(0,n.u)(),this.Q=(0,i.z)(Jt.state),this.setAttributes({"data-loading":this.Rb.bind(this),"data-hidden":this.$state.hidden,"data-error":this.wa.bind(this),"aria-hidden":Mt(this.$state.hidden)})}onAttach(t){(0,i.e)(this.Gi.bind(this)),(0,i.e)(this.fd.bind(this)),(0,i.e)(this.ob.bind(this)),(0,i.e)(this.Hi.bind(this)),(0,i.e)(this.Ii.bind(this))}Gi(){const t=this.$state.video();t&&(t.readyState>=2&&this.hc(),(0,i.l)(t,"canplay",this.hc.bind(this)),(0,i.l)(t,"error",this.U.bind(this)))}fd(){const{src:t}=this.$state,{canLoad:e}=this.a.$state;t.set(e()?this.$props.src():null)}Rb(){const{canPlay:t,hidden:e}=this.$state;return!t()&&!e()}wa(){const{error:t}=this.$state;return!(0,i.N)(t)}ob(){const{src:t,hidden:e}=this.$state,{canLoad:s,duration:i}=this.a.$state;e.set(s()&&(!t()||this.wa()||!Number.isFinite(i())))}Hi(){const{src:t,canPlay:e,error:s}=this.$state;t(),e.set(!1),s.set(null)}hc(t){const{canPlay:e,error:s}=this.$state;e.set(!0),s.set(null),this.dispatch("can-play",{trigger:t})}U(t){const{canPlay:e,error:s}=this.$state;e.set(!1),s.set(t),this.dispatch("error",{trigger:t})}Ii(){const{video:t,canPlay:e}=this.$state,{duration:s}=this.a.$state,{pointerRate:i}=this.Q,n=t();e()&&n&&Number.isFinite(s())&&Number.isFinite(i())&&(n.currentTime=i()*s())}}function se(t,e){const s=String(t),i=s.length;return i=3600?se(a,2):a,l=se(h,2);return r>0||n?`${o}:${c}:${l}`:`${c}:${l}`}function re(t){const e=[],{hours:s,minutes:i,seconds:n}=ie(t);return s>0&&e.push(`${s} hour`),i>0&&e.push(`${i} min`),(n>0||0===e.length)&&e.push(`${n} sec`),e.join(" ")}((t,e,s,i)=>{for(var n,r=te(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&Gt(e,s,r)})([i.$],ee.prototype,"video");var ae=Object.defineProperty,he=Object.getOwnPropertyDescriptor;class oe extends i.I{static{this.props={type:"pointer",format:null,showHours:!1,padHours:null,padMinutes:null,decimalPlaces:2}}onSetup(){this.Q=(0,i.z)(Jt.state),this.Sb=(0,i.J)(Qt),this.Ji=(0,i.n)(this.getValueText.bind(this))}getValueText(){const{type:t,format:e,decimalPlaces:s,padHours:i,padMinutes:n,showHours:r}=this.$props,{value:a,pointerValue:h,min:o,max:l}=this.Q,u=e()??this.Sb.default,d="current"===t()?a():h();if("percent"===u){const t=d/(l()-o())*100;return(this.Sb.percent??c.r)(t,s())+"﹪"}return"time"===u?(this.Sb.time??ne)(d,i(),n(),r()):this.Sb.value?.(d)??d.toFixed(2)}}((t,e,s,i)=>{for(var n,r=he(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&ae(e,s,r)})([i.a0],oe.prototype,"getValueText");class ce extends i.I{static{this.props={offset:0,noClamp:!1}}onSetup(){this.Q=(0,i.J)(zt);const{active:t}=(0,i.z)(Jt.state);this.setAttributes({"data-visible":t})}onAttach(t){Object.assign(t.style,{position:"absolute",top:0,left:0,width:"max-content"})}onConnect(t){const{Cf:e}=this.Q;e.set(t),(0,i.o)((()=>e.set(null))),(0,i.e)(this.Hf.bind(this));const s=new ResizeObserver(this.Hf.bind(this));s.observe(t),(0,i.o)((()=>s.disconnect()))}Hf(){const{Fc:t,ta:e}=this.Q;if(t())return;const s=this.el,{offset:i,noClamp:n}=this.$props;!function(t,{clamp:e,offset:s,orientation:i}){const{width:n,height:r}=t.getBoundingClientRect(),a={top:null,right:null,bottom:null,left:null};if(a["horizontal"===i?"bottom":"left"]=`calc(100% + var(--media-slider-preview-offset, ${s}px))`,"horizontal"===i){const t=n/2;if(e){const e=`max(0px, calc(var(--slider-pointer) - ${t}px))`,s=`calc(100% - ${n}px)`;a.left=`min(${e}, ${s})`}else a.left=`calc(var(--slider-pointer) - ${t}px)`}else{const t=r/2;if(e){const e=`max(${t}px, calc(var(--slider-pointer) - ${t}px))`,s=`calc(100% - ${r}px)`;a.bottom=`min(${e}, ${s})`}else a.bottom=`calc(var(--slider-pointer) - ${t}px)`}Object.assign(t.style,a)}(s,{clamp:!n(),offset:i(),orientation:e()})}}class le extends i.I{constructor(){super(...arguments),this.If=tt(this.ab.bind(this),25)}static{this.props={...Bt.props,keyStep:5,shiftKeyMultiplier:2}}static{this.state=Vt}onSetup(){this.a=(0,n.u)(),(0,i.Z)(Qt,{default:"percent"}),new Bt({Ka:this.$props.step,Pb:this.$props.keyStep,K:this.$props.disabled,Ob:Math.round,ia:this.ia.bind(this),ja:this.ja.bind(this),nb:this.nb.bind(this),o:this.o.bind(this)}).attach(this),(0,i.e)(this.Fd.bind(this))}onAttach(t){t.setAttribute("data-media-volume-slider",""),(0,a.s)(t,"aria-label","Volume");const{canSetVolume:e}=this.a.$state;this.setAttributes({"data-supported":e,"aria-hidden":Mt((()=>!e()))})}ia(){const{value:t}=this.$state;return Math.round(t())}ja(){const{value:t,max:e}=this.$state;return(0,c.r)(t()/e()*100,2)+"%"}Fd(){const{muted:t,volume:e}=this.a.$state,s=t()?0:100*e();this.$state.value.set(s),this.dispatch("value-change",{detail:s})}ab(t){if(!t.trigger)return;const e=(0,c.r)(t.detail/100,3);this.a.remote.changeVolume(e,t)}o(t){this.If(t)}nb(t){this.If(t)}}class ue extends i.I{constructor(){super(),this.Jf=(0,i.m)(null),this.Wd=!1,new Bt({ni:!0,Ka:this.Ka.bind(this),Pb:this.Pb.bind(this),K:this.K.bind(this),Ob:this.Ob,ia:this.ia.bind(this),ja:this.ja.bind(this),Qd:this.Qd.bind(this),nb:this.nb.bind(this),Ec:this.Ec.bind(this),o:this.o.bind(this)})}static{this.props={...Bt.props,step:.1,keyStep:5,shiftKeyMultiplier:2,pauseWhileDragging:!1,seekingRequestThrottle:100}}static{this.state=Vt}onSetup(){this.a=(0,n.u)(),(0,i.Z)(Qt,{default:"time",value:this.Ki.bind(this),time:this.Li.bind(this)}),this.setAttributes({"data-chapters":this.Mi.bind(this)}),this.setStyles({"--slider-progress":this.Ni.bind(this)}),(0,i.e)(this.jb.bind(this)),(0,i.e)(this.Oi.bind(this))}onAttach(t){t.setAttribute("data-media-time-slider",""),(0,a.s)(t,"aria-label","Seek")}onConnect(t){(0,i.e)(this.Pi.bind(this)),(0,r.o)(this.a.textTracks,"chapters",this.Jf.set)}Ni(){const{bufferedEnd:t,duration:e}=this.a.$state;return(0,c.r)(100*Math.min(t()/Math.max(e(),1),1),3)+"%"}Mi(){const{duration:t}=this.a.$state;return this.Jf()?.cues.length&&Number.isFinite(t())&&t()>0}Oi(){this.Vd=tt(this.qa.bind(this),this.$props.seekingRequestThrottle())}jb(){const{currentTime:t}=this.a.$state,{value:e,dragging:s}=this.$state,n=this.Qi(t());(0,i.p)(s)||(e.set(n),this.dispatch("value-change",{detail:n}))}Pi(){const t=this.a.player.el,{Cf:e}=(0,i.J)(zt);t&&e()&&(0,i.k)(t,"data-preview",this.$state.active())}qa(t,e){this.a.remote.seeking(t,e)}Ri(t,e,s){this.Vd.cancel();const{live:i}=this.a.$state;i()&&e>=99?this.a.remote.seekToLiveEdge(s):this.a.remote.seek(t,s)}Qd(t){const{pauseWhileDragging:e}=this.$props;if(e()){const{paused:e}=this.a.$state;this.Wd=!e(),this.a.remote.pause(t)}}nb(t){this.Vd(this.Tb(t.detail),t)}Ec(t){const e=t.detail;this.Ri(this.Tb(e),e,t);const{pauseWhileDragging:s}=this.$props;s()&&this.Wd&&(this.a.remote.play(t),this.Wd=!1)}o(t){const{dragging:e}=this.$state;!e()&&t.trigger&&this.Ec(t)}Ka(){const t=this.$props.step()/this.a.$state.duration()*100;return Number.isFinite(t)?t:1}Pb(){const t=this.$props.keyStep()/this.a.$state.duration()*100;return Number.isFinite(t)?t:1}Ob(t){return(0,c.r)(t,3)}K(){const{canSeek:t}=this.a.$state;return this.$props.disabled()||!t()}ia(){const{value:t}=this.$state;return Math.round(t())}ja(){const t=this.Tb(this.$state.value()),{duration:e}=this.a.$state;return Number.isFinite(t)?`${re(t)} out of ${re(e())}`:"live"}Tb(t){const{duration:e}=this.a.$state;return(0,c.r)(t/100*e(),5)}Qi(t){const{liveEdge:e,duration:s}=this.a.$state,i=Math.max(0,Math.min(1,e()?1:Math.min(t,s())/s()));return Number.isNaN(i)?0:Number.isFinite(i)?100*i:100}Ki(t){const e=this.Tb(t),{live:s,duration:i}=this.a.$state;return Number.isFinite(e)?(s()?e-i():e).toFixed(0):"LIVE"}Li(t,e,s,i){const n=this.Tb(t),{live:r,duration:a}=this.a.$state,h=r()?n-a():n;return Number.isFinite(n)?`${h<0?"-":""}${ne(Math.abs(h),e,s,i)}`:"LIVE"}}var de=Object.defineProperty,pe=Object.getOwnPropertyDescriptor,fe=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?pe(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&de(e,s,r),r};class ge extends i.I{constructor(){super(...arguments),this.La=null,this.R=[],this.Gc=(0,i.m)(null),this._=(0,i.m)([]),this.Ub=(0,i.m)(-1),this.Hc=(0,i.m)(-1),this.Zd=0,this.Xi=(0,i.V)((t=>{let e,s=this._();for(let i=this.Zd;i{const t=(0,i.p)(this.Gc);this.scope&&t&&t.cues.length&&(this._.set(this._i(t.cues)),this.Ub.set(0))}),150,!0)}static{this.props={disabled:!1}}get cues(){return this._()}get activeCue(){return this._()[this.Ub()]||null}get activePointerCue(){return this._()[this.Hc()]||null}onSetup(){this.a=(0,n.u)(),this.Xd=(0,i.z)(ue.state)}onAttach(t){(0,r.o)(this.a.textTracks,"chapters",this.Kf.bind(this)),(0,i.e)(this._d.bind(this))}onConnect(){(0,i.o)((()=>this.H.bind(this)))}onDestroy(){this.Kf(null)}setRefs(t){if(this.R=t,this.Yd?.dispose(),1===this.R.length){const t=this.R[0];t.style.width="100%",t.style.setProperty("--chapter-fill","var(--slider-fill)"),t.style.setProperty("--chapter-progress","var(--slider-progress)")}else this.R.length>0&&(0,i.s)((()=>this.Si()),this.Yd=(0,i.q)())}Kf(t){(0,i.p)(this.Gc)!==t&&(this.H(),this.Gc.set(t))}H(){this.R=[],this._.set([]),this.Ub.set(-1),this.Hc.set(-1),this.Zd=0,this.Yd?.dispose()}Si(){this.R.length&&((0,i.e)(this.Ti.bind(this)),(0,i.e)(this.Ui.bind(this)),(0,i.e)(this.Vi.bind(this)),(0,i.e)(this.Wi.bind(this)))}Ti(){let t,e=this._(),s=e[e.length-1].endTime;for(let i=0;ih?this.$d(h,c,"100%"):c=0&&s<100)return n;return 0}Wi(){this.Xi(this.Yi())}Zi(){const{bufferedEnd:t,duration:e}=this.a.$state;return 100*(0,c.r)(Math.min(t()/Math.max(e(),1),1),3)}ae(t,e){const s=this._();if(0===s.length)return 0;const i=s[s.length-1],n=t.startTime/i.endTime*100,r=t.endTime/i.endTime*100;return Math.max(0,(0,c.r)(e>=r?100:(e-n)/(r-n)*100,3))}_i(t){const e=[];0!==t[0].startTime&&e.push(new window.VTTCue(0,t[0].startTime,""));for(let s=0;s0&&e.push(new window.VTTCue(i.endTime,i.endTime+t,""))}}return e.push(t[t.length-1]),e}_d(){if(!this.scope)return;const{disabled:t}=this.$props;if(t())return;const e=this.Gc();if(e){const t=this.$i.bind(this);t(),(0,i.o)((0,i.l)(e,"add-cue",t)),(0,i.o)((0,i.l)(e,"remove-cue",t))}return this.La=this.aj(),this.La&&(0,i.e)(this.bj.bind(this)),()=>{this.La&&(this.La.textContent="",this.La=null)}}bj(){const t=this.activePointerCue||this.activeCue;this.La&&(this.La.textContent=t?.text||"")}cj(){let t=this.el;for(;t&&"slider"!==t.getAttribute("role");)t=t.parentElement;return t}aj(){const t=this.cj();return t?t.querySelector('[data-part="chapter-title"]'):null}}fe([i.$],ge.prototype,"cues",1),fe([i.$],ge.prototype,"activeCue",1),fe([i.$],ge.prototype,"activePointerCue",1),fe([i.a0],ge.prototype,"setRefs",1);const be=(0,i.Q)(),me=["a[href]","[tabindex]","input","select","button"].map((t=>`${t}:not([aria-hidden])`)).join(","),ye=new Set(["Escape","Tab","ArrowUp","ArrowDown","Home","PageUp","End","PageDown","Enter"," "]);class $e{constructor(t){this.j=t,this.ka=0,this.xa=null,this.da=[]}get r(){return this.da}Nf(t){return(0,i.l)(t,"focus",this.Lb.bind(this)),this.xa=t,(0,i.o)((()=>{this.xa=null})),this}zc(){this.xa&&(this.ea(),(0,i.l)(this.xa,"keyup",this.zb.bind(this)),(0,i.l)(this.xa,"keydown",this.Ab.bind(this)),(0,i.o)((()=>{this.ka=0,this.da=[]})))}ea(){this.ka=0,this.da=this.dj()}Of(t=this.Pf()){const e=this.da[t],s=this.j.ej();e&&s&&requestAnimationFrame((()=>{s.scrollTop=e.offsetTop-s.offsetHeight/2+e.offsetHeight/2}))}qb(t){this.ka=t,this.da[t]?.focus(),this.Of(t)}Pf(){return this.da.findIndex((t=>"true"===t.getAttribute("aria-checked")))}Lb(){this.ea(),setTimeout((()=>{const t=this.Pf();this.qb(t>=0?t:0)}),100)}zb(t){ye.has(t.key)&&(t.stopPropagation(),t.preventDefault())}Ab(t){if(ye.has(t.key))switch(t.stopPropagation(),t.preventDefault(),t.key){case"Escape":this.j.fj(t);break;case"Tab":this.qb(this.be(t.shiftKey?-1:1));break;case"ArrowUp":this.qb(this.be(-1));break;case"ArrowDown":this.qb(this.be(1));break;case"Home":case"PageUp":this.qb(0);break;case"End":case"PageDown":this.qb(this.da.length-1)}}be(t){let e=this.ka;do{e=(e+t+this.da.length)%this.da.length}while(null===this.da[e]?.offsetParent);return e}dj(){if(!this.xa)return[];const t=this.xa.querySelectorAll(me),e=[],s=t=>"menu"===t.getAttribute("role");for(const i of t)i instanceof HTMLElement&&null!==i.offsetParent&&(0,a.f)(this.xa,i,s)&&e.push(i);return e}}var ve=Object.defineProperty,we=Object.getOwnPropertyDescriptor,ke=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?we(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&ve(e,s,r),r};let xe=0;class Te extends i.I{constructor(){super(),this.L=(0,i.m)(!1),this.Fc=(0,i.m)(!1),this.C=(0,i.m)(null),this.u=(0,i.m)(null),this.Qf=(0,i.m)(!1),this.Vb=new Set,this.Ic=null,this.rj=this.sj.bind(this),this.pj=this.tj.bind(this),this.qj=this.uj.bind(this);const{showDelay:t}=this.$props;this.Jc=new xt({C:this.C,u:this.u,yf:t,zc:(t,e,s)=>{(0,a.o)(t,(t=>{this.L()?s(t):e(t)}));const i=this.gj();i&&(0,a.o)(i,(t=>{t.stopPropagation(),s(t)}))},B:this.hj.bind(this)})}static{this.props={showDelay:0}}get triggerElement(){return this.C()}get contentElement(){return this.u()}get isSubmenu(){return!!this.ee}onSetup(){this.a=(0,n.u)();const t=++xe;this.ce=`media-menu-${t}`,this.de=`media-menu-button-${t}`,this.rb=new $e({ej:this.ij.bind(this),fj:this.close.bind(this)}),(0,i.a4)(be)&&(this.ee=(0,i.J)(be)),this.setAttributes({"data-open":this.L,"data-submenu":this.isSubmenu,"data-disabled":this.K.bind(this)}),(0,i.Z)(be,{jj:this.C,L:this.L,Wb:(0,i.m)(""),Ma:this.Ma.bind(this),fe:this.fe.bind(this),ge:this.ge.bind(this),he:this.he.bind(this),ie:this.ie.bind(this),je:this.je.bind(this)})}onAttach(t){t.style.setProperty("display","contents"),this.rb.Nf(t)}onConnect(t){(0,i.e)(this.kj.bind(this)),this.isSubmenu&&this.ee?.je(this),requestAnimationFrame((()=>{this.O()}))}onDestroy(){this.C.set(null),this.u.set(null),this.Ic=null}kj(){const t=this.lj();this.O(),this.Rf(t),t&&((0,i.e)((()=>{const{height:t}=this.a.$state,e=this.u();e&&(0,i.f)(e,"--player-height",t()+"px")})),this.rb.zc(),this.listen("pointerup",this.mj.bind(this)),(0,i.l)(window,"pointerup",this.nj.bind(this)))}fe(t){const e=t.el,s=this.isSubmenu,n=Mt(this.K.bind(this));(0,a.s)(e,"tabindex",s?"-1":"0"),(0,a.s)(e,"role",s?"menuitem":"button"),(0,i.k)(e,"id",this.de),(0,i.k)(e,"aria-haspopup","menu"),(0,i.k)(e,"aria-expanded","false"),(0,i.k)(e,"data-submenu",this.isSubmenu),this.isSubmenu||this.Sf(e),(0,i.e)((()=>{(0,i.k)(e,"data-open",this.L()),(0,i.k)(e,"aria-disabled",n())})),this.C.set(e),(0,i.o)((()=>{this.C.set(null)}))}ge(t){const e=t.el;e.style.setProperty("display","none"),(0,i.k)(e,"id",this.ce),(0,a.s)(e,"role","menu"),(0,a.s)(e,"tabindex","-1"),(0,i.k)(e,"data-submenu",this.isSubmenu),this.u.set(e),(0,i.o)((()=>this.u.set(null))),this.isSubmenu||this.Sf(e),(0,i.e)((()=>{(0,i.k)(e,"data-open",this.L())})),this.rb.Nf(e),this.Rf(!1);{const t=(0,i.V)(this.O.bind(this)),s=new MutationObserver(t);t(),s.observe(e,{childList:!0,subtree:!0}),(0,i.o)((()=>s.disconnect()))}}he(t){this.Ic=t}Sf(t){(0,i.l)(t,"click",(t=>t.stopPropagation())),(0,i.l)(t,"pointerup",(t=>t.stopPropagation()))}Rf(t){const e=(0,i.p)(this.u);e&&(0,i.k)(e,"aria-hidden",(0,i.a2)(!t))}ie(t){this.Qf.set(t)}hj(t,e){if(e?.stopPropagation(),this.L()===t)return;if(this.K())return void(t&&this.Jc.hide(e));const s=this.C(),n=this.u();if(s&&((0,i.k)(s,"aria-controls",t&&this.ce),(0,i.k)(s,"aria-expanded",(0,i.a2)(t))),n&&(0,i.k)(n,"aria-labelledby",t&&this.de),this.L.set(t),this.oj(e),(0,i.P)(),(0,i.G)(e)){t?n?.focus():s?.focus();for(const t of[this.el,n])t&&t.setAttribute("data-keyboard","")}else for(const t of[this.el,n])t&&t.removeAttribute("data-keyboard");this.dispatch(t?"open":"close",{trigger:e}),t?(this.isSubmenu||this.a.activeMenu===this||(this.a.activeMenu?.close(e),this.a.activeMenu=this),this.Ic?.ke?.(e)):(this.isSubmenu?setTimeout((()=>{for(const t of this.Vb)t.close(e)}),300):this.a.activeMenu=null,this.Ic?.Tj?.(e)),t&&!(0,i.G)(e)&&requestAnimationFrame((()=>{this.rb.ea(),setTimeout((()=>{this.rb.Of()}),100)}))}lj(){return!this.K()&&this.L()}K(){return this.Fc()||this.Qf()}Ma(t){this.Fc.set(t)}mj(t){t.stopPropagation()}nj(t){if(this.isSubmenu)return setTimeout(this.close.bind(this,t),800);this.close(t)}gj(){const t=this.el.querySelector('[data-part="close-target"]');return(0,a.f)(this.el,t,(t=>"menu"===t.getAttribute("role")))?t:null}ij(){if(this.isSubmenu){let t=this.el;for(;t&&"media-menu"!==t.tagName&&t.hasAttribute("data-submenu");)t=t.parentNode;return t}return(0,i.p)(this.u)||null}oj(t){this.isSubmenu||(this.L()?this.a.remote.pauseControls(t):this.a.remote.resumeControls(t))}je(t){this.Vb.add(t),(0,i.l)(t,"open",this.pj),(0,i.l)(t,"close",this.qj),(0,i.o)(this.rj)}sj(t){this.Vb.delete(t)}tj(t){for(const e of this.Vb)if(e!==t.target)for(const t of[e.el,e.triggerElement])t?.setAttribute("aria-hidden","true");requestAnimationFrame((()=>{this.O()}))}uj(){for(const t of this.Vb)for(const e of[t.el,t.triggerElement])e?.setAttribute("aria-hidden","false");requestAnimationFrame((()=>{this.O()}))}O(){const t=(0,i.p)(this.u);if(!t)return;let{paddingTop:e,paddingBottom:s,borderTopWidth:n,borderBottomWidth:r}=getComputedStyle(t),a=parseFloat(e)+parseFloat(s)+parseFloat(n)+parseFloat(r),h=[...t.children];for(const t of h)t instanceof HTMLElement&&"contents"===t.style.display?h.push(...t.children):3===t.nodeType?a+=parseInt(window.getComputedStyle(t).fontSize,10):a+=t.offsetHeight||0;requestAnimationFrame((()=>{t&&((0,i.k)(t,"data-resizing",""),setTimeout((()=>{t&&(0,i.k)(t,"data-resizing",!1)}),400),(0,i.f)(t,"--menu-height",a+"px"))}))}open(t){(0,i.p)(this.L)||(this.Jc.show(t),(0,i.P)())}close(t){(0,i.p)(this.L)&&(this.Jc.hide(t),(0,i.P)())}}ke([i.$],Te.prototype,"triggerElement",1),ke([i.$],Te.prototype,"contentElement",1),ke([i.$],Te.prototype,"isSubmenu",1),ke([i.a0],Te.prototype,"open",1),ke([i.a0],Te.prototype,"close",1);var Pe=Object.defineProperty,Se=Object.getOwnPropertyDescriptor;class Ee extends i.I{constructor(){super(),new rt}static{this.props={disabled:!1}}get expanded(){return this.l?.L()??!1}onSetup(){this.l=(0,i.J)(be)}onAttach(t){this.l.fe(this),(0,i.e)(this.Qb.bind(this)),(0,a.s)(t,"type","button")}onConnect(t){const e=Array.from(t.querySelectorAll('[data-part="hint"]')).pop();e&&(0,i.e)((()=>{const t=this.l.Wb();t&&(e.textContent=t)})),(0,a.o)(t,(t=>{this.dispatch("select",{trigger:t})}))}Qb(){this.l.ie(this.$props.disabled())}}((t,e,s,i)=>{for(var n,r=Se(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&Pe(e,s,r)})([i.$],Ee.prototype,"expanded");class Ae extends i.I{constructor(){super(...arguments),this.A=null}static{this.props={container:null,disabled:!1}}onSetup(){this.a=(0,n.u)(),(0,i.Z)(je,{Ja:this.vj.bind(this)})}onAttach(t){t.style.setProperty("display","contents")}onConnect(t){}onDestroy(){this.A?.remove(),this.A=null}vj(t){this.Tf(!1),this.A=t,(0,a.r)((()=>{(0,a.r)((()=>{this.connectScope&&(0,i.e)(this.Qb.bind(this))}))}))}Qb(){const{fullscreen:t}=this.a.$state,{disabled:e}=this.$props,s=e();this.Tf("fullscreen"===s?!t():!s)}Tf(t){if(!this.A)return;let e=this.wj(this.$props.container());if(!e)return;const s=this.A.parentElement===e;(0,i.k)(this.A,"data-portal",t),t?s||(this.A.remove(),e.append(this.A)):s&&this.A.parentElement===e&&(this.A.remove(),this.el?.append(this.A))}wj(t){return t instanceof HTMLElement?t:t?document.querySelector(t):document.body}}const je=(0,i.Q)();class Le extends i.I{constructor(){super(),new rt;const{placement:t}=this.$props;this.setAttributes({"data-placement":t})}static{this.props={placement:null,offset:0,alignOffset:0}}onAttach(t){if(this.l=(0,i.J)(be),this.l.ge(this),(0,i.a4)(je)){const e=(0,i.J)(je);e&&((0,i.Z)(je,null),e.Ja(t),(0,i.o)((()=>e.Ja(null))))}}onConnect(t){(0,i.e)(this.Nd.bind(this))}Nd(){if(!this.el)return;const t=this.$props.placement();if(t){Object.assign(this.el.style,{position:"absolute",top:0,left:0,width:"max-content"});const{offset:e,alignOffset:s}=this.$props;return(0,a.d)(this.el,this.Cc(),t,{offsetVarName:"media-menu",xOffset:s(),yOffset:e()})}this.el.removeAttribute("style"),this.el.style.display="none"}Cc(){return this.l.jj()}}const Ce=(0,i.Q)();class Oe extends i.X{constructor(){super(...arguments),this.sb=new Set,this.la=(0,i.m)(""),this.d=null,this.Aj=this.B.bind(this)}get xj(){return Array.from(this.sb).map((t=>t.la()))}get value(){return this.la()}set value(t){this.B(t)}onSetup(){(0,i.Z)(Ce,{add:this.yj.bind(this),remove:this.zj.bind(this)})}onAttach(t){(0,i.a4)(be)||(0,a.s)(t,"role","radiogroup"),this.setAttributes({value:this.la})}onDestroy(){this.sb.clear()}yj(t){this.sb.has(t)||(this.sb.add(t),t.Kc=this.Aj,t.Xb(t.la()===this.la()))}zj(t){t.Kc=null,this.sb.delete(t)}B(t,e){const s=(0,i.p)(this.la);if(!t||t===s)return;const n=this.Uf(s),r=this.Uf(t);n?.Xb(!1,e),r?.Xb(!0,e),this.la.set(t),this.o?.(t,e)}Uf(t){for(const e of this.sb)if(t===(0,i.p)(e.la))return e;return null}}var Me=Object.defineProperty,qe=Object.getOwnPropertyDescriptor,De=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?qe(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Me(e,s,r),r};class Ie extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={value:""}}get values(){return this.d.xj}get value(){return this.d.value}set value(t){this.d.value=t}onSetup(){(0,i.e)(this.D.bind(this))}D(){this.d.value=this.$props.value()}o(t,e){const s=this.createEvent("change",{detail:t,trigger:e});this.dispatch(s)}}De([i.$],Ie.prototype,"values",1),De([i.$],Ie.prototype,"value",1);var Fe=Object.defineProperty,Re=Object.getOwnPropertyDescriptor;class Ne extends i.I{constructor(){super(),this.Na=(0,i.m)(!1),this.d={la:this.$props.value,Xb:this.Xb.bind(this),Kc:null},new rt}static{this.props={value:""}}get checked(){return this.Na()}onSetup(){this.setAttributes({value:this.$props.value,"data-checked":this.Na,"aria-checked":Mt(this.Na)})}onAttach(t){const e=(0,i.a4)(be);(0,a.s)(t,"tabindex",e?"-1":"0"),(0,a.s)(t,"role",e?"menuitemradio":"radio"),(0,i.e)(this.D.bind(this))}onConnect(t){this.Bj(),(0,a.o)(t,this.v.bind(this)),(0,i.o)(this.ya.bind(this))}ya(){(0,i.s)((()=>{(0,i.J)(Ce).remove(this.d)}),this.connectScope)}Bj(){(0,i.J)(Ce).add(this.d)}D(){const{value:t}=this.$props,e=t();(0,i.p)(this.Na)&&this.d.Kc?.(e)}v(t){(0,i.p)(this.Na)||(this.B(!0,t),this.Cj(t),this.d.Kc?.((0,i.p)(this.$props.value),t))}Xb(t,e){(0,i.p)(this.Na)!==t&&this.B(t,e)}B(t,e){this.Na.set(t),this.dispatch("change",{detail:t,trigger:e})}Cj(t){this.dispatch("select",{trigger:t})}}((t,e,s,i)=>{for(var n,r=Re(e,s),a=t.length-1;a>=0;a--)(n=t[a])&&(r=n(e,s,r)||r);r&&Fe(e,s,r)})([i.$],Ne.prototype,"checked");var Ve=Object.defineProperty,He=Object.getOwnPropertyDescriptor,We=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?He(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Ve(e,s,r),r};class Ke extends i.I{constructor(){super(),this.ka=(0,i.m)(0),this.z=(0,i.m)(null),this.J=(0,i.m)([]),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={thumbnails:""}}get value(){return this.d.value}get disabled(){return!this.J()?.length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be));const{thumbnails:t}=this.$props;this.setAttributes({"data-thumbnails":()=>!!t()})}onAttach(t){this.l?.he({ke:this.ke.bind(this)})}getOptions(){return this.J().map(((t,e)=>({cue:t,value:e+"",label:t.text,startTime:ne(t.startTime,!1),duration:re(t.endTime-t.startTime)})))}ke(){(0,i.p)((()=>this.jb()))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.jb.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.tk.bind(this)),(0,r.o)(this.a.textTracks,"chapters",this.z.set)}tk(){const t=this.z();if(!t)return;const e=this.$i.bind(this,t);return e(),(0,i.l)(t,"add-cue",e),(0,i.l)(t,"remove-cue",e),()=>{this.J.set([])}}$i(t){this.J.set([...t.cues])}D(){this.d.value=this.na()}jb(){if(!this.l?.L())return;const t=this.z();if(!t)return void this.ka.set(-1);const{currentTime:e}=this.a.$state,s=e(),n=t.cues.findIndex((t=>(0,r.d)(t,s)));if(this.ka.set(n),n>=0){const e=t.cues[n],r=this.el.querySelector("[aria-checked='true']"),a=(s-e.startTime)/(e.endTime-e.startTime)*100;r&&(0,i.f)(r,"--progress",(0,c.r)(a,3)+"%")}}ma(){this.l?.Ma(this.disabled)}na(){return this.ka()+""}o(t,e){if(this.disabled||!e)return;const s=+t,n=this.z()?.cues;(0,i.a)(s)&&n?.[s]&&(this.ka.set(s),this.a.remote.seek(n[s].startTime,e),this.dispatch("change",{detail:n[s],trigger:e}))}}We([i.$],Ke.prototype,"value",1),We([i.$],Ke.prototype,"disabled",1),We([i.a0],Ke.prototype,"getOptions",1);var Qe=Object.defineProperty,ze=Object.getOwnPropertyDescriptor,Be=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?ze(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Qe(e,s,r),r};class Je extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={emptyLabel:"Default"}}get value(){return this.d.value}get disabled(){const{audioTracks:t}=this.a.$state;return 0===t().length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.Oa.bind(this))}getOptions(){const{audioTracks:t}=this.a.$state;return t().map((t=>({track:t,label:t.label,value:t.label.toLowerCase()})))}D(){this.d.value=this.na()}Oa(){const{emptyLabel:t}=this.$props,{audioTrack:e}=this.a.$state,s=e();this.l?.Wb.set(s?.label??t())}ma(){this.l?.Ma(this.disabled)}na(){const{audioTrack:t}=this.a.$state,e=t();return e?e.label.toLowerCase():""}o(t,e){if(this.disabled)return;const s=this.a.audioTracks.toArray().findIndex((e=>e.label.toLowerCase()===t));if(s>=0){const t=this.a.audioTracks[s];this.a.remote.changeAudioTrack(s,e),this.dispatch("change",{detail:t,trigger:e})}}}Be([i.$],Je.prototype,"value",1),Be([i.$],Je.prototype,"disabled",1),Be([i.a0],Je.prototype,"getOptions",1);var Xe=Object.defineProperty,Ue=Object.getOwnPropertyDescriptor,Ze=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?Ue(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Xe(e,s,r),r};class _e extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={offLabel:"Off"}}get value(){return this.d.value}get disabled(){const{textTracks:t}=this.a.$state;return 0===t().filter(r.i).length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){super.onConnect?.(t),(0,i.e)(this.D.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.Oa.bind(this))}getOptions(){const{offLabel:t}=this.$props,{textTracks:e}=this.a.$state;return[{value:"off",label:t},...e().filter(r.i).map((t=>({track:t,label:t.label,value:this.xk(t)})))]}D(){this.d.value=this.na()}Oa(){const{offLabel:t}=this.$props,{textTrack:e}=this.a.$state,s=e();this.l?.Wb.set(s&&(0,r.i)(s)&&"showing"===s.mode?s.label:t())}ma(){this.l?.Ma(this.disabled)}na(){const{textTrack:t}=this.a.$state,e=t();return e&&(0,r.i)(e)&&"showing"===e.mode?this.xk(e):"off"}o(t,e){if(this.disabled)return;if("off"===t){const t=this.a.textTracks.selected;if(t){const s=this.a.textTracks.toArray().indexOf(t);this.a.remote.changeTextTrackMode(s,"disabled",e),this.dispatch("change",{detail:null,trigger:e})}return}const s=this.a.textTracks.toArray().findIndex((e=>this.xk(e)===t));if(s>=0){const t=this.a.textTracks[s];this.a.remote.changeTextTrackMode(s,"showing",e),this.dispatch("change",{detail:t,trigger:e})}}xk(t){return t.id+":"+t.kind+"-"+t.label.toLowerCase()}}Ze([i.$],_e.prototype,"value",1),Ze([i.$],_e.prototype,"disabled",1),Ze([i.a0],_e.prototype,"getOptions",1);var Ye=Object.defineProperty,Ge=Object.getOwnPropertyDescriptor,ts=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?Ge(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&Ye(e,s,r),r};class es extends i.I{constructor(){super(),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={normalLabel:"Normal",rates:[.25,.5,.75,1,1.25,1.5,1.75,2]}}get value(){return this.d.value}get disabled(){const{rates:t}=this.$props,{canSetPlaybackRate:e}=this.a.$state;return!e()||0===t().length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.Oa.bind(this)),(0,i.e)(this.ma.bind(this))}getOptions(){const{rates:t,normalLabel:e}=this.$props;return t().map((t=>({label:1===t?e:t+"×",value:t+""})))}D(){this.d.value=this.na()}Oa(){const{normalLabel:t}=this.$props,{playbackRate:e}=this.a.$state,s=e();this.l?.Wb.set(1===s?t():s+"×")}ma(){this.l?.Ma(this.disabled)}na(){const{playbackRate:t}=this.a.$state;return t()+""}o(t,e){if(this.disabled)return;const s=+t;this.a.remote.changePlaybackRate(s,e),this.dispatch("change",{detail:s,trigger:e})}}ts([i.$],es.prototype,"value",1),ts([i.$],es.prototype,"disabled",1),ts([i.a0],es.prototype,"getOptions",1);var ss=Object.defineProperty,is=Object.getOwnPropertyDescriptor,ns=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?is(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&ss(e,s,r),r};class rs extends i.I{constructor(){super(),this.Dj=(0,i.n)((()=>{const{qualities:t}=this.a.$state;return[...t()].sort(((t,e)=>e.height===t.height?e.bitrate-t.bitrate:e.height-t.height))})),this.d=new Oe,this.d.o=this.o.bind(this)}static{this.props={autoLabel:"Auto",hideBitrate:!1}}get value(){return this.d.value}get disabled(){const{canSetQuality:t,qualities:e}=this.a.$state;return!t()||0===e().length}onSetup(){this.a=(0,n.u)(),(0,i.a4)(be)&&(this.l=(0,i.J)(be))}onConnect(t){(0,i.e)(this.D.bind(this)),(0,i.e)(this.ma.bind(this)),(0,i.e)(this.Oa.bind(this))}getOptions(){const{autoLabel:t,hideBitrate:e}=this.$props;return[{value:"auto",label:t},...this.Dj().map((t=>{const s=t.bitrate>=0?`${(0,c.r)(t.bitrate/1e6,2)} Mbps`:null;return{quality:t,label:t.height+"p",value:this.le(t),bitrate:()=>e()?null:s}}))]}D(){this.d.value=this.na()}Oa(){const{autoLabel:t}=this.$props,{autoQuality:e,quality:s}=this.a.$state,i=s()?s().height+"p":"";this.l?.Wb.set(e()?t()+(i?` (${i})`:""):i)}ma(){this.l?.Ma(this.disabled)}o(t,e){if(this.disabled)return;if("auto"===t)return this.a.remote.changeQuality(-1,e),void this.dispatch("change",{detail:"auto",trigger:e});const{qualities:s}=this.a.$state,n=(0,i.p)(s).findIndex((e=>this.le(e)===t));if(n>=0){const t=(0,i.p)(s)[n];this.a.remote.changeQuality(n,e),this.dispatch("change",{detail:t,trigger:e})}}na(){const{quality:t,autoQuality:e}=this.a.$state;if(e())return"auto";const s=t();return s?this.le(s):"auto"}le(t){return t.height+"_"+t.bitrate}}ns([i.$],rs.prototype,"value",1),ns([i.$],rs.prototype,"disabled",1),ns([i.a0],rs.prototype,"getOptions",1);class as extends i.I{constructor(){super(...arguments),this.i=null,this.Pa=0,this.Vf=-1}static{this.props={event:void 0,action:void 0}}onSetup(){this.a=(0,n.u)();const{event:t,action:e}=this.$props;this.setAttributes({event:t,action:e})}onAttach(t){t.setAttribute("data-media-gesture",""),t.style.setProperty("pointer-events","none")}onConnect(t){this.i=this.a.player.el?.querySelector("[data-media-provider]"),(0,i.e)(this.Ej.bind(this))}Ej(){let t=this.$props.event();this.i&&t&&(/^dbl/.test(t)&&(t=t.split(/^dbl/)[1]),("pointerup"===t||"pointerdown"===t)&&"coarse"===this.a.$state.pointer()&&(t="pointerup"===t?"touchend":"touchstart"),(0,i.l)(this.i,t,this.Fj.bind(this),{passive:!1}))}Fj(t){if((0,i.F)(t)&&(0!==t.button||this.a.activeMenu)||(0,i.c)(t)&&this.a.activeMenu||(0,a.i)(t)||!this.Gj(t))return;t.MEDIA_GESTURE=!0,t.preventDefault();const e=(0,i.p)(this.$props.event),s=e?.startsWith("dbl");if(s){if(1===this.Pa)return queueMicrotask((()=>this.Wf(t))),clearTimeout(this.Vf),void(this.Pa=0)}else 0===this.Pa&&setTimeout((()=>{1===this.Pa&&this.Wf(t)}),250);0===this.Pa&&(this.Vf=window.setTimeout((()=>{this.Pa=0}),275)),this.Pa++}Wf(t){this.el.setAttribute("data-triggered",""),requestAnimationFrame((()=>{this.Hj()&&this.Ij((0,i.p)(this.$props.action),t),requestAnimationFrame((()=>{this.el.removeAttribute("data-triggered")}))}))}Gj(t){if(!this.el)return!1;if((0,i.F)(t)||(0,i.a5)(t)||(0,i.c)(t)){const e=(0,i.c)(t)?t.changedTouches[0]??t.touches[0]:void 0,s=e?.clientX??t.clientX,n=e?.clientY??t.clientY,r=this.el.getBoundingClientRect(),a=n>=r.top&&n<=r.bottom&&s>=r.left&&s<=r.right;return t.type.includes("leave")?!a:a}return!0}Hj(){const t=this.a.player.el.querySelectorAll("[data-media-gesture][data-triggered]");return Array.from(t).sort(((t,e)=>+getComputedStyle(e).zIndex-+getComputedStyle(t).zIndex))[0]===this.el}Ij(t,e){if(!t)return;const s=new i.D("will-trigger",{detail:t,cancelable:!0,trigger:e});if(this.dispatchEvent(s),s.defaultPrevented)return;const[n,r]=t.replace(/:([a-z])/,"-$1").split(":");t.includes(":fullscreen")?this.a.remote.toggleFullscreen("prefer-media",e):t.includes("seek:")?this.a.remote.seek((0,i.p)(this.a.$state.currentTime)+(+r||0),e):this.a.remote[(0,i.U)(n)](e),this.dispatch("trigger",{detail:t,trigger:e})}}class hs{constructor(t){this.S=t,this.priority=10,this.z=null,this.sa=(0,i.a6)()}attach(){}canRender(){return!0}detach(){this.sa.empty(),this.S.reset(),this.z=null}changeTrack(t){t&&this.z!==t&&(this.sa.empty(),t.readyState<2?(this.S.reset(),this.sa.add((0,i.l)(t,"load",(()=>this.Xf(t)),{once:!0}))):this.Xf(t),this.sa.add((0,i.l)(t,"add-cue",(t=>{this.S.addCue(t.detail)})),(0,i.l)(t,"remove-cue",(t=>{this.S.removeCue(t.detail)}))),this.z=t)}Xf(t){this.S.changeTrack({cues:[...t.cues],regions:[...t.regions]})}}class os extends i.I{static{this.props={textDir:"ltr"}}onSetup(){this.a=(0,n.u)(),this.setAttributes({"aria-hidden":Mt(this.lb.bind(this))})}onAttach(t){t.style.setProperty("pointer-events","none")}onConnect(t){this.S?(0,i.e)(this.Yf.bind(this)):s.e(1264).then(s.bind(s,1264)).then((e=>{this.connectScope&&(0,i.s)((()=>{this.W=e;const{CaptionsRenderer:s}=this.W;this.S=new s(t),this.Qa=new hs(this.S),(0,i.e)(this.Yf.bind(this))}),this.connectScope)}))}onDestroy(){this.Qa&&(this.Qa.detach(),this.a.textRenderers.remove(this.Qa)),this.S?.destroy()}lb(){const{textTrack:t}=this.a.$state,e=t();return this.a.$iosControls()||!e||!(0,r.i)(e)}Yf(){const{viewType:t}=this.a.$state;return"audio"===t()?this.Jj():this.Kj()}Jj(){return(0,i.e)(this._d.bind(this)),()=>{this.el.textContent=""}}_d(){if(this.lb())return;const{textTrack:t}=this.a.$state;this.Zf(),(0,i.l)(t(),"cue-change",this.Zf.bind(this)),(0,i.e)(this.Lj.bind(this))}Zf(){this.el.textContent="";const{currentTime:t,textTrack:e}=this.a.$state,s=(0,i.p)(t),n=(0,i.p)(e).activeCues,{renderVTTCueString:r}=this.W;for(const t of n){const e=document.createElement("div");e.setAttribute("data-part","cue"),e.innerHTML=r(t,s),this.el.append(e)}}Lj(){const{currentTime:t}=this.a.$state,{updateTimedVTTCueNodes:e}=this.W;e(this.el,t())}Kj(){return(0,i.e)(this.Mj.bind(this)),(0,i.e)(this.Nj.bind(this)),this.a.textRenderers.add(this.Qa),()=>{this.el.textContent="",this.Qa.detach(),this.a.textRenderers.remove(this.Qa)}}Mj(){this.S.dir=this.$props.textDir()}Nj(){if(this.lb())return;const{currentTime:t}=this.a.$state;this.S.currentTime=t()}}class cs extends i.I{static{this.props={src:void 0,alt:void 0}}static{this.state=new i.S({img:null,src:null,alt:null,loading:!0,error:null,hidden:!1})}onSetup(){this.a=(0,n.u)(),this._f(),this.$f(),this.ob()}onAttach(t){t.style.setProperty("pointer-events","none"),(0,i.e)(this.Ud.bind(this)),(0,i.e)(this._f.bind(this)),(0,i.e)(this.$f.bind(this)),(0,i.e)(this.ob.bind(this));const{started:e}=this.a.$state;this.setAttributes({"data-visible":()=>!e(),"data-loading":this.Rb.bind(this),"data-error":this.wa.bind(this),"data-hidden":this.$state.hidden})}onConnect(t){const{canLoad:e,poster:s}=this.a.$state;window.requestAnimationFrame((()=>{e()||(0,r.p)(s())})),(0,i.e)(this.Ea.bind(this))}wa(){const{error:t}=this.$state;return!(0,i.N)(t())}ob(){const{src:t}=this.$props,{$iosControls:e}=this.a,{poster:s}=this.a.$state;this.el&&(0,i.k)(this.el,"display",e()?"none":null),this.$state.hidden.set(this.wa()||!(t()||s())||e())}Rb(){const{loading:t,hidden:e}=this.$state;return!e()&&t()}Ud(){const t=this.$state.img();t&&((0,i.l)(t,"load",this.lc.bind(this)),(0,i.l)(t,"error",this.U.bind(this)))}_f(){const{canLoad:t,poster:e}=this.a.$state,s=this.$props.src(),i=s||e();s&&e()!==s&&this.a.$state.providedPoster.set(s),this.$state.src.set(t()&&i.length?i:null)}$f(){const{src:t,alt:e}=this.$state;e.set(t()?this.$props.alt():null)}Ea(){const{loading:t,error:e}=this.$state,{canLoad:s,poster:i}=this.a.$state;t.set(s()&&!!i()),e.set(null)}lc(){const{loading:t,error:e}=this.$state;t.set(!1),e.set(null)}U(t){const{loading:e,error:s}=this.$state;e.set(!1),s.set(t)}}class ls extends i.I{static{this.props={type:"current",showHours:!1,padHours:null,padMinutes:null,remainder:!1}}static{this.state=new i.S({timeText:""})}onSetup(){this.a=(0,n.u)(),this.ag();const{type:t,remainder:e}=this.$props;this.setAttributes({"data-type":t,"data-remainder":e})}onAttach(t){(0,i.e)(this.ag.bind(this))}ag(){const{type:t,remainder:e,padHours:s,padMinutes:i,showHours:n}=this.$props,r=this.Oj(t()),a=this.a.$state.duration();if(!Number.isFinite(r+a))return void this.$state.timeText.set("LIVE");const h=ne(e()?Math.max(0,a-r):r,s(),i(),n());this.$state.timeText.set(h)}Oj(t){const{bufferedEnd:e,duration:s,currentTime:i}=this.a.$state;switch(t){case"buffered":return e();case"duration":return s();default:return i()}}}var us=Object.defineProperty,ds=Object.getOwnPropertyDescriptor,ps=(t,e,s,i)=>{for(var n,r=i>1?void 0:i?ds(e,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(r=(i?n(e,s,r):n(r))||r);return i&&r&&us(e,s,r),r};class fs extends i.I{constructor(){super(...arguments),this.menuContainer=null}static{this.props={when:"",smallWhen:"",thumbnails:"",customIcons:!1,translations:null,menuGroup:"bottom",noModal:!1}}get isMatch(){return this.me.matches}get isSmallLayout(){return this.Lc.matches}onSetup(){const{when:t,smallWhen:e,thumbnails:s,translations:r,menuGroup:a,noModal:h}=this.$props;this.me=n.P.create(t),this.Lc=n.P.create(e),this.setAttributes({"data-match":this.me.$matches,"data-size":()=>this.Lc.matches?"sm":null});const o=this;(0,i.Z)(ys,{smQueryList:this.Lc,thumbnails:s,translations:r,menuGroup:a,noModal:h,get menuContainer(){return o.menuContainer}})}}ps([i.$],fs.prototype,"menuContainer",2),ps([i.$],fs.prototype,"isMatch",1),ps([i.$],fs.prototype,"isSmallLayout",1);class gs extends fs{static{this.props={...super.props,when:"(view-type: audio)",smallWhen:"(width < 576)"}}}class bs extends fs{static{this.props={...super.props,when:"(view-type: video)",smallWhen:"(width < 576) or (height < 380)"}}}function ms(t,e){return t()?.[e]??e}const ys=(0,i.Q)();function $s(){return(0,i.J)(ys)}},4276:(t,e,s)=>{s.d(e,{Q:()=>i,c:()=>n});const i={Ya:Symbol(0),Za:Symbol(0)};function n(t){return t instanceof Error?t:Error(JSON.stringify(t))}}}]); \ No newline at end of file diff --git a/assets/js/2470.0dad2d67.js b/assets/js/2470.0dad2d67.js new file mode 100644 index 000000000..3d667d46e --- /dev/null +++ b/assets/js/2470.0dad2d67.js @@ -0,0 +1,2 @@ +/*! For license information please see 2470.0dad2d67.js.LICENSE.txt */ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2470],{2470:(e,t,n)=>{function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);nUo});var p,m,v,d,h,y={},b=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function g(e,t){for(var n in t)e[n]=t[n];return e}function O(e){var t=e.parentNode;t&&t.removeChild(e)}function S(e,t,n){var r,o,i,c=arguments,a={};for(i in t)"key"==i?r=t[i]:"ref"==i?o=t[i]:a[i]=t[i];if(arguments.length>3)for(n=[n],i=3;i0?w(m.type,m.props,m.key,null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=_[s])||p&&m.key==p.key&&m.type===p.type)_[s]=void 0;else for(f=0;f3)for(n=[n],i=3;i=n.__.length&&n.__.push({}),n.__[e]}function oe(e){return Z=1,ie(ve,e)}function ie(e,t,n){var r=re(J++,2);return r.t=e,r.__c||(r.__=[n?n(t):ve(void 0,t),function(e){var t=r.t(r.__[0],e);r.__[0]!==t&&(r.__=[t,r.__[1]],r.__c.setState({}))}],r.__c=$),r.__}function ce(e,t){var n=re(J++,3);!p.__s&&me(n.__H,t)&&(n.__=e,n.__H=t,$.__H.__h.push(n))}function ae(e,t){var n=re(J++,4);!p.__s&&me(n.__H,t)&&(n.__=e,n.__H=t,$.__h.push(n))}function ue(e,t){var n=re(J++,7);return me(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function le(){Y.forEach((function(e){if(e.__P)try{e.__H.__h.forEach(fe),e.__H.__h.forEach(pe),e.__H.__h=[]}catch(t){e.__H.__h=[],p.__e(t,e.__v)}})),Y=[]}p.__b=function(e){$=null,G&&G(e)},p.__r=function(e){X&&X(e),J=0;var t=($=e.__c).__H;t&&(t.__h.forEach(fe),t.__h.forEach(pe),t.__h=[])},p.diffed=function(e){ee&&ee(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==Y.push(t)&&Q===p.requestAnimationFrame||((Q=p.requestAnimationFrame)||function(e){var t,n=function(){clearTimeout(r),se&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);se&&(t=requestAnimationFrame(n))})(le)),$=void 0},p.__c=function(e,t){t.some((function(e){try{e.__h.forEach(fe),e.__h=e.__h.filter((function(e){return!e.__||pe(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],p.__e(n,e.__v)}})),te&&te(e,t)},p.unmount=function(e){ne&&ne(e);var t=e.__c;if(t&&t.__H)try{t.__H.__.forEach(fe)}catch(e){p.__e(e,t.__v)}};var se="function"==typeof requestAnimationFrame;function fe(e){var t=$;"function"==typeof e.__c&&e.__c(),$=t}function pe(e){var t=$;e.__c=e.__(),$=t}function me(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function ve(e,t){return"function"==typeof t?t(e):t}function de(e,t){for(var n in t)e[n]=t[n];return e}function he(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function ye(e){this.props=e}(ye.prototype=new E).isPureReactComponent=!0,ye.prototype.shouldComponentUpdate=function(e,t){return he(this.props,e)||he(this.state,t)};var be=p.__b;p.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),be&&be(e)};var _e="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911,ge=function(e,t){return null==e?null:x(x(e).map(t))},Oe={map:ge,forEach:ge,count:function(e){return e?x(e).length:0},only:function(e){var t=x(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:x},Se=p.__e;function we(){this.__u=0,this.t=null,this.__b=null}function je(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function Ee(){this.u=null,this.o=null}p.__e=function(e,t,n){if(e.then)for(var r,o=t;o=o.__;)if((r=o.__c)&&r.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),r.__c(e,t);Se(e,t,n)},(we.prototype=new E).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var o=je(r.__v),i=!1,c=function(){i||(i=!0,n.componentWillUnmount=n.__c,o?o(a):a())};n.__c=n.componentWillUnmount,n.componentWillUnmount=function(){c(),n.__c&&n.__c()};var a=function(){if(! --r.__u){if(r.state.__e){var e=r.state.__e;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__e:r.__b=null});t=r.t.pop();)t.forceUpdate()}},u=!0===t.__h;r.__u++||u||r.setState({__e:r.__b=r.__v.__k[0]}),e.then(c,c)},we.prototype.componentWillUnmount=function(){this.t=[]},we.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=de({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var o=t.__e&&S(j,null,e.fallback);return o&&(o.__h=null),[S(j,null,t.__e?null:e.children),o]};var Pe=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),W(S(Ie,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function ke(e,t){return S(De,{__v:e,i:t})}(Ee.prototype=new E).__e=function(e){var t=this,n=je(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),Pe(t,e,r)):o()};n?n(i):i()}},Ee.prototype.render=function(e){this.u=null,this.o=new Map;var t=x(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Ee.prototype.componentDidUpdate=Ee.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){Pe(e,n,t)}))};var Ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,Ce=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,xe=function(e){return("undefined"!=typeof Symbol&&"symbol"==i(Symbol())?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Ne(e,t,n){return null==t.__k&&(t.textContent=""),W(e,t),"function"==typeof n&&n(),e?e.__c:null}E.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(E.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var Te=p.event;function Re(){}function qe(){return this.cancelBubble}function Le(){return this.defaultPrevented}p.event=function(e){return Te&&(e=Te(e)),e.persist=Re,e.isPropagationStopped=qe,e.isDefaultPrevented=Le,e.nativeEvent=e};var Me,He={configurable:!0,get:function(){return this.class}},Ue=p.vnode;p.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!xe(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():Ce.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=x(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=x(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(He.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",He)),e.$$typeof=Ae,Ue&&Ue(e)};var Fe=p.__r;p.__r=function(e){Fe&&Fe(e),Me=e.__c};var Be={ReactCurrentDispatcher:{current:{readContext:function(e){return Me.__n[e.__c].props.value}}}};function Ve(e){return!!e&&e.$$typeof===Ae}"object"==("undefined"==typeof performance?"undefined":i(performance))&&"function"==typeof performance.now&&performance.now.bind(performance);var We={useState:oe,useReducer:ie,useEffect:ce,useLayoutEffect:ae,useRef:function(e){return Z=5,ue((function(){return{current:e}}),[])},useImperativeHandle:function(e,t,n){Z=6,ae((function(){"function"==typeof e?e(t()):e&&(e.current=t())}),null==n?n:n.concat(e))},useMemo:ue,useCallback:function(e,t){return Z=8,ue((function(){return e}),t)},useContext:function(e){var t=$.context[e.__c],n=re(J++,9);return n.__c=e,t?(null==n.__&&(n.__=!0,t.sub($)),t.props.value):e.__},useDebugValue:function(e,t){p.useDebugValue&&p.useDebugValue(t?t(e):e)},version:"16.8.0",Children:Oe,render:Ne,hydrate:function(e,t,n){return K(e,t),"function"==typeof n&&n(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(W(null,e),!0)},createPortal:ke,createElement:S,createContext:function(e,t){var n={__c:t="__cC"+h++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(D)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n},createFactory:function(e){return S.bind(null,e)},cloneElement:function(e){return Ve(e)?z.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:j,isValidElement:Ve,findDOMNode:function(e){return e&&(e.base||1===e.nodeType&&e)||null},Component:E,PureComponent:ye,memo:function(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:he(this.props,e)}function r(t){return this.shouldComponentUpdate=n,S(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r},forwardRef:function(e){function t(t,n){var r=de({},t);return delete r.ref,e(r,(n=t.ref||n)&&("object"!=i(n)||"current"in n)?n:null)}return t.$$typeof=_e,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:j,Suspense:we,SuspenseList:Ee,lazy:function(e){var t,n,r;function o(o){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return S(n,o)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Be};function Ke(){return We.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},We.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function ze(){return We.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},We.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var Je=["translations"];function $e(){return $e=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Je),i=r.buttonText,c=void 0===i?"Search":i,a=r.buttonAriaLabel,u=void 0===a?"Search":a,l=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),2!==i.length);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e)||function(e,t){if(e){if("string"==typeof e)return Qe(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Qe(e,2):void 0}}(e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(oe(null)),s=l[0],f=l[1];return ce((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("⌘"):f("Ctrl"))}),[]),We.createElement("button",$e({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),We.createElement("span",{className:"DocSearch-Button-Container"},We.createElement(ze,null),We.createElement("span",{className:"DocSearch-Button-Placeholder"},c)),We.createElement("span",{className:"DocSearch-Button-Keys"},null!==s&&We.createElement(We.Fragment,null,We.createElement("kbd",{className:"DocSearch-Button-Key"},"Ctrl"===s?We.createElement(Ke,null):s),We.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))}));function Ye(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),i=0;ie.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function mt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=3||2===n&&r>=4||1===n&&r>=10);function i(t,n,r){if(o&&void 0!==r){var i=r[0].__autocomplete_algoliaCredentials,c={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(st(n),[{headers:c}]))}else e.apply(void 0,[t].concat(st(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDsAfterSearch",ht(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDs",ht(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDsAfterSearch",ht(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDs",ht(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=pt(t,ut);return[].concat(st(e),st(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}(c),u={current:[]},l=Ye((function(e){var t=e.state;if(t.isOpen){var n=t.collections.reduce((function(e,t){return[].concat(gt(e),gt(t.items))}),[]).filter(bt);nt(u.current.map((function(e){return e.objectID})),n.map((function(e){return e.objectID})))||(u.current=n,n.length>0&&Pt({onItemsChange:r,items:n,insights:a,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;c("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:a}}),n((function(e){var t=e.item,n=e.state,r=e.event;bt(t)&&o({state:n,event:r,insights:a,item:t,insightsEvents:[wt({eventName:"Item Selected"},it({item:t,items:u.current}))]})})),r((function(e){var t=e.item,n=e.state,r=e.event;bt(t)&&i({state:n,event:r,insights:a,item:t,insightsEvents:[wt({eventName:"Item Active"},it({item:t,items:u.current}))]})}))},onStateChange:function(e){var t=e.state;l({state:t})},__autocomplete_pluginOptions:e}}function Dt(e,t){var n=t;return{then:function(t,r){return Dt(e.then(At(t,n,e),At(r,n,e)),n)},catch:function(t){return Dt(e.catch(At(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),Dt(e.finally(At(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function kt(e){return Dt(e,{isCanceled:!1,onCancelList:[]})}function At(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function Ct(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function xt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Nt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,sn);yn&&o.environment.clearTimeout(yn);var l=u.setCollections,s=u.setIsOpen,f=u.setQuery,p=u.setActiveItemId,m=u.setStatus;if(f(i),p(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=a.getState().collections.map((function(e){return pn(pn({},e),{},{items:[]})}));m("idle"),l(d),s(null!==(v=r.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:a.getState()}));var h=kt(bn(d).then((function(){return Promise.resolve()})));return a.pendingRequests.add(h)}m("loading"),yn=o.environment.setTimeout((function(){m("stalled")}),o.stallThreshold);var y=kt(bn(o.getSources(pn({query:i,refresh:c,state:a.getState()},u)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(pn({query:i,refresh:c,state:a.getState()},u))).then((function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(on(Object.keys(n.context).map((function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return nn(nn({},e),{},{requests:e.queries.map((function(n){return{query:"algolia"===e.requesterId?nn(nn({},n),{},{params:nn(nn({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}(t,e.sourceId,a.getState())}))}))).then(un).then((function(t){return function(e,t,n){return t.map((function(t){var r,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),c=o[0].transformResponse,a=c?c({results:r=i,hits:r.map((function(e){return e.hits})).filter(Boolean),facetHits:r.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:a,state:n.getState()}),Array.isArray(a),a.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:a}}))}(t,e,a)})).then((function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce((function(e,t){return Gt(Gt({},e),{},Xt({},t.source.sourceId,Gt(Gt({},t.source),{},{getItems:function(){return Ge(t.items)}})))}),{}),o=t.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:r,state:n}).sourcesBySourceId;return Ge(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:a.getState()})}))})))).then((function(e){var n;m("idle"),l(e);var f=o.shouldPanelOpen({state:a.getState()});s(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!i&&f||f);var p=qt(a.getState());if(null!==a.getState().activeItemId&&p){var v=p.item,d=p.itemInputValue,h=p.itemUrl,y=p.source;y.onActive(pn({event:t,item:v,itemInputValue:d,itemUrl:h,refresh:c,source:y,state:a.getState()},u))}})).finally((function(){m("idle"),yn&&o.environment.clearTimeout(yn)}));return a.pendingRequests.add(y)}function gn(e){return gn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},gn(e)}var On=["event","props","refresh","store"];function Sn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ln(e){return Ln="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ln(e)}function Mn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Hn(e){for(var t=1;t0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(Xe++),plugins:o,initialState:$t({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return zt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return zt(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zt(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:rt,onResolve:rt};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=Nt(Nt({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return Ge(e)})).then((function(e){return e.map((function(e){return $t($t({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:$t({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}(e,t),r=function(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,i){var c=function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,On);if("ArrowUp"===t.key||"ArrowDown"===t.key){var c=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},a=function(){var e=qt(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,c=e.itemInputValue,a=e.itemUrl,u=e.source;u.onActive(wn({event:t,item:n,itemInputValue:c,itemUrl:a,refresh:r,source:u,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?_n(wn({event:t,props:n,query:o.getState().query,refresh:r,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(c,0)})):(o.dispatch(t.key,{}),a(),c())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var u=qt(o.getState()),l=u.item,s=u.itemInputValue,f=u.itemUrl,p=u.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewTab({itemUrl:f,item:l,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewWindow({itemUrl:f,item:l,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),void n.navigator.navigate({itemUrl:f,item:l,state:o.getState()});_n(wn({event:t,nextState:{isOpen:!1},props:n,query:s,refresh:r,store:o},i)).then((function(){p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i))}))}}}(Tn({event:e,props:t,refresh:n,store:r},o))},onFocus:c,onBlur:rt,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||c(n)}},s)},getPanelProps:function(e){return Tn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.sourceIndex,o=qn(n,Cn);return Tn({role:"listbox","aria-labelledby":"".concat(i(t.id,r),"-label"),id:"".concat(i(t.id,r),"-list")},o)},getItemProps:function(e){var c=e.item,a=e.source,u=e.sourceIndex,l=qn(e,xn);return Tn({id:"".concat(i(t.id,u),"-item-").concat(c.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===c.__autocomplete_id,onMouseMove:function(e){if(c.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",c.__autocomplete_id);var t=qt(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,a=t.itemInputValue,u=t.itemUrl,l=t.source;l.onActive(Tn({event:e,item:i,itemInputValue:a,itemUrl:u,refresh:n,source:l,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=a.getItemInputValue({item:c,state:r.getState()}),u=a.getItemUrl({item:c,state:r.getState()});(u?Promise.resolve():_n(Tn({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:n,store:r},o))).then((function(){a.onSelect(Tn({event:e,item:c,itemInputValue:i,itemUrl:u,refresh:n,source:a,state:r.getState()},o))}))}},l)}}}(Zn({props:n,refresh:c,store:r,navigator:n.navigator},o));function c(){return _n(Zn({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,navigator:n.navigator,query:r.getState().query,refresh:c,store:r},o))}if(e.insights&&!n.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var a="boolean"==typeof e.insights?{}:e.insights;n.plugins.push(It(a))}return n.plugins.forEach((function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Zn(Zn({},o),{},{navigator:n.navigator,refresh:c,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var i=o.document.createElement("meta"),c=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(r),c.appendChild(i)}),0)}}({metadata:Fn({plugins:n.plugins,options:e}),environment:n.environment}),Zn(Zn({refresh:c,navigator:n.navigator},i),o)}function Xn(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,r=void 0===n?"Search by":n;return We.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},We.createElement("span",{className:"DocSearch-Label"},r),We.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},We.createElement("defs",null,We.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),We.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),We.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),We.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),We.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),We.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),We.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),We.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),We.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),We.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function er(e){return We.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},We.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function tr(e){var t=e.translations,n=void 0===t?{}:t,r=n.selectText,o=void 0===r?"to select":r,i=n.selectKeyAriaLabel,c=void 0===i?"Enter key":i,a=n.navigateText,u=void 0===a?"to navigate":a,l=n.navigateUpKeyAriaLabel,s=void 0===l?"Arrow up":l,f=n.navigateDownKeyAriaLabel,p=void 0===f?"Arrow down":f,m=n.closeText,v=void 0===m?"to close":m,d=n.closeKeyAriaLabel,h=void 0===d?"Escape key":d,y=n.searchByText,b=void 0===y?"Search by":y;return We.createElement(We.Fragment,null,We.createElement("div",{className:"DocSearch-Logo"},We.createElement(Xn,{translations:{searchByText:b}})),We.createElement("ul",{className:"DocSearch-Commands"},We.createElement("li",null,We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:c},We.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),We.createElement("span",{className:"DocSearch-Label"},o)),We.createElement("li",null,We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:p},We.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:s},We.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),We.createElement("span",{className:"DocSearch-Label"},u)),We.createElement("li",null,We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:h},We.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),We.createElement("span",{className:"DocSearch-Label"},v))))}function nr(e){var t=e.hit,n=e.children;return We.createElement("a",{href:t.url},n)}function rr(){return We.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},We.createElement("g",{fill:"none",fillRule:"evenodd"},We.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},We.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),We.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},We.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function or(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),We.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function ir(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function cr(){return We.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),We.createElement("path",{d:"M8 17l-6-6 6-6"})))}var ar=function(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function ur(e){switch(e.type){case"lvl1":return We.createElement(ar,null);case"content":return We.createElement(sr,null);default:return We.createElement(lr,null)}}function lr(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function sr(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function fr(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function pr(){return We.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function mr(){return We.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function vr(e){var t=e.translations,n=void 0===t?{}:t,r=n.titleText,o=void 0===r?"Unable to fetch results":r,i=n.helpText,c=void 0===i?"You might want to check your network connection.":i;return We.createElement("div",{className:"DocSearch-ErrorScreen"},We.createElement("div",{className:"DocSearch-Screen-Icon"},We.createElement(pr,null)),We.createElement("p",{className:"DocSearch-Title"},o),We.createElement("p",{className:"DocSearch-Help"},c))}var dr=["translations"];function hr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,dr),o=n.noResultsText,i=void 0===o?"No results for":o,c=n.suggestedQueryText,a=void 0===c?"Try searching for":c,u=n.reportMissingResultsText,l=void 0===u?"Believe this query should return results?":u,s=n.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,p=r.state.context.searchSuggestions;return We.createElement("div",{className:"DocSearch-NoResults"},We.createElement("div",{className:"DocSearch-Screen-Icon"},We.createElement(mr,null)),We.createElement("p",{className:"DocSearch-Title"},i,' "',We.createElement("strong",null,r.state.query),'"'),p&&p.length>0&&We.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},We.createElement("p",{className:"DocSearch-Help"},a,":"),We.createElement("ul",null,p.slice(0,3).reduce((function(e,t){return[].concat(function(e){return function(e){if(Array.isArray(e))return hr(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return hr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?hr(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(e),[We.createElement("li",{key:t},We.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){r.setQuery(t.toLowerCase()+" "),r.refresh(),r.inputRef.current.focus()}},t))])}),[]))),r.getMissingResultsUrl&&We.createElement("p",{className:"DocSearch-Help"},"".concat(l," "),We.createElement("a",{href:r.getMissingResultsUrl({query:r.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var br=["hit","attribute","tagName"];function _r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function gr(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,br)),{},{dangerouslySetInnerHTML:{__html:Sr(t,"_snippetResult.".concat(n,".value"))||Sr(t,n)}}))}function jr(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Er(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Er(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Er(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n|<\/mark>)/g,Tr=RegExp(Nr.source);function Rr(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0)||{}).value;return o&&Tr.test(o)?o.replace(Nr,""):o}function qr(){return qr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Mr),o=n.recentSearchesTitle,i=void 0===o?"Recent":o,c=n.noRecentSearchesText,a=void 0===c?"No recent searches":c,u=n.saveRecentSearchButtonTitle,l=void 0===u?"Save this search":u,s=n.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,p=n.favoriteSearchesTitle,m=void 0===p?"Favorite":p,v=n.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===r.state.status&&!1===r.hasCollections?r.disableUserPersonalization?null:We.createElement("div",{className:"DocSearch-StartScreen"},We.createElement("p",{className:"DocSearch-Help"},a)):!1===r.hasCollections?null:We.createElement("div",{className:"DocSearch-Dropdown-Container"},We.createElement(Ir,Hr({},r,{title:i,collection:r.state.collections[0],renderIcon:function(){return We.createElement("div",{className:"DocSearch-Hit-icon"},We.createElement(or,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,o=e.runDeleteTransition;return We.createElement(We.Fragment,null,We.createElement("div",{className:"DocSearch-Hit-action"},We.createElement("button",{className:"DocSearch-Hit-action-button",title:l,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.add(t),r.recentSearches.remove(t),r.refresh()}))}},We.createElement(fr,null))),We.createElement("div",{className:"DocSearch-Hit-action"},We.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){r.recentSearches.remove(t),r.refresh()}))}},We.createElement(ir,null))))}})),We.createElement(Ir,Hr({},r,{title:m,collection:r.state.collections[1],renderIcon:function(){return We.createElement("div",{className:"DocSearch-Hit-icon"},We.createElement(fr,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return We.createElement("div",{className:"DocSearch-Hit-action"},We.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.remove(t),r.refresh()}))}},We.createElement(ir,null)))}})))}var Fr=["translations"];function Br(){return Br=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Fr);if("error"===r.state.status)return We.createElement(vr,{translations:null==n?void 0:n.errorScreen});var o=r.state.collections.some((function(e){return e.items.length>0}));return r.state.query?!1===o?We.createElement(yr,Br({},r,{translations:null==n?void 0:n.noResultsScreen})):We.createElement(Lr,r):We.createElement(Ur,Br({},r,{hasCollections:o,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),Wr=["translations"];function Kr(){return Kr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Wr),o=n.resetButtonTitle,i=void 0===o?"Clear the query":o,c=n.resetButtonAriaLabel,a=void 0===c?"Clear the query":c,u=n.cancelButtonText,l=void 0===u?"Cancel":u,s=n.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,p=r.getFormProps({inputElement:r.inputRef.current}).onReset;return We.useEffect((function(){r.autoFocus&&r.inputRef.current&&r.inputRef.current.focus()}),[r.autoFocus,r.inputRef]),We.useEffect((function(){r.isFromSelection&&r.inputRef.current&&r.inputRef.current.select()}),[r.isFromSelection,r.inputRef]),We.createElement(We.Fragment,null,We.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:p},We.createElement("label",Kr({className:"DocSearch-MagnifierLabel"},r.getLabelProps()),We.createElement(ze,null)),We.createElement("div",{className:"DocSearch-LoadingIndicator"},We.createElement(rr,null)),We.createElement("input",Kr({className:"DocSearch-Input",ref:r.inputRef},r.getInputProps({inputElement:r.inputRef.current,autoFocus:r.autoFocus,maxLength:64}))),We.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":a,hidden:!r.state.query},We.createElement(ir,null))),We.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:r.onClose},l))}var Jr=["_highlightResult","_snippetResult"];function $r(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),i=o.getItem().slice(0,r);return{add:function(e){var t=e,n=(t._highlightResult,t._snippetResult,function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(t,Jr)),c=i.findIndex((function(e){return e.objectID===n.objectID}));c>-1&&i.splice(c,1),i.unshift(n),i=i.slice(0,r),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}var Qr=["facetName","facetQuery"];function Zr(e){var t,n="algoliasearch-client-js-".concat(e.key),r=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},o=function(){return JSON.parse(r().getItem(n)||"{}")},i=function(e){r().setItem(n,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,n=o(),r=Object.fromEntries(Object.entries(n).filter((function(e){return void 0!==u(e,2)[1].timestamp})));if(i(r),t){var c=Object.fromEntries(Object.entries(r).filter((function(e){var n=u(e,2)[1],r=(new Date).getTime();return!(n.timestamp+t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return o()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=u(e,2),r=t[0],o=t[1];return Promise.all([r,o||n.miss(r)])})).then((function(e){return u(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},r().setItem(n,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function Yr(e){var t=l(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return u(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch((function(){return Yr({caches:t}).get(e,r,o)}))},set:function(e,r){return n.set(e,r).catch((function(){return Yr({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return Yr({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return Yr({caches:t}).clear()}))}}}function Gr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},i=JSON.stringify(n);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);var c=r(),a=o&&o.miss||function(){return Promise.resolve()};return c.then((function(e){return a(e)})).then((function(){return c}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function Xr(e){for(var t=e.length-1;t>0;t--){var n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function eo(e,t){return t?(Object.keys(t).forEach((function(n){e[n]=t[n](e)})),e):e}function to(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var oo={Read:1,Write:2,Any:3},io=1;function co(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:io;return o(o({},e),{},{status:t,lastUpdate:Date.now()})}function ao(e){return"string"==typeof e?{protocol:"https",url:e,accept:oo.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||oo.Any}}var uo="GET",lo="POST";function so(e,t,n,r){var i=[],c=function(e,t){if(e.method!==uo&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:o(o({},e.data),t.data);return JSON.stringify(n)}}(n,r),a=function(e,t){var n=o(o({},e.headers),t.headers),r={};return Object.keys(n).forEach((function(e){var t=n[e];r[e.toLowerCase()]=t})),r}(e,r),u=n.method,s=n.method!==uo?{}:o(o({},n.data),r.data),f=o(o(o({"x-algolia-agent":e.userAgent.value},e.queryParameters),s),r.queryParameters),p=0,m=function t(o,l){var s=o.pop();if(void 0===s)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:vo(i)};var m={data:c,headers:a,method:u,url:po(s,n.path,f),connectTimeout:l(p,e.timeouts.connect),responseTimeout:l(p,r.timeout)},v=function(e){var t={request:m,response:e,host:s,triesLeft:o.length};return i.push(t),t},d={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var r=v(n);return n.isTimedOut&&p++,Promise.all([e.logger.info("Retryable failure",ho(r)),e.hostsCache.set(s,co(s,n.isTimedOut?3:2))]).then((function(){return t(o,l)}))},onFail:function(e){throw v(e),function(e,t){var n=e.content,r=e.status,o=n;try{o=JSON.parse(n).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(o,r,t)}(e,vo(i))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,n=e.status;return!t&&0==~~n}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,d)}))};return function(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(co(t))}))}))).then((function(e){var n=e.filter((function(e){return function(e){return e.status===io||Date.now()-e.lastUpdate>12e4}(e)})),r=e.filter((function(e){return function(e){return 3===e.status&&Date.now()-e.lastUpdate<=12e4}(e)})),o=[].concat(l(n),l(r));return{getTimeout:function(e,t){return(0===r.length&&0===e?1:r.length+3+e)*t},statelessHosts:o.length>0?o.map((function(e){return ao(e)})):t}}))}(e.hostsCache,t).then((function(e){return m(l(e.statelessHosts).reverse(),e.getTimeout)}))}function fo(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}function po(e,t,n){var r=mo(n),o="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return r.length&&(o+="?".concat(r)),o}function mo(e){return Object.keys(e).map((function(t){return to("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function vo(e){return e.map((function(e){return ho(e)}))}function ho(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return o(o({},e),{},{request:o(o({},e.request),{},{headers:o(o({},e.request.headers),t)})})}var yo=function(e){var t=e.appId,n=function(e,t,n){var r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:function(){return e===no.WithinHeaders?r:{}},queryParameters:function(){return e===no.WithinQueryParameters?r:{}}}}(void 0!==e.authMode?e.authMode:no.WithinHeaders,t,e.apiKey),r=function(e){var t=e.hostsCache,n=e.logger,r=e.requester,o=e.requestsCache,i=e.responsesCache,c=e.timeouts,a=e.userAgent,l=e.hosts,s=e.queryParameters,f={hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:i,timeouts:c,userAgent:a,headers:e.headers,queryParameters:s,hosts:l.map((function(e){return ao(e)})),read:function(e,t){var n=ro(t,f.timeouts.read),r=function(){return so(f,f.hosts.filter((function(e){return 0!=(e.accept&oo.Read)})),e,n)};if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();var o={request:e,mappedRequestOptions:n,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(function(){return f.requestsCache.get(o,(function(){return f.requestsCache.set(o,r()).then((function(e){return Promise.all([f.requestsCache.delete(o),e])}),(function(e){return Promise.all([f.requestsCache.delete(o),Promise.reject(e)])})).then((function(e){var t=u(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(o,e)}})},write:function(e,t){return so(f,f.hosts.filter((function(e){return 0!=(e.accept&oo.Write)})),e,ro(t,f.timeouts.write))}};return f}(o(o({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:oo.Read},{url:"".concat(t,".algolia.net"),accept:oo.Write}].concat(Xr([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:o(o(o({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:o(o({},n.queryParameters()),e.queryParameters)})),i={transporter:r,appId:t,addAlgoliaAgent:function(e,t){r.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([r.requestsCache.clear(),r.responsesCache.clear()]).then((function(){}))}};return eo(i,e.methods)},bo=function(e){return function(t,n){return t.method===uo?e.transporter.read(t,n):e.transporter.write(t,n)}},_o=function(e){return function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return eo({transporter:e.transporter,appId:e.appId,indexName:t},n.methods)}},go=function(e){return function(t,n){var r=t.map((function(e){return o(o({},e),{},{params:mo(e.params||{})})}));return e.transporter.read({method:lo,path:"1/indexes/*/queries",data:{requests:r},cacheable:!0},n)}},Oo=function(e){return function(t,n){return Promise.all(t.map((function(t){var r=t.params,i=r.facetName,c=r.facetQuery,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(r,Qr);return _o(e)(t.indexName,{methods:{searchForFacetValues:jo}}).searchForFacetValues(i,c,o(o({},n),a))})))}},So=function(e){return function(t,n,r){return e.transporter.read({method:lo,path:to("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},r)}},wo=function(e){return function(t,n){return e.transporter.read({method:lo,path:to("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n)}},jo=function(e){return function(t,n,r){return e.transporter.read({method:lo,path:to("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r)}},Eo=1,Po=2,Io=3;function Do(e,t,n){var r,i={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,o=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e)},i=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(i),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(i),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(i),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},logger:(r=Io,{debug:function(e,t){return Eo>=r&&console.debug(e,t),Promise.resolve()},info:function(e,t){return Po>=r&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:Gr(),requestsCache:Gr({serializable:!1}),hostsCache:Yr({caches:[Zr({key:"".concat("4.19.1","-").concat(e)}),Gr()]}),userAgent:fo("4.19.1").add({segment:"Browser",version:"lite"}),authMode:no.WithinQueryParameters};return yo(o(o(o({},i),n),{},{methods:{search:go,searchForFacetValues:Oo,multipleQueries:go,multipleSearchForFacetValues:Oo,customRequest:bo,initIndex:function(e){return function(t){return _o(e)(t,{methods:{search:wo,searchForFacetValues:jo,findAnswers:So}})}}}}))}Do.version="4.19.1";var ko=["footer","searchBox"];function Ao(){return Ao=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(P,ko),N=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),2!==i.length);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e)||function(e,t){if(e){if("string"==typeof e)return To(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?To(e,2):void 0}}(e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(We.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"})),T=N[0],R=N[1],q=We.useRef(null),L=We.useRef(null),M=We.useRef(null),H=We.useRef(null),U=We.useRef(null),F=We.useRef(10),B=We.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,V=We.useRef(j||B).current,W=function(e,t,n){return We.useMemo((function(){var r=Do(e,t);return r.addAlgoliaAgent("docsearch","3.5.2"),!1===/docsearch.js \(.*\)/.test(r.transporter.userAgent.value)&&r.addAlgoliaAgent("docsearch-react","3.5.2"),n(r)}),[e,t,n])}(t,n,g),K=We.useRef($r({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(r),limit:10})).current,z=We.useRef($r({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(r),limit:0===K.getAll().length?7:4})).current,J=We.useCallback((function(e){if(!S){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===K.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&z.add(t)}}),[K,z,S]),$=We.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}}),[T.context.algoliaInsightsPlugin]),Q=We.useMemo((function(){return Gn({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:h,onStateChange:function(e){R(e.state)},getSources:function(e){var o=e.query,i=e.state,u=e.setContext,s=e.setStatus;if(!o)return S?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),Cr(n)||l()},getItemUrl:function(e){return e.item.url},getItems:function(){return z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),Cr(n)||l()},getItemUrl:function(e){return e.item.url},getItems:function(){return K.getAll()}}];var p=Boolean(k);return W.search([{query:o,indexName:r,params:xo({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(F.current),"hierarchy.lvl2:".concat(F.current),"hierarchy.lvl3:".concat(F.current),"hierarchy.lvl4:".concat(F.current),"hierarchy.lvl5:".concat(F.current),"hierarchy.lvl6:".concat(F.current),"content:".concat(F.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:p},c)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],c=o.hits,s=o.nbHits,m=kr(c,(function(e){return Rr(e)}),a);i.context.searchSuggestions.length0&&(G(),U.current&&U.current.focus())}),[V,G]),We.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),We.createElement("div",Ao({ref:q},Y({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&l()}}),We.createElement("div",{className:"DocSearch-Modal",ref:L},We.createElement("header",{className:"DocSearch-SearchBar",ref:M},We.createElement(zr,Ao({},Q,{state:T,autoFocus:0===V.length,inputRef:U,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:l}))),We.createElement("div",{className:"DocSearch-Dropdown",ref:H},We.createElement(Vr,Ao({},Q,{indexName:r,state:T,hitComponent:m,resultsFooterComponent:d,disableUserPersonalization:S,recentSearches:z,favoriteSearches:K,inputRef:U,translations:x,getMissingResultsUrl:I,onItemClick:function(e,t){$(e),J(e),Cr(t)||l()}}))),We.createElement("footer",{className:"DocSearch-Footer"},We.createElement(tr,{translations:A}))))}function qo(){return qo=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:window;return"string"==typeof e?t.document.querySelector(e):e}(e.container,e.environment))}}}]); \ No newline at end of file diff --git a/assets/js/512.a9650ac0.js.LICENSE.txt b/assets/js/2470.0dad2d67.js.LICENSE.txt similarity index 100% rename from assets/js/512.a9650ac0.js.LICENSE.txt rename to assets/js/2470.0dad2d67.js.LICENSE.txt diff --git a/assets/js/2626.28851fe3.js b/assets/js/2626.28851fe3.js new file mode 100644 index 000000000..727e64fb5 --- /dev/null +++ b/assets/js/2626.28851fe3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2626],{1501:(t,i,s)=>{s.d(i,{R:()=>a});var e=s(4158);class a{constructor(t){this.Ca=t}Bb(){(0,e.i)(this.ca)&&this.Oe()}ra(){(0,e.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,e.i)(this.ca)||(this.Ca(),this.Oe())}))}}},2626:(t,i,s)=>{s.r(i),s.d(i,{AudioProvider:()=>a});var e=s(8039);class a extends e.B{constructor(){super(...arguments),this.$$PROVIDER_TYPE="AUDIO"}get type(){return"audio"}setup(t){super.setup(t),"audio"===this.type&&t.delegate.c("provider-setup",this)}get audio(){return this.a}}},8039:(t,i,s)=>{s.d(i,{B:()=>n});var e=s(449),a=s(4158),h=s(1501),r=s(5781);class d{constructor(t,i){this.i=t,this.b=i,this.sa=(0,a.L)(),this.Cb=!1,this.$c=!1,this.ad=!1,this.Da=new h.R(this.bd.bind(this)),this.Qe=void 0,this.Dg=void 0,this.pg(),(0,a.e)(this.qg.bind(this)),(0,a.o)(this.cd.bind(this))}get a(){return this.i.media}get c(){return this.b.delegate.c}cd(){this.$c=!1,this.ad=!1,this.Da.ra(),this.sa.empty()}bd(){const t=this.a.currentTime;this.b.$state.currentTime()!==t&&this.$a(t)}pg(){this.t("loadstart",this.Ea),this.t("abort",this.Pe),this.t("emptied",this.rg),this.t("error",this.U),this.t("volumechange",this.ab)}sg(){this.$c||(this.sa.add(this.t("loadeddata",this.tg),this.t("loadedmetadata",this.ug),this.t("canplay",this.hc),this.t("canplaythrough",this.vg),this.t("durationchange",this.wg),this.t("play",this.xb),this.t("progress",this.ic),this.t("stalled",this.xg),this.t("suspend",this.yg)),this.$c=!0)}zg(){this.ad||(this.sa.add(this.t("pause",this.Aa),this.t("playing",this.Ag),this.t("ratechange",this.Bg),this.t("seeked",this.bb),this.t("seeking",this.Cg),this.t("ended",this.Db),this.t("waiting",this.dd)),this.ad=!0)}t(t,i){return(0,a.l)(this.a,t,i.bind(this))}Eg(t){}$a(t,i){const s={currentTime:Math.min(t,this.b.$state.seekableEnd()),played:this.a.played};this.c("time-update",s,i)}Ea(t){3!==this.a.networkState?(this.sg(),this.c("load-start",void 0,t)):this.Pe(t)}Pe(t){this.c("abort",void 0,t)}rg(){this.c("emptied",void 0,event)}tg(t){this.c("loaded-data",void 0,t)}ug(t){this.zg(),this.c("loaded-metadata",void 0,t),r.g&&(0,e.i)(this.b.$state.source())&&this.b.delegate.jc(this.ed(),t)}ed(){return{provider:(0,a.p)(this.b.$provider),duration:this.a.duration,buffered:this.a.buffered,seekable:this.a.seekable}}xb(t){this.b.$state.canPlay&&this.c("play",void 0,t)}Aa(t){(1!==this.a.readyState||this.Cb)&&(this.Cb=!1,this.Da.ra(),this.c("pause",void 0,t))}hc(t){this.b.delegate.jc(this.ed(),t)}vg(t){this.b.$state.started()||this.c("can-play-through",this.ed(),t)}Ag(t){this.Cb=!1,this.c("playing",void 0,t),this.Da.Bb()}xg(t){this.c("stalled",void 0,t),this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}dd(t){this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}Db(t){this.Da.ra(),this.$a(this.a.duration,t),this.c("end",void 0,t),this.b.$state.loop()&&(0,a.M)(this.a.controls)&&(this.a.controls=!1)}qg(){this.b.$state.paused()&&(0,a.l)(this.a,"timeupdate",this.Eb.bind(this))}Eb(t){this.$a(this.a.currentTime,t)}wg(t){this.b.$state.ended()&&this.$a(this.a.duration,t),this.c("duration-change",this.a.duration,t)}ab(t){const i={volume:this.a.volume,muted:this.a.muted};this.c("volume-change",i,t)}bb(t){this.$a(this.a.currentTime,t),this.c("seeked",this.a.currentTime,t),Math.trunc(this.a.currentTime)===Math.trunc(this.a.duration)&&(0,e.g)(this.a.duration)>(0,e.g)(this.a.currentTime)&&(this.$a(this.a.duration,t),this.a.ended||this.b.player.dispatch(new a.D("media-play-request",{trigger:t})))}Cg(t){this.c("seeking",this.a.currentTime,t)}ic(t){const i={buffered:this.a.buffered,seekable:this.a.seekable};this.c("progress",i,t)}yg(t){this.c("suspend",void 0,t)}Bg(t){this.c("rate-change",this.a.playbackRate,t)}U(t){const i=this.a.error;if(!i)return;const s={message:i.message,code:i.code,mediaError:i};this.c("error",s,t)}}class c{constructor(t,i){this.i=t,this.b=i,this.Fb.onaddtrack=this.Fg.bind(this),this.Fb.onremovetrack=this.Gg.bind(this),this.Fb.onchange=this.Hg.bind(this),(0,a.l)(this.b.audioTracks,"change",this.Ig.bind(this))}get Fb(){return this.i.media.audioTracks}Fg(t){const i=t.track;if(""===i.label)return;const s={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.b.audioTracks[r.L.oa](s,t),i.enabled&&(s.selected=!0)}Gg(t){const i=this.b.audioTracks.getById(t.track.id);i&&this.b.audioTracks[r.L.Yb](i,t)}Hg(t){let i=this.Re();if(!i)return;const s=this.b.audioTracks.getById(i.id);s&&this.b.audioTracks[r.L.pa](s,!0,t)}Re(){return Array.from(this.Fb).find((t=>t.enabled))}Ig(t){const{current:i}=t.detail;if(!i)return;const s=this.Fb.getTrackById(i.id);if(s){const t=this.Re();t&&(t.enabled=!1),s.enabled=!0}}}class n{constructor(t){this.a=t,this.scope=(0,a.q)(),this.V=null}setup(t){new d(this,t),"audioTracks"in this.media&&new c(this,t),(0,a.o)((()=>{this.a.setAttribute("src",""),this.a.load()}))}get type(){return""}get media(){return this.a}get currentSrc(){return this.V}setPlaybackRate(t){this.a.playbackRate=t}async play(){return this.a.play()}async pause(){return this.a.pause()}setMuted(t){this.a.muted=t}setVolume(t){this.a.volume=t}setCurrentTime(t){this.a.currentTime=t}setPlaysinline(t){(0,a.k)(this.a,"playsinline",t)}async loadSource({src:t,type:i},s){this.a.preload=s||"",(0,e.a)(t)?this.a.srcObject=t:(this.a.srcObject=null,this.a.src=(0,a.r)(t)?t:window.URL.createObjectURL(t)),this.a.load(),this.V={src:t,type:i}}}}}]); \ No newline at end of file diff --git a/assets/js/2736.76105c4f.js b/assets/js/2736.76105c4f.js deleted file mode 100644 index cccc6413c..000000000 --- a/assets/js/2736.76105c4f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2736],{2736:(t,e,s)=>{s.r(e);var i=s(348),n=s(8),o=s(7224);class a extends((0,i.H)(HTMLElement,n.M)){constructor(){super(...arguments),this.A=null,this.Vj=null}static{this.tagName="media-provider"}onSetup(){this.a=(0,o.u)(),this.setAttribute("keep-alive","")}onDestroy(){this.Vj?.remove(),this.Vj=null,this.A?.remove(),this.A=null}onConnect(){(0,i.e)((()=>{const t=this.$state.loader(),e=t?.canPlay({src:"",type:"video/youtube"}),s=t?.canPlay({src:"",type:"video/vimeo"}),n=e||s,o=t?n?this.ek():"audio"===t.mediaType()?this.fk():this.Yj():null;if(this.A!==o){const t=this.A?.parentElement??this;this.A?.remove(),this.A=o,o&&t.prepend(o),n&&o&&(0,i.e)((()=>{const{$iosControls:t}=this.a,{controls:e}=this.a.$state,s=e()||t();s?(this.Vj?.remove(),this.Vj=null):(this.Vj=this.querySelector(".vds-blocker")??document.createElement("div"),this.Vj.classList.add("vds-blocker"),o.after(this.Vj)),(0,i.k)(o,"data-no-controls",!s)}))}e?o?.classList.add("vds-youtube"):s&&o?.classList.add("vds-vimeo"),n||(this.Vj?.remove(),this.Vj=null),this.load(o)}))}fk(){const t=this.A instanceof HTMLAudioElement?this.A:document.createElement("audio");(0,i.k)(t,"preload","none"),(0,i.k)(t,"aria-hidden","true");const{controls:e,crossorigin:s}=this.a.$state;return(0,i.e)((()=>{(0,i.k)(t,"controls",e()),(0,i.k)(t,"crossorigin",s())})),t}Yj(){const t=this.A instanceof HTMLVideoElement?this.A:document.createElement("video"),{controls:e,crossorigin:s,poster:n}=this.a.$state,{$iosControls:o}=this.a,a=(0,i.n)((()=>e()||o()?"":null)),r=(0,i.n)((()=>n()&&(e()||o())?n():null));return(0,i.e)((()=>{(0,i.k)(t,"controls",a()),(0,i.k)(t,"crossorigin",s()),(0,i.k)(t,"poster",r())})),t}ek(){return this.A instanceof HTMLIFrameElement?this.A:document.createElement("iframe")}}class r extends((0,i.H)(HTMLElement,n.a)){static{this.tagName="media-player"}static{this.attrs={preferNativeHLS:"prefer-native-hls"}}}(0,i.d)(r),(0,i.d)(a)}}]); \ No newline at end of file diff --git a/assets/js/4680.97fc384f.js b/assets/js/2969.ee3e32bd.js similarity index 99% rename from assets/js/4680.97fc384f.js rename to assets/js/2969.ee3e32bd.js index b704cb78a..1fe8a99b0 100644 --- a/assets/js/4680.97fc384f.js +++ b/assets/js/2969.ee3e32bd.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4680],{4680:(C,l,r)=>{r.r(l),r.d(l,{icons:()=>o});var e='';const o={play:'',pause:' ',replay:'',mute:' ',"volume-low":' ',"volume-high":' ',"cc-on":' ',"cc-off":e,"pip-enter":' ',"pip-exit":' ',"fs-enter":' ',"fs-exit":' ',"seek-forward":' ',"seek-backward":' ',"menu-chapters":' ',"menu-settings":'',"menu-arrow-left":'',"menu-arrow-right":'',"menu-audio":'',"menu-speed":' ',"menu-quality":' ',"menu-captions":e}}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2969],{2969:(C,l,r)=>{r.r(l),r.d(l,{icons:()=>o});var e='';const o={play:'',pause:' ',replay:'',mute:' ',"volume-low":' ',"volume-high":' ',"cc-on":' ',"cc-off":e,"pip-enter":' ',"pip-exit":' ',"fs-enter":' ',"fs-exit":' ',"seek-forward":' ',"seek-backward":' ',"menu-chapters":' ',"menu-settings":'',"menu-arrow-left":'',"menu-arrow-right":'',"menu-audio":'',"menu-speed":' ',"menu-quality":' ',"menu-captions":e}}}]); \ No newline at end of file diff --git a/assets/js/v-7996f07b.071b57b2.js b/assets/js/2_obs_streamfx.html.8102d1cf.js similarity index 75% rename from assets/js/v-7996f07b.071b57b2.js rename to assets/js/2_obs_streamfx.html.8102d1cf.js index e651a7f25..6f5e67f2f 100644 --- a/assets/js/v-7996f07b.071b57b2.js +++ b/assets/js/2_obs_streamfx.html.8102d1cf.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6216],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,i]of t)n[e]=i;return n}},4812:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>L,data:()=>M});var i=n(3968);const a=(0,i.QD)("p",null,"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。",-1),r=(0,i.QD)("h2",{id:"安装-streamfx",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#安装-streamfx"},[(0,i.QD)("span",null,"安装 StreamFX")])],-1),o={href:"https://github.com/Xaymar/obs-StreamFX/releases",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/Xaymar/obs-StreamFX/blob/root/BUILDING.md",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/MonoLogueChi/obs-StreamFX-build",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Uninstallation",target:"_blank",rel:"noopener noreferrer"},s=(0,i.QD)("p",null,"安装完成后,StreamFX 将出现在 OBS 软件上方的菜单栏中。接下来,我将使用不同的滤镜处理示例图,并提供对比图。",-1),m=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/2023-01-07-23-27-34.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"样例原图")],-1),c=(0,i.QD)("h2",{id:"来源镜像",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#来源镜像"},[(0,i.QD)("span",null,"来源镜像")])],-1),h={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Source-Mirror",target:"_blank",rel:"noopener noreferrer"},u=(0,i.QD)("h2",{id:"_3d-转换",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#_3d-转换"},[(0,i.QD)("span",null,"3D 转换")])],-1),d={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-3D-Transform",target:"_blank",rel:"noopener noreferrer"},f=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/2023-01-07-23-27-01.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"3D 转换")],-1),b=(0,i.QD)("h2",{id:"模糊",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#模糊"},[(0,i.QD)("span",null,"模糊")])],-1),D={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Blur",target:"_blank",rel:"noopener noreferrer"},z=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/2023-01-08-06-49-05.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"右侧为模糊效果")],-1),w=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/2023-01-06-02-51-10.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"模糊滤镜设置")],-1),S=(0,i.QD)("h2",{id:"动态蒙版",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#动态蒙版"},[(0,i.QD)("span",null,"动态蒙版")])],-1),F={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Dynamic-Mask",target:"_blank",rel:"noopener noreferrer"},Q=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/2023-01-08-07-05-42.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"动态蒙版")],-1),X=(0,i.QD)("h2",{id:"sdf-特效",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#sdf-特效"},[(0,i.QD)("span",null,"SDF 特效")])],-1),y={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-SDF-Effects",target:"_blank",rel:"noopener noreferrer"},x={href:"https://jishuin.proginn.com/p/763bfbd5a086",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/Xaymar/obs-StreamFX/issues/512",target:"_blank",rel:"noopener noreferrer"},_=(0,i.IL)('
    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),Y={href:"https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Upscaling",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Denoising",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Auto-Framing",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Virtual-Greenscreen",target:"_blank",rel:"noopener noreferrer"},O=(0,i.QD)("figure",null,[(0,i.QD)("img",{src:"https://img.newzone.top/2023-01-07-23-19-50.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.QD)("figcaption",null,"人像背景移除")],-1),N={},L=(0,n(9720).c)(N,[["render",function(e,t){const n=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[a,r,(0,i.QD)("p",null,[(0,i.mY)("访问 "),(0,i.QD)("a",o,[(0,i.mY)("StreamFX 发布页"),(0,i.K2)(n)]),(0,i.mY)(",选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 "),(0,i.QD)("a",l,[(0,i.mY)("obs-StreamFX/BUILDING.md"),(0,i.K2)(n)]),(0,i.mY)(" 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 "),(0,i.QD)("a",p,[(0,i.mY)("MonoLogueChi/obs-StreamFX-build"),(0,i.K2)(n)]),(0,i.mY)("。")]),(0,i.QD)("p",null,[(0,i.mY)("在升级插件前,请按照"),(0,i.QD)("a",g,[(0,i.mY)("卸载教程"),(0,i.K2)(n)]),(0,i.mY)("执行旧版的清理操作。")]),s,m,c,(0,i.QD)("p",null,[(0,i.QD)("a",h,[(0,i.mY)("来源镜像"),(0,i.K2)(n)]),(0,i.mY)("(Source Mirror)是一种来源,而不是滤镜。它可以克隆任何源或场景,并将其应用于当前场景。对来源镜像叠加滤镜和任意效果,都不会对原始来源造成影响。")]),u,(0,i.QD)("p",null,[(0,i.QD)("a",d,[(0,i.mY)("3D 转换"),(0,i.K2)(n)]),(0,i.mY)("(3D Transform)可以将 2D 图片的坐标系转换为三维,从而可以自由旋转、移动和缩放,形成类似星球大战中的字幕特效。")]),f,b,(0,i.QD)("p",null,[(0,i.QD)("a",D,[(0,i.mY)("模糊"),(0,i.K2)(n)]),(0,i.mY)("(Blur Filter)提供五种模糊类型:Box、Box Linear、Gaussian、Gaussian Linear 和 Dual Filtering。建议将类型设置为「Dual Filtering(双重过滤)」,大小设为 5。应用蒙版后,可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。如果只需要对部分区域进行模糊,勾选「应用蒙版」并适量设置「羽化区域」(如 10),以避免模糊边缘显得过于突出。")]),z,w,S,(0,i.QD)("p",null,[(0,i.QD)("a",F,[(0,i.mY)("动态蒙版"),(0,i.K2)(n)]),(0,i.mY)("(Dynamic Mask)允许叠加任意来源或场景,并使用红色、绿色、蓝色和 alpha 通道建立画面蒙版。下图展示了使用红色通道叠加雨滴来源的效果。")]),Q,X,(0,i.QD)("p",null,[(0,i.QD)("a",y,[(0,i.mY)("SDF 特效"),(0,i.K2)(n)]),(0,i.mY)("(Shader Signed Distance Field Effects)仅对拥有透明图层的画面有效,比如被移除背景后的摄像头画面。SDF 特效会对外观轮廓进行发光处理,并占用大量显存性能。!["),(0,i.QD)("a",x,[(0,i.mY)("什么是 SDF?"),(0,i.K2)(n)]),(0,i.mY)("] !["),(0,i.QD)("a",k,[(0,i.mY)('"SDF Effects" filter is undocumented'),(0,i.K2)(n)]),(0,i.mY)("]")]),_,(0,i.QD)("p",null,[(0,i.mY)("本部分的滤镜需要需 NVIDIA 2060 及以上显卡,并安装 "),(0,i.QD)("a",Y,[(0,i.mY)("NVIDIA Video Effects & AR SDK Redistributable"),(0,i.K2)(n)]),(0,i.mY)("。这些滤镜效果均可用 NVIDIA Broadcast 实现。")]),(0,i.QD)("ul",null,[(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.QD)("a",v,[(0,i.mY)("画质提升"),(0,i.K2)(n)]),(0,i.mY)("(Upscaling):提升画质分辨率,可以将老式摄像头提升到 4K 画质。")])]),(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.QD)("a",B,[(0,i.mY)("降噪"),(0,i.K2)(n)]),(0,i.mY)("(Denoising Filter):对画面进行降噪。")])]),(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.QD)("a",I,[(0,i.mY)("自动帧"),(0,i.K2)(n)]),(0,i.mY)("(Auto-Framing):通过 NVIDIA AR 的自动追踪人脸技术,自动裁剪和放大用户、并且在用户移动时保持帧居中。")])]),(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.QD)("a",K,[(0,i.mY)("英伟达背景移除"),(0,i.K2)(n)]),(0,i.mY)("(Virtual Greenscreen):无需绿幕也能帮你移除人像背景,移除效果略逊色于 NVIDIA Broadcast。样图是用的是漫画,如果是真人画面,移除效果会好很多。")]),O])])])}]]),M=JSON.parse('{"path":"/apps/livestreaming/2_obs_streamfx.html","title":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件","lang":"zh-CN","frontmatter":{"title":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件","category":["工具"],"tag":["OBS","直播"],"order":2,"description":"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。 安装 StreamFX 访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 S...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/2_obs_streamfx.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件"}],["meta",{"property":"og:description","content":"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。 安装 StreamFX 访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 S..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-07-23-27-34.png \\"样例原图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OBS"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件\\",\\"image\\":[\\"https://img.newzone.top/2023-01-07-23-27-34.png \\\\\\"样例原图\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-27-01.png \\\\\\"3D 转换\\\\\\"\\",\\"https://img.newzone.top/2023-01-08-06-49-05.png \\\\\\"右侧为模糊效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-02-51-10.png \\\\\\"模糊滤镜设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-08-07-05-42.png \\\\\\"动态蒙版\\\\\\"\\",\\"https://jishuin.proginn.com/p/763bfbd5a086\\",\\"https://github.com/Xaymar/obs-StreamFX/issues/512\\",\\"https://img.newzone.top/2023-01-09-18-56-14.webp \\\\\\"SDF 特效-外发光+变形\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-11-16.png \\\\\\"colorize\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-46-26.png \\\\\\"posterize\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-03-18.png \\\\\\"smaa\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-14-10.png \\\\\\"bulge_pinch 凸起效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-14-47.png \\\\\\"bulge_pinch 凹下的效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-02-59.png \\\\\\"displace\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-57-18.gif?imageMogr2/format/webp \\\\\\"drunk\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-06-45.png \\\\\\"swirl\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-12-23.png \\\\\\"wave\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-30-25.png \\\\\\"zigzag\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-48-41.png \\\\\\"pixelation\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-50-21.png \\\\\\"hexagonize\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-32-17.png \\\\\\"semiline\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-10-30.png \\\\\\"vignette\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-43-07.png \\\\\\"rounded-rect\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-09-05.png \\\\\\"crt-curvature\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-06-17.gif?imageMogr2/format/webp \\\\\\"crt-scanlines\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-44-59.png \\\\\\"repeat\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-19-50.png \\\\\\"人像背景移除\\\\\\"\\"],\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"安装 StreamFX","slug":"安装-streamfx","link":"#安装-streamfx","children":[]},{"level":2,"title":"来源镜像","slug":"来源镜像","link":"#来源镜像","children":[]},{"level":2,"title":"3D 转换","slug":"_3d-转换","link":"#_3d-转换","children":[]},{"level":2,"title":"模糊","slug":"模糊","link":"#模糊","children":[]},{"level":2,"title":"动态蒙版","slug":"动态蒙版","link":"#动态蒙版","children":[]},{"level":2,"title":"SDF 特效","slug":"sdf-特效","link":"#sdf-特效","children":[]},{"level":2,"title":"着色器","slug":"着色器","link":"#着色器","children":[{"level":3,"title":"色彩滤镜","slug":"色彩滤镜","link":"#色彩滤镜","children":[]},{"level":3,"title":"位移变换","slug":"位移变换","link":"#位移变换","children":[]},{"level":3,"title":"画面遮盖","slug":"画面遮盖","link":"#画面遮盖","children":[]},{"level":3,"title":"增强滤镜","slug":"增强滤镜","link":"#增强滤镜","children":[]}]},{"level":2,"title":"N 卡滤镜","slug":"n-卡滤镜","link":"#n-卡滤镜","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":5.13,"words":1540},"filePathRelative":"apps/livestreaming/2_obs_streamfx.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    安装 StreamFX

    \\n

    访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 MonoLogueChi/obs-StreamFX-build

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1398],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,i]of t)n[e]=i;return n}},1329:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>A,data:()=>C});var i=n(7847);const a=(0,i.Lk)("p",null,"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。",-1),r=(0,i.Lk)("h2",{id:"安装-streamfx",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#安装-streamfx"},[(0,i.Lk)("span",null,"安装 StreamFX")])],-1),o={href:"https://github.com/Xaymar/obs-StreamFX/releases",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/Xaymar/obs-StreamFX/blob/root/BUILDING.md",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/MonoLogueChi/obs-StreamFX-build",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Uninstallation",target:"_blank",rel:"noopener noreferrer"},s=(0,i.Lk)("p",null,"安装完成后,StreamFX 将出现在 OBS 软件上方的菜单栏中。接下来,我将使用不同的滤镜处理示例图,并提供对比图。",-1),m=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/2023-01-07-23-27-34.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"样例原图")],-1),c=(0,i.Lk)("h2",{id:"来源镜像",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#来源镜像"},[(0,i.Lk)("span",null,"来源镜像")])],-1),h={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Source-Mirror",target:"_blank",rel:"noopener noreferrer"},u=(0,i.Lk)("h2",{id:"_3d-转换",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#_3d-转换"},[(0,i.Lk)("span",null,"3D 转换")])],-1),d={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-3D-Transform",target:"_blank",rel:"noopener noreferrer"},f=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/2023-01-07-23-27-01.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"3D 转换")],-1),b=(0,i.Lk)("h2",{id:"模糊",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#模糊"},[(0,i.Lk)("span",null,"模糊")])],-1),k={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Blur",target:"_blank",rel:"noopener noreferrer"},z=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/2023-01-08-06-49-05.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"右侧为模糊效果")],-1),F=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/2023-01-06-02-51-10.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"模糊滤镜设置")],-1),L=(0,i.Lk)("h2",{id:"动态蒙版",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#动态蒙版"},[(0,i.Lk)("span",null,"动态蒙版")])],-1),w={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Dynamic-Mask",target:"_blank",rel:"noopener noreferrer"},S=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/2023-01-08-07-05-42.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"动态蒙版")],-1),X=(0,i.Lk)("h2",{id:"sdf-特效",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#sdf-特效"},[(0,i.Lk)("span",null,"SDF 特效")])],-1),y={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-SDF-Effects",target:"_blank",rel:"noopener noreferrer"},x={href:"https://jishuin.proginn.com/p/763bfbd5a086",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/Xaymar/obs-StreamFX/issues/512",target:"_blank",rel:"noopener noreferrer"},D=(0,i.Fv)('
    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),W={href:"https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Upscaling",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Denoising",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Auto-Framing",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Virtual-Greenscreen",target:"_blank",rel:"noopener noreferrer"},N=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:"https://img.newzone.top/2023-01-07-23-19-50.png",alt:"",tabindex:"0",loading:"lazy"}),(0,i.Lk)("figcaption",null,"人像背景移除")],-1),M={},A=(0,n(3671).A)(M,[["render",function(e,t){const n=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[a,r,(0,i.Lk)("p",null,[(0,i.eW)("访问 "),(0,i.Lk)("a",o,[(0,i.eW)("StreamFX 发布页"),(0,i.bF)(n)]),(0,i.eW)(",选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 "),(0,i.Lk)("a",l,[(0,i.eW)("obs-StreamFX/BUILDING.md"),(0,i.bF)(n)]),(0,i.eW)(" 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 "),(0,i.Lk)("a",p,[(0,i.eW)("MonoLogueChi/obs-StreamFX-build"),(0,i.bF)(n)]),(0,i.eW)("。")]),(0,i.Lk)("p",null,[(0,i.eW)("在升级插件前,请按照"),(0,i.Lk)("a",g,[(0,i.eW)("卸载教程"),(0,i.bF)(n)]),(0,i.eW)("执行旧版的清理操作。")]),s,m,c,(0,i.Lk)("p",null,[(0,i.Lk)("a",h,[(0,i.eW)("来源镜像"),(0,i.bF)(n)]),(0,i.eW)("(Source Mirror)是一种来源,而不是滤镜。它可以克隆任何源或场景,并将其应用于当前场景。对来源镜像叠加滤镜和任意效果,都不会对原始来源造成影响。")]),u,(0,i.Lk)("p",null,[(0,i.Lk)("a",d,[(0,i.eW)("3D 转换"),(0,i.bF)(n)]),(0,i.eW)("(3D Transform)可以将 2D 图片的坐标系转换为三维,从而可以自由旋转、移动和缩放,形成类似星球大战中的字幕特效。")]),f,b,(0,i.Lk)("p",null,[(0,i.Lk)("a",k,[(0,i.eW)("模糊"),(0,i.bF)(n)]),(0,i.eW)("(Blur Filter)提供五种模糊类型:Box、Box Linear、Gaussian、Gaussian Linear 和 Dual Filtering。建议将类型设置为「Dual Filtering(双重过滤)」,大小设为 5。应用蒙版后,可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。如果只需要对部分区域进行模糊,勾选「应用蒙版」并适量设置「羽化区域」(如 10),以避免模糊边缘显得过于突出。")]),z,F,L,(0,i.Lk)("p",null,[(0,i.Lk)("a",w,[(0,i.eW)("动态蒙版"),(0,i.bF)(n)]),(0,i.eW)("(Dynamic Mask)允许叠加任意来源或场景,并使用红色、绿色、蓝色和 alpha 通道建立画面蒙版。下图展示了使用红色通道叠加雨滴来源的效果。")]),S,X,(0,i.Lk)("p",null,[(0,i.Lk)("a",y,[(0,i.eW)("SDF 特效"),(0,i.bF)(n)]),(0,i.eW)("(Shader Signed Distance Field Effects)仅对拥有透明图层的画面有效,比如被移除背景后的摄像头画面。SDF 特效会对外观轮廓进行发光处理,并占用大量显存性能。!["),(0,i.Lk)("a",x,[(0,i.eW)("什么是 SDF?"),(0,i.bF)(n)]),(0,i.eW)("] !["),(0,i.Lk)("a",_,[(0,i.eW)('"SDF Effects" filter is undocumented'),(0,i.bF)(n)]),(0,i.eW)("]")]),D,(0,i.Lk)("p",null,[(0,i.eW)("本部分的滤镜需要需 NVIDIA 2060 及以上显卡,并安装 "),(0,i.Lk)("a",W,[(0,i.eW)("NVIDIA Video Effects & AR SDK Redistributable"),(0,i.bF)(n)]),(0,i.eW)("。这些滤镜效果均可用 NVIDIA Broadcast 实现。")]),(0,i.Lk)("ul",null,[(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.Lk)("a",v,[(0,i.eW)("画质提升"),(0,i.bF)(n)]),(0,i.eW)("(Upscaling):提升画质分辨率,可以将老式摄像头提升到 4K 画质。")])]),(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.Lk)("a",B,[(0,i.eW)("降噪"),(0,i.bF)(n)]),(0,i.eW)("(Denoising Filter):对画面进行降噪。")])]),(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.Lk)("a",I,[(0,i.eW)("自动帧"),(0,i.bF)(n)]),(0,i.eW)("(Auto-Framing):通过 NVIDIA AR 的自动追踪人脸技术,自动裁剪和放大用户、并且在用户移动时保持帧居中。")])]),(0,i.Lk)("li",null,[(0,i.Lk)("p",null,[(0,i.Lk)("a",O,[(0,i.eW)("英伟达背景移除"),(0,i.bF)(n)]),(0,i.eW)("(Virtual Greenscreen):无需绿幕也能帮你移除人像背景,移除效果略逊色于 NVIDIA Broadcast。样图是用的是漫画,如果是真人画面,移除效果会好很多。")]),N])])])}]]),C=JSON.parse('{"path":"/apps/livestreaming/2_obs_streamfx.html","title":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件","lang":"zh-CN","frontmatter":{"title":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件","category":["工具"],"tag":["OBS","直播"],"order":2,"description":"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。 安装 StreamFX 访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 S...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/2_obs_streamfx.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件"}],["meta",{"property":"og:description","content":"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。 安装 StreamFX 访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 S..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-07-23-27-34.png \\"样例原图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OBS"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件\\",\\"image\\":[\\"https://img.newzone.top/2023-01-07-23-27-34.png \\\\\\"样例原图\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-27-01.png \\\\\\"3D 转换\\\\\\"\\",\\"https://img.newzone.top/2023-01-08-06-49-05.png \\\\\\"右侧为模糊效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-06-02-51-10.png \\\\\\"模糊滤镜设置\\\\\\"\\",\\"https://img.newzone.top/2023-01-08-07-05-42.png \\\\\\"动态蒙版\\\\\\"\\",\\"https://jishuin.proginn.com/p/763bfbd5a086\\",\\"https://github.com/Xaymar/obs-StreamFX/issues/512\\",\\"https://img.newzone.top/2023-01-09-18-56-14.webp \\\\\\"SDF 特效-外发光+变形\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-11-16.png \\\\\\"colorize\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-46-26.png \\\\\\"posterize\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-03-18.png \\\\\\"smaa\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-14-10.png \\\\\\"bulge_pinch 凸起效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-14-47.png \\\\\\"bulge_pinch 凹下的效果\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-02-59.png \\\\\\"displace\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-57-18.gif?imageMogr2/format/webp \\\\\\"drunk\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-06-45.png \\\\\\"swirl\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-12-23.png \\\\\\"wave\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-30-25.png \\\\\\"zigzag\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-48-41.png \\\\\\"pixelation\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-50-21.png \\\\\\"hexagonize\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-32-17.png \\\\\\"semiline\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-10-30.png \\\\\\"vignette\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-43-07.png \\\\\\"rounded-rect\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-09-05.png \\\\\\"crt-curvature\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-06-17.gif?imageMogr2/format/webp \\\\\\"crt-scanlines\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-22-44-59.png \\\\\\"repeat\\\\\\"\\",\\"https://img.newzone.top/2023-01-07-23-19-50.png \\\\\\"人像背景移除\\\\\\"\\"],\\"dateModified\\":\\"2023-11-29T01:58:17.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"安装 StreamFX","slug":"安装-streamfx","link":"#安装-streamfx","children":[]},{"level":2,"title":"来源镜像","slug":"来源镜像","link":"#来源镜像","children":[]},{"level":2,"title":"3D 转换","slug":"_3d-转换","link":"#_3d-转换","children":[]},{"level":2,"title":"模糊","slug":"模糊","link":"#模糊","children":[]},{"level":2,"title":"动态蒙版","slug":"动态蒙版","link":"#动态蒙版","children":[]},{"level":2,"title":"SDF 特效","slug":"sdf-特效","link":"#sdf-特效","children":[]},{"level":2,"title":"着色器","slug":"着色器","link":"#着色器","children":[{"level":3,"title":"色彩滤镜","slug":"色彩滤镜","link":"#色彩滤镜","children":[]},{"level":3,"title":"位移变换","slug":"位移变换","link":"#位移变换","children":[]},{"level":3,"title":"画面遮盖","slug":"画面遮盖","link":"#画面遮盖","children":[]},{"level":3,"title":"增强滤镜","slug":"增强滤镜","link":"#增强滤镜","children":[]}]},{"level":2,"title":"N 卡滤镜","slug":"n-卡滤镜","link":"#n-卡滤镜","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":5.13,"words":1540},"filePathRelative":"apps/livestreaming/2_obs_streamfx.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    安装 StreamFX

    \\n

    访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 MonoLogueChi/obs-StreamFX-build

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/3256.d558401c.js b/assets/js/3256.d558401c.js deleted file mode 100644 index b6d8a4020..000000000 --- a/assets/js/3256.d558401c.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 3256.d558401c.js.LICENSE.txt */ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3256],{6432:(e,t,n)=>{n.d(t,{C7:()=>De,IL:()=>Le,Ir:()=>Ae,KV:()=>ze,Md:()=>ke,Nc:()=>Se,Oi:()=>Be,S0:()=>g,S6:()=>Me,YT:()=>r,_I:()=>c,_o:()=>i,ao:()=>s,cB:()=>he,cf:()=>Re,g3:()=>be,g7:()=>ve,gV:()=>L,kH:()=>A,kl:()=>Te,nc:()=>ge,qo:()=>y,sR:()=>fe,st:()=>we});var a=n(4256);let l,o;class r{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=l,!e&&l&&(this.index=(l.scopes||(l.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=l;try{return l=this,e()}finally{l=t}}}on(){l=this}off(){l=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t=2))break}this._dirtyLevel<2&&(this._dirtyLevel=0),y()}return this._dirtyLevel>=2}set dirty(e){this._dirtyLevel=e?2:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let e=v,t=o;try{return v=!0,o=this,this._runnings++,p(this),this.fn()}finally{d(this),this._runnings--,o=t,v=e}}stop(){var e;this.active&&(p(this),d(this),null==(e=this.onStop)||e.call(this),this.active=!1)}}function u(e){return e.value}function p(e){e._trackId++,e._depsLength=0}function d(e){if(e.deps&&e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},M=new WeakMap,E=Symbol(""),I=Symbol("");function A(e,t,n){if(v&&o){let t=M.get(e);t||M.set(e,t=new Map);let a=t.get(n);a||t.set(n,a=C((()=>t.delete(n)))),S(o,a)}}function L(e,t,n,l,o,r){const s=M.get(e);if(!s)return;let i=[];if("clear"===t)i=[...s.values()];else if("length"===n&&(0,a.c7)(e)){const e=Number(l);s.forEach(((t,n)=>{("length"===n||!(0,a.aO)(n)&&n>=e)&&i.push(t)}))}else switch(void 0!==n&&i.push(s.get(n)),t){case"add":(0,a.c7)(e)?(0,a.cJ)(n)&&i.push(s.get("length")):(i.push(s.get(E)),(0,a.cF)(e)&&i.push(s.get(I)));break;case"delete":(0,a.c7)(e)||(i.push(s.get(E)),(0,a.cF)(e)&&i.push(s.get(I)));break;case"set":(0,a.cF)(e)&&i.push(s.get(E))}b();for(const e of i)e&&_(e,2);w()}const T=(0,a.kX)("__proto__,__v_isRef,__isVue"),O=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(a.aO)),$=z();function z(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Se(this);for(let e=0,t=this.length;e{e[t]=function(...e){g(),b();const n=Se(this)[t].apply(this,e);return w(),y(),n}})),e}function N(e){const t=Se(this);return A(t,0,e),t.hasOwnProperty(e)}class R{constructor(e=!1,t=!1){this._isReadonly=e,this._shallow=t}get(e,t,n){const l=this._isReadonly,o=this._shallow;if("__v_isReactive"===t)return!l;if("__v_isReadonly"===t)return l;if("__v_isShallow"===t)return o;if("__v_raw"===t)return n===(l?o?de:pe:o?ue:ce).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const r=(0,a.c7)(e);if(!l){if(r&&(0,a.Yz)($,t))return Reflect.get($,t,n);if("hasOwnProperty"===t)return N}const s=Reflect.get(e,t,n);return((0,a.aO)(t)?O.has(t):T(t))?s:(l||A(e,0,t),o?s:Ae(s)?r&&(0,a.cJ)(t)?s:s.value:(0,a.Y9)(s)?l?fe(s):he(s):s)}}class P extends R{constructor(e=!1){super(!1,e)}set(e,t,n,l){let o=e[t];if(!this._shallow){const t=ye(o);if(be(n)||ye(n)||(o=Se(o),n=Se(n)),!(0,a.c7)(e)&&Ae(o)&&!Ae(n))return!t&&(o.value=n,!0)}const r=(0,a.c7)(e)&&(0,a.cJ)(t)?Number(t)e,V=e=>Reflect.getPrototypeOf(e);function H(e,t,n=!1,l=!1){const o=Se(e=e.__v_raw),r=Se(t);n||((0,a.mz)(t,r)&&A(o,0,t),A(o,0,r));const{has:s}=V(o),i=l?F:n?xe:_e;return s.call(o,t)?i(e.get(t)):s.call(o,r)?i(e.get(r)):void(e!==o&&e.get(t))}function K(e,t=!1){const n=this.__v_raw,l=Se(n),o=Se(e);return t||((0,a.mz)(e,o)&&A(l,0,e),A(l,0,o)),e===o?n.has(e):n.has(e)||n.has(o)}function q(e,t=!1){return e=e.__v_raw,!t&&A(Se(e),0,E),Reflect.get(e,"size",e)}function Y(e){e=Se(e);const t=Se(this);return V(t).has.call(t,e)||(t.add(e),L(t,"add",e,e)),this}function W(e,t){t=Se(t);const n=Se(this),{has:l,get:o}=V(n);let r=l.call(n,e);r||(e=Se(e),r=l.call(n,e));const s=o.call(n,e);return n.set(e,t),r?(0,a.mz)(t,s)&&L(n,"set",e,t):L(n,"add",e,t),this}function G(e){const t=Se(this),{has:n,get:a}=V(t);let l=n.call(t,e);l||(e=Se(e),l=n.call(t,e)),a&&a.call(t,e);const o=t.delete(e);return l&&L(t,"delete",e,void 0),o}function Q(){const e=Se(this),t=0!==e.size,n=e.clear();return t&&L(e,"clear",void 0,void 0),n}function X(e,t){return function(n,a){const l=this,o=l.__v_raw,r=Se(o),s=t?F:e?xe:_e;return!e&&A(r,0,E),o.forEach(((e,t)=>n.call(a,s(e),s(t),l)))}}function Z(e,t,n){return function(...l){const o=this.__v_raw,r=Se(o),s=(0,a.cF)(r),i="entries"===e||e===Symbol.iterator&&s,c="keys"===e&&s,u=o[e](...l),p=n?F:t?xe:_e;return!t&&A(r,0,c?I:E),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:i?[p(e[0]),p(e[1])]:p(e),done:t}},[Symbol.iterator](){return this}}}}function J(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function ee(){const e={get(e){return H(this,e)},get size(){return q(this)},has:K,add:Y,set:W,delete:G,clear:Q,forEach:X(!1,!1)},t={get(e){return H(this,e,!1,!0)},get size(){return q(this)},has:K,add:Y,set:W,delete:G,clear:Q,forEach:X(!1,!0)},n={get(e){return H(this,e,!0)},get size(){return q(this,!0)},has(e){return K.call(this,e,!0)},add:J("add"),set:J("set"),delete:J("delete"),clear:J("clear"),forEach:X(!0,!1)},a={get(e){return H(this,e,!0,!0)},get size(){return q(this,!0)},has(e){return K.call(this,e,!0)},add:J("add"),set:J("set"),delete:J("delete"),clear:J("clear"),forEach:X(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((l=>{e[l]=Z(l,!1,!1),n[l]=Z(l,!0,!1),t[l]=Z(l,!1,!0),a[l]=Z(l,!0,!0)})),[e,n,t,a]}const[te,ne,ae,le]=ee();function oe(e,t){const n=t?e?le:ae:e?ne:te;return(t,l,o)=>"__v_isReactive"===l?!e:"__v_isReadonly"===l?e:"__v_raw"===l?t:Reflect.get((0,a.Yz)(n,l)&&l in t?n:t,l,o)}const re={get:oe(!1,!1)},se={get:oe(!1,!0)},ie={get:oe(!0,!1)},ce=new WeakMap,ue=new WeakMap,pe=new WeakMap,de=new WeakMap;function he(e){return ye(e)?e:me(e,!1,U,re,ce)}function ve(e){return me(e,!1,D,se,ue)}function fe(e){return me(e,!0,j,ie,pe)}function me(e,t,n,l,o){if(!(0,a.Y9)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const r=o.get(e);if(r)return r;const s=(i=e).__v_skip||!Object.isExtensible(i)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,a.An)(i));var i;if(0===s)return e;const c=new Proxy(e,2===s?l:n);return o.set(e,c),c}function ge(e){return ye(e)?ge(e.__v_raw):!(!e||!e.__v_isReactive)}function ye(e){return!(!e||!e.__v_isReadonly)}function be(e){return!(!e||!e.__v_isShallow)}function we(e){return ge(e)||ye(e)}function Se(e){const t=e&&e.__v_raw;return t?Se(t):e}function ke(e){return(0,a.u6)(e,"__v_skip",!0),e}const _e=e=>(0,a.Y9)(e)?he(e):e,xe=e=>(0,a.Y9)(e)?fe(e):e;class Ce{constructor(e,t,n,a){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new c((()=>e(this._value)),(()=>Ie(this,1)),(()=>this.dep&&x(this.dep))),this.effect.computed=this,this.effect.active=this._cacheable=!a,this.__v_isReadonly=n}get value(){const e=Se(this);return e._cacheable&&!e.effect.dirty||(0,a.mz)(e._value,e._value=e.effect.run())&&Ie(e,2),Ee(e),e.effect._dirtyLevel>=1&&Ie(e,1),e._value}set value(e){this._setter(e)}get _dirty(){return this.effect.dirty}set _dirty(e){this.effect.dirty=e}}function Me(e,t,n=!1){let l,o;const r=(0,a.mg)(e);return r?(l=e,o=a.e_):(l=e.get,o=e.set),new Ce(l,o,r||!o,n)}function Ee(e){v&&o&&(e=Se(e),S(o,e.dep||(e.dep=C((()=>e.dep=void 0),e instanceof Ce?e:void 0))))}function Ie(e,t=2,n){const a=(e=Se(e)).dep;a&&_(a,t)}function Ae(e){return!(!e||!0!==e.__v_isRef)}function Le(e){return Oe(e,!1)}function Te(e){return Oe(e,!0)}function Oe(e,t){return Ae(e)?e:new $e(e,t)}class $e{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Se(e),this._value=t?e:_e(e)}get value(){return Ee(this),this._value}set value(e){const t=this.__v_isShallow||be(e)||ye(e);e=t?e:Se(e),(0,a.mz)(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:_e(e),Ie(this,2))}}function ze(e){return Ae(e)?e.value:e}const Ne={get:(e,t,n)=>ze(Reflect.get(e,t,n)),set:(e,t,n,a)=>{const l=e[t];return Ae(l)&&!Ae(n)?(l.value=n,!0):Reflect.set(e,t,n,a)}};function Re(e){return ge(e)?e:new Proxy(e,Ne)}class Pe{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ee(this)),(()=>Ie(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function Be(e){return new Pe(e)}class Ue{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return e=Se(this._object),t=this._key,null==(n=M.get(e))?void 0:n.get(t);var e,t,n}}class je{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function De(e,t,n){return Ae(e)?e:(0,a.mg)(e)?new je(e):(0,a.Y9)(e)&&arguments.length>1?function(e,t,n){const a=e[t];return Ae(a)?a:new Ue(e,t,n)}(e,t,n):Le(e)}},3968:(e,t,n)=>{n.d(t,{An:()=>Ft,Az:()=>Vt,CA:()=>Ct,E1:()=>D,GE:()=>Ae,IL:()=>Jt,In:()=>le,K2:()=>Qt,Kg:()=>G,Mn:()=>me,O:()=>xt,OA:()=>Ie,QD:()=>Gt,Ql:()=>N,S6:()=>Cn,Wz:()=>Bt,YN:()=>ce,Zl:()=>nt,_M:()=>ve,_S:()=>cn,a1:()=>he,a6:()=>u,ae:()=>Ot,c1:()=>se,g1:()=>en,h:()=>Mn,mY:()=>Zt,mi:()=>Ne,o$:()=>S,oR:()=>re,q6:()=>Y,u2:()=>Me,uS:()=>de,uU:()=>at,wt:()=>ee,wx:()=>Le});var a=n(6432),l=n(4256);const o=[];function r(e,...t){(0,a.S0)();const n=o.length?o[o.length-1].component:null,l=n&&n.appContext.config.warnHandler,r=function(){let e=o[o.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const a=e.component&&e.component.parent;e=a&&a.vnode}return t}();if(l)c(l,n,11,[e+t.join(""),n&&n.proxy,r.map((({vnode:e})=>`at <${xn(n,e.type)}>`)).join("\n"),r]);else{const n=[`[Vue warn]: ${e}`,...t];r.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",a=!!e.component&&null==e.component.parent,l=` at <${xn(e.component,e.type,a)}`,o=">"+n;return e.props?[l,...s(e.props),o]:[l+o]}(e))})),t}(r)),console.warn(...n)}(0,a.qo)()}function s(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...i(n,e[n]))})),n.length>3&&t.push(" ..."),t}function i(e,t,n){return(0,l.ct)(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:(0,a.Ir)(t)?(t=i(e,(0,a.Nc)(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):(0,l.mg)(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=(0,a.Nc)(t),n?t:[`${e}=`,t])}function c(e,t,n,a){let l;try{l=a?e(...a):e()}catch(e){p(e,t,n)}return l}function u(e,t,n,a){if((0,l.mg)(e)){const o=c(e,t,n,a);return o&&(0,l.um)(o)&&o.catch((e=>{p(e,t,n)})),o}const o=[];for(let l=0;l>>1,l=v[a],o=M(l);oM(e)-M(t)));if(m.length=0,g)return void g.push(...e);for(g=e,y=0;ynull==e.id?1/0:e.id,E=(e,t)=>{const n=M(e)-M(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function I(e){h=!1,d=!0,v.sort(E),l.e_;try{for(f=0;f(0,l.ct)(e)?e.trim():e))),t&&(o=n.map(l.wB))}let i,c=a[i=(0,l.GM)(t)]||a[i=(0,l.GM)((0,l.AX)(t))];!c&&r&&(c=a[i=(0,l.GM)((0,l.c$)(t))]),c&&u(c,e,6,o);const p=a[i+"Once"];if(p){if(e.emitted){if(e.emitted[i])return}else e.emitted={};e.emitted[i]=!0,u(p,e,6,o)}}function L(e,t,n=!1){const a=t.emitsCache,o=a.get(e);if(void 0!==o)return o;const r=e.emits;let s={},i=!1;if(!(0,l.mg)(e)){const a=e=>{const n=L(e,t,!0);n&&(i=!0,(0,l.SU)(s,n))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return r||i?((0,l.c7)(r)?r.forEach((e=>s[e]=null)):(0,l.SU)(s,r),(0,l.Y9)(e)&&a.set(e,s),s):((0,l.Y9)(e)&&a.set(e,null),null)}function T(e,t){return!(!e||!(0,l.W8)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,l.Yz)(e,t[0].toLowerCase()+t.slice(1))||(0,l.Yz)(e,(0,l.c$)(t))||(0,l.Yz)(e,t))}let O=null,$=null;function z(e){const t=O;return O=e,$=e&&e.type.__scopeId||null,t}function N(e,t=O,n){if(!t)return e;if(e._n)return e;const a=(...n)=>{a._d&&jt(-1);const l=z(t);let o;try{o=e(...n)}finally{z(l),a._d&&jt(1)}return o};return a._n=!0,a._c=!0,a._d=!0,a}function R(e){const{type:t,vnode:n,proxy:a,withProxy:o,props:r,propsOptions:[s],slots:i,attrs:c,emit:u,render:d,renderCache:h,data:v,setupState:f,ctx:m,inheritAttrs:g}=e;let y,b;const w=z(e);try{if(4&n.shapeFlag){const e=o||a,t=e;y=tn(d.call(t,e,h,r,f,v,m)),b=c}else{const e=t;y=tn(e.length>1?e(r,{attrs:c,slots:i,emit:u}):e(r,null)),b=t.props?c:P(c)}}catch(t){Rt.length=0,p(t,e,1),y=Qt(zt)}let S=y;if(b&&!1!==g){const e=Object.keys(b),{shapeFlag:t}=S;e.length&&7&t&&(s&&e.some(l._w)&&(b=B(b,s)),S=Xt(S,b))}return n.dirs&&(S=Xt(S),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&(S.transition=n.transition),y=S,z(w),y}const P=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,l.W8)(n))&&((t||(t={}))[n]=e[n]);return t},B=(e,t)=>{const n={};for(const a in e)(0,l._w)(a)&&a.slice(9)in t||(n[a]=e[a]);return n};function U(e,t,n){const a=Object.keys(t);if(a.length!==Object.keys(e).length)return!0;for(let l=0;lat(K);function Y(e,t){return Q(e,null,t)}const W={};function G(e,t,n){return Q(e,t,n)}function Q(e,t,{immediate:n,deep:o,flush:r,once:s,onTrack:i,onTrigger:p}=l.kx){if(t&&s){const e=t;t=(...t)=>{e(...t),M()}}const d=sn,h=e=>!0===o?e:J(e,!1===o?1:void 0);let v,f,m=!1,g=!1;if((0,a.Ir)(e)?(v=()=>e.value,m=(0,a.g3)(e)):(0,a.nc)(e)?(v=()=>h(e),m=!0):(0,l.c7)(e)?(g=!0,m=e.some((e=>(0,a.nc)(e)||(0,a.g3)(e))),v=()=>e.map((e=>(0,a.Ir)(e)?e.value:(0,a.nc)(e)?h(e):(0,l.mg)(e)?c(e,d,2):void 0))):v=(0,l.mg)(e)?t?()=>c(e,d,2):()=>(f&&f(),u(e,d,3,[b])):l.e_,t&&o){const e=v;v=()=>J(e())}let y,b=e=>{f=x.onStop=()=>{c(e,d,4),f=x.onStop=void 0}};if(gn){if(b=l.e_,t?n&&u(t,d,3,[v(),g?[]:void 0,b]):v(),"sync"!==r)return l.e_;{const e=q();y=e.__watcherHandles||(e.__watcherHandles=[])}}let w=g?new Array(e.length).fill(W):W;const S=()=>{if(x.active&&x.dirty)if(t){const e=x.run();(o||m||(g?e.some(((e,t)=>(0,l.mz)(e,w[t]))):(0,l.mz)(e,w)))&&(f&&f(),u(t,d,3,[e,w===W?void 0:g&&w[0]===W?[]:w,b]),w=e)}else x.run()};let _;S.allowRecurse=!!t,"sync"===r?_=S:"post"===r?_=()=>_t(S,d&&d.suspense):(S.pre=!0,d&&(S.id=d.uid),_=()=>k(S));const x=new a._I(v,l.e_,_),C=(0,a.ao)(),M=()=>{x.stop(),C&&(0,l.aE)(C.effects,x)};return t?n?S():w=x.run():"post"===r?_t(x.run.bind(x),d&&d.suspense):x.run(),y&&y.push(M),M}function X(e,t,n){const a=this.proxy,o=(0,l.ct)(e)?e.includes(".")?Z(a,e):()=>a[e]:e.bind(a,a);let r;(0,l.mg)(t)?r=t:(r=t.handler,n=t);const s=dn(this),i=Q(o,r.bind(a),n);return s(),i}function Z(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e0){if(n>=t)return e;n++}if((o=o||new Set).has(e))return e;if(o.add(e),(0,a.Ir)(e))J(e.value,t,n,o);else if((0,l.c7)(e))for(let a=0;a{J(e,t,n,o)}));else if((0,l.oF)(e))for(const a in e)J(e[a],t,n,o);return e}function ee(e,t){if(null===O)return e;const n=wn(O)||O.proxy,a=e.dirs||(e.dirs=[]);for(let e=0;e{e.isMounted=!0})),Ae((()=>{e.isUnmounting=!0})),e}const oe=[Function,Array],re={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:oe,onEnter:oe,onAfterEnter:oe,onEnterCancelled:oe,onBeforeLeave:oe,onLeave:oe,onAfterLeave:oe,onLeaveCancelled:oe,onBeforeAppear:oe,onAppear:oe,onAfterAppear:oe,onAppearCancelled:oe},se={name:"BaseTransition",props:re,setup(e,{slots:t}){const n=cn(),l=le();let o;return()=>{const r=t.default&&he(t.default(),!0);if(!r||!r.length)return;let s=r[0];if(r.length>1){let e=!1;for(const t of r)if(t.type!==zt){s=t,e=!0;break}}const i=(0,a.Nc)(e),{mode:c}=i;if(l.isLeaving)return ue(s);const u=pe(s);if(!u)return ue(s);const p=ce(u,i,l,n);de(u,p);const d=n.subTree,h=d&&pe(d);let v=!1;const{getTransitionKey:f}=u.type;if(f){const e=f();void 0===o?o=e:e!==o&&(o=e,v=!0)}if(h&&h.type!==zt&&(!Kt(u,h)||v)){const e=ce(h,i,l,n);if(de(h,e),"out-in"===c)return l.isLeaving=!0,e.afterLeave=()=>{l.isLeaving=!1,!1!==n.update.active&&(n.effect.dirty=!0,n.update())},ue(s);"in-out"===c&&u.type!==zt&&(e.delayLeave=(e,t,n)=>{ie(l,h)[String(h.key)]=h,e[ne]=()=>{t(),e[ne]=void 0,delete p.delayedLeave},p.delayedLeave=n})}return s}}};function ie(e,t){const{leavingVNodes:n}=e;let a=n.get(t.type);return a||(a=Object.create(null),n.set(t.type,a)),a}function ce(e,t,n,a){const{appear:o,mode:r,persisted:s=!1,onBeforeEnter:i,onEnter:c,onAfterEnter:p,onEnterCancelled:d,onBeforeLeave:h,onLeave:v,onAfterLeave:f,onLeaveCancelled:m,onBeforeAppear:g,onAppear:y,onAfterAppear:b,onAppearCancelled:w}=t,S=String(e.key),k=ie(n,e),_=(e,t)=>{e&&u(e,a,9,t)},x=(e,t)=>{const n=t[1];_(e,t),(0,l.c7)(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},C={mode:r,persisted:s,beforeEnter(t){let a=i;if(!n.isMounted){if(!o)return;a=g||i}t[ne]&&t[ne](!0);const l=k[S];l&&Kt(e,l)&&l.el[ne]&&l.el[ne](),_(a,[t])},enter(e){let t=c,a=p,l=d;if(!n.isMounted){if(!o)return;t=y||c,a=b||p,l=w||d}let r=!1;const s=e[ae]=t=>{r||(r=!0,_(t?l:a,[e]),C.delayedLeave&&C.delayedLeave(),e[ae]=void 0)};t?x(t,[e,s]):s()},leave(t,a){const l=String(e.key);if(t[ae]&&t[ae](!0),n.isUnmounting)return a();_(h,[t]);let o=!1;const r=t[ne]=n=>{o||(o=!0,a(),_(n?m:f,[t]),t[ne]=void 0,k[l]===e&&delete k[l])};k[l]=e,v?x(v,[t,r]):r()},clone:e=>ce(e,t,n,a)};return C}function ue(e){if(ye(e))return(e=Xt(e)).children=null,e}function pe(e){return ye(e)?e.children?e.children[0]:void 0:e}function de(e,t){6&e.shapeFlag&&e.component?de(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function he(e,t=!1,n){let a=[],l=0;for(let o=0;o1)for(let e=0;e(0,l.SU)({name:e.name},t,{setup:e}))():e}const fe=e=>!!e.type.__asyncLoader;function me(e){(0,l.mg)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:o,delay:r=200,timeout:s,suspensible:i=!0,onError:c}=e;let u,d=null,h=0;const v=()=>{let e;return d||(e=d=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{c(e,(()=>t((h++,d=null,v()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==d&&d?d:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),u=t,t))))};return ve({name:"AsyncComponentWrapper",__asyncLoader:v,get __asyncResolved(){return u},setup(){const e=sn;if(u)return()=>ge(u,e);const t=t=>{d=null,p(t,e,13,!o)};if(i&&e.suspense||gn)return v().then((t=>()=>ge(t,e))).catch((e=>(t(e),()=>o?Qt(o,{error:e}):null)));const l=(0,a.IL)(!1),c=(0,a.IL)(),h=(0,a.IL)(!!r);return r&&setTimeout((()=>{h.value=!1}),r),null!=s&&setTimeout((()=>{if(!l.value&&!c.value){const e=new Error(`Async component timed out after ${s}ms.`);t(e),c.value=e}}),s),v().then((()=>{l.value=!0,e.parent&&ye(e.parent.vnode)&&(e.parent.effect.dirty=!0,k(e.parent.update))})).catch((e=>{t(e),c.value=e})),()=>l.value&&u?ge(u,e):c.value&&o?Qt(o,{error:c.value}):n&&!h.value?Qt(n):void 0}})}function ge(e,t){const{ref:n,props:a,children:l,ce:o}=t.vnode,r=Qt(e,a,l);return r.ref=n,r.ce=o,delete t.vnode.ce,r}const ye=e=>e.type.__isKeepAlive;function be(e,t){Se(e,"a",t)}function we(e,t){Se(e,"da",t)}function Se(e,t,n=sn){const a=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(_e(t,a,n),n){let e=n.parent;for(;e&&e.parent;)ye(e.parent.vnode)&&ke(a,t,n,e),e=e.parent}}function ke(e,t,n,a){const o=_e(t,e,a,!0);Le((()=>{(0,l.aE)(a[t],o)}),n)}function _e(e,t,n=sn,l=!1){if(n){const o=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...l)=>{if(n.isUnmounted)return;(0,a.S0)();const o=dn(n),r=u(t,n,e,l);return o(),(0,a.qo)(),r});return l?o.unshift(r):o.push(r),r}}RegExp,RegExp;const xe=e=>(t,n=sn)=>(!gn||"sp"===e)&&_e(e,((...e)=>t(...e)),n),Ce=xe("bm"),Me=xe("m"),Ee=xe("bu"),Ie=xe("u"),Ae=xe("bum"),Le=xe("um"),Te=xe("sp"),Oe=xe("rtg"),$e=xe("rtc");function ze(e,t=sn){_e("ec",e,t)}function Ne(e,t,n,a){let o;const r=n&&n[a];if((0,l.c7)(e)||(0,l.ct)(e)){o=new Array(e.length);for(let n=0,a=e.length;nt(e,n,void 0,r&&r[n])));else{const n=Object.keys(e);o=new Array(n.length);for(let a=0,l=n.length;ae?vn(e)?wn(e)||e.proxy:Re(e.parent):null,Pe=(0,l.SU)(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=>Re(e.parent),$root:e=>Re(e.root),$emit:e=>e.emit,$options:e=>He(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,k(e.update)}),$nextTick:e=>e.n||(e.n=S.bind(e.proxy)),$watch:e=>X.bind(e)}),Be=(e,t)=>e!==l.kx&&!e.__isScriptSetup&&(0,l.Yz)(e,t),Ue={get({_:e},t){const{ctx:n,setupState:o,data:r,props:s,accessCache:i,type:c,appContext:u}=e;let p;if("$"!==t[0]){const a=i[t];if(void 0!==a)switch(a){case 1:return o[t];case 2:return r[t];case 4:return n[t];case 3:return s[t]}else{if(Be(o,t))return i[t]=1,o[t];if(r!==l.kx&&(0,l.Yz)(r,t))return i[t]=2,r[t];if((p=e.propsOptions[0])&&(0,l.Yz)(p,t))return i[t]=3,s[t];if(n!==l.kx&&(0,l.Yz)(n,t))return i[t]=4,n[t];De&&(i[t]=0)}}const d=Pe[t];let h,v;return d?("$attrs"===t&&(0,a.kH)(e,"get",t),d(e)):(h=c.__cssModules)&&(h=h[t])?h:n!==l.kx&&(0,l.Yz)(n,t)?(i[t]=4,n[t]):(v=u.config.globalProperties,(0,l.Yz)(v,t)?v[t]:void 0)},set({_:e},t,n){const{data:a,setupState:o,ctx:r}=e;return Be(o,t)?(o[t]=n,!0):a!==l.kx&&(0,l.Yz)(a,t)?(a[t]=n,!0):!((0,l.Yz)(e.props,t)||"$"===t[0]&&t.slice(1)in e||(r[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:a,appContext:o,propsOptions:r}},s){let i;return!!n[s]||e!==l.kx&&(0,l.Yz)(e,s)||Be(t,s)||(i=r[0])&&(0,l.Yz)(i,s)||(0,l.Yz)(a,s)||(0,l.Yz)(Pe,s)||(0,l.Yz)(o.config.globalProperties,s)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:(0,l.Yz)(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function je(e){return(0,l.c7)(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}let De=!0;function Fe(e,t,n){u((0,l.c7)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Ve(e,t,n,a){const o=a.includes(".")?Z(n,a):()=>n[a];if((0,l.ct)(e)){const n=t[e];(0,l.mg)(n)&&G(o,n)}else if((0,l.mg)(e))G(o,e.bind(n));else if((0,l.Y9)(e))if((0,l.c7)(e))e.forEach((e=>Ve(e,t,n,a)));else{const a=(0,l.mg)(e.handler)?e.handler.bind(n):t[e.handler];(0,l.mg)(a)&&G(o,a,e)}}function He(e){const t=e.type,{mixins:n,extends:a}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:s}}=e.appContext,i=r.get(t);let c;return i?c=i:o.length||n||a?(c={},o.length&&o.forEach((e=>Ke(c,e,s,!0))),Ke(c,t,s)):c=t,(0,l.Y9)(t)&&r.set(t,c),c}function Ke(e,t,n,a=!1){const{mixins:l,extends:o}=t;o&&Ke(e,o,n,!0),l&&l.forEach((t=>Ke(e,t,n,!0)));for(const l in t)if(a&&"expose"===l);else{const a=qe[l]||n&&n[l];e[l]=a?a(e[l],t[l]):t[l]}return e}const qe={data:Ye,props:Xe,emits:Xe,methods:Qe,computed:Qe,beforeCreate:Ge,created:Ge,beforeMount:Ge,mounted:Ge,beforeUpdate:Ge,updated:Ge,beforeDestroy:Ge,beforeUnmount:Ge,destroyed:Ge,unmounted:Ge,activated:Ge,deactivated:Ge,errorCaptured:Ge,serverPrefetch:Ge,components:Qe,directives:Qe,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,l.SU)(Object.create(null),e);for(const a in t)n[a]=Ge(e[a],t[a]);return n},provide:Ye,inject:function(e,t){return Qe(We(e),We(t))}};function Ye(e,t){return t?e?function(){return(0,l.SU)((0,l.mg)(e)?e.call(this,this):e,(0,l.mg)(t)?t.call(this,this):t)}:t:e}function We(e){if((0,l.c7)(e)){const t={};for(let n=0;n(r.has(e)||(e&&(0,l.mg)(e.install)?(r.add(e),e.install(i,...t)):(0,l.mg)(e)&&(r.add(e),e(i,...t))),i),mixin:e=>(o.mixins.includes(e)||o.mixins.push(e),i),component:(e,t)=>t?(o.components[e]=t,i):o.components[e],directive:(e,t)=>t?(o.directives[e]=t,i):o.directives[e],mount(l,r,c){if(!s){const u=Qt(n,a);return u.appContext=o,!0===c?c="svg":!1===c&&(c=void 0),r&&t?t(u,l):e(u,l,c),s=!0,i._container=l,l.__vue_app__=i,wn(u.component)||u.component.proxy}},unmount(){s&&(e(null,i._container),delete i._container.__vue_app__)},provide:(e,t)=>(o.provides[e]=t,i),runWithContext(e){tt=i;try{return e()}finally{tt=null}}};return i}}let tt=null;function nt(e,t){if(sn){let n=sn.provides;const a=sn.parent&&sn.parent.provides;a===n&&(n=sn.provides=Object.create(a)),n[e]=t}}function at(e,t,n=!1){const a=sn||O;if(a||tt){const o=a?null==a.parent?a.vnode.appContext&&a.vnode.appContext.provides:a.parent.provides:tt._context.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&(0,l.mg)(t)?t.call(a&&a.proxy):t}}function lt(e,t,n,o){const[r,s]=e.propsOptions;let i,c=!1;if(t)for(let a in t){if((0,l.o5)(a))continue;const u=t[a];let p;r&&(0,l.Yz)(r,p=(0,l.AX)(a))?s&&s.includes(p)?(i||(i={}))[p]=u:n[p]=u:T(e.emitsOptions,a)||a in o&&u===o[a]||(o[a]=u,c=!0)}if(s){const t=(0,a.Nc)(n),o=i||l.kx;for(let a=0;a{c=!0;const[n,a]=rt(e,t,!0);(0,l.SU)(s,n),a&&i.push(...a)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!r&&!c)return(0,l.Y9)(e)&&a.set(e,l.yA),l.yA;if((0,l.c7)(r))for(let e=0;e-1,a[1]=n<0||e-1||(0,l.Yz)(a,"default"))&&i.push(t)}}}const u=[s,i];return(0,l.Y9)(e)&&a.set(e,u),u}function st(e){return"$"!==e[0]}function it(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:null===e?"null":""}function ct(e,t){return it(e)===it(t)}function ut(e,t){return(0,l.c7)(t)?t.findIndex((t=>ct(t,e))):(0,l.mg)(t)&&ct(t,e)?0:-1}const pt=e=>"_"===e[0]||"$stable"===e,dt=e=>(0,l.c7)(e)?e.map(tn):[tn(e)],ht=(e,t,n)=>{if(t._n)return t;const a=N(((...e)=>dt(t(...e))),n);return a._c=!1,a},vt=(e,t,n)=>{const a=e._ctx;for(const n in e){if(pt(n))continue;const o=e[n];if((0,l.mg)(o))t[n]=ht(0,o,a);else if(null!=o){const e=dt(o);t[n]=()=>e}}},ft=(e,t)=>{const n=dt(t);e.slots.default=()=>n},mt=(e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,a.Nc)(t),(0,l.u6)(t,"_",n)):vt(t,e.slots={})}else e.slots={},t&&ft(e,t);(0,l.u6)(e.slots,qt,1)},gt=(e,t,n)=>{const{vnode:a,slots:o}=e;let r=!0,s=l.kx;if(32&a.shapeFlag){const e=t._;e?n&&1===e?r=!1:((0,l.SU)(o,t),n||1!==e||delete o._):(r=!t.$stable,vt(t,o)),s=t}else t&&(ft(e,t),s={default:1});if(r)for(const e in o)pt(e)||null!=s[e]||delete o[e]};function yt(e,t,n,o,r=!1){if((0,l.c7)(e))return void e.forEach(((e,a)=>yt(e,t&&((0,l.c7)(t)?t[a]:t),n,o,r)));if(fe(o)&&!r)return;const s=4&o.shapeFlag?wn(o.component)||o.component.proxy:o.el,i=r?null:s,{i:u,r:p}=e,d=t&&t.r,h=u.refs===l.kx?u.refs={}:u.refs,v=u.setupState;if(null!=d&&d!==p&&((0,l.ct)(d)?(h[d]=null,(0,l.Yz)(v,d)&&(v[d]=null)):(0,a.Ir)(d)&&(d.value=null)),(0,l.mg)(p))c(p,u,12,[i,h]);else{const t=(0,l.ct)(p),o=(0,a.Ir)(p),c=e.f;if(t||o){const a=()=>{if(c){const n=t?(0,l.Yz)(v,p)?v[p]:h[p]:p.value;r?(0,l.c7)(n)&&(0,l.aE)(n,s):(0,l.c7)(n)?n.includes(s)||n.push(s):t?(h[p]=[s],(0,l.Yz)(v,p)&&(v[p]=h[p])):(p.value=[s],e.k&&(h[e.k]=p.value))}else t?(h[p]=i,(0,l.Yz)(v,p)&&(v[p]=i)):o&&(p.value=i,e.k&&(h[e.k]=i))};r||c?a():(a.id=-1,_t(a,n))}}}let bt=!1;const wt=e=>(e=>e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)(e)?"svg":(e=>e.namespaceURI.includes("MathML"))(e)?"mathml":void 0,St=e=>8===e.nodeType;function kt(e){const{mt:t,p:n,o:{patchProp:a,createText:o,nextSibling:s,parentNode:i,remove:c,insert:u,createComment:p}}=e,d=(n,a,l,c,p,w=!1)=>{const S=St(n)&&"["===n.data,k=()=>m(n,a,l,c,p,S),{type:_,ref:x,shapeFlag:C,patchFlag:M}=a;let E=n.nodeType;a.el=n,-2===M&&(w=!1,a.dynamicChildren=null);let I=null;switch(_){case $t:3!==E?""===a.children?(u(a.el=o(""),i(n),n),I=n):I=k():(n.data!==a.children&&(bt=!0,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&r("Hydration text mismatch in",n.parentNode,`\n - rendered on server: ${JSON.stringify(n.data)}\n - expected on client: ${JSON.stringify(a.children)}`),n.data=a.children),I=s(n));break;case zt:b(n)?(I=s(n),y(a.el=n.content.firstChild,n,l)):I=8!==E||S?k():s(n);break;case Nt:if(S&&(E=(n=s(n)).nodeType),1===E||3===E){I=n;const e=!a.children.length;for(let t=0;t{i=i||!!t.dynamicChildren;const{type:u,props:p,patchFlag:d,shapeFlag:h,dirs:f,transition:m}=t,g="input"===u||"option"===u;if(g||-1!==d){f&&te(t,null,n,"created");let u,w=!1;if(b(e)){w=At(o,m)&&n&&n.vnode.props&&n.vnode.props.appear;const a=e.content.firstChild;w&&m.beforeEnter(a),y(a,e,n),t.el=e=a}if(16&h&&(!p||!p.innerHTML&&!p.textContent)){let a=v(e.firstChild,t,e,n,o,s,i),l=!1;for(;a;){bt=!0,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!l&&(r("Hydration children mismatch on",e,"\nServer rendered element contains more child nodes than client vdom."),l=!0);const t=a;a=a.nextSibling,c(t)}}else 8&h&&e.textContent!==t.children&&(bt=!0,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&r("Hydration text content mismatch on",e,`\n - rendered on server: ${e.textContent}\n - expected on client: ${t.children}`),e.textContent=t.children);if(p)if(g||!i||48&d)for(const t in p)(g&&(t.endsWith("value")||"indeterminate"===t)||(0,l.W8)(t)&&!(0,l.o5)(t)||"."===t[0])&&a(e,t,null,p[t],void 0,void 0,n);else p.onClick&&a(e,"onClick",null,p.onClick,void 0,void 0,n);(u=p&&p.onVnodeBeforeMount)&&ln(u,n,t),f&&te(t,null,n,"beforeMount"),((u=p&&p.onVnodeMounted)||f||w)&&H((()=>{u&&ln(u,n,t),w&&m.enter(e),f&&te(t,null,n,"mounted")}),o)}return e.nextSibling},v=(e,t,a,l,o,s,i)=>{i=i||!!t.dynamicChildren;const c=t.children,u=c.length;let p=!1;for(let t=0;t{const{slotScopeIds:r}=t;r&&(l=l?l.concat(r):r);const c=i(e),d=v(s(e),t,c,n,a,l,o);return d&&St(d)&&"]"===d.data?s(t.anchor=d):(bt=!0,u(t.anchor=p("]"),c,d),d)},m=(e,t,a,l,o,u)=>{if(bt=!0,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&r("Hydration node mismatch:\n- rendered on server:",e,3===e.nodeType?"(text)":St(e)&&"["===e.data?"(start of fragment)":"","\n- expected on client:",t.type),t.el=null,u){const t=g(e);for(;;){const n=s(e);if(!n||n===t)break;c(n)}}const p=s(e),d=i(e);return c(e),n(null,t,d,p,a,l,wt(d),o),p},g=(e,t="[",n="]")=>{let a=0;for(;e;)if((e=s(e))&&St(e)&&(e.data===t&&a++,e.data===n)){if(0===a)return s(e);a--}return e},y=(e,t,n)=>{const a=t.parentNode;a&&a.replaceChild(e,t);let l=n;for(;l;)l.vnode.el===t&&(l.vnode.el=l.subTree.el=e),l=l.parent},b=e=>1===e.nodeType&&"template"===e.tagName.toLowerCase();return[(e,t)=>{if(!t.hasChildNodes())return __VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&r("Attempting to hydrate existing markup but container is empty. Performing full mount instead."),n(null,e,t),C(),void(t._vnode=e);bt=!1,d(t.firstChild,e,null,null,null),C(),t._vnode=e,bt&&console.error("Hydration completed but contains mismatches.")},d]}const _t=H;function xt(e){return Mt(e)}function Ct(e){return Mt(e,kt)}function Mt(e,t){"boolean"!=typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&((0,l.Ke)().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__=!1),(0,l.Ke)().__VUE__=!0;const{insert:n,remove:o,patchProp:r,createElement:s,createText:i,createComment:u,setText:d,setElementText:h,parentNode:m,nextSibling:g,setScopeId:y=l.e_,insertStaticContent:b}=e,w=(e,t,n,a=null,l=null,o=null,r=void 0,s=null,i=!!t.dynamicChildren)=>{if(e===t)return;e&&!Kt(e,t)&&(a=ee(e),G(e,l,o,!0),e=null),-2===t.patchFlag&&(i=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:p}=t;switch(c){case $t:S(e,t,n,a);break;case zt:_(e,t,n,a);break;case Nt:null==e&&M(t,n,a,r);break;case Ot:B(e,t,n,a,l,o,r,s,i);break;default:1&p?E(e,t,n,a,l,o,r,s,i):6&p?j(e,t,n,a,l,o,r,s,i):(64&p||128&p)&&c.process(e,t,n,a,l,o,r,s,i,le)}null!=u&&l&&yt(u,e&&e.ref,o,t||e,!t)},S=(e,t,a,l)=>{if(null==e)n(t.el=i(t.children),a,l);else{const n=t.el=e.el;t.children!==e.children&&d(n,t.children)}},_=(e,t,a,l)=>{null==e?n(t.el=u(t.children||""),a,l):t.el=e.el},M=(e,t,n,a)=>{[e.el,e.anchor]=b(e.children,t,n,a,e.el,e.anchor)},E=(e,t,n,a,l,o,r,s,i)=>{"svg"===t.type?r="svg":"math"===t.type&&(r="mathml"),null==e?I(t,n,a,l,o,r,s,i):z(e,t,l,o,r,s,i)},I=(e,t,a,o,i,c,u,p)=>{let d,v;const{props:f,shapeFlag:m,transition:g,dirs:y}=e;if(d=e.el=s(e.type,c,f&&f.is,f),8&m?h(d,e.children):16&m&&$(e.children,d,null,o,i,Et(e,c),u,p),y&&te(e,null,o,"created"),O(d,e,e.scopeId,u,o),f){for(const t in f)"value"===t||(0,l.o5)(t)||r(d,t,null,f[t],c,e.children,o,i,J);"value"in f&&r(d,"value",null,f.value,c),(v=f.onVnodeBeforeMount)&&ln(v,o,e)}y&&te(e,null,o,"beforeMount");const b=At(i,g);b&&g.beforeEnter(d),n(d,t,a),((v=f&&f.onVnodeMounted)||b||y)&&_t((()=>{v&&ln(v,o,e),b&&g.enter(d),y&&te(e,null,o,"mounted")}),i)},O=(e,t,n,a,l)=>{if(n&&y(e,n),a)for(let t=0;t{for(let c=i;c{const c=t.el=e.el;let{patchFlag:u,dynamicChildren:p,dirs:d}=t;u|=16&e.patchFlag;const v=e.props||l.kx,f=t.props||l.kx;let m;if(n&&It(n,!1),(m=f.onVnodeBeforeUpdate)&&ln(m,n,t,e),d&&te(t,e,n,"beforeUpdate"),n&&It(n,!0),p?N(e.dynamicChildren,p,c,n,a,Et(t,o),s):i||K(e,t,c,null,n,a,Et(t,o),s,!1),u>0){if(16&u)P(c,t,v,f,n,a,o);else if(2&u&&v.class!==f.class&&r(c,"class",null,f.class,o),4&u&&r(c,"style",v.style,f.style,o),8&u){const l=t.dynamicProps;for(let t=0;t{m&&ln(m,n,t,e),d&&te(t,e,n,"updated")}),a)},N=(e,t,n,a,l,o,r)=>{for(let s=0;s{if(n!==a){if(n!==l.kx)for(const c in n)(0,l.o5)(c)||c in a||r(e,c,n[c],null,i,t.children,o,s,J);for(const c in a){if((0,l.o5)(c))continue;const u=a[c],p=n[c];u!==p&&"value"!==c&&r(e,c,p,u,i,t.children,o,s,J)}"value"in a&&r(e,"value",n.value,a.value,i)}},B=(e,t,a,l,o,r,s,c,u)=>{const p=t.el=e?e.el:i(""),d=t.anchor=e?e.anchor:i("");let{patchFlag:h,dynamicChildren:v,slotScopeIds:f}=t;f&&(c=c?c.concat(f):f),null==e?(n(p,a,l),n(d,a,l),$(t.children||[],a,d,o,r,s,c,u)):h>0&&64&h&&v&&e.dynamicChildren?(N(e.dynamicChildren,v,a,o,r,s,c),(null!=t.key||o&&t===o.subTree)&&Lt(e,t,!0)):K(e,t,a,d,o,r,s,c,u)},j=(e,t,n,a,l,o,r,s,i)=>{t.slotScopeIds=s,null==e?512&t.shapeFlag?l.ctx.activate(t,n,a,r,i):D(t,n,a,l,o,r,i):F(e,t,i)},D=(e,t,n,o,r,s,i)=>{const u=e.component=function(e,t,n){const o=e.type,r=(t?t.appContext:e.appContext)||on,s={uid:rn++,vnode:e,type:o,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,scope:new a.YT(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:rt(o,r),emitsOptions:L(o,r),emit:null,emitted:null,propsDefaults:l.kx,inheritAttrs:o.inheritAttrs,ctx:l.kx,data:l.kx,props:l.kx,attrs:l.kx,slots:l.kx,refs:l.kx,setupState:l.kx,setupContext:null,attrsProxy:null,slotsProxy:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=A.bind(null,s),e.ce&&e.ce(s),s}(e,o,r);if(ye(e)&&(u.ctx.renderer=le),function(e,t=!1){t&&pn(t);const{props:n,children:o}=e.vnode,r=vn(e);!function(e,t,n,o=!1){const r={},s={};(0,l.u6)(s,qt,1),e.propsDefaults=Object.create(null),lt(e,t,r,s);for(const t in e.propsOptions[0])t in r||(r[t]=void 0);n?e.props=o?r:(0,a.g7)(r):e.type.props?e.props=r:e.props=s,e.attrs=s}(e,n,r,t),mt(e,o);const s=r?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,a.Md)(new Proxy(e.ctx,Ue));const{setup:o}=n;if(o){const n=e.setupContext=o.length>1?function(e){const t=t=>{e.exposed=t||{}};return{get attrs(){return function(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get:(t,n)=>((0,a.kH)(e,"get","$attrs"),t[n])}))}(e)},slots:e.slots,emit:e.emit,expose:t}}(e):null,r=dn(e);(0,a.S0)();const s=c(o,e,0,[e.props,n]);if((0,a.qo)(),r(),(0,l.um)(s)){if(s.then(hn,hn),t)return s.then((n=>{yn(e,n,t)})).catch((t=>{p(t,e,0)}));e.asyncDep=s}else yn(e,s,t)}else bn(e,t)}(e,t):void 0;t&&pn(!1)}(u),u.asyncDep){if(r&&r.registerDep(u,V),!e.el){const e=u.subTree=Qt(zt);_(null,e,t,n)}}else V(u,e,t,n,r,s,i)},F=(e,t,n)=>{const a=t.component=e.component;if(function(e,t,n){const{props:a,children:l,component:o}=e,{props:r,children:s,patchFlag:i}=t,c=o.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&i>=0))return!(!l&&!s||s&&s.$stable)||a!==r&&(a?!r||U(a,r,c):!!r);if(1024&i)return!0;if(16&i)return a?U(a,r,c):!!r;if(8&i){const e=t.dynamicProps;for(let t=0;tf&&v.splice(t,1)}(a.update),a.effect.dirty=!0,a.update()}else t.el=e.el,a.vnode=t},V=(e,t,n,o,r,s,i)=>{const c=()=>{if(e.isMounted){let{next:t,bu:n,u:a,parent:o,vnode:u}=e;{const n=Tt(e);if(n)return t&&(t.el=u.el,H(e,t,i)),void n.asyncDep.then((()=>{e.isUnmounted||c()}))}let p,d=t;It(e,!1),t?(t.el=u.el,H(e,t,i)):t=u,n&&(0,l.Qv)(n),(p=t.props&&t.props.onVnodeBeforeUpdate)&&ln(p,o,t,u),It(e,!0);const h=R(e),v=e.subTree;e.subTree=h,w(v,h,m(v.el),ee(v),e,r,s),t.el=h.el,null===d&&function({vnode:e,parent:t},n){for(;t;){const a=t.subTree;if(a.suspense&&a.suspense.activeBranch===e&&(a.el=e.el),a!==e)break;(e=t.vnode).el=n,t=t.parent}}(e,h.el),a&&_t(a,r),(p=t.props&&t.props.onVnodeUpdated)&&_t((()=>ln(p,o,t,u)),r)}else{let a;const{el:i,props:c}=t,{bm:u,m:p,parent:d}=e,h=fe(t);if(It(e,!1),u&&(0,l.Qv)(u),!h&&(a=c&&c.onVnodeBeforeMount)&&ln(a,d,t),It(e,!0),i&&re){const n=()=>{e.subTree=R(e),re(i,e.subTree,e,r,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const a=e.subTree=R(e);w(null,a,n,o,e,r,s),t.el=a.el}if(p&&_t(p,r),!h&&(a=c&&c.onVnodeMounted)){const e=t;_t((()=>ln(a,d,e)),r)}(256&t.shapeFlag||d&&fe(d.vnode)&&256&d.vnode.shapeFlag)&&e.a&&_t(e.a,r),e.isMounted=!0,t=n=o=null}},u=e.effect=new a._I(c,l.e_,(()=>k(p)),e.scope),p=e.update=()=>{u.dirty&&u.run()};p.id=e.uid,It(e,!0),p()},H=(e,t,n)=>{t.component=e;const o=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,o){const{props:r,attrs:s,vnode:{patchFlag:i}}=e,c=(0,a.Nc)(r),[u]=e.propsOptions;let p=!1;if(!(o||i>0)||16&i){let a;lt(e,t,r,s)&&(p=!0);for(const o in c)t&&((0,l.Yz)(t,o)||(a=(0,l.c$)(o))!==o&&(0,l.Yz)(t,a))||(u?!n||void 0===n[o]&&void 0===n[a]||(r[o]=ot(u,c,o,void 0,e,!0)):delete r[o]);if(s!==c)for(const e in s)t&&(0,l.Yz)(t,e)||(delete s[e],p=!0)}else if(8&i){const n=e.vnode.dynamicProps;for(let a=0;a{const c=e&&e.children,u=e?e.shapeFlag:0,p=t.children,{patchFlag:d,shapeFlag:v}=t;if(d>0){if(128&d)return void Y(c,p,n,a,l,o,r,s,i);if(256&d)return void q(c,p,n,a,l,o,r,s,i)}8&v?(16&u&&J(c,l,o),p!==c&&h(n,p)):16&u?16&v?Y(c,p,n,a,l,o,r,s,i):J(c,l,o,!0):(8&u&&h(n,""),16&v&&$(p,n,a,l,o,r,s,i))},q=(e,t,n,a,o,r,s,i,c)=>{e=e||l.yA,t=t||l.yA;const u=e.length,p=t.length,d=Math.min(u,p);let h;for(h=0;hp?J(e,o,r,!0,!1,d):$(t,n,a,o,r,s,i,c,d)},Y=(e,t,n,a,o,r,s,i,c)=>{let u=0;const p=t.length;let d=e.length-1,h=p-1;for(;u<=d&&u<=h;){const a=e[u],l=t[u]=c?nn(t[u]):tn(t[u]);if(!Kt(a,l))break;w(a,l,n,null,o,r,s,i,c),u++}for(;u<=d&&u<=h;){const a=e[d],l=t[h]=c?nn(t[h]):tn(t[h]);if(!Kt(a,l))break;w(a,l,n,null,o,r,s,i,c),d--,h--}if(u>d){if(u<=h){const e=h+1,l=eh)for(;u<=d;)G(e[u],o,r,!0),u++;else{const v=u,f=u,m=new Map;for(u=f;u<=h;u++){const e=t[u]=c?nn(t[u]):tn(t[u]);null!=e.key&&m.set(e.key,u)}let g,y=0;const b=h-f+1;let S=!1,k=0;const _=new Array(b);for(u=0;u=b){G(a,o,r,!0);continue}let l;if(null!=a.key)l=m.get(a.key);else for(g=f;g<=h;g++)if(0===_[g-f]&&Kt(a,t[g])){l=g;break}void 0===l?G(a,o,r,!0):(_[l-f]=u+1,l>=k?k=l:S=!0,w(a,t[l],n,null,o,r,s,i,c),y++)}const x=S?function(e){const t=e.slice(),n=[0];let a,l,o,r,s;const i=e.length;for(a=0;a>1,e[n[s]]0&&(t[a]=n[o-1]),n[o]=a)}}for(o=n.length,r=n[o-1];o-- >0;)n[o]=r,r=t[r];return n}(_):l.yA;for(g=x.length-1,u=b-1;u>=0;u--){const e=f+u,l=t[e],d=e+1{const{el:r,type:s,transition:i,children:c,shapeFlag:u}=e;if(6&u)W(e.component.subTree,t,a,l);else if(128&u)e.suspense.move(t,a,l);else if(64&u)s.move(e,t,a,le);else if(s!==Ot)if(s!==Nt)if(2!==l&&1&u&&i)if(0===l)i.beforeEnter(r),n(r,t,a),_t((()=>i.enter(r)),o);else{const{leave:e,delayLeave:l,afterLeave:o}=i,s=()=>n(r,t,a),c=()=>{e(r,(()=>{s(),o&&o()}))};l?l(r,s,c):c()}else n(r,t,a);else(({el:e,anchor:t},a,l)=>{let o;for(;e&&e!==t;)o=g(e),n(e,a,l),e=o;n(t,a,l)})(e,t,a);else{n(r,t,a);for(let e=0;e{const{type:o,props:r,ref:s,children:i,dynamicChildren:c,shapeFlag:u,patchFlag:p,dirs:d}=e;if(null!=s&&yt(s,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&d,v=!fe(e);let f;if(v&&(f=r&&r.onVnodeBeforeUnmount)&&ln(f,t,e),6&u)Z(e.component,n,a);else{if(128&u)return void e.suspense.unmount(n,a);h&&te(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,l,le,a):c&&(o!==Ot||p>0&&64&p)?J(c,t,n,!1,!0):(o===Ot&&384&p||!l&&16&u)&&J(i,t,n),a&&Q(e)}(v&&(f=r&&r.onVnodeUnmounted)||h)&&_t((()=>{f&&ln(f,t,e),h&&te(e,null,t,"unmounted")}),n)},Q=e=>{const{type:t,el:n,anchor:a,transition:l}=e;if(t===Ot)return void X(n,a);if(t===Nt)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),o(e),e=n;o(t)})(e);const r=()=>{o(n),l&&!l.persisted&&l.afterLeave&&l.afterLeave()};if(1&e.shapeFlag&&l&&!l.persisted){const{leave:t,delayLeave:a}=l,o=()=>t(n,r);a?a(e.el,r,o):o()}else r()},X=(e,t)=>{let n;for(;e!==t;)n=g(e),o(e),e=n;o(t)},Z=(e,t,n)=>{const{bum:a,scope:o,update:r,subTree:s,um:i}=e;a&&(0,l.Qv)(a),o.stop(),r&&(r.active=!1,G(s,e,t,n)),i&&_t(i,t),_t((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},J=(e,t,n,a=!1,l=!1,o=0)=>{for(let r=o;r6&e.shapeFlag?ee(e.component.subTree):128&e.shapeFlag?e.suspense.next():g(e.anchor||e.el);let ne=!1;const ae=(e,t,n)=>{null==e?t._vnode&&G(t._vnode,null,null,!0):w(t._vnode||null,e,t,null,null,null,n),ne||(ne=!0,x(),C(),ne=!1),t._vnode=e},le={p:w,um:G,m:W,r:Q,mt:D,mc:$,pc:K,pbc:N,n:ee,o:e};let oe,re;return t&&([oe,re]=t(le)),{render:ae,hydrate:oe,createApp:et(ae,oe)}}function Et({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function It({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function At(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Lt(e,t,n=!1){const a=e.children,o=t.children;if((0,l.c7)(a)&&(0,l.c7)(o))for(let e=0;e0?Pt||l.yA:null,Rt.pop(),Pt=Rt[Rt.length-1]||null,Ut>0&&Pt&&Pt.push(e),e}function Ft(e,t,n,a,l,o){return Dt(Gt(e,t,n,a,l,o,!0))}function Vt(e,t,n,a,l){return Dt(Qt(e,t,n,a,l,!0))}function Ht(e){return!!e&&!0===e.__v_isVNode}function Kt(e,t){return e.type===t.type&&e.key===t.key}const qt="__vInternal",Yt=({key:e})=>null!=e?e:null,Wt=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?(0,l.ct)(e)||(0,a.Ir)(e)||(0,l.mg)(e)?{i:O,r:e,k:t,f:!!n}:e:null);function Gt(e,t=null,n=null,a=0,o=null,r=(e===Ot?0:1),s=!1,i=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Yt(t),ref:t&&Wt(t),scopeId:$,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:r,patchFlag:a,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:O};return i?(an(c,n),128&r&&e.normalize(c)):n&&(c.shapeFlag|=(0,l.ct)(n)?8:16),Ut>0&&!s&&Pt&&(c.patchFlag>0||6&r)&&32!==c.patchFlag&&Pt.push(c),c}const Qt=function(e,t=null,n=null,o=0,r=null,s=!1){if(e&&e!==F||(e=zt),Ht(e)){const a=Xt(e,t,!0);return n&&an(a,n),Ut>0&&!s&&Pt&&(6&a.shapeFlag?Pt[Pt.indexOf(e)]=a:Pt.push(a)),a.patchFlag|=-2,a}if(i=e,(0,l.mg)(i)&&"__vccOpts"in i&&(e=e.__vccOpts),t){t=function(e){return e?(0,a.st)(e)||qt in e?(0,l.SU)({},e):e:null}(t);let{class:e,style:n}=t;e&&!(0,l.ct)(e)&&(t.class=(0,l.WN)(e)),(0,l.Y9)(n)&&((0,a.st)(n)&&!(0,l.c7)(n)&&(n=(0,l.SU)({},n)),t.style=(0,l.MN)(n))}var i;return Gt(e,t,n,o,r,(0,l.ct)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,l.Y9)(e)?4:(0,l.mg)(e)?2:0,s,!0)};function Xt(e,t,n=!1){const{props:a,ref:o,patchFlag:r,children:s}=e,i=t?function(...e){const t={};for(let n=0;nsn||O;let un,pn;{const e=(0,l.Ke)(),t=(t,n)=>{let a;return(a=e[t])||(a=e[t]=[]),a.push(n),e=>{a.length>1?a.forEach((t=>t(e))):a[0](e)}};un=t("__VUE_INSTANCE_SETTERS__",(e=>sn=e)),pn=t("__VUE_SSR_SETTERS__",(e=>gn=e))}const dn=e=>{const t=sn;return un(e),e.scope.on(),()=>{e.scope.off(),un(t)}},hn=()=>{sn&&sn.scope.off(),un(null)};function vn(e){return 4&e.vnode.shapeFlag}let fn,mn,gn=!1;function yn(e,t,n){(0,l.mg)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,l.Y9)(t)&&(e.setupState=(0,a.cf)(t)),bn(e,n)}function bn(e,t,n){const o=e.type;if(!e.render){if(!t&&fn&&!o.render){const t=o.template||He(e).template;if(t){const{isCustomElement:n,compilerOptions:a}=e.appContext.config,{delimiters:r,compilerOptions:s}=o,i=(0,l.SU)((0,l.SU)({isCustomElement:n,delimiters:r},a),s);o.render=fn(t,i)}}e.render=o.render||l.e_,mn&&mn(e)}{const t=dn(e);(0,a.S0)();try{!function(e){const t=He(e),n=e.proxy,o=e.ctx;De=!1,t.beforeCreate&&Fe(t.beforeCreate,e,"bc");const{data:r,computed:s,methods:i,watch:c,provide:u,inject:p,created:d,beforeMount:h,mounted:v,beforeUpdate:f,updated:m,activated:g,deactivated:y,beforeDestroy:b,beforeUnmount:w,destroyed:S,unmounted:k,render:_,renderTracked:x,renderTriggered:C,errorCaptured:M,serverPrefetch:E,expose:I,inheritAttrs:A,components:L,directives:T,filters:O}=t;if(p&&function(e,t,n=l.e_){(0,l.c7)(e)&&(e=We(e));for(const n in e){const o=e[n];let r;r=(0,l.Y9)(o)?"default"in o?at(o.from||n,o.default,!0):at(o.from||n):at(o),(0,a.Ir)(r)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:e=>r.value=e}):t[n]=r}}(p,o,null),i)for(const e in i){const t=i[e];(0,l.mg)(t)&&(o[e]=t.bind(n))}if(r){const t=r.call(n,n);(0,l.Y9)(t)&&(e.data=(0,a.cB)(t))}if(De=!0,s)for(const e in s){const t=s[e],a=(0,l.mg)(t)?t.bind(n,n):(0,l.mg)(t.get)?t.get.bind(n,n):l.e_,r=!(0,l.mg)(t)&&(0,l.mg)(t.set)?t.set.bind(n):l.e_,i=Cn({get:a,set:r});Object.defineProperty(o,e,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e})}if(c)for(const e in c)Ve(c[e],o,n,e);if(u){const e=(0,l.mg)(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{nt(t,e[t])}))}function $(e,t){(0,l.c7)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(d&&Fe(d,e,"c"),$(Ce,h),$(Me,v),$(Ee,f),$(Ie,m),$(be,g),$(we,y),$(ze,M),$($e,x),$(Oe,C),$(Ae,w),$(Le,k),$(Te,E),(0,l.c7)(I))if(I.length){const t=e.exposed||(e.exposed={});I.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});_&&e.render===l.e_&&(e.render=_),null!=A&&(e.inheritAttrs=A),L&&(e.components=L),T&&(e.directives=T)}(e)}finally{(0,a.qo)(),t()}}}function wn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,a.cf)((0,a.Md)(e.exposed)),{get:(t,n)=>n in t?t[n]:n in Pe?Pe[n](e):void 0,has:(e,t)=>t in e||t in Pe}))}const Sn=/(?:^|[-_])(\w)/g,kn=e=>e.replace(Sn,(e=>e.toUpperCase())).replace(/[-_]/g,"");function _n(e,t=!0){return(0,l.mg)(e)?e.displayName||e.name:e.name||t&&e.__name}function xn(e,t,n=!1){let a=_n(t);if(!a&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(a=e[1])}if(!a&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};a=n(e.components||e.parent.type.components)||n(e.appContext.components)}return a?kn(a):n?"App":"Anonymous"}const Cn=(e,t)=>(0,a.S6)(e,t,gn);function Mn(e,t,n){const a=arguments.length;return 2===a?(0,l.Y9)(t)&&!(0,l.c7)(t)?Ht(t)?Qt(e,null,[t]):Qt(e,t):Qt(e,null,t):(a>3?n=Array.prototype.slice.call(arguments,2):3===a&&Ht(n)&&(n=[n]),Qt(e,t,n))}const En="3.4.15"},2920:(e,t,n)=>{n.d(t,{Ah:()=>ue,Og:()=>ne,Ox:()=>d,Q9:()=>W,Ub:()=>A,mk:()=>fe});var a=n(3968),l=n(4256),o=n(6432);const r="undefined"!=typeof document?document:null,s=r&&r.createElement("template"),i={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,a)=>{const l="svg"===t?r.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?r.createElementNS("http://www.w3.org/1998/Math/MathML",e):r.createElement(e,n?{is:n}:void 0);return"select"===e&&a&&null!=a.multiple&&l.setAttribute("multiple",a.multiple),l},createText:e=>r.createTextNode(e),createComment:e=>r.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>r.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,a,l,o){const r=n?n.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),l!==o&&(l=l.nextSibling););else{s.innerHTML="svg"===a?`${e}`:"mathml"===a?`${e}`:e;const l=s.content;if("svg"===a||"mathml"===a){const e=l.firstChild;for(;e.firstChild;)l.appendChild(e.firstChild);l.removeChild(e)}t.insertBefore(l,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},c="transition",u="animation",p=Symbol("_vtc"),d=(e,{slots:t})=>(0,a.h)(a.c1,g(e),t);d.displayName="Transition";const h={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},v=d.props=(0,l.SU)({},a.oR,h),f=(e,t=[])=>{(0,l.c7)(e)?e.forEach((e=>e(...t))):e&&e(...t)},m=e=>!!e&&((0,l.c7)(e)?e.some((e=>e.length>1)):e.length>1);function g(e){const t={};for(const n in e)n in h||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:a,duration:o,enterFromClass:r=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:c=r,appearActiveClass:u=s,appearToClass:p=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,k=function(e){if(null==e)return null;if((0,l.Y9)(e))return[y(e.enter),y(e.leave)];{const t=y(e);return[t,t]}}(o),x=k&&k[0],C=k&&k[1],{onBeforeEnter:M,onEnter:I,onEnterCancelled:A,onLeave:L,onLeaveCancelled:T,onBeforeAppear:O=M,onAppear:$=I,onAppearCancelled:z=A}=t,N=(e,t,n)=>{w(e,t?p:i),w(e,t?u:s),n&&n()},R=(e,t)=>{e._isLeaving=!1,w(e,d),w(e,g),w(e,v),t&&t()},P=e=>(t,n)=>{const l=e?$:I,o=()=>N(t,e,n);f(l,[t,o]),S((()=>{w(t,e?c:r),b(t,e?p:i),m(l)||_(t,a,x,o)}))};return(0,l.SU)(t,{onBeforeEnter(e){f(M,[e]),b(e,r),b(e,s)},onBeforeAppear(e){f(O,[e]),b(e,c),b(e,u)},onEnter:P(!1),onAppear:P(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>R(e,t);b(e,d),E(),b(e,v),S((()=>{e._isLeaving&&(w(e,d),b(e,g),m(L)||_(e,a,C,n))})),f(L,[e,n])},onEnterCancelled(e){N(e,!1),f(A,[e])},onAppearCancelled(e){N(e,!0),f(z,[e])},onLeaveCancelled(e){R(e),f(T,[e])}})}function y(e){return(0,l.gH)(e)}function b(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[p]||(e[p]=new Set)).add(t)}function w(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[p];n&&(n.delete(t),n.size||(e[p]=void 0))}function S(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let k=0;function _(e,t,n,a){const l=e._endId=++k,o=()=>{l===e._endId&&a()};if(n)return setTimeout(o,n);const{type:r,timeout:s,propCount:i}=x(e,t);if(!r)return a();const c=r+"end";let u=0;const p=()=>{e.removeEventListener(c,d),o()},d=t=>{t.target===e&&++u>=i&&p()};setTimeout((()=>{u(n[e]||"").split(", "),l=a(`${c}Delay`),o=a(`${c}Duration`),r=C(l,o),s=a(`${u}Delay`),i=a(`${u}Duration`),p=C(s,i);let d=null,h=0,v=0;return t===c?r>0&&(d=c,h=r,v=o.length):t===u?p>0&&(d=u,h=p,v=i.length):(h=Math.max(r,p),d=h>0?r>p?c:u:null,v=d?d===c?o.length:i.length:0),{type:d,timeout:h,propCount:v,hasTransform:d===c&&/\b(transform|all)(,|$)/.test(a(`${c}Property`).toString())}}function C(e,t){for(;e.lengthM(t)+M(e[n]))))}function M(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function E(){return document.body.offsetHeight}const I=Symbol("_vod"),A={beforeMount(e,{value:t},{transition:n}){e[I]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):L(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:a}){!t!=!n&&(a?t?(a.beforeEnter(e),L(e,!0),a.enter(e)):a.leave(e,(()=>{L(e,!1)})):L(e,t))},beforeUnmount(e,{value:t}){L(e,t)}};function L(e,t){e.style.display=t?e[I]:"none"}const T=Symbol(""),O=/\s*!important$/;function $(e,t,n){if((0,l.c7)(n))n.forEach((n=>$(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const a=function(e,t){const n=N[t];if(n)return n;let a=(0,l.AX)(t);if("filter"!==a&&a in e)return N[t]=a;a=(0,l.Yj)(a);for(let n=0;nj||(D.then((()=>j=0)),j=Date.now()),V=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123;"undefined"!=typeof HTMLElement&&HTMLElement;const H=new WeakMap,K=new WeakMap,q=Symbol("_moveCb"),Y=Symbol("_enterCb"),W={name:"TransitionGroup",props:(0,l.SU)({},v,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,a._S)(),l=(0,a.In)();let r,s;return(0,a.OA)((()=>{if(!r.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const a=e.cloneNode(),l=e[p];l&&l.forEach((e=>{e.split(/\s+/).forEach((e=>e&&a.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&a.classList.add(e))),a.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(a);const{hasTransform:r}=x(a);return o.removeChild(a),r}(r[0].el,n.vnode.el,t))return;r.forEach(G),r.forEach(Q);const a=r.filter(X);E(),a.forEach((e=>{const n=e.el,a=n.style;b(n,t),a.transform=a.webkitTransform=a.transitionDuration="";const l=n[q]=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",l),n[q]=null,w(n,t))};n.addEventListener("transitionend",l)}))})),()=>{const i=(0,o.Nc)(e),c=g(i);let u=i.tag||a.ae;r=s,s=t.default?(0,a.a1)(t.default()):[];for(let e=0;e{const t=e.props["onUpdate:modelValue"]||!1;return(0,l.c7)(t)?e=>(0,l.Qv)(t,e):t};function J(e){e.target.composing=!0}function ee(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const te=Symbol("_assign"),ne={created(e,{modifiers:{lazy:t,trim:n,number:a}},o){e[te]=Z(o);const r=a||o.props&&"number"===o.props.type;P(e,t?"change":"input",(t=>{if(t.target.composing)return;let a=e.value;n&&(a=a.trim()),r&&(a=(0,l.wB)(a)),e[te](a)})),n&&P(e,"change",(()=>{e.value=e.value.trim()})),t||(P(e,"compositionstart",J),P(e,"compositionend",ee),P(e,"change",ee))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:a,number:o}},r){if(e[te]=Z(r),e.composing)return;const s=null==t?"":t;if((o||"number"===e.type?(0,l.wB)(e.value):e.value)!==s){if(document.activeElement===e&&"range"!==e.type){if(n)return;if(a&&e.value.trim()===s)return}e.value=s}}},ae={deep:!0,created(e,t,n){e[te]=Z(n),P(e,"change",(()=>{const t=e._modelValue,n=ie(e),a=e.checked,o=e[te];if((0,l.c7)(t)){const e=(0,l.E7)(t,n),r=-1!==e;if(a&&!r)o(t.concat(n));else if(!a&&r){const n=[...t];n.splice(e,1),o(n)}}else if((0,l.I7)(t)){const e=new Set(t);a?e.add(n):e.delete(n),o(e)}else o(ce(e,a))}))},mounted:le,beforeUpdate(e,t,n){e[te]=Z(n),le(e,t,n)}};function le(e,{value:t,oldValue:n},a){e._modelValue=t,(0,l.c7)(t)?e.checked=(0,l.E7)(t,a.props.value)>-1:(0,l.I7)(t)?e.checked=t.has(a.props.value):t!==n&&(e.checked=(0,l.iS)(t,ce(e,!0)))}const oe={created(e,{value:t},n){e.checked=(0,l.iS)(t,n.props.value),e[te]=Z(n),P(e,"change",(()=>{e[te](ie(e))}))},beforeUpdate(e,{value:t,oldValue:n},a){e[te]=Z(a),t!==n&&(e.checked=(0,l.iS)(t,a.props.value))}},re={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const r=(0,l.I7)(t);P(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,l.wB)(ie(e)):ie(e)));e[te](e.multiple?r?new Set(t):t:t[0]),e._assigning=!0,(0,a.o$)((()=>{e._assigning=!1}))})),e[te]=Z(o)},mounted(e,{value:t,oldValue:n,modifiers:{number:a}}){se(e,t,n,a)},beforeUpdate(e,t,n){e[te]=Z(n)},updated(e,{value:t,oldValue:n,modifiers:{number:a}}){e._assigning||se(e,t,n,a)}};function se(e,t,n,a){const o=e.multiple,r=(0,l.c7)(t);if((!o||r||(0,l.I7)(t))&&(!r||!(0,l.iS)(t,n))){for(let n=0,s=e.options.length;n-1}else s.selected=t.has(i);else if((0,l.iS)(ie(s),t))return void(e.selectedIndex!==n&&(e.selectedIndex=n))}o||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ie(e){return"_value"in e?e._value:e.value}function ce(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const ue={created(e,t,n){pe(e,t,n,null,"created")},mounted(e,t,n){pe(e,t,n,null,"mounted")},beforeUpdate(e,t,n,a){pe(e,t,n,a,"beforeUpdate")},updated(e,t,n,a){pe(e,t,n,a,"updated")}};function pe(e,t,n,a,l){const o=function(e,t){switch(e){case"SELECT":return re;case"TEXTAREA":return ne;default:switch(t){case"checkbox":return ae;case"radio":return oe;default:return ne}}}(e.tagName,n.props&&n.props.type)[l];o&&o(e,t,n,a)}const de=(0,l.SU)({patchProp:(e,t,n,o,r,s,i,c,u)=>{const d="svg"===r;"class"===t?function(e,t,n){const a=e[p];a&&(t=(t?[t,...a]:[...a]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,o,d):"style"===t?function(e,t,n){const a=e.style,o=a.display,r=(0,l.ct)(n);if(n&&!r){if(t&&!(0,l.ct)(t))for(const e in t)null==n[e]&&$(a,e,"");for(const e in n)$(a,e,n[e])}else if(r){if(t!==n){const e=a[T];e&&(n+=";"+e),a.cssText=n}}else t&&e.removeAttribute("style");I in e&&(a.display=o)}(e,n,o):(0,l.W8)(t)?(0,l._w)(t)||function(e,t,n,o,r=null){const s=e[B]||(e[B]={}),i=s[t];if(o&&i)i.value=o;else{const[n,c]=function(e){let t;if(U.test(e)){let n;for(t={};n=e.match(U);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):(0,l.c$)(e.slice(2)),t]}(t);if(o){const i=s[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();(0,a.a6)(function(e,t){if((0,l.c7)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=F(),n}(o,r);P(e,n,i,c)}else i&&(function(e,t,n,a){e.removeEventListener(t,n,a)}(e,n,i,c),s[t]=void 0)}}(e,t,0,o,i):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,a){if(a)return"innerHTML"===t||"textContent"===t||!!(t in e&&V(t)&&(0,l.mg)(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){const t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return(!V(t)||!(0,l.ct)(n))&&t in e}(e,t,o,d))?function(e,t,n,a,o,r,s){if("innerHTML"===t||"textContent"===t)return a&&s(a,o,r),void(e[t]=null==n?"":n);const i=e.tagName;if("value"===t&&"PROGRESS"!==i&&!i.includes("-")){e._value=n;const a=null==n?"":n;return("OPTION"===i?e.getAttribute("value"):e.value)!==a&&(e.value=a),void(null==n&&e.removeAttribute(t))}let c=!1;if(""===n||null==n){const a=typeof e[t];"boolean"===a?n=(0,l.Oy)(n):null==n&&"string"===a?(n="",c=!0):"number"===a&&(n=0,c=!0)}try{e[t]=n}catch(e){}c&&e.removeAttribute(t)}(e,t,o,s,i,c,u):("true-value"===t?e._trueValue=o:"false-value"===t&&(e._falseValue=o),function(e,t,n,a,o){if(a&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(R,t.slice(6,t.length)):e.setAttributeNS(R,t,n);else{const a=(0,l.Kg)(t);null==n||a&&!(0,l.Oy)(n)?e.removeAttribute(t):e.setAttribute(t,a?"":n)}}(e,t,o,d))}},i);let he,ve=!1;const fe=(...e)=>{const t=(he=ve?he:(0,a.CA)(de),ve=!0,he).createApp(...e),{mount:n}=t;return t.mount=e=>{const t=function(e){if((0,l.ct)(e))return document.querySelector(e);return e}(e);if(t)return n(t,!0,function(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}(t))},t}},4256:(e,t,n)=>{function a(e,t){const n=new Set(e.split(","));return t?e=>n.has(e.toLowerCase()):e=>n.has(e)}n.d(t,{AX:()=>O,An:()=>M,E7:()=>ee,GM:()=>R,I7:()=>m,Ke:()=>V,Kg:()=>X,MN:()=>K,NO:()=>s,Oy:()=>Z,QX:()=>y,Qv:()=>B,SU:()=>u,W8:()=>i,WA:()=>te,WN:()=>Q,Y9:()=>k,Yj:()=>N,Yz:()=>h,_w:()=>c,aE:()=>p,aO:()=>S,c$:()=>z,c7:()=>v,cF:()=>f,cJ:()=>I,ct:()=>w,e6:()=>H,e_:()=>r,gH:()=>D,iS:()=>J,kX:()=>a,kx:()=>l,mg:()=>b,mz:()=>P,o5:()=>A,oF:()=>E,u6:()=>U,um:()=>_,wB:()=>j,yA:()=>o});const l={},o=[],r=()=>{},s=()=>!1,i=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),c=e=>e.startsWith("onUpdate:"),u=Object.assign,p=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},d=Object.prototype.hasOwnProperty,h=(e,t)=>d.call(e,t),v=Array.isArray,f=e=>"[object Map]"===C(e),m=e=>"[object Set]"===C(e),g=e=>"[object Date]"===C(e),y=e=>"[object RegExp]"===C(e),b=e=>"function"==typeof e,w=e=>"string"==typeof e,S=e=>"symbol"==typeof e,k=e=>null!==e&&"object"==typeof e,_=e=>(k(e)||b(e))&&b(e.then)&&b(e.catch),x=Object.prototype.toString,C=e=>x.call(e),M=e=>C(e).slice(8,-1),E=e=>"[object Object]"===C(e),I=e=>w(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,A=a(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),L=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},T=/-(\w)/g,O=L((e=>e.replace(T,((e,t)=>t?t.toUpperCase():"")))),$=/\B([A-Z])/g,z=L((e=>e.replace($,"-$1").toLowerCase())),N=L((e=>e.charAt(0).toUpperCase()+e.slice(1))),R=L((e=>e?`on${N(e)}`:"")),P=(e,t)=>!Object.is(e,t),B=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},j=e=>{const t=parseFloat(e);return isNaN(t)?e:t},D=e=>{const t=w(e)?Number(e):NaN;return isNaN(t)?e:t};let F;const V=()=>F||(F="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}),H=a("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error");function K(e){if(v(e)){const t={};for(let n=0;n{if(e){const n=e.split(Y);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function Q(e){let t="";if(w(e))t=e;else if(v(e))for(let n=0;nJ(e,t)))}const te=e=>w(e)?e:null==e?"":v(e)||k(e)&&(e.toString===x||!b(e.toString))?JSON.stringify(e,ne,2):String(e),ne=(e,t)=>t&&t.__v_isRef?ne(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],a)=>(e[ae(t,a)+" =>"]=n,e)),{})}:m(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>ae(e)))}:S(t)?ae(t):!k(t)||v(t)||E(t)?t:String(t),ae=(e,t="")=>{var n;return S(e)?`Symbol(${null!=(n=e.description)?n:t})`:e}},6888:(e,t,n)=>{n.d(t,{default:()=>a});const a={mobileBreakPoint:"719px",pcBreakPoint:"1440px",enableThemeColor:"false"}},360:(e,t,n)=>{function a(e,t,n){var a,l,o;void 0===t&&(t=50),void 0===n&&(n={});var r=null!=(a=n.isImmediate)&&a,s=null!=(l=n.callback)&&l,i=n.maxWait,c=Date.now(),u=[];function p(){if(void 0!==i){var e=Date.now()-c;if(e+t>=i)return i-e}return t}var d=function(){var t=[].slice.call(arguments),n=this;return new Promise((function(a,l){var i=r&&void 0===o;if(void 0!==o&&clearTimeout(o),o=setTimeout((function(){if(o=void 0,c=Date.now(),!r){var a=e.apply(n,t);s&&s(a),u.forEach((function(e){return(0,e.resolve)(a)})),u=[]}}),p()),i){var d=e.apply(n,t);return s&&s(d),a(d)}u.push({resolve:a,reject:l})}))};return d.cancel=function(e){void 0!==o&&clearTimeout(o),u.forEach((function(t){return(0,t.reject)(e)})),u=[]},d}n.d(t,{C:()=>a})},5388:(e,t,n)=>{var a=n(6411),l=n(3132),o=n(2920),r=n(3968),s=n(6496),i=n(9160),c=n(8890),u=i.oz,p=([e,t,n=""])=>{const a=`head > ${e}${Object.entries(t).map((([e,t])=>(0,s.ct)(t)?`[${e}=${JSON.stringify(t)}]`:!0===t?`[${e}]`:"")).join("")}`;return Array.from(document.querySelectorAll(a)).find((e=>e.innerText===n))||null},d=([e,t,n])=>{if(!(0,s.ct)(e))return null;const a=document.createElement(e);return(0,s.oF)(t)&&Object.entries(t).forEach((([e,t])=>{(0,s.ct)(t)?a.setAttribute(e,t):!0===t&&a.setAttribute(e,"")})),(0,s.ct)(n)&&a.appendChild(document.createTextNode(n)),a},h=o.mk;(async()=>{const e=h({name:"Vuepress",setup(){(()=>{const e=(0,a.ii)(),t=(0,a.oF)();let n=[];const l=()=>{document.documentElement.lang=t.value;const a=(()=>{const t=[];return e.value.forEach((e=>{const n=d(e);n&&t.push(n)})),t})();n.forEach(((e,t)=>{const l=a.findIndex((t=>e.isEqualNode(t)));-1===l?(e.remove(),delete n[t]):a.splice(l,1)})),a.forEach((e=>document.head.appendChild(e))),n=[...n.filter((e=>!!e)),...a]};(0,r.Zl)(a.Bz,l),(0,r.u2)((()=>{e.value.forEach((e=>{const t=p(e);t&&n.push(t)})),(0,r.Kg)(e,l,{immediate:!1})}))})();for(const e of l.o)e.setup?.();const e=l.o.flatMap((({rootComponents:e=[]})=>e.map((e=>(0,r.h)(e))))),t=(0,a.SS)();return()=>[(0,r.h)(t.value),e]}}),t=(()=>{const e=(0,i.gv)({history:u((0,s.W0)("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(e,t,n)=>n||(e.hash?{el:e.hash}:{top:0})});return e.beforeResolve((async(e,t)=>{if(e.path!==t.path||t===i.sD){const t=(0,a.mA)(e.path);if(t.path!==e.path)return t.path;const n=await t.loader();e.meta={...t.meta,_data:n.data}}})),e})();(e=>{e.component("ClientOnly",a.iU),e.component("Content",a.kP),e.component("RouteLink",a.Qr)})(e),((e,t,n)=>{const l=(0,r.S6)((()=>t.currentRoute.value.path)),o=(0,c.G2)(l,(()=>t.currentRoute.value.meta._data)),s=(0,r.S6)((()=>a.wj.resolveLayouts(n))),i=(0,r.S6)((()=>a.wj.resolveRouteLocale(a.OQ.value.locales,l.value))),u=(0,r.S6)((()=>a.wj.resolveSiteLocaleData(a.OQ.value,i.value))),p=(0,r.S6)((()=>a.wj.resolvePageFrontmatter(o.value))),d=(0,r.S6)((()=>a.wj.resolvePageHeadTitle(o.value,u.value))),h=(0,r.S6)((()=>a.wj.resolvePageHead(d.value,p.value,u.value))),v=(0,r.S6)((()=>a.wj.resolvePageLang(o.value,u.value))),f=(0,r.S6)((()=>a.wj.resolvePageLayout(o.value,s.value)));e.provide(a.ye,s),e.provide(a.Av,o),e.provide(a.Ut,p),e.provide(a.Ax,d),e.provide(a._w,h),e.provide(a.Ky,v),e.provide(a.SM,f),e.provide(a.o5,i),e.provide(a.UD,u),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>p.value},$head:{get:()=>h.value},$headTitle:{get:()=>d.value},$lang:{get:()=>v.value},$page:{get:()=>o.value},$routeLocale:{get:()=>i.value},$site:{get:()=>a.OQ.value},$siteLocale:{get:()=>u.value},$withBase:{get:()=>a.m_}}),a.OQ})(e,t,l.o);for(const n of l.o)await(n.enhance?.({app:e,router:t,siteData:a.OQ}));return e.use(t),{app:e,router:t}})().then((({app:e,router:t})=>{t.isReady().then((()=>{e.mount("#app")}))}))},6411:(e,t,n)=>{n.d(t,{Av:()=>u,Ax:()=>m,Bz:()=>O,Ky:()=>g,OQ:()=>I,Qr:()=>P,Qt:()=>N,SM:()=>b,SS:()=>w,UD:()=>L,Ut:()=>d,_w:()=>v,aQ:()=>h,iU:()=>$,ii:()=>f,jW:()=>A,kP:()=>z,mA:()=>M,m_:()=>R,mq:()=>k,o5:()=>S,oF:()=>y,us:()=>p,wR:()=>T,wh:()=>E,wj:()=>B,ye:()=>c});var a=n(3968),l=n(6148),o=n(6432),r=n(6496),s=n(2524),i=n(9160),c=Symbol(""),u=Symbol(""),p=()=>{const e=(0,a.uU)(u);if(!e)throw new Error("pageData() is called without provider.");return e},d=Symbol(""),h=()=>{const e=(0,a.uU)(d);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},v=Symbol(""),f=()=>{const e=(0,a.uU)(v);if(!e)throw new Error("usePageHead() is called without provider.");return e},m=Symbol(""),g=Symbol(""),y=()=>{const e=(0,a.uU)(g);if(!e)throw new Error("usePageLang() is called without provider.");return e},b=Symbol(""),w=()=>{const e=(0,a.uU)(b);if(!e)throw new Error("usePageLayout() is called without provider.");return e},S=Symbol(""),k=()=>{const e=(0,a.uU)(S);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},_=(0,o.kl)(l.o),x=(0,o.kl)(l.q),C=e=>{const t=(0,r.QP)(e);if(x.value[t])return t;const n=encodeURI(t);return x.value[n]?n:_.value[t]||t},M=e=>{const t=C(e);return{path:t,notFound:!1,...x.value[t]??{...x.value["/404.html"],notFound:!0}}},E=()=>x,I=(0,o.kl)(s.O),A=()=>I,L=Symbol(""),T=()=>{const e=(0,a.uU)(L);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},O=Symbol(""),$=(0,a._M)({name:"ClientOnly",setup(e,t){const n=(0,o.IL)(!1);return(0,a.u2)((()=>{n.value=!0})),()=>n.value?t.slots.default?.():null}}),z=(0,a._M)({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=p(),n=(0,a.S6)((()=>{const n=M(e.path||t.value.path);return(0,a.Mn)((()=>n.loader().then((({comp:e})=>e))))}));return()=>(0,a.h)(n.value)}}),N=(e={})=>e,R=e=>(0,r.mY)(e)?e:`/${(0,r.iW)(e)}`,P=({active:e=!1,activeClass:t="route-link-active",to:n,...l},{slots:o})=>{const r=(0,i.KX)(),s=R(C(n));return(0,a.h)("a",{...l,class:["route-link",{[t]:e}],href:s,onClick:(e={})=>{(e=>{if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget){const t=e.currentTarget.getAttribute("target");if(t?.match(/\b_blank\b/i))return}return e.preventDefault(),!0}})(e)?r.push(n).catch():Promise.resolve()}},o.default?.())};P.displayName="RouteLink",P.props={active:Boolean,activeClass:String,to:String};var B=(0,o.cB)({resolveLayouts:e=>e.reduce(((e,t)=>({...e,...t.layouts})),{}),resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const a=(0,r.ct)(t.description)?t.description:n.description,l=[...Array.isArray(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:a}]];return(0,r.yk)(l)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter((e=>!!e)).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const t=e.frontmatter.layout;n=(0,r.ct)(t)?t:"Layout"}else n="NotFound";return t[n]},resolveRouteLocale:(e,t)=>(0,r.nI)(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t],head:[...e.locales[t]?.head??[],...e.head??[]]})})},9344:(e,t,n)=>{n.d(t,{UD:()=>v,CK:()=>c.CK,yq:()=>c.yq,ZE:()=>f,GQ:()=>m,_:()=>y,SU:()=>i,c7:()=>d,_g:()=>u,qM:()=>b,oX:()=>c.oX,mY:()=>c.mY,q6:()=>c.q6,Ib:()=>p,oF:()=>c.oF,ct:()=>c.ct,C_:()=>g,W0:()=>c.W0,iW:()=>c.iW,_y:()=>h,MB:()=>o,YX:()=>r});var a=n(3968),l=n(1108);const o=e=>{const t=(0,l.mq)();return(0,a.S6)((()=>e[t.value]??{}))},r=()=>{const e=(0,l.wh)();return(0,a.S6)((()=>Object.keys(e.value)))};var s=n(4256);const i=(e,t)=>{const n=(t?._instance||(0,a._S)())?.appContext.components;return!!n&&(e in n||(0,s.AX)(e)in n||(0,s.Yj)((0,s.AX)(e))in n)};var c=n(6496);const u=e=>void 0!==e,p=e=>"number"==typeof e,d=Array.isArray,h=(e,t)=>(0,c.ct)(e)&&e.startsWith(t),v=(e,t)=>(0,c.ct)(e)&&e.endsWith(t),f=Object.entries,m=Object.fromEntries,g=Object.keys,y=(Object.values,e=>{if(e){if("number"==typeof e)return new Date(e);const t=Date.parse(e.toString());if(!Number.isNaN(t))return new Date(t)}return null}),b=e=>h(e,"/")},2152:(e,t,n)=>{n.d(t,{c:()=>i});var a=n(1108),l=n(360),o=n(3968),r=n(9160);const s=async(e,t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:e.currentRoute.value.path,query:e.currentRoute.value.query,hash:t}).finally((()=>e.options.scrollBehavior=n))},i=(0,a.Qt)({setup(){(({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:a=5})=>{const i=(0,r.KX)(),c=(0,l.C)((()=>{const n=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(n-0)c.some((t=>t.hash===e.hash))));for(let e=0;e=(t.parentElement?.offsetTop??0)-a,c=!l||n<(l.parentElement?.offsetTop??0)-a;if(!o||!c)continue;const p=decodeURIComponent(i.currentRoute.value.hash),d=decodeURIComponent(t.hash);if(p===d)return;if(r)for(let t=e+1;t{window.addEventListener("scroll",c)})),(0,o.GE)((()=>{window.removeEventListener("scroll",c)}))})({headerLinkSelector:".vp-sidebar-link, .toc-link",headerAnchorSelector:".header-anchor",delay:200,offset:5})}})},5550:(e,t,n)=>{n.d(t,{c:()=>u});var a=n(1108),l=n(9344),o=n(1804),r=n(3968),s=n(6432),i=n(2920);const c=(0,r._M)({name:"BackToTop",setup(e){const t=(0,a.aQ)(),n=(0,l.MB)({"/":{backToTop:"返回顶部"}}),c=(0,s.kl)(),{height:u}=(0,o.GWq)(c),{height:p}=(0,o.U$R)(),{y:d}=(0,o.iQR)(),h=(0,r.S6)((()=>!1!==t.value.backToTop&&d.value>100)),v=(0,r.S6)((()=>d.value/(u.value-p.value)*100));return(0,r.u2)((()=>{c.value=document.body})),()=>(0,r.h)(i.Ox,{name:"back-to-top"},(()=>h.value?(0,r.h)("button",{type:"button",class:"vp-back-to-top-button","aria-label":n.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[(0,r.h)("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":v.value},(0,r.h)("svg",(0,r.h)("circle",{cx:"50%",cy:"50%",style:{"stroke-dasharray":`calc(${Math.PI*v.value}% - ${4*Math.PI}px) calc(${100*Math.PI}% - ${4*Math.PI}px)`}}))),(0,r.h)("div",{class:"back-to-top-icon"})]):null))}}),u=(0,a.Qt)({rootComponents:[c]})},5272:(e,t,n)=>{n.d(t,{c:()=>c});var a=n(9344),l=n(1108),o=n(3968),r=n(6432),s=n(8096);const i=(0,o._M)({name:"Catalog",props:{base:{type:String,default:""},level:{type:Number,default:3},index:Boolean,hideHeading:Boolean},setup(e){const t=(0,s.kv)(),n=(0,a.MB)({"/":{title:"目录",empty:"暂无目录"}}),i=(0,l.us)(),c=(0,l.wh)(),u=(0,l.jW)(),p=(0,r.kl)((0,a.ZE)(c.value).map((([e,{meta:n}])=>{const l=t(n);if(!l)return null;const o=e.split("/").length;return{level:(0,a.UD)(e,"/")?o-2:o-1,base:e.replace(/\/[^/]+\/?$/,"/"),path:e,...l}})).filter((e=>(0,a.oF)(e)&&(0,a.ct)(e.title)))),d=(0,o.S6)((()=>{const t=e.base?(0,a.yq)((0,a.CK)(e.base)):i.value.path.replace(/\/[^/]+$/,"/"),n=t.split("/").length-2,l=[];return p.value.filter((({level:l,path:o})=>{if(!(0,a._y)(o,t)||o===t)return!1;if("/"===t){const e=(0,a.C_)(u.value.locales).filter((e=>"/"!==e));if("/404.html"===o||e.some((e=>(0,a._y)(o,e))))return!1}return l-n<=e.level})).sort((({title:e,level:t,order:n},{title:l,level:o,order:r})=>t-o||((0,a.Ib)(n)?(0,a.Ib)(r)?n>0?r>0?n-r:-1:r<0?n-r:1:n:(0,a.Ib)(r)?r:e.localeCompare(l)))).forEach((e=>{const{base:t,level:a}=e;switch(a-n){case 1:l.push(e);break;case 2:{const n=l.find((e=>e.path===t));n&&(n.children??=[]).push(e);break}default:{const n=l.find((e=>e.path===t.replace(/\/[^/]+\/$/,"/")));if(n){const a=n.children?.find((e=>e.path===t));a&&(a.children??=[]).push(e)}}}})),l}));return()=>{const t=d.value.some((e=>e.children));return(0,o.h)("div",{class:["vp-catalog-wrapper",{index:e.index}]},[e.hideHeading?null:(0,o.h)("h2",{class:"vp-catalog-main-title"},n.value.title),d.value.length?(0,o.h)(e.index?"ol":"ul",{class:["vp-catalogs",{deep:t}]},d.value.map((({children:n=[],title:a,path:r,content:s})=>{const i=(0,o.h)(l.Qr,{class:"vp-catalog-title",to:r},(()=>s?(0,o.h)(s):a));return(0,o.h)("li",{class:"vp-catalog"},t?[(0,o.h)("h3",{id:a,class:["vp-catalog-child-title",{"has-children":n.length}]},[(0,o.h)("a",{href:`#${a}`,class:"vp-catalog-header-anchor","aria-hidden":!0},"#"),i]),n.length?(0,o.h)(e.index?"ol":"ul",{class:"vp-child-catalogs"},n.map((({children:t=[],content:n,path:a,title:r})=>(0,o.h)("li",{class:"vp-child-catalog"},[(0,o.h)("div",{class:["vp-catalog-sub-title",{"has-children":t.length}]},[(0,o.h)("a",{href:`#${r}`,class:"vp-catalog-header-anchor"},"#"),(0,o.h)(l.Qr,{class:"vp-catalog-title",to:a},(()=>n?(0,o.h)(n):r))]),t.length?(0,o.h)(e.index?"ol":"div",{class:e.index?"vp-sub-catalogs":"vp-sub-catalogs-wrapper"},t.map((({content:t,path:n,title:a})=>e.index?(0,o.h)("li",{class:"vp-sub-catalog"},(0,o.h)(l.Qr,{to:n},(()=>t?(0,o.h)(t):a))):(0,o.h)(l.Qr,{class:"vp-sub-catalog-link",to:n},(()=>t?(0,o.h)(t):a))))):null])))):null]:(0,o.h)("div",{class:"vp-catalog-child-title"},i))}))):(0,o.h)("p",{class:"vp-empty-catalog"},n.value.empty)])}}}),c=(0,l.Qt)({enhance:({app:e})=>{(0,s.G4)(e),(0,a.SU)("Catalog",e)||e.component("Catalog",i)}})},8096:(e,t,n)=>{n.d(t,{IX:()=>s,G4:()=>c,kv:()=>i});var a=n(9344),l=n(3968);let o=e=>(0,a.ct)(e.title)?{title:e.title}:null;const r=Symbol(""),s=e=>{o=e},i=()=>(0,l.uU)(r),c=e=>{e.provide(r,o)}},920:(e,t,n)=>{n.d(t,{IX:()=>a.IX});var a=n(8096)},9168:(e,t,n)=>{n.d(t,{c:()=>c});var a=n(1108),l=n(9344),o=n(1804),r=n(3968);const s=new Map,i=/\b(?:Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)/i,c=(0,a.Qt)({setup:()=>{(()=>{const{copy:e}=(0,o.UCV)({legacy:!0}),t=(0,l.MB)({"/":{copy:"复制代码",copied:"已复制"}}),n=(0,a.us)(),c=e=>{if(!e.hasAttribute("copy-code-registered")){const n=document.createElement("button");n.type="button",n.classList.add("vp-copy-code-button"),n.innerHTML='
    ',n.setAttribute("aria-label",t.value.copy),n.setAttribute("data-copied",t.value.copied),e.parentElement&&e.parentElement.insertBefore(n,e),e.setAttribute("copy-code-registered","")}},u=()=>{(0,r.o$)().then((()=>setTimeout((()=>{['.theme-hope-content div[class*="language-"] pre'].forEach((e=>{document.querySelectorAll(e).forEach(c)}))}),800)))},p=(t,n,a)=>{let{innerText:l=""}=n;/language-(shellscript|shell|bash|sh|zsh)/.test(t.classList.toString())&&(l=l.replace(/^ *(\$|>) /gm,"")),e(l).then((()=>{a.classList.add("copied"),clearTimeout(s.get(a));const e=setTimeout((()=>{a.classList.remove("copied"),a.blur(),s.delete(a)}),2e3);s.set(a,e)}))};(0,r.u2)((()=>{const e=!("undefined"!=typeof window&&window.navigator&&"userAgent"in window.navigator&&i.test(navigator.userAgent));e&&u(),(0,o.KIJ)("click",(e=>{const t=e.target;if(t.matches('div[class*="language-"] > button.copy')){const e=t.parentElement,n=t.nextElementSibling;n&&p(e,n,t)}else if(t.matches('div[class*="language-"] div.vp-copy-icon')){const e=t.parentElement,n=e.parentElement,a=e.nextElementSibling;a&&p(n,a,e)}})),(0,r.Kg)((()=>n.value.path),(()=>{e&&u()}))}))})()}})},5648:(e,t,n)=>{n.d(t,{c:()=>f});var a=n(1108),l=n(3968),o=n(6432),r=n(360),s=n(9160),i=n(6496),c=n(1804);const u=(e=[],t)=>[`lang:${t}`,...Array.isArray(e)?e:[e]],p=()=>{if(document.querySelector(".DocSearch-Modal"))return;const e=new Event("keydown");e.key="k",e.metaKey=!0,window.dispatchEvent(e),setTimeout(p,16)},d=({buttonText:e="Search",buttonAriaLabel:t=e}={})=>``,h={locales:{"/":{placeholder:"搜索文档",translations:{button:{buttonText:"搜索文档",buttonAriaLabel:"搜索文档"},modal:{searchBox:{resetButtonTitle:"清除查询条件",resetButtonAriaLabel:"清除查询条件",cancelButtonText:"取消",cancelButtonAriaLabel:"取消"},startScreen:{recentSearchesTitle:"搜索历史",noRecentSearchesText:"没有搜索历史",saveRecentSearchButtonTitle:"保存至搜索历史",removeRecentSearchButtonTitle:"从搜索历史中移除",favoriteSearchesTitle:"收藏",removeFavoriteSearchButtonTitle:"从收藏中移除"},errorScreen:{titleText:"无法获取结果",helpText:"你可能需要检查你的网络连接"},footer:{selectText:"选择",navigateText:"切换",closeText:"关闭",searchByText:"搜索提供者"},noResultsScreen:{noResultsText:"无法找到相关结果",suggestedQueryText:"你可以尝试查询",reportMissingResultsText:"你认为该查询应该有结果?",reportMissingResultsLinkText:"点击反馈"}}}}},indexName:"newzone",appId:"M4EXXEZIEG",apiKey:"fd8891a9c4cc21e0ef4f11bf44f7a11e"};Promise.all([n.e(100),n.e(7260)]).then(n.bind(n,7260)),Promise.all([n.e(6336),n.e(4220)]).then(n.bind(n,6600));const v=(0,l._M)({name:"Docsearch",props:{containerId:{type:String,required:!1,default:"docsearch-container"},options:{type:Object,required:!1,default:()=>h}},setup(e){const t=(()=>{const e=(0,s.KX)();return{hitComponent:({hit:t,children:n})=>({type:"a",ref:void 0,constructor:void 0,key:void 0,props:{href:t.url,onClick:n=>{(e=>1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)(n)||(n.preventDefault(),e.push((0,i._Y)(t.url,"/")))},children:n},__v:null}),navigator:{navigate:({itemUrl:t})=>{e.push((0,i._Y)(t,"/"))}},transformSearchClient:e=>{const t=(0,r.C)(e.search,500);return{...e,search:async(...e)=>t(...e)}}}})(),h=(0,a.oF)(),v=(0,a.mq)(),f=(0,o.IL)(!1),m=(0,o.IL)(!1),g=(0,l.S6)((()=>({...e.options,...e.options.locales?.[v.value]}))),y=async()=>{const{default:a}=await n.e(512).then(n.bind(n,512));a({...t,...g.value,container:`#${e.containerId}`,searchParameters:{...g.value.searchParameters,facetFilters:u(g.value.searchParameters?.facetFilters,h.value)}}),f.value=!0},b=()=>{m.value||f.value||(m.value=!0,y(),p(),(0,l.Kg)(v,y))};return(e=>{const t=(0,c.KIJ)("keydown",(n=>{const a="k"===n.key&&(n.ctrlKey||n.metaKey);("/"===n.key||a)&&(n.preventDefault(),e(),t())}))})(b),(0,l.u2)((()=>(e=>{const t="algolia-preconnect";(window.requestIdleCallback||setTimeout)((()=>{if(document.head.querySelector(`#${t}`))return;const n=document.createElement("link");n.id=t,n.rel="preconnect",n.href=`https://${e}-dsn.algolia.net`,n.crossOrigin="",document.head.appendChild(n)}))})(g.value.appId))),()=>[(0,l.h)("div",{id:e.containerId,style:{display:f.value?"block":"none"}}),f.value?null:(0,l.h)("div",{onClick:b,innerHTML:d(g.value.translations?.button)})]}}),f=(0,a.Qt)({enhance({app:e}){e.component("Docsearch",v)}})},6832:(e,t,n)=>{n.d(t,{K:()=>r});var a=n(3968),l=n(1108);const o=(0,a.h)("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"},[(0,a.h)("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"}),(0,a.h)("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"})]),r=(0,a._M)({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=(0,l.mq)(),n=(0,a.S6)((()=>e.locales[t.value]??{openInNewWindow:"open in new window"}));return()=>(0,a.h)("span",[o,(0,a.h)("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}})},8784:(e,t,n)=>{n.d(t,{c:()=>s});var a=n(3968),l=n(1108),o=n(6832);const r={},s=(0,l.Qt)({enhance({app:e}){e.component("ExternalLinkIcon",(0,a.h)(o.K,{locales:r}))}})},1340:(e,t,n)=>{n.d(t,{K:()=>a.K});var a=n(6832)},2208:(e,t,n)=>{n.d(t,{c:()=>o});var a=n(1108);const l={id:"G-RWKZTY2P9R"},o=(0,a.Qt)({enhance(){(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)})(l)}})},6024:(e,t,n)=>{n.d(t,{c:()=>m});var a=n(1108),l=n(3968),o=n(9160);const r={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=r.isStarted();e=s(e,r.settings.minimum,1),r.status=1===e?null:e;const n=r.render(!t),a=n.querySelector(r.settings.barSelector),l=r.settings.speed,o=r.settings.easing;return n.offsetWidth,c((t=>{u(a,{transform:"translate3d("+i(e)+"%,0,0)",transition:"all "+l+"ms "+o}),1===e?(u(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout((function(){u(n,{transition:"all "+l+"ms linear",opacity:"0"}),setTimeout((function(){r.remove(),t()}),l)}),l)):setTimeout((()=>t()),l)})),r},isStarted:()=>"number"==typeof r.status,start:()=>{r.status||r.set(0);const e=()=>{setTimeout((()=>{r.status&&(r.trickle(),e())}),r.settings.trickleSpeed)};return r.settings.trickle&&e(),r},done:e=>e||r.status?r.inc(.3+.5*Math.random()).set(1):r,inc:e=>{let t=r.status;return t?("number"!=typeof e&&(e=(1-t)*s(Math.random()*t,.1,.95)),t=s(t+e,0,.994),r.set(t)):r.start()},trickle:()=>r.inc(Math.random()*r.settings.trickleRate),render:e=>{if(r.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=r.settings.template;const n=t.querySelector(r.settings.barSelector),a=e?"-100":i(r.status||0),l=document.querySelector(r.settings.parent);return u(n,{transition:"all 0 linear",transform:"translate3d("+a+"%,0,0)"}),l!==document.body&&d(l,"nprogress-custom-parent"),l?.appendChild(t),t},remove:()=>{h(document.documentElement,"nprogress-busy"),h(document.querySelector(r.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&f(e)},isRendered:()=>!!document.getElementById("nprogress")},s=(e,t,n)=>en?n:e,i=e=>100*(-1+e),c=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),1===e.length&&t()}}(),u=function(){const e=["Webkit","O","Moz","ms"],t={};function n(n,a,l){var o;o=(o=a).replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),a=t[o]??=function(t){const n=document.body.style;if(t in n)return t;let a=e.length;const l=t.charAt(0).toUpperCase()+t.slice(1);let o;for(;a--;)if(o=e[a]+l,o in n)return o;return t}(o),n.style[a]=l}return function(e,t){for(const a in t){const l=t[a];void 0!==l&&Object.prototype.hasOwnProperty.call(t,a)&&n(e,a,l)}}}(),p=(e,t)=>("string"==typeof e?e:v(e)).indexOf(" "+t+" ")>=0,d=(e,t)=>{const n=v(e),a=n+t;p(n,t)||(e.className=a.substring(1))},h=(e,t)=>{const n=v(e);if(!p(e,t))return;const a=n.replace(" "+t+" "," ");e.className=a.substring(1,a.length-1)},v=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),f=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},m=(0,a.Qt)({setup(){(0,l.u2)((()=>{const e=(0,o.KX)(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach((e=>{t.has(e.path)||r.start()})),e.afterEach((e=>{t.add(e.path),r.done()}))}))}})},6164:(e,t,n)=>{n.d(t,{MJ:()=>s,uu:()=>o,Uf:()=>p,ek:()=>u});var a=n(3968),l=n(1108);const o=()=>{const e=(0,l.us)();return(0,a.S6)((()=>e.value.readingTime??null))};var r=n(9344);const s=(e,t)=>{const{minutes:n,words:a}=e,{less1Minute:l,word:o,time:r}=t;return{time:n<1?l:r.replace("$time",Math.round(n).toString()),words:o.replace("$word",a.toString())}},i={words:"",time:""},c=void 0==={"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}}?null:{"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}},u=()=>c?(0,r.MB)(c):(0,a.S6)((()=>null)),p=()=>{if(void 0===c)return(0,a.S6)((()=>i));const e=o(),t=u();return(0,a.S6)((()=>e.value&&t.value?s(e.value,t.value):i))}},9072:(e,t,n)=>{n.d(t,{UR:()=>c,y0:()=>s,_k:()=>o,QR:()=>i});var a=n(7524);const l=(0,n(6432).IL)(a.Q),o=()=>l;var r=n(3968);const s=Symbol(""),i=()=>{const e=(0,r.uU)(s);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},c=(e,t)=>{const{locales:n,...a}=e;return{...a,...n?.[t]}}},9120:(e,t,n)=>{n.d(t,{c:()=>r});var a=n(3968),l=n(1108),o=n(9072);const r=(0,l.Qt)({enhance({app:e}){const t=(0,o._k)(),n=e._context.provides[l.o5],r=(0,a.S6)((()=>(0,o.UR)(t.value,n.value)));e.provide(o.y0,r),Object.defineProperties(e.config.globalProperties,{$theme:{get:()=>t.value},$themeLocale:{get:()=>r.value}})}})},344:(e,t,n)=>{n.d(t,{QR:()=>a.QR,_k:()=>a._k});var a=n(9072)},6496:(e,t,n)=>{n.d(t,{CK:()=>s,QP:()=>h,W0:()=>v,_Y:()=>g,ct:()=>y,iW:()=>f,mY:()=>i,nI:()=>m,oF:()=>d,oX:()=>u,q6:()=>p,yk:()=>o,yq:()=>r});var a=["link","meta","script","style","noscript","template"],l=["title","base"],o=e=>{const t=new Set,n=[];return e.forEach((e=>{const o=(([e,t,n])=>l.includes(e)?e:a.includes(e)?"meta"===e&&t.name?`${e}.${t.name}`:"template"===e&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map((([e,t])=>"boolean"==typeof t?t?[e,""]:null:[e,t])).filter((e=>null!=e)).sort((([e],[t])=>e.localeCompare(t))),n]):null)(e);o&&!t.has(o)&&(t.add(o),n.push(e))})),n},r=e=>"/"===e[0]?e:`/${e}`,s=e=>"/"===e[e.length-1]||e.endsWith(".html")?e:`${e}/`,i=e=>/^(https?:)?\/\//.test(e),c=/.md((\?|#).*)?$/,u=(e,t="/")=>!!i(e)||!(!e.startsWith("/")||e.startsWith(t)||c.test(e)),p=e=>/^[a-z][a-z0-9+.-]*:/.test(e),d=e=>"[object Object]"===Object.prototype.toString.call(e),h=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;const a=n.length>0?n.join(""):"";let l=t.replace(/(^|\/)README.md$/i,"$1index.html");return l.endsWith(".md")?l=l.substring(0,l.length-3)+".html":l.endsWith(".html")||(l+=".html"),l.endsWith("/index.html")?l.substring(0,l.length-10)+a:l+a},v=e=>"/"===e[e.length-1]?e.slice(0,-1):e,f=e=>"/"===e[0]?e.slice(1):e,m=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>{const n=t.split("/").length-e.split("/").length;return 0!==n?n:t.length-e.length}));for(const e of n)if(t.startsWith(e))return e;return"/"},g=(e,t="/")=>{const n=e.replace(/^(https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},y=e=>"string"==typeof e},1804:(e,t,n)=>{n.d(t,{GWq:()=>x,KIJ:()=>u,O8g:()=>I,OQt:()=>A,U$R:()=>P,UCV:()=>v,Udq:()=>S,cv6:()=>$,eSL:()=>N,iQR:()=>R,kXK:()=>M,kng:()=>_,mmi:()=>k});var a=n(8890),l=n(3968),o=n(6432);function r(e){var t;const n=(0,a.xZ)(e);return null!=(t=null==n?void 0:n.$el)?t:n}const s=a.ox?window:void 0,i=a.ox?window.document:void 0,c=a.ox?window.navigator:void 0;function u(...e){let t,n,o,i;if("string"==typeof e[0]||Array.isArray(e[0])?([n,o,i]=e,t=s):[t,n,o,i]=e,!t)return a.Kw;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const c=[],u=()=>{c.forEach((e=>e())),c.length=0},p=(0,l.Kg)((()=>[r(t),(0,a.xZ)(i)]),(([e,t])=>{if(u(),!e)return;const l=(0,a.GM)(t)?{...t}:t;c.push(...n.flatMap((t=>o.map((n=>((e,t,n,a)=>(e.addEventListener(t,n,a),()=>e.removeEventListener(t,n,a)))(e,t,n,l))))))}),{immediate:!0,flush:"post"}),d=()=>{p(),u()};return(0,a.u)(d),d}function p(e){const t=function(){const e=(0,o.IL)(!1);return(0,l._S)()&&(0,l.u2)((()=>{e.value=!0})),e}();return(0,l.S6)((()=>(t.value,Boolean(e()))))}function d(e,t={}){const{window:n=s}=t,r=p((()=>n&&"matchMedia"in n&&"function"==typeof n.matchMedia));let i;const c=(0,o.IL)(!1),u=e=>{c.value=e.matches},d=()=>{i&&("removeEventListener"in i?i.removeEventListener("change",u):i.removeListener(u))},h=(0,l.q6)((()=>{r.value&&(d(),i=n.matchMedia((0,a.xZ)(e)),"addEventListener"in i?i.addEventListener("change",u):i.addListener(u),c.value=i.matches)}));return(0,a.u)((()=>{h(),d(),i=void 0})),c}function h(e,t={}){const{controls:n=!1,navigator:l=c}=t,r=p((()=>l&&"permissions"in l));let s;const i="string"==typeof e?{name:e}:e,d=(0,o.IL)(),h=()=>{s&&(d.value=s.state)},v=(0,a.__)((async()=>{if(r.value){if(!s)try{s=await l.permissions.query(i),u(s,"change",h),h()}catch(e){d.value="prompt"}return s}}));return v(),n?{state:d,isSupported:r,query:v}:d}function v(e={}){const{navigator:t=c,read:n=!1,source:r,copiedDuring:s=1500,legacy:i=!1}=e,d=p((()=>t&&"clipboard"in t)),v=h("clipboard-read"),f=h("clipboard-write"),m=(0,l.S6)((()=>d.value||i)),g=(0,o.IL)(""),y=(0,o.IL)(!1),b=(0,a.SI)((()=>y.value=!1),s);return m.value&&n&&u(["copy","cut"],(function(){var e,n,a;d.value&&"denied"!==v.value?t.clipboard.readText().then((e=>{g.value=e})):g.value=null!=(a=null==(n=null==(e=null==document?void 0:document.getSelection)?void 0:e.call(document))?void 0:n.toString())?a:""})),{isSupported:m,text:g,copied:y,copy:async function(e=(0,a.xZ)(r)){m.value&&null!=e&&(d.value&&"denied"!==f.value?await t.clipboard.writeText(e):function(e){const t=document.createElement("textarea");t.value=null!=e?e:"",t.style.position="absolute",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),t.remove()}(e),g.value=e,y.value=!0,b.start())}}}a.ox&&window.location;const f="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},m="__vueuse_ssr_handlers__",g=y();function y(){return m in f||(f[m]=f[m]||{}),f[m]}const b={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},w="vueuse-storage";function S(e,t,n,r={}){var i;const{flush:c="pre",deep:p=!0,listenToStorageChanges:d=!0,writeDefaults:h=!0,mergeDefaults:v=!1,shallow:f,window:m=s,eventFilter:y,onError:S=(e=>{console.error(e)}),initOnMounted:k}=r,_=(f?o.kl:o.IL)("function"==typeof t?t():t);if(!n)try{n=function(e,t){return g[e]||t}("getDefaultStorage",(()=>{var e;return null==(e=s)?void 0:e.localStorage}))()}catch(e){S(e)}if(!n)return _;const x=(0,a.xZ)(t),C=function(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}(x),M=null!=(i=r.serializer)?i:b[C],{pause:E,resume:I}=(0,a.yO)(_,(()=>function(t){try{if(null==t)n.removeItem(e);else{const a=M.write(t),l=n.getItem(e);l!==a&&(n.setItem(e,a),m&&m.dispatchEvent(new CustomEvent(w,{detail:{key:e,oldValue:l,newValue:a,storageArea:n}})))}}catch(e){S(e)}}(_.value)),{flush:c,deep:p,eventFilter:y});return m&&d&&(0,a.kZ)((()=>{u(m,"storage",L),u(m,w,A),k&&L()})),k||L(),_;function A(e){L(e.detail)}function L(t){if(!t||t.storageArea===n)if(t&&null==t.key)_.value=x;else if(!t||t.key===e){E();try{(null==t?void 0:t.newValue)!==M.write(_.value)&&(_.value=function(t){const a=t?t.newValue:n.getItem(e);if(null==a)return h&&null!=x&&n.setItem(e,M.write(x)),x;if(!t&&v){const e=M.read(a);return"function"==typeof v?v(e,x):"object"!==C||Array.isArray(e)?e:{...x,...e}}return"string"!=typeof a?a:M.read(a)}(t))}catch(e){S(e)}finally{t?(0,l.o$)(I):I()}}}}function k(e){return d("(prefers-color-scheme: dark)",e)}function _(e,t,n={}){const{window:o=s,...i}=n;let c;const u=p((()=>o&&"MutationObserver"in o)),d=()=>{c&&(c.disconnect(),c=void 0)},h=(0,l.Kg)((()=>r(e)),(e=>{d(),u.value&&o&&e&&(c=new MutationObserver(t),c.observe(e,i))}),{immediate:!0}),v=()=>{d(),h()};return(0,a.u)(v),{isSupported:u,stop:v,takeRecords:()=>null==c?void 0:c.takeRecords()}}function x(e,t={width:0,height:0},n={}){const{window:i=s,box:c="content-box"}=n,u=(0,l.S6)((()=>{var t,n;return null==(n=null==(t=r(e))?void 0:t.namespaceURI)?void 0:n.includes("svg")})),d=(0,o.IL)(t.width),h=(0,o.IL)(t.height),{stop:v}=function(e,t,n={}){const{window:o=s,...i}=n;let c;const u=p((()=>o&&"ResizeObserver"in o)),d=()=>{c&&(c.disconnect(),c=void 0)},h=(0,l.S6)((()=>Array.isArray(e)?e.map((e=>r(e))):[r(e)])),v=(0,l.Kg)(h,(e=>{if(d(),u.value&&o){c=new ResizeObserver(t);for(const t of e)t&&c.observe(t,i)}}),{immediate:!0,flush:"post",deep:!0}),f=()=>{d(),v()};return(0,a.u)(f),{isSupported:u,stop:f}}(e,(([t])=>{const n="border-box"===c?t.borderBoxSize:"content-box"===c?t.contentBoxSize:t.devicePixelContentBoxSize;if(i&&u.value){const t=r(e);if(t){const e=i.getComputedStyle(t);d.value=Number.parseFloat(e.width),h.value=Number.parseFloat(e.height)}}else if(n){const e=Array.isArray(n)?n:[n];d.value=e.reduce(((e,{inlineSize:t})=>e+t),0),h.value=e.reduce(((e,{blockSize:t})=>e+t),0)}else d.value=t.contentRect.width,h.value=t.contentRect.height}),n);(0,a.kZ)((()=>{const n=r(e);n&&(d.value="offsetWidth"in n?n.offsetWidth:t.width,h.value="offsetHeight"in n?n.offsetHeight:t.height)}));const f=(0,l.Kg)((()=>r(e)),(e=>{d.value=e?t.width:0,h.value=e?t.height:0}));return{width:d,height:h,stop:function(){v(),f()}}}const C=["fullscreenchange","webkitfullscreenchange","webkitendfullscreen","mozfullscreenchange","MSFullscreenChange"];function M(e,t={}){const{document:n=i,autoExit:s=!1}=t,c=(0,l.S6)((()=>{var t;return null!=(t=r(e))?t:null==n?void 0:n.querySelector("html")})),d=(0,o.IL)(!1),h=(0,l.S6)((()=>["requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","webkitEnterFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen"].find((e=>n&&e in n||c.value&&e in c.value)))),v=(0,l.S6)((()=>["exitFullscreen","webkitExitFullscreen","webkitExitFullScreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen"].find((e=>n&&e in n||c.value&&e in c.value)))),f=(0,l.S6)((()=>["fullScreen","webkitIsFullScreen","webkitDisplayingFullscreen","mozFullScreen","msFullscreenElement"].find((e=>n&&e in n||c.value&&e in c.value)))),m=["fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement"].find((e=>n&&e in n)),g=p((()=>c.value&&n&&void 0!==h.value&&void 0!==v.value&&void 0!==f.value)),y=()=>{if(f.value){if(n&&null!=n[f.value])return n[f.value];{const e=c.value;if(null!=(null==e?void 0:e[f.value]))return Boolean(e[f.value])}}return!1};async function b(){if(g.value&&d.value){if(v.value)if(null!=(null==n?void 0:n[v.value]))await n[v.value]();else{const e=c.value;null!=(null==e?void 0:e[v.value])&&await e[v.value]()}d.value=!1}}async function w(){if(!g.value||d.value)return;y()&&await b();const e=c.value;h.value&&null!=(null==e?void 0:e[h.value])&&(await e[h.value](),d.value=!0)}const S=()=>{const e=y();(!e||e&&m&&(null==n?void 0:n[m])===c.value)&&(d.value=e)};return u(n,C,S,!1),u((()=>r(c)),C,S,!1),s&&(0,a.u)(b),{isSupported:g,isFullscreen:d,enter:w,exit:b,toggle:async function(){await(d.value?b():w())}}}function E(e){return"undefined"!=typeof Window&&e instanceof Window?e.document.documentElement:"undefined"!=typeof Document&&e instanceof Document?e.documentElement:e}function I(e={}){const{controls:t=!1,interval:n="requestAnimationFrame"}=e,l=(0,o.IL)(new Date),r=()=>l.value=new Date,i="requestAnimationFrame"===n?function(e,t={}){const{immediate:n=!0,fpsLimit:l,window:r=s}=t,i=(0,o.IL)(!1),c=l?1e3/l:null;let u=0,p=null;function d(t){if(!i.value||!r)return;const n=t-(u||t);c&&n(g||(g=(n=>new Promise(((l,o)=>{const r=e=>(m.value=e,l(e),e);if(!v)return void l(!1);let i=!1,g=v.querySelector(`script[src="${(0,a.xZ)(e)}"]`);g?g.hasAttribute("data-loaded")&&r(g):(g=v.createElement("script"),g.type=s,g.async=c,g.src=(0,a.xZ)(e),h&&(g.defer=h),u&&(g.crossOrigin=u),d&&(g.noModule=d),p&&(g.referrerPolicy=p),Object.entries(f).forEach((([e,t])=>null==g?void 0:g.setAttribute(e,t))),i=!0),g.addEventListener("error",(e=>o(e))),g.addEventListener("abort",(e=>o(e))),g.addEventListener("load",(()=>{g.setAttribute("data-loaded","true"),t(g),r(g)})),i&&(g=v.head.appendChild(g)),n||r(g)})))(n)),g),b=()=>{if(!v)return;g=null,m.value&&(m.value=null);const t=v.querySelector(`script[src="${(0,a.xZ)(e)}"]`);t&&v.head.removeChild(t)};return l&&!r&&(0,a.kZ)(y),r||(0,a.Ow)(b),{scriptTag:m,load:y,unload:b}}function L(e){const t=window.getComputedStyle(e);if("scroll"===t.overflowX||"scroll"===t.overflowY||"auto"===t.overflowX&&e.clientWidth1||(t.preventDefault&&t.preventDefault(),!1))}const O=new WeakMap;function $(e,t=!1){const n=(0,o.IL)(t);let r=null;(0,l.Kg)((0,a.C7)(e),(e=>{const t=E((0,a.xZ)(e));if(t){const e=t;O.get(e)||O.set(e,void 0),n.value&&(e.style.overflow="hidden")}}),{immediate:!0});const s=()=>{var t;const l=E((0,a.xZ)(e));l&&n.value&&(a.G8&&(null==r||r()),l.style.overflow=null!=(t=O.get(l))?t:"",O.delete(l),n.value=!1)};return(0,a.u)(s),(0,l.S6)({get:()=>n.value,set(t){t?(()=>{const t=E((0,a.xZ)(e));t&&!n.value&&(a.G8&&(r=u(t,"touchmove",(e=>{T(e)}),{passive:!1})),t.style.overflow="hidden",n.value=!0)})():s()}})}let z=0;function N(e,t={}){const n=(0,o.IL)(!1),{document:r=i,immediate:s=!0,manual:c=!1,id:u="vueuse_styletag_"+ ++z}=t,p=(0,o.IL)(e);let d=()=>{};const h=()=>{if(!r)return;const e=r.getElementById(u)||r.createElement("style");e.isConnected||(e.id=u,t.media&&(e.media=t.media),r.head.appendChild(e)),n.value||(d=(0,l.Kg)(p,(t=>{e.textContent=t}),{immediate:!0}),n.value=!0)},v=()=>{r&&n.value&&(d(),r.head.removeChild(r.getElementById(u)),n.value=!1)};return s&&!c&&(0,a.kZ)(h),c||(0,a.u)(v),{id:u,css:p,unload:v,load:h,isLoaded:(0,o.sR)(n)}}Number.POSITIVE_INFINITY;function R(e={}){const{window:t=s,behavior:n="auto"}=e;if(!t)return{x:(0,o.IL)(0),y:(0,o.IL)(0)};const a=(0,o.IL)(t.scrollX),r=(0,o.IL)(t.scrollY),i=(0,l.S6)({get:()=>a.value,set(e){scrollTo({left:e,behavior:n})}}),c=(0,l.S6)({get:()=>r.value,set(e){scrollTo({top:e,behavior:n})}});return u(t,"scroll",(()=>{a.value=t.scrollX,r.value=t.scrollY}),{capture:!1,passive:!0}),{x:i,y:c}}function P(e={}){const{window:t=s,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:i=!0,includeScrollbar:c=!0}=e,p=(0,o.IL)(n),h=(0,o.IL)(r),v=()=>{t&&(c?(p.value=t.innerWidth,h.value=t.innerHeight):(p.value=t.document.documentElement.clientWidth,h.value=t.document.documentElement.clientHeight))};if(v(),(0,a.kZ)(v),u("resize",v,{passive:!0}),i){const e=d("(orientation: portrait)");(0,l.Kg)(e,(()=>v()))}return{width:p,height:h}}a.ZX},8890:(e,t,n)=>{n.d(t,{G2:()=>o,__:()=>w,ZX:()=>b,ox:()=>i,G8:()=>d,GM:()=>u,Kw:()=>p,yO:()=>M,C7:()=>k,xZ:()=>s,kZ:()=>E,u:()=>r,Ow:()=>I,ui:()=>_,qO:()=>A,iG:()=>x,SI:()=>L,gZ:()=>T});var a=n(6432),l=n(3968);function o(e,t){let n,o,r;const s=(0,a.IL)(!0),i=()=>{s.value=!0,r()};(0,l.Kg)(e,i,{flush:"sync"});const c="function"==typeof t?t:t.get,u="function"==typeof t?void 0:t.set,p=(0,a.Oi)(((e,t)=>(o=e,r=t,{get:()=>(s.value&&(n=c(),s.value=!1),o(),n),set(e){null==u||u(e)}})));return Object.isExtensible(p)&&(p.trigger=i),p}function r(e){return!!(0,a.ao)()&&((0,a._o)(e),!0)}function s(e){return"function"==typeof e?e():(0,a.KV)(e)}const i="undefined"!=typeof window&&"undefined"!=typeof document,c=("undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),Object.prototype.toString),u=e=>"[object Object]"===c.call(e),p=()=>{},d=h();function h(){var e,t;return i&&(null==(e=null==window?void 0:window.navigator)?void 0:e.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||(null==(t=null==window?void 0:window.navigator)?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(null==window?void 0:window.navigator.userAgent))}function v(e,t){return function(...n){return new Promise(((a,l)=>{Promise.resolve(e((()=>t.apply(this,n)),{fn:t,thisArg:this,args:n})).then(a).catch(l)}))}}const f=e=>e();function m(e){const t=Object.create(null);return n=>t[n]||(t[n]=e(n))}const g=/\B([A-Z])/g,y=(m((e=>e.replace(g,"-$1").toLowerCase())),/-(\w)/g);function b(e){return e}function w(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const e=t;t=void 0,e&&await e},n}function S(e){return e||(0,l._S)()}function k(...e){if(1!==e.length)return(0,a.C7)(...e);const t=e[0];return"function"==typeof t?(0,a.sR)((0,a.Oi)((()=>({get:t,set:p})))):(0,a.IL)(t)}function _(e,t=200,n={}){return v(function(e,t={}){let n,a,l=p;const o=e=>{clearTimeout(e),l(),l=p};return r=>{const i=s(e),c=s(t.maxWait);return n&&o(n),i<=0||void 0!==c&&c<=0?(a&&(o(a),a=null),Promise.resolve(r())):new Promise(((e,s)=>{l=t.rejectOnCancel?s:e,c&&!a&&(a=setTimeout((()=>{n&&o(n),a=null,e(r())}),c)),n=setTimeout((()=>{a&&o(a),a=null,e(r())}),i)}))}}(t,n),e)}function x(e,t=200,n=!1,a=!0,l=!1){return v(function(e,t=!0,n=!0,a=!1){let l,o,r=0,i=!0,c=p;const u=()=>{l&&(clearTimeout(l),l=void 0,c(),c=p)};return p=>{const d=s(e),h=Date.now()-r,v=()=>o=p();return u(),d<=0?(r=Date.now(),v()):(h>d&&(n||!i)?(r=Date.now(),v()):t&&(o=new Promise(((e,t)=>{c=a?t:e,l=setTimeout((()=>{r=Date.now(),i=!0,e(v()),u()}),Math.max(0,d-h))}))),n||l||(l=setTimeout((()=>i=!0),d)),i=!1,o)}}(t,n,a,l),e)}function C(e,t,n={}){const{eventFilter:a=f,...o}=n;return(0,l.Kg)(e,v(a,t),o)}function M(e,t,n={}){const{eventFilter:l,...o}=n,{eventFilter:r,pause:s,resume:i,isActive:c}=function(e=f){const t=(0,a.IL)(!0);return{isActive:(0,a.sR)(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:(...n)=>{t.value&&e(...n)}}}(l);return{stop:C(e,t,{...o,eventFilter:r}),pause:s,resume:i,isActive:c}}function E(e,t=!0,n){S()?(0,l.u2)(e,n):t?e():(0,l.o$)(e)}function I(e,t){S(t)&&(0,l.wx)(e,t)}function A(e,t=1e3,n={}){const{immediate:o=!0,immediateCallback:c=!1}=n;let u=null;const p=(0,a.IL)(!1);function d(){u&&(clearInterval(u),u=null)}function h(){p.value=!1,d()}function v(){const n=s(t);n<=0||(p.value=!0,c&&e(),d(),u=setInterval(e,n))}return o&&i&&v(),((0,a.Ir)(t)||"function"==typeof t)&&r((0,l.Kg)(t,(()=>{p.value&&i&&v()}))),r(h),{isActive:p,pause:h,resume:v}}function L(e,t,n={}){const{immediate:l=!0}=n,o=(0,a.IL)(!1);let c=null;function u(){c&&(clearTimeout(c),c=null)}function p(){o.value=!1,u()}function d(...n){u(),o.value=!0,c=setTimeout((()=>{o.value=!1,c=null,e(...n)}),s(t))}return l&&(o.value=!0,i&&d()),r(p),{isPending:(0,a.sR)(o),start:d,stop:p}}function T(e=!1,t={}){const{truthyValue:n=!0,falsyValue:l=!1}=t,o=(0,a.Ir)(e),r=(0,a.IL)(e);function i(e){if(arguments.length)return r.value=e,r.value;{const e=s(n);return r.value=r.value===e?s(l):e,r.value}}return o?i:[r,i]}m((e=>e.replace(y,((e,t)=>t?t.toUpperCase():""))))},9912:(e,t,n)=>{n.d(t,{pageviewCount:()=>c});const a={"Content-Type":"application/json"},l=e=>`${e.replace(/\/?$/,"/")}api/`,o=e=>{const t=((e="")=>e.replace(/\/$/u,""))(e);return(e=>/^(https?:)?\/\//.test(e))(t)?t:`https://${t}`},r=e=>{"AbortError"!==e.name&&console.error(e.message)},s=e=>e.dataset.path||null,i=(e,t)=>{t.forEach(((t,n)=>{t.innerText=e[n].toString()}))},c=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:c=!0,lang:u=navigator.language})=>{const p=new AbortController,d=Array.from(document.querySelectorAll(n)),h=e=>{const n=s(e);return null!==n&&t!==n},v=n=>(({serverURL:e,lang:t,paths:n,signal:a})=>(({serverURL:e,lang:t,paths:n,type:a,signal:o})=>fetch(`${l(e)}article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(a.join(","))}&lang=${t}`,{signal:o}).then((e=>e.json())))({serverURL:e,lang:t,paths:n,type:["time"],signal:a}).then((e=>Array.isArray(e)?e:[e])))({serverURL:o(e),paths:n.map((e=>s(e)||t)),lang:u,signal:p.signal}).then((e=>i(e,n))).catch(r);if(c){const n=d.filter((e=>!h(e))),r=d.filter(h);(e=>(({serverURL:e,lang:t,path:n,type:o,action:r})=>fetch(`${l(e)}article?lang=${t}`,{method:"POST",headers:a,body:JSON.stringify({path:n,type:o,action:r})}).then((e=>e.json())).then((e=>((e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e})(e,"Update counter").data)))({...e,type:"time",action:"inc"}))({serverURL:o(e),path:t,lang:u}).then((([e])=>i(new Array(n.length).fill(e),n))),r.length&&v(r)}else v(d);return p.abort.bind(p)}},9160:(e,t,n)=>{n.d(t,{KX:()=>Oe,MJ:()=>$e,WG:()=>Ce,gv:()=>Te,oz:()=>I,sD:()=>L});var a=n(3968),l=n(6432);const o="undefined"!=typeof window;const r=Object.assign;function s(e,t){const n={};for(const a in t){const l=t[a];n[a]=c(l)?l.map(e):e(l)}return n}const i=()=>{},c=Array.isArray,u=/\/$/,p=e=>e.replace(u,"");function d(e,t,n="/"){let a,l={},o="",r="";const s=t.indexOf("#");let i=t.indexOf("?");return s=0&&(i=-1),i>-1&&(a=t.slice(0,i),o=t.slice(i+1,s>-1?s:t.length),l=e(o)),s>-1&&(a=a||t.slice(0,s),r=t.slice(s,t.length)),a=function(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),a=e.split("/"),l=a[a.length-1];".."!==l&&"."!==l||a.push("");let o,r,s=n.length-1;for(o=0;o1&&s--}return n.slice(0,s).join("/")+"/"+a.slice(o-(o===a.length?1:0)).join("/")}(null!=a?a:t,n),{fullPath:a+(o&&"?")+o+r,path:a,query:l,hash:r}}function h(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function v(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function f(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!m(e[n],t[n]))return!1;return!0}function m(e,t){return c(e)?g(e,t):c(t)?g(t,e):e===t}function g(e,t){return c(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}var y,b;!function(e){e.pop="pop",e.push="push"}(y||(y={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(b||(b={}));const w=/^[^#]+#/;function S(e,t){return e.replace(w,"#")+t}const k=()=>({left:window.pageXOffset,top:window.pageYOffset});function _(e,t){return(history.state?history.state.position-t:-1)+e}const x=new Map;let C=()=>location.protocol+"//"+location.host;function M(e,t){const{pathname:n,search:a,hash:l}=t,o=e.indexOf("#");if(o>-1){let t=l.includes(e.slice(o))?e.slice(o).length:1,n=l.slice(t);return"/"!==n[0]&&(n="/"+n),h(n,"")}return h(n,e)+a+l}function E(e,t,n,a=!1,l=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:l?k():null}}function I(e){const t=function(e){const{history:t,location:n}=window,a={value:M(e,n)},l={value:t.state};function o(a,o,r){const s=e.indexOf("#"),i=s>-1?(n.host&&document.querySelector("base")?e:e.slice(s))+a:C()+e+a;try{t[r?"replaceState":"pushState"](o,"",i),l.value=o}catch(e){console.error(e),n[r?"replace":"assign"](i)}}return l.value||o(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:a,state:l,push:function(e,n){const s=r({},l.value,t.state,{forward:e,scroll:k()});o(s.current,s,!0),o(e,r({},E(a.value,e,null),{position:s.position+1},n),!1),a.value=e},replace:function(e,n){o(e,r({},t.state,E(l.value.back,e,l.value.forward,!0),n,{position:l.value.position}),!0),a.value=e}}}(e=function(e){if(!e)if(o){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),p(e)}(e)),n=function(e,t,n,a){let l=[],o=[],s=null;const i=({state:o})=>{const r=M(e,location),i=n.value,c=t.value;let u=0;if(o){if(n.value=r,t.value=o,s&&s===i)return void(s=null);u=c?o.position-c.position:0}else a(r);l.forEach((e=>{e(n.value,i,{delta:u,type:y.pop,direction:u?u>0?b.forward:b.back:b.unknown})}))};function c(){const{history:e}=window;e.state&&e.replaceState(r({},e.state,{scroll:k()}),"")}return window.addEventListener("popstate",i),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:function(){s=n.value},listen:function(e){l.push(e);const t=()=>{const t=l.indexOf(e);t>-1&&l.splice(t,1)};return o.push(t),t},destroy:function(){for(const e of o)e();o=[],window.removeEventListener("popstate",i),window.removeEventListener("beforeunload",c)}}}(e,t.state,t.location,t.replace),a=r({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:S.bind(null,e)},t,n);return Object.defineProperty(a,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(a,"state",{enumerable:!0,get:()=>t.state.value}),a}function A(e){return"string"==typeof e||"symbol"==typeof e}const L={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},T=Symbol("");var O;function $(e,t){return r(new Error,{type:e,[T]:!0},t)}function z(e,t){return e instanceof Error&&T in e&&(null==t||!!(e.type&t))}!function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"}(O||(O={}));const N="[^/]+?",R={sensitive:!1,strict:!1,start:!0,end:!0},P=/[.+*?^${}()[\]/\\]/g;function B(e,t){let n=0;for(;nt.length?1===t.length&&80===t[0]?1:-1:0}function U(e,t){let n=0;const a=e.score,l=t.score;for(;n0&&t[t.length-1]<0}const D={type:0,value:""},F=/[a-zA-Z0-9_]/;function V(e,t,n){const a=function(e,t){const n=r({},R,t),a=[];let l=n.start?"^":"";const o=[];for(const t of e){const e=t.length?[]:[90];n.strict&&!t.length&&(l+="/");for(let a=0;a1&&("*"===s||"+"===s)&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:c,regexp:u,repeatable:"*"===s||"+"===s,optional:"*"===s||"?"===s})):t("Invalid state to consume buffer"),c="")}function d(){c+=s}for(;ir(e,t.meta)),{})}function W(e,t){const n={};for(const a in e)n[a]=a in t?t[a]:e[a];return n}function G(e,t){return t.children.some((t=>t===e||G(e,t)))}const Q=/#/g,X=/&/g,Z=/\//g,J=/=/g,ee=/\?/g,te=/\+/g,ne=/%5B/g,ae=/%5D/g,le=/%5E/g,oe=/%60/g,re=/%7B/g,se=/%7C/g,ie=/%7D/g,ce=/%20/g;function ue(e){return encodeURI(""+e).replace(se,"|").replace(ne,"[").replace(ae,"]")}function pe(e){return ue(e).replace(te,"%2B").replace(ce,"+").replace(Q,"%23").replace(X,"%26").replace(oe,"`").replace(re,"{").replace(ie,"}").replace(le,"^")}function de(e){return null==e?"":function(e){return ue(e).replace(Q,"%23").replace(ee,"%3F")}(e).replace(Z,"%2F")}function he(e){try{return decodeURIComponent(""+e)}catch(e){}return""+e}function ve(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;ee&&pe(e))):[a&&pe(a)]).forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))})):void 0!==a&&(t+=(t.length?"&":"")+n)}return t}function me(e){const t={};for(const n in e){const a=e[n];void 0!==a&&(t[n]=c(a)?a.map((e=>null==e?null:""+e)):null==a?a:""+a)}return t}const ge=Symbol(""),ye=Symbol(""),be=Symbol(""),we=Symbol(""),Se=Symbol("");function ke(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function _e(e,t,n,a,l){const o=a&&(a.enterCallbacks[l]=a.enterCallbacks[l]||[]);return()=>new Promise(((r,s)=>{const i=e=>{var i;!1===e?s($(4,{from:n,to:t})):e instanceof Error?s(e):"string"==typeof(i=e)||i&&"object"==typeof i?s($(2,{from:t,to:e})):(o&&a.enterCallbacks[l]===o&&"function"==typeof e&&o.push(e),r())},c=e.call(a&&a.instances[l],t,n,i);let u=Promise.resolve(c);e.length<3&&(u=u.then(i)),u.catch((e=>s(e)))}))}function xe(e,t,n,a){const l=[];for(const r of e)for(const e in r.components){let s=r.components[e];if("beforeRouteEnter"===t||r.instances[e])if("object"==typeof(o=s)||"displayName"in o||"props"in o||"__vccOpts"in o){const o=(s.__vccOpts||s)[t];o&&l.push(_e(o,n,a,r,e))}else{let o=s();l.push((()=>o.then((l=>{if(!l)return Promise.reject(new Error(`Couldn't resolve component "${e}" at "${r.path}"`));const o=(s=l).__esModule||"Module"===s[Symbol.toStringTag]?l.default:l;var s;r.components[e]=o;const i=(o.__vccOpts||o)[t];return i&&_e(i,n,a,r,e)()}))))}}var o;return l}function Ce(e){const t=(0,a.uU)(be),n=(0,a.uU)(we),o=(0,a.S6)((()=>t.resolve((0,l.KV)(e.to)))),r=(0,a.S6)((()=>{const{matched:e}=o.value,{length:t}=e,a=e[t-1],l=n.matched;if(!a||!l.length)return-1;const r=l.findIndex(v.bind(null,a));if(r>-1)return r;const s=Ee(e[t-2]);return t>1&&Ee(a)===s&&l[l.length-1].path!==s?l.findIndex(v.bind(null,e[t-2])):r})),s=(0,a.S6)((()=>r.value>-1&&function(e,t){for(const n in t){const a=t[n],l=e[n];if("string"==typeof a){if(a!==l)return!1}else if(!c(l)||l.length!==a.length||a.some(((e,t)=>e!==l[t])))return!1}return!0}(n.params,o.value.params))),u=(0,a.S6)((()=>r.value>-1&&r.value===n.matched.length-1&&f(n.params,o.value.params)));return{route:o,href:(0,a.S6)((()=>o.value.href)),isActive:s,isExactActive:u,navigate:function(n={}){return function(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}(n)?t[(0,l.KV)(e.replace)?"replace":"push"]((0,l.KV)(e.to)).catch(i):Promise.resolve()}}}const Me=(0,a._M)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ce,setup(e,{slots:t}){const n=(0,l.cB)(Ce(e)),{options:o}=(0,a.uU)(be),r=(0,a.S6)((()=>({[Ie(e.activeClass,o.linkActiveClass,"router-link-active")]:n.isActive,[Ie(e.exactActiveClass,o.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const l=t.default&&t.default(n);return e.custom?l:(0,a.h)("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},l)}}});function Ee(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ie=(e,t,n)=>null!=e?e:null!=t?t:n;function Ae(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Le=(0,a._M)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const o=(0,a.uU)(Se),s=(0,a.S6)((()=>e.route||o.value)),i=(0,a.uU)(ye,0),c=(0,a.S6)((()=>{let e=(0,l.KV)(i);const{matched:t}=s.value;let n;for(;(n=t[e])&&!n.components;)e++;return e})),u=(0,a.S6)((()=>s.value.matched[c.value]));(0,a.Zl)(ye,(0,a.S6)((()=>c.value+1))),(0,a.Zl)(ge,u),(0,a.Zl)(Se,s);const p=(0,l.IL)();return(0,a.Kg)((()=>[p.value,u.value,e.name]),(([e,t,n],[a,l,o])=>{t&&(t.instances[n]=e,l&&l!==t&&e&&e===a&&(t.leaveGuards.size||(t.leaveGuards=l.leaveGuards),t.updateGuards.size||(t.updateGuards=l.updateGuards))),!e||!t||l&&v(t,l)&&a||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const l=s.value,o=e.name,i=u.value,c=i&&i.components[o];if(!c)return Ae(n.default,{Component:c,route:l});const d=i.props[o],h=d?!0===d?l.params:"function"==typeof d?d(l):d:null,v=(0,a.h)(c,r({},h,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(i.instances[o]=null)},ref:p}));return Ae(n.default,{Component:v,route:l})||v}}});function Te(e){const t=function(e,t){const n=[],a=new Map;function l(e,n,a){const c=!a,u=function(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:K(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}(e);u.aliasOf=a&&a.record;const p=W(t,e),d=[u];if("alias"in e){const t="string"==typeof e.alias?[e.alias]:e.alias;for(const e of t)d.push(r({},u,{components:a?a.record.components:u.components,path:e,aliasOf:a?a.record:u}))}let h,v;for(const t of d){const{path:r}=t;if(n&&"/"!==r[0]){const e=n.record.path,a="/"===e[e.length-1]?"":"/";t.path=n.record.path+(r&&a+r)}if(h=V(t,n,p),a?a.alias.push(h):(v=v||h,v!==h&&v.alias.push(h),c&&e.name&&!q(h)&&o(e.name)),u.children){const e=u.children;for(let t=0;t{o(v)}:i}function o(e){if(A(e)){const t=a.get(e);t&&(a.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&a.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(e){let t=0;for(;t=0&&(e.record.path!==n[t].record.path||!G(e,n[t]));)t++;n.splice(t,0,e),e.record.name&&!q(e)&&a.set(e.record.name,e)}return t=W({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>l(e))),{addRoute:l,resolve:function(e,t){let l,o,s,i={};if("name"in e&&e.name){if(l=a.get(e.name),!l)throw $(1,{location:e});s=l.record.name,i=r(H(t.params,l.keys.filter((e=>!e.optional)).map((e=>e.name))),e.params&&H(e.params,l.keys.map((e=>e.name)))),o=l.stringify(i)}else if("path"in e)o=e.path,l=n.find((e=>e.re.test(o))),l&&(i=l.parse(o),s=l.record.name);else{if(l=t.name?a.get(t.name):n.find((e=>e.re.test(t.path))),!l)throw $(1,{location:e,currentLocation:t});s=l.record.name,i=r({},t.params,e.params),o=l.stringify(i)}const c=[];let u=l;for(;u;)c.unshift(u.record),u=u.parent;return{name:s,path:o,params:i,matched:c,meta:Y(c)}},removeRoute:o,getRoutes:function(){return n},getRecordMatcher:function(e){return a.get(e)}}}(e.routes,e),n=e.parseQuery||ve,u=e.stringifyQuery||fe,p=e.history,h=ke(),m=ke(),g=ke(),b=(0,l.kl)(L);let w=L;o&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const S=s.bind(null,(e=>""+e)),C=s.bind(null,de),M=s.bind(null,he);function E(e,a){if(a=r({},a||b.value),"string"==typeof e){const l=d(n,e,a.path),o=t.resolve({path:l.path},a),s=p.createHref(l.fullPath);return r(l,o,{params:M(o.params),hash:he(l.hash),redirectedFrom:void 0,href:s})}let l;if("path"in e)l=r({},e,{path:d(n,e.path,a.path).path});else{const t=r({},e.params);for(const e in t)null==t[e]&&delete t[e];l=r({},e,{params:C(t)}),a.params=C(a.params)}const o=t.resolve(l,a),s=e.hash||"";o.params=S(M(o.params));const i=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(u,r({},e,{hash:(c=s,ue(c).replace(re,"{").replace(ie,"}").replace(le,"^")),path:o.path}));var c;const h=p.createHref(i);return r({fullPath:i,hash:s,query:u===fe?me(e.query):e.query||{}},o,{redirectedFrom:void 0,href:h})}function I(e){return"string"==typeof e?d(n,e,b.value.path):r({},e)}function T(e,t){if(w!==e)return $(8,{from:t,to:e})}function O(e){return R(e)}function N(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let a="function"==typeof n?n(e):n;return"string"==typeof a&&(a=a.includes("?")||a.includes("#")?a=I(a):{path:a},a.params={}),r({query:e.query,hash:e.hash,params:"path"in a?{}:e.params},a)}}function R(e,t){const n=w=E(e),a=b.value,l=e.state,o=e.force,s=!0===e.replace,i=N(n);if(i)return R(r(I(i),{state:"object"==typeof i?r({},l,i.state):l,force:o,replace:s}),t||n);const c=n;let p;return c.redirectedFrom=t,!o&&function(e,t,n){const a=t.matched.length-1,l=n.matched.length-1;return a>-1&&a===l&&v(t.matched[a],n.matched[l])&&f(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}(u,a,n)&&(p=$(16,{to:c,from:a}),ne(a,a,!0,!1)),(p?Promise.resolve(p):j(c,a)).catch((e=>z(e)?z(e,2)?e:te(e):ee(e,c,a))).then((e=>{if(e){if(z(e,2))return R(r({replace:s},I(e.to),{state:"object"==typeof e.to?r({},l,e.to.state):l,force:o}),t||c)}else e=F(c,a,!0,s,l);return D(c,a,e),e}))}function P(e,t){const n=T(e,t);return n?Promise.reject(n):Promise.resolve()}function B(e){const t=se.values().next().value;return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}function j(e,t){let n;const[a,l,o]=function(e,t){const n=[],a=[],l=[],o=Math.max(t.matched.length,e.matched.length);for(let r=0;rv(e,o)))?a.push(o):n.push(o));const s=e.matched[r];s&&(t.matched.find((e=>v(e,s)))||l.push(s))}return[n,a,l]}(e,t);n=xe(a.reverse(),"beforeRouteLeave",e,t);for(const l of a)l.leaveGuards.forEach((a=>{n.push(_e(a,e,t))}));const r=P.bind(null,e,t);return n.push(r),pe(n).then((()=>{n=[];for(const a of h.list())n.push(_e(a,e,t));return n.push(r),pe(n)})).then((()=>{n=xe(l,"beforeRouteUpdate",e,t);for(const a of l)a.updateGuards.forEach((a=>{n.push(_e(a,e,t))}));return n.push(r),pe(n)})).then((()=>{n=[];for(const a of o)if(a.beforeEnter)if(c(a.beforeEnter))for(const l of a.beforeEnter)n.push(_e(l,e,t));else n.push(_e(a.beforeEnter,e,t));return n.push(r),pe(n)})).then((()=>(e.matched.forEach((e=>e.enterCallbacks={})),n=xe(o,"beforeRouteEnter",e,t),n.push(r),pe(n)))).then((()=>{n=[];for(const a of m.list())n.push(_e(a,e,t));return n.push(r),pe(n)})).catch((e=>z(e,8)?e:Promise.reject(e)))}function D(e,t,n){g.list().forEach((a=>B((()=>a(e,t,n)))))}function F(e,t,n,a,l){const s=T(e,t);if(s)return s;const i=t===L,c=o?history.state:{};n&&(a||i?p.replace(e.fullPath,r({scroll:i&&c&&c.scroll},l)):p.push(e.fullPath,l)),b.value=e,ne(e,t,n,i),te()}let Q;let X,Z=ke(),J=ke();function ee(e,t,n){te(e);const a=J.list();return a.length?a.forEach((a=>a(e,t,n))):console.error(e),Promise.reject(e)}function te(e){return X||(X=!e,Q||(Q=p.listen(((e,t,n)=>{if(!ce.listening)return;const a=E(e),l=N(a);if(l)return void R(r(l,{replace:!0}),a).catch(i);w=a;const s=b.value;var c,u;o&&(c=_(s.fullPath,n.delta),u=k(),x.set(c,u)),j(a,s).catch((e=>z(e,12)?e:z(e,2)?(R(e.to,a).then((e=>{z(e,20)&&!n.delta&&n.type===y.pop&&p.go(-1,!1)})).catch(i),Promise.reject()):(n.delta&&p.go(-n.delta,!1),ee(e,a,s)))).then((e=>{(e=e||F(a,s,!1))&&(n.delta&&!z(e,8)?p.go(-n.delta,!1):n.type===y.pop&&z(e,20)&&p.go(-1,!1)),D(a,s,e)})).catch(i)}))),Z.list().forEach((([t,n])=>e?n(e):t())),Z.reset()),e}function ne(t,n,l,r){const{scrollBehavior:s}=e;if(!o||!s)return Promise.resolve();const i=!l&&function(e){const t=x.get(e);return x.delete(e),t}(_(t.fullPath,0))||(r||!l)&&history.state&&history.state.scroll||null;return(0,a.o$)().then((()=>s(t,n,i))).then((e=>e&&function(e){let t;if("el"in e){const n=e.el,a="string"==typeof n&&n.startsWith("#"),l="string"==typeof n?a?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!l)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),a=e.getBoundingClientRect();return{behavior:t.behavior,left:a.left-n.left-(t.left||0),top:a.top-n.top-(t.top||0)}}(l,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.pageXOffset,null!=t.top?t.top:window.pageYOffset)}(e))).catch((e=>ee(e,t,n)))}const ae=e=>p.go(e);let oe;const se=new Set,ce={currentRoute:b,listening:!0,addRoute:function(e,n){let a,l;return A(e)?(a=t.getRecordMatcher(e),l=n):l=e,t.addRoute(l,a)},removeRoute:function(e){const n=t.getRecordMatcher(e);n&&t.removeRoute(n)},hasRoute:function(e){return!!t.getRecordMatcher(e)},getRoutes:function(){return t.getRoutes().map((e=>e.record))},resolve:E,options:e,push:O,replace:function(e){return O(r(I(e),{replace:!0}))},go:ae,back:()=>ae(-1),forward:()=>ae(1),beforeEach:h.add,beforeResolve:m.add,afterEach:g.add,onError:J.add,isReady:function(){return X&&b.value!==L?Promise.resolve():new Promise(((e,t)=>{Z.add([e,t])}))},install(e){e.component("RouterLink",Me),e.component("RouterView",Le),e.config.globalProperties.$router=this,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,l.KV)(b)}),o&&!oe&&b.value===L&&(oe=!0,O(p.location).catch((e=>{})));const t={};for(const e in L)Object.defineProperty(t,e,{get:()=>b.value[e],enumerable:!0});e.provide(be,this),e.provide(we,(0,l.g7)(t)),e.provide(Se,b);const n=e.unmount;se.add(e),e.unmount=function(){se.delete(e),se.size<1&&(w=L,Q&&Q(),Q=null,b.value=L,oe=!1,X=!1),n()}}};function pe(e){return e.reduce(((e,t)=>e.then((()=>B(t)))),Promise.resolve())}return ce}function Oe(){return(0,a.uU)(be)}function $e(){return(0,a.uU)(we)}},8592:(e,t,n)=>{n.d(t,{c:()=>f});var a=n(1108),l=n(3968),o=n(9344),r=n(9912),s=n(4976);let i={provider:"Waline",dark:'html[data-theme="dark"]',serverURL:"https://waline.newzone.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"]};const c=Symbol(""),u=()=>(0,l.uU)(c),p=u,d={"/":{placeholder:"请留言。(填写邮箱可在被回复时收到邮件提醒)",reactionTitle:"已到达文章底部,欢迎留言、表情互动~",reaction0:"赞一个",reaction1:"支持下",reaction2:"有点酷",reaction3:"啥玩意",reaction4:"看不懂",admin:"盛年不重来,一日难再晨",level0:"锻体",level1:"炼气",level2:"筑基",level3:"金丹",level4:"元婴",level5:"化神"}};Promise.all([n.e(9556),n.e(9060)]).then(n.bind(n,1440));var h=(0,l._M)({name:"WalineComment",props:{identifier:{type:String,required:!0}},setup(e){const t=p(),i=(0,a.aQ)(),c=(0,a.oF)(),u=(0,o.MB)(d);let h;const v=!!t.serverURL,f=(0,l.S6)((()=>{if(!v)return!1;const e=!1!==t.pageview,n=i.value.pageview;return!!n||!1!==e&&!1!==n})),m=(0,l.S6)((()=>({lang:"zh-CN"===c.value?"zh-CN":"en",locale:u.value,dark:"html.dark",...t,path:e.identifier})));return(0,l.u2)((()=>{(0,l.Kg)((()=>e.identifier),(()=>{h?.(),f.value&&(0,l.o$)().then((()=>{setTimeout((()=>{h=(0,r.pageviewCount)({serverURL:t.serverURL,path:e.identifier})}),t.delay||800)}))}),{immediate:!0})})),()=>v?(0,l.h)("div",{id:"comment",class:"waline-wrapper"},(0,l.h)((0,l.Mn)({loader:async()=>(await n.e(1600).then(n.bind(n,1600))).Waline,loadingComponent:s.oJ}),m.value)):null}}),v=(0,l._M)({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=u(),n=(0,a.us)(),o=(0,a.aQ)(),r=!1!==t.comment,s=(0,l.S6)((()=>o.value.comment||r&&!1!==o.value.comment));return()=>(0,l.h)(h,{identifier:o.value.commentID||n.value.path,darkmode:e.darkmode,style:{display:s.value?"block":"none"}})}}),f=(0,a.Qt)({enhance:({app:e})=>{e.provide(c,i),e.component("CommentService",v)}})},2088:(e,t,n)=>{n.d(t,{c:()=>l});var a=n(3968);const l=({type:e="info",text:t="",vertical:n,color:l},{slots:o})=>(0,a.h)("span",{class:["vp-badge",e,{diy:l}],style:{verticalAlign:n??!1,backgroundColor:l??!1}},o.default?.()||t);l.displayName="Badge"},7092:(e,t,n)=>{n.d(t,{c:()=>p});var a=n(3968),l=n(6432),o=n(4976),r=n(9344),s=n(1804);const i=e=>(0,r.ct)(e)?e:`${e}px`,c=(e,t=0)=>{const n=(0,l.kl)(),o=(0,a.S6)((()=>i((0,l.KV)(e.width)||"100%"))),c=(0,l.IL)("auto"),u=()=>{n.value&&(c.value=(n=>{const a=(0,l.KV)(e.height),o=(e=>{if((0,r.ct)(e)){const[t,n]=e.split(":"),a=Number(t)/Number(n);if(!Number.isNaN(a))return a}return"number"==typeof e?e:16/9})((0,l.KV)(e.ratio));return a?i(a):`${Number(n)/o+(0,l.KV)(t)}px`})(n.value.clientWidth))};return(0,a.u2)((()=>{u(),(0,l.Ir)(t)&&(0,a.Kg)(t,u),(0,s.KIJ)("orientationchange",u),(0,s.KIJ)("resize",u)})),{el:n,width:o,height:c,resize:u}},u="https://player.bilibili.com/player.html";var p=(0,a._M)({name:"BiliBili",props:{bvid:{type:String,default:""},aid:{type:String,default:""},cid:{type:String,default:""},title:{type:String,default:"A BiliBili video"},page:{type:[String,Number],default:1},width:{type:[String,Number],default:"100%"},height:{type:[String,Number],default:void 0},ratio:{type:[String,Number],default:16/9},time:{type:[String,Number],default:0},autoplay:Boolean},setup(e){const{el:t,width:n,height:r,resize:s}=c(e),i=(0,l.IL)(!1),p=(0,a.S6)((()=>{const{aid:t,bvid:n,cid:a,autoplay:l,time:o,page:r}=e;return t&&a?`${u}?aid=${t}&cid=${a}&t=${o}&autoplay=${l?1:0}&p=${r}`:n?`${u}?bvid=${n}&t=${o}&autoplay=${l?1:0}`:null}));return()=>p.value?[(0,a.h)("div",{class:"bilibili-desc"},(0,a.h)("a",{class:"sr-only",href:p.value},e.title)),(0,a.h)("iframe",{ref:t,src:p.value,title:e.title,class:"bilibili-iframe",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture",style:{width:n.value,height:i.value?r.value:0},onLoad:()=>{i.value=!0,s()}}),i.value?null:(0,a.h)(o.oJ)]:[]}})},420:(e,t,n)=>{n.d(t,{c:()=>o});var a=n(9344),l=n(3968),o=(0,l._M)({name:"FontIcon",props:{icon:{type:String,default:""},color:{type:String,default:""},size:{type:[String,Number],default:""}},setup(e){const t=(0,l.S6)((()=>{const t=["font-icon icon"],n=`iconfont icon-${e.icon}`;return t.push(n),t})),n=(0,l.S6)((()=>{const t={};return e.color&&(t.color=e.color),e.size&&(t["font-size"]=Number.isNaN(Number(e.size))?e.size:`${e.size}px`),(0,a.C_)(t).length?t:null}));return()=>e.icon?(0,l.h)("span",{key:e.icon,class:t.value,style:n.value}):null}})},6528:(e,t,n)=>{n.d(t,{c:()=>o});var a=n(9344),l=n(3968),o=(0,l._M)({name:"VidStack",props:{sources:{type:Array,default:()=>[]},tracks:{type:Array,default:()=>[]}},setup:(e,{attrs:t})=>((0,l.u2)((async()=>{await Promise.all([Promise.all([n.e(2388),n.e(2736)]).then(n.bind(n,2736)),Promise.all([n.e(2388),n.e(9356)]).then(n.bind(n,9356)),Promise.all([n.e(2388),n.e(1500)]).then(n.bind(n,1500))])})),()=>(0,l.h)("media-player",t,[(0,l.h)("media-provider",[t.poster?(0,l.h)("media-poster",{class:"vds-poster",alt:t.alt||t.title}):null,e.sources.map((e=>(0,a.oF)(e)?(0,l.h)("source",e):(0,l.h)("source",{src:e}))),e.tracks.map((e=>(0,l.h)("track",e)))]),(0,l.h)("media-audio-layout"),(0,l.h)("media-video-layout",t)]))})},1676:(e,t,n)=>{n.d(t,{U:()=>l});var a=n(1804);const l=()=>{(0,a.KIJ)("beforeprint",(()=>{document.querySelectorAll("details").forEach((e=>{e.open=!0}))}))}},7992:(e,t,n)=>{n.d(t,{c:()=>p});var a=n(1108),l=n(3968);let o={};const r=Symbol("");var s=n(9344),i=n(1804);const c={"/":{closeTitle:"关闭",downloadTitle:"下载图片",fullscreenTitle:"切换全屏",zoomTitle:"缩放",arrowPrevTitle:"上一个 (左箭头)",arrowNextTitle:"下一个 (右箭头)"}},u=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(u(e)),e.onerror=e=>n(e))}));var p=(0,a.Qt)({enhance:({app:e})=>{e.provide(r,o)},setup:()=>{(()=>{const e=(0,s.MB)(c),t=(0,a.aQ)(),o=(0,a.us)(),{isSupported:p,toggle:d}=(0,i.kXK)(),h=(0,l.uU)(r);let v;const f=(0,l.S6)((()=>!1!==t.value.photoSwipe&&(t.value.photoSwipe||".theme-hope-content :not(a) > img:not([no-view])"))),m=async()=>{if(f.value)return Promise.all([n.e(4637).then(n.bind(n,4637)),(0,l.o$)().then((()=>new Promise((e=>setTimeout(e,800))).then((()=>(e=>(0,s.ct)(e)?Array.from(document.querySelectorAll(e)):e.map((e=>Array.from(document.querySelectorAll(e)))).flat())(f.value)))))]).then((([{default:t},n])=>{const a=n.map((e=>({html:'
    ',element:e,msrc:e.src})));n.forEach(((n,l)=>{const o=()=>{v=new t({preloaderDelay:0,showHideAnimationType:"zoom",...e.value,...h,dataSource:a,index:l,closeOnVerticalDrag:!0,wheelToZoom:!1}),(e=>{e.on("uiRegister",(()=>{p&&e.ui.registerElement({name:"fullscreen",order:7,isButton:!0,html:'',onClick:()=>{d()}}),e.ui.registerElement({name:"download",order:8,isButton:!0,tagName:"a",html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-download"},onInit:(e,t)=>{e.setAttribute("download",""),e.setAttribute("target","_blank"),e.setAttribute("rel","noopener"),t.on("change",(()=>{e.setAttribute("href",t.currSlide.data.src)}))}}),e.ui.registerElement({name:"bulletsIndicator",className:"photo-swipe-bullets-indicator",appendTo:"wrapper",onInit:(e,t)=>{const n=[];let a=-1;for(let a=0;a{t.goTo(n.indexOf(e.target))},n.push(a),e.appendChild(a)}t.on("change",(()=>{a>=0&&n[a].classList.remove("active"),n[t.currIndex].classList.add("active"),a=t.currIndex}))}})}))})(v),v.addFilter("thumbEl",(()=>n)),v.addFilter("placeholderSrc",(()=>n.src)),v.init()};n.style.cursor="zoom-in",n.addEventListener("click",(()=>{o()})),n.addEventListener("keypress",(({key:e})=>{"Enter"===e&&o()}))})),n.forEach(((e,t)=>{u(e).then((e=>{a.splice(t,1,e),v?.refreshSlideContent(t)}))}))}))};(0,l.u2)((()=>{(0,i.KIJ)("wheel",(()=>{v?.close()})),(0,l.Kg)((()=>o.value.path),m,{immediate:!0})}))})()}})},4976:(e,t,n)=>{n.d(t,{CE:()=>d,KO:()=>b,Ke:()=>p,Kq:()=>C,SG:()=>m,SU:()=>v,Se:()=>u,Ye:()=>h,aK:()=>r,eC:()=>w,ew:()=>c,iy:()=>f,kb:()=>i,oJ:()=>s,qu:()=>S,wl:()=>E,yg:()=>I});var a=n(3968),l=n(4256),o=n(9344);const r=({name:e="",color:t="currentColor"},{slots:n})=>(0,a.h)("svg",{xmlns:"http://www.w3.org/2000/svg",class:["icon",`${e}-icon`],viewBox:"0 0 1024 1024",fill:t,"aria-label":`${e} icon`},n.default?.());r.displayName="IconBase";const s=({size:e=48,stroke:t=4,wrapper:n=!0,height:l=2*e})=>{const o=(0,a.h)("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,preserveAspectRatio:"xMidYMid",viewBox:"25 25 50 50"},[(0,a.h)("animateTransform",{attributeName:"transform",type:"rotate",dur:"2s",keyTimes:"0;1",repeatCount:"indefinite",values:"0;360"}),(0,a.h)("circle",{cx:"50",cy:"50",r:"20",fill:"none",stroke:"currentColor","stroke-width":t,"stroke-linecap":"round"},[(0,a.h)("animate",{attributeName:"stroke-dasharray",dur:"1.5s",keyTimes:"0;0.5;1",repeatCount:"indefinite",values:"1,200;90,200;1,200"}),(0,a.h)("animate",{attributeName:"stroke-dashoffset",dur:"1.5s",keyTimes:"0;0.5;1",repeatCount:"indefinite",values:"0;-35px;-125px"})])]);return n?(0,a.h)("div",{class:"loading-icon-wrapper",style:`display:flex;align-items:center;justify-content:center;height:${l}px`},o):o};s.displayName="LoadingIcon";const i=(e,{slots:t})=>t.default?.(),c=()=>(0,a.h)(r,{name:"github"},(()=>(0,a.h)("path",{d:"M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"})));c.displayName="GitHubIcon";const u=()=>(0,a.h)(r,{name:"gitlab"},(()=>(0,a.h)("path",{d:"M229.333 78.688C223.52 62 199.895 62 193.895 78.688L87.958 406.438h247.5c-.188 0-106.125-327.75-106.125-327.75zM33.77 571.438c-4.875 15 .563 31.687 13.313 41.25l464.812 345L87.77 406.438zm301.5-165 176.813 551.25 176.812-551.25zm655.125 165-54-165-424.312 551.25 464.812-345c12.938-9.563 18.188-26.25 13.5-41.25zM830.27 78.688c-5.812-16.688-29.437-16.688-35.437 0l-106.125 327.75h247.5z"})));u.displayName="GitLabIcon";const p=()=>(0,a.h)(r,{name:"gitee"},(()=>(0,a.h)("path",{d:"M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm242.97-533.34H482.39a23.7 23.7 0 0 0-23.7 23.7l-.03 59.28c0 13.08 10.59 23.7 23.7 23.7h165.96a23.7 23.7 0 0 1 23.7 23.7v11.85a71.1 71.1 0 0 1-71.1 71.1H375.71a23.7 23.7 0 0 1-23.7-23.7V423.11a71.1 71.1 0 0 1 71.1-71.1h331.8a23.7 23.7 0 0 0 23.7-23.7l.06-59.25a23.73 23.73 0 0 0-23.7-23.73H423.11a177.78 177.78 0 0 0-177.78 177.75v331.83c0 13.08 10.62 23.7 23.7 23.7h349.62a159.99 159.99 0 0 0 159.99-159.99V482.33a23.7 23.7 0 0 0-23.7-23.7z"})));p.displayName="GiteeIcon";const d=()=>(0,a.h)(r,{name:"bitbucket"},(()=>(0,a.h)("path",{d:"M575.256 490.862c6.29 47.981-52.005 85.723-92.563 61.147-45.714-20.004-45.714-92.562-1.133-113.152 38.29-23.442 93.696 7.424 93.696 52.005zm63.451-11.996c-10.276-81.152-102.29-134.839-177.152-101.156-47.433 21.138-79.433 71.424-77.129 124.562 2.853 69.705 69.157 126.866 138.862 120.576S647.3 548.571 638.708 478.83zm136.558-309.723c-25.161-33.134-67.986-38.839-105.728-45.13-106.862-17.151-216.576-17.7-323.438 1.134-35.438 5.706-75.447 11.996-97.719 43.996 36.572 34.304 88.576 39.424 135.424 45.129 84.553 10.862 171.447 11.447 256 .585 47.433-5.705 99.987-10.276 135.424-45.714zm32.585 591.433c-16.018 55.99-6.839 131.438-66.304 163.986-102.29 56.576-226.304 62.867-338.87 42.862-59.43-10.862-129.135-29.696-161.72-85.723-14.3-54.858-23.442-110.848-32.585-166.84l3.438-9.142 10.276-5.157c170.277 112.567 408.576 112.567 579.438 0 26.844 8.01 6.84 40.558 6.29 60.014zm103.424-549.157c-19.42 125.148-41.728 249.71-63.415 374.272-6.29 36.572-41.728 57.162-71.424 72.558-106.862 53.724-231.424 62.866-348.562 50.286-79.433-8.558-160.585-29.696-225.134-79.433-30.28-23.443-30.28-63.415-35.986-97.134-20.005-117.138-42.862-234.277-57.161-352.585 6.839-51.42 64.585-73.728 107.447-89.71 57.16-21.138 118.272-30.866 178.87-36.571 129.134-12.58 261.157-8.01 386.304 28.562 44.581 13.13 92.563 31.415 122.844 69.705 13.714 17.7 9.143 40.01 6.29 60.014z"})));d.displayName="BitbucketIcon";const h=()=>(0,a.h)(r,{name:"source"},(()=>(0,a.h)("path",{d:"M601.92 475.2c0 76.428-8.91 83.754-28.512 99.594-14.652 11.88-43.956 14.058-78.012 16.434-18.81 1.386-40.392 2.97-62.172 6.534-18.612 2.97-36.432 9.306-53.064 17.424V299.772c37.818-21.978 63.36-62.766 63.36-109.692 0-69.894-56.826-126.72-126.72-126.72S190.08 120.186 190.08 190.08c0 46.926 25.542 87.714 63.36 109.692v414.216c-37.818 21.978-63.36 62.766-63.36 109.692 0 69.894 56.826 126.72 126.72 126.72s126.72-56.826 126.72-126.72c0-31.086-11.286-59.598-29.7-81.576 13.266-9.504 27.522-17.226 39.996-19.206 16.038-2.574 32.868-3.762 50.688-5.148 48.312-3.366 103.158-7.326 148.896-44.55 61.182-49.698 74.25-103.158 75.24-187.902V475.2h-126.72zM316.8 126.72c34.848 0 63.36 28.512 63.36 63.36s-28.512 63.36-63.36 63.36-63.36-28.512-63.36-63.36 28.512-63.36 63.36-63.36zm0 760.32c-34.848 0-63.36-28.512-63.36-63.36s28.512-63.36 63.36-63.36 63.36 28.512 63.36 63.36-28.512 63.36-63.36 63.36zM823.68 158.4h-95.04V63.36h-126.72v95.04h-95.04v126.72h95.04v95.04h126.72v-95.04h95.04z"})));h.displayName="SourceIcon";const v=(e,t)=>{const n=(t?._instance||(0,a._S)())?.appContext.components;return!!n&&(e in n||(0,l.AX)(e)in n||(0,l.Yj)((0,l.AX)(e))in n)},f=(e,t)=>{let n=1;for(let t=0;t>6;return n+=n<<3,n^=n>>11,n%t};class m{constructor(){this.messageElements={};const e="message-container",t=document.getElementById(e);t?this.containerElement=t:(this.containerElement=document.createElement("div"),this.containerElement.id=e,document.body.appendChild(this.containerElement))}pop(e,t=2e3){const n=document.createElement("div"),a=Date.now();return n.className="message move-in",n.innerHTML=e,this.containerElement.appendChild(n),this.messageElements[a]=n,t>0&&setTimeout((()=>{this.close(a)}),t),a}close(e){if(e){const t=this.messageElements[e];t.classList.remove("move-in"),t.classList.add("move-out"),t.addEventListener("animationend",(()=>{t.remove(),delete this.messageElements[e]}))}else(0,o.C_)(this.messageElements).forEach((e=>this.close(Number(e))))}destroy(){document.body.removeChild(this.containerElement)}}const g=/#.*$/u,y=e=>decodeURI(e).replace(g,"").replace(/\/index\.html$/iu,"/").replace(/\.html$/iu,"").replace(/(README|index)?\.md$/iu,""),b=(e,t)=>{if(!(0,o._g)(t))return!1;const n=y(e.path),a=y(t),l=(e=>{const t=g.exec(e);return t?t[0]:""})(t);return l?l===e.hash&&(!a||n===a):n===a},w=e=>(0,o.mY)(e)?e:`https://github.com/${e}`,S=e=>!(0,o.mY)(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null;var k=e=>"string"==typeof e;const _=Array.isArray,x=e=>(e=>"[object Object]"===Object.prototype.toString.call(e))(e)&&k(e.name),C=(e,t=!1)=>e?_(e)?e.map((e=>k(e)?{name:e}:x(e)?e:null)).filter((e=>null!==e)):k(e)?[{name:e}]:x(e)?[e]:(console.error(`Expect "author" to be \`AuthorInfo[] | AuthorInfo | string[] | string ${t?"":"| false"} | undefined\`, but got`,e),[]):[],M=(e,t)=>{if(e){if(_(e)&&e.every(k))return e;if(k(e))return[e];console.error(`Expect ${t||"value"} to be \`string[] | string | undefined\`, but got`,e)}return[]},E=e=>M(e,"category"),I=e=>M(e,"tag")},7864:(e,t,n)=>{n.d(t,{A:()=>P,P:()=>Qe,a:()=>w,b:()=>k,c:()=>T,d:()=>I,e:()=>Ae,f:()=>b,g:()=>M,h:()=>et,i:()=>A,j:()=>H,k:()=>B,l:()=>Te,m:()=>tt,p:()=>Ie,r:()=>j,s:()=>L,u:()=>K});var a=n(9344),l=n(9160),o=n(1804),r=n(8890),s=n(3968),i=n(6432),c=n(2920),u=n(1108),p=n(4976),d=n(6164),h=n(268);const v=()=>null;var f=n(1340),m=n(6888),g=n(5160);const y=e=>{const{icon:t="",color:n,size:l}=e,o=n||l?{}:null;return n&&(o.color=n),l&&(o.height=Number.isNaN(Number(l))?l:`${l}px`),(0,a.mY)(t)?(0,s.h)("img",{class:"icon",src:t,alt:"","no-view":"",style:o}):(0,a.qM)(t)?(0,s.h)("img",{class:"icon",src:(0,u.m_)(t),alt:"","aria-hidden":"","no-view":"",style:o}):(0,s.h)((0,s.E1)("FontIcon"),e)};y.displayName="HopeIcon";var b=y;const w=()=>{const e=(0,l.KX)(),t=(0,l.MJ)();return n=>{if(n)if((0,a.qM)(n))t.path!==n&&e.push(n);else if((0,a.q6)(n))window&&window.open(n);else{const a=t.path.slice(0,t.path.lastIndexOf("/"));e.push(`${a}/${encodeURI(n)}`)}}},S=()=>{const e=(0,h.a)(),t=(0,u.aQ)();return(0,s.S6)((()=>{const{author:n}=t.value;return n?(0,p.Kq)(n):!1===n?[]:(0,p.Kq)(e.value.author,!1)}))},k=()=>{const e=(0,h.a)(),t=(0,u.us)(),n=(0,u.aQ)(),l=S(),o=(()=>{const e=(0,u.aQ)(),t=(0,s.uU)(Symbol.for("categoryMap"));return(0,s.S6)((()=>(0,p.wl)(e.value.category).map((e=>({name:e,path:t?.value.map[e]?.path||""})))))})(),r=(()=>{const e=(0,u.aQ)(),t=(0,s.uU)(Symbol.for("tagMap"));return(0,s.S6)((()=>(0,p.yg)(e.value.tag).map((e=>({name:e,path:t?.value.map[e]?.path||""})))))})(),i=(()=>{const e=(0,u.aQ)(),t=(0,u.us)();return(0,s.S6)((()=>{const n=(0,a._)(e.value.date);if(n)return n;const{createdTime:l}=t.value.git||{};return l?new Date(l):null}))})(),c=(0,d.uu)(),v=(0,d.Uf)();return{info:(0,s.S6)((()=>({author:l.value,category:o.value,date:i.value,localizedDate:t.value.localizedDate,tag:r.value,isOriginal:n.value.isOriginal||!1,readingTime:c.value,readingTimeLocale:v.value,pageview:!("pageview"in n.value)||n.value.pageview}))),items:(0,s.S6)((()=>"pageInfo"in n.value?n.value.pageInfo:"pageInfo"in e.value?e.value.pageInfo:null))}},{mobileBreakPoint:_,pcBreakPoint:x}=m.default,C=e=>e.endsWith("px")?Number(e.slice(0,-2)):null,M=()=>{const e=(0,i.IL)(!1),t=(0,i.IL)(!1),n=()=>{e.value=window.innerWidth<=(C(_)??719),t.value=window.innerWidth>=(C(x)??1440)};return(0,s.u2)((()=>{n(),(0,o.KIJ)("resize",n,!1),(0,o.KIJ)("orientationchange",n,!1)})),{isMobile:e,isPC:t}},E=Symbol(""),I=()=>{const e=(0,s.uU)(E);if(!e)throw new Error("useDarkmode() is called without provider.");return e},A=e=>{const t=(0,h.b)(),n=(0,o.mmi)(),a=(0,s.S6)((()=>t.value.darkmode||"switch")),l=(0,o.Udq)("vuepress-theme-hope-scheme","auto"),r=(0,s.S6)((()=>{const e=a.value;return"disable"!==e&&("enable"===e||("auto"===e?n.value:"toggle"===e?"dark"===l.value:"dark"===l.value||"auto"===l.value&&n.value))})),i=(0,s.S6)((()=>{const e=a.value;return"switch"===e||"toggle"===e}));e.provide(E,{canToggle:i,config:a,isDarkmode:r,status:l}),Object.defineProperties(e.config.globalProperties,{$isDarkmode:{get:()=>r.value}})},L=()=>{const{config:e,isDarkmode:t,status:n}=I();(0,s.q6)((()=>{"disable"===e.value?n.value="light":"enable"===e.value?n.value="dark":"toggle"===e.value&&"auto"===n.value&&(n.value="light")})),(0,s.u2)((()=>{(0,s.Kg)(t,(e=>document.documentElement.setAttribute("data-theme",e?"dark":"light")),{immediate:!0})}))};var T=(0,s._M)({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=(0,l.MJ)(),c=(0,u.jW)(),p=(0,i.C7)(e,"config"),d=(0,s.S6)((()=>(0,a.mY)(p.value.link))),h=(0,s.S6)((()=>!d.value&&(0,a.q6)(p.value.link))),v=(0,s.S6)((()=>p.value.target||(d.value?"_blank":void 0))),m=(0,s.S6)((()=>"_blank"===v.value)),g=(0,s.S6)((()=>!d.value&&!h.value&&!m.value)),y=(0,s.S6)((()=>p.value.rel||(m.value?"noopener noreferrer":null))),w=(0,s.S6)((()=>p.value.ariaLabel||p.value.text)),S=(0,s.S6)((()=>{if(e.exact)return!1;const t=(0,a.C_)(c.value.locales);return t.length?t.every((e=>e!==p.value.link)):"/"!==p.value.link})),k=(0,s.S6)((()=>!!g.value&&(p.value.activeMatch?new RegExp(p.value.activeMatch,"u").test(r.path):S.value?(0,a._y)(r.path,p.value.link):r.path===p.value.link)));return()=>{const{before:a,after:l,default:r}=o,{text:i,icon:c,link:d}=p.value;return g.value?(0,s.h)(u.Qr,{to:d,"aria-label":w.value,...t,class:["nav-link",{active:k.value},t.class],onFocusout:()=>n("focusout")},(()=>r?r():[a?a():(0,s.h)(b,{icon:c}),i,l?.()])):(0,s.h)("a",{href:d,rel:y.value,target:v.value,"aria-label":w.value,...t,class:["nav-link",t.class],onFocusout:()=>n("focusout")},r?r():[a?a():(0,s.h)(b,{icon:c}),i,e.noExternalLinkIcon?null:(0,s.h)(f.K),l?.()])}}});const O=(e,t,n=!1)=>"activeMatch"in t?new RegExp(t.activeMatch,"u").test(e.path):!!(0,p.KO)(e,t.link)||!(!t.children||n)&&t.children.some((t=>O(e,t))),$=(e,t)=>"group"===t.type&&(t.children.some((t=>"group"===t.type?$(e,t):"page"===t.type&&O(e,t,!0)))||"prefix"in t&&(0,p.KO)(e,t.prefix)),z=(e,t)=>(0,a.ct)(e.link)?(0,s.h)(T,{...t,config:e}):(0,s.h)("p",t,[(0,s.h)(b,{icon:e.icon}),e.text]),N=e=>{const t=(0,l.MJ)();return e?(0,s.h)("ul",{class:"vp-sidebar-sub-headers"},e.map((e=>(0,s.h)("li",{class:"vp-sidebar-sub-header"},[z(e,{class:["vp-sidebar-link","vp-heading",{active:O(t,e,!0)}]}),N(e.children)])))):null};var R,P=((R=P||{}).type="y",R.title="t",R.shortTitle="s",R.icon="i",R.author="a",R.date="d",R.localizedDate="l",R.category="c",R.tag="g",R.isEncrypted="n",R.isOriginal="o",R.readingTime="r",R.excerpt="e",R.sticky="u",R.cover="v",R.index="I",R.order="O",R),B=(e=>(e.article="a",e.home="h",e.slide="s",e.page="p",e))(B||{});const U=(e="",t="")=>(0,a.qM)(t)?t:`${(0,a.CK)(e)}${t}`,j=(e,t=!1)=>{const{meta:n,path:a}=(0,u.mA)(e);return n?{text:!t&&n[P.shortTitle]?n[P.shortTitle]:n[P.title]||a,link:a,...n[P.icon]?{icon:n[P.icon]}:{}}:{text:a,link:a}},D=(e,t,n)=>n>0?t.map((t=>({type:"heading",text:t.title,link:`${e.path}#${t.slug}`,children:D(e,t.children,n-1)}))):[],F=({config:e,page:t,headerDepth:n,prefix:l=""})=>{const o=(e,r=l)=>{const s=(0,a.ct)(e)?j(U(r,e)):e.link?{...e,...(0,a.oX)(e.link)?{}:{link:j(U(r,e.link)).link}}:e;if("children"in s){const e=U(r,s.prefix),t="structure"===s.children?g.o[e]:s.children;return{type:"group",...s,prefix:e,children:t.map((t=>o(t,e)))}}return{type:"page",...s,children:s.link===t.path?D(t,1===t.headers[0]?.level?t.headers[0].children:t.headers,n):[]}};return e.map((e=>o(e)))},V=Symbol(""),H=()=>{const e=(0,u.aQ)(),t=(0,h.a)(),n=(0,u.us)(),l=(0,u.mq)(),o=(0,s.S6)((()=>!e.value.home&&(e.value.sidebar??t.value.sidebar??"structure"))),i=(0,s.S6)((()=>e.value.headerDepth??t.value.headerDepth??2)),c=(0,r.G2)((()=>[o.value,i.value,n.value.path,null]),(()=>(({config:e,routeLocale:t,page:n,headerDepth:l})=>"heading"===e?D(n,n.headers,l):"structure"===e?F({config:g.o[t],page:n,headerDepth:l,prefix:t}):(0,a.c7)(e)?F({config:e,page:n,headerDepth:l}):(0,a.oF)(e)?(({config:e,page:t,headerDepth:n})=>{const l=(0,a.C_)(e).sort(((e,t)=>t.length-e.length));for(const o of l)if((0,a._y)(decodeURI(t.path),o)){const a=e[o];return a?F({config:"structure"===a?g.o[o]:"heading"===a?D(t,t.headers,n):a,page:t,headerDepth:n,prefix:o}):[]}return console.warn(`${t.path} is missing sidebar config.`),[]})({config:e,page:n,headerDepth:l}):[])({config:o.value,routeLocale:l.value,page:n.value,headerDepth:i.value})));(0,s.Zl)(V,c)},K=()=>{const e=(0,s.uU)(V);if(!e)throw new Error("useSidebarItems() is called without provider.");return e};var q=(0,s._M)({name:"PageFooter",setup(){const e=(0,h.b)(),t=(0,h.a)(),n=(0,u.aQ)(),l=S(),o=(0,s.S6)((()=>{const{copyright:e,footer:a}=n.value;return!1!==a&&!!(e||a||t.value.displayFooter)})),r=(0,s.S6)((()=>{const{footer:e}=n.value;return!1!==e&&((0,a.ct)(e)?e:t.value.footer||"")})),i=(0,s.S6)((()=>l.value.map((({name:e})=>e)).join(", "))),c=e=>`Copyright © ${(new Date).getFullYear()} ${i.value} ${e?`${e} Licensed`:""}`,p=(0,s.S6)((()=>{const{copyright:l,license:o=""}=n.value,{license:r}=e.value,{copyright:s}=t.value;return l??(o?c(o):(0,a.ct)(s)?s:!(!i.value&&!r)&&c(r))}));return()=>o.value?(0,s.h)("footer",{class:"vp-footer-wrapper"},[r.value?(0,s.h)("div",{class:"vp-footer",innerHTML:r.value}):null,p.value?(0,s.h)("div",{class:"vp-copyright",innerHTML:p.value}):null]):null}}),Y=(0,s._M)({name:"NavbarDropdownLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=(0,u.us)(),a=(0,i.C7)(e,"config"),l=(0,s.S6)((()=>a.value.ariaLabel||a.value.text)),o=(0,i.IL)(!1);(0,s.Kg)((()=>n.value.path),(()=>{o.value=!1}));const r=e=>{0===e.detail&&(o.value=!o.value)};return()=>(0,s.h)("div",{class:["dropdown-wrapper",{open:o.value}]},[(0,s.h)("button",{type:"button",class:"dropdown-title","aria-label":l.value,onClick:r},[t.title?.()||(0,s.h)("span",{class:"title"},[(0,s.h)(b,{icon:a.value.icon}),e.config.text]),(0,s.h)("span",{class:"arrow"}),(0,s.h)("ul",{class:"nav-dropdown"},a.value.children.map(((e,t)=>{const n=t===a.value.children.length-1;return(0,s.h)("li",{class:"dropdown-item"},"children"in e?[(0,s.h)("h4",{class:"dropdown-subtitle"},e.link?(0,s.h)(T,{config:e,onFocusout:()=>{0===e.children.length&&n&&(o.value=!1)}}):(0,s.h)("span",e.text)),(0,s.h)("ul",{class:"dropdown-subitem-wrapper"},e.children.map(((t,a)=>(0,s.h)("li",{class:"dropdown-subitem"},(0,s.h)(T,{config:t,onFocusout:()=>{a===e.children.length-1&&n&&(o.value=!1)}})))))]:(0,s.h)(T,{config:e,onFocusout:()=>{n&&(o.value=!1)}}))})))])])}});const W=()=>(0,s.h)(p.aK,{name:"i18n"},(()=>[(0,s.h)("path",{d:"M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"})]));W.displayName="I18nIcon";const G=(e,t="")=>(0,a.ct)(e)?j(U(t,e)):"children"in e?{...e,...e.link&&!(0,a.oX)(e.link)?j(U(t,e.link)):{},children:e.children.map((n=>G(n,U(t,e.prefix))))}:{...e,link:(0,a.oX)(e.link)?e.link:j(U(t,e.link)).link},Q=()=>{const e=(0,h.a)(),t=(0,r.G2)((()=>e.value.navbar),(()=>(e.value.navbar||[]).map((e=>G(e)))));return console.log(t.value),t};(0,s._M)({name:"LanguageDropdown",setup(){const e=(()=>{const e=(0,a.YX)(),t=(0,l.MJ)(),n=(0,u.mq)(),o=(0,u.wR)(),s=(0,h.b)(),i=(0,h.a)();return(0,r.G2)((()=>t.path),(()=>{const l=(0,a.C_)(o.value.locales),r=(0,a.ZE)(s.value.extraLocales??{});if(l.length<2&&!r.length)return null;const{path:c,fullPath:u}=t,{navbarLocales:p}=i.value;return{text:"",ariaLabel:p?.selectLangAriaLabel,children:[...l.map((t=>{const a=o.value.locales?.[t]??{},l=s.value.locales?.[t]??{},r=a.lang||"",i=l.navbarLocales?.langName??r;let p;if(r===o.value.lang)p=c;else{const a=c.replace(n.value,t);p=e.value.some((e=>e===a))?u.replace(c,a):l.home??t}return{text:i,link:p}})),...r.map((([e,a])=>({text:e,link:a.replace(":route",t.path.replace(n.value,""))})))]}}))})();return()=>e.value?(0,s.h)("div",{class:"nav-item"},(0,s.h)(Y,{class:"i18n-dropdown",config:e.value},{title:()=>(0,s.h)(W,{"aria-label":e.value?.ariaLabel,style:{width:"1rem",height:"1rem",verticalAlign:"middle"}})})):null}});var X=(0,s._M)({name:"NavScreenDropdown",props:{config:{type:Object,required:!0}},setup(e){const t=(0,u.us)(),n=(0,i.C7)(e,"config"),a=(0,s.S6)((()=>n.value.ariaLabel||n.value.text)),l=(0,i.IL)(!1);(0,s.Kg)((()=>t.value.path),(()=>{l.value=!1}));const o=(e,t)=>t[t.length-1]===e;return()=>[(0,s.h)("button",{type:"button",class:["nav-screen-dropdown-title",{active:l.value}],"aria-label":a.value,onClick:()=>{l.value=!l.value}},[(0,s.h)("span",{class:"title"},[(0,s.h)(b,{icon:n.value.icon}),e.config.text]),(0,s.h)("span",{class:["arrow",l.value?"down":"end"]})]),(0,s.h)("ul",{class:["nav-screen-dropdown",{hide:!l.value}]},n.value.children.map((e=>(0,s.h)("li",{class:"dropdown-item"},"children"in e?[(0,s.h)("h4",{class:"dropdown-subtitle"},e.link?(0,s.h)(T,{config:e,onFocusout:()=>{o(e,n.value.children)&&0===e.children.length&&(l.value=!1)}}):(0,s.h)("span",e.text)),(0,s.h)("ul",{class:"dropdown-subitem-wrapper"},e.children.map((t=>(0,s.h)("li",{class:"dropdown-subitem"},(0,s.h)(T,{config:t,onFocusout:()=>{o(t,e.children)&&o(e,n.value.children)&&(l.value=!1)}})))))]:(0,s.h)(T,{config:e,onFocusout:()=>{o(e,n.value.children)&&(l.value=!1)}})))))]}}),Z=(0,s._M)({name:"NavScreenLinks",setup(){const e=Q();return()=>e.value.length?(0,s.h)("nav",{class:"nav-screen-links"},e.value.map((e=>(0,s.h)("div",{class:"navbar-links-item"},"children"in e?(0,s.h)(X,{config:e}):(0,s.h)(T,{config:e}))))):null}});const J=()=>(0,s.h)(p.aK,{name:"dark"},(()=>(0,s.h)("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"})));J.displayName="DarkIcon";const ee=()=>(0,s.h)(p.aK,{name:"light"},(()=>(0,s.h)("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"})));ee.displayName="LightIcon";const te=()=>(0,s.h)(p.aK,{name:"auto"},(()=>(0,s.h)("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"})));te.displayName="AutoIcon";const ne=()=>(0,s.h)(p.aK,{name:"enter-fullscreen"},(()=>(0,s.h)("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"})));ne.displayName="EnterFullScreenIcon";const ae=()=>(0,s.h)(p.aK,{name:"cancel-fullscreen"},(()=>(0,s.h)("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"})));ae.displayName="CancelFullScreenIcon";const le=()=>(0,s.h)(p.aK,{name:"outlook"},(()=>[(0,s.h)("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"})]));le.displayName="OutlookIcon";var oe=(0,s._M)({name:"AppearanceSwitch",setup(){const{config:e,isDarkmode:t,status:n}=I(),a=(0,h.u)(),l=()=>{"switch"===e.value?n.value={light:"dark",dark:"auto",auto:"light"}[n.value]:n.value="light"===n.value?"dark":"light"},o=async e=>{if(!document.startViewTransition||window.matchMedia("(prefers-reduced-motion: reduce)").matches||a.value||!e)return void l();const n=e.clientX,o=e.clientY,r=Math.hypot(Math.max(n,innerWidth-n),Math.max(o,innerHeight-o)),i=t.value;await document.startViewTransition((async()=>{l(),await(0,s.o$)()})).ready,t.value!==i&&document.documentElement.animate({clipPath:t.value?[`circle(${r}px at ${n}px ${o}px)`,`circle(0px at ${n}px ${o}px)`]:[`circle(0px at ${n}px ${o}px)`,`circle(${r}px at ${n}px ${o}px)`]},{duration:400,pseudoElement:t.value?"::view-transition-old(root)":"::view-transition-new(root)"})};return()=>(0,s.h)("button",{type:"button",id:"appearance-switch",onClick:o},[(0,s.h)(te,{style:{display:"auto"===n.value?"block":"none"}}),(0,s.h)(J,{style:{display:"dark"===n.value?"block":"none"}}),(0,s.h)(ee,{style:{display:"light"===n.value?"block":"none"}})])}}),re=(0,s._M)({name:"AppearanceMode",setup(){const e=(0,h.a)(),{canToggle:t}=I(),n=(0,s.S6)((()=>e.value.outlookLocales.darkmode));return()=>t.value?(0,s.h)("div",{class:"appearance-wrapper"},[(0,s.h)("label",{class:"appearance-title",for:"appearance-switch"},n.value),(0,s.h)(oe)]):null}});const se="VUEPRESS_THEME_COLOR";var ie=(0,s._M)({name:"ThemeColorPicker",props:{themeColor:{type:Object,required:!0}},setup(e){const t=(t="")=>{const n=document.documentElement.classList,l=(0,a.C_)(e.themeColor);if(!t)return localStorage.removeItem(se),void n.remove(...l);n.remove(...l.filter((e=>e!==t))),n.add(t),localStorage.setItem(se,t)};return(0,s.u2)((()=>{const e=localStorage.getItem(se);e&&t(e)})),()=>(0,s.h)("ul",{id:"theme-color-picker"},[(0,s.h)("li",(0,s.h)("span",{class:"theme-color",onClick:()=>t()})),(0,a.ZE)(e.themeColor).map((([e,n])=>(0,s.h)("li",(0,s.h)("span",{style:{background:n},onClick:()=>t(e)}))))])}});const ce="true"===m.default.enableThemeColor,ue=ce?(0,a.GQ)((0,a.ZE)(m.default).filter((([e])=>e.startsWith("theme-")))):{};var pe=(0,s._M)({name:"ThemeColor",setup(){const e=(0,h.a)(),t=(0,s.S6)((()=>e.value.outlookLocales.themeColor));return()=>ce?(0,s.h)("div",{class:"theme-color-wrapper"},[(0,s.h)("label",{class:"theme-color-title",for:"theme-color-picker"},t.value),(0,s.h)(ie,{themeColor:ue})]):null}}),de=(0,s._M)({name:"ToggleFullScreenButton",setup(){const e=(0,h.a)(),{isSupported:t,isFullscreen:n,toggle:a}=(0,o.kXK)(),l=(0,s.S6)((()=>e.value.outlookLocales.fullscreen));return()=>t?(0,s.h)("div",{class:"full-screen-wrapper"},[(0,s.h)("label",{class:"full-screen-title",for:"full-screen-switch"},l.value),(0,s.h)("button",{type:"button",id:"full-screen-switch",class:"full-screen",ariaPressed:n.value,onClick:()=>a()},n.value?(0,s.h)(ae):(0,s.h)(ne))]):null}}),he=(0,s._M)({name:"OutlookSettings",setup(){const e=(0,h.b)(),t=(0,h.u)(),n=(0,s.S6)((()=>!t.value&&e.value.fullscreen));return()=>(0,s.h)(u.iU,(()=>[ce?(0,s.h)(pe):null,(0,s.h)(re),n.value?(0,s.h)(de):null]))}}),ve=(0,s._M)({name:"NavScreen",props:{show:Boolean},emits:["close"],slots:Object,setup(e,{emit:t,slots:n}){const a=(0,u.us)(),{isMobile:l}=M(),r=(0,i.kl)(),p=(0,o.cv6)(r);return(0,s.u2)((()=>{r.value=document.body,(0,s.Kg)(l,(n=>{!n&&e.show&&(p.value=!1,t("close"))})),(0,s.Kg)((()=>a.value.path),(()=>{p.value=!1,t("close")}))})),(0,s.wx)((()=>{p.value=!1})),()=>(0,s.h)(c.Ox,{name:"fade",onEnter:()=>{p.value=!0},onAfterLeave:()=>{p.value=!1}},(()=>e.show?(0,s.h)("div",{id:"nav-screen"},(0,s.h)("div",{class:"vp-nav-screen-container"},[n.before?.(),(0,s.h)(Z),(0,s.h)("div",{class:"vp-outlook-wrapper"},(0,s.h)(he)),n.after?.()])):null))}}),fe=(0,s._M)({name:"NavbarBrand",setup(){const e=(0,u.mq)(),t=(0,u.wR)(),n=(0,h.a)(),a=(0,s.S6)((()=>n.value.home||e.value)),l=(0,s.S6)((()=>t.value.title)),o=(0,s.S6)((()=>n.value.navTitle??l.value)),r=(0,s.S6)((()=>n.value.logo?(0,u.m_)(n.value.logo):null)),i=(0,s.S6)((()=>n.value.logoDark?(0,u.m_)(n.value.logoDark):null));return()=>(0,s.h)(u.Qr,{to:a.value,class:"vp-brand"},(()=>[r.value?(0,s.h)("img",{class:["vp-nav-logo",{light:!!i.value}],src:r.value,alt:""}):null,i.value?(0,s.h)("img",{class:["vp-nav-logo dark"],src:i.value,alt:""}):null,o.value?(0,s.h)("span",{class:["vp-site-name",{"hide-in-pad":r.value&&!1!==n.value.hideSiteNameOnMobile}]},o.value):null]))}}),me=(0,s._M)({name:"NavbarLinks",setup(){const e=Q();return()=>e.value.length?(0,s.h)("nav",{class:"vp-nav-links"},e.value.map((e=>(0,s.h)("div",{class:"nav-item hide-in-mobile"},"children"in e?(0,s.h)(Y,{config:e}):(0,s.h)(T,{config:e}))))):null}}),ge=(0,s._M)({name:"RepoLink",components:{BitbucketIcon:p.CE,GiteeIcon:p.Ke,GitHubIcon:p.ew,GitLabIcon:p.Se,SourceIcon:p.Ye},setup(){const e=(()=>{const e=(0,h.a)(),t=(0,s.S6)((()=>e.value.repo||null)),n=(0,s.S6)((()=>t.value?(0,p.eC)(t.value):null)),a=(0,s.S6)((()=>t.value?(0,p.qu)(t.value):null)),l=(0,s.S6)((()=>n.value?e.value.repoLabel??(null===a.value?"Source":a.value):null));return(0,s.S6)((()=>n.value&&l.value&&!1!==e.value.repoDisplay?{type:a.value||"Source",label:l.value,link:n.value}:null))})();return()=>e.value?(0,s.h)("div",{class:"nav-item vp-repo"},(0,s.h)("a",{class:"vp-repo-link",href:e.value.link,target:"_blank",rel:"noopener noreferrer","aria-label":e.value.label},(0,s.h)((0,s.E1)(`${e.value.type}Icon`),{style:{width:"1.25rem",height:"1.25rem",verticalAlign:"middle"}}))):null}});const ye=({active:e=!1},{emit:t})=>(0,s.h)("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")},(0,s.h)("span",[(0,s.h)("span",{class:"vp-top"}),(0,s.h)("span",{class:"vp-middle"}),(0,s.h)("span",{class:"vp-bottom"})]));ye.displayName="ToggleNavbarButton";var be=ye;const we=(e,{emit:t})=>(0,s.h)("button",{type:"button",class:"vp-toggle-sidebar-button",title:"Toggle Sidebar",onClick:()=>t("toggle")},(0,s.h)("span",{class:"icon"}));we.displayName="ToggleSidebarButton",we.emits=["toggle"];var Se=we,ke=(0,s._M)({name:"OutlookButton",setup(){const{isSupported:e}=(0,o.kXK)(),t=(0,h.b)(),n=(0,h.u)(),a=(0,u.us)(),{canToggle:l}=I(),r=(0,i.IL)(!1),c=(0,s.S6)((()=>!n.value&&t.value.fullscreen&&e));return(0,s.Kg)((()=>a.value.path),(()=>{r.value=!1})),()=>l.value||c.value||ce?(0,s.h)("div",{class:"nav-item hide-in-mobile"},!l.value||c.value||ce?!c.value||l.value||ce?(0,s.h)("button",{type:"button",class:["outlook-button",{open:r.value}],tabindex:"-1","aria-hidden":!0},[(0,s.h)(le),(0,s.h)("div",{class:"outlook-dropdown"},(0,s.h)(he))]):(0,s.h)(de):(0,s.h)(oe)):null}}),_e=(0,s._M)({name:"NavBar",emits:["toggleSidebar"],slots:Object,setup(e,{emit:t,slots:n}){const a=(0,h.a)(),{isMobile:l}=M(),o=(0,i.IL)(!1),r=(0,s.S6)((()=>{const{navbarAutoHide:e="mobile"}=a.value;return"none"!==e&&("always"===e||l.value)})),c=(0,s.S6)((()=>a.value.navbarLayout||{start:["Brand"],center:["Links"],end:["Language","Repo","Outlook","Search"]})),u={Brand:fe,Language:v,Links:me,Repo:ge,Outlook:ke,Search:(0,p.SU)("Docsearch")?(0,s.E1)("Docsearch"):(0,p.SU)("SearchBox")?(0,s.E1)("SearchBox"):v},d=e=>u[e]??((0,p.SU)(e)?(0,s.E1)(e):v);return()=>[(0,s.h)("header",{id:"navbar",class:["vp-navbar",{"auto-hide":r.value,"hide-icon":!1===a.value.navbarIcon}]},[(0,s.h)("div",{class:"vp-navbar-start"},[(0,s.h)(Se,{onToggle:()=>{o.value&&(o.value=!1),t("toggleSidebar")}}),n.startBefore?.(),(c.value.start||[]).map((e=>(0,s.h)(d(e)))),n.startAfter?.()]),(0,s.h)("div",{class:"vp-navbar-center"},[n.centerBefore?.(),(c.value.center||[]).map((e=>(0,s.h)(d(e)))),n.centerAfter?.()]),(0,s.h)("div",{class:"vp-navbar-end"},[n.endBefore?.(),(c.value.end||[]).map((e=>(0,s.h)(d(e)))),n.endAfter?.(),(0,s.h)(be,{active:o.value,onToggle:()=>{o.value=!o.value}})])]),(0,s.h)(ve,{show:o.value,onClose:()=>{o.value=!1}},{before:()=>n.screenTop?.(),after:()=>n.screenBottom?.()})]}}),xe=(0,s._M)({name:"SidebarChild",props:{config:{type:Object,required:!0}},setup(e){const t=(0,l.MJ)();return()=>[z(e.config,{class:["vp-sidebar-link",`vp-sidebar-${e.config.type}`,{active:O(t,e.config,!0)}],exact:!0}),N(e.config.children)]}}),Ce=(0,s._M)({name:"SidebarGroup",props:{config:{type:Object,required:!0},open:{type:Boolean,required:!0}},emits:["toggle"],setup(e,{emit:t}){const n=(0,l.MJ)(),a=(0,s.S6)((()=>O(n,e.config))),o=(0,s.S6)((()=>O(n,e.config,!0)));return()=>{const{collapsible:n,children:l=[],icon:r,prefix:i,link:c,text:u}=e.config;return(0,s.h)("section",{class:"vp-sidebar-group"},[(0,s.h)(n?"button":"p",{class:["vp-sidebar-heading",{clickable:n||c,exact:o.value,active:a.value}],...n?{type:"button",onClick:()=>t("toggle"),onKeydown:e=>{"Enter"===e.key&&t("toggle")}}:{}},[(0,s.h)(b,{icon:r}),c?(0,s.h)(T,{class:"vp-sidebar-title",config:{text:u,link:c},noExternalLinkIcon:!0}):(0,s.h)("span",{class:"vp-sidebar-title"},u),n?(0,s.h)("span",{class:["vp-arrow",e.open?"down":"end"]}):null]),e.open||!n?(0,s.h)(Me,{key:i,config:l}):null])}}}),Me=(0,s._M)({name:"SidebarLinks",props:{config:{type:Array,required:!0}},setup(e){const t=(0,l.MJ)(),n=(0,i.IL)(-1);return(0,s.Kg)((()=>t.path),(()=>{const a=e.config.findIndex((e=>$(t,e)));n.value=a}),{immediate:!0,flush:"post"}),()=>(0,s.h)("ul",{class:"vp-sidebar-links"},e.config.map(((e,t)=>(0,s.h)("li","group"===e.type?(0,s.h)(Ce,{config:e,open:t===n.value,onToggle:()=>(e=>{n.value=e===n.value?-1:e})(t)}):(0,s.h)(xe,{config:e})))))}}),Ee=(0,s._M)({name:"SideBar",slots:Object,setup(e,{slots:t}){const n=(0,l.MJ)(),a=(0,h.a)(),o=K(),r=(0,i.kl)();return(0,s.u2)((()=>{(0,s.Kg)((()=>n.hash),(e=>{const t=document.querySelector(`.vp-sidebar a.vp-sidebar-link[href="${n.path}${e}"]`);if(!t)return;const{top:a,height:l}=r.value.getBoundingClientRect(),{top:o,height:s}=t.getBoundingClientRect();oa+l&&t.scrollIntoView(!1)}),{immediate:!0})})),()=>(0,s.h)("aside",{ref:r,id:"sidebar",class:["vp-sidebar",{"hide-icon":!1===a.value.sidebarIcon}]},[t.top?.(),t.default?.()||(0,s.h)(Me,{config:o.value}),t.bottom?.()])}}),Ie=(0,s._M)({name:"CommonWrapper",props:{containerClass:{type:String,default:""},noNavbar:Boolean,noSidebar:Boolean,noToc:Boolean},slots:Object,setup(e,{slots:t}){const n=(0,l.KX)(),a=(0,u.us)(),d=(0,u.aQ)(),v=(0,h.a)(),{isMobile:f,isPC:m}=M(),[g,y]=(0,r.gZ)(!1),[b,w]=(0,r.gZ)(!1),S=K(),k=(0,i.IL)(!1),_=(0,s.S6)((()=>!e.noNavbar&&!1!==d.value.navbar&&!1!==v.value.navbar&&!!(a.value.title||v.value.logo||v.value.repo||v.value.navbar))),x=(0,s.S6)((()=>!e.noSidebar&&!1!==d.value.sidebar&&0!==S.value.length&&!d.value.home)),C=(0,s.S6)((()=>!e.noToc&&!d.value.home&&(d.value.toc||!1!==v.value.toc&&!1!==d.value.toc))),E={x:0,y:0},I=e=>{E.x=e.changedTouches[0].clientX,E.y=e.changedTouches[0].clientY},A=e=>{const t=e.changedTouches[0].clientX-E.x,n=e.changedTouches[0].clientY-E.y;Math.abs(t)>1.5*Math.abs(n)&&Math.abs(t)>40&&(t>0&&E.x<=80?y(!0):y(!1))};let L=0;return(0,o.KIJ)("scroll",(0,r.iG)((()=>{const e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;e<=58||e{e||y(!1)})),(0,s.u2)((()=>{const e=(0,o.cv6)(document.body);(0,s.Kg)(g,(t=>{e.value=t}));const t=n.afterEach((()=>{y(!1)}));(0,s.wx)((()=>{e.value=!1,t()}))})),()=>(0,s.h)((0,p.SU)("GlobalEncrypt")?(0,s.E1)("GlobalEncrypt"):p.kb,(()=>(0,s.h)("div",{class:["theme-container",{"no-navbar":!_.value,"no-sidebar":!x.value&&!(t.sidebar||t.sidebarTop||t.sidebarBottom),"has-toc":C.value,"hide-navbar":k.value,"sidebar-collapsed":!f.value&&!m.value&&b.value,"sidebar-open":f.value&&g.value},e.containerClass,d.value.containerClass||""],onTouchStart:I,onTouchEnd:A},[_.value?(0,s.h)(_e,{onToggleSidebar:()=>y()},{startBefore:()=>t.navbarStartBefore?.(),startAfter:()=>t.navbarStartAfter?.(),centerBefore:()=>t.navbarCenterBefore?.(),centerAfter:()=>t.navbarCenterAfter?.(),endBefore:()=>t.navbarEndBefore?.(),endAfter:()=>t.navbarEndAfter?.(),screenTop:()=>t.navScreenTop?.(),screenBottom:()=>t.navScreenBottom?.()}):null,(0,s.h)(c.Ox,{name:"fade"},(()=>g.value?(0,s.h)("div",{class:"vp-sidebar-mask",onClick:()=>y(!1)}):null)),(0,s.h)(c.Ox,{name:"fade"},(()=>f.value?null:(0,s.h)("div",{class:"toggle-sidebar-wrapper",onClick:()=>w()},(0,s.h)("span",{class:["arrow",b.value?"end":"start"]})))),(0,s.h)(Ee,{},{...t.sidebar?{default:()=>t.sidebar()}:{},top:()=>t.sidebarTop?.(),bottom:()=>t.sidebarBottom?.()}),t.default(),(0,s.h)(q)])))}}),Ae=(0,s._M)({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=t=>{t.style.transition=`transform ${e.duration}s ease-in-out ${e.delay}s, opacity ${e.duration}s ease-in-out ${e.delay}s`,t.style.transform="translateY(-20px)",t.style.opacity="0"},a=e=>{e.style.transform="translateY(0)",e.style.opacity="1"};return()=>(0,s.h)("single"===e.type?c.Ox:c.Q9,{name:"drop",appear:e.appear,onAppear:n,onAfterAppear:a,onEnter:n,onAfterEnter:a,onBeforeLeave:n},(()=>t.default()))}});const Le=({custom:e})=>(0,s.h)(u.kP,{class:["theme-hope-content",{custom:e}]});Le.displayName="MarkdownContent",Le.props={custom:Boolean};var Te=Le;const Oe=()=>(0,s.h)(p.aK,{name:"author"},(()=>(0,s.h)("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"})));Oe.displayName="AuthorIcon";const $e=()=>(0,s.h)(p.aK,{name:"calendar"},(()=>(0,s.h)("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"})));$e.displayName="CalendarIcon";const ze=()=>(0,s.h)(p.aK,{name:"category"},(()=>(0,s.h)("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"})));ze.displayName="CategoryIcon";const Ne=()=>(0,s.h)(p.aK,{name:"eye"},(()=>(0,s.h)("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"})));Ne.displayName="EyeIcon";const Re=()=>(0,s.h)(p.aK,{name:"fire"},(()=>(0,s.h)("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"})));Re.displayName="FireIcon";const Pe=()=>(0,s.h)(p.aK,{name:"print"},(()=>(0,s.h)("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"})));Pe.displayName="PrintIcon";const Be=()=>(0,s.h)(p.aK,{name:"tag"},(()=>(0,s.h)("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"})));Be.displayName="TagIcon";const Ue=()=>(0,s.h)(p.aK,{name:"timer"},(()=>(0,s.h)("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"})));Ue.displayName="TimerIcon";const je=()=>(0,s.h)(p.aK,{name:"word"},(()=>[(0,s.h)("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"}),(0,s.h)("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"})]));je.displayName="WordIcon";const De=()=>{const e=(0,h.a)();return(0,s.S6)((()=>e.value.metaLocales))};var Fe=(0,s._M)({name:"AuthorInfo",inheritAttrs:!1,props:{author:{type:Array,required:!0},pure:Boolean},setup(e){const t=De();return()=>e.author.length?(0,s.h)("span",{class:"page-author-info","aria-label":`${t.value.author}${e.pure?"":"🖊"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(Oe),(0,s.h)("span",e.author.map((e=>e.url?(0,s.h)("a",{class:"page-author-item",href:e.url,target:"_blank",rel:"noopener noreferrer"},e.name):(0,s.h)("span",{class:"page-author-item"},e.name)))),(0,s.h)("span",{property:"author",content:e.author.map((e=>e.name)).join(", ")})]):null}}),Ve=(0,s._M)({name:"CategoryInfo",inheritAttrs:!1,props:{category:{type:Array,required:!0},pure:Boolean},setup(e){const t=(0,l.KX)(),n=(0,u.us)(),a=De();return()=>e.category.length?(0,s.h)("span",{class:"page-category-info","aria-label":`${a.value.category}${e.pure?"":"🌈"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(ze),e.category.map((({name:a,path:l})=>(0,s.h)("span",{class:["page-category-item",{[`category${(0,p.iy)(a,9)}`]:!e.pure,clickable:l}],role:l?"navigation":"",onClick:e=>((e,a="")=>{a&&n.value.path!==a&&(e.preventDefault(),t.push(a))})(e,l)},a))),(0,s.h)("meta",{property:"articleSection",content:e.category.map((({name:e})=>e)).join(",")})]):null}}),He=(0,s._M)({name:"DateInfo",inheritAttrs:!1,props:{date:{type:Object,default:null},localizedDate:{type:String,default:""},pure:Boolean},setup(e){const t=(0,u.oF)(),n=De();return()=>e.date?(0,s.h)("span",{class:"page-date-info","aria-label":`${n.value.date}${e.pure?"":"📅"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)($e),(0,s.h)("span",(0,s.h)(u.iU,(()=>e.localizedDate||e.date.toLocaleDateString(t.value)))),(0,s.h)("meta",{property:"datePublished",content:e.date.toISOString()||""})]):null}}),Ke=(0,s._M)({name:"OriginalInfo",inheritAttrs:!1,props:{isOriginal:Boolean},setup(e){const t=De();return()=>e.isOriginal?(0,s.h)("span",{class:"page-original-info"},t.value.origin):null}}),qe=(0,s._M)({name:"PageViewInfo",inheritAttrs:!1,props:{pageview:{type:[Boolean,String],default:!1},pure:Boolean},setup(e){const t=(0,l.MJ)(),n=De(),r=(0,i.kl)(),c=(0,i.IL)(0);return(0,o.kng)(r,(()=>{const e=r.value.textContent;e&&!isNaN(Number(e))&&(c.value=Number(e))}),{childList:!0}),()=>e.pageview?(0,s.h)("span",{class:"page-pageview-info","aria-label":`${n.value.views}${e.pure?"":"🔢"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(c.value<1e3?Ne:Re),(0,s.h)("span",{ref:r,id:"ArtalkPV",class:"waline-pageview-count","data-path":(0,a.ct)(e.pageview)?e.pageview:t.path},"...")]):null}}),Ye=(0,s._M)({name:"ReadingTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=De(),n=(0,s.S6)((()=>{if(!e.readingTime)return null;const{minutes:t}=e.readingTime;return t<1?"PT1M":`PT${Math.round(t)}M`}));return()=>e.readingTimeLocale?.time?(0,s.h)("span",{class:"page-reading-time-info","aria-label":`${t.value.readingTime}${e.pure?"":"⌛"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(Ue),(0,s.h)("span",e.readingTimeLocale?.time),(0,s.h)("meta",{property:"timeRequired",content:n.value})]):null}}),We=(0,s._M)({name:"TagInfo",inheritAttrs:!1,props:{tag:{type:Array,default:()=>[]},pure:Boolean},setup(e){const t=(0,l.KX)(),n=(0,u.us)(),a=De();return()=>e.tag.length?(0,s.h)("span",{class:"page-tag-info","aria-label":`${a.value.tag}${e.pure?"":"🏷"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(Be),e.tag.map((({name:a,path:l})=>(0,s.h)("span",{class:["page-tag-item",{[`tag${(0,p.iy)(a,9)}`]:!e.pure,clickable:l}],role:l?"navigation":"",onClick:e=>((e,a="")=>{a&&n.value.path!==a&&(e.preventDefault(),t.push(a))})(e,l)},a))),(0,s.h)("meta",{property:"keywords",content:e.tag.map((({name:e})=>e)).join(",")})]):null}}),Ge=(0,s._M)({name:"ReadTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=De();return()=>e.readingTimeLocale?.words?(0,s.h)("span",{class:"page-word-info","aria-label":`${t.value.words}${e.pure?"":"🔠"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(je),(0,s.h)("span",e.readingTimeLocale?.words),(0,s.h)("meta",{property:"wordCount",content:e.readingTime?.words})]):null}}),Qe=(0,s._M)({name:"PageInfo",components:{AuthorInfo:Fe,CategoryInfo:Ve,DateInfo:He,OriginalInfo:Ke,PageViewInfo:qe,ReadingTimeInfo:Ye,TagInfo:We,WordInfo:Ge},props:{items:{type:[Array,Boolean],default:()=>["Author","Original","Date","PageView","ReadingTime","Category","Tag"]},info:{type:Object,required:!0}},setup(e){const t=(0,h.u)();return()=>e.items?(0,s.h)("div",{class:"page-info"},e.items.map((n=>(0,s.h)((0,s.E1)(`${n}Info`),{...e.info,pure:t.value})))):null}}),Xe=(0,s._M)({name:"PrintButton",setup(){const e=(0,h.b)(),t=(0,h.a)();return()=>!1===e.value.print?null:(0,s.h)("button",{type:"button",class:"print-button",title:t.value.metaLocales.print,onClick:()=>{window.print()}},(0,s.h)(Pe))}});const Ze=({title:e,level:t,slug:n})=>(0,s.h)(u.Qr,{to:`#${n}`,class:["toc-link",`level${t}`]},(()=>e)),Je=(e,t)=>{const n=(0,l.MJ)();return e.length&&t>0?(0,s.h)("ul",{class:"toc-list"},e.map((e=>{const a=Je(e.children,t-1);return[(0,s.h)("li",{class:["toc-item",{active:n.hash===`#${e.slug}`}]},Ze(e)),a?(0,s.h)("li",a):null]}))):null};var et=(0,s._M)({name:"TOC",props:{items:{type:Array,default:()=>[]},headerDepth:{type:Number,default:2}},slots:Object,setup(e,{slots:t}){const n=(0,l.MJ)(),a=(0,u.us)(),o=De(),r=(0,i.kl)(),c=(0,i.IL)("-1.7rem"),p=e=>{r.value?.scrollTo({top:e,behavior:"smooth"})},d=()=>{if(r.value){const e=document.querySelector(".toc-item.active");c.value=e?`${e.getBoundingClientRect().top-r.value.getBoundingClientRect().top+r.value.scrollTop}px`:"-1.7rem"}else c.value="-1.7rem"};return(0,s.u2)((()=>{(0,s.Kg)((()=>n.hash),(e=>{if(r.value){const t=document.querySelector(`#toc a.toc-link[href$="${e}"]`);if(!t)return;const{top:n,height:a}=r.value.getBoundingClientRect(),{top:l,height:o}=t.getBoundingClientRect();ln+a&&p(r.value.scrollTop+l+o-n-a)}})),(0,s.Kg)((()=>n.fullPath),d,{flush:"post",immediate:!0})})),()=>{const n=e.items.length?Je(e.items,e.headerDepth):a.value.headers?Je(a.value.headers,e.headerDepth):null;return n?(0,s.h)("div",{class:"toc-place-holder"},[(0,s.h)("aside",{id:"toc"},[t.before?.(),(0,s.h)("div",{class:"toc-header"},[o.value.toc,(0,s.h)(Xe)]),(0,s.h)("div",{class:"toc-wrapper",ref:r},[n,(0,s.h)("div",{class:"toc-marker",style:{top:c.value}})]),t.after?.()])]):null}}}),tt=(0,s._M)({name:"SkipLink",props:{content:{type:String,default:"main-content"}},setup(e){const t=(0,u.us)(),n=(0,h.a)(),a=(0,i.kl)(),l=({target:e})=>{const t=document.querySelector(e.hash);if(t){const e=()=>{t.removeAttribute("tabindex"),t.removeEventListener("blur",e)};t.setAttribute("tabindex","-1"),t.addEventListener("blur",e),t.focus(),window.scrollTo(0,0)}};return(0,s.u2)((()=>{(0,s.Kg)((()=>t.value.path),(()=>a.value.focus()))})),()=>[(0,s.h)("span",{ref:a,tabindex:"-1"}),(0,s.h)("a",{href:`#${e.content}`,class:"vp-skip-link sr-only",onClick:l},n.value.routeLocales.skipToContent)]}})},9108:(e,t,n)=>{n.d(t,{oB:()=>a.f,_W:()=>$,EX:()=>N,yW:()=>a.i,m:()=>a.s,KY:()=>a.j,Fb:()=>f});var a=n(7864),l=n(3968),o=n(6432),r=n(1108),s=n(9344),i=n(268),c=n(4976),u=n(1804),p=n(2920);let d=null,h=null;const v={wait:()=>d,pending:()=>{d=new Promise((e=>{h=e}))},resolve:()=>{h?.(),d=null,h=null}},f=()=>v;var m=(0,l._M)({name:"FadeSlideY",slots:Object,setup(e,{slots:t}){const{resolve:n,pending:a}=f();return()=>(0,l.h)(p.Ox,{name:"fade-slide-y",mode:"out-in",onBeforeEnter:n,onBeforeLeave:a},(()=>t.default?.()))}}),g=n(9160);n(6164),n(1340),n(6888),n(5160),n(344);const y=(e,{slots:t})=>{const{bgImage:n,bgImageDark:o,bgImageStyle:i,color:c,description:u,image:p,imageDark:d,header:h,features:v=[]}=e;return(0,l.h)("div",{class:"vp-feature-wrapper"},[n?(0,l.h)("div",{class:["vp-feature-bg",{light:o}],style:[{"background-image":`url(${n})`},i]}):null,o?(0,l.h)("div",{class:"vp-feature-bg dark",style:[{"background-image":`url(${o})`},i]}):null,(0,l.h)("div",{class:"vp-feature",style:c?{color:c}:{}},[t.image?.(e)||[p?(0,l.h)("img",{class:["vp-feature-image",{light:d}],src:(0,r.m_)(p),alt:""}):null,d?(0,l.h)("img",{class:"vp-feature-image dark",src:(0,r.m_)(d),alt:""}):null],t.info?.(e)||[h?(0,l.h)("h2",{class:"vp-feature-header"},h):null,u?(0,l.h)("p",{class:"vp-feature-description",innerHTML:u}):null],v.length?(0,l.h)("div",{class:"vp-features"},v.map((({icon:e,title:t,details:n,link:o})=>{const i=[(0,l.h)("h3",{class:"vp-feature-title"},[(0,l.h)(a.f,{icon:e}),(0,l.h)("span",{innerHTML:t})]),(0,l.h)("p",{class:"vp-feature-details",innerHTML:n})];return o?(0,s.oX)(o)?(0,l.h)("a",{class:"vp-feature-item link",href:o,"aria-label":t,target:"_blank"},i):(0,l.h)(r.Qr,{class:"vp-feature-item link",to:o,"aria-label":t},(()=>i)):(0,l.h)("div",{class:"vp-feature-item"},i)}))):null])])};y.displayName="FeaturePanel";var b=y,w=(0,l._M)({name:"HeroInfo",slots:Object,setup(e,{slots:t}){const n=(0,r.aQ)(),o=(0,r.wR)(),i=(0,l.S6)((()=>n.value.heroFullScreen??!1)),c=(0,l.S6)((()=>{const{heroText:e,tagline:t}=n.value;return{text:e??o.value.title??"Hello",tagline:t??o.value.description??"",isFullScreen:i.value}})),u=(0,l.S6)((()=>{const{heroText:e,heroImage:t,heroImageDark:a,heroAlt:l,heroImageStyle:o}=n.value;return{image:t?(0,r.m_)(t):null,imageDark:a?(0,r.m_)(a):null,heroStyle:o,alt:l||e||"",isFullScreen:i.value}})),p=(0,l.S6)((()=>{const{bgImage:e,bgImageDark:t,bgImageStyle:a}=n.value;return{image:(0,s.ct)(e)?(0,r.m_)(e):null,imageDark:(0,s.ct)(t)?(0,r.m_)(t):null,bgStyle:a,isFullScreen:i.value}})),d=(0,l.S6)((()=>n.value.actions??[]));return()=>(0,l.h)("header",{class:["vp-hero-info-wrapper",{fullscreen:i.value}]},[t.heroBg?.(p.value)||[p.value.image?(0,l.h)("div",{class:["vp-hero-mask",{light:p.value.imageDark}],style:[{"background-image":`url(${p.value.image})`},p.value.bgStyle]}):null,p.value.imageDark?(0,l.h)("div",{class:"vp-hero-mask dark",style:[{"background-image":`url(${p.value.imageDark})`},p.value.bgStyle]}):null],(0,l.h)("div",{class:"vp-hero-info"},[t.heroImage?.(u.value)||(0,l.h)(a.e,{appear:!0,type:"group"},(()=>[u.value.image?(0,l.h)("img",{key:"light",class:["vp-hero-image",{light:u.value.imageDark}],style:u.value.heroStyle,src:u.value.image,alt:u.value.alt}):null,u.value.imageDark?(0,l.h)("img",{key:"dark",class:"vp-hero-image dark",style:u.value.heroStyle,src:u.value.imageDark,alt:u.value.alt}):null])),t.heroInfo?.(c.value)??(0,l.h)("div",{class:"vp-hero-infos"},[c.value.text?(0,l.h)(a.e,{appear:!0,delay:.04},(()=>(0,l.h)("h1",{id:"main-title"},c.value.text))):null,c.value.tagline?(0,l.h)(a.e,{appear:!0,delay:.08},(()=>(0,l.h)("p",{id:"main-description",innerHTML:c.value.tagline}))):null,d.value.length?(0,l.h)(a.e,{appear:!0,delay:.12},(()=>(0,l.h)("p",{class:"vp-hero-actions"},d.value.map((e=>(0,l.h)(a.c,{class:["vp-hero-action",e.type||"default"],config:e,noExternalLinkIcon:!0},e.icon?{before:()=>(0,l.h)(a.f,{icon:e.icon})}:{})))))):null])])])}});const S=(e,{slots:t})=>{const{bgImage:n,bgImageDark:o,bgImageStyle:i,color:c,description:u,image:p,imageDark:d,header:h,highlights:v=[],type:f="un-order"}=e;return(0,l.h)("div",{class:"vp-highlight-wrapper",style:c?{color:c}:{}},[n?(0,l.h)("div",{class:["vp-highlight-bg",{light:o}],style:[{"background-image":`url(${n})`},i]}):null,o?(0,l.h)("div",{class:"vp-highlight-bg dark",style:[{"background-image":`url(${o})`},i]}):null,(0,l.h)("div",{class:"vp-highlight"},[t.image?.(e)||[p?(0,l.h)("img",{class:["vp-highlight-image",{light:d}],src:(0,r.m_)(p),alt:""}):null,d?(0,l.h)("img",{class:"vp-highlight-image dark",src:(0,r.m_)(d),alt:""}):null],t.info?.(e)||[(0,l.h)("div",{class:"vp-highlight-info-wrapper"},(0,l.h)("div",{class:"vp-highlight-info"},[h?(0,l.h)("h2",{class:"vp-highlight-header",innerHTML:h}):null,u?(0,l.h)("p",{class:"vp-highlight-description",innerHTML:u}):null,t.highlights?.(v)||(0,l.h)("order"===f?"ol":"no-order"===f?"dl":"ul",{class:"vp-highlights"},v.map((({icon:e,title:t,details:n,link:o})=>{const i=[(0,l.h)("no-order"===f?"dt":"h3",{class:"vp-highlight-title"},[e?(0,l.h)(a.f,{class:"vp-highlight-icon",icon:e}):null,(0,l.h)("span",{innerHTML:t})]),n?(0,l.h)("no-order"===f?"dd":"p",{class:"vp-highlight-details",innerHTML:n}):null];return(0,l.h)("no-order"===f?"div":"li",{class:["vp-highlight-item-wrapper",{link:o}]},o?(0,s.oX)(o)?(0,l.h)("a",{class:"vp-highlight-item link",href:o,"aria-label":t,target:"_blank"},i):(0,l.h)(r.Qr,{class:"vp-highlight-item link",to:o,"aria-label":t},(()=>i)):(0,l.h)("div",{class:"vp-highlight-item"},i))})))]))]])])};S.displayName="HighlightPanel";var k=S,_=(0,l._M)({name:"HomePage",slots:Object,setup(e,{slots:t}){const n=(0,i.u)(),o=(0,r.aQ)(),c=(0,l.S6)((()=>{const{features:e}=o.value;return(0,s.c7)(e)?e:null})),u=(0,l.S6)((()=>{const{highlights:e}=o.value;return(0,s.c7)(e)?e:null}));return()=>(0,l.h)("main",{id:"main-content",class:["vp-project-home ",{pure:n.value}],"aria-labelledby":null===o.value.heroText?"":"main-title"},[t.top?.(),(0,l.h)(w),u.value?.map((e=>"features"in e?(0,l.h)(b,e):(0,l.h)(k,e)))||(c.value?(0,l.h)(a.e,{appear:!0,delay:.24},(()=>(0,l.h)(b,{features:c.value}))):null),t.center?.(),(0,l.h)(a.e,{appear:!0,delay:.32},(()=>(0,l.h)(a.l))),t.bottom?.()])}}),x=(0,l._M)({name:"BreadCrumb",setup(){const e=(0,r.us)(),t=(0,r.mq)(),n=(0,r.aQ)(),c=(0,i.a)(),u=(0,o.kl)([]),p=(0,l.S6)((()=>(n.value.breadcrumb||!1!==n.value.breadcrumb&&!1!==c.value.breadcrumb)&&u.value.length>1)),d=(0,l.S6)((()=>n.value.breadcrumbIcon||!1!==n.value.breadcrumbIcon&&!1!==c.value.breadcrumbIcon)),h=()=>{const n=((e,t)=>{const n=e.replace(t,"/").split("/"),a=[];let l=(0,s.W0)(t);return n.forEach(((e,t)=>{t!==n.length-1?(l+=`${e}/`,a.push({link:l,name:e||"Home"})):""!==e&&(l+=e,a.push({link:l,name:e}))})),a})(e.value.path,t.value).map((({link:e,name:t})=>{const{path:n,meta:l}=(0,r.mA)(e);return l?{title:l[a.A.shortTitle]||l[a.A.title]||t,icon:l[a.A.icon],path:n}:null})).filter((e=>null!==e));n.length>1&&(u.value=n)};return(0,l.u2)((()=>{(0,l.Kg)((()=>e.value.path),h,{immediate:!0})})),()=>(0,l.h)("nav",{class:["vp-breadcrumb",{disable:!p.value}]},p.value?(0,l.h)("ol",{vocab:"https://schema.org/",typeof:"BreadcrumbList"},u.value.map(((e,t)=>(0,l.h)("li",{class:{"is-active":u.value.length-1===t},property:"itemListElement",typeof:"ListItem"},[(0,l.h)(r.Qr,{to:e.path,property:"item",typeof:"WebPage"},(()=>[d.value?(0,l.h)(a.f,{icon:e.icon}):null,(0,l.h)("span",{property:"name"},e.title||"Unknown")])),(0,l.h)("meta",{property:"position",content:t+1})])))):[])}});const C=e=>!1===e||(0,s.oF)(e)?e:(0,s.ct)(e)?(0,a.r)(e,!0):null,M=(e,t,n)=>{const a=e.findIndex((e=>e.link===t));if(-1!==a){const t=e[a+n];return t?.link?t:null}for(const a of e)if(a.children){const e=M(a.children,t,n);if(e)return e}return null};var E=(0,l._M)({name:"PageNav",setup(){const e=(0,i.a)(),t=(0,r.aQ)(),n=(0,a.u)(),o=(0,r.us)(),s=(0,a.a)(),c=(0,l.S6)((()=>{const a=C(t.value.prev);return!1===a?null:a||(!1===e.value.prevLink?null:M(n.value,o.value.path,-1))})),p=(0,l.S6)((()=>{const a=C(t.value.next);return!1===a?null:a||(!1===e.value.nextLink?null:M(n.value,o.value.path,1))}));return(0,u.KIJ)("keydown",(e=>{e.altKey&&("ArrowRight"===e.key?p.value&&(s(p.value.link),e.preventDefault()):"ArrowLeft"===e.key&&c.value&&(s(c.value.link),e.preventDefault()))})),()=>c.value||p.value?(0,l.h)("nav",{class:"vp-page-nav"},[c.value?(0,l.h)(a.c,{class:"prev",config:c.value},(()=>[(0,l.h)("div",{class:"hint"},[(0,l.h)("span",{class:"arrow start"}),e.value.metaLocales.prev]),(0,l.h)("div",{class:"link"},[(0,l.h)(a.f,{icon:c.value?.icon}),c.value?.text])])):null,p.value?(0,l.h)(a.c,{class:"next",config:p.value},(()=>[(0,l.h)("div",{class:"hint"},[e.value.metaLocales.next,(0,l.h)("span",{class:"arrow end"})]),(0,l.h)("div",{class:"link"},[p.value?.text,(0,l.h)(a.f,{icon:p.value?.icon})])])):null]):null}});const I={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"};var A=(0,l._M)({name:"PageTitle",setup(){const e=(0,r.us)(),t=(0,r.aQ)(),n=(0,i.a)(),{info:o,items:s}=(0,a.b)();return()=>(0,l.h)("div",{class:"vp-page-title"},[(0,l.h)("h1",[!1===n.value.titleIcon?null:(0,l.h)(a.f,{icon:t.value.icon}),e.value.title]),(0,l.h)(a.P,{info:o.value,...null===s.value?{}:{items:s.value}}),(0,l.h)("hr")])}});const L=()=>(0,l.h)(c.aK,{name:"edit"},(()=>[(0,l.h)("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"}),(0,l.h)("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"})]));L.displayName="EditIcon";var T=(0,l._M)({name:"PageMeta",setup(){const e=(0,i.a)(),t=(()=>{const e=(0,i.a)(),t=(0,r.us)(),n=(0,r.aQ)();return(0,l.S6)((()=>{const{repo:a,docsRepo:l=a,docsBranch:o="main",docsDir:r="",editLink:i,editLinkPattern:u=""}=e.value;if(!(n.value.editLink??i??1)||!l)return null;const p=(({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:a,editLinkPattern:l})=>{if(!a)return null;const o=(0,c.qu)(e);let r;return l?r=l:null!==o&&(r=I[o]),r?r.replace(/:repo/u,(0,s.mY)(e)?e:`https://github.com/${e}`).replace(/:branch/u,t).replace(/:path/u,(0,s.iW)(`${(0,s.W0)(n)}/${a}`)):null})({docsRepo:l,docsBranch:o,docsDir:r,editLinkPattern:u,filePathRelative:t.value.filePathRelative});return p?{text:e.value.metaLocales.editLink,link:p}:null}))})(),n=(()=>{const e=(0,r.wR)(),t=(0,i.a)(),n=(0,r.us)(),a=(0,r.aQ)();return(0,l.S6)((()=>(a.value.lastUpdated??t.value.lastUpdated??1)&&n.value.git?.updatedTime?new Date(n.value.git?.updatedTime).toLocaleString(e.value.lang):null))})(),o=(()=>{const e=(0,i.a)(),t=(0,r.us)(),n=(0,r.aQ)();return(0,l.S6)((()=>n.value.contributors??e.value.contributors??1?t.value.git?.contributors??null:null))})();return()=>{const{metaLocales:s}=e.value;return(0,l.h)("footer",{class:"page-meta"},[t.value?(0,l.h)("div",{class:"meta-item edit-link"},(0,l.h)(a.c,{class:"label",config:t.value},{before:()=>(0,l.h)(L)})):null,(0,l.h)("div",{class:"meta-item git-info"},[n.value?(0,l.h)("div",{class:"update-time"},[(0,l.h)("span",{class:"label"},`${s.lastUpdated}: `),(0,l.h)(r.iU,(()=>(0,l.h)("span",{class:"info"},n.value)))]):null,o.value&&o.value.length?(0,l.h)("div",{class:"contributors"},[(0,l.h)("span",{class:"label"},`${s.contributors}: `),o.value.map((({email:e,name:t},n)=>[(0,l.h)("span",{class:"contributor",title:`email: ${e}`},t),n!==o.value.length-1?",":""]))]):null])])}}}),O=(0,l._M)({name:"NormalPage",slots:Object,setup(e,{slots:t}){const n=(0,r.aQ)(),{isDarkmode:o}=(0,a.d)(),s=(0,i.a)(),u=(0,l.S6)((()=>n.value.toc||!1!==n.value.toc&&!1!==s.value.toc));return()=>(0,l.h)("main",{id:"main-content",class:"vp-page"},(0,l.h)((0,c.SU)("LocalEncrypt")?(0,l.E1)("LocalEncrypt"):c.kb,(()=>[t.top?.(),n.value.cover?(0,l.h)("div",{class:"page-cover"},(0,l.h)("img",{src:(0,r.m_)(n.value.cover),alt:"","no-view":""})):null,(0,l.h)(x),(0,l.h)(A),u.value?(0,l.h)(a.h,{headerDepth:n.value.headerDepth??s.value.headerDepth??2},{before:()=>t.tocBefore?.(),after:()=>t.tocAfter?.()}):null,t.contentBefore?.(),(0,l.h)(a.l),t.contentAfter?.(),(0,l.h)(T),(0,l.h)(E),(0,c.SU)("CommentService")?(0,l.h)((0,l.E1)("CommentService"),{darkmode:o.value}):null,t.bottom?.()])))}}),$=(0,l._M)({name:"Layout",slots:Object,setup(e,{slots:t}){const n=(0,i.b)(),o=(0,i.a)(),s=(0,r.us)(),c=(0,r.aQ)(),{isMobile:u}=(0,a.g)(),p=(0,l.S6)((()=>o.value.blog?.sidebarDisplay||n.value.blog?.sidebarDisplay||"mobile"));return()=>[(0,l.h)(a.m),(0,l.h)(a.p,{},{default:()=>t.default?.()||(c.value.home?(0,l.h)(_):(0,l.h)(m,(()=>(0,l.h)(O,{key:s.value.path},{top:()=>t.top?.(),bottom:()=>t.bottom?.(),contentBefore:()=>t.contentBefore?.(),contentAfter:()=>t.contentAfter?.(),tocBefore:()=>t.tocBefore?.(),tocAfter:()=>t.tocAfter?.()})))),..."none"===p.value?{}:{navScreenBottom:()=>(0,l.h)((0,l.E1)("BloggerInfo"))},...u.value||"always"!==p.value?{}:{sidebar:()=>(0,l.h)((0,l.E1)("BloggerInfo"))}})]}}),z=(0,l._M)({name:"NotFoundHint",setup(){const e=(0,i.a)(),t=()=>{const t=e.value.routeLocales.notFoundMsg;return t[Math.floor(Math.random()*t.length)]};return()=>(0,l.h)("div",{class:"not-found-hint"},[(0,l.h)("p",{class:"error-code"},"404"),(0,l.h)("h1",{class:"error-title"},e.value.routeLocales.notFoundTitle),(0,l.h)("p",{class:"error-hint"},t())])}}),N=(0,l._M)({name:"NotFound",slots:Object,setup(e,{slots:t}){const n=(0,r.mq)(),o=(0,i.a)(),{navigate:s}=(0,g.WG)({to:o.value.home??n.value});return()=>[(0,l.h)(a.m),(0,l.h)(a.p,{noSidebar:!0},(()=>(0,l.h)("main",{id:"main-content",class:"vp-page not-found"},t.default?.()||[(0,l.h)(z),(0,l.h)("div",{class:"actions"},[(0,l.h)("button",{type:"button",class:"action-button",onClick:()=>{window.history.go(-1)}},o.value.routeLocales.back),(0,l.h)("button",{type:"button",class:"action-button",onClick:()=>s()},o.value.routeLocales.home)])])))]}})},9176:(e,t,n)=>{n.d(t,{s$:()=>re,ox:()=>de,gT:()=>ve,ob:()=>R,wh:()=>ge,iG:()=>z});var a=n(9344),l=n(3968),o=n(6432),r=n(1108),s=n(4976),i=n(7192),c=n(268),u=n(3472),p=n(428);const d=(0,o.kl)(u.q),h=(0,o.sR)(d),v=e=>{const t=(0,r.us)(),n=(0,r.aQ)(),a=(0,r.mq)();return(0,l.S6)((()=>{const l=e??n.value.blog?.key??"";if(!l)return console.warn("useBlogCategory: key not found"),{path:"/",map:{}};if(!h.value[l])throw new Error(`useBlogCategory: key ${l} is invalid`);const o=h.value[l][a.value],s={path:o.path,map:{}};for(const e in o.map){const n=o.map[e];s.map[e]={path:n.path,items:[]};for(const t of n.indexes){const{path:n,meta:a}=(0,r.mA)(p.i[t]);s.map[e].items.push({path:n,info:a})}t.value.path===n.path&&(s.currentItems=s.map[e].items)}return s}))};var f=n(3016);const m=(0,o.kl)(f.o),g=(0,o.sR)(m),y=e=>{const t=(0,r.aQ)(),n=(0,r.mq)();return(0,l.S6)((()=>{const a=e??t.value.blog?.key??"";if(!a)return console.warn("useBlogType: key not found"),{path:"/",items:[]};if(!g.value[a])throw new Error(`useBlogType: key ${e} is invalid`);const l=g.value[a][n.value],o={path:l.path,items:[]};for(const e of l.indexes){const{path:t,meta:n}=(0,r.mA)(p.i[e]);o.items.push({path:t,info:n})}return o}))};var b=n(7864),w=n(9160);const S=()=>(0,l.h)(s.aK,{name:"lock"},(()=>(0,l.h)("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"})));S.displayName="LockIcon";var k=n(6164);n(344),n(1340),n(6888),n(5160);const _=Symbol.for("categoryMap"),x=()=>{const e=(0,l.uU)(_);if(!e)throw new Error("useCategoryMap() is called without provider.");return e},C=()=>{const e=(0,c.b)(),t=(0,c.a)();return(0,l.S6)((()=>({...e.value.blog,...t.value.blog})))},M=Symbol.for("tagMap"),E=()=>{const e=(0,l.uU)(M);if(!e)throw new Error("useTagMap() is called without provider.");return e},I=Symbol(""),A=()=>{const e=(0,l.uU)(I);if(!e)throw new Error("useArticles() is called without provider.");return e},L=Symbol(""),T=()=>{const e=(0,l.uU)(L);if(!e)throw new Error("useStars() is called without provider.");return e},O=Symbol(""),$=()=>{const e=(0,l.uU)(O);if(!e)throw new Error("useTimelines() is called without provider.");return e},z=()=>{(()=>{const e=y("article");(0,l.Zl)(I,e)})(),(()=>{const e=v("category");(0,l.Zl)(_,e)})(),(()=>{const e=y("star");(0,l.Zl)(L,e)})(),(()=>{const e=v("tag");(0,l.Zl)(M,e)})(),(()=>{const e=y("timeline"),t=(0,l.S6)((()=>{const t=[];return e.value.items.forEach((({info:e,path:n})=>{const l=(0,a._)(e[b.A.date]);if(l){const a=l.getFullYear(),o=l.getMonth()+1,r=l.getDate();(!t[0]||t[0].year!==a)&&t.unshift({year:a,items:[]}),t[0].items.push({date:`${o}/${r}`,info:e,path:n})}})),{...e.value,config:t.reverse()}}));(0,l.Zl)(O,t)})()};var N=(0,l._M)({name:"SocialMedia",setup(){const e=C(),t=(0,c.u)(),n=(0,l.S6)((()=>{const t=e.value.medias;return t?(0,a.ZE)(t).map((([e,t])=>({name:e,icon:i.P[e],url:t}))):[]}));return()=>n.value.length?(0,l.h)("div",{class:"vp-social-medias"},n.value.map((({name:e,icon:n,url:a})=>(0,l.h)("a",{class:"vp-social-media",href:a,rel:"noopener noreferrer",target:"_blank","aria-label":e,...t.value?{}:{"data-balloon-pos":"up"},innerHTML:n})))):null}}),R=(0,l._M)({name:"BloggerInfo",setup(){const e=C(),t=(0,r.wR)(),n=(0,c.a)(),o=A(),i=x(),u=E(),p=$(),d=(0,b.a)(),h=(0,l.S6)((()=>e.value.name||(0,s.Kq)(n.value.author)[0]?.name||t.value.title)),v=(0,l.S6)((()=>e.value.avatar||n.value.logo)),f=(0,l.S6)((()=>n.value.blogLocales)),m=(0,l.S6)((()=>e.value.intro));return()=>{const{article:t,category:n,tag:s,timeline:c}=f.value,g=[[o.value.path,o.value.items.length,t],[i.value.path,(0,a.C_)(i.value.map).length,n],[u.value.path,(0,a.C_)(u.value.map).length,s],[p.value.path,p.value.items.length,c]];return(0,l.h)("div",{class:"vp-blogger-info",vocab:"https://schema.org/",typeof:"Person"},[(0,l.h)("div",{class:"vp-blogger",...m.value?{style:{cursor:"pointer"},"aria-label":f.value.intro,"data-balloon-pos":"down",role:"link",onClick:()=>d(m.value)}:{}},[v.value?(0,l.h)("img",{class:["vp-blogger-avatar",{round:e.value.roundAvatar}],src:(0,r.m_)(v.value),property:"image",alt:"Blogger Avatar",loading:"lazy"}):null,h.value?(0,l.h)("div",{class:"vp-blogger-name",property:"name"},h.value):null,e.value.description?(0,l.h)("div",{class:"vp-blogger-description",innerHTML:e.value.description}):null,m.value?(0,l.h)("meta",{property:"url",content:(0,r.m_)(m.value)}):null]),(0,l.h)("div",{class:"vp-blog-counts"},g.map((([e,t,n])=>(0,l.h)(r.Qr,{class:"vp-blog-count",to:e},(()=>[(0,l.h)("div",{class:"count"},t),(0,l.h)("div",n)]))))),(0,l.h)(N)])}}});const P=()=>(0,l.h)(s.aK,{name:"category"},(()=>(0,l.h)("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"})));P.displayName="CategoryIcon";const B=()=>(0,l.h)(s.aK,{name:"tag"},(()=>(0,l.h)("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"})));B.displayName="TagIcon";const U=()=>(0,l.h)(s.aK,{name:"timeline"},(()=>(0,l.h)("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"})));U.displayName="TimelineIcon";const j=()=>(0,l.h)(s.aK,{name:"slides"},(()=>(0,l.h)("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"})));j.displayName="SlideIcon";const D=()=>(0,l.h)(s.aK,{name:"sticky"},(()=>[(0,l.h)("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"})]));D.displayName="StickyIcon";const F=()=>(0,l.h)(s.aK,{name:"article"},(()=>(0,l.h)("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"})));F.displayName="ArticleIcon";const V=()=>(0,l.h)(s.aK,{name:"book"},(()=>(0,l.h)("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"})));V.displayName="BookIcon";const H=()=>(0,l.h)(s.aK,{name:"link"},(()=>(0,l.h)("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"})));H.displayName="LinkIcon";const K=()=>(0,l.h)(s.aK,{name:"project"},(()=>(0,l.h)("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"})));K.displayName="ProjectIcon";const q=()=>(0,l.h)(s.aK,{name:"friend"},(()=>(0,l.h)("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"})));q.displayName="FriendIcon";const Y=()=>(0,l.h)(s.aK,{name:"slide-down"},(()=>(0,l.h)("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"})));Y.displayName="SlideDownIcon";const W=()=>(0,l.h)("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:''});W.displayName="EmptyIcon";var G=(0,l._M)({name:"ArticleItem",props:{info:{type:Object,required:!0},path:{type:String,required:!0}},slots:Object,setup(e,{slots:t}){const n=(0,o.C7)(e,"info"),{info:i,items:u}=(e=>{const t=(0,o.C7)(e,"info"),n=C(),r=(e=>{const t=(0,c.a)();return(0,l.S6)((()=>{const{[b.A.author]:n}=e.value;return n?(0,s.Kq)(n):!1===n?[]:(0,s.Kq)(t.value.author,!1)}))})(t),i=(e=>{const t=x();return(0,l.S6)((()=>(0,s.wl)(e.value[b.A.category]).map((e=>({name:e,path:t.value.map[e].path})))))})(t),u=(e=>{const t=E();return(0,l.S6)((()=>(0,s.yg)(e.value[b.A.tag]).map((e=>({name:e,path:t.value.map[e].path})))))})(t),p=(e=>(0,l.S6)((()=>{const{[b.A.date]:t}=e.value;return(0,a._)(t)})))(t),d=(0,k.ek)();return{info:(0,l.S6)((()=>({author:r.value,category:i.value,date:p.value,localizedDate:t.value[b.A.localizedDate]||"",tag:u.value,isOriginal:t.value[b.A.isOriginal]||!1,readingTime:t.value[b.A.readingTime]||null,readingTimeLocale:t.value[b.A.readingTime]&&d.value?(0,k.MJ)(t.value[b.A.readingTime],d.value):null,pageview:e.path}))),items:(0,l.S6)((()=>n.value.articleInfo))}})(e);return()=>{const{[b.A.title]:a,[b.A.type]:o,[b.A.isEncrypted]:s=!1,[b.A.cover]:c,[b.A.excerpt]:p,[b.A.sticky]:d}=n.value,h=i.value;return(0,l.h)("div",{class:"vp-article-wrapper"},(0,l.h)("article",{class:"vp-article-item",vocab:"https://schema.org/",typeof:"Article"},[t.cover?.({cover:c})||(c?[(0,l.h)("img",{class:"vp-article-cover",src:(0,r.m_)(c),loading:"lazy"}),(0,l.h)("meta",{property:"image",content:(0,r.m_)(c)})]:[]),d?(0,l.h)(D):null,(0,l.h)(r.Qr,{to:e.path},(()=>t.title?.({title:a,isEncrypted:s,type:o})||(0,l.h)("header",{class:"vp-article-title"},[s?(0,l.h)(S):null,o===b.k.slide?(0,l.h)(j):null,(0,l.h)("span",{property:"headline"},a)]))),t.excerpt?.({excerpt:p})||(p?(0,l.h)("div",{class:"vp-article-excerpt",innerHTML:p}):null),(0,l.h)("hr",{class:"vp-article-hr"}),t.info?.({info:h})||(0,l.h)(b.P,{info:h,...u.value?{items:u.value}:{}})]))}}}),Q=(0,l._M)({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 a=(0,c.a)(),r=(0,o.IL)(""),i=(0,l.S6)((()=>a.value.paginationLocales)),u=(0,l.S6)((()=>Math.ceil(e.total/e.perPage))),p=(0,l.S6)((()=>!!u.value&&1!==u.value)),d=(0,l.S6)((()=>!(u.value<7)&&e.current>4)),h=(0,l.S6)((()=>!(u.value<7)&&e.current{const{current:t}=e;let n=1,a=u.value;const l=[];u.value>=7&&(t<=4&&t4&&t>=u.value-3?(a=u.value,n=u.value-4):u.value>7&&(n=t-2,a=t+2));for(let e=n;e<=a;e++)l.push(e);return l})),f=e=>t("updateCurrentPage",e),m=e=>{const t=parseInt(e,10);t<=u.value&&t>0?f(t):n.pop(`${i.value.errorText.replace(/\$page/gu,u.value.toString())}`)};return(0,l.u2)((()=>{n=new s.SG})),()=>(0,l.h)("div",{class:"vp-pagination"},p.value?(0,l.h)("nav",{class:"vp-pagination-list"},[(0,l.h)("div",{class:"vp-pagination-number "},[e.current>1?(0,l.h)("div",{class:"prev",role:"navigation",unselectable:"on",onClick:()=>f(e.current-1)},i.value.prev):null,d.value?[(0,l.h)("div",{role:"navigation",onClick:()=>f(1)},1),(0,l.h)("div",{class:"ellipsis"},"...")]:null,v.value.map((t=>(0,l.h)("div",{key:t,class:{active:e.current===t},role:"navigation",onClick:()=>f(t)},t))),h.value?[(0,l.h)("div",{class:"ellipsis"},"..."),(0,l.h)("div",{role:"navigation",onClick:()=>f(u.value)},u.value)]:null,e.currentf(e.current+1)},i.value.next):null]),(0,l.h)("div",{class:"vp-pagination-nav"},[(0,l.h)("label",{for:"navigation-text"},`${i.value.navigate}: `),(0,l.h)("input",{id:"navigation-text",value:r.value,onInput:({target:e})=>{r.value=e.value},onKeydown:e=>{"Enter"===e.key&&(e.preventDefault(),m(r.value))}}),(0,l.h)("button",{class:"vp-pagination-button",role:"navigation",title:i.value.action,onClick:()=>m(r.value)},i.value.action)])]):[])}}),X=(0,l._M)({name:"ArticleList",props:{items:{type:Array,default:()=>[]}},setup(e){const t=(0,w.MJ)(),a=(0,w.KX)(),r=C(),s=(0,o.IL)(1),i=(0,l.S6)((()=>r.value.articlePerPage||10)),c=(0,l.S6)((()=>e.items.slice((s.value-1)*i.value,s.value*i.value))),u=async e=>{s.value=e;const o={...t.query};o.page!==e.toString()&&(1!==e||o.page)&&(1===e?delete o.page:o.page=e.toString(),await a.push({path:t.path,query:o}));{await(0,l.o$)();const{updatePageview:e}=await n.e(4251).then(n.bind(n,4251));await e()}};return(0,l.u2)((()=>{const{page:e}=t.query;u(e?Number(e):1),(0,l.Kg)(s,(()=>{const e=document.querySelector("#article-list").getBoundingClientRect().top+window.scrollY;setTimeout((()=>{window.scrollTo(0,e)}),100)}))})),()=>(0,l.h)("div",{id:"article-list",class:"vp-article-list",role:"feed"},c.value.length?[...c.value.map((({info:e,path:t},n)=>(0,l.h)(b.e,{appear:!0,delay:.04*n},(()=>(0,l.h)(G,{key:t,info:e,path:t}))))),(0,l.h)(Q,{current:s.value,perPage:i.value,total:e.items.length,onUpdateCurrentPage:u})]:(0,l.h)(W))}}),Z=(0,l._M)({name:"CategoryList",setup(){const e=(0,r.us)(),t=x();return()=>(0,l.h)("ul",{class:"vp-category-list"},(0,a.ZE)(t.value.map).sort((([,e],[,t])=>t.items.length-e.items.length)).map((([t,{path:n,items:a}])=>(0,l.h)("li",{class:["vp-category",`vp-category${(0,s.iy)(t,9)}`,{active:n===e.value.path}]},(0,l.h)(r.Qr,{to:n},(()=>[t,(0,l.h)("span",{class:"count"},a.length)]))))))}}),J=(0,l._M)({name:"TagList",setup(){const e=(0,r.aQ)(),t=E(),n=t=>t===e.value.blog?.name;return()=>(0,l.h)("ul",{class:"tag-list-wrapper"},(0,a.ZE)(t.value.map).sort((([,e],[,t])=>t.items.length-e.items.length)).map((([e,{path:t,items:a}])=>(0,l.h)("li",{class:["tag",`tag${(0,s.iy)(e,9)}`,{active:n(e)}]},(0,l.h)(r.Qr,{to:t},(()=>[e,(0,l.h)("span",{class:"tag-num"},a.length)]))))))}}),ee=(0,l._M)({name:"TimelineList",setup(){const e=(0,c.a)(),t=$(),n=(0,b.a)(),a=(0,l.S6)((()=>e.value.blogLocales.timeline));return()=>(0,l.h)("div",{class:"timeline-list-wrapper"},[(0,l.h)("div",{class:"timeline-list-title",onClick:()=>n(t.value.path)},[(0,l.h)(U),(0,l.h)("span",{class:"num"},t.value.items.length),a.value]),(0,l.h)("hr"),(0,l.h)("div",{class:"timeline-content"},(0,l.h)("ul",{class:"timeline-list"},t.value.config.map((({year:e,items:t},n)=>(0,l.h)(b.e,{appear:!0,delay:.08*(n+1)},(()=>(0,l.h)("li",[(0,l.h)("h3",{class:"timeline-year"},e),(0,l.h)("ul",{class:"timeline-year-wrapper"},t.map((({date:e,info:t,path:n})=>(0,l.h)("li",{class:"timeline-item"},[(0,l.h)("span",{class:"timeline-date"},e),(0,l.h)(r.Qr,{class:"timeline-title",to:n},(()=>t[b.A.title]))]))))])))))))])}});const te={article:F,category:P,tag:B,timeline:U};var ne=(0,l._M)({name:"InfoList",setup(){const e=(0,c.a)(),t=A(),n=x(),s=(0,l.S6)((()=>(0,a.C_)(n.value.map).length)),i=T(),u=E(),p=(0,l.S6)((()=>(0,a.C_)(u.value.map).length)),d=(0,b.a)(),h=(0,o.IL)("article"),v=(0,l.S6)((()=>e.value.blogLocales));return()=>(0,l.h)("div",{class:"vp-blog-infos"},[(0,l.h)("div",{class:"vp-blog-type-switcher"},(0,a.ZE)(te).map((([e,t])=>(0,l.h)("button",{type:"button",class:"vp-blog-type-button",onClick:()=>{h.value=e}},(0,l.h)("div",{class:["icon-wrapper",{active:h.value===e}],"aria-label":v.value[e],"data-balloon-pos":"up"},(0,l.h)(t)))))),(0,l.h)(b.e,(()=>"article"===h.value?(0,l.h)("div",{class:"vp-star-article-wrapper"},[(0,l.h)("div",{class:"title",onClick:()=>d(t.value.path)},[(0,l.h)(F),(0,l.h)("span",{class:"num"},t.value.items.length),v.value.article]),(0,l.h)("hr"),i.value.items.length?(0,l.h)("ul",{class:"vp-star-articles"},i.value.items.map((({info:e,path:t},n)=>(0,l.h)(b.e,{appear:!0,delay:.08*(n+1)},(()=>(0,l.h)("li",{class:"vp-star-article"},(0,l.h)(r.Qr,{to:t},(()=>e[b.A.title])))))))):(0,l.h)("div",{class:"vp-star-article-empty"},v.value.empty.replace("$text",v.value.star))]):"category"===h.value?(0,l.h)("div",{class:"vp-category-wrapper"},[s.value?[(0,l.h)("div",{class:"title",onClick:()=>d(n.value.path)},[(0,l.h)(P),(0,l.h)("span",{class:"num"},s.value),v.value.category]),(0,l.h)("hr"),(0,l.h)(b.e,{delay:.04},(()=>(0,l.h)(Z)))]:(0,l.h)("div",{class:"vp-category-empty"},v.value.empty.replace("$text",v.value.category))]):"tag"===h.value?(0,l.h)("div",{class:"vp-tag-wrapper"},[p.value?[(0,l.h)("div",{class:"title",onClick:()=>d(u.value.path)},[(0,l.h)(B),(0,l.h)("span",{class:"num"},p.value),v.value.tag]),(0,l.h)("hr"),(0,l.h)(b.e,{delay:.04},(()=>(0,l.h)(J)))]:(0,l.h)("div",{class:"vp-tag-empty"},v.value.empty.replace("$text",v.value.tag))]):(0,l.h)(b.e,(()=>(0,l.h)(ee)))))])}}),ae=(0,l._M)({name:"BlogWrapper",slots:Object,setup(e,{slots:t}){const{isMobile:n}=(0,b.g)();return()=>[(0,l.h)(b.m),(0,l.h)(b.p,{noSidebar:!0,noToc:!0},{default:()=>t.default(),navScreenBottom:()=>(0,l.h)(R),...n.value?{sidebar:()=>(0,l.h)(ne)}:{}})]}});const le=()=>(0,l.h)("aside",{class:"vp-blog-info-wrapper"},[(0,l.h)(b.e,(()=>(0,l.h)(R))),(0,l.h)(b.e,{delay:.04},(()=>(0,l.h)(ne)))]);le.displayName="InfoPanel";var oe=le,re=(0,l._M)({name:"BlogPage",setup(){const e=(0,r.us)(),t=(0,r.aQ)(),n=x(),a=E();return()=>{const{key:o="",name:r=""}=t.value.blog||{},s=r?"category"===o?n.value.map[r].items:"tag"===o?a.value.map[r].items:[]:[];return(0,l.h)(ae,(()=>(0,l.h)("div",{class:"vp-page vp-blog"},(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[(0,l.h)(b.e,(()=>"category"===o?(0,l.h)(Z):"tag"===o?(0,l.h)(J):null)),r?(0,l.h)(b.e,{appear:!0,delay:.24},(()=>(0,l.h)(X,{key:e.value.path,items:s}))):null]),(0,l.h)(b.e,{delay:.16},(()=>(0,l.h)(oe,{key:"blog"})))]))))}}}),se=(0,l._M)({name:"BlogHero",slots:Object,setup(e,{slots:t}){const n=(0,r.aQ)(),s=(0,r.wR)(),i=(0,o.kl)(),c=(0,l.S6)((()=>n.value.heroFullScreen??!1)),u=(0,l.S6)((()=>{const{heroText:e,heroImage:t,heroImageDark:a,heroAlt:l,heroImageStyle:o,tagline:i}=n.value;return{text:e??s.value.title??"Hello",image:t?(0,r.m_)(t):null,imageDark:a?(0,r.m_)(a):null,heroStyle:o,alt:l||e||"",tagline:i??"",isFullScreen:c.value}})),p=(0,l.S6)((()=>{const{bgImage:e,bgImageDark:t,bgImageStyle:l}=n.value;return{image:(0,a.ct)(e)?(0,r.m_)(e):!1===e?null:"//theme-hope-assets.vuejs.press/hero/default.jpg",imageDark:(0,a.ct)(t)?(0,r.m_)(t):null,bgStyle:l,isFullScreen:c.value}}));return()=>!1===n.value.hero?null:(0,l.h)("div",{ref:i,class:["vp-blog-hero",{fullscreen:c.value,"no-bg":!p.value.image}]},[t.heroBg?.(p.value)||[p.value.image?(0,l.h)("div",{class:["vp-blog-mask",{light:p.value.imageDark}],style:[{background:`url(${p.value.image}) center/cover no-repeat`},p.value.bgStyle]}):null,p.value.imageDark?(0,l.h)("div",{class:"vp-blog-mask dark",style:[{background:`url(${p.value.imageDark}) center/cover no-repeat`},p.value.bgStyle]}):null],t.heroInfo?.(u.value)||[(0,l.h)(b.e,{appear:!0,type:"group",delay:.04},(()=>[u.value.image?(0,l.h)("img",{key:"light",class:["vp-blog-hero-image",{light:u.value.imageDark}],style:u.value.heroStyle,src:u.value.image,alt:u.value.alt}):null,u.value.imageDark?(0,l.h)("img",{key:"dark",class:"vp-blog-hero-image dark",style:u.value.heroStyle,src:u.value.imageDark,alt:u.value.alt}):null])),(0,l.h)(b.e,{appear:!0,delay:.08},(()=>u.value.text?(0,l.h)("h1",{class:"vp-blog-hero-title"},u.value.text):null)),(0,l.h)(b.e,{appear:!0,delay:.12},(()=>u.value.tagline?(0,l.h)("p",{class:"vp-blog-hero-description",innerHTML:u.value.tagline}):null))],u.value.isFullScreen?(0,l.h)("button",{type:"button",class:"slide-down-button",onClick:()=>{window.scrollTo({top:i.value.clientHeight,behavior:"smooth"})}},[(0,l.h)(Y),(0,l.h)(Y)]):null])}});const ie=["link","article","book","project","friend"];var ce=(0,l._M)({name:"ProjectPanel",components:{ArticleIcon:F,BookIcon:V,FriendIcon:q,LinkIcon:H,ProjectIcon:K},props:{items:{type:Array,required:!0}},setup(e){const t=(0,c.u)(),n=(0,b.a)(),o=(e="",t="icon")=>ie.includes(e)?(0,l.h)((0,l.E1)(`${e}-icon`)):(0,a.mY)(e)?(0,l.h)("img",{class:"vp-project-image",src:e,alt:t}):(0,a.qM)(e)?(0,l.h)("img",{class:"vp-project-image",src:(0,r.m_)(e),alt:t}):(0,l.h)(b.f,{icon:e});return()=>(0,l.h)("div",{class:"vp-project-panel"},e.items.map((({icon:e,link:a,name:r,desc:s},i)=>(0,l.h)("div",{class:["vp-project-card",{["project"+i%9]:!t.value}],onClick:()=>n(a)},[o(e,r),(0,l.h)("div",{class:"vp-project-name"},r),(0,l.h)("div",{class:"vp-project-desc"},s)]))))}}),ue=(0,l._M)({name:"BlogHome",setup(){const e=A(),t=(0,r.aQ)(),n=(0,l.S6)((()=>t.value.projects??[]));return()=>(0,l.h)("div",{class:"vp-page vp-blog"},[(0,l.h)(se),(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[n.value.length?(0,l.h)(b.e,{appear:!0,delay:.16},(()=>(0,l.h)(ce,{items:n.value}))):null,(0,l.h)(b.e,{appear:!0,delay:.24},(()=>(0,l.h)(X,{items:e.value.items})))]),(0,l.h)(b.e,{appear:!0,delay:.16},(()=>(0,l.h)(oe,{key:"blog"})))]),(0,l.h)(b.e,{appear:!0,delay:.28},(()=>(0,l.h)(b.l)))])}});const pe=()=>(0,l.h)(ae,(()=>(0,l.h)(ue)));pe.displayName="BlogHomeLayout";var de=pe,he=(0,l._M)({name:"ArticleType",setup(){const e=(0,r.us)(),t=(0,r.mq)(),n=(0,c.a)(),a=A(),o=T(),s=(0,l.S6)((()=>{const e=n.value.blogLocales;return[{text:e.all,path:a.value.path},{text:e.star,path:o.value.path},...[].map((({key:n,path:a})=>({text:e[n],path:a.replace(/^\//,t.value)})))]}));return()=>(0,l.h)("ul",{class:"vp-article-type-wrapper"},s.value.map((t=>(0,l.h)("li",{class:["vp-article-type",{active:t.path===e.value.path}]},(0,l.h)(r.Qr,{to:t.path},(()=>t.text))))))}}),ve=(0,l._M)({name:"BlogPage",setup(){const e=y(),t=(0,r.aQ)(),n=(0,r.us)(),a=A(),o=T(),s=(0,l.S6)((()=>{const{key:n="",type:l}=t.value.blog||{};return"star"===n?o.value.items:"type"===l&&n?e.value.items:a.value.items}));return()=>(0,l.h)(ae,(()=>(0,l.h)("div",{class:"vp-page vp-blog"},(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[(0,l.h)(b.e,(()=>(0,l.h)(he))),(0,l.h)(b.e,{appear:!0,delay:.24},(()=>(0,l.h)(X,{key:n.value.path,items:s.value})))]),(0,l.h)(b.e,{delay:.16},(()=>(0,l.h)(oe,{key:"blog"})))]))))}}),fe=(0,l._M)({name:"TimelineItems",setup(){const e=C(),t=(0,c.a)(),n=$(),a=(0,l.S6)((()=>e.value.timeline||t.value.blogLocales.timelineTitle)),o=(0,l.S6)((()=>n.value.config.map((({year:e})=>({title:e.toString(),level:2,slug:e.toString(),children:[]})))));return()=>(0,l.h)("div",{class:"timeline-wrapper"},(0,l.h)("ul",{class:"timeline-content"},[(0,l.h)(b.e,(()=>(0,l.h)("li",{class:"motto"},a.value))),(0,l.h)(b.h,{items:o.value}),n.value.config.map((({year:e,items:t},n)=>(0,l.h)(b.e,{appear:!0,delay:.08*(n+1),type:"group"},(()=>[(0,l.h)("h3",{key:"title",id:e,class:"timeline-year-title"},(0,l.h)("span",e)),(0,l.h)("li",{key:"content",class:"timeline-year-list"},[(0,l.h)("ul",{class:"timeline-year-wrapper"},t.map((({date:e,info:t,path:n})=>(0,l.h)("li",{class:"timeline-item"},[(0,l.h)("span",{class:"timeline-date"},e),(0,l.h)(r.Qr,{class:"timeline-title",to:n},(()=>t[b.A.title]))]))))])]))))]))}});const me=()=>(0,l.h)(ae,(()=>(0,l.h)("div",{class:"vp-page vp-blog"},(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[(0,l.h)(b.e,{appear:!0,delay:.24},(()=>(0,l.h)(fe)))]),(0,l.h)(b.e,{delay:.16},(()=>(0,l.h)(oe,{key:"blog"})))]))));me.displayName="Timeline";var ge=me},268:(e,t,n)=>{n.d(t,{a:()=>r,b:()=>o,u:()=>s});var a=n(344),l=n(3968);const o=()=>(0,a._k)(),r=()=>(0,a.QR)(),s=()=>{const e=o();return(0,l.S6)((()=>!!e.value.pure))}},1108:(e,t,n)=>{n.d(t,{iU:()=>a.iU,kP:()=>a.kP,Qr:()=>a.Qr,Qt:()=>a.Qt,mA:()=>a.mA,o5:()=>a.o5,us:()=>a.us,aQ:()=>a.aQ,oF:()=>a.oF,mq:()=>a.mq,wh:()=>a.wh,jW:()=>a.jW,wR:()=>a.wR,m_:()=>a.m_});var a=n(6411)}}]); \ No newline at end of file diff --git a/assets/js/9356.c73f84d0.js b/assets/js/3497.8db8a15e.js similarity index 93% rename from assets/js/9356.c73f84d0.js rename to assets/js/3497.8db8a15e.js index 7b40bb32f..a12d7e358 100644 --- a/assets/js/9356.c73f84d0.js +++ b/assets/js/3497.8db8a15e.js @@ -1,5 +1,5 @@ -/*! For license information please see 9356.c73f84d0.js.LICENSE.txt */ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9356],{6035:(t,s,e)=>{var i;e.d(s,{D:()=>D,c:()=>Y,e:()=>W,l:()=>J,o:()=>st,t:()=>R,x:()=>x});const o=window,n=o.trustedTypes,a=n?n.createPolicy("lit-html",{createHTML:t=>t}):void 0,l="$lit$",d=`lit$${(Math.random()+"").slice(9)}$`,r="?"+d,c=`<${r}>`,u=document,p=()=>u.createComment(""),m=t=>null===t||"object"!=typeof t&&"function"!=typeof t,v=Array.isArray,h="[ \t\n\f\r]",$=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,g=/-->/g,f=/>/g,b=RegExp(`>|${h}(?:([^\\s"'>=/]+)(${h}*=${h}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),A=/'/g,_=/"/g,y=/^(?:script|style|textarea|title)$/i,x=(t,...s)=>({_$litType$:1,strings:t,values:s}),C=Symbol.for("lit-noChange"),w=Symbol.for("lit-nothing"),k=new WeakMap,T=u.createTreeWalker(u,129,null,!1);function E(t,s){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==a?a.createHTML(s):s}const N=(t,s)=>{const e=t.length-1,i=[];let o,n=2===s?"":"",a=$;for(let s=0;s"===u[0]?(a=null!=o?o:$,p=-1):void 0===u[1]?p=-2:(p=a.lastIndex-u[2].length,r=u[1],a=void 0===u[3]?b:'"'===u[3]?_:A):a===_||a===A?a=b:a===g||a===f?a=$:(a=b,o=void 0);const v=a===b&&t[s+1].startsWith("/>")?" ":"";n+=a===$?e+c:p>=0?(i.push(r),e.slice(0,p)+l+e.slice(p)+d+v):e+d+(-2===p?(i.push(void 0),s):v)}return[E(t,n+(t[e]||"")+(2===s?"":"")),i]};class H{constructor({strings:t,_$litType$:s},e){let i;this.parts=[];let o=0,a=0;const c=t.length-1,u=this.parts,[m,v]=N(t,s);if(this.el=H.createElement(m,e),T.currentNode=this.el.content,2===s){const t=this.el.content,s=t.firstChild;s.remove(),t.append(...s.childNodes)}for(;null!==(i=T.nextNode())&&u.length0){i.textContent=n?n.emptyScript:"";for(let e=0;ev(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]))(t)?this.T(t):this._(t)}k(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}$(t){this._$AH!==t&&(this._$AR(),this._$AH=this.k(t))}_(t){this._$AH!==w&&m(this._$AH)?this._$AA.nextSibling.data=t:this.$(u.createTextNode(t)),this._$AH=t}g(t){var s;const{values:e,_$litType$:i}=t,o="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=H.createElement(E(i.h,i.h[0]),this.options)),i);if((null===(s=this._$AH)||void 0===s?void 0:s._$AD)===o)this._$AH.v(e);else{const t=new M(o,this),s=t.u(this.options);t.v(e),this.$(s),this._$AH=t}}_$AC(t){let s=k.get(t.strings);return void 0===s&&k.set(t.strings,s=new H(t)),s}T(t){v(this._$AH)||(this._$AH=[],this._$AR());const s=this._$AH;let e,i=0;for(const o of t)i===s.length?s.push(e=new L(this.k(p()),this.k(p()),this,this.options)):e=s[i],e._$AI(o),i++;i2||""!==e[0]||""!==e[1]?(this._$AH=Array(e.length-1).fill(new String),this.strings=e):this._$AH=w}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,s=this,e,i){const o=this.strings;let n=!1;if(void 0===o)t=S(this,t,s,0),n=!m(t)||t!==this._$AH&&t!==C,n&&(this._$AH=t);else{const i=t;let a,l;for(t=o[0],a=0;a{var i,o;const n=null!==(i=null==e?void 0:e.renderBefore)&&void 0!==i?i:s;let a=n._$litPart$;if(void 0===a){const t=null!==(o=null==e?void 0:e.renderBefore)&&void 0!==o?o:null;n._$litPart$=a=new L(s.insertBefore(p(),t),t,void 0,null!=e?e:{})}return a._$AI(t),a},R={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},W=t=>(...s)=>({_$litDirective$:t,values:s});class q{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,s,e){this._$Ct=t,this._$AM=s,this._$Ci=e}_$AS(t,s){return this.update(t,s)}update(t,s){return this.render(...s)}}const Q=(t,s)=>{var e,i;const o=t._$AN;if(void 0===o)return!1;for(const t of o)null===(i=(e=t)._$AO)||void 0===i||i.call(e,s,!1),Q(t,s);return!0},z=t=>{let s,e;do{if(void 0===(s=t._$AM))break;e=s._$AN,e.delete(t),t=s}while(0===(null==e?void 0:e.size))},G=t=>{for(let s;s=t._$AM;t=s){let e=s._$AN;if(void 0===e)s._$AN=e=new Set;else if(e.has(t))break;e.add(t),K(s)}};function Z(t){void 0!==this._$AN?(z(this),this._$AM=t,G(this)):this._$AM=t}function F(t,s=!1,e=0){const i=this._$AH,o=this._$AN;if(void 0!==o&&0!==o.size)if(s)if(Array.isArray(i))for(let t=e;t{var s,e,i,o;t.type==R.CHILD&&(null!==(s=(i=t)._$AP)&&void 0!==s||(i._$AP=F),null!==(e=(o=t)._$AQ)&&void 0!==e||(o._$AQ=Z))};class Y extends q{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,s,e){super._$AT(t,s,e),G(this),this.isConnected=t._$AU}_$AO(t,s=!0){var e,i;t!==this.isConnected&&(this.isConnected=t,t?null===(e=this.reconnected)||void 0===e||e.call(this):null===(i=this.disconnected)||void 0===i||i.call(this)),s&&(Q(this,t),z(this))}setValue(t){if((t=>void 0===this._$Ct.strings)())this._$Ct._$AI(t,this);else{const s=[...this._$Ct._$AH];s[this._$Ci]=t,this._$Ct._$AI(s,this,0)}}disconnected(){}reconnected(){}}const J=t=>null!=t?t:w;class X extends q{constructor(t){if(super(t),this.et=w,t.type!==R.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===w||null==t)return this.ft=void 0,this.et=t;if(t===C)return t;if("string"!=typeof t)throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.et)return this.ft;this.et=t;const s=[t];return s.raw=s,this.ft={_$litType$:this.constructor.resultType,strings:s,values:[]}}}X.directiveName="unsafeHTML",X.resultType=1;class tt extends X{}tt.directiveName="unsafeSVG",tt.resultType=2;const st=W(tt)},7552:(t,s,e)=>{e.d(s,{L:()=>o});var i=e(6035);class o extends HTMLElement{constructor(){super(...arguments),this.rootPart=null}connectedCallback(){this.rootPart=(0,i.D)(this.render(),this,{renderBefore:this.firstChild}),this.rootPart.setConnected(!0)}disconnectedCallback(){this.rootPart?.setConnected(!1),this.rootPart=null}}},9356:(t,s,e)=>{e.r(s);var i=e(348),o=e(6035),n=e(8),a=e(7224),l=e(352);class d extends o.c{constructor(t){super(t),this.h=null,this.ra=null,this.w=!1,this.w=t.type===o.t.ATTRIBUTE}render(t){this.h!==t&&(this.h=t,this.disconnected(),this.isConnected&&this.Si());const s=this.h();return this.w?(0,o.l)(s):s}reconnected(){this.Si()}disconnected(){this.w||this.setValue(null),this.ra?.(),this.ra=null}Si(){this.h&&(this.ra=(0,i.e)(this.o.bind(this)))}o(){this.setValue(this.h?.())}}const r=(0,o.e)(d);function c(t){return r((0,i.n)(t))}class u{constructor(t,s){this.Wj=t,this.Ca=s,this.elements=new Set,this.vf=(0,i.V)(this.ea.bind(this))}connect(){this.ea();const t=new MutationObserver(this.vf);t.observe(this.Wj,{childList:!0}),(0,i.o)((()=>t.disconnect())),(0,i.o)(this.disconnect.bind(this))}disconnect(){this.elements.clear()}assign(t,s){t instanceof Node?(s.textContent="",s.append(t)):(0,o.D)(t,s),s.style.display||(s.style.display="contents");const e=s.firstElementChild;if(!e)return;const i=s.getAttribute("data-class");i&&e.classList.add(...i.split(" "))}ea(){for(const t of this.Wj.querySelectorAll("slot"))t.hasAttribute("name")&&this.elements.add(t);this.Ca(this.elements)}}let p=0,m="data-slot-id";class v{constructor(t){this.Wj=t,this.vf=(0,i.V)(this.ea.bind(this)),this.slots=new u(t,this.ea.bind(this))}connect(){this.slots.connect(),this.ea();const t=new MutationObserver(this.vf);t.observe(this.Wj,{childList:!0}),(0,i.o)((()=>t.disconnect()))}ea(){for(const t of this.Wj.children){if(1!==t.nodeType)continue;const s=t.getAttribute("slot");if(!s)continue;t.style.display="none";let e=t.getAttribute(m);e||t.setAttribute(m,e=++p+"");for(const i of this.slots.elements){if(i.getAttribute("name")!==s||i.getAttribute(m)===e)continue;const o=document.importNode(t,!0);s.includes("-icon")&&o.classList.add("vds-icon"),o.style.display="",o.removeAttribute("slot"),this.slots.assign(o,i),i.setAttribute(m,e)}}}}function h({label:t,icon:s}){return o.x` +/*! For license information please see 3497.8db8a15e.js.LICENSE.txt */ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3497],{5687:(t,s,e)=>{var i;e.d(s,{D:()=>D,c:()=>Y,e:()=>W,l:()=>J,o:()=>st,t:()=>R,x:()=>x});const o=window,n=o.trustedTypes,a=n?n.createPolicy("lit-html",{createHTML:t=>t}):void 0,l="$lit$",d=`lit$${(Math.random()+"").slice(9)}$`,r="?"+d,c=`<${r}>`,u=document,p=()=>u.createComment(""),m=t=>null===t||"object"!=typeof t&&"function"!=typeof t,v=Array.isArray,h="[ \t\n\f\r]",$=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,g=/-->/g,f=/>/g,b=RegExp(`>|${h}(?:([^\\s"'>=/]+)(${h}*=${h}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),A=/'/g,_=/"/g,y=/^(?:script|style|textarea|title)$/i,x=(t,...s)=>({_$litType$:1,strings:t,values:s}),C=Symbol.for("lit-noChange"),w=Symbol.for("lit-nothing"),k=new WeakMap,T=u.createTreeWalker(u,129,null,!1);function E(t,s){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==a?a.createHTML(s):s}const N=(t,s)=>{const e=t.length-1,i=[];let o,n=2===s?"":"",a=$;for(let s=0;s"===u[0]?(a=null!=o?o:$,p=-1):void 0===u[1]?p=-2:(p=a.lastIndex-u[2].length,r=u[1],a=void 0===u[3]?b:'"'===u[3]?_:A):a===_||a===A?a=b:a===g||a===f?a=$:(a=b,o=void 0);const v=a===b&&t[s+1].startsWith("/>")?" ":"";n+=a===$?e+c:p>=0?(i.push(r),e.slice(0,p)+l+e.slice(p)+d+v):e+d+(-2===p?(i.push(void 0),s):v)}return[E(t,n+(t[e]||"")+(2===s?"":"")),i]};class H{constructor({strings:t,_$litType$:s},e){let i;this.parts=[];let o=0,a=0;const c=t.length-1,u=this.parts,[m,v]=N(t,s);if(this.el=H.createElement(m,e),T.currentNode=this.el.content,2===s){const t=this.el.content,s=t.firstChild;s.remove(),t.append(...s.childNodes)}for(;null!==(i=T.nextNode())&&u.length0){i.textContent=n?n.emptyScript:"";for(let e=0;ev(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]))(t)?this.T(t):this._(t)}k(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}$(t){this._$AH!==t&&(this._$AR(),this._$AH=this.k(t))}_(t){this._$AH!==w&&m(this._$AH)?this._$AA.nextSibling.data=t:this.$(u.createTextNode(t)),this._$AH=t}g(t){var s;const{values:e,_$litType$:i}=t,o="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=H.createElement(E(i.h,i.h[0]),this.options)),i);if((null===(s=this._$AH)||void 0===s?void 0:s._$AD)===o)this._$AH.v(e);else{const t=new M(o,this),s=t.u(this.options);t.v(e),this.$(s),this._$AH=t}}_$AC(t){let s=k.get(t.strings);return void 0===s&&k.set(t.strings,s=new H(t)),s}T(t){v(this._$AH)||(this._$AH=[],this._$AR());const s=this._$AH;let e,i=0;for(const o of t)i===s.length?s.push(e=new L(this.k(p()),this.k(p()),this,this.options)):e=s[i],e._$AI(o),i++;i2||""!==e[0]||""!==e[1]?(this._$AH=Array(e.length-1).fill(new String),this.strings=e):this._$AH=w}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,s=this,e,i){const o=this.strings;let n=!1;if(void 0===o)t=S(this,t,s,0),n=!m(t)||t!==this._$AH&&t!==C,n&&(this._$AH=t);else{const i=t;let a,l;for(t=o[0],a=0;a{var i,o;const n=null!==(i=null==e?void 0:e.renderBefore)&&void 0!==i?i:s;let a=n._$litPart$;if(void 0===a){const t=null!==(o=null==e?void 0:e.renderBefore)&&void 0!==o?o:null;n._$litPart$=a=new L(s.insertBefore(p(),t),t,void 0,null!=e?e:{})}return a._$AI(t),a},R={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},W=t=>(...s)=>({_$litDirective$:t,values:s});class q{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,s,e){this._$Ct=t,this._$AM=s,this._$Ci=e}_$AS(t,s){return this.update(t,s)}update(t,s){return this.render(...s)}}const Q=(t,s)=>{var e,i;const o=t._$AN;if(void 0===o)return!1;for(const t of o)null===(i=(e=t)._$AO)||void 0===i||i.call(e,s,!1),Q(t,s);return!0},z=t=>{let s,e;do{if(void 0===(s=t._$AM))break;e=s._$AN,e.delete(t),t=s}while(0===(null==e?void 0:e.size))},G=t=>{for(let s;s=t._$AM;t=s){let e=s._$AN;if(void 0===e)s._$AN=e=new Set;else if(e.has(t))break;e.add(t),K(s)}};function Z(t){void 0!==this._$AN?(z(this),this._$AM=t,G(this)):this._$AM=t}function F(t,s=!1,e=0){const i=this._$AH,o=this._$AN;if(void 0!==o&&0!==o.size)if(s)if(Array.isArray(i))for(let t=e;t{var s,e,i,o;t.type==R.CHILD&&(null!==(s=(i=t)._$AP)&&void 0!==s||(i._$AP=F),null!==(e=(o=t)._$AQ)&&void 0!==e||(o._$AQ=Z))};class Y extends q{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,s,e){super._$AT(t,s,e),G(this),this.isConnected=t._$AU}_$AO(t,s=!0){var e,i;t!==this.isConnected&&(this.isConnected=t,t?null===(e=this.reconnected)||void 0===e||e.call(this):null===(i=this.disconnected)||void 0===i||i.call(this)),s&&(Q(this,t),z(this))}setValue(t){if((t=>void 0===this._$Ct.strings)())this._$Ct._$AI(t,this);else{const s=[...this._$Ct._$AH];s[this._$Ci]=t,this._$Ct._$AI(s,this,0)}}disconnected(){}reconnected(){}}const J=t=>null!=t?t:w;class X extends q{constructor(t){if(super(t),this.et=w,t.type!==R.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===w||null==t)return this.ft=void 0,this.et=t;if(t===C)return t;if("string"!=typeof t)throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.et)return this.ft;this.et=t;const s=[t];return s.raw=s,this.ft={_$litType$:this.constructor.resultType,strings:s,values:[]}}}X.directiveName="unsafeHTML",X.resultType=1;class tt extends X{}tt.directiveName="unsafeSVG",tt.resultType=2;const st=W(tt)},8422:(t,s,e)=>{e.d(s,{L:()=>o});var i=e(5687);class o extends HTMLElement{constructor(){super(...arguments),this.rootPart=null}connectedCallback(){this.rootPart=(0,i.D)(this.render(),this,{renderBefore:this.firstChild}),this.rootPart.setConnected(!0)}disconnectedCallback(){this.rootPart?.setConnected(!1),this.rootPart=null}}},3497:(t,s,e)=>{e.r(s);var i=e(4158),o=e(5687),n=e(216),a=e(8457),l=e(4123);class d extends o.c{constructor(t){super(t),this.h=null,this.ra=null,this.w=!1,this.w=t.type===o.t.ATTRIBUTE}render(t){this.h!==t&&(this.h=t,this.disconnected(),this.isConnected&&this.Si());const s=this.h();return this.w?(0,o.l)(s):s}reconnected(){this.Si()}disconnected(){this.w||this.setValue(null),this.ra?.(),this.ra=null}Si(){this.h&&(this.ra=(0,i.e)(this.o.bind(this)))}o(){this.setValue(this.h?.())}}const r=(0,o.e)(d);function c(t){return r((0,i.n)(t))}class u{constructor(t,s){this.Wj=t,this.Ca=s,this.elements=new Set,this.vf=(0,i.V)(this.ea.bind(this))}connect(){this.ea();const t=new MutationObserver(this.vf);t.observe(this.Wj,{childList:!0}),(0,i.o)((()=>t.disconnect())),(0,i.o)(this.disconnect.bind(this))}disconnect(){this.elements.clear()}assign(t,s){t instanceof Node?(s.textContent="",s.append(t)):(0,o.D)(t,s),s.style.display||(s.style.display="contents");const e=s.firstElementChild;if(!e)return;const i=s.getAttribute("data-class");i&&e.classList.add(...i.split(" "))}ea(){for(const t of this.Wj.querySelectorAll("slot"))t.hasAttribute("name")&&this.elements.add(t);this.Ca(this.elements)}}let p=0,m="data-slot-id";class v{constructor(t){this.Wj=t,this.vf=(0,i.V)(this.ea.bind(this)),this.slots=new u(t,this.ea.bind(this))}connect(){this.slots.connect(),this.ea();const t=new MutationObserver(this.vf);t.observe(this.Wj,{childList:!0}),(0,i.o)((()=>t.disconnect()))}ea(){for(const t of this.Wj.children){if(1!==t.nodeType)continue;const s=t.getAttribute("slot");if(!s)continue;t.style.display="none";let e=t.getAttribute(m);e||t.setAttribute(m,e=++p+"");for(const i of this.slots.elements){if(i.getAttribute("name")!==s||i.getAttribute(m)===e)continue;const o=document.importNode(t,!0);s.includes("-icon")&&o.classList.add("vds-icon"),o.style.display="",o.removeAttribute("slot"),this.slots.assign(o,i),i.setAttribute(m,e)}}}}function h({label:t,icon:s}){return o.x` @@ -274,7 +274,7 @@ data-icon=${(0,o.l)(t??e)} > ${(0,i.r)(n)?(0,o.o)(n):r(n)} - `}class S{constructor(t){this.Wj=t,this.Zj={},this.bk=!1,this.slots=new u(t,this.ck.bind(this))}connect(){this.slots.connect(),(0,i.o)(this.disconnect.bind(this))}load(){this.xe().then((t=>{this.Zj=t,this.bk=!0,this.ck()}))}disconnect(){for(const{slot:t}of this.dk())t.textContent=""}*dk(){for(const t of Object.keys(this.Zj)){const s=`${t}-icon`;for(const e of this.slots.elements)e.name===s&&(yield{icon:this.Zj[t],slot:e})}}ck(){if(this.bk)for(const{icon:t,slot:s}of this.dk())this.slots.assign(t,s)}}class M extends S{connect(){const t=this.ik();t&&(super.connect(),t.$state.canLoad()?this.load():(0,i.l)(t,"can-load",(()=>this.load()),{once:!0}))}ik(){let t=this.Wj.parentElement;for(;t&&"media-player"!==t.localName;)t=t.parentElement;return t}}class L extends M{async xe(){const t=(await e.e(4680).then(e.bind(e,4680))).icons,s={};for(const e of Object.keys(t))s[e]=H({name:e,paths:t[e]});return s}}var P=e(7552);function j(){const{live:t,canSeek:s}=(0,a.u)().$state;return t()&&!s()?g({tooltip:"top start"}):null}function I(){const{live:t}=(0,a.u)().$state;return t()?null:o.x` + `}class S{constructor(t){this.Wj=t,this.Zj={},this.bk=!1,this.slots=new u(t,this.ck.bind(this))}connect(){this.slots.connect(),(0,i.o)(this.disconnect.bind(this))}load(){this.xe().then((t=>{this.Zj=t,this.bk=!0,this.ck()}))}disconnect(){for(const{slot:t}of this.dk())t.textContent=""}*dk(){for(const t of Object.keys(this.Zj)){const s=`${t}-icon`;for(const e of this.slots.elements)e.name===s&&(yield{icon:this.Zj[t],slot:e})}}ck(){if(this.bk)for(const{icon:t,slot:s}of this.dk())this.slots.assign(t,s)}}class M extends S{connect(){const t=this.ik();t&&(super.connect(),t.$state.canLoad()?this.load():(0,i.l)(t,"can-load",(()=>this.load()),{once:!0}))}ik(){let t=this.Wj.parentElement;for(;t&&"media-player"!==t.localName;)t=t.parentElement;return t}}class L extends M{async xe(){const t=(await e.e(2969).then(e.bind(e,2969))).icons,s={};for(const e of Object.keys(t))s[e]=H({name:e,paths:t[e]});return s}}var P=e(8422);function j(){const{live:t,canSeek:s}=(0,a.u)().$state;return t()&&!s()?g({tooltip:"top start"}):null}function I(){const{live:t}=(0,a.u)().$state;return t()?null:o.x`
    diff --git a/assets/js/1500.1355ae91.js.LICENSE.txt b/assets/js/3497.8db8a15e.js.LICENSE.txt similarity index 100% rename from assets/js/1500.1355ae91.js.LICENSE.txt rename to assets/js/3497.8db8a15e.js.LICENSE.txt diff --git a/assets/js/v-32b64024.2aacaf55.js b/assets/js/3_obs_plugins.html.ef0298a1.js similarity index 50% rename from assets/js/v-32b64024.2aacaf55.js rename to assets/js/3_obs_plugins.html.ef0298a1.js index 17f4c8297..9a9b4d60f 100644 --- a/assets/js/v-32b64024.2aacaf55.js +++ b/assets/js/3_obs_plugins.html.ef0298a1.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3504],{9720:(e,r)=>{r.c=(e,r)=>{const o=e.__vccOpts||e;for(const[e,t]of r)o[e]=t;return o}},5772:(e,r,o)=>{o.r(r),o.d(r,{comp:()=>be,data:()=>Qe});var t=o(3968);const n=(0,t.IL)('

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

    插件安装与卸载

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

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

    Move

    ',5),l={href:"https://obsproject.com/forum/resources/move.913/",target:"_blank",rel:"noopener noreferrer"},a=(0,t.QD)("h2",{id:"transition-table",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#transition-table"},[(0,t.QD)("span",null,"Transition Table")])],-1),s={href:"https://obsproject.com/forum/resources/transition-table.1174/",target:"_blank",rel:"noopener noreferrer"},i=(0,t.QD)("h2",{id:"自动切换场景",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#自动切换场景"},[(0,t.QD)("span",null,"自动切换场景")])],-1),c={href:"https://obsproject.com/forum/resources/advanced-scene-switcher.395/",target:"_blank",rel:"noopener noreferrer"},p=(0,t.QD)("h2",{id:"scene-as-transition",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#scene-as-transition"},[(0,t.QD)("span",null,"Scene as Transition")])],-1),u={href:"https://obsproject.com/forum/resources/scene-as-transition.1704/",target:"_blank",rel:"noopener noreferrer"},m=(0,t.QD)("h2",{id:"source-clone",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#source-clone"},[(0,t.QD)("span",null,"Source Clone")])],-1),h={href:"https://obsproject.com/forum/resources/source-clone.1632/",target:"_blank",rel:"noopener noreferrer"},d=(0,t.QD)("h2",{id:"aitum-vertical",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#aitum-vertical"},[(0,t.QD)("span",null,"Aitum Vertical")])],-1),f={href:"https://obsproject.com/forum/resources/aitum-vertical.1715/",target:"_blank",rel:"noopener noreferrer"},D=(0,t.QD)("h2",{id:"多平台直播",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#多平台直播"},[(0,t.QD)("span",null,"多平台直播")])],-1),b={href:"https://github.com/sorayuki/obs-multi-rtmp",target:"_blank",rel:"noopener noreferrer"},Q=(0,t.QD)("p",null,"开启多地址推流前,你需要点击控制按钮「开始直播」,然后再点「停止直播」。",-1),g=(0,t.QD)("h2",{id:"streamup-obs-plugin",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#streamup-obs-plugin"},[(0,t.QD)("span",null,"StreamUP OBS Plugin")])],-1),Y={href:"https://streamup.tips/plugin",target:"_blank",rel:"noopener noreferrer"},S=(0,t.QD)("code",null,"C:\\Program Files\\obs-studio",-1),k=(0,t.QD)("h2",{id:"滤镜插件",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#滤镜插件"},[(0,t.QD)("span",null,"滤镜插件")])],-1),v=(0,t.QD)("h2",{id:"composite-blur",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#composite-blur"},[(0,t.QD)("span",null,"Composite Blur")])],-1),_={href:"https://obsproject.com/forum/resources/composite-blur.1780/",target:"_blank",rel:"noopener noreferrer"},B=(0,t.QD)("h2",{id:"pixel-art",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#pixel-art"},[(0,t.QD)("span",null,"Pixel Art")])],-1),O={href:"https://obsproject.com/forum/resources/pixel-art.1789/",target:"_blank",rel:"noopener noreferrer"},w=(0,t.QD)("h2",{id:"gradient-source",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#gradient-source"},[(0,t.QD)("span",null,"Gradient Source")])],-1),K={href:"https://obsproject.com/forum/resources/gradient-source.1172/",target:"_blank",rel:"noopener noreferrer"},x=(0,t.IL)('

    声音滤镜

    声音滤镜通过软件方法使声音更专业。建议配置如下:[1]

    ',2),y=(0,t.QD)("li",null,"增益(Gain):如果麦克风音量已最大但讲话声未达黄色区末端,则用增益加强效果。",-1),j=(0,t.QD)("li",null,"噪音抑制(Noise Suppression):优先选择 N 卡效果,如无,使用内置效果。",-1),P=(0,t.QD)("li",null,"扩展效果(Expander):降低低音量部分的音量,用于减少噪声或其他不希望的低音量声音。",-1),I=(0,t.QD)("li",null,"压缩器(Compressor):降低高音量部分的音量,有助于控制音频中的峰值,使整体声音更加均衡和一致。",-1),A=(0,t.QD)("li",null,"限幅(Limiter):限制音频信号的最大音量,确保它不会超过设定的阈值。这通常用于防止音频削峰或失真,尤其是在音量非常高的情况下。默认阈值是 -6dB。",-1),T={href:"https://api.own3d.pro/v1/downloads/obs-plugin/windows/latest?qt_version=6",target:"_blank",rel:"noopener noreferrer"},C={href:"https://obsproject.com/forum/resources/audio-monitor.1186/",target:"_blank",rel:"noopener noreferrer"},F=(0,t.QD)("h2",{id:"其他",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#其他"},[(0,t.QD)("span",null,"其他")])],-1),M={href:"https://obsproject.com/forum/resources/scene-collection-manager.1434/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://obsproject.com/forum/resources/scene-tree-folder-plugin-for-obs-studio.1500/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://obsproject.com/forum/resources/source-copy.1261/",target:"_blank",rel:"noopener noreferrer"},V={href:"https://obsproject.com/forum/resources/source-dock.1317/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://obsproject.com/forum/resources/downstream-keyer.1254/",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/norihiro/obs-multisource-effect",target:"_blank",rel:"noopener noreferrer"},L={href:"https://github.com/fzwoch/obs-teleport",target:"_blank",rel:"noopener noreferrer"},W={href:"https://github.com/univrsal/spectralizer",target:"_blank",rel:"noopener noreferrer"},X={href:"https://obsproject.com/forum/resources/obs-ndi-newtek-ndi%E2%84%A2-integration-into-obs-studio.528/",target:"_blank",rel:"noopener noreferrer"},U={href:"https://obsproject.com/forum/resources/scrab.845/",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://obsproject.com/forum/resources/lower-thirds-in-html-css.928/",target:"_blank",rel:"noopener noreferrer"},q={href:"https://obsproject.com/forum/resources/input-overlay.552/",target:"_blank",rel:"noopener noreferrer"},H=(0,t.QD)("h2",{id:"美化插件",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#美化插件"},[(0,t.QD)("span",null,"美化插件")])],-1),J={href:"https://yun.miebo.cn/",target:"_blank",rel:"noopener noreferrer"},R={href:"http://zbmate.com/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/",target:"_blank",rel:"noopener noreferrer"},ee=(0,t.QD)("h2",{id:"弃用插件",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#弃用插件"},[(0,t.QD)("span",null,"弃用插件")])],-1),re=(0,t.QD)("p",null,"以下插件已弃用,仅作记录:",-1),oe={href:"https://obsproject.com/forum/resources/virtual-cam-filter.1142/",target:"_blank",rel:"noopener noreferrer"},te={href:"https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://obsproject.com/forum/resources/animated-captions-with-obs-controller-and-a-preview-function.1407/",target:"_blank",rel:"noopener noreferrer"},le={href:"https://obsproject.com/forum/threads/shaderfilter-went-away.155555/#post-571174",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/Oncorporation/obs-shaderfilter/releases/",target:"_blank",rel:"noopener noreferrer"},se={href:"https://obsproject.com/forum/resources/asynchronous-source-duplication.1483/",target:"_blank",rel:"noopener noreferrer"},ie=(0,t.QD)("h2",{id:"更多",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#更多"},[(0,t.QD)("span",null,"更多")])],-1),ce={href:"https://obsproject.com/forum/resources/categories/obs-studio-plugins.6/",target:"_blank",rel:"noopener noreferrer"},pe=(0,t.QD)("hr",{class:"footnotes-sep"},null,-1),ue={class:"footnotes"},me={class:"footnotes-list"},he={id:"footnote1",class:"footnote-item"},de={href:"https://www.youtube.com/watch?v=G1VzeT9t24Y",target:"_blank",rel:"noopener noreferrer"},fe=(0,t.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),De={},be=(0,o(9720).c)(De,[["render",function(e,r){const o=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[n,(0,t.QD)("p",null,[(0,t.QD)("a",l,[(0,t.mY)("Move"),(0,t.K2)(o)]),(0,t.mY)(":原名 Move transition,用来记录来源的位置和尺寸变化,生成元素移动的动画效果。比如,视频演讲时,将摄像头位置从屏幕中央移动到右下,并放大摄像头。")]),a,(0,t.QD)("p",null,[(0,t.QD)("a",s,[(0,t.mY)("Transition Table"),(0,t.K2)(o)]),(0,t.mY)(":转场特效,设定不同场景间的动态切换效果。如果没有使用本场景,不同插件切换是特别生硬的直切,但现在可以使用延时、从左到右等切换滤镜。")]),i,(0,t.QD)("p",null,[(0,t.QD)("a",c,[(0,t.mY)("Advanced Scene Switcher"),(0,t.K2)(o)]),(0,t.mY)(":使用「宏」来自动完成各种任务,按条件切换场景、来源。比如,电脑闲置 10 分钟后,让摄像头来源变为不可见。")]),p,(0,t.QD)("p",null,[(0,t.QD)("a",u,[(0,t.mY)("Scene as Transition"),(0,t.K2)(o)]),(0,t.mY)(":使用场景作为过渡。")]),m,(0,t.QD)("p",null,[(0,t.QD)("a",h,[(0,t.mY)("Source Clone"),(0,t.K2)(o)]),(0,t.mY)(":将源添加到 OBS,以便您克隆源以允许与原始源不同的过滤器。")]),d,(0,t.QD)("p",null,[(0,t.QD)("a",f,[(0,t.mY)("Aitum Vertical"),(0,t.K2)(o)]),(0,t.mY)(":将直播垂直化。")]),D,(0,t.QD)("p",null,[(0,t.QD)("a",b,[(0,t.mY)("multi-rtmp"),(0,t.K2)(o)]),(0,t.mY)(" 使得 OBS 支持多地址推流,以为着同时在多个平台上进行直播。")]),Q,g,(0,t.QD)("p",null,[(0,t.QD)("a",Y,[(0,t.mY)("StreamUP OBS Plugin"),(0,t.K2)(o)]),(0,t.mY)(":用于检查 OBS 插件的更新。该插件的注册和下载过程较为繁琐,需进行两次注册。升级后的下载包是绿色版,你只需将其解压至默认路径 "),S,(0,t.mY)(" 即可。")]),k,v,(0,t.QD)("p",null,[(0,t.QD)("a",_,[(0,t.mY)("Composite Blur"),(0,t.K2)(o)]),(0,t.mY)(":全面的模糊插件,比 streamfx 更加强大。推荐模糊方式选择「Dual Filtering(双重过滤)」或是「Pixelate(像素化)」。")]),B,(0,t.QD)("p",null,[(0,t.QD)("a",O,[(0,t.mY)("Pixel Art"),(0,t.K2)(o)]),(0,t.mY)(":为来源添加像素化的滤镜,非常适合复古风格。")]),w,(0,t.QD)("p",null,[(0,t.QD)("a",K,[(0,t.mY)("Gradient Source"),(0,t.K2)(o)]),(0,t.mY)(":渐变色来源蒙版。")]),x,(0,t.QD)("ul",null,[y,j,P,I,A,(0,t.QD)("li",null,[(0,t.QD)("a",T,[(0,t.mY)("Own3d Pro plugin for OBS"),(0,t.K2)(o)]),(0,t.mY)(":调整声音的高中低频,改变音色。")]),(0,t.QD)("li",null,[(0,t.QD)("a",C,[(0,t.mY)("Audio Monitor"),(0,t.K2)(o)]),(0,t.mY)(":将来源声音输出给指定设备播放,方便单独调节音量,能让主播与观众听到不同的音频效果。")])]),F,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",M,[(0,t.mY)("Scene Collection Manager"),(0,t.K2)(o)]),(0,t.mY)(":自动备份场景,防止误操作。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",N,[(0,t.mY)("Scene Tree"),(0,t.K2)(o)]),(0,t.mY)(":将场景组织到文件夹结构中。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",z,[(0,t.mY)("Source Copy"),(0,t.K2)(o)]),(0,t.mY)(":更方便地复制、保存场景设置。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",V,[(0,t.mY)("Source Dock"),(0,t.K2)(o)]),(0,t.mY)(":为单独场景或来源建立控制栏,使用小窗口预览场景。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",E,[(0,t.mY)("Downstream Keyer"),(0,t.K2)(o)]),(0,t.mY)(":切换场景时,置顶指定场景。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",G,[(0,t.mY)("Multi Source Effect"),(0,t.K2)(o)]),(0,t.mY)(":滤镜效果")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",L,[(0,t.mY)("Teleport"),(0,t.K2)(o)]),(0,t.mY)(":NDI 替代品,局域网设备推流到直播。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",W,[(0,t.mY)("spectralizer"),(0,t.K2)(o)]),(0,t.mY)(":音频频谱,用滤镜「图像掩码」的「混合图层」给频谱遮罩滤镜。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",X,[(0,t.mY)("NDI"),(0,t.K2)(o)]),(0,t.mY)(": 局域网视频无线传输技术 NDI 插件。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",U,[(0,t.mY)("scrab"),(0,t.K2)(o)]),(0,t.mY)(":屏幕截图。添加了一个可配置的热键快速选择一个屏幕区域,并添加它作为一个图像源到当前场景。有人反馈 OBS 28 后有 bug,暂未修复。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",Z,[(0,t.mY)("Lower thirds in HTML/CSS"),(0,t.K2)(o)]),(0,t.mY)(":文字运动特效,适合展示 logo 和标题。")])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",q,[(0,t.mY)("Input Overlay"),(0,t.K2)(o)]),(0,t.mY)(":同步显示键盘、鼠标和游戏板上的输入。")])])]),H,(0,t.QD)("p",null,[(0,t.mY)("第三方的直播美化插件提供了时钟、榜单、弹幕、游戏等互动来源,用于美化直播间,新手可参考使用。美化插件免费版一般足够用了,比如 "),(0,t.QD)("a",J,[(0,t.mY)("咩播"),(0,t.K2)(o)]),(0,t.mY)("、"),(0,t.QD)("a",R,[(0,t.mY)("智播"),(0,t.K2)(o)]),(0,t.mY)("。")]),(0,t.QD)("p",null,[(0,t.mY)("如果你使用的是 NVIDIA 显卡,推荐安装 "),(0,t.QD)("a",$,[(0,t.mY)("NVIDIA Broadcast"),(0,t.K2)(o)]),(0,t.mY)("。你还需要分别下载 Audio Effects 和 Video Effects。这样可以确保在 OBS 中直接使用各种效果滤镜,比如降噪和去背景等功能。此外,在 Windows 设置的「系统 > 显示 > 显卡 > 默认图形设置」中,务必关闭「硬件加速 GPU 计划」选项。如果不关闭,OBS 将无法显示 NVIDIA 的音效滤镜。原因是硬件加速 GPU 和 NVIDIA 音效滤镜同时启用可能会导致 OBS 崩溃。")]),ee,re,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",oe,[(0,t.mY)("Virtual Cam Filter"),(0,t.K2)(o)]),(0,t.mY)(":能让来源单独输出虚拟摄像头,OBS 28 已内置此功能。")]),(0,t.QD)("li",null,[(0,t.QD)("a",te,[(0,t.mY)("obs-websocket"),(0,t.K2)(o)]),(0,t.mY)(":远程控制插件,OBS 28 已内置此功能。")]),(0,t.QD)("li",null,[(0,t.QD)("a",ne,[(0,t.mY)("Animated captions"),(0,t.K2)(o)]),(0,t.mY)(":自定义弹幕功能,无漂浮弹幕,适用较少,仅用于 OBS 27。")]),(0,t.QD)("li",null,[(0,t.QD)("a",le,[(0,t.mY)("OBS Shaderfilter"),(0,t.K2)(o)]),(0,t.mY)(":文字图片特效滤镜。此插件已被从社区删除,下载使用 "),(0,t.QD)("a",ae,[(0,t.mY)("GitHub 备份"),(0,t.K2)(o)]),(0,t.mY)(",其功能已被 StreamFX 取代。")]),(0,t.QD)("li",null,[(0,t.QD)("a",se,[(0,t.mY)("Asynchronous Source Duplication"),(0,t.K2)(o)]),(0,t.mY)(":复制来源可以同时展示在多个场景,复制源会有延迟。其功能已被 StreamFX 的来源镜像取代。")])]),ie,(0,t.QD)("p",null,[(0,t.mY)("如果你在上文中没有找到你需要的功能功能,可以访问 "),(0,t.QD)("a",ce,[(0,t.mY)("OBS 插件库"),(0,t.K2)(o)]),(0,t.mY)("进行搜索。")]),pe,(0,t.QD)("section",ue,[(0,t.QD)("ol",me,[(0,t.QD)("li",he,[(0,t.QD)("p",null,[(0,t.QD)("a",de,[(0,t.mY)("Make Any Mic Sound Expensive In OBS | Mic Settings & Filters (2023)"),(0,t.K2)(o)]),(0,t.mY)(),fe])])])])])}]]),Qe=JSON.parse('{"path":"/apps/livestreaming/3_obs_plugins.html","title":"直播入门攻略三 | 插件篇:OBS 进阶插件","lang":"zh-CN","frontmatter":{"title":"直播入门攻略三 | 插件篇:OBS 进阶插件","category":["工具"],"tag":["OBS","直播"],"order":3,"description":"OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充) 插件安装与卸载 OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。 若要卸载 Windows 下的...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/3_obs_plugins.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略三 | 插件篇:OBS 进阶插件"}],["meta",{"property":"og:description","content":"OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充) 插件安装与卸载 OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。 若要卸载 Windows 下的..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OBS"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略三 | 插件篇:OBS 进阶插件\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"插件安装与卸载","slug":"插件安装与卸载","link":"#插件安装与卸载","children":[]},{"level":2,"title":"Move","slug":"move","link":"#move","children":[]},{"level":2,"title":"Transition Table","slug":"transition-table","link":"#transition-table","children":[]},{"level":2,"title":"自动切换场景","slug":"自动切换场景","link":"#自动切换场景","children":[]},{"level":2,"title":"Scene as Transition","slug":"scene-as-transition","link":"#scene-as-transition","children":[]},{"level":2,"title":"Source Clone","slug":"source-clone","link":"#source-clone","children":[]},{"level":2,"title":"Aitum Vertical","slug":"aitum-vertical","link":"#aitum-vertical","children":[]},{"level":2,"title":"多平台直播","slug":"多平台直播","link":"#多平台直播","children":[]},{"level":2,"title":"StreamUP OBS Plugin","slug":"streamup-obs-plugin","link":"#streamup-obs-plugin","children":[]},{"level":2,"title":"滤镜插件","slug":"滤镜插件","link":"#滤镜插件","children":[]},{"level":2,"title":"Composite Blur","slug":"composite-blur","link":"#composite-blur","children":[]},{"level":2,"title":"Pixel Art","slug":"pixel-art","link":"#pixel-art","children":[]},{"level":2,"title":"Gradient Source","slug":"gradient-source","link":"#gradient-source","children":[]},{"level":2,"title":"声音滤镜","slug":"声音滤镜","link":"#声音滤镜","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"美化插件","slug":"美化插件","link":"#美化插件","children":[]},{"level":2,"title":"弃用插件","slug":"弃用插件","link":"#弃用插件","children":[]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":5.49,"words":1646},"filePathRelative":"apps/livestreaming/3_obs_plugins.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    插件安装与卸载

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6749],{3671:(e,r)=>{r.A=(e,r)=>{const o=e.__vccOpts||e;for(const[e,t]of r)o[e]=t;return o}},2142:(e,r,o)=>{o.r(r),o.d(r,{comp:()=>me,data:()=>Le});var t=o(7847);const n=(0,t.Fv)('

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

    插件安装与卸载

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

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

    Move

    ',5),l={href:"https://obsproject.com/forum/resources/move.913/",target:"_blank",rel:"noopener noreferrer"},a=(0,t.Lk)("h2",{id:"transition-table",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#transition-table"},[(0,t.Lk)("span",null,"Transition Table")])],-1),s={href:"https://obsproject.com/forum/resources/transition-table.1174/",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Lk)("h2",{id:"自动切换场景",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#自动切换场景"},[(0,t.Lk)("span",null,"自动切换场景")])],-1),c={href:"https://obsproject.com/forum/resources/advanced-scene-switcher.395/",target:"_blank",rel:"noopener noreferrer"},p=(0,t.Lk)("h2",{id:"scene-as-transition",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#scene-as-transition"},[(0,t.Lk)("span",null,"Scene as Transition")])],-1),u={href:"https://obsproject.com/forum/resources/scene-as-transition.1704/",target:"_blank",rel:"noopener noreferrer"},k=(0,t.Lk)("h2",{id:"source-clone",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#source-clone"},[(0,t.Lk)("span",null,"Source Clone")])],-1),h={href:"https://obsproject.com/forum/resources/source-clone.1632/",target:"_blank",rel:"noopener noreferrer"},b=(0,t.Lk)("h2",{id:"aitum-vertical",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#aitum-vertical"},[(0,t.Lk)("span",null,"Aitum Vertical")])],-1),d={href:"https://obsproject.com/forum/resources/aitum-vertical.1715/",target:"_blank",rel:"noopener noreferrer"},f=(0,t.Lk)("h2",{id:"多平台直播",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#多平台直播"},[(0,t.Lk)("span",null,"多平台直播")])],-1),m={href:"https://github.com/sorayuki/obs-multi-rtmp",target:"_blank",rel:"noopener noreferrer"},L=(0,t.Lk)("p",null,"开启多地址推流前,你需要点击控制按钮「开始直播」,然后再点「停止直播」。",-1),g=(0,t.Lk)("h2",{id:"streamup-obs-plugin",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#streamup-obs-plugin"},[(0,t.Lk)("span",null,"StreamUP OBS Plugin")])],-1),W={href:"https://streamup.tips/plugin",target:"_blank",rel:"noopener noreferrer"},S=(0,t.Lk)("code",null,"C:\\Program Files\\obs-studio",-1),v=(0,t.Lk)("h2",{id:"滤镜插件",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#滤镜插件"},[(0,t.Lk)("span",null,"滤镜插件")])],-1),F=(0,t.Lk)("h2",{id:"composite-blur",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#composite-blur"},[(0,t.Lk)("span",null,"Composite Blur")])],-1),_={href:"https://obsproject.com/forum/resources/composite-blur.1780/",target:"_blank",rel:"noopener noreferrer"},B=(0,t.Lk)("h2",{id:"pixel-art",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#pixel-art"},[(0,t.Lk)("span",null,"Pixel Art")])],-1),O={href:"https://obsproject.com/forum/resources/pixel-art.1789/",target:"_blank",rel:"noopener noreferrer"},w=(0,t.Lk)("h2",{id:"gradient-source",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#gradient-source"},[(0,t.Lk)("span",null,"Gradient Source")])],-1),x={href:"https://obsproject.com/forum/resources/gradient-source.1172/",target:"_blank",rel:"noopener noreferrer"},y=(0,t.Fv)('

    声音滤镜

    声音滤镜通过软件方法使声音更专业。建议配置如下:[1]

    ',2),j=(0,t.Lk)("li",null,"增益(Gain):如果麦克风音量已最大但讲话声未达黄色区末端,则用增益加强效果。",-1),P=(0,t.Lk)("li",null,"噪音抑制(Noise Suppression):优先选择 N 卡效果,如无,使用内置效果。",-1),A=(0,t.Lk)("li",null,"扩展效果(Expander):降低低音量部分的音量,用于减少噪声或其他不希望的低音量声音。",-1),T=(0,t.Lk)("li",null,"压缩器(Compressor):降低高音量部分的音量,有助于控制音频中的峰值,使整体声音更加均衡和一致。",-1),I=(0,t.Lk)("li",null,"限幅(Limiter):限制音频信号的最大音量,确保它不会超过设定的阈值。这通常用于防止音频削峰或失真,尤其是在音量非常高的情况下。默认阈值是 -6dB。",-1),C={href:"https://api.own3d.pro/v1/downloads/obs-plugin/windows/latest?qt_version=6",target:"_blank",rel:"noopener noreferrer"},D={href:"https://obsproject.com/forum/resources/audio-monitor.1186/",target:"_blank",rel:"noopener noreferrer"},M=(0,t.Lk)("h2",{id:"其他",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#其他"},[(0,t.Lk)("span",null,"其他")])],-1),N={href:"https://obsproject.com/forum/resources/scene-collection-manager.1434/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://obsproject.com/forum/resources/scene-tree-folder-plugin-for-obs-studio.1500/",target:"_blank",rel:"noopener noreferrer"},V={href:"https://obsproject.com/forum/resources/source-copy.1261/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://obsproject.com/forum/resources/source-dock.1317/",target:"_blank",rel:"noopener noreferrer"},G={href:"https://obsproject.com/forum/resources/downstream-keyer.1254/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/norihiro/obs-multisource-effect",target:"_blank",rel:"noopener noreferrer"},U={href:"https://github.com/fzwoch/obs-teleport",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://github.com/univrsal/spectralizer",target:"_blank",rel:"noopener noreferrer"},q={href:"https://obsproject.com/forum/resources/obs-ndi-newtek-ndi%E2%84%A2-integration-into-obs-studio.528/",target:"_blank",rel:"noopener noreferrer"},H={href:"https://obsproject.com/forum/resources/scrab.845/",target:"_blank",rel:"noopener noreferrer"},J={href:"https://obsproject.com/forum/resources/lower-thirds-in-html-css.928/",target:"_blank",rel:"noopener noreferrer"},K={href:"https://obsproject.com/forum/resources/input-overlay.552/",target:"_blank",rel:"noopener noreferrer"},R=(0,t.Lk)("h2",{id:"美化插件",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#美化插件"},[(0,t.Lk)("span",null,"美化插件")])],-1),Y={href:"https://yun.miebo.cn/",target:"_blank",rel:"noopener noreferrer"},Q={href:"http://zbmate.com/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/",target:"_blank",rel:"noopener noreferrer"},ee=(0,t.Lk)("h2",{id:"弃用插件",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#弃用插件"},[(0,t.Lk)("span",null,"弃用插件")])],-1),re=(0,t.Lk)("p",null,"以下插件已弃用,仅作记录:",-1),oe={href:"https://obsproject.com/forum/resources/virtual-cam-filter.1142/",target:"_blank",rel:"noopener noreferrer"},te={href:"https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://obsproject.com/forum/resources/animated-captions-with-obs-controller-and-a-preview-function.1407/",target:"_blank",rel:"noopener noreferrer"},le={href:"https://obsproject.com/forum/threads/shaderfilter-went-away.155555/#post-571174",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/Oncorporation/obs-shaderfilter/releases/",target:"_blank",rel:"noopener noreferrer"},se={href:"https://obsproject.com/forum/resources/asynchronous-source-duplication.1483/",target:"_blank",rel:"noopener noreferrer"},ie=(0,t.Lk)("h2",{id:"更多",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#更多"},[(0,t.Lk)("span",null,"更多")])],-1),ce={href:"https://obsproject.com/forum/resources/categories/obs-studio-plugins.6/",target:"_blank",rel:"noopener noreferrer"},pe=(0,t.Lk)("hr",{class:"footnotes-sep"},null,-1),ue={class:"footnotes"},ke={class:"footnotes-list"},he={id:"footnote1",class:"footnote-item"},be={href:"https://www.youtube.com/watch?v=G1VzeT9t24Y",target:"_blank",rel:"noopener noreferrer"},de=(0,t.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),fe={},me=(0,o(3671).A)(fe,[["render",function(e,r){const o=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[n,(0,t.Lk)("p",null,[(0,t.Lk)("a",l,[(0,t.eW)("Move"),(0,t.bF)(o)]),(0,t.eW)(":原名 Move transition,用来记录来源的位置和尺寸变化,生成元素移动的动画效果。比如,视频演讲时,将摄像头位置从屏幕中央移动到右下,并放大摄像头。")]),a,(0,t.Lk)("p",null,[(0,t.Lk)("a",s,[(0,t.eW)("Transition Table"),(0,t.bF)(o)]),(0,t.eW)(":转场特效,设定不同场景间的动态切换效果。如果没有使用本场景,不同插件切换是特别生硬的直切,但现在可以使用延时、从左到右等切换滤镜。")]),i,(0,t.Lk)("p",null,[(0,t.Lk)("a",c,[(0,t.eW)("Advanced Scene Switcher"),(0,t.bF)(o)]),(0,t.eW)(":使用「宏」来自动完成各种任务,按条件切换场景、来源。比如,电脑闲置 10 分钟后,让摄像头来源变为不可见。")]),p,(0,t.Lk)("p",null,[(0,t.Lk)("a",u,[(0,t.eW)("Scene as Transition"),(0,t.bF)(o)]),(0,t.eW)(":使用场景作为过渡。")]),k,(0,t.Lk)("p",null,[(0,t.Lk)("a",h,[(0,t.eW)("Source Clone"),(0,t.bF)(o)]),(0,t.eW)(":将源添加到 OBS,以便您克隆源以允许与原始源不同的过滤器。")]),b,(0,t.Lk)("p",null,[(0,t.Lk)("a",d,[(0,t.eW)("Aitum Vertical"),(0,t.bF)(o)]),(0,t.eW)(":将直播垂直化。")]),f,(0,t.Lk)("p",null,[(0,t.Lk)("a",m,[(0,t.eW)("multi-rtmp"),(0,t.bF)(o)]),(0,t.eW)(" 使得 OBS 支持多地址推流,以为着同时在多个平台上进行直播。")]),L,g,(0,t.Lk)("p",null,[(0,t.Lk)("a",W,[(0,t.eW)("StreamUP OBS Plugin"),(0,t.bF)(o)]),(0,t.eW)(":用于检查 OBS 插件的更新。该插件的注册和下载过程较为繁琐,需进行两次注册。升级后的下载包是绿色版,你只需将其解压至默认路径 "),S,(0,t.eW)(" 即可。")]),v,F,(0,t.Lk)("p",null,[(0,t.Lk)("a",_,[(0,t.eW)("Composite Blur"),(0,t.bF)(o)]),(0,t.eW)(":全面的模糊插件,比 streamfx 更加强大。推荐模糊方式选择「Dual Filtering(双重过滤)」或是「Pixelate(像素化)」。")]),B,(0,t.Lk)("p",null,[(0,t.Lk)("a",O,[(0,t.eW)("Pixel Art"),(0,t.bF)(o)]),(0,t.eW)(":为来源添加像素化的滤镜,非常适合复古风格。")]),w,(0,t.Lk)("p",null,[(0,t.Lk)("a",x,[(0,t.eW)("Gradient Source"),(0,t.bF)(o)]),(0,t.eW)(":渐变色来源蒙版。")]),y,(0,t.Lk)("ul",null,[j,P,A,T,I,(0,t.Lk)("li",null,[(0,t.Lk)("a",C,[(0,t.eW)("Own3d Pro plugin for OBS"),(0,t.bF)(o)]),(0,t.eW)(":调整声音的高中低频,改变音色。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",D,[(0,t.eW)("Audio Monitor"),(0,t.bF)(o)]),(0,t.eW)(":将来源声音输出给指定设备播放,方便单独调节音量,能让主播与观众听到不同的音频效果。")])]),M,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",N,[(0,t.eW)("Scene Collection Manager"),(0,t.bF)(o)]),(0,t.eW)(":自动备份场景,防止误操作。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",z,[(0,t.eW)("Scene Tree"),(0,t.bF)(o)]),(0,t.eW)(":将场景组织到文件夹结构中。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",V,[(0,t.eW)("Source Copy"),(0,t.bF)(o)]),(0,t.eW)(":更方便地复制、保存场景设置。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",E,[(0,t.eW)("Source Dock"),(0,t.bF)(o)]),(0,t.eW)(":为单独场景或来源建立控制栏,使用小窗口预览场景。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",G,[(0,t.eW)("Downstream Keyer"),(0,t.bF)(o)]),(0,t.eW)(":切换场景时,置顶指定场景。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",X,[(0,t.eW)("Multi Source Effect"),(0,t.bF)(o)]),(0,t.eW)(":滤镜效果")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",U,[(0,t.eW)("Teleport"),(0,t.bF)(o)]),(0,t.eW)(":NDI 替代品,局域网设备推流到直播。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",Z,[(0,t.eW)("spectralizer"),(0,t.bF)(o)]),(0,t.eW)(":音频频谱,用滤镜「图像掩码」的「混合图层」给频谱遮罩滤镜。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",q,[(0,t.eW)("NDI"),(0,t.bF)(o)]),(0,t.eW)(": 局域网视频无线传输技术 NDI 插件。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",H,[(0,t.eW)("scrab"),(0,t.bF)(o)]),(0,t.eW)(":屏幕截图。添加了一个可配置的热键快速选择一个屏幕区域,并添加它作为一个图像源到当前场景。有人反馈 OBS 28 后有 bug,暂未修复。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",J,[(0,t.eW)("Lower thirds in HTML/CSS"),(0,t.bF)(o)]),(0,t.eW)(":文字运动特效,适合展示 logo 和标题。")])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",K,[(0,t.eW)("Input Overlay"),(0,t.bF)(o)]),(0,t.eW)(":同步显示键盘、鼠标和游戏板上的输入。")])])]),R,(0,t.Lk)("p",null,[(0,t.eW)("第三方的直播美化插件提供了时钟、榜单、弹幕、游戏等互动来源,用于美化直播间,新手可参考使用。美化插件免费版一般足够用了,比如 "),(0,t.Lk)("a",Y,[(0,t.eW)("咩播"),(0,t.bF)(o)]),(0,t.eW)("、"),(0,t.Lk)("a",Q,[(0,t.eW)("智播"),(0,t.bF)(o)]),(0,t.eW)("。")]),(0,t.Lk)("p",null,[(0,t.eW)("如果你使用的是 NVIDIA 显卡,推荐安装 "),(0,t.Lk)("a",$,[(0,t.eW)("NVIDIA Broadcast"),(0,t.bF)(o)]),(0,t.eW)("。你还需要分别下载 Audio Effects 和 Video Effects。这样可以确保在 OBS 中直接使用各种效果滤镜,比如降噪和去背景等功能。此外,在 Windows 设置的「系统 > 显示 > 显卡 > 默认图形设置」中,务必关闭「硬件加速 GPU 计划」选项。如果不关闭,OBS 将无法显示 NVIDIA 的音效滤镜。原因是硬件加速 GPU 和 NVIDIA 音效滤镜同时启用可能会导致 OBS 崩溃。")]),ee,re,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",oe,[(0,t.eW)("Virtual Cam Filter"),(0,t.bF)(o)]),(0,t.eW)(":能让来源单独输出虚拟摄像头,OBS 28 已内置此功能。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",te,[(0,t.eW)("obs-websocket"),(0,t.bF)(o)]),(0,t.eW)(":远程控制插件,OBS 28 已内置此功能。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",ne,[(0,t.eW)("Animated captions"),(0,t.bF)(o)]),(0,t.eW)(":自定义弹幕功能,无漂浮弹幕,适用较少,仅用于 OBS 27。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",le,[(0,t.eW)("OBS Shaderfilter"),(0,t.bF)(o)]),(0,t.eW)(":文字图片特效滤镜。此插件已被从社区删除,下载使用 "),(0,t.Lk)("a",ae,[(0,t.eW)("GitHub 备份"),(0,t.bF)(o)]),(0,t.eW)(",其功能已被 StreamFX 取代。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",se,[(0,t.eW)("Asynchronous Source Duplication"),(0,t.bF)(o)]),(0,t.eW)(":复制来源可以同时展示在多个场景,复制源会有延迟。其功能已被 StreamFX 的来源镜像取代。")])]),ie,(0,t.Lk)("p",null,[(0,t.eW)("如果你在上文中没有找到你需要的功能功能,可以访问 "),(0,t.Lk)("a",ce,[(0,t.eW)("OBS 插件库"),(0,t.bF)(o)]),(0,t.eW)("进行搜索。")]),pe,(0,t.Lk)("section",ue,[(0,t.Lk)("ol",ke,[(0,t.Lk)("li",he,[(0,t.Lk)("p",null,[(0,t.Lk)("a",be,[(0,t.eW)("Make Any Mic Sound Expensive In OBS | Mic Settings & Filters (2023)"),(0,t.bF)(o)]),(0,t.eW)(),de])])])])])}]]),Le=JSON.parse('{"path":"/apps/livestreaming/3_obs_plugins.html","title":"直播入门攻略三 | 插件篇:OBS 进阶插件","lang":"zh-CN","frontmatter":{"title":"直播入门攻略三 | 插件篇:OBS 进阶插件","category":["工具"],"tag":["OBS","直播"],"order":3,"description":"OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充) 插件安装与卸载 OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。 若要卸载 Windows 下的...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/3_obs_plugins.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略三 | 插件篇:OBS 进阶插件"}],["meta",{"property":"og:description","content":"OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充) 插件安装与卸载 OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。 若要卸载 Windows 下的..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OBS"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略三 | 插件篇:OBS 进阶插件\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"插件安装与卸载","slug":"插件安装与卸载","link":"#插件安装与卸载","children":[]},{"level":2,"title":"Move","slug":"move","link":"#move","children":[]},{"level":2,"title":"Transition Table","slug":"transition-table","link":"#transition-table","children":[]},{"level":2,"title":"自动切换场景","slug":"自动切换场景","link":"#自动切换场景","children":[]},{"level":2,"title":"Scene as Transition","slug":"scene-as-transition","link":"#scene-as-transition","children":[]},{"level":2,"title":"Source Clone","slug":"source-clone","link":"#source-clone","children":[]},{"level":2,"title":"Aitum Vertical","slug":"aitum-vertical","link":"#aitum-vertical","children":[]},{"level":2,"title":"多平台直播","slug":"多平台直播","link":"#多平台直播","children":[]},{"level":2,"title":"StreamUP OBS Plugin","slug":"streamup-obs-plugin","link":"#streamup-obs-plugin","children":[]},{"level":2,"title":"滤镜插件","slug":"滤镜插件","link":"#滤镜插件","children":[]},{"level":2,"title":"Composite Blur","slug":"composite-blur","link":"#composite-blur","children":[]},{"level":2,"title":"Pixel Art","slug":"pixel-art","link":"#pixel-art","children":[]},{"level":2,"title":"Gradient Source","slug":"gradient-source","link":"#gradient-source","children":[]},{"level":2,"title":"声音滤镜","slug":"声音滤镜","link":"#声音滤镜","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"美化插件","slug":"美化插件","link":"#美化插件","children":[]},{"level":2,"title":"弃用插件","slug":"弃用插件","link":"#弃用插件","children":[]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":5.49,"words":1646},"filePathRelative":"apps/livestreaming/3_obs_plugins.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    插件安装与卸载

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8fe89ed2.d3850422.js b/assets/js/404.html.4d6b8dc3.js similarity index 73% rename from assets/js/v-8fe89ed2.d3850422.js rename to assets/js/404.html.4d6b8dc3.js index 138060588..efc0a45e1 100644 --- a/assets/js/v-8fe89ed2.d3850422.js +++ b/assets/js/404.html.4d6b8dc3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9088],{9720:(t,e)=>{e.c=(t,e)=>{const o=t.__vccOpts||t;for(const[t,n]of e)o[t]=n;return o}},2004:(t,e,o)=>{o.r(e),o.d(e,{comp:()=>p,data:()=>c});var n=o(3968);const r=[(0,n.QD)("p",null,"404 Not Found",-1)],a={},p=(0,o(9720).c)(a,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,r)}]]),c=JSON.parse('{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"404 Not Found ","head":[["meta",{"property":"og:url","content":"https://newzone.top/404.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:description","content":"404 Not Found "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found \\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.01,"words":3},"filePathRelative":null,"excerpt":"

    404 Not Found

    \\n","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7490],{3671:(t,e)=>{e.A=(t,e)=>{const o=t.__vccOpts||t;for(const[t,n]of e)o[t]=n;return o}},2095:(t,e,o)=>{o.r(e),o.d(e,{comp:()=>p,data:()=>c});var n=o(7847);const r=[(0,n.Lk)("p",null,"404 Not Found",-1)],a={},p=(0,o(3671).A)(a,[["render",function(t,e){return(0,n.uX)(),(0,n.CE)("div",null,r)}]]),c=JSON.parse('{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"404 Not Found ","head":[["meta",{"property":"og:url","content":"https://newzone.top/404.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:description","content":"404 Not Found "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found \\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.01,"words":3},"filePathRelative":null,"excerpt":"

    404 Not Found

    \\n","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/4220.f43ec42c.js b/assets/js/4221.c6f56c65.js similarity index 55% rename from assets/js/4220.f43ec42c.js rename to assets/js/4221.c6f56c65.js index 8ef8b6e4a..14381c950 100644 --- a/assets/js/4220.f43ec42c.js +++ b/assets/js/4221.c6f56c65.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4220],{6600:(a,e,s)=>{s.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4221],{4221:(a,e,s)=>{s.r(e)}}]); \ No newline at end of file diff --git a/assets/js/4637.562129d2.js b/assets/js/4637.562129d2.js deleted file mode 100644 index 463931da2..000000000 --- a/assets/js/4637.562129d2.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 4637.562129d2.js.LICENSE.txt */ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4637],{4637:(t,i,e)=>{function s(t,i,e){const s=document.createElement(i);return t&&(s.className=t),e&&e.appendChild(s),s}function n(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function o(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function a(t,i){const e=Math.abs(t.x-i.x),s=Math.abs(t.y-i.y);return Math.sqrt(e*e+s*s)}function h(t,i){return t.x===i.x&&t.y===i.y}function r(t,i,e){return Math.min(Math.max(t,i),e)}function l(t,i,e){let s=`translate3d(${t}px,${i||0}px,0)`;return void 0!==e&&(s+=` scale3d(${e},${e},1)`),s}function p(t,i,e,s){t.style.transform=l(i,e,s)}e.r(i),e.d(i,{default:()=>ht});function d(t,i,e,s){t.style.transition=i?`${i} ${e}ms ${s||"cubic-bezier(.4,0,.22,1)"}`:"none"}function c(t,i,e){t.style.width="number"==typeof i?`${i}px`:i,t.style.height="number"==typeof e?`${e}px`:e}const m="loading",u="loaded",v="error";function _(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let g=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>{g=!0}}))}catch(t){}class y{constructor(){this._pool=[]}add(t,i,e,s){this._toggleListener(t,i,e,s)}remove(t,i,e,s){this._toggleListener(t,i,e,s,!0)}removeAll(){this._pool.forEach((t=>{this._toggleListener(t.target,t.type,t.listener,t.passive,!0,!0)})),this._pool=[]}_toggleListener(t,i,e,s,n,o){if(!t)return;const a=n?"removeEventListener":"addEventListener";i.split(" ").forEach((i=>{if(i){o||(n?this._pool=this._pool.filter((s=>s.type!==i||s.listener!==e||s.target!==t)):this._pool.push({target:t,type:i,listener:e,passive:s}));const h=!!g&&{passive:s||!1};t[a](i,e,h)}}))}}function w(t,i){if(t.getViewportSizeFn){const e=t.getViewportSizeFn(t,i);if(e)return e}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function f(t,i,e,s,n){let o=0;if(i.paddingFn)o=i.paddingFn(e,s,n)[t];else if(i.padding)o=i.padding[t];else{const e="padding"+t[0].toUpperCase()+t.slice(1);i[e]&&(o=i[e])}return Number(o)||0}function x(t,i,e,s){return{x:i.x-f("left",t,i,e,s)-f("right",t,i,e,s),y:i.y-f("top",t,i,e,s)-f("bottom",t,i,e,s)}}class P{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this._updateAxis("x"),this._updateAxis("y"),this.slide.pswp.dispatch("calcBounds",{slide:this.slide})):this.reset()}_updateAxis(t){const{pswp:i}=this.slide,e=this.slide["x"===t?"width":"height"]*this.currZoomLevel,s=f("x"===t?"left":"top",i.options,i.viewportSize,this.slide.data,this.slide.index),n=this.slide.panAreaSize[t];this.center[t]=Math.round((n-e)/2)+s,this.max[t]=e>n?Math.round(n-e)+s:this.center[t],this.min[t]=e>n?s:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return r(i,this.max[t],this.min[t])}}class S{constructor(t,i,e,s){this.pswp=s,this.options=t,this.itemData=i,this.index=e,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,e){const s={x:t,y:i};this.elementSize=s,this.panAreaSize=e;const n=e.x/s.x,o=e.y/s.y;this.fit=Math.min(1,no?n:o),this.vFill=Math.min(1,o),this.initial=this._getInitial(),this.secondary=this._getSecondary(),this.max=Math.max(this.initial,this.secondary,this._getMax()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch("zoomLevelsUpdate",{zoomLevels:this,slideData:this.itemData})}_parseZoomLevelOption(t){const i=t+"ZoomLevel",e=this.options[i];if(e)return"function"==typeof e?e(this):"fill"===e?this.fill:"fit"===e?this.fit:Number(e)}_getSecondary(){let t=this._parseZoomLevelOption("secondary");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}_getInitial(){return this._parseZoomLevelOption("initial")||this.fit}_getMax(){return this._parseZoomLevelOption("max")||Math.max(1,4*this.fit)}}class b{constructor(t,i,e){this.data=t,this.index=i,this.pswp=e,this.isActive=i===e.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!e.opener.isOpen,this.zoomLevels=new S(e.options,t,i,e),this.pswp.dispatch("gettingData",{slide:this,data:this.data,index:i}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=s("pswp__zoom-wrap","div"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new P(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch("slideInit",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin="0 0",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch("firstZoomPan",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch("afterSetContent",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch("slideLoad",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch("appendHeavy",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch("appendHeavyContent",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch("slideActivate",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch("slideDeactivate",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch("slideDestroy",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const e=Math.round(this.width*i)||this.pswp.viewportSize.x,s=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(e,s)||t)&&this.content.setDisplayedSize(e,s)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){var t;return null===(t=this.content.placeholder)||void 0===t?void 0:t.element}zoomTo(t,i,e,s){const{pswp:n}=this;if(!this.isZoomable()||n.mainScroll.isShifted())return;n.dispatch("beforeZoomTo",{destZoomLevel:t,centerPoint:i,transitionDuration:e}),n.animations.stopAllPan();const a=this.currZoomLevel;s||(t=r(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset("x",i,a),this.pan.y=this.calculateZoomToPanOffset("y",i,a),o(this.pan);const h=()=>{this._setResolution(t),this.applyCurrentZoomPan()};e?n.animations.startTransition({isPan:!0,name:"zoomTo",target:this.container,transform:this.getCurrentTransform(),onComplete:h,duration:e,easing:n.options.easing}):h()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,e){if(0==this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),e||(e=this.zoomLevels.initial);const s=this.currZoomLevel/e;return this.bounds.correctPan(t,(this.pan[t]-i[t])*s+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan("x",t),this.pan.y=this.bounds.correctPan("y",i),this.applyCurrentZoomPan()}isPannable(){return Boolean(this.width)&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return Boolean(this.width)&&this.content.isZoomable()}applyCurrentZoomPan(){this._applyZoomTransform(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch("zoomPanUpdate",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),n(this.pan,this.bounds.center),this.pswp.dispatch("initialZoomPan",{slide:this})}_applyZoomTransform(t,i,e){e/=this.currentResolution||this.zoomLevels.initial,p(this.container,t,i,e)}calculateSize(){const{pswp:t}=this;n(this.panAreaSize,x(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch("calcSlideSize",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return l(this.pan.x,this.pan.y,t)}_setResolution(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch("resolutionChanged"))}}class z{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&n(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:e}=this.gestures,{currSlide:s}=this.pswp;if("y"===e&&this.pswp.options.closeOnVerticalDrag&&s&&s.currZoomLevel<=s.zoomLevels.fit&&!this.gestures.isMultitouch){const e=s.pan.y+(t.y-i.y);if(!this.pswp.dispatch("verticalDrag",{panY:e}).defaultPrevented){this._setPanWithFriction("y",e,.6);const t=1-Math.abs(this._getVerticalDragRatio(s.pan.y));this.pswp.applyBgOpacity(t),s.applyCurrentZoomPan()}}else this._panOrMoveMainScroll("x")||(this._panOrMoveMainScroll("y"),s&&(o(s.pan),s.applyCurrentZoomPan()))}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:e}=this.pswp;let s=0;if(this.pswp.animations.stopAll(),i.isShifted()){const e=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-.5&&e<0||t.x<.1&&e<-.5?(s=1,t.x=Math.min(t.x,0)):(t.x>.5&&e>0||t.x>-.1&&e>.5)&&(s=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(s,!0,t.x)}e&&e.currZoomLevel>e.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this._finishPanGestureForAxis("x"),this._finishPanGestureForAxis("y"))}_finishPanGestureForAxis(t){const{velocity:i}=this.gestures,{currSlide:e}=this.pswp;if(!e)return;const{pan:s,bounds:n}=e,o=s[t],a=this.pswp.bgOpacity<1&&"y"===t,h=o+.995*i[t]/(1-.995);if(a){const t=this._getVerticalDragRatio(o),i=this._getVerticalDragRatio(h);if(t<0&&i<-.4||t>0&&i>.4)return void this.pswp.close()}const l=n.correctPan(t,h);if(o===l)return;const p=l===h?1:.82,d=this.pswp.bgOpacity,c=l-o;this.pswp.animations.startSpring({name:"panGesture"+t,isPan:!0,start:o,end:l,velocity:i[t],dampingRatio:p,onUpdate:i=>{if(a&&this.pswp.bgOpacity<1){const t=1-(l-i)/c;this.pswp.applyBgOpacity(r(d+(1-d)*t,0,1))}s[t]=Math.floor(i),e.applyCurrentZoomPan()}})}_panOrMoveMainScroll(t){const{p1:i,dragAxis:e,prevP1:s,isMultitouch:n}=this.gestures,{currSlide:o,mainScroll:a}=this.pswp,h=i[t]-s[t],r=a.x+h;if(!h||!o)return!1;if("x"===t&&!o.isPannable()&&!n)return a.moveTo(r,!0),!0;const{bounds:l}=o,p=o.pan[t]+h;if(this.pswp.options.allowPanToNext&&"x"===e&&"x"===t&&!n){const i=a.getCurrSlideX(),e=a.x-i,s=h>0,n=!s;if(p>l.min[t]&&s){if(l.min[t]<=this.startPan[t])return a.moveTo(r,!0),!0;this._setPanWithFriction(t,p)}else if(p0)return a.moveTo(Math.max(r,i),!0),!0;if(e<0)return a.moveTo(Math.min(r,i),!0),!0}else this._setPanWithFriction(t,p)}else"y"===t&&(a.isShifted()||l.min.y===l.max.y)||this._setPanWithFriction(t,p);return!1}_getVerticalDragRatio(t){var i,e;return(t-(null!==(i=null===(e=this.pswp.currSlide)||void 0===e?void 0:e.bounds.center.y)&&void 0!==i?i:0))/(this.pswp.viewportSize.y/3)}_setPanWithFriction(t,i,e){const{currSlide:s}=this.pswp;if(!s)return;const{pan:n,bounds:o}=s;if(o.correctPan(t,i)!==i||e){const s=Math.round(i-n[t]);n[t]+=s*(e||.35)}else n[t]=i}}function C(t,i,e){return t.x=(i.x+e.x)/2,t.y=(i.y+e.y)/2,t}class I{constructor(t){this.gestures=t,this._startPan={x:0,y:0},this._startZoomPoint={x:0,y:0},this._zoomPoint={x:0,y:0},this._wasOverFitZoomLevel=!1,this._startZoomLevel=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this._startZoomLevel=t.currZoomLevel,n(this._startPan,t.pan)),this.gestures.pswp.animations.stopAllPan(),this._wasOverFitZoomLevel=!1}change(){const{p1:t,startP1:i,p2:e,startP2:s,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const h=o.zoomLevels.min,r=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;C(this._startZoomPoint,i,s),C(this._zoomPoint,t,e);let l=1/a(i,s)*a(t,e)*this._startZoomLevel;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this._wasOverFitZoomLevel=!0),lr&&(l=r+.05*(l-r));o.pan.x=this._calculatePanForZoomLevel("x",l),o.pan.y=this._calculatePanForZoomLevel("y",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevele.zoomLevels.max?o=e.zoomLevels.max:(a=!1,o=s);const l=i.bgOpacity,p=i.bgOpacity<1,d=n({x:0,y:0},e.pan);let c=n({x:0,y:0},d);t&&(this._zoomPoint.x=0,this._zoomPoint.y=0,this._startZoomPoint.x=0,this._startZoomPoint.y=0,this._startZoomLevel=s,n(this._startPan,d)),a&&(c={x:this._calculatePanForZoomLevel("x",o),y:this._calculatePanForZoomLevel("y",o)}),e.setZoomLevel(o),c={x:e.bounds.correctPan("x",c.x),y:e.bounds.correctPan("y",c.y)},e.setZoomLevel(s);const m=!h(c,d);if(!m&&!a&&!p)return e._setResolution(o),void e.applyCurrentZoomPan();i.animations.stopAllPan(),i.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,m||a){if(m&&(e.pan.x=d.x+(c.x-d.x)*t,e.pan.y=d.y+(c.y-d.y)*t),a){const i=s+(o-s)*t;e.setZoomLevel(i)}e.applyCurrentZoomPan()}p&&i.bgOpacity<1&&i.applyBgOpacity(r(l+(1-l)*t,0,1))},onComplete:()=>{e._setResolution(o),e.applyCurrentZoomPan()}})}}function L(t){return!!t.target.closest(".pswp__container")}class A{constructor(t){this.gestures=t}click(t,i){const e=i.target.classList,s=e.contains("pswp__img"),n=e.contains("pswp__item")||e.contains("pswp__zoom-wrap");s?this._doClickOrTapAction("imageClick",t,i):n&&this._doClickOrTapAction("bgClick",t,i)}tap(t,i){L(i)&&this._doClickOrTapAction("tap",t,i)}doubleTap(t,i){L(i)&&this._doClickOrTapAction("doubleTap",t,i)}_doClickOrTapAction(t,i,e){var s;const{pswp:n}=this.gestures,{currSlide:o}=n,a=t+"Action",h=n.options[a];if(!n.dispatch(a,{point:i,originalEvent:e}).defaultPrevented)if("function"!=typeof h)switch(h){case"close":case"next":n[h]();break;case"zoom":null==o||o.toggleZoom(i);break;case"zoom-or-close":null!=o&&o.isZoomable()&&o.zoomLevels.secondary!==o.zoomLevels.initial?o.toggleZoom(i):n.options.clickToCloseNonZoomable&&n.close();break;case"toggle-controls":null===(s=this.gestures.pswp.element)||void 0===s||s.classList.toggle("pswp--ui-visible")}else h.call(n,i,e)}}class T{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this._lastStartP1={x:0,y:0},this._intervalP1={x:0,y:0},this._numActivePoints=0,this._ongoingPointers=[],this._touchEventEnabled="ontouchstart"in window,this._pointerEventEnabled=!!window.PointerEvent,this.supportsTouch=this._touchEventEnabled||this._pointerEventEnabled&&navigator.maxTouchPoints>1,this._numActivePoints=0,this._intervalTime=0,this._velocityCalculated=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this._tapTimer=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new z(this),this.zoomLevels=new I(this),this.tapHandler=new A(this),t.on("bindEvents",(()=>{t.events.add(t.scrollWrap,"click",this._onClick.bind(this)),this._pointerEventEnabled?this._bindEvents("pointer","down","up","cancel"):this._touchEventEnabled?(this._bindEvents("touch","start","end","cancel"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this._bindEvents("mouse","down","up")}))}_bindEvents(t,i,e,s){const{pswp:n}=this,{events:o}=n,a=s?t+s:"";o.add(n.scrollWrap,t+i,this.onPointerDown.bind(this)),o.add(window,t+"move",this.onPointerMove.bind(this)),o.add(window,t+e,this.onPointerUp.bind(this)),a&&o.add(n.scrollWrap,a,this.onPointerUp.bind(this))}onPointerDown(t){const i="mousedown"===t.type||"mouse"===t.pointerType;if(i&&t.button>0)return;const{pswp:e}=this;e.opener.isOpen?e.dispatch("pointerDown",{originalEvent:t}).defaultPrevented||(i&&(e.mouseDetected(),this._preventPointerEventBehaviour(t,"down")),e.animations.stopAll(),this._updatePoints(t,"down"),1===this._numActivePoints&&(this.dragAxis=null,n(this.startP1,this.p1)),this._numActivePoints>1?(this._clearTapTimer(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){this._preventPointerEventBehaviour(t,"move"),this._numActivePoints&&(this._updatePoints(t,"move"),this.pswp.dispatch("pointerMove",{originalEvent:t}).defaultPrevented||(1!==this._numActivePoints||this.isDragging?this._numActivePoints>1&&!this.isZooming&&(this._finishDrag(),this.isZooming=!0,this._updateStartPoints(),this.zoomLevels.start(),this._rafStopLoop(),this._rafRenderLoop()):(this.dragAxis||this._calculateDragDirection(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this._clearTapTimer(),this._updateStartPoints(),this._intervalTime=Date.now(),this._velocityCalculated=!1,n(this._intervalP1,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this._rafStopLoop(),this._rafRenderLoop()))))}_finishDrag(){this.isDragging&&(this.isDragging=!1,this._velocityCalculated||this._updateVelocity(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this._numActivePoints&&(this._updatePoints(t,"up"),this.pswp.dispatch("pointerUp",{originalEvent:t}).defaultPrevented||(0===this._numActivePoints&&(this._rafStopLoop(),this.isDragging?this._finishDrag():this.isZooming||this.isMultitouch||this._finishTap(t)),this._numActivePoints<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this._numActivePoints&&(this.dragAxis=null,this._updateStartPoints()))))}_rafRenderLoop(){(this.isDragging||this.isZooming)&&(this._updateVelocity(),this.isDragging?h(this.p1,this.prevP1)||this.drag.change():h(this.p1,this.prevP1)&&h(this.p2,this.prevP2)||this.zoomLevels.change(),this._updatePrevPoints(),this.raf=requestAnimationFrame(this._rafRenderLoop.bind(this)))}_updateVelocity(t){const i=Date.now(),e=i-this._intervalTime;e<50&&!t||(this.velocity.x=this._getVelocity("x",e),this.velocity.y=this._getVelocity("y",e),this._intervalTime=i,n(this._intervalP1,this.p1),this._velocityCalculated=!0)}_finishTap(t){const{mainScroll:i}=this.pswp;if(i.isShifted())return void i.moveIndexBy(0,!0);if(t.type.indexOf("cancel")>0)return;if("mouseup"===t.type||"mouse"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this._tapTimer?(this._clearTapTimer(),a(this._lastStartP1,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(n(this._lastStartP1,this.startP1),this._tapTimer=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this._clearTapTimer()}),e))}_clearTapTimer(){this._tapTimer&&(clearTimeout(this._tapTimer),this._tapTimer=null)}_getVelocity(t,i){const e=this.p1[t]-this._intervalP1[t];return Math.abs(e)>1&&i>5?e/i:0}_rafStopLoop(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}_preventPointerEventBehaviour(t,i){this.pswp.applyFilters("preventPointerEvent",!0,t,i)&&t.preventDefault()}_updatePoints(t,i){if(this._pointerEventEnabled){const e=t,s=this._ongoingPointers.findIndex((t=>t.id===e.pointerId));"up"===i&&s>-1?this._ongoingPointers.splice(s,1):"down"===i&&-1===s?this._ongoingPointers.push(this._convertEventPosToPoint(e,{x:0,y:0})):s>-1&&this._convertEventPosToPoint(e,this._ongoingPointers[s]),this._numActivePoints=this._ongoingPointers.length,this._numActivePoints>0&&n(this.p1,this._ongoingPointers[0]),this._numActivePoints>1&&n(this.p2,this._ongoingPointers[1])}else{const e=t;this._numActivePoints=0,e.type.indexOf("touch")>-1?e.touches&&e.touches.length>0&&(this._convertEventPosToPoint(e.touches[0],this.p1),this._numActivePoints++,e.touches.length>1&&(this._convertEventPosToPoint(e.touches[1],this.p2),this._numActivePoints++)):(this._convertEventPosToPoint(t,this.p1),"up"===i?this._numActivePoints=0:this._numActivePoints++)}}_updatePrevPoints(){n(this.prevP1,this.p1),n(this.prevP2,this.p2)}_updateStartPoints(){n(this.startP1,this.p1),n(this.startP2,this.p2),this._updatePrevPoints()}_calculateDragDirection(){if(this.pswp.mainScroll.isShifted())this.dragAxis="x";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?"x":"y";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}_convertEventPosToPoint(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,"pointerId"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}_onClick(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class Z{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this._currPositionIndex=0,this._prevPositionIndex=0,this._containerShiftIndex=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,e=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),s=e!==this.slideWidth;s&&(this.slideWidth=e,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,e)=>{s&&p(i.el,(e+this._containerShiftIndex)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this._currPositionIndex=0,this._prevPositionIndex=0,this.slideWidth=0,this._containerShiftIndex=-1}appendHolders(){this.itemHolders=[];for(let t=0;t<3;t++){const i=s("pswp__item","div",this.pswp.container);i.setAttribute("role","group"),i.setAttribute("aria-roledescription","slide"),i.setAttribute("aria-hidden","true"),i.style.display=1===t?"block":"none",this.itemHolders.push({el:i})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,e){const{pswp:s}=this;let n=s.potentialIndex+t;const o=s.getNumItems();if(s.canLoop()){n=s.getLoopedIndex(n);const i=(t+o)%o;t=i<=o/2?i:i-o}else n<0?n=0:n>=o&&(n=o-1),t=n-s.potentialIndex;s.potentialIndex=n,this._currPositionIndex-=t,s.animations.stopMainScroll();const a=this.getCurrSlideX();if(i){s.animations.startSpring({isMainScroll:!0,start:this.x,end:a,velocity:e||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),s.appendHeavy()}});let t=s.potentialIndex-s.currIndex;if(s.canLoop()){const i=(t+o)%o;t=i<=o/2?i:i-o}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(a),this.updateCurrItem();return Boolean(t)}getCurrSlideX(){return this.slideWidth*this._currPositionIndex}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,e=this._prevPositionIndex-this._currPositionIndex;if(!e)return;this._prevPositionIndex=this._currPositionIndex,i.currIndex=i.potentialIndex;let s,n=Math.abs(e);n>=3&&(this._containerShiftIndex+=e+(e>0?-3:3),n=3);for(let t=0;t0?(s=this.itemHolders.shift(),s&&(this.itemHolders[2]=s,this._containerShiftIndex++,p(s.el,(this._containerShiftIndex+2)*this.slideWidth),i.setContent(s,i.currIndex-n+t+2))):(s=this.itemHolders.pop(),s&&(this.itemHolders.unshift(s),this._containerShiftIndex--,p(s.el,this._containerShiftIndex*this.slideWidth),i.setContent(s,i.currIndex+n-t-2)));Math.abs(this._containerShiftIndex)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),i.currSlide=null===(t=this.itemHolders[1])||void 0===t?void 0:t.slide,i.contentLoader.updateLazy(e),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch("change")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let i=(this.slideWidth*this._currPositionIndex-t)/this.slideWidth;i+=this.pswp.currIndex;const e=Math.round(t-this.x);(i<0&&e>0||i>=this.pswp.getNumItems()-1&&e<0)&&(t=this.x+.35*e)}this.x=t,this.pswp.container&&p(this.pswp.container,t),this.pswp.dispatch("moveMainScroll",{x:t,dragging:null!=i&&i})}}const O={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},D=(t,i)=>i?t:O[t];class E{constructor(t){this.pswp=t,this._wasFocused=!1,t.on("bindEvents",(()=>{t.options.trapFocus&&(t.options.initialPointerPos||this._focusRoot(),t.events.add(document,"focusin",this._onFocusIn.bind(this))),t.events.add(document,"keydown",this._onKeyDown.bind(this))}));const i=document.activeElement;t.on("destroy",(()=>{t.options.returnFocus&&i&&this._wasFocused&&i.focus()}))}_focusRoot(){!this._wasFocused&&this.pswp.element&&(this.pswp.element.focus(),this._wasFocused=!0)}_onKeyDown(t){const{pswp:i}=this;if(i.dispatch("keydown",{originalEvent:t}).defaultPrevented)return;if(function(t){return"button"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t))return;let e,s,n=!1;const o="key"in t;switch(o?t.key:t.keyCode){case D("Escape",o):i.options.escKey&&(e="close");break;case D("z",o):e="toggleZoom";break;case D("ArrowLeft",o):s="x";break;case D("ArrowUp",o):s="y";break;case D("ArrowRight",o):s="x",n=!0;break;case D("ArrowDown",o):n=!0,s="y";break;case D("Tab",o):this._focusRoot()}if(s){t.preventDefault();const{currSlide:o}=i;i.options.arrowKeys&&"x"===s&&i.getNumItems()>1?e=n?"next":"prev":o&&o.currZoomLevel>o.zoomLevels.fit&&(o.pan[s]+=n?-80:80,o.panTo(o.pan.x,o.pan.y))}e&&(t.preventDefault(),i[e]())}_onFocusIn(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const M="cubic-bezier(.4,0,.22,1)";class F{constructor(t){var i;this.props=t;const{target:e,onComplete:s,transform:n,onFinish:o=(()=>{}),duration:a=333,easing:h=M}=t;this.onFinish=o;const r=n?"transform":"opacity",l=null!==(i=t[r])&&void 0!==i?i:"";this._target=e,this._onComplete=s,this._finished=!1,this._onTransitionEnd=this._onTransitionEnd.bind(this),this._helperTimeout=setTimeout((()=>{d(e,r,a,h),this._helperTimeout=setTimeout((()=>{e.addEventListener("transitionend",this._onTransitionEnd,!1),e.addEventListener("transitioncancel",this._onTransitionEnd,!1),this._helperTimeout=setTimeout((()=>{this._finalizeAnimation()}),a+500),e.style[r]=l}),30)}),0)}_onTransitionEnd(t){t.target===this._target&&this._finalizeAnimation()}_finalizeAnimation(){this._finished||(this._finished=!0,this.onFinish(),this._onComplete&&this._onComplete())}destroy(){this._helperTimeout&&clearTimeout(this._helperTimeout),d(this._target),this._target.removeEventListener("transitionend",this._onTransitionEnd,!1),this._target.removeEventListener("transitioncancel",this._onTransitionEnd,!1),this._finished||this._finalizeAnimation()}}class B{constructor(t,i,e){this.velocity=1e3*t,this._dampingRatio=i||.75,this._naturalFrequency=e||12,this._dampedFrequency=this._naturalFrequency,this._dampingRatio<1&&(this._dampedFrequency*=Math.sqrt(1-this._dampingRatio*this._dampingRatio))}easeFrame(t,i){let e,s=0;i/=1e3;const n=Math.E**(-this._dampingRatio*this._naturalFrequency*i);if(1===this._dampingRatio)e=this.velocity+this._naturalFrequency*t,s=(t+e*i)*n,this.velocity=s*-this._naturalFrequency+e*n;else if(this._dampingRatio<1){e=1/this._dampedFrequency*(this._dampingRatio*this._naturalFrequency*t+this.velocity);const o=Math.cos(this._dampedFrequency*i),a=Math.sin(this._dampedFrequency*i);s=n*(t*o+e*a),this.velocity=s*-this._naturalFrequency*this._dampingRatio+n*(-this._dampedFrequency*t*a+this._dampedFrequency*e*o)}return s}}class R{constructor(t){this.props=t,this._raf=0;const{start:i,end:e,velocity:s,onUpdate:n,onComplete:o,onFinish:a=(()=>{}),dampingRatio:h,naturalFrequency:r}=t;this.onFinish=a;const l=new B(s,h,r);let p=Date.now(),d=i-e;const c=()=>{this._raf&&(d=l.easeFrame(d,Date.now()-p),Math.abs(d)<1&&Math.abs(l.velocity)<50?(n(e),o&&o(),this.onFinish()):(p=Date.now(),n(d+e),this._raf=requestAnimationFrame(c)))};this._raf=requestAnimationFrame(c)}destroy(){this._raf>=0&&cancelAnimationFrame(this._raf),this._raf=0}}class k{constructor(){this.activeAnimations=[]}startSpring(t){this._start(t,!0)}startTransition(t){this._start(t)}_start(t,i){const e=i?new R(t):new F(t);return this.activeAnimations.push(e),e.onFinish=()=>this.stop(e),e}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class H{constructor(t){this.pswp=t,t.events.add(t.element,"wheel",this._onWheel.bind(this))}_onWheel(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:e,deltaY:s}=t;if(i&&!this.pswp.dispatch("wheel",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let e=-s;1===t.deltaMode?e*=.05:e*=t.deltaMode?1:.002,e=2**e;const n=i.currZoomLevel*e;i.zoomTo(n,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(e*=18,s*=18),i.panTo(i.pan.x-e,i.pan.y-s))}}class W{constructor(t,i){var e;const n=i.name||i.className;let o=i.html;if(!1===t.options[n])return;"string"==typeof t.options[n+"SVG"]&&(o=t.options[n+"SVG"]),t.dispatch("uiElementCreate",{data:i});let a="";i.isButton?(a+="pswp__button ",a+=i.className||`pswp__button--${i.name}`):a+=i.className||`pswp__${i.name}`;let h=i.isButton?i.tagName||"button":i.tagName||"div";h=h.toLowerCase();const r=s(a,h);if(i.isButton){"button"===h&&(r.type="button");let{title:e}=i;const{ariaLabel:s}=i;"string"==typeof t.options[n+"Title"]&&(e=t.options[n+"Title"]),e&&(r.title=e);const o=s||e;o&&r.setAttribute("aria-label",o)}r.innerHTML=function(t){if("string"==typeof t)return t;if(!t||!t.isCustomSVG)return"";const i=t;let e='",e}(o),i.onInit&&i.onInit(r,t),i.onClick&&(r.onclick=e=>{"string"==typeof i.onClick?t[i.onClick]():"function"==typeof i.onClick&&i.onClick(e,r,t)});const l=i.appendTo||"bar";let p=t.element;"bar"===l?(t.topBar||(t.topBar=s("pswp__top-bar pswp__hide-on-close","div",t.scrollWrap)),p=t.topBar):(r.classList.add("pswp__hide-on-close"),"wrapper"===l&&(p=t.scrollWrap)),null===(e=p)||void 0===e||e.appendChild(t.applyFilters("uiElement",r,i))}}function N(t,i,e){t.classList.add("pswp__button--arrow"),t.setAttribute("aria-controls","pswp__items"),i.on("change",(()=>{i.options.loop||(t.disabled=e?!(i.currIndex0))}))}const V={name:"arrowPrev",className:"pswp__button--arrow--prev",title:"Previous",order:10,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'',outlineID:"pswp__icn-arrow"},onClick:"prev",onInit:N},q={name:"arrowNext",className:"pswp__button--arrow--next",title:"Next",order:11,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'',outlineID:"pswp__icn-arrow"},onClick:"next",onInit:(t,i)=>{N(t,i,!0)}},U={name:"close",title:"Close",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-close"},onClick:"close"},G={name:"zoom",title:"Zoom",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-zoom"},onClick:"toggleZoom"},K={name:"preloader",appendTo:"bar",order:7,html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-loading"},onInit:(t,i)=>{let e,s=null;const n=i=>{var s;e!==i&&(e=i,"active",s=i,t.classList.toggle("pswp__preloader--active",s))},o=()=>{var t;if(null===(t=i.currSlide)||void 0===t||!t.content.isLoading())return n(!1),void(s&&(clearTimeout(s),s=null));s||(s=setTimeout((()=>{var t;n(Boolean(null===(t=i.currSlide)||void 0===t?void 0:t.content.isLoading())),s=null}),i.options.preloaderDelay))};i.on("change",o),i.on("loadComplete",(t=>{i.currSlide===t.slide&&o()})),i.ui&&(i.ui.updatePreloaderVisibility=o)}},$={name:"counter",order:5,onInit:(t,i)=>{i.on("change",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function X(t,i){t.classList.toggle("pswp--zoomed-in",i)}class Y{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this._lastUpdatedZoomLevel=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[U,V,q,G,K,$],t.dispatch("uiRegister"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on("change",(()=>{var i;null===(i=t.element)||void 0===i||i.classList.toggle("pswp--one-slide",1===t.getNumItems())})),t.on("zoomPanUpdate",(()=>this._onZoomPanUpdate()))}registerElement(t){this.isRegistered?this.items.push(new W(this.pswp,t)):this.uiElementsData.push(t)}_onZoomPanUpdate(){const{template:t,currSlide:i,options:e}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:s}=i;if(this.pswp.opener.isOpen||(s=i.zoomLevels.initial),s===this._lastUpdatedZoomLevel)return;this._lastUpdatedZoomLevel=s;const n=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(n)<.01||!i.isZoomable())return X(t,!1),void t.classList.remove("pswp--zoom-allowed");t.classList.add("pswp--zoom-allowed"),X(t,(s===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=s),"zoom"!==e.imageClickAction&&"zoom-or-close"!==e.imageClickAction||t.classList.add("pswp--click-to-zoom")}}class j{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class J{constructor(){this._listeners={},this._filters={},this.pswp=void 0,this.options=void 0}addFilter(t,i,e=100){var s,n,o;this._filters[t]||(this._filters[t]=[]),null===(s=this._filters[t])||void 0===s||s.push({fn:i,priority:e}),null===(n=this._filters[t])||void 0===n||n.sort(((t,i)=>t.priority-i.priority)),null===(o=this.pswp)||void 0===o||o.addFilter(t,i,e)}removeFilter(t,i){this._filters[t]&&(this._filters[t]=this._filters[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var e;return null===(e=this._filters[t])||void 0===e||e.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var e,s;this._listeners[t]||(this._listeners[t]=[]),null===(e=this._listeners[t])||void 0===e||e.push(i),null===(s=this.pswp)||void 0===s||s.on(t,i)}off(t,i){var e;this._listeners[t]&&(this._listeners[t]=this._listeners[t].filter((t=>i!==t))),null===(e=this.pswp)||void 0===e||e.off(t,i)}dispatch(t,i){var e;if(this.pswp)return this.pswp.dispatch(t,i);const s=new j(t,i);return null===(e=this._listeners[t])||void 0===e||e.forEach((t=>{t.call(this,s)})),s}}class Q{constructor(t,i){if(this.element=s("pswp__img pswp__img--placeholder",t?"img":"div",i),t){const i=this.element;i.decoding="async",i.alt="",i.src=t,i.setAttribute("role","presentation")}this.element.setAttribute("aria-hidden","true")}setDisplayedSize(t,i){this.element&&("IMG"===this.element.tagName?(c(this.element,250,"auto"),this.element.style.transformOrigin="0 0",this.element.style.transform=l(0,0,t/250)):c(this.element,t,i))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class tt{constructor(t,i,e){this.instance=i,this.data=t,this.index=e,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state="idle",this.data.type?this.type=this.data.type:this.data.src?this.type="image":this.type="html",this.instance.dispatch("contentInit",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(t,i){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters("placeholderSrc",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new Q(t,this.slide.container)}this.element&&!i||this.instance.dispatch("contentLoad",{content:this,isLazy:t}).defaultPrevented||(this.isImageContent()?(this.element=s("pswp__img","img"),this.displayedImageWidth&&this.loadImage(t)):(this.element=s("pswp__content","div"),this.element.innerHTML=this.data.html||""),i&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,e;if(!this.isImageContent()||!this.element||this.instance.dispatch("contentLoadImage",{content:this,isLazy:t}).defaultPrevented)return;const s=this.element;this.updateSrcsetSizes(),this.data.srcset&&(s.srcset=this.data.srcset),s.src=null!==(i=this.data.src)&&void 0!==i?i:"",s.alt=null!==(e=this.data.alt)&&void 0!==e?e:"",this.state=m,s.complete?this.onLoaded():(s.onload=()=>{this.onLoaded()},s.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&this.element&&(this.instance.dispatch("loadComplete",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==v||this.removePlaceholder())}onError(){this.state=v,this.slide&&(this.displayError(),this.instance.dispatch("loadComplete",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch("loadError",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters("isContentLoading",this.state===m,this)}isError(){return this.state===v}isImageContent(){return"image"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch("contentResize",{content:this,width:t,height:i}).defaultPrevented&&(c(this.element,t,i),this.isImageContent()&&!this.isError()))){const e=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,e?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch("imageSizeChange",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters("isContentZoomable",this.isImageContent()&&this.state!==v,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters("srcsetSizesWidth",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+"px",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters("useContentPlaceholder",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch("contentLazyLoad",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters("isKeepingPlaceholder",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch("contentDestroy",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var t,i;let e=s("pswp__error-msg","div");e.innerText=null!==(t=null===(i=this.instance.options)||void 0===i?void 0:i.errorMsg)&&void 0!==t?t:"",e=this.instance.applyFilters("contentErrorElement",e,this),this.element=s("pswp__content pswp__error-msg-container","div"),this.element.appendChild(e),this.slide.container.innerText="",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===v)return void this.displayError();if(this.instance.dispatch("contentAppend",{content:this}).defaultPrevented)return;const t="decode"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||_())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch("contentActivate",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!_()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute("aria-hidden","false"))}deactivate(){this.instance.dispatch("contentDeactivate",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute("aria-hidden","true")}remove(){this.isAttached=!1,this.instance.dispatch("contentRemove",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch("contentAppendImage",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==v||this.removePlaceholder()))}}function it(t,i,e){const s=i.createContentFromData(t,e);let n;const{options:o}=i;if(o){let a;n=new S(o,t,-1),a=i.pswp?i.pswp.viewportSize:w(o,i);const h=x(o,a,t,e);n.update(s.width,s.height,h)}return s.lazyLoad(),n&&s.setDisplayedSize(Math.ceil(s.width*n.initial),Math.ceil(s.height*n.initial)),s}class et{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this._cachedItems=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch("lazyLoad").defaultPrevented)return;const{preload:e}=i.options,s=void 0===t||t>=0;let n;for(n=0;n<=e[1];n++)this.loadSlideByIndex(i.currIndex+(s?n:-n));for(n=1;n<=e[0];n++)this.loadSlideByIndex(i.currIndex+(s?-n:n))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let e=this.getContentByIndex(i);e||(e=function(t,i){const e=i.getItemData(t);if(!i.dispatch("lazyLoadSlide",{index:t,itemData:e}).defaultPrevented)return it(e,i,t)}(i,this.pswp),e&&this.addToCache(e))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this._cachedItems.push(t),this._cachedItems.length>this.limit){const t=this._cachedItems.findIndex((t=>!t.isAttached&&!t.hasSlide));-1!==t&&this._cachedItems.splice(t,1)[0].destroy()}}removeByIndex(t){const i=this._cachedItems.findIndex((i=>i.index===t));-1!==i&&this._cachedItems.splice(i,1)}getContentByIndex(t){return this._cachedItems.find((i=>i.index===t))}destroy(){this._cachedItems.forEach((t=>t.destroy())),this._cachedItems=[]}}class st extends J{getNumItems(){var t;let i=0;const e=null===(t=this.options)||void 0===t?void 0:t.dataSource;e&&"length"in e?i=e.length:e&&"gallery"in e&&(e.items||(e.items=this._getGalleryDOMElements(e.gallery)),e.items&&(i=e.items.length));const s=this.dispatch("numItems",{dataSource:e,numItems:i});return this.applyFilters("numItems",s.numItems,e)}createContentFromData(t,i){return new tt(t,this,i)}getItemData(t){var i;const e=null===(i=this.options)||void 0===i?void 0:i.dataSource;let s={};Array.isArray(e)?s=e[t]:e&&"gallery"in e&&(e.items||(e.items=this._getGalleryDOMElements(e.gallery)),s=e.items[t]);let n=s;n instanceof Element&&(n=this._domElementToItemData(n));const o=this.dispatch("itemData",{itemData:n||{},index:t});return this.applyFilters("itemData",o.itemData,t)}_getGalleryDOMElements(t){var i,e;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(e=this.options)&&void 0!==e&&e.childSelector?function(t,i,e=document){let s=[];if(t instanceof Element)s=[t];else if(t instanceof NodeList||Array.isArray(t))s=Array.from(t);else{const n="string"==typeof t?t:i;n&&(s=Array.from(e.querySelectorAll(n)))}return s}(this.options.children,this.options.childSelector,t)||[]:[t]}_domElementToItemData(t){const i={element:t},e="A"===t.tagName?t:t.querySelector("a");if(e){i.src=e.dataset.pswpSrc||e.href,e.dataset.pswpSrcset&&(i.srcset=e.dataset.pswpSrcset),i.width=e.dataset.pswpWidth?parseInt(e.dataset.pswpWidth,10):0,i.height=e.dataset.pswpHeight?parseInt(e.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,e.dataset.pswpType&&(i.type=e.dataset.pswpType);const n=t.querySelector("img");var s;n&&(i.msrc=n.currentSrc||n.src,i.alt=null!==(s=n.getAttribute("alt"))&&void 0!==s?s:""),(e.dataset.pswpCropped||e.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters("domItemData",i,t,e)}lazyLoadData(t,i){return it(t,this,i)}}const nt=.003;class ot{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this._duration=void 0,this._useAnimation=!1,this._croppedZoom=!1,this._animateRootOpacity=!1,this._animateBgOpacity=!1,this._placeholder=void 0,this._opacityElement=void 0,this._cropContainer1=void 0,this._cropContainer2=void 0,this._thumbBounds=void 0,this._prepareOpen=this._prepareOpen.bind(this),t.on("firstZoomPan",this._prepareOpen)}open(){this._prepareOpen(),this._start()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this._duration=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this._duration=0),this._applyStartProps(),setTimeout((()=>{this._start()}),this._croppedZoom?30:0)}_prepareOpen(){if(this.pswp.off("firstZoomPan",this._prepareOpen),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this._duration=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this._duration=0),this._applyStartProps()}}_applyStartProps(){const{pswp:t}=this,i=this.pswp.currSlide,{options:e}=t;var s,n;if("fade"===e.showHideAnimationType?(e.showHideOpacity=!0,this._thumbBounds=void 0):"none"===e.showHideAnimationType?(e.showHideOpacity=!1,this._duration=0,this._thumbBounds=void 0):this.isOpening&&t._initialThumbBounds?this._thumbBounds=t._initialThumbBounds:this._thumbBounds=this.pswp.getThumbBounds(),this._placeholder=null==i?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this._useAnimation=Boolean(this._duration&&this._duration>50),this._animateZoom=Boolean(this._thumbBounds)&&(null==i?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),this._animateZoom?this._animateRootOpacity=null!==(s=e.showHideOpacity)&&void 0!==s&&s:(this._animateRootOpacity=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan())),this._animateBgOpacity=!this._animateRootOpacity&&this.pswp.options.bgOpacity>nt,this._opacityElement=this._animateRootOpacity?t.element:t.bg,!this._useAnimation)return this._duration=0,this._animateZoom=!1,this._animateBgOpacity=!1,this._animateRootOpacity=!0,void(this.isOpening&&(t.element&&(t.element.style.opacity=String(nt)),t.applyBgOpacity(1)));this._animateZoom&&this._thumbBounds&&this._thumbBounds.innerRect?(this._croppedZoom=!0,this._cropContainer1=this.pswp.container,this._cropContainer2=null===(n=this.pswp.currSlide)||void 0===n?void 0:n.holderElement,t.container&&(t.container.style.overflow="hidden",t.container.style.width=t.viewportSize.x+"px")):this._croppedZoom=!1,this.isOpening?(this._animateRootOpacity?(t.element&&(t.element.style.opacity=String(nt)),t.applyBgOpacity(1)):(this._animateBgOpacity&&t.bg&&(t.bg.style.opacity=String(nt)),t.element&&(t.element.style.opacity="1")),this._animateZoom&&(this._setClosedStateZoomPan(),this._placeholder&&(this._placeholder.style.willChange="transform",this._placeholder.style.opacity=String(nt)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display="none"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display="none"),this._croppedZoom&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}_start(){this.isOpening&&this._useAnimation&&this._placeholder&&"IMG"===this._placeholder.tagName?new Promise((t=>{let i=!1,e=!0;var s;(s=this._placeholder,"decode"in s?s.decode().catch((()=>{})):s.complete?Promise.resolve(s):new Promise(((t,i)=>{s.onload=()=>t(s),s.onerror=i}))).finally((()=>{i=!0,e||t(!0)})),setTimeout((()=>{e=!1,i&&t(!0)}),50),setTimeout(t,250)})).finally((()=>this._initiate())):this._initiate()}_initiate(){var t,i;null===(t=this.pswp.element)||void 0===t||t.style.setProperty("--pswp-transition-duration",this._duration+"ms"),this.pswp.dispatch(this.isOpening?"openingAnimationStart":"closingAnimationStart"),this.pswp.dispatch("initialZoom"+(this.isOpening?"In":"Out")),null===(i=this.pswp.element)||void 0===i||i.classList.toggle("pswp--ui-visible",this.isOpening),this.isOpening?(this._placeholder&&(this._placeholder.style.opacity="1"),this._animateToOpenState()):this.isClosing&&this._animateToClosedState(),this._useAnimation||this._onAnimationComplete()}_onAnimationComplete(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?"openingAnimationEnd":"closingAnimationEnd"),t.dispatch("initialZoom"+(this.isOpen?"InEnd":"OutEnd")),this.isClosed)t.destroy();else if(this.isOpen){var i;this._animateZoom&&t.container&&(t.container.style.overflow="visible",t.container.style.width="100%"),null===(i=t.currSlide)||void 0===i||i.applyCurrentZoomPan()}}_animateToOpenState(){const{pswp:t}=this;this._animateZoom&&(this._croppedZoom&&this._cropContainer1&&this._cropContainer2&&(this._animateTo(this._cropContainer1,"transform","translate3d(0,0,0)"),this._animateTo(this._cropContainer2,"transform","none")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this._animateTo(t.currSlide.container,"transform",t.currSlide.getCurrentTransform()))),this._animateBgOpacity&&t.bg&&this._animateTo(t.bg,"opacity",String(t.options.bgOpacity)),this._animateRootOpacity&&t.element&&this._animateTo(t.element,"opacity","1")}_animateToClosedState(){const{pswp:t}=this;this._animateZoom&&this._setClosedStateZoomPan(!0),this._animateBgOpacity&&t.bgOpacity>.01&&t.bg&&this._animateTo(t.bg,"opacity","0"),this._animateRootOpacity&&t.element&&this._animateTo(t.element,"opacity","0")}_setClosedStateZoomPan(t){if(!this._thumbBounds)return;const{pswp:i}=this,{innerRect:e}=this._thumbBounds,{currSlide:s,viewportSize:o}=i;if(this._croppedZoom&&e&&this._cropContainer1&&this._cropContainer2){const i=-o.x+(this._thumbBounds.x-e.x)+e.w,s=-o.y+(this._thumbBounds.y-e.y)+e.h,n=o.x-e.w,a=o.y-e.h;t?(this._animateTo(this._cropContainer1,"transform",l(i,s)),this._animateTo(this._cropContainer2,"transform",l(n,a))):(p(this._cropContainer1,i,s),p(this._cropContainer2,n,a))}s&&(n(s.pan,e||this._thumbBounds),s.currZoomLevel=this._thumbBounds.w/s.width,t?this._animateTo(s.container,"transform",s.getCurrentTransform()):s.applyCurrentZoomPan())}_animateTo(t,i,e){if(!this._duration)return void(t.style[i]=e);const{animations:s}=this.pswp,n={duration:this._duration,easing:this.pswp.options.easing,onComplete:()=>{s.activeAnimations.length||this._onAnimationComplete()},target:t};n[i]=e,s.startTransition(n)}}const at={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:"zoom-or-close",bgClickAction:"close",tapAction:"toggle-controls",doubleTapAction:"zoom",indexIndicatorSep:" / ",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:"The image cannot be loaded",preload:[1,2],easing:"cubic-bezier(.4,0,.22,1)"};class ht extends st{constructor(t){super(),this.options=this._prepareOptions(t||{}),this.offset={x:0,y:0},this._prevViewportSize={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this._initialItemData={},this._initialThumbBounds=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new y,this.animations=new k,this.mainScroll=new Z(this),this.gestures=new T(this),this.opener=new ot(this),this.keyboard=new E(this),this.contentLoader=new et(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch("init"),this.dispatch("beforeOpen"),this._createMainStructure();let t="pswp--open";return this.gestures.supportsTouch&&(t+=" pswp--touch"),this.options.mainClass&&(t+=" "+this.options.mainClass),this.element&&(this.element.className+=" "+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch("firstUpdate"),this.scrollWheel=new H(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this._initialItemData=this.getItemData(this.currIndex),this.dispatch("gettingData",{index:this.currIndex,data:this._initialItemData,slide:void 0}),this._initialThumbBounds=this.getThumbBounds(),this.dispatch("initialLayout"),this.on("openingAnimationEnd",(()=>{const{itemHolders:t}=this.mainScroll;t[0]&&(t[0].el.style.display="block",this.setContent(t[0],this.currIndex-1)),t[2]&&(t[2].el.style.display="block",this.setContent(t[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,"resize",this._handlePageResize.bind(this)),this.events.add(window,"scroll",this._updatePageScrollOffset.bind(this)),this.dispatch("bindEvents")})),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch("change"),this.opener.open(),this.dispatch("afterInit"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),r(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;null===(i=this.currSlide)||void 0===i||i.zoomTo(...t)}toggleZoom(){var t;null===(t=this.currSlide)||void 0===t||t.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch("close"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying)return this.options.showHideAnimationType="none",void this.close();this.dispatch("destroy"),this._listeners={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),null===(t=this.element)||void 0===t||t.remove(),this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,e)=>{var s,n;let o=(null!==(s=null===(n=this.currSlide)||void 0===n?void 0:n.index)&&void 0!==s?s:0)-1+e;var a;this.canLoop()&&(o=this.getLoopedIndex(o)),o===t&&(this.setContent(i,t,!0),1===e&&(this.currSlide=i.slide,null===(a=i.slide)||void 0===a||a.setIsActive(!0)))})),this.dispatch("change")}setContent(t,i,e){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!e)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const s=this.getItemData(i);t.slide=new b(s,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const i=w(this.options,this);!t&&h(i,this._prevViewportSize)||(n(this._prevViewportSize,i),this.dispatch("beforeResize"),n(this.viewportSize,this._prevViewportSize),this._updatePageScrollOffset(),this.dispatch("viewportSize"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia("(any-hover: hover)").matches&&this.mouseDetected(),this.dispatch("resize"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){var t;this.hasMouse||(this.hasMouse=!0,null===(t=this.element)||void 0===t||t.classList.add("pswp--has_mouse"))}_handlePageResize(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}_updatePageScrollOffset(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch("updateScrollOffset")}_createMainStructure(){this.element=s("pswp","div"),this.element.setAttribute("tabindex","-1"),this.element.setAttribute("role","dialog"),this.template=this.element,this.bg=s("pswp__bg","div",this.element),this.scrollWrap=s("pswp__scroll-wrap","section",this.element),this.container=s("pswp__container","div",this.scrollWrap),this.scrollWrap.setAttribute("aria-roledescription","carousel"),this.container.setAttribute("aria-live","off"),this.container.setAttribute("id","pswp__items"),this.mainScroll.appendHolders(),this.ui=new Y(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,e){const s=e.dispatch("thumbBounds",{index:t,itemData:i,instance:e});if(s.thumbBounds)return s.thumbBounds;const{element:n}=i;let o,a;if(n&&!1!==e.options.thumbSelector){const t=e.options.thumbSelector||"img";a=n.matches(t)?n:n.querySelector(t)}return a=e.applyFilters("thumbEl",a,i,t),a&&(o=i.thumbCropped?function(t,i,e){const s=t.getBoundingClientRect(),n=s.width/i,o=s.height/e,a=n>o?n:o,h=(s.width-i*a)/2,r=(s.height-e*a)/2,l={x:s.left+h,y:s.top+r,w:i*a};return l.innerRect={w:s.width,h:s.height,x:h,y:r},l}(a,i.width||i.w||0,i.height||i.h||0):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(a)),e.applyFilters("thumbBounds",o,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this._initialItemData,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}_prepareOptions(t){return window.matchMedia("(prefers-reduced-motion), (update: slow)").matches&&(t.showHideAnimationType="none",t.zoomAnimationDuration=0),{...at,...t}}}}}]); \ No newline at end of file diff --git a/assets/js/4699.68e32c06.js b/assets/js/4699.68e32c06.js new file mode 100644 index 000000000..45aa1745a --- /dev/null +++ b/assets/js/4699.68e32c06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4699],{1501:(t,i,s)=>{s.d(i,{R:()=>a});var e=s(4158);class a{constructor(t){this.Ca=t}Bb(){(0,e.i)(this.ca)&&this.Oe()}ra(){(0,e.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,e.i)(this.ca)||(this.Ca(),this.Oe())}))}}},8039:(t,i,s)=>{s.d(i,{B:()=>d});var e=s(449),a=s(4158),h=s(1501),r=s(5781);class n{constructor(t,i){this.i=t,this.b=i,this.sa=(0,a.L)(),this.Cb=!1,this.$c=!1,this.ad=!1,this.Da=new h.R(this.bd.bind(this)),this.Qe=void 0,this.Dg=void 0,this.pg(),(0,a.e)(this.qg.bind(this)),(0,a.o)(this.cd.bind(this))}get a(){return this.i.media}get c(){return this.b.delegate.c}cd(){this.$c=!1,this.ad=!1,this.Da.ra(),this.sa.empty()}bd(){const t=this.a.currentTime;this.b.$state.currentTime()!==t&&this.$a(t)}pg(){this.t("loadstart",this.Ea),this.t("abort",this.Pe),this.t("emptied",this.rg),this.t("error",this.U),this.t("volumechange",this.ab)}sg(){this.$c||(this.sa.add(this.t("loadeddata",this.tg),this.t("loadedmetadata",this.ug),this.t("canplay",this.hc),this.t("canplaythrough",this.vg),this.t("durationchange",this.wg),this.t("play",this.xb),this.t("progress",this.ic),this.t("stalled",this.xg),this.t("suspend",this.yg)),this.$c=!0)}zg(){this.ad||(this.sa.add(this.t("pause",this.Aa),this.t("playing",this.Ag),this.t("ratechange",this.Bg),this.t("seeked",this.bb),this.t("seeking",this.Cg),this.t("ended",this.Db),this.t("waiting",this.dd)),this.ad=!0)}t(t,i){return(0,a.l)(this.a,t,i.bind(this))}Eg(t){}$a(t,i){const s={currentTime:Math.min(t,this.b.$state.seekableEnd()),played:this.a.played};this.c("time-update",s,i)}Ea(t){3!==this.a.networkState?(this.sg(),this.c("load-start",void 0,t)):this.Pe(t)}Pe(t){this.c("abort",void 0,t)}rg(){this.c("emptied",void 0,event)}tg(t){this.c("loaded-data",void 0,t)}ug(t){this.zg(),this.c("loaded-metadata",void 0,t),r.g&&(0,e.i)(this.b.$state.source())&&this.b.delegate.jc(this.ed(),t)}ed(){return{provider:(0,a.p)(this.b.$provider),duration:this.a.duration,buffered:this.a.buffered,seekable:this.a.seekable}}xb(t){this.b.$state.canPlay&&this.c("play",void 0,t)}Aa(t){(1!==this.a.readyState||this.Cb)&&(this.Cb=!1,this.Da.ra(),this.c("pause",void 0,t))}hc(t){this.b.delegate.jc(this.ed(),t)}vg(t){this.b.$state.started()||this.c("can-play-through",this.ed(),t)}Ag(t){this.Cb=!1,this.c("playing",void 0,t),this.Da.Bb()}xg(t){this.c("stalled",void 0,t),this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}dd(t){this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}Db(t){this.Da.ra(),this.$a(this.a.duration,t),this.c("end",void 0,t),this.b.$state.loop()&&(0,a.M)(this.a.controls)&&(this.a.controls=!1)}qg(){this.b.$state.paused()&&(0,a.l)(this.a,"timeupdate",this.Eb.bind(this))}Eb(t){this.$a(this.a.currentTime,t)}wg(t){this.b.$state.ended()&&this.$a(this.a.duration,t),this.c("duration-change",this.a.duration,t)}ab(t){const i={volume:this.a.volume,muted:this.a.muted};this.c("volume-change",i,t)}bb(t){this.$a(this.a.currentTime,t),this.c("seeked",this.a.currentTime,t),Math.trunc(this.a.currentTime)===Math.trunc(this.a.duration)&&(0,e.g)(this.a.duration)>(0,e.g)(this.a.currentTime)&&(this.$a(this.a.duration,t),this.a.ended||this.b.player.dispatch(new a.D("media-play-request",{trigger:t})))}Cg(t){this.c("seeking",this.a.currentTime,t)}ic(t){const i={buffered:this.a.buffered,seekable:this.a.seekable};this.c("progress",i,t)}yg(t){this.c("suspend",void 0,t)}Bg(t){this.c("rate-change",this.a.playbackRate,t)}U(t){const i=this.a.error;if(!i)return;const s={message:i.message,code:i.code,mediaError:i};this.c("error",s,t)}}class c{constructor(t,i){this.i=t,this.b=i,this.Fb.onaddtrack=this.Fg.bind(this),this.Fb.onremovetrack=this.Gg.bind(this),this.Fb.onchange=this.Hg.bind(this),(0,a.l)(this.b.audioTracks,"change",this.Ig.bind(this))}get Fb(){return this.i.media.audioTracks}Fg(t){const i=t.track;if(""===i.label)return;const s={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.b.audioTracks[r.L.oa](s,t),i.enabled&&(s.selected=!0)}Gg(t){const i=this.b.audioTracks.getById(t.track.id);i&&this.b.audioTracks[r.L.Yb](i,t)}Hg(t){let i=this.Re();if(!i)return;const s=this.b.audioTracks.getById(i.id);s&&this.b.audioTracks[r.L.pa](s,!0,t)}Re(){return Array.from(this.Fb).find((t=>t.enabled))}Ig(t){const{current:i}=t.detail;if(!i)return;const s=this.Fb.getTrackById(i.id);if(s){const t=this.Re();t&&(t.enabled=!1),s.enabled=!0}}}class d{constructor(t){this.a=t,this.scope=(0,a.q)(),this.V=null}setup(t){new n(this,t),"audioTracks"in this.media&&new c(this,t),(0,a.o)((()=>{this.a.setAttribute("src",""),this.a.load()}))}get type(){return""}get media(){return this.a}get currentSrc(){return this.V}setPlaybackRate(t){this.a.playbackRate=t}async play(){return this.a.play()}async pause(){return this.a.pause()}setMuted(t){this.a.muted=t}setVolume(t){this.a.volume=t}setCurrentTime(t){this.a.currentTime=t}setPlaysinline(t){(0,a.k)(this.a,"playsinline",t)}async loadSource({src:t,type:i},s){this.a.preload=s||"",(0,e.a)(t)?this.a.srcObject=t:(this.a.srcObject=null,this.a.src=(0,a.r)(t)?t:window.URL.createObjectURL(t)),this.a.load(),this.V={src:t,type:i}}}},4699:(t,i,s)=>{s.r(i),s.d(i,{VideoProvider:()=>l});var e=s(4158),a=s(5781),h=s(8039),r=s(4123);class n{constructor(t,i){this.m=t,this.b=i,t.textTracks.onaddtrack=this.Wc.bind(this),(0,e.o)(this.cd.bind(this))}Wc(t){const i=t.track;if(!i||function(t,i){return Array.from(t.children).find((t=>t.track===i))}(this.m,i))return;const s=new r.b({id:i.id,kind:i.kind,label:i.label,language:i.language,type:"vtt"});s[r.T.T]={track:i},s[r.T.M]=2,s[r.T.te]=!0;let e=0;const a=t=>{if(i.cues)for(let a=e;a{this.a.delegate.c("picture-in-picture-change",t,i)},(0,e.l)(this.m,"enterpictureinpicture",this.Jg.bind(this)),(0,e.l)(this.m,"leavepictureinpicture",this.Kg.bind(this))}get active(){return document.pictureInPictureElement===this.m}get supported(){return(0,a.d)(this.m)}async enter(){return this.m.requestPictureInPicture()}exit(){return document.exitPictureInPicture()}Jg(t){this.B(!0,t)}Kg(t){this.B(!1,t)}}class d{constructor(t,i){this.m=t,this.a=i,this.I="inline",(0,e.l)(this.m,"webkitpresentationmodechanged",this.Ua.bind(this))}get Se(){return(0,a.e)(this.m)}async kc(t){this.I!==t&&this.m.webkitSetPresentationMode(t)}Ua(t){const i=this.I;this.I=this.m.webkitPresentationMode,this.a.player?.dispatch(new e.D("video-presentation-change",{detail:this.I,trigger:t})),["fullscreen","picture-in-picture"].forEach((s=>{this.I!==s&&i!==s||this.a.delegate.c(`${s}-change`,this.I===s,t)}))}}class o{constructor(t){this.fa=t}get active(){return"fullscreen"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("fullscreen")}async exit(){this.fa.kc("inline")}}class u{constructor(t){this.fa=t}get active(){return"picture-in-picture"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("picture-in-picture")}async exit(){this.fa.kc("inline")}}class l extends h.B{constructor(t,i){super(t),this.$$PROVIDER_TYPE="VIDEO",(0,e.s)((()=>{if((0,a.e)(t)){const s=new d(t,i);this.fullscreen=new o(s),this.pictureInPicture=new u(s)}else(0,a.d)(t)&&(this.pictureInPicture=new c(t,i))}),this.scope)}get type(){return"video"}setup(t){super.setup(t),(0,a.b)(this.video)&&new n(this.video,t),t.textRenderers.Fe(this.video),(0,e.o)((()=>{t.textRenderers.Fe(null)})),"video"===this.type&&t.delegate.c("provider-setup",this)}get video(){return this.a}}}}]); \ No newline at end of file diff --git a/assets/js/4251.f57b3bf6.js b/assets/js/4797.f91b52f2.js similarity index 62% rename from assets/js/4251.f57b3bf6.js rename to assets/js/4797.f91b52f2.js index 262e42c91..f458f65d1 100644 --- a/assets/js/4251.f57b3bf6.js +++ b/assets/js/4797.f91b52f2.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4251],{4251:(e,n,t)=>{t.d(n,{updatePageview:()=>a});const a=async()=>{try{const{pageviewCount:e}=await Promise.resolve().then(t.bind(t,9912));return e({serverURL:"https://waline.newzone.top"})}catch{console.error("@waline/client is not installed!")}}}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4797],{4797:(e,n,t)=>{t.d(n,{updatePageview:()=>a});const a=async()=>{try{const{pageviewCount:e}=await Promise.resolve().then(t.bind(t,9647));return e({serverURL:"https://waline.newzone.top"})}catch{console.error("@waline/client is not installed!")}}}}]); \ No newline at end of file diff --git a/assets/js/v-ae1e0282.ef80a344.js b/assets/js/4_live_effects.html.e04894c9.js similarity index 68% rename from assets/js/v-ae1e0282.ef80a344.js rename to assets/js/4_live_effects.html.e04894c9.js index b49ba8572..4cd946d59 100644 --- a/assets/js/v-ae1e0282.ef80a344.js +++ b/assets/js/4_live_effects.html.e04894c9.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5018],{9720:(e,a)=>{a.c=(e,a)=>{const r=e.__vccOpts||e;for(const[e,n]of a)r[e]=n;return r}},2918:(e,a,r)=>{r.r(a),r.d(a,{comp:()=>A,data:()=>R});var n=r(3968);const t=(0,n.QD)("p",null,"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。",-1),l=(0,n.QD)("h2",{id:"美颜",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#美颜"},[(0,n.QD)("span",null,"美颜")])],-1),i={href:"https://v.yy.com/",target:"_blank",rel:"noopener noreferrer"},p=(0,n.IL)('

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

    使用注意

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

    变声

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

    虚拟主播

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

    FaceRig

    ',8),o={href:"https://store.steampowered.com/app/274920/FaceRig/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/20210329092154.gif?imageMogr2/format/webp",alt:"FaceRig 演示图",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"FaceRig 演示图")],-1),c=(0,n.QD)("p",null,[(0,n.mY)("注意:百度搜索 FaceRig 的首个结果是"),(0,n.QD)("strong",null,"虚假官网"),(0,n.mY)(",价格高且无保障,不要在上面进行购买。")],-1),m=(0,n.QD)("h3",{id:"prprlive",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#prprlive"},[(0,n.QD)("span",null,"PrprLive")])],-1),h={href:"https://store.steampowered.com/app/1279610/PrprLive/",target:"_blank",rel:"noopener noreferrer"},d=(0,n.QD)("h3",{id:"snap-camera-已下架",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#snap-camera-已下架"},[(0,n.QD)("span",null,"Snap Camera(已下架)")])],-1),g={href:"https://snapcamera.snapchat.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/SnapCamera.gif?imageMogr2/format/webp",alt:"Snap Camera 效果图",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"Snap Camera 效果图")],-1),D=(0,n.QD)("p",null,"Snap Camera 不知为何已经被 Snap 从产品线中移除了,只能用 FaceRig、PrprLive 或其他插件。",-1),f=(0,n.QD)("h2",{id:"动态素材",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#动态素材"},[(0,n.QD)("span",null,"动态素材")])],-1),Y={href:"https://d.appinn.com/bongo-cat-mver/",target:"_blank",rel:"noopener noreferrer"},Q=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-06-30-08-29-40.png",alt:"直播间的猫咪",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"直播间的猫咪")],-1),b=(0,n.QD)("h2",{id:"摄像头多开",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#摄像头多开"},[(0,n.QD)("span",null,"摄像头多开")])],-1),v={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},S=(0,n.QD)("p",null,"例如,摄像头可以同时用于 OBS 直播和 Capture 录屏,在不同用途上可以叠加不同滤镜和特效,呈现出不同的画面。",-1),C=(0,n.QD)("p",null,[(0,n.QD)("strong",null,"使用流程"),(0,n.mY)(":")],-1),k=(0,n.QD)("ol",null,[(0,n.QD)("li",null,"打开 SplitCam,选择默认摄像头。"),(0,n.QD)("li",null,"Snap Camera、Capture 等第三方调用摄像头时,选择「SplitCam Video Driver」。")],-1),w=(0,n.QD)("h2",{id:"其他应用",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#其他应用"},[(0,n.QD)("span",null,"其他应用")])],-1),y=(0,n.QD)("h3",{id:"nvidia-broadcast",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#nvidia-broadcast"},[(0,n.QD)("span",null,"NVIDIA BROADCAST")])],-1),_={href:"https://www.nvidia.cn/geforce/guides/broadcast-app-setup-guide/",target:"_blank",rel:"noopener noreferrer"},B=(0,n.QD)("h3",{id:"小葫芦弹幕助手",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#小葫芦弹幕助手"},[(0,n.QD)("span",null,"小葫芦弹幕助手")])],-1),O={href:"https://www.obsworks.com/danmupro/",target:"_blank",rel:"noopener noreferrer"},x=(0,n.IL)('

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

    小葫芦直播助手集成了 OBS 和弹幕助手的功能,但为了直播的扩展性,仍然建议从 OBS 入门。另外,小葫芦软件似乎都已下架,目前是使用第三方链接。

    咩播云插件

    ',3),I={href:"https://yun.miebo.cn/",target:"_blank",rel:"noopener noreferrer"},z={},A=(0,r(9720).c)(z,[["render",function(e,a){const r=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[t,l,(0,n.QD)("p",null,[(0,n.mY)("推荐使用 "),(0,n.QD)("a",i,[(0,n.mY)("YY 开播"),(0,n.K2)(r)]),(0,n.mY)("来实现直播美颜功能。")]),p,(0,n.QD)("p",null,[(0,n.QD)("a",o,[(0,n.mY)("FaceRig"),(0,n.K2)(r)]),(0,n.mY)("(Steam 已停售)可以通过对五官的动作捕捉,让卡通脸的表情进行同步变化,但不能对头部以下的部分进行捕捉和同步。使用时,需要打开 FaceRig 中的「切换广播」,否则 OBS 窗口会显示为黑屏。")]),s,c,m,(0,n.QD)("p",null,[(0,n.QD)("a",h,[(0,n.mY)("PrprLive"),(0,n.K2)(r)]),(0,n.mY)(" 是国内的变脸软件,基础版免费,同样在 Steam 销售,付费前先试试基础版。")]),d,(0,n.QD)("p",null,[(0,n.QD)("a",g,[(0,n.mY)("Snap Camera"),(0,n.K2)(r)]),(0,n.mY)(" 是 SnapChat 的免费增强现实应用。它可以帮助你在电脑直播/录屏时实现挡脸头套、美化滤镜等特效。如果你熟悉 3D 建模,可以使用 Lens Studio 定制属于你自己的变脸特效。但需要注意的是,当你喝水、低头或脸部被遮挡时,脸部特效会失效。")]),u,D,f,(0,n.QD)("p",null,[(0,n.mY)("为了丰富直播场景,可以使用带绿幕的视频来添加动态特效,或者借助类虚拟主播技术来实现交互。例如 "),(0,n.QD)("a",Y,[(0,n.mY)("Bongo Cat Mver"),(0,n.K2)(r)]),(0,n.mY)(",它能实时同步键盘与鼠标状态,增加直播趣味性。如果你使用的是 Bongo Cat 全键盘同步模型,建议打乱映射规则,以防止隐私泄露。")]),Q,b,(0,n.QD)("p",null,[(0,n.mY)("摄像头默认只能被一个应用调用。借助 "),(0,n.QD)("a",v,[(0,n.mY)("SplitCam"),(0,n.K2)(r)]),(0,n.mY)(",你能在摄像头画面上叠加元素,使用镜像、高亮滤镜微调画面,还能让摄像头画面同步给多个应用。")]),S,C,k,w,y,(0,n.QD)("p",null,[(0,n.mY)("如果你使用的是 NVIDIA 显卡,强烈推荐安装 "),(0,n.QD)("a",_,[(0,n.mY)("NVIDIA Broadcast"),(0,n.K2)(r)]),(0,n.mY)("。它利用 AI 的强大功能将标准网络摄像头和麦克风升级为高端智能设备,通过麦克风去噪、房间回声消除、虚拟背景、网络摄像头人像跟踪和视频降噪等 AI 功能,提高直播的视频和音频质量。通过 NVIDIA RTX GPU 上搭载的名为 Tensor Core 的专用 AI 处理器,AI 网络能够实时运行高质量的效果。")]),B,(0,n.QD)("p",null,[(0,n.QD)("a",O,[(0,n.mY)("小葫芦弹幕助手"),(0,n.K2)(r)]),(0,n.mY)(" 可实时显示网友的互动和打赏,尤其适合游戏直播。但是,由于弹幕答谢、自动定时弹幕、手动弹幕等功能已暂停,不建议新手充值会员。")]),x,(0,n.QD)("p",null,[(0,n.QD)("a",I,[(0,n.mY)("咩播"),(0,n.K2)(r)]),(0,n.mY)(" 不仅能美化软件,现在还支持弹幕展示。该云插件仅支持 B 站、斗鱼和虎牙平台。如果在其他平台直播,则需要使用咩播应用版。")])])}]]),R=JSON.parse('{"path":"/apps/livestreaming/4_live_effects.html","title":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播","lang":"zh-CN","frontmatter":{"title":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播","category":["工具"],"tag":["直播"],"order":4,"description":"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。 美颜 推荐使用 YY 开播来实现直播美颜功能。 打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/4_live_effects.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播"}],["meta",{"property":"og:description","content":"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。 美颜 推荐使用 YY 开播来实现直播美颜功能。 打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20210329092154.gif?imageMogr2/format/webp \\"FaceRig 演示图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播\\",\\"image\\":[\\"https://img.newzone.top/20210329092154.gif?imageMogr2/format/webp \\\\\\"FaceRig 演示图\\\\\\"\\",\\"https://img.newzone.top/SnapCamera.gif?imageMogr2/format/webp \\\\\\"Snap Camera 效果图\\\\\\"\\",\\"https://img.newzone.top/2022-06-30-08-29-40.png \\\\\\"直播间的猫咪\\\\\\"\\"],\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"美颜","slug":"美颜","link":"#美颜","children":[]},{"level":2,"title":"变声","slug":"变声","link":"#变声","children":[]},{"level":2,"title":"虚拟主播","slug":"虚拟主播","link":"#虚拟主播","children":[{"level":3,"title":"FaceRig","slug":"facerig","link":"#facerig","children":[]},{"level":3,"title":"PrprLive","slug":"prprlive","link":"#prprlive","children":[]},{"level":3,"title":"Snap Camera(已下架)","slug":"snap-camera-已下架","link":"#snap-camera-已下架","children":[]}]},{"level":2,"title":"动态素材","slug":"动态素材","link":"#动态素材","children":[]},{"level":2,"title":"摄像头多开","slug":"摄像头多开","link":"#摄像头多开","children":[]},{"level":2,"title":"其他应用","slug":"其他应用","link":"#其他应用","children":[{"level":3,"title":"NVIDIA BROADCAST","slug":"nvidia-broadcast","link":"#nvidia-broadcast","children":[]},{"level":3,"title":"小葫芦弹幕助手","slug":"小葫芦弹幕助手","link":"#小葫芦弹幕助手","children":[]},{"level":3,"title":"咩播云插件","slug":"咩播云插件","link":"#咩播云插件","children":[]}]}],"git":{"createdTime":1673542527000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":4.8,"words":1439},"filePathRelative":"apps/livestreaming/4_live_effects.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    美颜

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6586],{3671:(e,a)=>{a.A=(e,a)=>{const r=e.__vccOpts||e;for(const[e,n]of a)r[e]=n;return r}},5325:(e,a,r)=>{r.r(a),r.d(a,{comp:()=>I,data:()=>z});var n=r(7847);const t=(0,n.Lk)("p",null,"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。",-1),l=(0,n.Lk)("h2",{id:"美颜",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#美颜"},[(0,n.Lk)("span",null,"美颜")])],-1),i={href:"https://v.yy.com/",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Fv)('

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

    使用注意

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

    变声

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

    虚拟主播

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

    FaceRig

    ',8),o={href:"https://store.steampowered.com/app/274920/FaceRig/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/20210329092154.gif?imageMogr2/format/webp",alt:"FaceRig 演示图",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"FaceRig 演示图")],-1),c=(0,n.Lk)("p",null,[(0,n.eW)("注意:百度搜索 FaceRig 的首个结果是"),(0,n.Lk)("strong",null,"虚假官网"),(0,n.eW)(",价格高且无保障,不要在上面进行购买。")],-1),h=(0,n.Lk)("h3",{id:"prprlive",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#prprlive"},[(0,n.Lk)("span",null,"PrprLive")])],-1),d={href:"https://store.steampowered.com/app/1279610/PrprLive/",target:"_blank",rel:"noopener noreferrer"},g=(0,n.Lk)("h3",{id:"snap-camera-已下架",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#snap-camera-已下架"},[(0,n.Lk)("span",null,"Snap Camera(已下架)")])],-1),m={href:"https://snapcamera.snapchat.com/",target:"_blank",rel:"noopener noreferrer"},k=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/SnapCamera.gif?imageMogr2/format/webp",alt:"Snap Camera 效果图",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"Snap Camera 效果图")],-1),u=(0,n.Lk)("p",null,"Snap Camera 不知为何已经被 Snap 从产品线中移除了,只能用 FaceRig、PrprLive 或其他插件。",-1),f=(0,n.Lk)("h2",{id:"动态素材",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#动态素材"},[(0,n.Lk)("span",null,"动态素材")])],-1),L={href:"https://d.appinn.com/bongo-cat-mver/",target:"_blank",rel:"noopener noreferrer"},b=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-06-30-08-29-40.png",alt:"直播间的猫咪",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"直播间的猫咪")],-1),v=(0,n.Lk)("h2",{id:"摄像头多开",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#摄像头多开"},[(0,n.Lk)("span",null,"摄像头多开")])],-1),S={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},Y=(0,n.Lk)("p",null,"例如,摄像头可以同时用于 OBS 直播和 Capture 录屏,在不同用途上可以叠加不同滤镜和特效,呈现出不同的画面。",-1),C=(0,n.Lk)("p",null,[(0,n.Lk)("strong",null,"使用流程"),(0,n.eW)(":")],-1),w=(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,"打开 SplitCam,选择默认摄像头。"),(0,n.Lk)("li",null,"Snap Camera、Capture 等第三方调用摄像头时,选择「SplitCam Video Driver」。")],-1),W=(0,n.Lk)("h2",{id:"其他应用",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#其他应用"},[(0,n.Lk)("span",null,"其他应用")])],-1),y=(0,n.Lk)("h3",{id:"nvidia-broadcast",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#nvidia-broadcast"},[(0,n.Lk)("span",null,"NVIDIA BROADCAST")])],-1),_={href:"https://www.nvidia.cn/geforce/guides/broadcast-app-setup-guide/",target:"_blank",rel:"noopener noreferrer"},B=(0,n.Lk)("h3",{id:"小葫芦弹幕助手",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#小葫芦弹幕助手"},[(0,n.Lk)("span",null,"小葫芦弹幕助手")])],-1),O={href:"https://www.obsworks.com/danmupro/",target:"_blank",rel:"noopener noreferrer"},F=(0,n.Fv)('

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

    小葫芦直播助手集成了 OBS 和弹幕助手的功能,但为了直播的扩展性,仍然建议从 OBS 入门。另外,小葫芦软件似乎都已下架,目前是使用第三方链接。

    咩播云插件

    ',3),x={href:"https://yun.miebo.cn/",target:"_blank",rel:"noopener noreferrer"},A={},I=(0,r(3671).A)(A,[["render",function(e,a){const r=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[t,l,(0,n.Lk)("p",null,[(0,n.eW)("推荐使用 "),(0,n.Lk)("a",i,[(0,n.eW)("YY 开播"),(0,n.bF)(r)]),(0,n.eW)("来实现直播美颜功能。")]),p,(0,n.Lk)("p",null,[(0,n.Lk)("a",o,[(0,n.eW)("FaceRig"),(0,n.bF)(r)]),(0,n.eW)("(Steam 已停售)可以通过对五官的动作捕捉,让卡通脸的表情进行同步变化,但不能对头部以下的部分进行捕捉和同步。使用时,需要打开 FaceRig 中的「切换广播」,否则 OBS 窗口会显示为黑屏。")]),s,c,h,(0,n.Lk)("p",null,[(0,n.Lk)("a",d,[(0,n.eW)("PrprLive"),(0,n.bF)(r)]),(0,n.eW)(" 是国内的变脸软件,基础版免费,同样在 Steam 销售,付费前先试试基础版。")]),g,(0,n.Lk)("p",null,[(0,n.Lk)("a",m,[(0,n.eW)("Snap Camera"),(0,n.bF)(r)]),(0,n.eW)(" 是 SnapChat 的免费增强现实应用。它可以帮助你在电脑直播/录屏时实现挡脸头套、美化滤镜等特效。如果你熟悉 3D 建模,可以使用 Lens Studio 定制属于你自己的变脸特效。但需要注意的是,当你喝水、低头或脸部被遮挡时,脸部特效会失效。")]),k,u,f,(0,n.Lk)("p",null,[(0,n.eW)("为了丰富直播场景,可以使用带绿幕的视频来添加动态特效,或者借助类虚拟主播技术来实现交互。例如 "),(0,n.Lk)("a",L,[(0,n.eW)("Bongo Cat Mver"),(0,n.bF)(r)]),(0,n.eW)(",它能实时同步键盘与鼠标状态,增加直播趣味性。如果你使用的是 Bongo Cat 全键盘同步模型,建议打乱映射规则,以防止隐私泄露。")]),b,v,(0,n.Lk)("p",null,[(0,n.eW)("摄像头默认只能被一个应用调用。借助 "),(0,n.Lk)("a",S,[(0,n.eW)("SplitCam"),(0,n.bF)(r)]),(0,n.eW)(",你能在摄像头画面上叠加元素,使用镜像、高亮滤镜微调画面,还能让摄像头画面同步给多个应用。")]),Y,C,w,W,y,(0,n.Lk)("p",null,[(0,n.eW)("如果你使用的是 NVIDIA 显卡,强烈推荐安装 "),(0,n.Lk)("a",_,[(0,n.eW)("NVIDIA Broadcast"),(0,n.bF)(r)]),(0,n.eW)("。它利用 AI 的强大功能将标准网络摄像头和麦克风升级为高端智能设备,通过麦克风去噪、房间回声消除、虚拟背景、网络摄像头人像跟踪和视频降噪等 AI 功能,提高直播的视频和音频质量。通过 NVIDIA RTX GPU 上搭载的名为 Tensor Core 的专用 AI 处理器,AI 网络能够实时运行高质量的效果。")]),B,(0,n.Lk)("p",null,[(0,n.Lk)("a",O,[(0,n.eW)("小葫芦弹幕助手"),(0,n.bF)(r)]),(0,n.eW)(" 可实时显示网友的互动和打赏,尤其适合游戏直播。但是,由于弹幕答谢、自动定时弹幕、手动弹幕等功能已暂停,不建议新手充值会员。")]),F,(0,n.Lk)("p",null,[(0,n.Lk)("a",x,[(0,n.eW)("咩播"),(0,n.bF)(r)]),(0,n.eW)(" 不仅能美化软件,现在还支持弹幕展示。该云插件仅支持 B 站、斗鱼和虎牙平台。如果在其他平台直播,则需要使用咩播应用版。")])])}]]),z=JSON.parse('{"path":"/apps/livestreaming/4_live_effects.html","title":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播","lang":"zh-CN","frontmatter":{"title":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播","category":["工具"],"tag":["直播"],"order":4,"description":"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。 美颜 推荐使用 YY 开播来实现直播美颜功能。 打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/4_live_effects.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播"}],["meta",{"property":"og:description","content":"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。 美颜 推荐使用 YY 开播来实现直播美颜功能。 打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20210329092154.gif?imageMogr2/format/webp \\"FaceRig 演示图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播\\",\\"image\\":[\\"https://img.newzone.top/20210329092154.gif?imageMogr2/format/webp \\\\\\"FaceRig 演示图\\\\\\"\\",\\"https://img.newzone.top/SnapCamera.gif?imageMogr2/format/webp \\\\\\"Snap Camera 效果图\\\\\\"\\",\\"https://img.newzone.top/2022-06-30-08-29-40.png \\\\\\"直播间的猫咪\\\\\\"\\"],\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"美颜","slug":"美颜","link":"#美颜","children":[]},{"level":2,"title":"变声","slug":"变声","link":"#变声","children":[]},{"level":2,"title":"虚拟主播","slug":"虚拟主播","link":"#虚拟主播","children":[{"level":3,"title":"FaceRig","slug":"facerig","link":"#facerig","children":[]},{"level":3,"title":"PrprLive","slug":"prprlive","link":"#prprlive","children":[]},{"level":3,"title":"Snap Camera(已下架)","slug":"snap-camera-已下架","link":"#snap-camera-已下架","children":[]}]},{"level":2,"title":"动态素材","slug":"动态素材","link":"#动态素材","children":[]},{"level":2,"title":"摄像头多开","slug":"摄像头多开","link":"#摄像头多开","children":[]},{"level":2,"title":"其他应用","slug":"其他应用","link":"#其他应用","children":[{"level":3,"title":"NVIDIA BROADCAST","slug":"nvidia-broadcast","link":"#nvidia-broadcast","children":[]},{"level":3,"title":"小葫芦弹幕助手","slug":"小葫芦弹幕助手","link":"#小葫芦弹幕助手","children":[]},{"level":3,"title":"咩播云插件","slug":"咩播云插件","link":"#咩播云插件","children":[]}]}],"git":{"createdTime":1673542527000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":4.8,"words":1439},"filePathRelative":"apps/livestreaming/4_live_effects.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    美颜

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/5032.c634363a.js b/assets/js/5032.c634363a.js new file mode 100644 index 000000000..6c66e038f --- /dev/null +++ b/assets/js/5032.c634363a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5032],{1501:(t,e,s)=>{s.d(e,{R:()=>h});var i=s(4158);class h{constructor(t){this.Ca=t}Bb(){(0,i.i)(this.ca)&&this.Oe()}ra(){(0,i.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,i.i)(this.ca)||(this.Ca(),this.Oe())}))}}},9610:(t,e,s)=>{s.d(e,{E:()=>r,t:()=>a});var i=s(4158),h=s(4123);function a(t,e=3e3){const s=(0,i.v)();return setTimeout((()=>{const e=t();e&&s.reject(e)}),e),s}class r{constructor(t){this.db=t,this.cb=(0,i.m)(""),this.referrerPolicy=null,t.setAttribute("frameBorder","0"),t.setAttribute("allow","autoplay; fullscreen; encrypted-media; picture-in-picture; accelerometer; gyroscope"),null!==this.referrerPolicy&&t.setAttribute("referrerpolicy",this.referrerPolicy)}get iframe(){return this.db}setup(t){(0,i.e)(this.fd.bind(this)),(0,i.l)(window,"message",this.Lg.bind(this)),(0,i.l)(this.db,"load",this.lc.bind(this))}fd(){const t=this.cb();if(!t.length)return void this.db.setAttribute("src","");const e=(0,i.p)((()=>this.Te()));this.db.setAttribute("src",(0,h.a)(t,e))}gd(t,e){this.db.contentWindow?.postMessage(JSON.stringify(t),e??"*")}Lg(t){const e=this.eb();if(t.source===this.db?.contentWindow&&(!(0,i.r)(e)||e===t.origin)){try{const e=JSON.parse(t.data);return void(e&&this.hd(e,t))}catch(t){}t.data&&this.hd(t.data,t)}}}},5032:(t,e,s)=>{s.r(e),s.d(e,{VimeoProvider:()=>l});var i=s(4158),h=s(8457),a=s(4123),r=s(5781),c=s(5145),n=s(1501),o=s(9610);const d=["bufferend","bufferstart","durationchange","ended","enterpictureinpicture","error","fullscreenchange","leavepictureinpicture","loaded","playProgress","loadProgress","pause","play","playbackratechange","qualitychange","seeked","seeking","timeupdate","volumechange","waiting"];class l extends o.E{constructor(){super(...arguments),this.$$PROVIDER_TYPE="VIMEO",this.scope=(0,i.q)(),this.Fa=0,this.Ga=new h.T(0,0),this.Hb=new h.T(0,0),this.E=null,this.G=null,this.rd=null,this.N=(0,i.m)(""),this.oc=(0,i.m)(!1),this.sd=null,this.V=null,this.eh=null,this.Da=new n.R(this.bd.bind(this)),this.cookies=!1,this.title=!0,this.byline=!0,this.portrait=!0,this.color="00ADEF"}static{this.jd=/(?:https:\/\/)?(?:player\.)?vimeo(?:\.com)?\/(?:video\/)?(\d+)(?:\?hash=(.*))?/}static{this.dh=new Map}get c(){return this.b.delegate.c}get type(){return"vimeo"}get currentSrc(){return this.V}get videoId(){return this.N()}get hash(){return this.sd}get isPro(){return this.oc()}preconnect(){const t=[this.eb(),"https://i.vimeocdn.com","https://f.vimeocdn.com","https://fresnel.vimeocdn.com"];for(const e of t)(0,a.p)(e,"preconnect")}setup(t){this.b=t,super.setup(t),(0,i.e)(this.kd.bind(this)),(0,i.e)(this.fh.bind(this)),(0,i.e)(this.gh.bind(this)),this.c("provider-setup",this)}destroy(){this.H(),this.q("destroy")}async play(){const{paused:t}=this.b.$state;if((0,i.p)(t))return this.E||(this.E=(0,o.t)((()=>{if(this.E=null,t())return"Timed out."})),this.q("play")),this.E.promise}async pause(){const{paused:t}=this.b.$state;if(!(0,i.p)(t))return this.G||(this.G=(0,o.t)((()=>{if(this.G=null,!t())return"Timed out."})),this.q("pause")),this.G.promise}setMuted(t){this.q("setMuted",t)}setCurrentTime(t){this.q("seekTo",t)}setVolume(t){this.q("setVolume",t),this.q("setMuted",(0,i.p)(this.b.$state.muted))}setPlaybackRate(t){this.q("setPlaybackRate",t)}async loadSource(t){if(!(0,i.r)(t.src))return this.V=null,this.sd=null,void this.N.set("");const e=t.src.match(l.jd),s=e?.[1],h=e?.[2];this.N.set(s??""),this.sd=h??null,this.V=t}kd(){this.H();const t=this.N();t?this.cb.set(`${this.eb()}/video/${t}`):this.cb.set("")}fh(){const t=this.cb(),e=this.N(),s=l.dh,h=s.get(e);if(!e)return;const a=(0,i.v)();if(this.rd=a,h)return void a.resolve(h);const r=`https://vimeo.com/api/oembed.json?url=${t}`,n=new AbortController;return window.fetch(r,{mode:"cors",signal:n.signal}).then((t=>t.json())).then((t=>{const i=t?.thumbnail_url?.match(/vimeocdn.com\/video\/(.*)?_/)?.[1],h=i?`https://i.vimeocdn.com/video/${i}_1920x1080.webp`:"",r={title:t?.title??"",duration:t?.duration??0,poster:h,pro:"basic"!==t.account_type};s.set(e,r),a.resolve(r)})).catch((t=>{a.reject(),this.c("error",{message:`Failed to fetch vimeo video info from \`${r}\`.`,code:1,error:(0,c.c)(t)})})),()=>{a.reject(),n.abort()}}gh(){const t=this.oc(),{$state:e,qualities:s}=this.b;if(e.canSetPlaybackRate.set(t),s[r.L.Mc](!t),t)return(0,i.l)(s,"change",(()=>{if(s.auto)return;const t=s.selected?.id;t&&this.q("setQuality",t)}))}eb(){return"https://player.vimeo.com"}Te(){const{$iosControls:t}=this.b,{keyDisabled:e}=this.b.$props,{controls:s,playsinline:i}=this.b.$state,h=s()||t();return{title:this.title,byline:this.byline,color:this.color,portrait:this.portrait,controls:h,h:this.hash,keyboard:h&&!e(),transparent:!0,playsinline:i(),dnt:!this.cookies}}bd(){this.q("getCurrentTime")}Eb(t,e){const{currentTime:s,paused:i,seeking:a,bufferedEnd:r}=this.b.$state;if(a()&&i()&&(this.q("getBuffered"),r()>t&&this.c("seeked",t,e)),s()===t)return;const c=s(),n={currentTime:t,played:this.Fa>=t?this.Ga:this.Ga=new h.T(0,this.Fa=t)};this.c("time-update",n,e),Math.abs(c-t)>1.5&&(this.c("seeking",t,e),!i()&&r(){if(!e)return;const{title:s,poster:i,duration:a,pro:r}=e,{$iosControls:c}=this.b,{controls:n}=this.b.$state,o=n()||c();this.Da.Bb(),this.oc.set(r),this.Hb=new h.T(0,a),this.c("poster-change",i,t),this.c("title-change",s,t),this.c("duration-change",a,t);const d={buffered:new h.T(0,0),seekable:this.Hb,duration:a};this.b.delegate.jc(d,t),o||this.q("_hideOverlay"),this.q("getQualities")})).catch((t=>{e===this.N()&&this.c("error",{message:"Failed to fetch oembed data",code:2,error:(0,c.c)(t)})}))}hh(t,e,s){switch(t){case"getCurrentTime":this.Eb(e,s);break;case"getBuffered":(0,i.w)(e)&&e.length&&this.Ye(e[e.length-1][1],s);break;case"setMuted":this.ab((0,i.p)(this.b.$state.volume),e,s);break;case"getChapters":break;case"getQualities":this.pc(e,s)}}ih(){for(const t of d)this.q("addEventListener",t)}Aa(t){this.c("pause",void 0,t),this.G?.resolve(),this.G=null}xb(t){this.c("play",void 0,t),this.E?.resolve(),this.E=null}jh(t){const{paused:e}=this.b.$state;e()||this.c("playing",void 0,t)}Ye(t,e){const s={buffered:new h.T(0,t),seekable:this.Hb};this.c("progress",s,e)}kh(t){this.c("waiting",void 0,t)}lh(t){const{paused:e}=this.b.$state;e()||this.c("playing",void 0,t)}dd(t){const{paused:e}=this.b.$state;e()&&this.c("play",void 0,t),this.c("waiting",void 0,t)}ab(t,e,s){const i={volume:t,muted:e};this.c("volume-change",i,s)}pc(t,e){this.b.qualities[c.Q.Za]=t.some((t=>"auto"===t.id))?()=>{this.q("setQuality","auto")}:void 0;for(const s of t){if("auto"===s.id)continue;const t=+s.id.slice(0,-1);isNaN(t)||this.b.qualities[r.L.oa]({id:s.id,width:t*(16/9),height:t,codec:"avc1,h.264",bitrate:-1},e)}this.fb(t.find((t=>t.active)),e)}fb({id:t}={},e){if(!t)return;const s="auto"===t,i=this.b.qualities.toArray().find((e=>e.id===t));s?(this.b.qualities[c.Q.Ya](s,e),this.b.qualities[r.L.pa](void 0,!0,e)):this.b.qualities[r.L.pa](i,!0,e)}mh(t,e,s){switch(t){case"ready":this.ih();break;case"loaded":this.md(s);break;case"play":this.xb(s);break;case"playProgress":this.jh(s);break;case"pause":this.Aa(s);break;case"loadProgress":this.Ye(e.seconds,s);break;case"waiting":this.dd(s);break;case"bufferstart":this.kh(s);break;case"bufferend":this.lh(s);break;case"volumechange":this.ab(e.volume,(0,i.p)(this.b.$state.muted),s);break;case"durationchange":this.Hb=new h.T(0,e.duration),this.c("duration-change",e.duration,s);break;case"playbackratechange":this.c("rate-change",e.playbackRate,s);break;case"qualitychange":this.fb(e,s);break;case"fullscreenchange":this.c("fullscreen-change",e.fullscreen,s);break;case"enterpictureinpicture":this.c("picture-in-picture-change",!0,s);break;case"leavepictureinpicture":this.c("picture-in-picture-change",!1,s);break;case"ended":this.c("end",void 0,s);break;case"error":this.U(e,s);break;case"seeked":this.bb(e.seconds,s)}}U(t,e){"play"!==t.method||this.E?.reject(t.message)}hd(t,e){t.event?this.mh(t.event,t.data,e):t.method&&this.hh(t.method,t.value,e)}lc(){}q(t,e){return this.gd({method:t,value:e})}H(){this.Da.ra(),this.Fa=0,this.Ga=new h.T(0,0),this.Hb=new h.T(0,0),this.E=null,this.G=null,this.rd=null,this.eh=null,this.oc.set(!1)}}}}]); \ No newline at end of file diff --git a/assets/js/512.a9650ac0.js b/assets/js/512.a9650ac0.js deleted file mode 100644 index 50624d06e..000000000 --- a/assets/js/512.a9650ac0.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 512.a9650ac0.js.LICENSE.txt */ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[512],{512:(e,t,n)=>{function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);nUo});var p,m,v,d,h,y={},b=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function g(e,t){for(var n in t)e[n]=t[n];return e}function O(e){var t=e.parentNode;t&&t.removeChild(e)}function S(e,t,n){var r,o,i,c=arguments,a={};for(i in t)"key"==i?r=t[i]:"ref"==i?o=t[i]:a[i]=t[i];if(arguments.length>3)for(n=[n],i=3;i0?w(m.type,m.props,m.key,null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=_[s])||p&&m.key==p.key&&m.type===p.type)_[s]=void 0;else for(f=0;f3)for(n=[n],i=3;i=n.__.length&&n.__.push({}),n.__[e]}function oe(e){return Z=1,ie(ve,e)}function ie(e,t,n){var r=re(J++,2);return r.t=e,r.__c||(r.__=[n?n(t):ve(void 0,t),function(e){var t=r.t(r.__[0],e);r.__[0]!==t&&(r.__=[t,r.__[1]],r.__c.setState({}))}],r.__c=$),r.__}function ce(e,t){var n=re(J++,3);!p.__s&&me(n.__H,t)&&(n.__=e,n.__H=t,$.__H.__h.push(n))}function ae(e,t){var n=re(J++,4);!p.__s&&me(n.__H,t)&&(n.__=e,n.__H=t,$.__h.push(n))}function ue(e,t){var n=re(J++,7);return me(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function le(){Y.forEach((function(e){if(e.__P)try{e.__H.__h.forEach(fe),e.__H.__h.forEach(pe),e.__H.__h=[]}catch(t){e.__H.__h=[],p.__e(t,e.__v)}})),Y=[]}p.__b=function(e){$=null,G&&G(e)},p.__r=function(e){X&&X(e),J=0;var t=($=e.__c).__H;t&&(t.__h.forEach(fe),t.__h.forEach(pe),t.__h=[])},p.diffed=function(e){ee&&ee(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==Y.push(t)&&Q===p.requestAnimationFrame||((Q=p.requestAnimationFrame)||function(e){var t,n=function(){clearTimeout(r),se&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);se&&(t=requestAnimationFrame(n))})(le)),$=void 0},p.__c=function(e,t){t.some((function(e){try{e.__h.forEach(fe),e.__h=e.__h.filter((function(e){return!e.__||pe(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],p.__e(n,e.__v)}})),te&&te(e,t)},p.unmount=function(e){ne&&ne(e);var t=e.__c;if(t&&t.__H)try{t.__H.__.forEach(fe)}catch(e){p.__e(e,t.__v)}};var se="function"==typeof requestAnimationFrame;function fe(e){var t=$;"function"==typeof e.__c&&e.__c(),$=t}function pe(e){var t=$;e.__c=e.__(),$=t}function me(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function ve(e,t){return"function"==typeof t?t(e):t}function de(e,t){for(var n in t)e[n]=t[n];return e}function he(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function ye(e){this.props=e}(ye.prototype=new E).isPureReactComponent=!0,ye.prototype.shouldComponentUpdate=function(e,t){return he(this.props,e)||he(this.state,t)};var be=p.__b;p.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),be&&be(e)};var _e="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911,ge=function(e,t){return null==e?null:x(x(e).map(t))},Oe={map:ge,forEach:ge,count:function(e){return e?x(e).length:0},only:function(e){var t=x(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:x},Se=p.__e;function we(){this.__u=0,this.t=null,this.__b=null}function je(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function Ee(){this.u=null,this.o=null}p.__e=function(e,t,n){if(e.then)for(var r,o=t;o=o.__;)if((r=o.__c)&&r.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),r.__c(e,t);Se(e,t,n)},(we.prototype=new E).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var o=je(r.__v),i=!1,c=function(){i||(i=!0,n.componentWillUnmount=n.__c,o?o(a):a())};n.__c=n.componentWillUnmount,n.componentWillUnmount=function(){c(),n.__c&&n.__c()};var a=function(){if(! --r.__u){if(r.state.__e){var e=r.state.__e;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__e:r.__b=null});t=r.t.pop();)t.forceUpdate()}},u=!0===t.__h;r.__u++||u||r.setState({__e:r.__b=r.__v.__k[0]}),e.then(c,c)},we.prototype.componentWillUnmount=function(){this.t=[]},we.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=de({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var o=t.__e&&S(j,null,e.fallback);return o&&(o.__h=null),[S(j,null,t.__e?null:e.children),o]};var Pe=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),W(S(Ie,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function ke(e,t){return S(De,{__v:e,i:t})}(Ee.prototype=new E).__e=function(e){var t=this,n=je(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),Pe(t,e,r)):o()};n?n(i):i()}},Ee.prototype.render=function(e){this.u=null,this.o=new Map;var t=x(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Ee.prototype.componentDidUpdate=Ee.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){Pe(e,n,t)}))};var Ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,Ce=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,xe=function(e){return("undefined"!=typeof Symbol&&"symbol"==i(Symbol())?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Ne(e,t,n){return null==t.__k&&(t.textContent=""),W(e,t),"function"==typeof n&&n(),e?e.__c:null}E.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(E.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var Te=p.event;function Re(){}function qe(){return this.cancelBubble}function Le(){return this.defaultPrevented}p.event=function(e){return Te&&(e=Te(e)),e.persist=Re,e.isPropagationStopped=qe,e.isDefaultPrevented=Le,e.nativeEvent=e};var Me,He={configurable:!0,get:function(){return this.class}},Ue=p.vnode;p.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!xe(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():Ce.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=x(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=x(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(He.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",He)),e.$$typeof=Ae,Ue&&Ue(e)};var Fe=p.__r;p.__r=function(e){Fe&&Fe(e),Me=e.__c};var Be={ReactCurrentDispatcher:{current:{readContext:function(e){return Me.__n[e.__c].props.value}}}};function Ve(e){return!!e&&e.$$typeof===Ae}"object"==("undefined"==typeof performance?"undefined":i(performance))&&"function"==typeof performance.now&&performance.now.bind(performance);var We={useState:oe,useReducer:ie,useEffect:ce,useLayoutEffect:ae,useRef:function(e){return Z=5,ue((function(){return{current:e}}),[])},useImperativeHandle:function(e,t,n){Z=6,ae((function(){"function"==typeof e?e(t()):e&&(e.current=t())}),null==n?n:n.concat(e))},useMemo:ue,useCallback:function(e,t){return Z=8,ue((function(){return e}),t)},useContext:function(e){var t=$.context[e.__c],n=re(J++,9);return n.__c=e,t?(null==n.__&&(n.__=!0,t.sub($)),t.props.value):e.__},useDebugValue:function(e,t){p.useDebugValue&&p.useDebugValue(t?t(e):e)},version:"16.8.0",Children:Oe,render:Ne,hydrate:function(e,t,n){return K(e,t),"function"==typeof n&&n(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(W(null,e),!0)},createPortal:ke,createElement:S,createContext:function(e,t){var n={__c:t="__cC"+h++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(D)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n},createFactory:function(e){return S.bind(null,e)},cloneElement:function(e){return Ve(e)?z.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:j,isValidElement:Ve,findDOMNode:function(e){return e&&(e.base||1===e.nodeType&&e)||null},Component:E,PureComponent:ye,memo:function(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:he(this.props,e)}function r(t){return this.shouldComponentUpdate=n,S(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r},forwardRef:function(e){function t(t,n){var r=de({},t);return delete r.ref,e(r,(n=t.ref||n)&&("object"!=i(n)||"current"in n)?n:null)}return t.$$typeof=_e,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:j,Suspense:we,SuspenseList:Ee,lazy:function(e){var t,n,r;function o(o){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return S(n,o)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Be};function Ke(){return We.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},We.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function ze(){return We.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},We.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var Je=["translations"];function $e(){return $e=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Je),i=r.buttonText,c=void 0===i?"Search":i,a=r.buttonAriaLabel,u=void 0===a?"Search":a,l=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),2!==i.length);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e)||function(e,t){if(e){if("string"==typeof e)return Qe(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Qe(e,2):void 0}}(e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(oe(null)),s=l[0],f=l[1];return ce((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("⌘"):f("Ctrl"))}),[]),We.createElement("button",$e({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),We.createElement("span",{className:"DocSearch-Button-Container"},We.createElement(ze,null),We.createElement("span",{className:"DocSearch-Button-Placeholder"},c)),We.createElement("span",{className:"DocSearch-Button-Keys"},null!==s&&We.createElement(We.Fragment,null,We.createElement("kbd",{className:"DocSearch-Button-Key"},"Ctrl"===s?We.createElement(Ke,null):s),We.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))}));function Ye(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),i=0;ie.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function mt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=3||2===n&&r>=4||1===n&&r>=10);function i(t,n,r){if(o&&void 0!==r){var i=r[0].__autocomplete_algoliaCredentials,c={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(st(n),[{headers:c}]))}else e.apply(void 0,[t].concat(st(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDsAfterSearch",ht(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDs",ht(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDsAfterSearch",ht(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDs",ht(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=pt(t,ut);return[].concat(st(e),st(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}(c),u={current:[]},l=Ye((function(e){var t=e.state;if(t.isOpen){var n=t.collections.reduce((function(e,t){return[].concat(gt(e),gt(t.items))}),[]).filter(bt);nt(u.current.map((function(e){return e.objectID})),n.map((function(e){return e.objectID})))||(u.current=n,n.length>0&&Pt({onItemsChange:r,items:n,insights:a,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;c("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:a}}),n((function(e){var t=e.item,n=e.state,r=e.event;bt(t)&&o({state:n,event:r,insights:a,item:t,insightsEvents:[wt({eventName:"Item Selected"},it({item:t,items:u.current}))]})})),r((function(e){var t=e.item,n=e.state,r=e.event;bt(t)&&i({state:n,event:r,insights:a,item:t,insightsEvents:[wt({eventName:"Item Active"},it({item:t,items:u.current}))]})}))},onStateChange:function(e){var t=e.state;l({state:t})},__autocomplete_pluginOptions:e}}function Dt(e,t){var n=t;return{then:function(t,r){return Dt(e.then(At(t,n,e),At(r,n,e)),n)},catch:function(t){return Dt(e.catch(At(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),Dt(e.finally(At(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function kt(e){return Dt(e,{isCanceled:!1,onCancelList:[]})}function At(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function Ct(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function xt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Nt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,sn);yn&&o.environment.clearTimeout(yn);var l=u.setCollections,s=u.setIsOpen,f=u.setQuery,p=u.setActiveItemId,m=u.setStatus;if(f(i),p(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=a.getState().collections.map((function(e){return pn(pn({},e),{},{items:[]})}));m("idle"),l(d),s(null!==(v=r.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:a.getState()}));var h=kt(bn(d).then((function(){return Promise.resolve()})));return a.pendingRequests.add(h)}m("loading"),yn=o.environment.setTimeout((function(){m("stalled")}),o.stallThreshold);var y=kt(bn(o.getSources(pn({query:i,refresh:c,state:a.getState()},u)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(pn({query:i,refresh:c,state:a.getState()},u))).then((function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(on(Object.keys(n.context).map((function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return nn(nn({},e),{},{requests:e.queries.map((function(n){return{query:"algolia"===e.requesterId?nn(nn({},n),{},{params:nn(nn({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}(t,e.sourceId,a.getState())}))}))).then(un).then((function(t){return function(e,t,n){return t.map((function(t){var r,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),c=o[0].transformResponse,a=c?c({results:r=i,hits:r.map((function(e){return e.hits})).filter(Boolean),facetHits:r.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:a,state:n.getState()}),Array.isArray(a),a.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:a}}))}(t,e,a)})).then((function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce((function(e,t){return Gt(Gt({},e),{},Xt({},t.source.sourceId,Gt(Gt({},t.source),{},{getItems:function(){return Ge(t.items)}})))}),{}),o=t.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:r,state:n}).sourcesBySourceId;return Ge(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:a.getState()})}))})))).then((function(e){var n;m("idle"),l(e);var f=o.shouldPanelOpen({state:a.getState()});s(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!i&&f||f);var p=qt(a.getState());if(null!==a.getState().activeItemId&&p){var v=p.item,d=p.itemInputValue,h=p.itemUrl,y=p.source;y.onActive(pn({event:t,item:v,itemInputValue:d,itemUrl:h,refresh:c,source:y,state:a.getState()},u))}})).finally((function(){m("idle"),yn&&o.environment.clearTimeout(yn)}));return a.pendingRequests.add(y)}function gn(e){return gn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},gn(e)}var On=["event","props","refresh","store"];function Sn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ln(e){return Ln="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ln(e)}function Mn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Hn(e){for(var t=1;t0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(Xe++),plugins:o,initialState:$t({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return zt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return zt(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zt(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:rt,onResolve:rt};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=Nt(Nt({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return Ge(e)})).then((function(e){return e.map((function(e){return $t($t({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:$t({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}(e,t),r=function(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,i){var c=function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,On);if("ArrowUp"===t.key||"ArrowDown"===t.key){var c=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},a=function(){var e=qt(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,c=e.itemInputValue,a=e.itemUrl,u=e.source;u.onActive(wn({event:t,item:n,itemInputValue:c,itemUrl:a,refresh:r,source:u,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?_n(wn({event:t,props:n,query:o.getState().query,refresh:r,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(c,0)})):(o.dispatch(t.key,{}),a(),c())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var u=qt(o.getState()),l=u.item,s=u.itemInputValue,f=u.itemUrl,p=u.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewTab({itemUrl:f,item:l,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),n.navigator.navigateNewWindow({itemUrl:f,item:l,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i)),void n.navigator.navigate({itemUrl:f,item:l,state:o.getState()});_n(wn({event:t,nextState:{isOpen:!1},props:n,query:s,refresh:r,store:o},i)).then((function(){p.onSelect(wn({event:t,item:l,itemInputValue:s,itemUrl:f,refresh:r,source:p,state:o.getState()},i))}))}}}(Tn({event:e,props:t,refresh:n,store:r},o))},onFocus:c,onBlur:rt,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||c(n)}},s)},getPanelProps:function(e){return Tn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.sourceIndex,o=qn(n,Cn);return Tn({role:"listbox","aria-labelledby":"".concat(i(t.id,r),"-label"),id:"".concat(i(t.id,r),"-list")},o)},getItemProps:function(e){var c=e.item,a=e.source,u=e.sourceIndex,l=qn(e,xn);return Tn({id:"".concat(i(t.id,u),"-item-").concat(c.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===c.__autocomplete_id,onMouseMove:function(e){if(c.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",c.__autocomplete_id);var t=qt(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,a=t.itemInputValue,u=t.itemUrl,l=t.source;l.onActive(Tn({event:e,item:i,itemInputValue:a,itemUrl:u,refresh:n,source:l,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=a.getItemInputValue({item:c,state:r.getState()}),u=a.getItemUrl({item:c,state:r.getState()});(u?Promise.resolve():_n(Tn({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:n,store:r},o))).then((function(){a.onSelect(Tn({event:e,item:c,itemInputValue:i,itemUrl:u,refresh:n,source:a,state:r.getState()},o))}))}},l)}}}(Zn({props:n,refresh:c,store:r,navigator:n.navigator},o));function c(){return _n(Zn({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,navigator:n.navigator,query:r.getState().query,refresh:c,store:r},o))}if(e.insights&&!n.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var a="boolean"==typeof e.insights?{}:e.insights;n.plugins.push(It(a))}return n.plugins.forEach((function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Zn(Zn({},o),{},{navigator:n.navigator,refresh:c,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var i=o.document.createElement("meta"),c=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(r),c.appendChild(i)}),0)}}({metadata:Fn({plugins:n.plugins,options:e}),environment:n.environment}),Zn(Zn({refresh:c,navigator:n.navigator},i),o)}function Xn(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,r=void 0===n?"Search by":n;return We.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},We.createElement("span",{className:"DocSearch-Label"},r),We.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},We.createElement("defs",null,We.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),We.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),We.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),We.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),We.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),We.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),We.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),We.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),We.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),We.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function er(e){return We.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},We.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function tr(e){var t=e.translations,n=void 0===t?{}:t,r=n.selectText,o=void 0===r?"to select":r,i=n.selectKeyAriaLabel,c=void 0===i?"Enter key":i,a=n.navigateText,u=void 0===a?"to navigate":a,l=n.navigateUpKeyAriaLabel,s=void 0===l?"Arrow up":l,f=n.navigateDownKeyAriaLabel,p=void 0===f?"Arrow down":f,m=n.closeText,v=void 0===m?"to close":m,d=n.closeKeyAriaLabel,h=void 0===d?"Escape key":d,y=n.searchByText,b=void 0===y?"Search by":y;return We.createElement(We.Fragment,null,We.createElement("div",{className:"DocSearch-Logo"},We.createElement(Xn,{translations:{searchByText:b}})),We.createElement("ul",{className:"DocSearch-Commands"},We.createElement("li",null,We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:c},We.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),We.createElement("span",{className:"DocSearch-Label"},o)),We.createElement("li",null,We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:p},We.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:s},We.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),We.createElement("span",{className:"DocSearch-Label"},u)),We.createElement("li",null,We.createElement("kbd",{className:"DocSearch-Commands-Key"},We.createElement(er,{ariaLabel:h},We.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),We.createElement("span",{className:"DocSearch-Label"},v))))}function nr(e){var t=e.hit,n=e.children;return We.createElement("a",{href:t.url},n)}function rr(){return We.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},We.createElement("g",{fill:"none",fillRule:"evenodd"},We.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},We.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),We.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},We.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function or(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),We.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function ir(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function cr(){return We.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),We.createElement("path",{d:"M8 17l-6-6 6-6"})))}var ar=function(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function ur(e){switch(e.type){case"lvl1":return We.createElement(ar,null);case"content":return We.createElement(sr,null);default:return We.createElement(lr,null)}}function lr(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function sr(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function fr(){return We.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},We.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function pr(){return We.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function mr(){return We.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},We.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function vr(e){var t=e.translations,n=void 0===t?{}:t,r=n.titleText,o=void 0===r?"Unable to fetch results":r,i=n.helpText,c=void 0===i?"You might want to check your network connection.":i;return We.createElement("div",{className:"DocSearch-ErrorScreen"},We.createElement("div",{className:"DocSearch-Screen-Icon"},We.createElement(pr,null)),We.createElement("p",{className:"DocSearch-Title"},o),We.createElement("p",{className:"DocSearch-Help"},c))}var dr=["translations"];function hr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,dr),o=n.noResultsText,i=void 0===o?"No results for":o,c=n.suggestedQueryText,a=void 0===c?"Try searching for":c,u=n.reportMissingResultsText,l=void 0===u?"Believe this query should return results?":u,s=n.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,p=r.state.context.searchSuggestions;return We.createElement("div",{className:"DocSearch-NoResults"},We.createElement("div",{className:"DocSearch-Screen-Icon"},We.createElement(mr,null)),We.createElement("p",{className:"DocSearch-Title"},i,' "',We.createElement("strong",null,r.state.query),'"'),p&&p.length>0&&We.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},We.createElement("p",{className:"DocSearch-Help"},a,":"),We.createElement("ul",null,p.slice(0,3).reduce((function(e,t){return[].concat(function(e){return function(e){if(Array.isArray(e))return hr(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return hr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?hr(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(e),[We.createElement("li",{key:t},We.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){r.setQuery(t.toLowerCase()+" "),r.refresh(),r.inputRef.current.focus()}},t))])}),[]))),r.getMissingResultsUrl&&We.createElement("p",{className:"DocSearch-Help"},"".concat(l," "),We.createElement("a",{href:r.getMissingResultsUrl({query:r.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var br=["hit","attribute","tagName"];function _r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function gr(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,br)),{},{dangerouslySetInnerHTML:{__html:Sr(t,"_snippetResult.".concat(n,".value"))||Sr(t,n)}}))}function jr(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Er(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Er(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Er(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n|<\/mark>)/g,Tr=RegExp(Nr.source);function Rr(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0)||{}).value;return o&&Tr.test(o)?o.replace(Nr,""):o}function qr(){return qr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Mr),o=n.recentSearchesTitle,i=void 0===o?"Recent":o,c=n.noRecentSearchesText,a=void 0===c?"No recent searches":c,u=n.saveRecentSearchButtonTitle,l=void 0===u?"Save this search":u,s=n.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,p=n.favoriteSearchesTitle,m=void 0===p?"Favorite":p,v=n.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===r.state.status&&!1===r.hasCollections?r.disableUserPersonalization?null:We.createElement("div",{className:"DocSearch-StartScreen"},We.createElement("p",{className:"DocSearch-Help"},a)):!1===r.hasCollections?null:We.createElement("div",{className:"DocSearch-Dropdown-Container"},We.createElement(Ir,Hr({},r,{title:i,collection:r.state.collections[0],renderIcon:function(){return We.createElement("div",{className:"DocSearch-Hit-icon"},We.createElement(or,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,o=e.runDeleteTransition;return We.createElement(We.Fragment,null,We.createElement("div",{className:"DocSearch-Hit-action"},We.createElement("button",{className:"DocSearch-Hit-action-button",title:l,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.add(t),r.recentSearches.remove(t),r.refresh()}))}},We.createElement(fr,null))),We.createElement("div",{className:"DocSearch-Hit-action"},We.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){r.recentSearches.remove(t),r.refresh()}))}},We.createElement(ir,null))))}})),We.createElement(Ir,Hr({},r,{title:m,collection:r.state.collections[1],renderIcon:function(){return We.createElement("div",{className:"DocSearch-Hit-icon"},We.createElement(fr,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return We.createElement("div",{className:"DocSearch-Hit-action"},We.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){r.favoriteSearches.remove(t),r.refresh()}))}},We.createElement(ir,null)))}})))}var Fr=["translations"];function Br(){return Br=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Fr);if("error"===r.state.status)return We.createElement(vr,{translations:null==n?void 0:n.errorScreen});var o=r.state.collections.some((function(e){return e.items.length>0}));return r.state.query?!1===o?We.createElement(yr,Br({},r,{translations:null==n?void 0:n.noResultsScreen})):We.createElement(Lr,r):We.createElement(Ur,Br({},r,{hasCollections:o,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),Wr=["translations"];function Kr(){return Kr=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Wr),o=n.resetButtonTitle,i=void 0===o?"Clear the query":o,c=n.resetButtonAriaLabel,a=void 0===c?"Clear the query":c,u=n.cancelButtonText,l=void 0===u?"Cancel":u,s=n.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,p=r.getFormProps({inputElement:r.inputRef.current}).onReset;return We.useEffect((function(){r.autoFocus&&r.inputRef.current&&r.inputRef.current.focus()}),[r.autoFocus,r.inputRef]),We.useEffect((function(){r.isFromSelection&&r.inputRef.current&&r.inputRef.current.select()}),[r.isFromSelection,r.inputRef]),We.createElement(We.Fragment,null,We.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:p},We.createElement("label",Kr({className:"DocSearch-MagnifierLabel"},r.getLabelProps()),We.createElement(ze,null)),We.createElement("div",{className:"DocSearch-LoadingIndicator"},We.createElement(rr,null)),We.createElement("input",Kr({className:"DocSearch-Input",ref:r.inputRef},r.getInputProps({inputElement:r.inputRef.current,autoFocus:r.autoFocus,maxLength:64}))),We.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":a,hidden:!r.state.query},We.createElement(ir,null))),We.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:r.onClose},l))}var Jr=["_highlightResult","_snippetResult"];function $r(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),i=o.getItem().slice(0,r);return{add:function(e){var t=e,n=(t._highlightResult,t._snippetResult,function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(t,Jr)),c=i.findIndex((function(e){return e.objectID===n.objectID}));c>-1&&i.splice(c,1),i.unshift(n),i=i.slice(0,r),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}var Qr=["facetName","facetQuery"];function Zr(e){var t,n="algoliasearch-client-js-".concat(e.key),r=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},o=function(){return JSON.parse(r().getItem(n)||"{}")},i=function(e){r().setItem(n,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,n=o(),r=Object.fromEntries(Object.entries(n).filter((function(e){return void 0!==u(e,2)[1].timestamp})));if(i(r),t){var c=Object.fromEntries(Object.entries(r).filter((function(e){var n=u(e,2)[1],r=(new Date).getTime();return!(n.timestamp+t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return o()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=u(e,2),r=t[0],o=t[1];return Promise.all([r,o||n.miss(r)])})).then((function(e){return u(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},r().setItem(n,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function Yr(e){var t=l(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return u(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch((function(){return Yr({caches:t}).get(e,r,o)}))},set:function(e,r){return n.set(e,r).catch((function(){return Yr({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return Yr({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return Yr({caches:t}).clear()}))}}}function Gr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},i=JSON.stringify(n);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);var c=r(),a=o&&o.miss||function(){return Promise.resolve()};return c.then((function(e){return a(e)})).then((function(){return c}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function Xr(e){for(var t=e.length-1;t>0;t--){var n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function eo(e,t){return t?(Object.keys(t).forEach((function(n){e[n]=t[n](e)})),e):e}function to(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var oo={Read:1,Write:2,Any:3},io=1;function co(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:io;return o(o({},e),{},{status:t,lastUpdate:Date.now()})}function ao(e){return"string"==typeof e?{protocol:"https",url:e,accept:oo.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||oo.Any}}var uo="GET",lo="POST";function so(e,t,n,r){var i=[],c=function(e,t){if(e.method!==uo&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:o(o({},e.data),t.data);return JSON.stringify(n)}}(n,r),a=function(e,t){var n=o(o({},e.headers),t.headers),r={};return Object.keys(n).forEach((function(e){var t=n[e];r[e.toLowerCase()]=t})),r}(e,r),u=n.method,s=n.method!==uo?{}:o(o({},n.data),r.data),f=o(o(o({"x-algolia-agent":e.userAgent.value},e.queryParameters),s),r.queryParameters),p=0,m=function t(o,l){var s=o.pop();if(void 0===s)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:vo(i)};var m={data:c,headers:a,method:u,url:po(s,n.path,f),connectTimeout:l(p,e.timeouts.connect),responseTimeout:l(p,r.timeout)},v=function(e){var t={request:m,response:e,host:s,triesLeft:o.length};return i.push(t),t},d={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var r=v(n);return n.isTimedOut&&p++,Promise.all([e.logger.info("Retryable failure",ho(r)),e.hostsCache.set(s,co(s,n.isTimedOut?3:2))]).then((function(){return t(o,l)}))},onFail:function(e){throw v(e),function(e,t){var n=e.content,r=e.status,o=n;try{o=JSON.parse(n).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(o,r,t)}(e,vo(i))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,n=e.status;return!t&&0==~~n}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,d)}))};return function(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(co(t))}))}))).then((function(e){var n=e.filter((function(e){return function(e){return e.status===io||Date.now()-e.lastUpdate>12e4}(e)})),r=e.filter((function(e){return function(e){return 3===e.status&&Date.now()-e.lastUpdate<=12e4}(e)})),o=[].concat(l(n),l(r));return{getTimeout:function(e,t){return(0===r.length&&0===e?1:r.length+3+e)*t},statelessHosts:o.length>0?o.map((function(e){return ao(e)})):t}}))}(e.hostsCache,t).then((function(e){return m(l(e.statelessHosts).reverse(),e.getTimeout)}))}function fo(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}function po(e,t,n){var r=mo(n),o="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return r.length&&(o+="?".concat(r)),o}function mo(e){return Object.keys(e).map((function(t){return to("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function vo(e){return e.map((function(e){return ho(e)}))}function ho(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return o(o({},e),{},{request:o(o({},e.request),{},{headers:o(o({},e.request.headers),t)})})}var yo=function(e){var t=e.appId,n=function(e,t,n){var r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:function(){return e===no.WithinHeaders?r:{}},queryParameters:function(){return e===no.WithinQueryParameters?r:{}}}}(void 0!==e.authMode?e.authMode:no.WithinHeaders,t,e.apiKey),r=function(e){var t=e.hostsCache,n=e.logger,r=e.requester,o=e.requestsCache,i=e.responsesCache,c=e.timeouts,a=e.userAgent,l=e.hosts,s=e.queryParameters,f={hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:i,timeouts:c,userAgent:a,headers:e.headers,queryParameters:s,hosts:l.map((function(e){return ao(e)})),read:function(e,t){var n=ro(t,f.timeouts.read),r=function(){return so(f,f.hosts.filter((function(e){return 0!=(e.accept&oo.Read)})),e,n)};if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();var o={request:e,mappedRequestOptions:n,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(function(){return f.requestsCache.get(o,(function(){return f.requestsCache.set(o,r()).then((function(e){return Promise.all([f.requestsCache.delete(o),e])}),(function(e){return Promise.all([f.requestsCache.delete(o),Promise.reject(e)])})).then((function(e){var t=u(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(o,e)}})},write:function(e,t){return so(f,f.hosts.filter((function(e){return 0!=(e.accept&oo.Write)})),e,ro(t,f.timeouts.write))}};return f}(o(o({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:oo.Read},{url:"".concat(t,".algolia.net"),accept:oo.Write}].concat(Xr([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:o(o(o({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:o(o({},n.queryParameters()),e.queryParameters)})),i={transporter:r,appId:t,addAlgoliaAgent:function(e,t){r.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([r.requestsCache.clear(),r.responsesCache.clear()]).then((function(){}))}};return eo(i,e.methods)},bo=function(e){return function(t,n){return t.method===uo?e.transporter.read(t,n):e.transporter.write(t,n)}},_o=function(e){return function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return eo({transporter:e.transporter,appId:e.appId,indexName:t},n.methods)}},go=function(e){return function(t,n){var r=t.map((function(e){return o(o({},e),{},{params:mo(e.params||{})})}));return e.transporter.read({method:lo,path:"1/indexes/*/queries",data:{requests:r},cacheable:!0},n)}},Oo=function(e){return function(t,n){return Promise.all(t.map((function(t){var r=t.params,i=r.facetName,c=r.facetQuery,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(r,Qr);return _o(e)(t.indexName,{methods:{searchForFacetValues:jo}}).searchForFacetValues(i,c,o(o({},n),a))})))}},So=function(e){return function(t,n,r){return e.transporter.read({method:lo,path:to("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},r)}},wo=function(e){return function(t,n){return e.transporter.read({method:lo,path:to("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n)}},jo=function(e){return function(t,n,r){return e.transporter.read({method:lo,path:to("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r)}},Eo=1,Po=2,Io=3;function Do(e,t,n){var r,i={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,o=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e)},i=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(i),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(i),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(i),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},logger:(r=Io,{debug:function(e,t){return Eo>=r&&console.debug(e,t),Promise.resolve()},info:function(e,t){return Po>=r&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:Gr(),requestsCache:Gr({serializable:!1}),hostsCache:Yr({caches:[Zr({key:"".concat("4.19.1","-").concat(e)}),Gr()]}),userAgent:fo("4.19.1").add({segment:"Browser",version:"lite"}),authMode:no.WithinQueryParameters};return yo(o(o(o({},i),n),{},{methods:{search:go,searchForFacetValues:Oo,multipleQueries:go,multipleSearchForFacetValues:Oo,customRequest:bo,initIndex:function(e){return function(t){return _o(e)(t,{methods:{search:wo,searchForFacetValues:jo,findAnswers:So}})}}}}))}Do.version="4.19.1";var ko=["footer","searchBox"];function Ao(){return Ao=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(P,ko),N=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),2!==i.length);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e)||function(e,t){if(e){if("string"==typeof e)return To(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?To(e,2):void 0}}(e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(We.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"})),T=N[0],R=N[1],q=We.useRef(null),L=We.useRef(null),M=We.useRef(null),H=We.useRef(null),U=We.useRef(null),F=We.useRef(10),B=We.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,V=We.useRef(j||B).current,W=function(e,t,n){return We.useMemo((function(){var r=Do(e,t);return r.addAlgoliaAgent("docsearch","3.5.2"),!1===/docsearch.js \(.*\)/.test(r.transporter.userAgent.value)&&r.addAlgoliaAgent("docsearch-react","3.5.2"),n(r)}),[e,t,n])}(t,n,g),K=We.useRef($r({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(r),limit:10})).current,z=We.useRef($r({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(r),limit:0===K.getAll().length?7:4})).current,J=We.useCallback((function(e){if(!S){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===K.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&z.add(t)}}),[K,z,S]),$=We.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}}),[T.context.algoliaInsightsPlugin]),Q=We.useMemo((function(){return Gn({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:h,onStateChange:function(e){R(e.state)},getSources:function(e){var o=e.query,i=e.state,u=e.setContext,s=e.setStatus;if(!o)return S?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),Cr(n)||l()},getItemUrl:function(e){return e.item.url},getItems:function(){return z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;J(t),Cr(n)||l()},getItemUrl:function(e){return e.item.url},getItems:function(){return K.getAll()}}];var p=Boolean(k);return W.search([{query:o,indexName:r,params:xo({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(F.current),"hierarchy.lvl2:".concat(F.current),"hierarchy.lvl3:".concat(F.current),"hierarchy.lvl4:".concat(F.current),"hierarchy.lvl5:".concat(F.current),"hierarchy.lvl6:".concat(F.current),"content:".concat(F.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:p},c)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],c=o.hits,s=o.nbHits,m=kr(c,(function(e){return Rr(e)}),a);i.context.searchSuggestions.length0&&(G(),U.current&&U.current.focus())}),[V,G]),We.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),We.createElement("div",Ao({ref:q},Y({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&l()}}),We.createElement("div",{className:"DocSearch-Modal",ref:L},We.createElement("header",{className:"DocSearch-SearchBar",ref:M},We.createElement(zr,Ao({},Q,{state:T,autoFocus:0===V.length,inputRef:U,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:l}))),We.createElement("div",{className:"DocSearch-Dropdown",ref:H},We.createElement(Vr,Ao({},Q,{indexName:r,state:T,hitComponent:m,resultsFooterComponent:d,disableUserPersonalization:S,recentSearches:z,favoriteSearches:K,inputRef:U,translations:x,getMissingResultsUrl:I,onItemClick:function(e,t){$(e),J(e),Cr(t)||l()}}))),We.createElement("footer",{className:"DocSearch-Footer"},We.createElement(tr,{translations:A}))))}function qo(){return qo=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:window;return"string"==typeof e?t.document.querySelector(e):e}(e.container,e.environment))}}}]); \ No newline at end of file diff --git a/assets/js/552.7a8b81db.js b/assets/js/552.7a8b81db.js deleted file mode 100644 index 1ba24a1da..000000000 --- a/assets/js/552.7a8b81db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[552],{888:(t,e,s)=>{s.d(e,{R:()=>h});var i=s(348);class h{constructor(t){this.Ca=t}Bb(){(0,i.i)(this.ca)&&this.Oe()}ra(){(0,i.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,i.i)(this.ca)||(this.Ca(),this.Oe())}))}}},9115:(t,e,s)=>{s.d(e,{E:()=>r,t:()=>a});var i=s(348),h=s(352);function a(t,e=3e3){const s=(0,i.v)();return setTimeout((()=>{const e=t();e&&s.reject(e)}),e),s}class r{constructor(t){this.db=t,this.cb=(0,i.m)(""),this.referrerPolicy=null,t.setAttribute("frameBorder","0"),t.setAttribute("allow","autoplay; fullscreen; encrypted-media; picture-in-picture; accelerometer; gyroscope"),null!==this.referrerPolicy&&t.setAttribute("referrerpolicy",this.referrerPolicy)}get iframe(){return this.db}setup(t){(0,i.e)(this.fd.bind(this)),(0,i.l)(window,"message",this.Lg.bind(this)),(0,i.l)(this.db,"load",this.lc.bind(this))}fd(){const t=this.cb();if(!t.length)return void this.db.setAttribute("src","");const e=(0,i.p)((()=>this.Te()));this.db.setAttribute("src",(0,h.a)(t,e))}gd(t,e){this.db.contentWindow?.postMessage(JSON.stringify(t),e??"*")}Lg(t){const e=this.eb();if(t.source===this.db?.contentWindow&&(!(0,i.r)(e)||e===t.origin)){try{const e=JSON.parse(t.data);return void(e&&this.hd(e,t))}catch(t){}t.data&&this.hd(t.data,t)}}}},552:(t,e,s)=>{s.r(e),s.d(e,{VimeoProvider:()=>l});var i=s(348),h=s(7224),a=s(352),r=s(1716),c=s(4276),n=s(888),o=s(9115);const d=["bufferend","bufferstart","durationchange","ended","enterpictureinpicture","error","fullscreenchange","leavepictureinpicture","loaded","playProgress","loadProgress","pause","play","playbackratechange","qualitychange","seeked","seeking","timeupdate","volumechange","waiting"];class l extends o.E{constructor(){super(...arguments),this.$$PROVIDER_TYPE="VIMEO",this.scope=(0,i.q)(),this.Fa=0,this.Ga=new h.T(0,0),this.Hb=new h.T(0,0),this.E=null,this.G=null,this.rd=null,this.N=(0,i.m)(""),this.oc=(0,i.m)(!1),this.sd=null,this.V=null,this.eh=null,this.Da=new n.R(this.bd.bind(this)),this.cookies=!1,this.title=!0,this.byline=!0,this.portrait=!0,this.color="00ADEF"}static{this.jd=/(?:https:\/\/)?(?:player\.)?vimeo(?:\.com)?\/(?:video\/)?(\d+)(?:\?hash=(.*))?/}static{this.dh=new Map}get c(){return this.b.delegate.c}get type(){return"vimeo"}get currentSrc(){return this.V}get videoId(){return this.N()}get hash(){return this.sd}get isPro(){return this.oc()}preconnect(){const t=[this.eb(),"https://i.vimeocdn.com","https://f.vimeocdn.com","https://fresnel.vimeocdn.com"];for(const e of t)(0,a.p)(e,"preconnect")}setup(t){this.b=t,super.setup(t),(0,i.e)(this.kd.bind(this)),(0,i.e)(this.fh.bind(this)),(0,i.e)(this.gh.bind(this)),this.c("provider-setup",this)}destroy(){this.H(),this.q("destroy")}async play(){const{paused:t}=this.b.$state;if((0,i.p)(t))return this.E||(this.E=(0,o.t)((()=>{if(this.E=null,t())return"Timed out."})),this.q("play")),this.E.promise}async pause(){const{paused:t}=this.b.$state;if(!(0,i.p)(t))return this.G||(this.G=(0,o.t)((()=>{if(this.G=null,!t())return"Timed out."})),this.q("pause")),this.G.promise}setMuted(t){this.q("setMuted",t)}setCurrentTime(t){this.q("seekTo",t)}setVolume(t){this.q("setVolume",t),this.q("setMuted",(0,i.p)(this.b.$state.muted))}setPlaybackRate(t){this.q("setPlaybackRate",t)}async loadSource(t){if(!(0,i.r)(t.src))return this.V=null,this.sd=null,void this.N.set("");const e=t.src.match(l.jd),s=e?.[1],h=e?.[2];this.N.set(s??""),this.sd=h??null,this.V=t}kd(){this.H();const t=this.N();t?this.cb.set(`${this.eb()}/video/${t}`):this.cb.set("")}fh(){const t=this.cb(),e=this.N(),s=l.dh,h=s.get(e);if(!e)return;const a=(0,i.v)();if(this.rd=a,h)return void a.resolve(h);const r=`https://vimeo.com/api/oembed.json?url=${t}`,n=new AbortController;return window.fetch(r,{mode:"cors",signal:n.signal}).then((t=>t.json())).then((t=>{const i=t?.thumbnail_url?.match(/vimeocdn.com\/video\/(.*)?_/)?.[1],h=i?`https://i.vimeocdn.com/video/${i}_1920x1080.webp`:"",r={title:t?.title??"",duration:t?.duration??0,poster:h,pro:"basic"!==t.account_type};s.set(e,r),a.resolve(r)})).catch((t=>{a.reject(),this.c("error",{message:`Failed to fetch vimeo video info from \`${r}\`.`,code:1,error:(0,c.c)(t)})})),()=>{a.reject(),n.abort()}}gh(){const t=this.oc(),{$state:e,qualities:s}=this.b;if(e.canSetPlaybackRate.set(t),s[r.L.Mc](!t),t)return(0,i.l)(s,"change",(()=>{if(s.auto)return;const t=s.selected?.id;t&&this.q("setQuality",t)}))}eb(){return"https://player.vimeo.com"}Te(){const{$iosControls:t}=this.b,{keyDisabled:e}=this.b.$props,{controls:s,playsinline:i}=this.b.$state,h=s()||t();return{title:this.title,byline:this.byline,color:this.color,portrait:this.portrait,controls:h,h:this.hash,keyboard:h&&!e(),transparent:!0,playsinline:i(),dnt:!this.cookies}}bd(){this.q("getCurrentTime")}Eb(t,e){const{currentTime:s,paused:i,seeking:a,bufferedEnd:r}=this.b.$state;if(a()&&i()&&(this.q("getBuffered"),r()>t&&this.c("seeked",t,e)),s()===t)return;const c=s(),n={currentTime:t,played:this.Fa>=t?this.Ga:this.Ga=new h.T(0,this.Fa=t)};this.c("time-update",n,e),Math.abs(c-t)>1.5&&(this.c("seeking",t,e),!i()&&r(){if(!e)return;const{title:s,poster:i,duration:a,pro:r}=e,{$iosControls:c}=this.b,{controls:n}=this.b.$state,o=n()||c();this.Da.Bb(),this.oc.set(r),this.Hb=new h.T(0,a),this.c("poster-change",i,t),this.c("title-change",s,t),this.c("duration-change",a,t);const d={buffered:new h.T(0,0),seekable:this.Hb,duration:a};this.b.delegate.jc(d,t),o||this.q("_hideOverlay"),this.q("getQualities")})).catch((t=>{e===this.N()&&this.c("error",{message:"Failed to fetch oembed data",code:2,error:(0,c.c)(t)})}))}hh(t,e,s){switch(t){case"getCurrentTime":this.Eb(e,s);break;case"getBuffered":(0,i.w)(e)&&e.length&&this.Ye(e[e.length-1][1],s);break;case"setMuted":this.ab((0,i.p)(this.b.$state.volume),e,s);break;case"getChapters":break;case"getQualities":this.pc(e,s)}}ih(){for(const t of d)this.q("addEventListener",t)}Aa(t){this.c("pause",void 0,t),this.G?.resolve(),this.G=null}xb(t){this.c("play",void 0,t),this.E?.resolve(),this.E=null}jh(t){const{paused:e}=this.b.$state;e()||this.c("playing",void 0,t)}Ye(t,e){const s={buffered:new h.T(0,t),seekable:this.Hb};this.c("progress",s,e)}kh(t){this.c("waiting",void 0,t)}lh(t){const{paused:e}=this.b.$state;e()||this.c("playing",void 0,t)}dd(t){const{paused:e}=this.b.$state;e()&&this.c("play",void 0,t),this.c("waiting",void 0,t)}ab(t,e,s){const i={volume:t,muted:e};this.c("volume-change",i,s)}pc(t,e){this.b.qualities[c.Q.Za]=t.some((t=>"auto"===t.id))?()=>{this.q("setQuality","auto")}:void 0;for(const s of t){if("auto"===s.id)continue;const t=+s.id.slice(0,-1);isNaN(t)||this.b.qualities[r.L.oa]({id:s.id,width:t*(16/9),height:t,codec:"avc1,h.264",bitrate:-1},e)}this.fb(t.find((t=>t.active)),e)}fb({id:t}={},e){if(!t)return;const s="auto"===t,i=this.b.qualities.toArray().find((e=>e.id===t));s?(this.b.qualities[c.Q.Ya](s,e),this.b.qualities[r.L.pa](void 0,!0,e)):this.b.qualities[r.L.pa](i,!0,e)}mh(t,e,s){switch(t){case"ready":this.ih();break;case"loaded":this.md(s);break;case"play":this.xb(s);break;case"playProgress":this.jh(s);break;case"pause":this.Aa(s);break;case"loadProgress":this.Ye(e.seconds,s);break;case"waiting":this.dd(s);break;case"bufferstart":this.kh(s);break;case"bufferend":this.lh(s);break;case"volumechange":this.ab(e.volume,(0,i.p)(this.b.$state.muted),s);break;case"durationchange":this.Hb=new h.T(0,e.duration),this.c("duration-change",e.duration,s);break;case"playbackratechange":this.c("rate-change",e.playbackRate,s);break;case"qualitychange":this.fb(e,s);break;case"fullscreenchange":this.c("fullscreen-change",e.fullscreen,s);break;case"enterpictureinpicture":this.c("picture-in-picture-change",!0,s);break;case"leavepictureinpicture":this.c("picture-in-picture-change",!1,s);break;case"ended":this.c("end",void 0,s);break;case"error":this.U(e,s);break;case"seeked":this.bb(e.seconds,s)}}U(t,e){"play"!==t.method||this.E?.reject(t.message)}hd(t,e){t.event?this.mh(t.event,t.data,e):t.method&&this.hh(t.method,t.value,e)}lc(){}q(t,e){return this.gd({method:t,value:e})}H(){this.Da.ra(),this.Fa=0,this.Ga=new h.T(0,0),this.Hb=new h.T(0,0),this.E=null,this.G=null,this.rd=null,this.eh=null,this.oc.set(!1)}}}}]); \ No newline at end of file diff --git a/assets/js/1256.89e06b30.js b/assets/js/5699.b498a9f9.js similarity index 89% rename from assets/js/1256.89e06b30.js rename to assets/js/5699.b498a9f9.js index b78d9e08d..c448acee6 100644 --- a/assets/js/1256.89e06b30.js +++ b/assets/js/5699.b498a9f9.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1256],{1256:(e,n,a)=>{a.r(n),a.d(n,{ParseErrorBuilder:()=>o});var i=a(6632);const o={p:()=>new i.P({code:i.c.BadSignature,reason:"missing WEBVTT file header",line:1}),q:(e,n)=>new i.P({code:i.c.BadTimestamp,reason:`cue start timestamp \`${e}\` is invalid on line ${n}`,line:n}),r:(e,n)=>new i.P({code:i.c.BadTimestamp,reason:`cue end timestamp \`${e}\` is invalid on line ${n}`,line:n}),s:(e,n,a)=>new i.P({code:i.c.BadTimestamp,reason:`cue end timestamp \`${n}\` is greater than start \`${e}\` on line ${a}`,line:a}),w:(e,n,a)=>new i.P({code:i.c.BadSettingValue,reason:`invalid value for cue setting \`${e}\` on line ${a} (value: ${n})`,line:a}),v:(e,n,a)=>new i.P({code:i.c.UnknownSetting,reason:`unknown cue setting \`${e}\` on line ${a} (value: ${n})`,line:a}),u:(e,n,a)=>new i.P({code:i.c.BadSettingValue,reason:`invalid value for region setting \`${e}\` on line ${a} (value: ${n})`,line:a}),t:(e,n,a)=>new i.P({code:i.c.UnknownSetting,reason:`unknown region setting \`${e}\` on line ${a} (value: ${n})`,line:a}),T:(e,n)=>new i.P({code:i.c.BadFormat,reason:`format missing for \`${e}\` block on line ${n}`,line:n})}}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5699],{5699:(e,n,a)=>{a.r(n),a.d(n,{ParseErrorBuilder:()=>o});var i=a(8254);const o={p:()=>new i.P({code:i.c.BadSignature,reason:"missing WEBVTT file header",line:1}),q:(e,n)=>new i.P({code:i.c.BadTimestamp,reason:`cue start timestamp \`${e}\` is invalid on line ${n}`,line:n}),r:(e,n)=>new i.P({code:i.c.BadTimestamp,reason:`cue end timestamp \`${e}\` is invalid on line ${n}`,line:n}),s:(e,n,a)=>new i.P({code:i.c.BadTimestamp,reason:`cue end timestamp \`${n}\` is greater than start \`${e}\` on line ${a}`,line:a}),w:(e,n,a)=>new i.P({code:i.c.BadSettingValue,reason:`invalid value for cue setting \`${e}\` on line ${a} (value: ${n})`,line:a}),v:(e,n,a)=>new i.P({code:i.c.UnknownSetting,reason:`unknown cue setting \`${e}\` on line ${a} (value: ${n})`,line:a}),u:(e,n,a)=>new i.P({code:i.c.BadSettingValue,reason:`invalid value for region setting \`${e}\` on line ${a} (value: ${n})`,line:a}),t:(e,n,a)=>new i.P({code:i.c.UnknownSetting,reason:`unknown region setting \`${e}\` on line ${a} (value: ${n})`,line:a}),T:(e,n)=>new i.P({code:i.c.BadFormat,reason:`format missing for \`${e}\` block on line ${n}`,line:n})}}}]); \ No newline at end of file diff --git a/assets/js/v-81f8b0bc.58c26b91.js b/assets/js/5_live_platforms.html.a4598f92.js similarity index 55% rename from assets/js/v-81f8b0bc.58c26b91.js rename to assets/js/5_live_platforms.html.a4598f92.js index 2581d2ec1..f68173def 100644 --- a/assets/js/v-81f8b0bc.58c26b91.js +++ b/assets/js/5_live_platforms.html.a4598f92.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1360],{9720:(e,t)=>{t.c=(e,t)=>{const l=e.__vccOpts||e;for(const[e,n]of t)l[e]=n;return l}},2016:(e,t,l)=>{l.r(t),l.d(t,{comp:()=>E,data:()=>L});var n=l(3968);const r=(0,n.QD)("p",null,"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。",-1),a=(0,n.QD)("h2",{id:"淘宝直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#淘宝直播"},[(0,n.QD)("span",null,"淘宝直播")])],-1),o={href:"https://market.m.taobao.com/app/mtb/live-portal/download/index.html",target:"_blank",rel:"noopener noreferrer"},i=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-06-29-22-23-26.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"淘宝直播设置")],-1),p=(0,n.QD)("li",null,[(0,n.QD)("p",null,"在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画面。淘宝直播客户端也是基于 OBS,但不支持推流直播,只能通过虚拟摄像头同步画面。")],-1),m={href:"https://liveplatform.taobao.com/restful/index/home/",target:"_blank",rel:"noopener noreferrer"},h=(0,n.QD)("h2",{id:"抖音直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#抖音直播"},[(0,n.QD)("span",null,"抖音直播")])],-1),u={href:"https://www.douyin.com/falcon/webcast_openpc/pages/streamingtool_download/index.html",target:"_blank",rel:"noopener noreferrer"},s=(0,n.QD)("li",null,[(0,n.QD)("p",null,"在左侧点击「添加元素」>「采集」,选择「OBS-Camera」(摄像头较多时,可下滑选择),设置采集自定义音频设备为「OBS-Audio」,声音改为单声道。"),(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-06-29-23-59-02.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"抖音直播设置")])],-1),c={href:"http://streamingtool.douyin.com/docs/guide/96319/",target:"_blank",rel:"noopener noreferrer"},d=(0,n.QD)("h2",{id:"快手直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#快手直播"},[(0,n.QD)("span",null,"快手直播")])],-1),g={href:"https://studio.kuaishou.com/profile",target:"_blank",rel:"noopener noreferrer"},D=(0,n.QD)("h2",{id:"视频号直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#视频号直播"},[(0,n.QD)("span",null,"视频号直播")])],-1),Q={href:"https://channels.weixin.qq.com/platform/live/apply",target:"_blank",rel:"noopener noreferrer"},f=(0,n.QD)("p",null,[(0,n.mY)("视频号认证最重要的一环是"),(0,n.QD)("strong",null,"有效关注数 1000 人以上"),(0,n.mY)(",可疑和外挂用户都不包含在有效人数内。达到 1000 有效粉丝后,就可以在视频号助手网页端发起直播推流了。")],-1),b=(0,n.QD)("h2",{id:"b-站直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#b-站直播"},[(0,n.QD)("span",null,"B 站直播")])],-1),Y={href:"https://link.bilibili.com/p/eden/download#/web",target:"_blank",rel:"noopener noreferrer"},k={href:"https://link.bilibili.com/p/center/index#/my-room/start-live",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/iwxyi/Bilibili-MagicalDanmaku",target:"_blank",rel:"noopener noreferrer"},_=(0,n.QD)("h2",{id:"知乎直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#知乎直播"},[(0,n.QD)("span",null,"知乎直播")])],-1),y={href:"https://www.zhihu.com/creator/streaming/push",target:"_blank",rel:"noopener noreferrer"},v=(0,n.QD)("p",null,"知乎直播注意:",-1),x=(0,n.QD)("ul",null,[(0,n.QD)("li",null,"推流直播不能与第三方连接谈话;手机直播不支持绿幕抠图。"),(0,n.QD)("li",null,"当你在电脑直播时,用手机进入知乎客户端,会提示「是否继续直播」,选择「继续」可进入直播界面与观众互动,选「忽略」则停止直播。"),(0,n.QD)("li",null,"如果直播时间超过一个月,小葫芦直播码会失效,无法继续使用小葫芦直播助手和弹幕助手。")],-1),B=(0,n.QD)("h2",{id:"小红书直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#小红书直播"},[(0,n.QD)("span",null,"小红书直播")])],-1),O={href:"http://www.xiaohongshu.com/zhibo/robs",target:"_blank",rel:"noopener noreferrer"},S=(0,n.QD)("a",{href:"ttps://fe-video-qc.xhscdn.com/fe-platform/f03ae58e50e6d53580fa16a58e9dffbbbabbb5f0.pdf"},"官方文档",-1),z=(0,n.QD)("p",null,"当我登录直播助手时,提示「暂无直播权限,请联系运营及客服开通」,但手机却可以直播,这说明提示中的直播权限专指电脑端直播。因此,我在应用中提交了问题,但一直未收到客服回复。",-1),C=(0,n.QD)("h2",{id:"微博直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#微博直播"},[(0,n.QD)("span",null,"微博直播")])],-1),K={href:"https://weibo.com/manage/frame?furl=https%3A%2F%2Fweibo.com%2Fl%2Fwblive%2Fadmin%2Fhome%2Fauthentication",target:"_blank",rel:"noopener noreferrer"},T={href:"https://weibo.com/l/wblive/act/k2mw80kz3kw0",target:"_blank",rel:"noopener noreferrer"},P=(0,n.QD)("h2",{id:"youtube-直播",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#youtube-直播"},[(0,n.QD)("span",null,"Youtube 直播")])],-1),F=(0,n.QD)("p",null,"如果您在过去 90 天内没有进行 YouTube 直播,平台会要求验证您的频道。首次启用直播功能可能需要最长等待 24 小时。",-1),q={href:"http://youtube.com/livestreaming",target:"_blank",rel:"noopener noreferrer"},A=(0,n.QD)("li",null,"点击直播标签页或为新直播安排时间。",-1),N=(0,n.QD)("li",null,"从直播控制室复制直播网址和直播码,然后将其粘贴到编码器中。",-1),Z={},E=(0,l(9720).c)(Z,[["render",function(e,t){const l=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[r,a,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("下载"),(0,n.QD)("a",o,[(0,n.mY)("淘宝直播客户端"),(0,n.K2)(l)]),(0,n.mY)(",打开后点击「我要开播」,进入直播间界面。")]),i]),p]),(0,n.QD)("p",null,[(0,n.mY)("除了客户端,还可以通过"),(0,n.QD)("a",m,[(0,n.mY)("直播中控台"),(0,n.K2)(l)]),(0,n.mY)("来设置淘宝直播间。")]),h,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("下载"),(0,n.QD)("a",u,[(0,n.mY)("直播伴侣电脑端"),(0,n.K2)(l)]),(0,n.mY)(",它可以适配西瓜视频、抖音、抖音火山版的直播。")])]),s]),(0,n.QD)("p",null,[(0,n.mY)("以上为抖音新手的电脑直播步骤,如果你的抖音粉丝在一万以上,可以使用 "),(0,n.QD)("a",c,[(0,n.mY)("OBS 模式推流"),(0,n.K2)(l)]),(0,n.mY)("。")]),d,(0,n.QD)("p",null,[(0,n.mY)("快手直播无需 PC 客户端,可在"),(0,n.QD)("a",g,[(0,n.mY)("快手云直播"),(0,n.K2)(l)]),(0,n.mY)("页面配置直播间,支持 OBS 模式推流直播。若直播断流超过 2 分钟或直播超过 7 天,则会自动下播。")]),D,(0,n.QD)("p",null,[(0,n.mY)("要使用电脑直播视频号,需要先完成"),(0,n.QD)("a",Q,[(0,n.mY)("视频号认证"),(0,n.K2)(l)]),(0,n.mY)("。")]),f,b,(0,n.QD)("p",null,[(0,n.mY)("哔哩哔哩可以在"),(0,n.QD)("a",Y,[(0,n.mY)("直播姬客户端"),(0,n.K2)(l)]),(0,n.mY)("或"),(0,n.QD)("a",k,[(0,n.mY)("B 站直播间网页端"),(0,n.K2)(l)]),(0,n.mY)("上进行在线直播。直播封面必须包含图像,不支持纯文本封面。")]),(0,n.QD)("p",null,[(0,n.mY)("如果你主做 B 站直播,可以试试哔哩哔哩直播机器人"),(0,n.QD)("a",w,[(0,n.mY)("神奇弹幕"),(0,n.K2)(l)]),(0,n.mY)(",它集成了弹幕姬、答谢姬、点歌姬、回复姬和工作流 (workflow),支持弹幕聊天、观众互动、自动点歌、数据统计、私信处理等功能。这个应用看起来很有趣,我还没有使用过。")]),_,(0,n.QD)("p",null,[(0,n.mY)("在"),(0,n.QD)("a",y,[(0,n.mY)("知乎推流直播"),(0,n.K2)(l)]),(0,n.mY)("页面开启直播后,就可以使用知乎的电脑直播。")]),v,x,B,(0,n.QD)("p",null,[(0,n.mY)("小红书使用"),(0,n.QD)("a",O,[(0,n.mY)("直播助手"),(0,n.K2)(l)]),(0,n.mY)("来设置推流,可以查看"),S,(0,n.mY)(" 了解开播步骤。")]),z,C,(0,n.QD)("p",null,[(0,n.mY)("微博直播需先完成实名认证,然后在"),(0,n.QD)("a",K,[(0,n.mY)("微博管理中心"),(0,n.K2)(l)]),(0,n.mY)("创建直播。详细的开播步骤,可以参考官方的"),(0,n.QD)("a",T,[(0,n.mY)("微博 PC 开播教程"),(0,n.K2)(l)]),(0,n.mY)("。")]),P,F,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.mY)("打开 "),(0,n.QD)("a",q,[(0,n.mY)("YouTube 直播控制室"),(0,n.K2)(l)]),(0,n.mY)("。")]),A,N])])}]]),L=JSON.parse('{"path":"/apps/livestreaming/5_live_platforms.html","title":"直播入门攻略五 | 平台篇:主流直播平台介绍","lang":"zh-CN","frontmatter":{"title":"直播入门攻略五 | 平台篇:主流直播平台介绍","category":["工具"],"tag":["直播"],"order":5,"description":"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。 淘宝直播 下载淘宝直播客户端,打开后点击「我要开播」,进入直播间界面。 淘宝直播设置 在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/5_live_platforms.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略五 | 平台篇:主流直播平台介绍"}],["meta",{"property":"og:description","content":"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。 淘宝直播 下载淘宝直播客户端,打开后点击「我要开播」,进入直播间界面。 淘宝直播设置 在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-29-22-23-26.png \\"淘宝直播设置\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略五 | 平台篇:主流直播平台介绍"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略五 | 平台篇:主流直播平台介绍\\",\\"image\\":[\\"https://img.newzone.top/2022-06-29-22-23-26.png \\\\\\"淘宝直播设置\\\\\\"\\",\\"https://img.newzone.top/2022-06-29-23-59-02.png \\\\\\"抖音直播设置\\\\\\"\\"],\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"淘宝直播","slug":"淘宝直播","link":"#淘宝直播","children":[]},{"level":2,"title":"抖音直播","slug":"抖音直播","link":"#抖音直播","children":[]},{"level":2,"title":"快手直播","slug":"快手直播","link":"#快手直播","children":[]},{"level":2,"title":"视频号直播","slug":"视频号直播","link":"#视频号直播","children":[]},{"level":2,"title":"B 站直播","slug":"b-站直播","link":"#b-站直播","children":[]},{"level":2,"title":"知乎直播","slug":"知乎直播","link":"#知乎直播","children":[]},{"level":2,"title":"小红书直播","slug":"小红书直播","link":"#小红书直播","children":[]},{"level":2,"title":"微博直播","slug":"微博直播","link":"#微博直播","children":[]},{"level":2,"title":"Youtube 直播","slug":"youtube-直播","link":"#youtube-直播","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":3.65,"words":1094},"filePathRelative":"apps/livestreaming/5_live_platforms.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    淘宝直播

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      淘宝直播设置
      \\n
    2. \\n
    3. \\n

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

      \\n
    4. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5781],{3671:(e,t)=>{t.A=(e,t)=>{const l=e.__vccOpts||e;for(const[e,n]of t)l[e]=n;return l}},6614:(e,t,l)=>{l.r(t),l.d(t,{comp:()=>E,data:()=>M});var n=l(7847);const r=(0,n.Lk)("p",null,"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。",-1),a=(0,n.Lk)("h2",{id:"淘宝直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#淘宝直播"},[(0,n.Lk)("span",null,"淘宝直播")])],-1),o={href:"https://market.m.taobao.com/app/mtb/live-portal/download/index.html",target:"_blank",rel:"noopener noreferrer"},i=(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-06-29-22-23-26.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"淘宝直播设置")],-1),p=(0,n.Lk)("li",null,[(0,n.Lk)("p",null,"在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画面。淘宝直播客户端也是基于 OBS,但不支持推流直播,只能通过虚拟摄像头同步画面。")],-1),k={href:"https://liveplatform.taobao.com/restful/index/home/",target:"_blank",rel:"noopener noreferrer"},u=(0,n.Lk)("h2",{id:"抖音直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#抖音直播"},[(0,n.Lk)("span",null,"抖音直播")])],-1),h={href:"https://www.douyin.com/falcon/webcast_openpc/pages/streamingtool_download/index.html",target:"_blank",rel:"noopener noreferrer"},s=(0,n.Lk)("li",null,[(0,n.Lk)("p",null,"在左侧点击「添加元素」>「采集」,选择「OBS-Camera」(摄像头较多时,可下滑选择),设置采集自定义音频设备为「OBS-Audio」,声音改为单声道。"),(0,n.Lk)("figure",null,[(0,n.Lk)("img",{src:"https://img.newzone.top/2022-06-29-23-59-02.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.Lk)("figcaption",null,"抖音直播设置")])],-1),c={href:"http://streamingtool.douyin.com/docs/guide/96319/",target:"_blank",rel:"noopener noreferrer"},m=(0,n.Lk)("h2",{id:"快手直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#快手直播"},[(0,n.Lk)("span",null,"快手直播")])],-1),d={href:"https://studio.kuaishou.com/profile",target:"_blank",rel:"noopener noreferrer"},b=(0,n.Lk)("h2",{id:"视频号直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#视频号直播"},[(0,n.Lk)("span",null,"视频号直播")])],-1),g={href:"https://channels.weixin.qq.com/platform/live/apply",target:"_blank",rel:"noopener noreferrer"},L=(0,n.Lk)("p",null,[(0,n.eW)("视频号认证最重要的一环是"),(0,n.Lk)("strong",null,"有效关注数 1000 人以上"),(0,n.eW)(",可疑和外挂用户都不包含在有效人数内。达到 1000 有效粉丝后,就可以在视频号助手网页端发起直播推流了。")],-1),f=(0,n.Lk)("h2",{id:"b-站直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#b-站直播"},[(0,n.Lk)("span",null,"B 站直播")])],-1),W={href:"https://link.bilibili.com/p/eden/download#/web",target:"_blank",rel:"noopener noreferrer"},w={href:"https://link.bilibili.com/p/center/index#/my-room/start-live",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/iwxyi/Bilibili-MagicalDanmaku",target:"_blank",rel:"noopener noreferrer"},y=(0,n.Lk)("h2",{id:"知乎直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#知乎直播"},[(0,n.Lk)("span",null,"知乎直播")])],-1),v={href:"https://www.zhihu.com/creator/streaming/push",target:"_blank",rel:"noopener noreferrer"},x=(0,n.Lk)("p",null,"知乎直播注意:",-1),B=(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,"推流直播不能与第三方连接谈话;手机直播不支持绿幕抠图。"),(0,n.Lk)("li",null,"当你在电脑直播时,用手机进入知乎客户端,会提示「是否继续直播」,选择「继续」可进入直播界面与观众互动,选「忽略」则停止直播。"),(0,n.Lk)("li",null,"如果直播时间超过一个月,小葫芦直播码会失效,无法继续使用小葫芦直播助手和弹幕助手。")],-1),F=(0,n.Lk)("h2",{id:"小红书直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#小红书直播"},[(0,n.Lk)("span",null,"小红书直播")])],-1),O={href:"http://www.xiaohongshu.com/zhibo/robs",target:"_blank",rel:"noopener noreferrer"},S=(0,n.Lk)("a",{href:"ttps://fe-video-qc.xhscdn.com/fe-platform/f03ae58e50e6d53580fa16a58e9dffbbbabbb5f0.pdf"},"官方文档",-1),z=(0,n.Lk)("p",null,"当我登录直播助手时,提示「暂无直播权限,请联系运营及客服开通」,但手机却可以直播,这说明提示中的直播权限专指电脑端直播。因此,我在应用中提交了问题,但一直未收到客服回复。",-1),C=(0,n.Lk)("h2",{id:"微博直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#微博直播"},[(0,n.Lk)("span",null,"微博直播")])],-1),T={href:"https://weibo.com/manage/frame?furl=https%3A%2F%2Fweibo.com%2Fl%2Fwblive%2Fadmin%2Fhome%2Fauthentication",target:"_blank",rel:"noopener noreferrer"},P={href:"https://weibo.com/l/wblive/act/k2mw80kz3kw0",target:"_blank",rel:"noopener noreferrer"},Y=(0,n.Lk)("h2",{id:"youtube-直播",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#youtube-直播"},[(0,n.Lk)("span",null,"Youtube 直播")])],-1),A=(0,n.Lk)("p",null,"如果您在过去 90 天内没有进行 YouTube 直播,平台会要求验证您的频道。首次启用直播功能可能需要最长等待 24 小时。",-1),q={href:"http://youtube.com/livestreaming",target:"_blank",rel:"noopener noreferrer"},D=(0,n.Lk)("li",null,"点击直播标签页或为新直播安排时间。",-1),N=(0,n.Lk)("li",null,"从直播控制室复制直播网址和直播码,然后将其粘贴到编码器中。",-1),Z={},E=(0,l(3671).A)(Z,[["render",function(e,t){const l=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[r,a,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("下载"),(0,n.Lk)("a",o,[(0,n.eW)("淘宝直播客户端"),(0,n.bF)(l)]),(0,n.eW)(",打开后点击「我要开播」,进入直播间界面。")]),i]),p]),(0,n.Lk)("p",null,[(0,n.eW)("除了客户端,还可以通过"),(0,n.Lk)("a",k,[(0,n.eW)("直播中控台"),(0,n.bF)(l)]),(0,n.eW)("来设置淘宝直播间。")]),u,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("下载"),(0,n.Lk)("a",h,[(0,n.eW)("直播伴侣电脑端"),(0,n.bF)(l)]),(0,n.eW)(",它可以适配西瓜视频、抖音、抖音火山版的直播。")])]),s]),(0,n.Lk)("p",null,[(0,n.eW)("以上为抖音新手的电脑直播步骤,如果你的抖音粉丝在一万以上,可以使用 "),(0,n.Lk)("a",c,[(0,n.eW)("OBS 模式推流"),(0,n.bF)(l)]),(0,n.eW)("。")]),m,(0,n.Lk)("p",null,[(0,n.eW)("快手直播无需 PC 客户端,可在"),(0,n.Lk)("a",d,[(0,n.eW)("快手云直播"),(0,n.bF)(l)]),(0,n.eW)("页面配置直播间,支持 OBS 模式推流直播。若直播断流超过 2 分钟或直播超过 7 天,则会自动下播。")]),b,(0,n.Lk)("p",null,[(0,n.eW)("要使用电脑直播视频号,需要先完成"),(0,n.Lk)("a",g,[(0,n.eW)("视频号认证"),(0,n.bF)(l)]),(0,n.eW)("。")]),L,f,(0,n.Lk)("p",null,[(0,n.eW)("哔哩哔哩可以在"),(0,n.Lk)("a",W,[(0,n.eW)("直播姬客户端"),(0,n.bF)(l)]),(0,n.eW)("或"),(0,n.Lk)("a",w,[(0,n.eW)("B 站直播间网页端"),(0,n.bF)(l)]),(0,n.eW)("上进行在线直播。直播封面必须包含图像,不支持纯文本封面。")]),(0,n.Lk)("p",null,[(0,n.eW)("如果你主做 B 站直播,可以试试哔哩哔哩直播机器人"),(0,n.Lk)("a",_,[(0,n.eW)("神奇弹幕"),(0,n.bF)(l)]),(0,n.eW)(",它集成了弹幕姬、答谢姬、点歌姬、回复姬和工作流 (workflow),支持弹幕聊天、观众互动、自动点歌、数据统计、私信处理等功能。这个应用看起来很有趣,我还没有使用过。")]),y,(0,n.Lk)("p",null,[(0,n.eW)("在"),(0,n.Lk)("a",v,[(0,n.eW)("知乎推流直播"),(0,n.bF)(l)]),(0,n.eW)("页面开启直播后,就可以使用知乎的电脑直播。")]),x,B,F,(0,n.Lk)("p",null,[(0,n.eW)("小红书使用"),(0,n.Lk)("a",O,[(0,n.eW)("直播助手"),(0,n.bF)(l)]),(0,n.eW)("来设置推流,可以查看"),S,(0,n.eW)(" 了解开播步骤。")]),z,C,(0,n.Lk)("p",null,[(0,n.eW)("微博直播需先完成实名认证,然后在"),(0,n.Lk)("a",T,[(0,n.eW)("微博管理中心"),(0,n.bF)(l)]),(0,n.eW)("创建直播。详细的开播步骤,可以参考官方的"),(0,n.Lk)("a",P,[(0,n.eW)("微博 PC 开播教程"),(0,n.bF)(l)]),(0,n.eW)("。")]),Y,A,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.eW)("打开 "),(0,n.Lk)("a",q,[(0,n.eW)("YouTube 直播控制室"),(0,n.bF)(l)]),(0,n.eW)("。")]),D,N])])}]]),M=JSON.parse('{"path":"/apps/livestreaming/5_live_platforms.html","title":"直播入门攻略五 | 平台篇:主流直播平台介绍","lang":"zh-CN","frontmatter":{"title":"直播入门攻略五 | 平台篇:主流直播平台介绍","category":["工具"],"tag":["直播"],"order":5,"description":"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。 淘宝直播 下载淘宝直播客户端,打开后点击「我要开播」,进入直播间界面。 淘宝直播设置 在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/5_live_platforms.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略五 | 平台篇:主流直播平台介绍"}],["meta",{"property":"og:description","content":"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。 淘宝直播 下载淘宝直播客户端,打开后点击「我要开播」,进入直播间界面。 淘宝直播设置 在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-29-22-23-26.png \\"淘宝直播设置\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"直播入门攻略五 | 平台篇:主流直播平台介绍"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略五 | 平台篇:主流直播平台介绍\\",\\"image\\":[\\"https://img.newzone.top/2022-06-29-22-23-26.png \\\\\\"淘宝直播设置\\\\\\"\\",\\"https://img.newzone.top/2022-06-29-23-59-02.png \\\\\\"抖音直播设置\\\\\\"\\"],\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"淘宝直播","slug":"淘宝直播","link":"#淘宝直播","children":[]},{"level":2,"title":"抖音直播","slug":"抖音直播","link":"#抖音直播","children":[]},{"level":2,"title":"快手直播","slug":"快手直播","link":"#快手直播","children":[]},{"level":2,"title":"视频号直播","slug":"视频号直播","link":"#视频号直播","children":[]},{"level":2,"title":"B 站直播","slug":"b-站直播","link":"#b-站直播","children":[]},{"level":2,"title":"知乎直播","slug":"知乎直播","link":"#知乎直播","children":[]},{"level":2,"title":"小红书直播","slug":"小红书直播","link":"#小红书直播","children":[]},{"level":2,"title":"微博直播","slug":"微博直播","link":"#微博直播","children":[]},{"level":2,"title":"Youtube 直播","slug":"youtube-直播","link":"#youtube-直播","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":3.65,"words":1094},"filePathRelative":"apps/livestreaming/5_live_platforms.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    淘宝直播

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      淘宝直播设置
      \\n
    2. \\n
    3. \\n

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

      \\n
    4. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/6128.2aff4cb1.js b/assets/js/6128.2aff4cb1.js deleted file mode 100644 index 7e123fe8b..000000000 --- a/assets/js/6128.2aff4cb1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6128,1984],{888:(t,i,s)=>{s.d(i,{R:()=>a});var e=s(348);class a{constructor(t){this.Ca=t}Bb(){(0,e.i)(this.ca)&&this.Oe()}ra(){(0,e.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,e.i)(this.ca)||(this.Ca(),this.Oe())}))}}},6128:(t,i,s)=>{s.r(i),s.d(i,{HLSProvider:()=>l});var e=s(352),a=s(1716),h=s(9604),r=s(348),n=s(4276),c=s(888);class d{constructor(t){this.m=t,this.g=null,this.nd=null,this.od={},this.pd=new Set,this.yk=-1}get instance(){return this.g}setup(t,i){this.b=i;const s=(0,r.p)(i.$state.streamType).includes("live"),e=(0,r.p)(i.$state.streamType).includes("ll-");this.g=new t({lowLatencyMode:e,backBufferLength:e?4:s?8:void 0,renderTextTracksNatively:!1,...this.od});const a=this.Sg.bind(this);for(const i of Object.values(t.Events))this.g.on(i,a);this.g.on(t.Events.ERROR,this.U.bind(this));for(const t of this.pd)t(this.g);i.player.dispatch(new r.D("hls-instance",{detail:this.g})),this.g.attachMedia(this.m),this.g.on(t.Events.FRAG_LOADING,this.Bk.bind(this)),this.g.on(t.Events.AUDIO_TRACK_SWITCHED,this.Tg.bind(this)),this.g.on(t.Events.LEVEL_SWITCHED,this.Ug.bind(this)),this.g.on(t.Events.LEVEL_LOADED,this.Vg.bind(this)),this.g.on(t.Events.NON_NATIVE_TEXT_TRACKS_FOUND,this.Wg.bind(this)),this.g.on(t.Events.CUES_PARSED,this.Xg.bind(this)),i.qualities[n.Q.Za]=this.Yg.bind(this),(0,r.l)(i.qualities,"change",this.fb.bind(this)),(0,r.l)(i.audioTracks,"change",this.Zg.bind(this)),this.nd=(0,r.e)(this._g.bind(this))}_g(){if(!this.b.$state.live())return;const t=new c.R(this.$g.bind(this));return t.Bb(),t.ra.bind(t)}$g(){this.b.$state.liveSyncPosition.set(this.g?.liveSyncPosition??1/0)}Sg(t,i){var s;this.b.player?.dispatch(new r.D((s=t,(0,r.K)(s)),{detail:i}))}Wg(t,i){const s=new r.D(t,{detail:i});let a=-1;for(let t=0;t{"showing"===n.mode?(this.g.subtitleTrack=t,a=t):a===t&&(this.g.subtitleTrack=-1,a=-1)},h.default&&n.setMode("showing",s),this.b.textTracks.add(n,s)}}Xg(t,i){const s=this.b.textTracks.getById(`hls-${i.track}`);if(!s)return;const e=new r.D(t,{detail:i});for(const t of i.cues)t.positionAlign="auto",s.addCue(t,e)}Tg(t,i){const s=this.b.audioTracks[i.id];s&&this.b.audioTracks[a.L.pa](s,!0,new r.D(t,{detail:i}))}Ug(t,i){const s=this.b.qualities[i.level];s&&this.b.qualities[a.L.pa](s,!0,new r.D(t,{detail:i}))}Vg(t,i){if(this.b.$state.canPlay())return;const{type:s,live:e,totalduration:h,targetduration:c}=i.details,d=new r.D(t,{detail:i});this.b.delegate.c("stream-type-change",e?"EVENT"===s&&Number.isFinite(h)&&c>=10?"live:dvr":"live":"on-demand",d),this.b.delegate.c("duration-change",h,d);const o=this.g.media;-1===this.g.currentLevel&&this.b.qualities[n.Q.Ya](!0,d);for(const t of this.g.audioTracks)this.b.audioTracks[a.L.oa]({id:t.id+"",label:t.name,language:t.lang||"",kind:"main"},d);for(const t of this.g.levels)this.b.qualities[a.L.oa]({id:(t.id??t.height+"p")+"",width:t.width,height:t.height,codec:t.codecSet,bitrate:t.bitrate},d);o.dispatchEvent(new r.D("canplay",{trigger:d}))}U(t,i){if(i.fatal)switch(i.type){case"networkError":this.Ck(i.error);break;case"mediaError":this.g?.recoverMediaError();break;default:this.Ak(i.error)}}Bk(){this.yk>=0&&this.zk()}Ck(t){this.zk(),this.g?.startLoad(),this.yk=window.setTimeout((()=>{this.yk=-1,this.Ak(t)}),5e3)}zk(){clearTimeout(this.yk),this.yk=-1}Ak(t){this.g?.destroy(),this.g=null,this.b.delegate.c("error",{message:t.message,code:1,error:t})}Yg(){this.g&&(this.g.currentLevel=-1)}fb(){const{qualities:t}=this.b;this.g&&!t.auto&&(this.g[t.switch+"Level"]=t.selectedIndex,a.I&&(this.m.currentTime=this.m.currentTime))}Zg(){const{audioTracks:t}=this.b;this.g&&this.g.audioTrack!==t.selectedIndex&&(this.g.audioTrack=t.selectedIndex)}Dk(t){(0,r.r)(t.src)&&(this.zk(),this.g?.loadSource(t.src))}ah(){this.zk(),this.b&&(this.b.qualities[n.Q.Za]=void 0),this.g?.destroy(),this.g=null,this.nd?.(),this.nd=null}}class o{constructor(t,i,s){this.W=t,this.b=i,this.Ca=s,this.bh()}async bh(){const t={onLoadStart:this.Ea.bind(this),onLoaded:this.qd.bind(this),onLoadError:this.ch.bind(this)};let i=await async function(t,i={}){if((0,r.r)(t)){i.onLoadStart?.();try{if(await(0,e.l)(t),!(0,r.x)(window.Hls))throw Error("");const s=window.Hls;return i.onLoaded?.(s),s}catch(t){i.onLoadError?.(t)}}}(this.W,t);if((0,r.i)(i)&&!(0,r.r)(this.W)&&(i=await async function(t,i={}){if(!(0,r.i)(t)){if(i.onLoadStart?.(),t.prototype&&t.prototype!==Function)return i.onLoaded?.(t),t;try{const s=(await t())?.default;if(!s||!s.isSupported)throw Error("");return i.onLoaded?.(s),s}catch(t){i.onLoadError?.(t)}}}(this.W,t)),!i)return null;if(!i.isSupported()){const t="[vidstack]: `hls.js` is not supported in this environment";return this.b.player.dispatch(new r.D("hls-unsupported")),this.b.delegate.c("error",{message:t,code:4}),null}return i}Ea(){this.b.player.dispatch(new r.D("hls-lib-load-start"))}qd(t){this.b.player.dispatch(new r.D("hls-lib-loaded",{detail:t})),this.Ca(t)}ch(t){const i=(0,n.c)(t);this.b.player.dispatch(new r.D("hls-lib-load-error",{detail:i})),this.b.delegate.c("error",{message:i.message,code:4,error:i})}}class l extends h.VideoProvider{constructor(){super(...arguments),this.$$PROVIDER_TYPE="HLS",this.Xe=null,this.d=new d(this.video),this.Gb="https://cdn.jsdelivr.net/npm/hls.js@^1.0.0/dist/hls.min.js"}get ctor(){return this.Xe}get instance(){return this.d.instance}static{this.supported=(0,a.i)()}get type(){return"hls"}get canLiveSync(){return!0}get config(){return this.d.od}set config(t){this.d.od=t}get library(){return this.Gb}set library(t){this.Gb=t}preconnect(){(0,r.r)(this.Gb)&&(0,e.p)(this.Gb)}setup(t){super.setup(t),new o(this.Gb,t,(i=>{this.Xe=i,this.d.setup(i,t),t.delegate.c("provider-setup",this);const s=(0,r.p)(t.$state.source);s&&this.loadSource(s)}))}async loadSource(t,i){(0,r.r)(t.src)&&(this.a.preload=i||"",this.d.Dk(t),this.V=t)}onInstance(t){const i=this.d.instance;return i&&t(i),this.d.pd.add(t),()=>this.d.pd.delete(t)}destroy(){this.d.ah()}}},4248:(t,i,s)=>{s.d(i,{c:()=>d});var e=s(8648),a=s(348),h=s(888),r=s(1716);class n{constructor(t,i){this.i=t,this.b=i,this.sa=(0,a.L)(),this.Cb=!1,this.$c=!1,this.ad=!1,this.Da=new h.R(this.bd.bind(this)),this.Qe=void 0,this.Dg=void 0,this.pg(),(0,a.e)(this.qg.bind(this)),(0,a.o)(this.cd.bind(this))}get a(){return this.i.media}get c(){return this.b.delegate.c}cd(){this.$c=!1,this.ad=!1,this.Da.ra(),this.sa.empty()}bd(){const t=this.a.currentTime;this.b.$state.currentTime()!==t&&this.$a(t)}pg(){this.t("loadstart",this.Ea),this.t("abort",this.Pe),this.t("emptied",this.rg),this.t("error",this.U),this.t("volumechange",this.ab)}sg(){this.$c||(this.sa.add(this.t("loadeddata",this.tg),this.t("loadedmetadata",this.ug),this.t("canplay",this.hc),this.t("canplaythrough",this.vg),this.t("durationchange",this.wg),this.t("play",this.xb),this.t("progress",this.ic),this.t("stalled",this.xg),this.t("suspend",this.yg)),this.$c=!0)}zg(){this.ad||(this.sa.add(this.t("pause",this.Aa),this.t("playing",this.Ag),this.t("ratechange",this.Bg),this.t("seeked",this.bb),this.t("seeking",this.Cg),this.t("ended",this.Db),this.t("waiting",this.dd)),this.ad=!0)}t(t,i){return(0,a.l)(this.a,t,i.bind(this))}Eg(t){}$a(t,i){const s={currentTime:Math.min(t,this.b.$state.seekableEnd()),played:this.a.played};this.c("time-update",s,i)}Ea(t){3!==this.a.networkState?(this.sg(),this.c("load-start",void 0,t)):this.Pe(t)}Pe(t){this.c("abort",void 0,t)}rg(){this.c("emptied",void 0,event)}tg(t){this.c("loaded-data",void 0,t)}ug(t){this.zg(),this.c("loaded-metadata",void 0,t),r.g&&(0,e.i)(this.b.$state.source())&&this.b.delegate.jc(this.ed(),t)}ed(){return{provider:(0,a.p)(this.b.$provider),duration:this.a.duration,buffered:this.a.buffered,seekable:this.a.seekable}}xb(t){this.b.$state.canPlay&&this.c("play",void 0,t)}Aa(t){(1!==this.a.readyState||this.Cb)&&(this.Cb=!1,this.Da.ra(),this.c("pause",void 0,t))}hc(t){this.b.delegate.jc(this.ed(),t)}vg(t){this.b.$state.started()||this.c("can-play-through",this.ed(),t)}Ag(t){this.Cb=!1,this.c("playing",void 0,t),this.Da.Bb()}xg(t){this.c("stalled",void 0,t),this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}dd(t){this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}Db(t){this.Da.ra(),this.$a(this.a.duration,t),this.c("end",void 0,t),this.b.$state.loop()&&(0,a.M)(this.a.controls)&&(this.a.controls=!1)}qg(){this.b.$state.paused()&&(0,a.l)(this.a,"timeupdate",this.Eb.bind(this))}Eb(t){this.$a(this.a.currentTime,t)}wg(t){this.b.$state.ended()&&this.$a(this.a.duration,t),this.c("duration-change",this.a.duration,t)}ab(t){const i={volume:this.a.volume,muted:this.a.muted};this.c("volume-change",i,t)}bb(t){this.$a(this.a.currentTime,t),this.c("seeked",this.a.currentTime,t),Math.trunc(this.a.currentTime)===Math.trunc(this.a.duration)&&(0,e.g)(this.a.duration)>(0,e.g)(this.a.currentTime)&&(this.$a(this.a.duration,t),this.a.ended||this.b.player.dispatch(new a.D("media-play-request",{trigger:t})))}Cg(t){this.c("seeking",this.a.currentTime,t)}ic(t){const i={buffered:this.a.buffered,seekable:this.a.seekable};this.c("progress",i,t)}yg(t){this.c("suspend",void 0,t)}Bg(t){this.c("rate-change",this.a.playbackRate,t)}U(t){const i=this.a.error;if(!i)return;const s={message:i.message,code:i.code,mediaError:i};this.c("error",s,t)}}class c{constructor(t,i){this.i=t,this.b=i,this.Fb.onaddtrack=this.Fg.bind(this),this.Fb.onremovetrack=this.Gg.bind(this),this.Fb.onchange=this.Hg.bind(this),(0,a.l)(this.b.audioTracks,"change",this.Ig.bind(this))}get Fb(){return this.i.media.audioTracks}Fg(t){const i=t.track;if(""===i.label)return;const s={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.b.audioTracks[r.L.oa](s,t),i.enabled&&(s.selected=!0)}Gg(t){const i=this.b.audioTracks.getById(t.track.id);i&&this.b.audioTracks[r.L.Yb](i,t)}Hg(t){let i=this.Re();if(!i)return;const s=this.b.audioTracks.getById(i.id);s&&this.b.audioTracks[r.L.pa](s,!0,t)}Re(){return Array.from(this.Fb).find((t=>t.enabled))}Ig(t){const{current:i}=t.detail;if(!i)return;const s=this.Fb.getTrackById(i.id);if(s){const t=this.Re();t&&(t.enabled=!1),s.enabled=!0}}}class d{constructor(t){this.a=t,this.scope=(0,a.q)(),this.V=null}setup(t){new n(this,t),"audioTracks"in this.media&&new c(this,t),(0,a.o)((()=>{this.a.setAttribute("src",""),this.a.load()}))}get type(){return""}get media(){return this.a}get currentSrc(){return this.V}setPlaybackRate(t){this.a.playbackRate=t}async play(){return this.a.play()}async pause(){return this.a.pause()}setMuted(t){this.a.muted=t}setVolume(t){this.a.volume=t}setCurrentTime(t){this.a.currentTime=t}setPlaysinline(t){(0,a.k)(this.a,"playsinline",t)}async loadSource({src:t,type:i},s){this.a.preload=s||"",(0,e.a)(t)?this.a.srcObject=t:(this.a.srcObject=null,this.a.src=(0,a.r)(t)?t:window.URL.createObjectURL(t)),this.a.load(),this.V={src:t,type:i}}}},9604:(t,i,s)=>{s.r(i),s.d(i,{VideoProvider:()=>u});var e=s(348),a=s(1716),h=s(4248),r=s(352);class n{constructor(t,i){this.m=t,this.b=i,t.textTracks.onaddtrack=this.Wc.bind(this),(0,e.o)(this.cd.bind(this))}Wc(t){const i=t.track;if(!i||function(t,i){return Array.from(t.children).find((t=>t.track===i))}(this.m,i))return;const s=new r.b({id:i.id,kind:i.kind,label:i.label,language:i.language,type:"vtt"});s[r.T.T]={track:i},s[r.T.M]=2,s[r.T.te]=!0;let e=0;const a=t=>{if(i.cues)for(let a=e;a{this.a.delegate.c("picture-in-picture-change",t,i)},(0,e.l)(this.m,"enterpictureinpicture",this.Jg.bind(this)),(0,e.l)(this.m,"leavepictureinpicture",this.Kg.bind(this))}get active(){return document.pictureInPictureElement===this.m}get supported(){return(0,a.d)(this.m)}async enter(){return this.m.requestPictureInPicture()}exit(){return document.exitPictureInPicture()}Jg(t){this.B(!0,t)}Kg(t){this.B(!1,t)}}class d{constructor(t,i){this.m=t,this.a=i,this.I="inline",(0,e.l)(this.m,"webkitpresentationmodechanged",this.Ua.bind(this))}get Se(){return(0,a.e)(this.m)}async kc(t){this.I!==t&&this.m.webkitSetPresentationMode(t)}Ua(t){const i=this.I;this.I=this.m.webkitPresentationMode,this.a.player?.dispatch(new e.D("video-presentation-change",{detail:this.I,trigger:t})),["fullscreen","picture-in-picture"].forEach((s=>{this.I!==s&&i!==s||this.a.delegate.c(`${s}-change`,this.I===s,t)}))}}class o{constructor(t){this.fa=t}get active(){return"fullscreen"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("fullscreen")}async exit(){this.fa.kc("inline")}}class l{constructor(t){this.fa=t}get active(){return"picture-in-picture"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("picture-in-picture")}async exit(){this.fa.kc("inline")}}class u extends h.c{constructor(t,i){super(t),this.$$PROVIDER_TYPE="VIDEO",(0,e.s)((()=>{if((0,a.e)(t)){const s=new d(t,i);this.fullscreen=new o(s),this.pictureInPicture=new l(s)}else(0,a.d)(t)&&(this.pictureInPicture=new c(t,i))}),this.scope)}get type(){return"video"}setup(t){super.setup(t),(0,a.b)(this.video)&&new n(this.video,t),t.textRenderers.Fe(this.video),(0,e.o)((()=>{t.textRenderers.Fe(null)})),"video"===this.type&&t.delegate.c("provider-setup",this)}get video(){return this.a}}}}]); \ No newline at end of file diff --git a/assets/js/6180.a1af7ebc.js b/assets/js/6180.a1af7ebc.js deleted file mode 100644 index c44f21776..000000000 --- a/assets/js/6180.a1af7ebc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6180],{888:(t,i,s)=>{s.d(i,{R:()=>a});var e=s(348);class a{constructor(t){this.Ca=t}Bb(){(0,e.i)(this.ca)&&this.Oe()}ra(){(0,e.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,e.i)(this.ca)||(this.Ca(),this.Oe())}))}}},6180:(t,i,s)=>{s.r(i),s.d(i,{AudioProvider:()=>a});var e=s(4248);class a extends e.c{constructor(){super(...arguments),this.$$PROVIDER_TYPE="AUDIO"}get type(){return"audio"}setup(t){super.setup(t),"audio"===this.type&&t.delegate.c("provider-setup",this)}get audio(){return this.a}}},4248:(t,i,s)=>{s.d(i,{c:()=>n});var e=s(8648),a=s(348),h=s(888),r=s(1716);class d{constructor(t,i){this.i=t,this.b=i,this.sa=(0,a.L)(),this.Cb=!1,this.$c=!1,this.ad=!1,this.Da=new h.R(this.bd.bind(this)),this.Qe=void 0,this.Dg=void 0,this.pg(),(0,a.e)(this.qg.bind(this)),(0,a.o)(this.cd.bind(this))}get a(){return this.i.media}get c(){return this.b.delegate.c}cd(){this.$c=!1,this.ad=!1,this.Da.ra(),this.sa.empty()}bd(){const t=this.a.currentTime;this.b.$state.currentTime()!==t&&this.$a(t)}pg(){this.t("loadstart",this.Ea),this.t("abort",this.Pe),this.t("emptied",this.rg),this.t("error",this.U),this.t("volumechange",this.ab)}sg(){this.$c||(this.sa.add(this.t("loadeddata",this.tg),this.t("loadedmetadata",this.ug),this.t("canplay",this.hc),this.t("canplaythrough",this.vg),this.t("durationchange",this.wg),this.t("play",this.xb),this.t("progress",this.ic),this.t("stalled",this.xg),this.t("suspend",this.yg)),this.$c=!0)}zg(){this.ad||(this.sa.add(this.t("pause",this.Aa),this.t("playing",this.Ag),this.t("ratechange",this.Bg),this.t("seeked",this.bb),this.t("seeking",this.Cg),this.t("ended",this.Db),this.t("waiting",this.dd)),this.ad=!0)}t(t,i){return(0,a.l)(this.a,t,i.bind(this))}Eg(t){}$a(t,i){const s={currentTime:Math.min(t,this.b.$state.seekableEnd()),played:this.a.played};this.c("time-update",s,i)}Ea(t){3!==this.a.networkState?(this.sg(),this.c("load-start",void 0,t)):this.Pe(t)}Pe(t){this.c("abort",void 0,t)}rg(){this.c("emptied",void 0,event)}tg(t){this.c("loaded-data",void 0,t)}ug(t){this.zg(),this.c("loaded-metadata",void 0,t),r.g&&(0,e.i)(this.b.$state.source())&&this.b.delegate.jc(this.ed(),t)}ed(){return{provider:(0,a.p)(this.b.$provider),duration:this.a.duration,buffered:this.a.buffered,seekable:this.a.seekable}}xb(t){this.b.$state.canPlay&&this.c("play",void 0,t)}Aa(t){(1!==this.a.readyState||this.Cb)&&(this.Cb=!1,this.Da.ra(),this.c("pause",void 0,t))}hc(t){this.b.delegate.jc(this.ed(),t)}vg(t){this.b.$state.started()||this.c("can-play-through",this.ed(),t)}Ag(t){this.Cb=!1,this.c("playing",void 0,t),this.Da.Bb()}xg(t){this.c("stalled",void 0,t),this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}dd(t){this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}Db(t){this.Da.ra(),this.$a(this.a.duration,t),this.c("end",void 0,t),this.b.$state.loop()&&(0,a.M)(this.a.controls)&&(this.a.controls=!1)}qg(){this.b.$state.paused()&&(0,a.l)(this.a,"timeupdate",this.Eb.bind(this))}Eb(t){this.$a(this.a.currentTime,t)}wg(t){this.b.$state.ended()&&this.$a(this.a.duration,t),this.c("duration-change",this.a.duration,t)}ab(t){const i={volume:this.a.volume,muted:this.a.muted};this.c("volume-change",i,t)}bb(t){this.$a(this.a.currentTime,t),this.c("seeked",this.a.currentTime,t),Math.trunc(this.a.currentTime)===Math.trunc(this.a.duration)&&(0,e.g)(this.a.duration)>(0,e.g)(this.a.currentTime)&&(this.$a(this.a.duration,t),this.a.ended||this.b.player.dispatch(new a.D("media-play-request",{trigger:t})))}Cg(t){this.c("seeking",this.a.currentTime,t)}ic(t){const i={buffered:this.a.buffered,seekable:this.a.seekable};this.c("progress",i,t)}yg(t){this.c("suspend",void 0,t)}Bg(t){this.c("rate-change",this.a.playbackRate,t)}U(t){const i=this.a.error;if(!i)return;const s={message:i.message,code:i.code,mediaError:i};this.c("error",s,t)}}class c{constructor(t,i){this.i=t,this.b=i,this.Fb.onaddtrack=this.Fg.bind(this),this.Fb.onremovetrack=this.Gg.bind(this),this.Fb.onchange=this.Hg.bind(this),(0,a.l)(this.b.audioTracks,"change",this.Ig.bind(this))}get Fb(){return this.i.media.audioTracks}Fg(t){const i=t.track;if(""===i.label)return;const s={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.b.audioTracks[r.L.oa](s,t),i.enabled&&(s.selected=!0)}Gg(t){const i=this.b.audioTracks.getById(t.track.id);i&&this.b.audioTracks[r.L.Yb](i,t)}Hg(t){let i=this.Re();if(!i)return;const s=this.b.audioTracks.getById(i.id);s&&this.b.audioTracks[r.L.pa](s,!0,t)}Re(){return Array.from(this.Fb).find((t=>t.enabled))}Ig(t){const{current:i}=t.detail;if(!i)return;const s=this.Fb.getTrackById(i.id);if(s){const t=this.Re();t&&(t.enabled=!1),s.enabled=!0}}}class n{constructor(t){this.a=t,this.scope=(0,a.q)(),this.V=null}setup(t){new d(this,t),"audioTracks"in this.media&&new c(this,t),(0,a.o)((()=>{this.a.setAttribute("src",""),this.a.load()}))}get type(){return""}get media(){return this.a}get currentSrc(){return this.V}setPlaybackRate(t){this.a.playbackRate=t}async play(){return this.a.play()}async pause(){return this.a.pause()}setMuted(t){this.a.muted=t}setVolume(t){this.a.volume=t}setCurrentTime(t){this.a.currentTime=t}setPlaysinline(t){(0,a.k)(this.a,"playsinline",t)}async loadSource({src:t,type:i},s){this.a.preload=s||"",(0,e.a)(t)?this.a.srcObject=t:(this.a.srcObject=null,this.a.src=(0,a.r)(t)?t:window.URL.createObjectURL(t)),this.a.load(),this.V={src:t,type:i}}}}}]); \ No newline at end of file diff --git a/assets/js/6459.c38b1b98.js b/assets/js/6459.c38b1b98.js new file mode 100644 index 000000000..6dc19c908 --- /dev/null +++ b/assets/js/6459.c38b1b98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6459],{6459:(e,t,s)=>{s.r(t),s.d(t,{SSAParser:()=>p,default:()=>b});var a=s(8254);const r=/^Format:[\s\t]*/,i=/^Style:[\s\t]*/,n=/^Dialogue:[\s\t]*/,l=/[\s\t]*,[\s\t]*/,c=/\{[^}]+\}/g,h=/\\N/g,o=/^\[(.*)[\s\t]?Styles\]$/,u=/^\[(.*)[\s\t]?Events\]$/;class p{f;O=0;a=null;j=[];k=[];N=null;d;P={};async init(e){this.f=e,e.errors&&(this.d=(await s.e(5699).then(s.bind(s,5699))).ParseErrorBuilder)}parse(e,t){if(this.O)switch(this.O){case 1:if(""===e)this.O=0;else if(i.test(e))if(this.N){const t=e.replace(i,"").split(l);this.S(t)}else this.e(this.d?.T("Style",t));else r.test(e)?this.N=e.replace(r,"").split(l):u.test(e)&&(this.N=null,this.O=2);break;case 2:if(""===e)this.Q();else if(n.test(e))if(this.Q(),this.N){const s=e.replace(n,"").split(l),a=this.U(s,t);a&&(this.a=a)}else this.e(this.d?.T("Dialogue",t));else this.a?this.a.text+="\n"+e.replace(c,"").replace(h,"\n"):r.test(e)?this.N=e.replace(r,"").split(l):o.test(e)?(this.N=null,this.O=1):u.test(e)&&(this.N=null)}else""===e||(o.test(e)?(this.N=null,this.O=1):u.test(e)&&(this.N=null,this.O=2))}done(){return{metadata:{},cues:this.j,regions:[],errors:this.k}}Q(){this.a&&(this.j.push(this.a),this.f.onCue?.(this.a),this.a=null)}S(e){let t,s,a,r,i="Default",n={},l="center",c="bottom",h=1.2,o=3,u=[];for(let p=0;p=4&&(c=d>=7?"top":"center"),d%3){case 1:l="start";break;case 2:l="center";break;case 3:l="end"}}}if(n.R=c,n["--cue-white-space"]="normal",n["--cue-line-height"]="normal",n["--cue-text-align"]=l,"center"===c?(n["--cue-top"]="50%",u.push("translateY(-50%)")):n[`--cue-${c}`]=(s||0)+"px",1===o&&(n["--cue-padding-y"]="0"),(1===o||r)&&(n["--cue-bg-color"]=1===o?"none":r),3===o&&a&&(n["--cue-outline"]=`${t}px solid ${a}`),1===o&&"number"==typeof t){const e=r??"#000";n["--cue-text-shadow"]=[a&&d(1.2*t,1.2*h,a),a?d(t*(t/2),h*(t/2),e):d(t,h,e)].filter(Boolean).join(", ")}u.length&&(n["--cue-transform"]=u.join(" ")),this.P[i]=n}U(e,t){const s=this.V(e),r=this.o(s.Start,s.End,t);if(!r)return;const i=new a.b(r[0],r[1],""),n={...this.P[s.Style]||{}},l=s.Name?``:"",o=n.R,u=s.MarginL&&parseFloat(s.MarginL),p=s.MarginR&&parseFloat(s.MarginR),f=s.MarginV&&parseFloat(s.MarginV);return u&&(n["--cue-width"]="auto",n["--cue-left"]=u+"px"),p&&(n["--cue-width"]="auto",n["--cue-right"]=p+"px"),f&&"center"!==o&&(n[`--cue-${o}`]=f+"px"),i.text=l+e.slice(this.N.length-1).join(", ").replace(c,"").replace(h,"\n"),delete n.R,Object.keys(n).length&&(i.style=n),i}V(e){const t={};for(let s=0;sr)return[r,i];null===r&&this.e(this.d?.q(e,s)),null===i&&this.e(this.d?.r(t,s)),null!=r&&null!==i&&i>r&&this.e(this.d?.s(r,i,s))}e(e){if(e){if(this.k.push(e),this.f.strict)throw this.f.cancel(),e;this.f.onError?.(e)}}}function f(e){const t=parseInt(e.replace("&H",""),16);return t>=0?"rgba("+[255&t,t>>8&255,t>>16&255,(t>>24&255^255)/255].join(",")+")":null}function d(e,t,s){const a=Math.ceil(2*Math.PI*e);let r="";for(let i=0;i{var i;s.d(e,{D:()=>D,c:()=>G,e:()=>V,l:()=>K,o:()=>et,t:()=>O,x:()=>N});const n=window,a=n.trustedTypes,o=a?a.createPolicy("lit-html",{createHTML:t=>t}):void 0,r="$lit$",l=`lit$${(Math.random()+"").slice(9)}$`,h="?"+l,c=`<${h}>`,d=document,u=()=>d.createComment(""),m=t=>null===t||"object"!=typeof t&&"function"!=typeof t,p=Array.isArray,$="[ \t\n\f\r]",g=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,A=/-->/g,_=/>/g,v=RegExp(`>|${$}(?:([^\\s"'>=/]+)(${$}*=${$}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,f=/"/g,x=/^(?:script|style|textarea|title)$/i,N=(t,...e)=>({_$litType$:1,strings:t,values:e}),T=Symbol.for("lit-noChange"),y=Symbol.for("lit-nothing"),C=new WeakMap,E=d.createTreeWalker(d,129,null,!1);function M(t,e){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==o?o.createHTML(e):e}const b=(t,e)=>{const s=t.length-1,i=[];let n,a=2===e?"":"",o=g;for(let e=0;e"===d[0]?(o=null!=n?n:g,u=-1):void 0===d[1]?u=-2:(u=o.lastIndex-d[2].length,h=d[1],o=void 0===d[3]?v:'"'===d[3]?f:H):o===f||o===H?o=v:o===A||o===_?o=g:(o=v,n=void 0);const p=o===v&&t[e+1].startsWith("/>")?" ":"";a+=o===g?s+c:u>=0?(i.push(h),s.slice(0,u)+r+s.slice(u)+l+p):s+l+(-2===u?(i.push(void 0),e):p)}return[M(t,a+(t[s]||"")+(2===e?"":"")),i]};class L{constructor({strings:t,_$litType$:e},s){let i;this.parts=[];let n=0,o=0;const c=t.length-1,d=this.parts,[m,p]=b(t,e);if(this.el=L.createElement(m,s),E.currentNode=this.el.content,2===e){const t=this.el.content,e=t.firstChild;e.remove(),t.append(...e.childNodes)}for(;null!==(i=E.nextNode())&&d.length0){i.textContent=a?a.emptyScript:"";for(let s=0;sp(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]))(t)?this.T(t):this._(t)}k(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}$(t){this._$AH!==t&&(this._$AR(),this._$AH=this.k(t))}_(t){this._$AH!==y&&m(this._$AH)?this._$AA.nextSibling.data=t:this.$(d.createTextNode(t)),this._$AH=t}g(t){var e;const{values:s,_$litType$:i}=t,n="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=L.createElement(M(i.h,i.h[0]),this.options)),i);if((null===(e=this._$AH)||void 0===e?void 0:e._$AD)===n)this._$AH.v(s);else{const t=new S(n,this),e=t.u(this.options);t.v(s),this.$(e),this._$AH=t}}_$AC(t){let e=C.get(t.strings);return void 0===e&&C.set(t.strings,e=new L(t)),e}T(t){p(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let s,i=0;for(const n of t)i===e.length?e.push(s=new j(this.k(u()),this.k(u()),this,this.options)):s=e[i],s._$AI(n),i++;i2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=y}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,e=this,s,i){const n=this.strings;let a=!1;if(void 0===n)t=k(this,t,e,0),a=!m(t)||t!==this._$AH&&t!==T,a&&(this._$AH=t);else{const i=t;let o,r;for(t=n[0],o=0;o{var i,n;const a=null!==(i=null==s?void 0:s.renderBefore)&&void 0!==i?i:e;let o=a._$litPart$;if(void 0===o){const t=null!==(n=null==s?void 0:s.renderBefore)&&void 0!==n?n:null;a._$litPart$=o=new j(e.insertBefore(u(),t),t,void 0,null!=s?s:{})}return o._$AI(t),o},O={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},V=t=>(...e)=>({_$litDirective$:t,values:e});class W{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,s){this._$Ct=t,this._$AM=e,this._$Ci=s}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}const z=(t,e)=>{var s,i;const n=t._$AN;if(void 0===n)return!1;for(const t of n)null===(i=(s=t)._$AO)||void 0===i||i.call(s,e,!1),z(t,e);return!0},J=t=>{let e,s;do{if(void 0===(e=t._$AM))break;s=e._$AN,s.delete(t),t=e}while(0===(null==s?void 0:s.size))},Q=t=>{for(let e;e=t._$AM;t=e){let s=e._$AN;if(void 0===s)e._$AN=s=new Set;else if(s.has(t))break;s.add(t),Z(e)}};function X(t){void 0!==this._$AN?(J(this),this._$AM=t,Q(this)):this._$AM=t}function Y(t,e=!1,s=0){const i=this._$AH,n=this._$AN;if(void 0!==n&&0!==n.size)if(e)if(Array.isArray(i))for(let t=s;t{var e,s,i,n;t.type==O.CHILD&&(null!==(e=(i=t)._$AP)&&void 0!==e||(i._$AP=Y),null!==(s=(n=t)._$AQ)&&void 0!==s||(n._$AQ=X))};class G extends W{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,e,s){super._$AT(t,e,s),Q(this),this.isConnected=t._$AU}_$AO(t,e=!0){var s,i;t!==this.isConnected&&(this.isConnected=t,t?null===(s=this.reconnected)||void 0===s||s.call(this):null===(i=this.disconnected)||void 0===i||i.call(this)),e&&(z(this,t),J(this))}setValue(t){if((t=>void 0===this._$Ct.strings)())this._$Ct._$AI(t,this);else{const e=[...this._$Ct._$AH];e[this._$Ci]=t,this._$Ct._$AI(e,this,0)}}disconnected(){}reconnected(){}}const K=t=>null!=t?t:y;class F extends W{constructor(t){if(super(t),this.et=y,t.type!==O.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===y||null==t)return this.ft=void 0,this.et=t;if(t===T)return t;if("string"!=typeof t)throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.et)return this.ft;this.et=t;const e=[t];return e.raw=e,this.ft={_$litType$:this.constructor.resultType,strings:e,values:[]}}}F.directiveName="unsafeHTML",F.resultType=1;class tt extends F{}tt.directiveName="unsafeSVG",tt.resultType=2;const et=V(tt)},7552:(t,e,s)=>{s.d(e,{L:()=>n});var i=s(6035);class n extends HTMLElement{constructor(){super(...arguments),this.rootPart=null}connectedCallback(){this.rootPart=(0,i.D)(this.render(),this,{renderBefore:this.firstChild}),this.rootPart.setConnected(!0)}disconnectedCallback(){this.rootPart?.setConnected(!1),this.rootPart=null}}},1500:(t,e,s)=>{s.r(e);var i=s(348),n=s(8),a=s(352),o=s(7224),r=s(3659);class l extends i.I{onAttach(t){(0,i.f)(t,"pointer-events","auto")}}class h extends i.I{constructor(){super(),new n.al}onConnect(t){(0,i.o)((0,r.r)((()=>{if(!this.connectScope)return;this.Ja();const t=(0,i.J)(n.am);(0,i.o)((()=>{const e=this.Cc();e&&t.Kd(e)}))})))}Ja(){const t=this.Cc(),e=(0,i.J)(n.am);t&&e.Jd(t)}Cc(){const t=this.el.firstElementChild;return"button"===t?.localName||"button"===t?.getAttribute("role")?t:this.el}}class c extends n.a5{}var d=s(6035),u=s(7552);class m extends((0,i.H)(HTMLElement,n.ah)){static{this.tagName="media-captions"}}class p extends((0,i.H)(HTMLElement,n.ag)){static{this.tagName="media-gesture"}}class $ extends((0,i.H)(HTMLElement,n.ai)){constructor(){super(...arguments),this.Uj=document.createElement("img")}static{this.tagName="media-poster"}onSetup(){this.a=(0,o.u)(),this.$state.img.set(this.Uj)}onConnect(){const{src:t,alt:e}=this.$state,{crossorigin:s}=this.a.$state;this.Uj.parentNode!==this&&this.prepend(this.Uj),(0,i.e)((()=>{(0,i.k)(this.Uj,"src",t()),(0,i.k)(this.Uj,"alt",e()),(0,i.k)(this.Uj,"crossorigin",/ytimg\.com|vimeo/.test(t()||"")?null:s())}))}}const g=(0,r.a)('');class A extends((0,i.H)(HTMLElement,n.T)){constructor(){super(...arguments),this.Uj=this.gk()}static{this.tagName="media-thumbnail"}onSetup(){this.a=(0,o.u)(),this.$state.img.set(this.Uj)}onConnect(){const{src:t}=this.$state,{crossorigin:e}=this.a.$props;this.Uj.parentNode!==this&&this.prepend(this.Uj),(0,i.e)((()=>{(0,i.k)(this.Uj,"src",t()),(0,i.k)(this.Uj,"crossorigin",e())}))}gk(){return(0,r.c)(g)}}class _ extends((0,i.H)(HTMLElement,n.aj)){static{this.tagName="media-time"}onConnect(){(0,i.e)((()=>{this.textContent=this.$state.timeText()}))}}class v extends((0,i.H)(HTMLElement,n.G)){static{this.tagName="media-controls"}}class H extends((0,i.H)(HTMLElement,l)){static{this.tagName="media-controls-group"}}class f extends i.I{}class x extends((0,i.H)(HTMLElement,f)){static{this.tagName="media-chapter-title"}onSetup(){this.a=(0,o.u)(),this.Xj=(0,i.m)(""),this.ak=(0,i.n)(this.hk.bind(this))}onConnect(){(0,a.o)(this.a.textTracks,"chapters",(t=>{if(!t)return void this.Xj.set("");const e=()=>{const e=t?.activeCues[0];this.Xj.set(e?.text||"")};e(),(0,i.l)(t,"cue-change",e)})),(0,i.e)((()=>{this.textContent=this.ak()}))}hk(){const{title:t,started:e}=this.a.$state,s=t(),i=this.Xj();return e()?i||s:s||i}}class N extends i.I{static{this.props={size:96,trackWidth:8,fillPercent:50}}onConnect(t){(0,r.r)((()=>{if(!this.connectScope)return;const e=t.querySelector("svg"),s=e.firstElementChild,n=s.nextElementSibling;(0,i.e)(this.ea.bind(this,e,s,n))}))}ea(t,e,s){const{size:n,trackWidth:a,fillPercent:o}=this.$props;(0,i.k)(t,"width",n()),(0,i.k)(t,"height",n()),(0,i.k)(e,"stroke-width",a()),(0,i.k)(s,"stroke-width",a()),(0,i.k)(s,"stroke-dashoffset",100-o())}}class T extends((0,i.H)(u.L,N)){static{this.tagName="media-spinner"}render(){return d.x` +/*! For license information please see 6860.3e16039e.js.LICENSE.txt */ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6860],{5687:(t,e,s)=>{var i;s.d(e,{D:()=>D,c:()=>G,e:()=>V,l:()=>K,o:()=>et,t:()=>O,x:()=>N});const n=window,a=n.trustedTypes,o=a?a.createPolicy("lit-html",{createHTML:t=>t}):void 0,r="$lit$",l=`lit$${(Math.random()+"").slice(9)}$`,h="?"+l,c=`<${h}>`,d=document,u=()=>d.createComment(""),m=t=>null===t||"object"!=typeof t&&"function"!=typeof t,p=Array.isArray,$="[ \t\n\f\r]",g=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,A=/-->/g,_=/>/g,v=RegExp(`>|${$}(?:([^\\s"'>=/]+)(${$}*=${$}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,f=/"/g,x=/^(?:script|style|textarea|title)$/i,N=(t,...e)=>({_$litType$:1,strings:t,values:e}),T=Symbol.for("lit-noChange"),y=Symbol.for("lit-nothing"),C=new WeakMap,E=d.createTreeWalker(d,129,null,!1);function M(t,e){if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==o?o.createHTML(e):e}const b=(t,e)=>{const s=t.length-1,i=[];let n,a=2===e?"":"",o=g;for(let e=0;e"===d[0]?(o=null!=n?n:g,u=-1):void 0===d[1]?u=-2:(u=o.lastIndex-d[2].length,h=d[1],o=void 0===d[3]?v:'"'===d[3]?f:H):o===f||o===H?o=v:o===A||o===_?o=g:(o=v,n=void 0);const p=o===v&&t[e+1].startsWith("/>")?" ":"";a+=o===g?s+c:u>=0?(i.push(h),s.slice(0,u)+r+s.slice(u)+l+p):s+l+(-2===u?(i.push(void 0),e):p)}return[M(t,a+(t[s]||"")+(2===e?"":"")),i]};class L{constructor({strings:t,_$litType$:e},s){let i;this.parts=[];let n=0,o=0;const c=t.length-1,d=this.parts,[m,p]=b(t,e);if(this.el=L.createElement(m,s),E.currentNode=this.el.content,2===e){const t=this.el.content,e=t.firstChild;e.remove(),t.append(...e.childNodes)}for(;null!==(i=E.nextNode())&&d.length0){i.textContent=a?a.emptyScript:"";for(let s=0;sp(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]))(t)?this.T(t):this._(t)}k(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}$(t){this._$AH!==t&&(this._$AR(),this._$AH=this.k(t))}_(t){this._$AH!==y&&m(this._$AH)?this._$AA.nextSibling.data=t:this.$(d.createTextNode(t)),this._$AH=t}g(t){var e;const{values:s,_$litType$:i}=t,n="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=L.createElement(M(i.h,i.h[0]),this.options)),i);if((null===(e=this._$AH)||void 0===e?void 0:e._$AD)===n)this._$AH.v(s);else{const t=new S(n,this),e=t.u(this.options);t.v(s),this.$(e),this._$AH=t}}_$AC(t){let e=C.get(t.strings);return void 0===e&&C.set(t.strings,e=new L(t)),e}T(t){p(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let s,i=0;for(const n of t)i===e.length?e.push(s=new j(this.k(u()),this.k(u()),this,this.options)):s=e[i],s._$AI(n),i++;i2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=y}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,e=this,s,i){const n=this.strings;let a=!1;if(void 0===n)t=k(this,t,e,0),a=!m(t)||t!==this._$AH&&t!==T,a&&(this._$AH=t);else{const i=t;let o,r;for(t=n[0],o=0;o{var i,n;const a=null!==(i=null==s?void 0:s.renderBefore)&&void 0!==i?i:e;let o=a._$litPart$;if(void 0===o){const t=null!==(n=null==s?void 0:s.renderBefore)&&void 0!==n?n:null;a._$litPart$=o=new j(e.insertBefore(u(),t),t,void 0,null!=s?s:{})}return o._$AI(t),o},O={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},V=t=>(...e)=>({_$litDirective$:t,values:e});class W{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,s){this._$Ct=t,this._$AM=e,this._$Ci=s}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}const z=(t,e)=>{var s,i;const n=t._$AN;if(void 0===n)return!1;for(const t of n)null===(i=(s=t)._$AO)||void 0===i||i.call(s,e,!1),z(t,e);return!0},J=t=>{let e,s;do{if(void 0===(e=t._$AM))break;s=e._$AN,s.delete(t),t=e}while(0===(null==s?void 0:s.size))},Q=t=>{for(let e;e=t._$AM;t=e){let s=e._$AN;if(void 0===s)e._$AN=s=new Set;else if(s.has(t))break;s.add(t),Z(e)}};function X(t){void 0!==this._$AN?(J(this),this._$AM=t,Q(this)):this._$AM=t}function Y(t,e=!1,s=0){const i=this._$AH,n=this._$AN;if(void 0!==n&&0!==n.size)if(e)if(Array.isArray(i))for(let t=s;t{var e,s,i,n;t.type==O.CHILD&&(null!==(e=(i=t)._$AP)&&void 0!==e||(i._$AP=Y),null!==(s=(n=t)._$AQ)&&void 0!==s||(n._$AQ=X))};class G extends W{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,e,s){super._$AT(t,e,s),Q(this),this.isConnected=t._$AU}_$AO(t,e=!0){var s,i;t!==this.isConnected&&(this.isConnected=t,t?null===(s=this.reconnected)||void 0===s||s.call(this):null===(i=this.disconnected)||void 0===i||i.call(this)),e&&(z(this,t),J(this))}setValue(t){if((t=>void 0===this._$Ct.strings)())this._$Ct._$AI(t,this);else{const e=[...this._$Ct._$AH];e[this._$Ci]=t,this._$Ct._$AI(e,this,0)}}disconnected(){}reconnected(){}}const K=t=>null!=t?t:y;class F extends W{constructor(t){if(super(t),this.et=y,t.type!==O.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===y||null==t)return this.ft=void 0,this.et=t;if(t===T)return t;if("string"!=typeof t)throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.et)return this.ft;this.et=t;const e=[t];return e.raw=e,this.ft={_$litType$:this.constructor.resultType,strings:e,values:[]}}}F.directiveName="unsafeHTML",F.resultType=1;class tt extends F{}tt.directiveName="unsafeSVG",tt.resultType=2;const et=V(tt)},8422:(t,e,s)=>{s.d(e,{L:()=>n});var i=s(5687);class n extends HTMLElement{constructor(){super(...arguments),this.rootPart=null}connectedCallback(){this.rootPart=(0,i.D)(this.render(),this,{renderBefore:this.firstChild}),this.rootPart.setConnected(!0)}disconnectedCallback(){this.rootPart?.setConnected(!1),this.rootPart=null}}},6860:(t,e,s)=>{s.r(e);var i=s(4158),n=s(216),a=s(4123),o=s(8457),r=s(9724);class l extends i.I{onAttach(t){(0,i.f)(t,"pointer-events","auto")}}class h extends i.I{constructor(){super(),new n.al}onConnect(t){(0,i.o)((0,r.r)((()=>{if(!this.connectScope)return;this.Ja();const t=(0,i.J)(n.am);(0,i.o)((()=>{const e=this.Cc();e&&t.Kd(e)}))})))}Ja(){const t=this.Cc(),e=(0,i.J)(n.am);t&&e.Jd(t)}Cc(){const t=this.el.firstElementChild;return"button"===t?.localName||"button"===t?.getAttribute("role")?t:this.el}}class c extends n.a5{}var d=s(5687),u=s(8422);class m extends((0,i.H)(HTMLElement,n.ah)){static{this.tagName="media-captions"}}class p extends((0,i.H)(HTMLElement,n.ag)){static{this.tagName="media-gesture"}}class $ extends((0,i.H)(HTMLElement,n.ai)){constructor(){super(...arguments),this.Uj=document.createElement("img")}static{this.tagName="media-poster"}onSetup(){this.a=(0,o.u)(),this.$state.img.set(this.Uj)}onConnect(){const{src:t,alt:e}=this.$state,{crossorigin:s}=this.a.$state;this.Uj.parentNode!==this&&this.prepend(this.Uj),(0,i.e)((()=>{(0,i.k)(this.Uj,"src",t()),(0,i.k)(this.Uj,"alt",e()),(0,i.k)(this.Uj,"crossorigin",/ytimg\.com|vimeo/.test(t()||"")?null:s())}))}}const g=(0,r.a)('');class A extends((0,i.H)(HTMLElement,n.T)){constructor(){super(...arguments),this.Uj=this.gk()}static{this.tagName="media-thumbnail"}onSetup(){this.a=(0,o.u)(),this.$state.img.set(this.Uj)}onConnect(){const{src:t}=this.$state,{crossorigin:e}=this.a.$props;this.Uj.parentNode!==this&&this.prepend(this.Uj),(0,i.e)((()=>{(0,i.k)(this.Uj,"src",t()),(0,i.k)(this.Uj,"crossorigin",e())}))}gk(){return(0,r.c)(g)}}class _ extends((0,i.H)(HTMLElement,n.aj)){static{this.tagName="media-time"}onConnect(){(0,i.e)((()=>{this.textContent=this.$state.timeText()}))}}class v extends((0,i.H)(HTMLElement,n.G)){static{this.tagName="media-controls"}}class H extends((0,i.H)(HTMLElement,l)){static{this.tagName="media-controls-group"}}class f extends i.I{}class x extends((0,i.H)(HTMLElement,f)){static{this.tagName="media-chapter-title"}onSetup(){this.a=(0,o.u)(),this.Xj=(0,i.m)(""),this.ak=(0,i.n)(this.hk.bind(this))}onConnect(){(0,a.o)(this.a.textTracks,"chapters",(t=>{if(!t)return void this.Xj.set("");const e=()=>{const e=t?.activeCues[0];this.Xj.set(e?.text||"")};e(),(0,i.l)(t,"cue-change",e)})),(0,i.e)((()=>{this.textContent=this.ak()}))}hk(){const{title:t,started:e}=this.a.$state,s=t(),i=this.Xj();return e()?i||s:s||i}}class N extends i.I{static{this.props={size:96,trackWidth:8,fillPercent:50}}onConnect(t){(0,r.r)((()=>{if(!this.connectScope)return;const e=t.querySelector("svg"),s=e.firstElementChild,n=s.nextElementSibling;(0,i.e)(this.ea.bind(this,e,s,n))}))}ea(t,e,s){const{size:n,trackWidth:a,fillPercent:o}=this.$props;(0,i.k)(t,"width",n()),(0,i.k)(t,"height",n()),(0,i.k)(e,"stroke-width",a()),(0,i.k)(s,"stroke-width",a()),(0,i.k)(s,"stroke-dashoffset",100-o())}}class T extends((0,i.H)(u.L,N)){static{this.tagName="media-spinner"}render(){return d.x`

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

    直播定位

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

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

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

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

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

    开播时间

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

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

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

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

    直播策划

    选题

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

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

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

    标题

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

    标题要素:

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

    预告

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

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

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

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

    环境

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

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

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

    直播互动

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

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

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

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

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

    开播锻炼

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

    总结

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

    ',40)],i={},p=(0,n(9720).c)(i,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div",null,l)}]]),r=JSON.parse('{"path":"/apps/livestreaming/6_live_positioning.html","title":"直播入门攻略六 | 技巧篇:直播定位与策划","lang":"zh-CN","frontmatter":{"title":"直播入门攻略六 | 技巧篇:直播定位与策划","category":["工具"],"tag":["直播"],"order":6,"description":"直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。 直播定位 开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。 我是谁:我的职业/身份是什么。 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。 我能提供什么:核心...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/6_live_positioning.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略六 | 技巧篇:直播定位与策划"}],["meta",{"property":"og:description","content":"直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。 直播定位 开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。 我是谁:我的职业/身份是什么。 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。 我能提供什么:核心..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-12T21:27:08.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-01-12T21:27:08.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略六 | 技巧篇:直播定位与策划\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2023-01-12T21:27:08.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"直播定位","slug":"直播定位","link":"#直播定位","children":[]},{"level":2,"title":"开播时间","slug":"开播时间","link":"#开播时间","children":[]},{"level":2,"title":"直播策划","slug":"直播策划","link":"#直播策划","children":[{"level":3,"title":"选题","slug":"选题","link":"#选题","children":[]},{"level":3,"title":"标题","slug":"标题","link":"#标题","children":[]},{"level":3,"title":"预告","slug":"预告","link":"#预告","children":[]},{"level":3,"title":"环境","slug":"环境","link":"#环境","children":[]}]},{"level":2,"title":"直播互动","slug":"直播互动","link":"#直播互动","children":[]},{"level":2,"title":"开播锻炼","slug":"开播锻炼","link":"#开播锻炼","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1673558828000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":4.69,"words":1406},"filePathRelative":"apps/livestreaming/6_live_positioning.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    直播定位

    \\n

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

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

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3015],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,a]of t)n[e]=a;return n}},6852:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>p,data:()=>r});var a=n(7847);const l=[(0,a.Fv)('

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

    直播定位

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

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

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

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

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

    开播时间

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

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

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

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

    直播策划

    选题

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

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

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

    标题

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

    标题要素:

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

    预告

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

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

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

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

    环境

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

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

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

    直播互动

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

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

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

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

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

    开播锻炼

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

    总结

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

    ',40)],i={},p=(0,n(3671).A)(i,[["render",function(e,t){return(0,a.uX)(),(0,a.CE)("div",null,l)}]]),r=JSON.parse('{"path":"/apps/livestreaming/6_live_positioning.html","title":"直播入门攻略六 | 技巧篇:直播定位与策划","lang":"zh-CN","frontmatter":{"title":"直播入门攻略六 | 技巧篇:直播定位与策划","category":["工具"],"tag":["直播"],"order":6,"description":"直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。 直播定位 开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。 我是谁:我的职业/身份是什么。 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。 我能提供什么:核心...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/6_live_positioning.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"直播入门攻略六 | 技巧篇:直播定位与策划"}],["meta",{"property":"og:description","content":"直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。 直播定位 开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。 我是谁:我的职业/身份是什么。 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。 我能提供什么:核心..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-12T21:27:08.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"直播"}],["meta",{"property":"article:modified_time","content":"2023-01-12T21:27:08.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"直播入门攻略六 | 技巧篇:直播定位与策划\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2023-01-12T21:27:08.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"直播定位","slug":"直播定位","link":"#直播定位","children":[]},{"level":2,"title":"开播时间","slug":"开播时间","link":"#开播时间","children":[]},{"level":2,"title":"直播策划","slug":"直播策划","link":"#直播策划","children":[{"level":3,"title":"选题","slug":"选题","link":"#选题","children":[]},{"level":3,"title":"标题","slug":"标题","link":"#标题","children":[]},{"level":3,"title":"预告","slug":"预告","link":"#预告","children":[]},{"level":3,"title":"环境","slug":"环境","link":"#环境","children":[]}]},{"level":2,"title":"直播互动","slug":"直播互动","link":"#直播互动","children":[]},{"level":2,"title":"开播锻炼","slug":"开播锻炼","link":"#开播锻炼","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]}],"git":{"createdTime":1673542527000,"updatedTime":1673558828000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":4.69,"words":1406},"filePathRelative":"apps/livestreaming/6_live_positioning.md","localizedDate":"2023年1月12日","excerpt":"

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

    \\n

    直播定位

    \\n

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

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

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/7251.1ccbba2c.js b/assets/js/7251.1ccbba2c.js new file mode 100644 index 000000000..bf70a2371 --- /dev/null +++ b/assets/js/7251.1ccbba2c.js @@ -0,0 +1,2 @@ +/*! For license information please see 7251.1ccbba2c.js.LICENSE.txt */ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7251],{6719:(e,t,n)=>{n.d(t,{C4:()=>g,EW:()=>Me,Gc:()=>he,IG:()=>ke,IJ:()=>Ae,KR:()=>Le,Kh:()=>de,Pr:()=>Ie,R1:()=>We,X2:()=>c,bl:()=>y,fE:()=>ye,g8:()=>me,hZ:()=>L,i9:()=>Te,jr:()=>i,ju:()=>be,lW:()=>Ne,o5:()=>s,rY:()=>Oe,tB:()=>ve,u4:()=>T,ux:()=>we,yC:()=>o});var a=n(4094);let l,r;class o{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=l,!e&&l&&(this.index=(l.scopes||(l.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=l;try{return l=this,e()}finally{l=t}}}on(){l=this}off(){l=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t=4))break}1===this._dirtyLevel&&(this._dirtyLevel=0),y()}return this._dirtyLevel>=4}set dirty(e){this._dirtyLevel=e?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let e=v,t=r;try{return v=!0,r=this,this._runnings++,p(this),this.fn()}finally{d(this),this._runnings--,r=t,v=e}}stop(){var e;this.active&&(p(this),d(this),null==(e=this.onStop)||e.call(this),this.active=!1)}}function u(e){return e.value}function p(e){e._trackId++,e._depsLength=0}function d(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},M=new WeakMap,C=Symbol(""),_=Symbol("");function T(e,t,n){if(v&&r){let t=M.get(e);t||M.set(e,t=new Map);let a=t.get(n);a||t.set(n,a=S((()=>t.delete(n)))),k(r,a)}}function L(e,t,n,l,r,o){const s=M.get(e);if(!s)return;let i=[];if("clear"===t)i=[...s.values()];else if("length"===n&&(0,a.cy)(e)){const e=Number(l);s.forEach(((t,n)=>{("length"===n||!(0,a.Bm)(n)&&n>=e)&&i.push(t)}))}else switch(void 0!==n&&i.push(s.get(n)),t){case"add":(0,a.cy)(e)?(0,a.yI)(n)&&i.push(s.get("length")):(i.push(s.get(C)),(0,a.CE)(e)&&i.push(s.get(_)));break;case"delete":(0,a.cy)(e)||(i.push(s.get(C)),(0,a.CE)(e)&&i.push(s.get(_)));break;case"set":(0,a.CE)(e)&&i.push(s.get(C))}b();for(const e of i)e&&x(e,4);w()}const A=(0,a.pD)("__proto__,__v_isRef,__isVue"),$=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(a.Bm)),B=W();function W(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=we(this);for(let e=0,t=this.length;e{e[t]=function(...e){g(),b();const n=we(this)[t].apply(this,e);return w(),y(),n}})),e}function R(e){const t=we(this);return T(t,0,e),t.hasOwnProperty(e)}class I{constructor(e=!1,t=!1){this._isReadonly=e,this._shallow=t}get(e,t,n){const l=this._isReadonly,r=this._shallow;if("__v_isReactive"===t)return!l;if("__v_isReadonly"===t)return l;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(l?r?pe:ue:r?ce:ie).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const o=(0,a.cy)(e);if(!l){if(o&&(0,a.$3)(B,t))return Reflect.get(B,t,n);if("hasOwnProperty"===t)return R}const s=Reflect.get(e,t,n);return((0,a.Bm)(t)?$.has(t):A(t))?s:(l||T(e,0,t),r?s:Te(s)?o&&(0,a.yI)(t)?s:s.value:(0,a.Gv)(s)?l?ve(s):de(s):s)}}class P extends I{constructor(e=!1){super(!1,e)}set(e,t,n,l){let r=e[t];if(!this._shallow){const t=ge(r);if(ye(n)||ge(n)||(r=we(r),n=we(n)),!(0,a.cy)(e)&&Te(r)&&!Te(n))return!t&&(r.value=n,!0)}const o=(0,a.cy)(e)&&(0,a.yI)(t)?Number(t)e,D=e=>Reflect.getPrototypeOf(e);function F(e,t,n=!1,l=!1){const r=we(e=e.__v_raw),o=we(t);n||((0,a.$H)(t,o)&&T(r,0,t),T(r,0,o));const{has:s}=D(r),i=l?j:n?xe:Ee;return s.call(r,t)?i(e.get(t)):s.call(r,o)?i(e.get(o)):void(e!==r&&e.get(t))}function H(e,t=!1){const n=this.__v_raw,l=we(n),r=we(e);return t||((0,a.$H)(e,r)&&T(l,0,e),T(l,0,r)),e===r?n.has(e):n.has(e)||n.has(r)}function U(e,t=!1){return e=e.__v_raw,!t&&T(we(e),0,C),Reflect.get(e,"size",e)}function K(e){e=we(e);const t=we(this);return D(t).has.call(t,e)||(t.add(e),L(t,"add",e,e)),this}function q(e,t){t=we(t);const n=we(this),{has:l,get:r}=D(n);let o=l.call(n,e);o||(e=we(e),o=l.call(n,e));const s=r.call(n,e);return n.set(e,t),o?(0,a.$H)(t,s)&&L(n,"set",e,t):L(n,"add",e,t),this}function G(e){const t=we(this),{has:n,get:a}=D(t);let l=n.call(t,e);l||(e=we(e),l=n.call(t,e)),a&&a.call(t,e);const r=t.delete(e);return l&&L(t,"delete",e,void 0),r}function Y(){const e=we(this),t=0!==e.size,n=e.clear();return t&&L(e,"clear",void 0,void 0),n}function Z(e,t){return function(n,a){const l=this,r=l.__v_raw,o=we(r),s=t?j:e?xe:Ee;return!e&&T(o,0,C),r.forEach(((e,t)=>n.call(a,s(e),s(t),l)))}}function X(e,t,n){return function(...l){const r=this.__v_raw,o=we(r),s=(0,a.CE)(o),i="entries"===e||e===Symbol.iterator&&s,c="keys"===e&&s,u=r[e](...l),p=n?j:t?xe:Ee;return!t&&T(o,0,c?_:C),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:i?[p(e[0]),p(e[1])]:p(e),done:t}},[Symbol.iterator](){return this}}}}function Q(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function J(){const e={get(e){return F(this,e)},get size(){return U(this)},has:H,add:K,set:q,delete:G,clear:Y,forEach:Z(!1,!1)},t={get(e){return F(this,e,!1,!0)},get size(){return U(this)},has:H,add:K,set:q,delete:G,clear:Y,forEach:Z(!1,!0)},n={get(e){return F(this,e,!0)},get size(){return U(this,!0)},has(e){return H.call(this,e,!0)},add:Q("add"),set:Q("set"),delete:Q("delete"),clear:Q("clear"),forEach:Z(!0,!1)},a={get(e){return F(this,e,!0,!0)},get size(){return U(this,!0)},has(e){return H.call(this,e,!0)},add:Q("add"),set:Q("set"),delete:Q("delete"),clear:Q("clear"),forEach:Z(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((l=>{e[l]=X(l,!1,!1),n[l]=X(l,!0,!1),t[l]=X(l,!1,!0),a[l]=X(l,!0,!0)})),[e,n,t,a]}const[ee,te,ne,ae]=J();function le(e,t){const n=t?e?ae:ne:e?te:ee;return(t,l,r)=>"__v_isReactive"===l?!e:"__v_isReadonly"===l?e:"__v_raw"===l?t:Reflect.get((0,a.$3)(n,l)&&l in t?n:t,l,r)}const re={get:le(!1,!1)},oe={get:le(!1,!0)},se={get:le(!0,!1)},ie=new WeakMap,ce=new WeakMap,ue=new WeakMap,pe=new WeakMap;function de(e){return ge(e)?e:fe(e,!1,z,re,ie)}function he(e){return fe(e,!1,N,oe,ce)}function ve(e){return fe(e,!0,V,se,ue)}function fe(e,t,n,l,r){if(!(0,a.Gv)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const o=r.get(e);if(o)return o;const s=(i=e).__v_skip||!Object.isExtensible(i)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,a.Zf)(i));var i;if(0===s)return e;const c=new Proxy(e,2===s?l:n);return r.set(e,c),c}function me(e){return ge(e)?me(e.__v_raw):!(!e||!e.__v_isReactive)}function ge(e){return!(!e||!e.__v_isReadonly)}function ye(e){return!(!e||!e.__v_isShallow)}function be(e){return me(e)||ge(e)}function we(e){const t=e&&e.__v_raw;return t?we(t):e}function ke(e){return Object.isExtensible(e)&&(0,a.yQ)(e,"__v_skip",!0),e}const Ee=e=>(0,a.Gv)(e)?de(e):e,xe=e=>(0,a.Gv)(e)?ve(e):e;class Se{constructor(e,t,n,a){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new c((()=>e(this._value)),(()=>_e(this,2===this.effect._dirtyLevel?2:3))),this.effect.computed=this,this.effect.active=this._cacheable=!a,this.__v_isReadonly=n}get value(){const e=we(this);return e._cacheable&&!e.effect.dirty||!(0,a.$H)(e._value,e._value=e.effect.run())||_e(e,4),Ce(e),e.effect._dirtyLevel>=2&&_e(e,2),e._value}set value(e){this._setter(e)}get _dirty(){return this.effect.dirty}set _dirty(e){this.effect.dirty=e}}function Me(e,t,n=!1){let l,r;const o=(0,a.Tn)(e);return o?(l=e,r=a.tE):(l=e.get,r=e.set),new Se(l,r,o||!r,n)}function Ce(e){var t;v&&r&&(e=we(e),k(r,null!=(t=e.dep)?t:e.dep=S((()=>e.dep=void 0),e instanceof Se?e:void 0)))}function _e(e,t=4,n){const a=(e=we(e)).dep;a&&x(a,t)}function Te(e){return!(!e||!0!==e.__v_isRef)}function Le(e){return $e(e,!1)}function Ae(e){return $e(e,!0)}function $e(e,t){return Te(e)?e:new Be(e,t)}class Be{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:we(e),this._value=t?e:Ee(e)}get value(){return Ce(this),this._value}set value(e){const t=this.__v_isShallow||ye(e)||ge(e);e=t?e:we(e),(0,a.$H)(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:Ee(e),_e(this,4))}}function We(e){return Te(e)?e.value:e}const Re={get:(e,t,n)=>We(Reflect.get(e,t,n)),set:(e,t,n,a)=>{const l=e[t];return Te(l)&&!Te(n)?(l.value=n,!0):Reflect.set(e,t,n,a)}};function Ie(e){return me(e)?e:new Proxy(e,Re)}class Pe{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ce(this)),(()=>_e(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function Oe(e){return new Pe(e)}class ze{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return e=we(this._object),t=this._key,null==(n=M.get(e))?void 0:n.get(t);var e,t,n}}class Ve{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Ne(e,t,n){return Te(e)?e:(0,a.Tn)(e)?new Ve(e):(0,a.Gv)(e)&&arguments.length>1?function(e,t,n){const a=e[t];return Te(a)?a:new ze(e,t,n)}(e,t,n):Le(e)}},7847:(e,t,n)=>{n.d(t,{$V:()=>de,$u:()=>Se,CE:()=>zt,Df:()=>ce,EW:()=>gn,FK:()=>Tt,Fv:()=>Yt,Gt:()=>Qe,Gy:()=>ee,K9:()=>wt,Lk:()=>Ut,MZ:()=>ie,OW:()=>re,Q3:()=>Zt,QP:()=>ne,WQ:()=>Je,Wv:()=>Vt,bF:()=>Kt,bo:()=>Z,ci:()=>kt,dY:()=>g,eW:()=>Gt,g2:()=>O,h:()=>yn,hi:()=>Ce,k6:()=>$,nI:()=>ln,nT:()=>F,pI:()=>$e,pM:()=>ue,pR:()=>ae,qL:()=>o,sV:()=>Ee,uX:()=>Rt,wB:()=>U,xo:()=>Me});var a=n(6719),l=n(4094);function r(e,t,n,a){try{return a?e(...a):e()}catch(e){s(e,t,n)}}function o(e,t,n,a){if((0,l.Tn)(e)){const o=r(e,t,n,a);return o&&(0,l.yL)(o)&&o.catch((e=>{s(e,t,n)})),o}const i=[];for(let l=0;l>>1,l=u[a],r=E(l);rE(e)-E(t)));if(d.length=0,h)return void h.push(...e);for(h=e,v=0;vnull==e.id?1/0:e.id,x=(e,t)=>{const n=E(e)-E(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function S(e){c=!1,i=!0,u.sort(x),l.tE;try{for(p=0;p(0,l.Kg)(e)?e.trim():e))),t&&(r=n.map(l.bB))}let c,u=a[c=(0,l.rU)(t)]||a[c=(0,l.rU)((0,l.PT)(t))];!u&&s&&(u=a[c=(0,l.rU)((0,l.Tg)(t))]),u&&o(u,e,6,r);const p=a[c+"Once"];if(p){if(e.emitted){if(e.emitted[c])return}else e.emitted={};e.emitted[c]=!0,o(p,e,6,r)}}function C(e,t,n=!1){const a=t.emitsCache,r=a.get(e);if(void 0!==r)return r;const o=e.emits;let s={},i=!1;if(!(0,l.Tn)(e)){const a=e=>{const n=C(e,t,!0);n&&(i=!0,(0,l.X$)(s,n))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return o||i?((0,l.cy)(o)?o.forEach((e=>s[e]=null)):(0,l.X$)(s,o),(0,l.Gv)(e)&&a.set(e,s),s):((0,l.Gv)(e)&&a.set(e,null),null)}function _(e,t){return!(!e||!(0,l.Mp)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,l.$3)(e,t[0].toLowerCase()+t.slice(1))||(0,l.$3)(e,(0,l.Tg)(t))||(0,l.$3)(e,t))}let T=null,L=null;function A(e){const t=T;return T=e,L=e&&e.type.__scopeId||null,t}function $(e,t=T,n){if(!t)return e;if(e._n)return e;const a=(...n)=>{a._d&&Pt(-1);const l=A(t);let r;try{r=e(...n)}finally{A(l),a._d&&Pt(1)}return r};return a._n=!0,a._c=!0,a._d=!0,a}function B(e){const{type:t,vnode:n,proxy:a,withProxy:r,props:o,propsOptions:[i],slots:c,attrs:u,emit:p,render:d,renderCache:h,data:v,setupState:f,ctx:m,inheritAttrs:g}=e;let y,b;const w=A(e);try{if(4&n.shapeFlag){const e=r||a,t=e;y=Xt(d.call(t,e,h,o,f,v,m)),b=u}else{const e=t;y=Xt(e.length>1?e(o,{attrs:u,slots:c,emit:p}):e(o,null)),b=t.props?u:W(u)}}catch(t){Bt.length=0,s(t,e,1),y=Kt(At)}let k=y;if(b&&!1!==g){const e=Object.keys(b),{shapeFlag:t}=k;e.length&&7&t&&(i&&e.some(l.CP)&&(b=R(b,i)),k=qt(k,b))}return n.dirs&&(k=qt(k),k.dirs=k.dirs?k.dirs.concat(n.dirs):n.dirs),n.transition&&(k.transition=n.transition),y=k,A(w),y}const W=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,l.Mp)(n))&&((t||(t={}))[n]=e[n]);return t},R=(e,t)=>{const n={};for(const a in e)(0,l.CP)(a)&&a.slice(9)in t||(n[a]=e[a]);return n};function I(e,t,n){const a=Object.keys(t);if(a.length!==Object.keys(e).length)return!0;for(let l=0;lJe(j);function F(e,t){return K(e,null,t)}const H={};function U(e,t,n){return K(e,t,n)}function K(e,t,{immediate:n,deep:s,flush:i,once:c,onTrack:u,onTrigger:p}=l.MZ){if(t&&c){const e=t;t=(...t)=>{e(...t),C()}}const d=an,h=e=>!0===s?e:Y(e,!1===s?1:void 0);let v,f,m=!1,g=!1;if((0,a.i9)(e)?(v=()=>e.value,m=(0,a.fE)(e)):(0,a.g8)(e)?(v=()=>h(e),m=!0):(0,l.cy)(e)?(g=!0,m=e.some((e=>(0,a.g8)(e)||(0,a.fE)(e))),v=()=>e.map((e=>(0,a.i9)(e)?e.value:(0,a.g8)(e)?h(e):(0,l.Tn)(e)?r(e,d,2):void 0))):v=(0,l.Tn)(e)?t?()=>r(e,d,2):()=>(f&&f(),o(e,d,3,[w])):l.tE,t&&s){const e=v;v=()=>Y(e())}let b,w=e=>{f=S.onStop=()=>{r(e,d,4),f=S.onStop=void 0}};if(hn){if(w=l.tE,t?n&&o(t,d,3,[v(),g?[]:void 0,w]):v(),"sync"!==i)return l.tE;{const e=D();b=e.__watcherHandles||(e.__watcherHandles=[])}}let k=g?new Array(e.length).fill(H):H;const E=()=>{if(S.active&&S.dirty)if(t){const e=S.run();(s||m||(g?e.some(((e,t)=>(0,l.$H)(e,k[t]))):(0,l.$H)(e,k)))&&(f&&f(),o(t,d,3,[e,k===H?void 0:g&&k[0]===H?[]:k,w]),k=e)}else S.run()};let x;E.allowRecurse=!!t,"sync"===i?x=E:"post"===i?x=()=>bt(E,d&&d.suspense):(E.pre=!0,d&&(E.id=d.uid),x=()=>y(E));const S=new a.X2(v,l.tE,x),M=(0,a.o5)(),C=()=>{S.stop(),M&&(0,l.TF)(M.effects,S)};return t?n?E():k=S.run():"post"===i?bt(S.run.bind(S),d&&d.suspense):S.run(),b&&b.push(C),C}function q(e,t,n){const a=this.proxy,r=(0,l.Kg)(e)?e.includes(".")?G(a,e):()=>a[e]:e.bind(a,a);let o;(0,l.Tn)(t)?o=t:(o=t.handler,n=t);const s=sn(this),i=K(r,o.bind(a),n);return s(),i}function G(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e0){if(n>=t)return e;n++}if((r=r||new Set).has(e))return e;if(r.add(e),(0,a.i9)(e))Y(e.value,t,n,r);else if((0,l.cy)(e))for(let a=0;a{Y(e,t,n,r)}));else if((0,l.Qd)(e))for(const a in e)Y(e[a],t,n,r);return e}function Z(e,t){if(null===T)return e;const n=mn(T)||T.proxy,a=e.dirs||(e.dirs=[]);for(let e=0;e{e.isMounted=!0})),Me((()=>{e.isUnmounting=!0})),e}const te=[Function,Array],ne={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:te,onEnter:te,onAfterEnter:te,onEnterCancelled:te,onBeforeLeave:te,onLeave:te,onAfterLeave:te,onLeaveCancelled:te,onBeforeAppear:te,onAppear:te,onAfterAppear:te,onAppearCancelled:te},ae={name:"BaseTransition",props:ne,setup(e,{slots:t}){const n=ln(),l=ee();let r;return()=>{const o=t.default&&ce(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){let e=!1;for(const t of o)if(t.type!==At){s=t,e=!0;break}}const i=(0,a.ux)(e),{mode:c}=i;if(l.isLeaving)return oe(s);const u=se(s);if(!u)return oe(s);const p=re(u,i,l,n);ie(u,p);const d=n.subTree,h=d&&se(d);let v=!1;const{getTransitionKey:f}=u.type;if(f){const e=f();void 0===r?r=e:e!==r&&(r=e,v=!0)}if(h&&h.type!==At&&(!jt(u,h)||v)){const e=re(h,i,l,n);if(ie(h,e),"out-in"===c)return l.isLeaving=!0,e.afterLeave=()=>{l.isLeaving=!1,!1!==n.update.active&&(n.effect.dirty=!0,n.update())},oe(s);"in-out"===c&&u.type!==At&&(e.delayLeave=(e,t,n)=>{le(l,h)[String(h.key)]=h,e[Q]=()=>{t(),e[Q]=void 0,delete p.delayedLeave},p.delayedLeave=n})}return s}}};function le(e,t){const{leavingVNodes:n}=e;let a=n.get(t.type);return a||(a=Object.create(null),n.set(t.type,a)),a}function re(e,t,n,a){const{appear:r,mode:s,persisted:i=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:p,onEnterCancelled:d,onBeforeLeave:h,onLeave:v,onAfterLeave:f,onLeaveCancelled:m,onBeforeAppear:g,onAppear:y,onAfterAppear:b,onAppearCancelled:w}=t,k=String(e.key),E=le(n,e),x=(e,t)=>{e&&o(e,a,9,t)},S=(e,t)=>{const n=t[1];x(e,t),(0,l.cy)(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},M={mode:s,persisted:i,beforeEnter(t){let a=c;if(!n.isMounted){if(!r)return;a=g||c}t[Q]&&t[Q](!0);const l=E[k];l&&jt(e,l)&&l.el[Q]&&l.el[Q](),x(a,[t])},enter(e){let t=u,a=p,l=d;if(!n.isMounted){if(!r)return;t=y||u,a=b||p,l=w||d}let o=!1;const s=e[J]=t=>{o||(o=!0,x(t?l:a,[e]),M.delayedLeave&&M.delayedLeave(),e[J]=void 0)};t?S(t,[e,s]):s()},leave(t,a){const l=String(e.key);if(t[J]&&t[J](!0),n.isUnmounting)return a();x(h,[t]);let r=!1;const o=t[Q]=n=>{r||(r=!0,a(),x(n?m:f,[t]),t[Q]=void 0,E[l]===e&&delete E[l])};E[l]=e,v?S(v,[t,o]):o()},clone:e=>re(e,t,n,a)};return M}function oe(e){if(ve(e))return(e=qt(e)).children=null,e}function se(e){return ve(e)?e.children?e.children[0]:void 0:e}function ie(e,t){6&e.shapeFlag&&e.component?ie(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ce(e,t=!1,n){let a=[],l=0;for(let r=0;r1)for(let e=0;e(0,l.X$)({name:e.name},t,{setup:e}))():e}const pe=e=>!!e.type.__asyncLoader;function de(e){(0,l.Tn)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:i,suspensible:c=!0,onError:u}=e;let p,d=null,h=0;const v=()=>{let e;return d||(e=d=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),u)return new Promise(((t,n)=>{u(e,(()=>t((h++,d=null,v()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==d&&d?d:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),p=t,t))))};return ue({name:"AsyncComponentWrapper",__asyncLoader:v,get __asyncResolved(){return p},setup(){const e=an;if(p)return()=>he(p,e);const t=t=>{d=null,s(t,e,13,!r)};if(c&&e.suspense||hn)return v().then((t=>()=>he(t,e))).catch((e=>(t(e),()=>r?Kt(r,{error:e}):null)));const l=(0,a.KR)(!1),u=(0,a.KR)(),h=(0,a.KR)(!!o);return o&&setTimeout((()=>{h.value=!1}),o),null!=i&&setTimeout((()=>{if(!l.value&&!u.value){const e=new Error(`Async component timed out after ${i}ms.`);t(e),u.value=e}}),i),v().then((()=>{l.value=!0,e.parent&&ve(e.parent.vnode)&&(e.parent.effect.dirty=!0,y(e.parent.update))})).catch((e=>{t(e),u.value=e})),()=>l.value&&p?he(p,e):u.value&&r?Kt(r,{error:u.value}):n&&!h.value?Kt(n):void 0}})}function he(e,t){const{ref:n,props:a,children:l,ce:r}=t.vnode,o=Kt(e,a,l);return o.ref=n,o.ce=r,delete t.vnode.ce,o}const ve=e=>e.type.__isKeepAlive;function fe(e,t){ge(e,"a",t)}function me(e,t){ge(e,"da",t)}function ge(e,t,n=an){const a=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(be(t,a,n),n){let e=n.parent;for(;e&&e.parent;)ve(e.parent.vnode)&&ye(a,t,n,e),e=e.parent}}function ye(e,t,n,a){const r=be(t,e,a,!0);Ce((()=>{(0,l.TF)(a[t],r)}),n)}function be(e,t,n=an,l=!1){if(n){const r=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...l)=>{if(n.isUnmounted)return;(0,a.C4)();const r=sn(n),s=o(t,n,e,l);return r(),(0,a.bl)(),s});return l?r.unshift(s):r.push(s),s}}RegExp,RegExp;const we=e=>(t,n=an)=>(!hn||"sp"===e)&&be(e,((...e)=>t(...e)),n),ke=we("bm"),Ee=we("m"),xe=we("bu"),Se=we("u"),Me=we("bum"),Ce=we("um"),_e=we("sp"),Te=we("rtg"),Le=we("rtc");function Ae(e,t=an){be("ec",e,t)}function $e(e,t,n,a){let r;const o=n&&n[a];if((0,l.cy)(e)||(0,l.Kg)(e)){r=new Array(e.length);for(let n=0,a=e.length;nt(e,n,void 0,o&&o[n])));else{const n=Object.keys(e);r=new Array(n.length);for(let a=0,l=n.length;ae?un(e)?mn(e)||e.proxy:Be(e.parent):null,We=(0,l.X$)(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=>Be(e.parent),$root:e=>Be(e.root),$emit:e=>e.emit,$options:e=>Ne(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,y(e.update)}),$nextTick:e=>e.n||(e.n=g.bind(e.proxy)),$watch:e=>q.bind(e)}),Re=(e,t)=>e!==l.MZ&&!e.__isScriptSetup&&(0,l.$3)(e,t),Ie={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:c,appContext:u}=e;let p;if("$"!==t[0]){const a=i[t];if(void 0!==a)switch(a){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(Re(r,t))return i[t]=1,r[t];if(o!==l.MZ&&(0,l.$3)(o,t))return i[t]=2,o[t];if((p=e.propsOptions[0])&&(0,l.$3)(p,t))return i[t]=3,s[t];if(n!==l.MZ&&(0,l.$3)(n,t))return i[t]=4,n[t];Oe&&(i[t]=0)}}const d=We[t];let h,v;return d?("$attrs"===t&&(0,a.u4)(e,"get",t),d(e)):(h=c.__cssModules)&&(h=h[t])?h:n!==l.MZ&&(0,l.$3)(n,t)?(i[t]=4,n[t]):(v=u.config.globalProperties,(0,l.$3)(v,t)?v[t]:void 0)},set({_:e},t,n){const{data:a,setupState:r,ctx:o}=e;return Re(r,t)?(r[t]=n,!0):a!==l.MZ&&(0,l.$3)(a,t)?(a[t]=n,!0):!((0,l.$3)(e.props,t)||"$"===t[0]&&t.slice(1)in e||(o[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:a,appContext:r,propsOptions:o}},s){let i;return!!n[s]||e!==l.MZ&&(0,l.$3)(e,s)||Re(t,s)||(i=o[0])&&(0,l.$3)(i,s)||(0,l.$3)(a,s)||(0,l.$3)(We,s)||(0,l.$3)(r.config.globalProperties,s)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:(0,l.$3)(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Pe(e){return(0,l.cy)(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}let Oe=!0;function ze(e,t,n){o((0,l.cy)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Ve(e,t,n,a){const r=a.includes(".")?G(n,a):()=>n[a];if((0,l.Kg)(e)){const n=t[e];(0,l.Tn)(n)&&U(r,n)}else if((0,l.Tn)(e))U(r,e.bind(n));else if((0,l.Gv)(e))if((0,l.cy)(e))e.forEach((e=>Ve(e,t,n,a)));else{const a=(0,l.Tn)(e.handler)?e.handler.bind(n):t[e.handler];(0,l.Tn)(a)&&U(r,a,e)}}function Ne(e){const t=e.type,{mixins:n,extends:a}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:s}}=e.appContext,i=o.get(t);let c;return i?c=i:r.length||n||a?(c={},r.length&&r.forEach((e=>je(c,e,s,!0))),je(c,t,s)):c=t,(0,l.Gv)(t)&&o.set(t,c),c}function je(e,t,n,a=!1){const{mixins:l,extends:r}=t;r&&je(e,r,n,!0),l&&l.forEach((t=>je(e,t,n,!0)));for(const l in t)if(a&&"expose"===l);else{const a=De[l]||n&&n[l];e[l]=a?a(e[l],t[l]):t[l]}return e}const De={data:Fe,props:qe,emits:qe,methods:Ke,computed:Ke,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:Ke,directives:Ke,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,l.X$)(Object.create(null),e);for(const a in t)n[a]=Ue(e[a],t[a]);return n},provide:Fe,inject:function(e,t){return Ke(He(e),He(t))}};function Fe(e,t){return t?e?function(){return(0,l.X$)((0,l.Tn)(e)?e.call(this,this):e,(0,l.Tn)(t)?t.call(this,this):t)}:t:e}function He(e){if((0,l.cy)(e)){const t={};for(let n=0;n(o.has(e)||(e&&(0,l.Tn)(e.install)?(o.add(e),e.install(i,...t)):(0,l.Tn)(e)&&(o.add(e),e(i,...t))),i),mixin:e=>(r.mixins.includes(e)||r.mixins.push(e),i),component:(e,t)=>t?(r.components[e]=t,i):r.components[e],directive:(e,t)=>t?(r.directives[e]=t,i):r.directives[e],mount(l,o,c){if(!s){const u=Kt(n,a);return u.appContext=r,!0===c?c="svg":!1===c&&(c=void 0),o&&t?t(u,l):e(u,l,c),s=!0,i._container=l,l.__vue_app__=i,mn(u.component)||u.component.proxy}},unmount(){s&&(e(null,i._container),delete i._container.__vue_app__)},provide:(e,t)=>(r.provides[e]=t,i),runWithContext(e){const t=Xe;Xe=i;try{return e()}finally{Xe=t}}};return i}}let Xe=null;function Qe(e,t){if(an){let n=an.provides;const a=an.parent&&an.parent.provides;a===n&&(n=an.provides=Object.create(a)),n[e]=t}}function Je(e,t,n=!1){const a=an||T;if(a||Xe){const r=a?null==a.parent?a.vnode.appContext&&a.vnode.appContext.provides:a.parent.provides:Xe._context.provides;if(r&&e in r)return r[e];if(arguments.length>1)return n&&(0,l.Tn)(t)?t.call(a&&a.proxy):t}}function et(e,t,n,r){const[o,s]=e.propsOptions;let i,c=!1;if(t)for(let a in t){if((0,l.SU)(a))continue;const u=t[a];let p;o&&(0,l.$3)(o,p=(0,l.PT)(a))?s&&s.includes(p)?(i||(i={}))[p]=u:n[p]=u:_(e.emitsOptions,a)||a in r&&u===r[a]||(r[a]=u,c=!0)}if(s){const t=(0,a.ux)(n),r=i||l.MZ;for(let a=0;a{c=!0;const[n,a]=nt(e,t,!0);(0,l.X$)(s,n),a&&i.push(...a)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!o&&!c)return(0,l.Gv)(e)&&a.set(e,l.Oj),l.Oj;if((0,l.cy)(o))for(let e=0;e-1,a[1]=n<0||e-1||(0,l.$3)(a,"default"))&&i.push(t)}}}const u=[s,i];return(0,l.Gv)(e)&&a.set(e,u),u}function at(e){return"$"!==e[0]&&!(0,l.SU)(e)}function lt(e){return null===e?"null":"function"==typeof e?e.name||"":"object"==typeof e&&e.constructor&&e.constructor.name||""}function rt(e,t){return lt(e)===lt(t)}function ot(e,t){return(0,l.cy)(t)?t.findIndex((t=>rt(t,e))):(0,l.Tn)(t)&&rt(t,e)?0:-1}const st=e=>"_"===e[0]||"$stable"===e,it=e=>(0,l.cy)(e)?e.map(Xt):[Xt(e)],ct=(e,t,n)=>{if(t._n)return t;const a=$(((...e)=>it(t(...e))),n);return a._c=!1,a},ut=(e,t,n)=>{const a=e._ctx;for(const n in e){if(st(n))continue;const r=e[n];if((0,l.Tn)(r))t[n]=ct(0,r,a);else if(null!=r){const e=it(r);t[n]=()=>e}}},pt=(e,t)=>{const n=it(t);e.slots.default=()=>n},dt=(e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,a.ux)(t),(0,l.yQ)(t,"_",n)):ut(t,e.slots={})}else e.slots={},t&&pt(e,t);(0,l.yQ)(e.slots,Dt,1)},ht=(e,t,n)=>{const{vnode:a,slots:r}=e;let o=!0,s=l.MZ;if(32&a.shapeFlag){const e=t._;e?n&&1===e?o=!1:((0,l.X$)(r,t),n||1!==e||delete r._):(o=!t.$stable,ut(t,r)),s=t}else t&&(pt(e,t),s={default:1});if(o)for(const e in r)st(e)||null!=s[e]||delete r[e]};function vt(e,t,n,o,s=!1){if((0,l.cy)(e))return void e.forEach(((e,a)=>vt(e,t&&((0,l.cy)(t)?t[a]:t),n,o,s)));if(pe(o)&&!s)return;const i=4&o.shapeFlag?mn(o.component)||o.component.proxy:o.el,c=s?null:i,{i:u,r:p}=e,d=t&&t.r,h=u.refs===l.MZ?u.refs={}:u.refs,v=u.setupState;if(null!=d&&d!==p&&((0,l.Kg)(d)?(h[d]=null,(0,l.$3)(v,d)&&(v[d]=null)):(0,a.i9)(d)&&(d.value=null)),(0,l.Tn)(p))r(p,u,12,[c,h]);else{const t=(0,l.Kg)(p),r=(0,a.i9)(p);if(t||r){const a=()=>{if(e.f){const n=t?(0,l.$3)(v,p)?v[p]:h[p]:p.value;s?(0,l.cy)(n)&&(0,l.TF)(n,i):(0,l.cy)(n)?n.includes(i)||n.push(i):t?(h[p]=[i],(0,l.$3)(v,p)&&(v[p]=h[p])):(p.value=[i],e.k&&(h[e.k]=p.value))}else t?(h[p]=c,(0,l.$3)(v,p)&&(v[p]=c)):r&&(p.value=c,e.k&&(h[e.k]=c))};c?(a.id=-1,bt(a,n)):a()}}}let ft=!1;const mt=e=>(e=>e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)(e)?"svg":(e=>e.namespaceURI.includes("MathML"))(e)?"mathml":void 0,gt=e=>8===e.nodeType;function yt(e){const{mt:t,p:n,o:{patchProp:a,createText:r,nextSibling:o,parentNode:s,remove:i,insert:c,createComment:u}}=e,p=(n,a,l,i,u,b=!1)=>{const w=gt(n)&&"["===n.data,k=()=>f(n,a,l,i,u,w),{type:E,ref:x,shapeFlag:S,patchFlag:M}=a;let C=n.nodeType;a.el=n,-2===M&&(b=!1,a.dynamicChildren=null);let _=null;switch(E){case Lt:3!==C?""===a.children?(c(a.el=r(""),s(n),n),_=n):_=k():(n.data!==a.children&&(ft=!0,n.data=a.children),_=o(n));break;case At:y(n)?(_=o(n),g(a.el=n.content.firstChild,n,l)):_=8!==C||w?k():o(n);break;case $t:if(w&&(C=(n=o(n)).nodeType),1===C||3===C){_=n;const e=!a.children.length;for(let t=0;t{s=s||!!t.dynamicChildren;const{type:c,props:u,patchFlag:p,shapeFlag:d,dirs:v,transition:f}=t,m="input"===c||"option"===c;if(m||-1!==p){v&&X(t,null,n,"created");let c,b=!1;if(y(e)){b=Mt(r,f)&&n&&n.vnode.props&&n.vnode.props.appear;const a=e.content.firstChild;b&&f.beforeEnter(a),g(a,e,n),t.el=e=a}if(16&d&&(!u||!u.innerHTML&&!u.textContent)){let a=h(e.firstChild,t,e,n,r,o,s);for(;a;){ft=!0;const e=a;a=a.nextSibling,i(e)}}else 8&d&&e.textContent!==t.children&&(ft=!0,e.textContent=t.children);if(u)if(m||!s||48&p)for(const t in u)(m&&(t.endsWith("value")||"indeterminate"===t)||(0,l.Mp)(t)&&!(0,l.SU)(t)||"."===t[0])&&a(e,t,null,u[t],void 0,void 0,n);else u.onClick&&a(e,"onClick",null,u.onClick,void 0,void 0,n);(c=u&&u.onVnodeBeforeMount)&&en(c,n,t),v&&X(t,null,n,"beforeMount"),((c=u&&u.onVnodeMounted)||v||b)&&N((()=>{c&&en(c,n,t),b&&f.enter(e),v&&X(t,null,n,"mounted")}),r)}return e.nextSibling},h=(e,t,a,l,r,o,s)=>{s=s||!!t.dynamicChildren;const i=t.children,c=i.length;for(let t=0;t{const{slotScopeIds:i}=t;i&&(l=l?l.concat(i):i);const p=s(e),d=h(o(e),t,p,n,a,l,r);return d&>(d)&&"]"===d.data?o(t.anchor=d):(ft=!0,c(t.anchor=u("]"),p,d),d)},f=(e,t,a,l,r,c)=>{if(ft=!0,t.el=null,c){const t=m(e);for(;;){const n=o(e);if(!n||n===t)break;i(n)}}const u=o(e),p=s(e);return i(e),n(null,t,p,u,a,l,mt(p),r),u},m=(e,t="[",n="]")=>{let a=0;for(;e;)if((e=o(e))&>(e)&&(e.data===t&&a++,e.data===n)){if(0===a)return o(e);a--}return e},g=(e,t,n)=>{const a=t.parentNode;a&&a.replaceChild(e,t);let l=n;for(;l;)l.vnode.el===t&&(l.vnode.el=l.subTree.el=e),l=l.parent},y=e=>1===e.nodeType&&"template"===e.tagName.toLowerCase();return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),k(),void(t._vnode=e);ft=!1,p(t.firstChild,e,null,null,null),k(),t._vnode=e,ft&&console.error("Hydration completed but contains mismatches.")},p]}const bt=N;function wt(e){return Et(e)}function kt(e){return Et(e,yt)}function Et(e,t){(0,l.We)().__VUE__=!0;const{insert:n,remove:o,patchProp:i,createElement:c,createText:d,createComment:h,setText:v,setElementText:f,parentNode:m,nextSibling:g,setScopeId:b=l.tE,insertStaticContent:E}=e,x=(e,t,n,a=null,l=null,r=null,o=void 0,s=null,i=!!t.dynamicChildren)=>{if(e===t)return;e&&!jt(e,t)&&(a=te(e),Y(e,l,r,!0),e=null),-2===t.patchFlag&&(i=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:p}=t;switch(c){case Lt:S(e,t,n,a);break;case At:T(e,t,n,a);break;case $t:null==e&&L(t,n,a,o);break;case Tt:V(e,t,n,a,l,r,o,s,i);break;default:1&p?A(e,t,n,a,l,r,o,s,i):6&p?N(e,t,n,a,l,r,o,s,i):(64&p||128&p)&&c.process(e,t,n,a,l,r,o,s,i,le)}null!=u&&l&&vt(u,e&&e.ref,r,t||e,!t)},S=(e,t,a,l)=>{if(null==e)n(t.el=d(t.children),a,l);else{const n=t.el=e.el;t.children!==e.children&&v(n,t.children)}},T=(e,t,a,l)=>{null==e?n(t.el=h(t.children||""),a,l):t.el=e.el},L=(e,t,n,a)=>{[e.el,e.anchor]=E(e.children,t,n,a,e.el,e.anchor)},A=(e,t,n,a,l,r,o,s,i)=>{"svg"===t.type?o="svg":"math"===t.type&&(o="mathml"),null==e?$(t,n,a,l,r,o,s,i):P(e,t,l,r,o,s,i)},$=(e,t,a,r,o,s,u,p)=>{let d,h;const{props:v,shapeFlag:m,transition:g,dirs:y}=e;if(d=e.el=c(e.type,s,v&&v.is,v),8&m?f(d,e.children):16&m&&R(e.children,d,null,r,o,xt(e,s),u,p),y&&X(e,null,r,"created"),W(d,e,e.scopeId,u,r),v){for(const t in v)"value"===t||(0,l.SU)(t)||i(d,t,null,v[t],s,e.children,r,o,ee);"value"in v&&i(d,"value",null,v.value,s),(h=v.onVnodeBeforeMount)&&en(h,r,e)}y&&X(e,null,r,"beforeMount");const b=Mt(o,g);b&&g.beforeEnter(d),n(d,t,a),((h=v&&v.onVnodeMounted)||b||y)&&bt((()=>{h&&en(h,r,e),b&&g.enter(d),y&&X(e,null,r,"mounted")}),o)},W=(e,t,n,a,l)=>{if(n&&b(e,n),a)for(let t=0;t{for(let c=i;c{const c=t.el=e.el;let{patchFlag:u,dynamicChildren:p,dirs:d}=t;u|=16&e.patchFlag;const h=e.props||l.MZ,v=t.props||l.MZ;let m;if(n&&St(n,!1),(m=v.onVnodeBeforeUpdate)&&en(m,n,t,e),d&&X(t,e,n,"beforeUpdate"),n&&St(n,!0),p?O(e.dynamicChildren,p,c,n,a,xt(t,r),o):s||U(e,t,c,null,n,a,xt(t,r),o,!1),u>0){if(16&u)z(c,t,h,v,n,a,r);else if(2&u&&h.class!==v.class&&i(c,"class",null,v.class,r),4&u&&i(c,"style",h.style,v.style,r),8&u){const l=t.dynamicProps;for(let t=0;t{m&&en(m,n,t,e),d&&X(t,e,n,"updated")}),a)},O=(e,t,n,a,l,r,o)=>{for(let s=0;s{if(n!==a){if(n!==l.MZ)for(const c in n)(0,l.SU)(c)||c in a||i(e,c,n[c],null,s,t.children,r,o,ee);for(const c in a){if((0,l.SU)(c))continue;const u=a[c],p=n[c];u!==p&&"value"!==c&&i(e,c,p,u,s,t.children,r,o,ee)}"value"in a&&i(e,"value",n.value,a.value,s)}},V=(e,t,a,l,r,o,s,i,c)=>{const u=t.el=e?e.el:d(""),p=t.anchor=e?e.anchor:d("");let{patchFlag:h,dynamicChildren:v,slotScopeIds:f}=t;f&&(i=i?i.concat(f):f),null==e?(n(u,a,l),n(p,a,l),R(t.children||[],a,p,r,o,s,i,c)):h>0&&64&h&&v&&e.dynamicChildren?(O(e.dynamicChildren,v,a,r,o,s,i),(null!=t.key||r&&t===r.subTree)&&Ct(e,t,!0)):U(e,t,a,p,r,o,s,i,c)},N=(e,t,n,a,l,r,o,s,i)=>{t.slotScopeIds=s,null==e?512&t.shapeFlag?l.ctx.activate(t,n,a,o,i):j(t,n,a,l,r,o,i):D(e,t,i)},j=(e,t,n,o,i,c,u)=>{const p=e.component=function(e,t,n){const r=e.type,o=(t?t.appContext:e.appContext)||tn,s={uid:nn++,vnode:e,type:r,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new a.yC(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:nt(r,o),emitsOptions:C(r,o),emit:null,emitted:null,propsDefaults:l.MZ,inheritAttrs:r.inheritAttrs,ctx:l.MZ,data:l.MZ,props:l.MZ,attrs:l.MZ,slots:l.MZ,refs:l.MZ,setupState:l.MZ,setupContext:null,attrsProxy:null,slotsProxy:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=M.bind(null,s),e.ce&&e.ce(s),s}(e,o,i);if(ve(e)&&(p.ctx.renderer=le),function(e,t=!1){t&&on(t);const{props:n,children:o}=e.vnode,i=un(e);!function(e,t,n,r=!1){const o={},s={};(0,l.yQ)(s,Dt,1),e.propsDefaults=Object.create(null),et(e,t,o,s);for(const t in e.propsOptions[0])t in o||(o[t]=void 0);n?e.props=r?o:(0,a.Gc)(o):e.type.props?e.props=o:e.props=s,e.attrs=s}(e,n,i,t),dt(e,o);const c=i?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,a.IG)(new Proxy(e.ctx,Ie));const{setup:o}=n;if(o){const n=e.setupContext=o.length>1?function(e){const t=t=>{e.exposed=t||{}};return{get attrs(){return function(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get:(t,n)=>((0,a.u4)(e,"get","$attrs"),t[n])}))}(e)},slots:e.slots,emit:e.emit,expose:t}}(e):null,i=sn(e);(0,a.C4)();const c=r(o,e,0,[e.props,n]);if((0,a.bl)(),i(),(0,l.yL)(c)){if(c.then(cn,cn),t)return c.then((n=>{vn(e,n,t)})).catch((t=>{s(t,e,0)}));e.asyncDep=c}else vn(e,c,t)}else fn(e,t)}(e,t):void 0;t&&on(!1)}(p),p.asyncDep){if(i&&i.registerDep(p,F),!e.el){const e=p.subTree=Kt(At);T(null,e,t,n)}}else F(p,e,t,n,i,c,u)},D=(e,t,n)=>{const a=t.component=e.component;if(function(e,t,n){const{props:a,children:l,component:r}=e,{props:o,children:s,patchFlag:i}=t,c=r.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&i>=0))return!(!l&&!s||s&&s.$stable)||a!==o&&(a?!o||I(a,o,c):!!o);if(1024&i)return!0;if(16&i)return a?I(a,o,c):!!o;if(8&i){const e=t.dynamicProps;for(let t=0;tp&&u.splice(t,1)}(a.update),a.effect.dirty=!0,a.update()}else t.el=e.el,a.vnode=t},F=(e,t,n,r,o,s,i)=>{const c=()=>{if(e.isMounted){let{next:t,bu:n,u:a,parent:r,vnode:u}=e;{const n=_t(e);if(n)return t&&(t.el=u.el,H(e,t,i)),void n.asyncDep.then((()=>{e.isUnmounted||c()}))}let p,d=t;St(e,!1),t?(t.el=u.el,H(e,t,i)):t=u,n&&(0,l.DY)(n),(p=t.props&&t.props.onVnodeBeforeUpdate)&&en(p,r,t,u),St(e,!0);const h=B(e),v=e.subTree;e.subTree=h,x(v,h,m(v.el),te(v),e,o,s),t.el=h.el,null===d&&function({vnode:e,parent:t},n){for(;t;){const a=t.subTree;if(a.suspense&&a.suspense.activeBranch===e&&(a.el=e.el),a!==e)break;(e=t.vnode).el=n,t=t.parent}}(e,h.el),a&&bt(a,o),(p=t.props&&t.props.onVnodeUpdated)&&bt((()=>en(p,r,t,u)),o)}else{let a;const{el:i,props:c}=t,{bm:u,m:p,parent:d}=e,h=pe(t);if(St(e,!1),u&&(0,l.DY)(u),!h&&(a=c&&c.onVnodeBeforeMount)&&en(a,d,t),St(e,!0),i&&oe){const n=()=>{e.subTree=B(e),oe(i,e.subTree,e,o,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const a=e.subTree=B(e);x(null,a,n,r,e,o,s),t.el=a.el}if(p&&bt(p,o),!h&&(a=c&&c.onVnodeMounted)){const e=t;bt((()=>en(a,d,e)),o)}(256&t.shapeFlag||d&&pe(d.vnode)&&256&d.vnode.shapeFlag)&&e.a&&bt(e.a,o),e.isMounted=!0,t=n=r=null}},u=e.effect=new a.X2(c,l.tE,(()=>y(p)),e.scope),p=e.update=()=>{u.dirty&&u.run()};p.id=e.uid,St(e,!0),p()},H=(e,t,n)=>{t.component=e;const r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,c=(0,a.ux)(o),[u]=e.propsOptions;let p=!1;if(!(r||i>0)||16&i){let a;et(e,t,o,s)&&(p=!0);for(const r in c)t&&((0,l.$3)(t,r)||(a=(0,l.Tg)(r))!==r&&(0,l.$3)(t,a))||(u?!n||void 0===n[r]&&void 0===n[a]||(o[r]=tt(u,c,r,void 0,e,!0)):delete o[r]);if(s!==c)for(const e in s)t&&(0,l.$3)(t,e)||(delete s[e],p=!0)}else if(8&i){const n=e.vnode.dynamicProps;for(let a=0;a{const c=e&&e.children,u=e?e.shapeFlag:0,p=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void q(c,p,n,a,l,r,o,s,i);if(256&d)return void K(c,p,n,a,l,r,o,s,i)}8&h?(16&u&&ee(c,l,r),p!==c&&f(n,p)):16&u?16&h?q(c,p,n,a,l,r,o,s,i):ee(c,l,r,!0):(8&u&&f(n,""),16&h&&R(p,n,a,l,r,o,s,i))},K=(e,t,n,a,r,o,s,i,c)=>{e=e||l.Oj,t=t||l.Oj;const u=e.length,p=t.length,d=Math.min(u,p);let h;for(h=0;hp?ee(e,r,o,!0,!1,d):R(t,n,a,r,o,s,i,c,d)},q=(e,t,n,a,r,o,s,i,c)=>{let u=0;const p=t.length;let d=e.length-1,h=p-1;for(;u<=d&&u<=h;){const a=e[u],l=t[u]=c?Qt(t[u]):Xt(t[u]);if(!jt(a,l))break;x(a,l,n,null,r,o,s,i,c),u++}for(;u<=d&&u<=h;){const a=e[d],l=t[h]=c?Qt(t[h]):Xt(t[h]);if(!jt(a,l))break;x(a,l,n,null,r,o,s,i,c),d--,h--}if(u>d){if(u<=h){const e=h+1,l=eh)for(;u<=d;)Y(e[u],r,o,!0),u++;else{const v=u,f=u,m=new Map;for(u=f;u<=h;u++){const e=t[u]=c?Qt(t[u]):Xt(t[u]);null!=e.key&&m.set(e.key,u)}let g,y=0;const b=h-f+1;let w=!1,k=0;const E=new Array(b);for(u=0;u=b){Y(a,r,o,!0);continue}let l;if(null!=a.key)l=m.get(a.key);else for(g=f;g<=h;g++)if(0===E[g-f]&&jt(a,t[g])){l=g;break}void 0===l?Y(a,r,o,!0):(E[l-f]=u+1,l>=k?k=l:w=!0,x(a,t[l],n,null,r,o,s,i,c),y++)}const S=w?function(e){const t=e.slice(),n=[0];let a,l,r,o,s;const i=e.length;for(a=0;a>1,e[n[s]]0&&(t[a]=n[r-1]),n[r]=a)}}for(r=n.length,o=n[r-1];r-- >0;)n[r]=o,o=t[o];return n}(E):l.Oj;for(g=S.length-1,u=b-1;u>=0;u--){const e=f+u,l=t[e],d=e+1{const{el:o,type:s,transition:i,children:c,shapeFlag:u}=e;if(6&u)G(e.component.subTree,t,a,l);else if(128&u)e.suspense.move(t,a,l);else if(64&u)s.move(e,t,a,le);else if(s!==Tt)if(s!==$t)if(2!==l&&1&u&&i)if(0===l)i.beforeEnter(o),n(o,t,a),bt((()=>i.enter(o)),r);else{const{leave:e,delayLeave:l,afterLeave:r}=i,s=()=>n(o,t,a),c=()=>{e(o,(()=>{s(),r&&r()}))};l?l(o,s,c):c()}else n(o,t,a);else(({el:e,anchor:t},a,l)=>{let r;for(;e&&e!==t;)r=g(e),n(e,a,l),e=r;n(t,a,l)})(e,t,a);else{n(o,t,a);for(let e=0;e{const{type:r,props:o,ref:s,children:i,dynamicChildren:c,shapeFlag:u,patchFlag:p,dirs:d}=e;if(null!=s&&vt(s,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&d,v=!pe(e);let f;if(v&&(f=o&&o.onVnodeBeforeUnmount)&&en(f,t,e),6&u)J(e.component,n,a);else{if(128&u)return void e.suspense.unmount(n,a);h&&X(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,l,le,a):c&&(r!==Tt||p>0&&64&p)?ee(c,t,n,!1,!0):(r===Tt&&384&p||!l&&16&u)&&ee(i,t,n),a&&Z(e)}(v&&(f=o&&o.onVnodeUnmounted)||h)&&bt((()=>{f&&en(f,t,e),h&&X(e,null,t,"unmounted")}),n)},Z=e=>{const{type:t,el:n,anchor:a,transition:l}=e;if(t===Tt)return void Q(n,a);if(t===$t)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),o(e),e=n;o(t)})(e);const r=()=>{o(n),l&&!l.persisted&&l.afterLeave&&l.afterLeave()};if(1&e.shapeFlag&&l&&!l.persisted){const{leave:t,delayLeave:a}=l,o=()=>t(n,r);a?a(e.el,r,o):o()}else r()},Q=(e,t)=>{let n;for(;e!==t;)n=g(e),o(e),e=n;o(t)},J=(e,t,n)=>{const{bum:a,scope:r,update:o,subTree:s,um:i}=e;a&&(0,l.DY)(a),r.stop(),o&&(o.active=!1,Y(s,e,t,n)),i&&bt(i,t),bt((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},ee=(e,t,n,a=!1,l=!1,r=0)=>{for(let o=r;o6&e.shapeFlag?te(e.component.subTree):128&e.shapeFlag?e.suspense.next():g(e.anchor||e.el);let ne=!1;const ae=(e,t,n)=>{null==e?t._vnode&&Y(t._vnode,null,null,!0):x(t._vnode||null,e,t,null,null,null,n),ne||(ne=!0,w(),k(),ne=!1),t._vnode=e},le={p:x,um:Y,m:G,r:Z,mt:j,mc:R,pc:U,pbc:O,n:te,o:e};let re,oe;return t&&([re,oe]=t(le)),{render:ae,hydrate:re,createApp:Ze(ae,re)}}function xt({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function St({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Mt(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ct(e,t,n=!1){const a=e.children,r=t.children;if((0,l.cy)(a)&&(0,l.cy)(r))for(let e=0;e0?Wt||l.Oj:null,Bt.pop(),Wt=Bt[Bt.length-1]||null,It>0&&Wt&&Wt.push(e),e}function zt(e,t,n,a,l,r){return Ot(Ut(e,t,n,a,l,r,!0))}function Vt(e,t,n,a,l){return Ot(Kt(e,t,n,a,l,!0))}function Nt(e){return!!e&&!0===e.__v_isVNode}function jt(e,t){return e.type===t.type&&e.key===t.key}const Dt="__vInternal",Ft=({key:e})=>null!=e?e:null,Ht=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?(0,l.Kg)(e)||(0,a.i9)(e)||(0,l.Tn)(e)?{i:T,r:e,k:t,f:!!n}:e:null);function Ut(e,t=null,n=null,a=0,r=null,o=(e===Tt?0:1),s=!1,i=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ft(t),ref:t&&Ht(t),scopeId:L,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:o,patchFlag:a,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:T};return i?(Jt(c,n),128&o&&e.normalize(c)):n&&(c.shapeFlag|=(0,l.Kg)(n)?8:16),It>0&&!s&&Wt&&(c.patchFlag>0||6&o)&&32!==c.patchFlag&&Wt.push(c),c}const Kt=function(e,t=null,n=null,r=0,o=null,s=!1){if(e&&e!==z||(e=At),Nt(e)){const a=qt(e,t,!0);return n&&Jt(a,n),It>0&&!s&&Wt&&(6&a.shapeFlag?Wt[Wt.indexOf(e)]=a:Wt.push(a)),a.patchFlag|=-2,a}if(i=e,(0,l.Tn)(i)&&"__vccOpts"in i&&(e=e.__vccOpts),t){t=function(e){return e?(0,a.ju)(e)||Dt in e?(0,l.X$)({},e):e:null}(t);let{class:e,style:n}=t;e&&!(0,l.Kg)(e)&&(t.class=(0,l.C4)(e)),(0,l.Gv)(n)&&((0,a.ju)(n)&&!(0,l.cy)(n)&&(n=(0,l.X$)({},n)),t.style=(0,l.Tr)(n))}var i;return Ut(e,t,n,r,o,(0,l.Kg)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,l.Gv)(e)?4:(0,l.Tn)(e)?2:0,s,!0)};function qt(e,t,n=!1){const{props:a,ref:r,patchFlag:o,children:s}=e,i=t?function(...e){const t={};for(let n=0;nan||T;let rn,on;{const e=(0,l.We)(),t=(t,n)=>{let a;return(a=e[t])||(a=e[t]=[]),a.push(n),e=>{a.length>1?a.forEach((t=>t(e))):a[0](e)}};rn=t("__VUE_INSTANCE_SETTERS__",(e=>an=e)),on=t("__VUE_SSR_SETTERS__",(e=>hn=e))}const sn=e=>{const t=an;return rn(e),e.scope.on(),()=>{e.scope.off(),rn(t)}},cn=()=>{an&&an.scope.off(),rn(null)};function un(e){return 4&e.vnode.shapeFlag}let pn,dn,hn=!1;function vn(e,t,n){(0,l.Tn)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,l.Gv)(t)&&(e.setupState=(0,a.Pr)(t)),fn(e,n)}function fn(e,t,n){const r=e.type;if(!e.render){if(!t&&pn&&!r.render){const t=r.template||Ne(e).template;if(t){const{isCustomElement:n,compilerOptions:a}=e.appContext.config,{delimiters:o,compilerOptions:s}=r,i=(0,l.X$)((0,l.X$)({isCustomElement:n,delimiters:o},a),s);r.render=pn(t,i)}}e.render=r.render||l.tE,dn&&dn(e)}{const t=sn(e);(0,a.C4)();try{!function(e){const t=Ne(e),n=e.proxy,r=e.ctx;Oe=!1,t.beforeCreate&&ze(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:c,provide:u,inject:p,created:d,beforeMount:h,mounted:v,beforeUpdate:f,updated:m,activated:g,deactivated:y,beforeDestroy:b,beforeUnmount:w,destroyed:k,unmounted:E,render:x,renderTracked:S,renderTriggered:M,errorCaptured:C,serverPrefetch:_,expose:T,inheritAttrs:L,components:A,directives:$,filters:B}=t;if(p&&function(e,t,n=l.tE){(0,l.cy)(e)&&(e=He(e));for(const n in e){const r=e[n];let o;o=(0,l.Gv)(r)?"default"in r?Je(r.from||n,r.default,!0):Je(r.from||n):Je(r),(0,a.i9)(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:e=>o.value=e}):t[n]=o}}(p,r,null),i)for(const e in i){const t=i[e];(0,l.Tn)(t)&&(r[e]=t.bind(n))}if(o){const t=o.call(n,n);(0,l.Gv)(t)&&(e.data=(0,a.Kh)(t))}if(Oe=!0,s)for(const e in s){const t=s[e],a=(0,l.Tn)(t)?t.bind(n,n):(0,l.Tn)(t.get)?t.get.bind(n,n):l.tE,o=!(0,l.Tn)(t)&&(0,l.Tn)(t.set)?t.set.bind(n):l.tE,i=gn({get:a,set:o});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e})}if(c)for(const e in c)Ve(c[e],r,n,e);if(u){const e=(0,l.Tn)(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{Qe(t,e[t])}))}function W(e,t){(0,l.cy)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(d&&ze(d,e,"c"),W(ke,h),W(Ee,v),W(xe,f),W(Se,m),W(fe,g),W(me,y),W(Ae,C),W(Le,S),W(Te,M),W(Me,w),W(Ce,E),W(_e,_),(0,l.cy)(T))if(T.length){const t=e.exposed||(e.exposed={});T.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});x&&e.render===l.tE&&(e.render=x),null!=L&&(e.inheritAttrs=L),A&&(e.components=A),$&&(e.directives=$)}(e)}finally{(0,a.bl)(),t()}}}function mn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,a.Pr)((0,a.IG)(e.exposed)),{get:(t,n)=>n in t?t[n]:n in We?We[n](e):void 0,has:(e,t)=>t in e||t in We}))}const gn=(e,t)=>(0,a.EW)(e,t,hn);function yn(e,t,n){const a=arguments.length;return 2===a?(0,l.Gv)(t)&&!(0,l.cy)(t)?Nt(t)?Kt(e,null,[t]):Kt(e,t):Kt(e,null,t):(a>3?n=Array.prototype.slice.call(arguments,2):3===a&&Nt(n)&&(n=[n]),Kt(e,t,n))}const bn="3.4.19"},6476:(e,t,n)=>{n.d(t,{F:()=>Y,Jo:()=>ae,aG:()=>L,eB:()=>d,hp:()=>pe,m1:()=>me});var a=n(7847),l=n(4094),r=n(6719);const o="undefined"!=typeof document?document:null,s=o&&o.createElement("template"),i={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,a)=>{const l="svg"===t?o.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?o.createElementNS("http://www.w3.org/1998/Math/MathML",e):o.createElement(e,n?{is:n}:void 0);return"select"===e&&a&&null!=a.multiple&&l.setAttribute("multiple",a.multiple),l},createText:e=>o.createTextNode(e),createComment:e=>o.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>o.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,a,l,r){const o=n?n.previousSibling:t.lastChild;if(l&&(l===r||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),l!==r&&(l=l.nextSibling););else{s.innerHTML="svg"===a?`${e}`:"mathml"===a?`${e}`:e;const l=s.content;if("svg"===a||"mathml"===a){const e=l.firstChild;for(;e.firstChild;)l.appendChild(e.firstChild);l.removeChild(e)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},c="transition",u="animation",p=Symbol("_vtc"),d=(e,{slots:t})=>(0,a.h)(a.pR,g(e),t);d.displayName="Transition";const h={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},v=d.props=(0,l.X$)({},a.QP,h),f=(e,t=[])=>{(0,l.cy)(e)?e.forEach((e=>e(...t))):e&&e(...t)},m=e=>!!e&&((0,l.cy)(e)?e.some((e=>e.length>1)):e.length>1);function g(e){const t={};for(const n in e)n in h||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:a,duration:r,enterFromClass:o=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=s,appearToClass:p=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,E=function(e){if(null==e)return null;if((0,l.Gv)(e))return[y(e.enter),y(e.leave)];{const t=y(e);return[t,t]}}(r),S=E&&E[0],M=E&&E[1],{onBeforeEnter:C,onEnter:T,onEnterCancelled:L,onLeave:A,onLeaveCancelled:$,onBeforeAppear:B=C,onAppear:W=T,onAppearCancelled:R=L}=t,I=(e,t,n)=>{w(e,t?p:i),w(e,t?u:s),n&&n()},P=(e,t)=>{e._isLeaving=!1,w(e,d),w(e,g),w(e,v),t&&t()},O=e=>(t,n)=>{const l=e?W:T,r=()=>I(t,e,n);f(l,[t,r]),k((()=>{w(t,e?c:o),b(t,e?p:i),m(l)||x(t,a,S,r)}))};return(0,l.X$)(t,{onBeforeEnter(e){f(C,[e]),b(e,o),b(e,s)},onBeforeAppear(e){f(B,[e]),b(e,c),b(e,u)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>P(e,t);b(e,d),_(),b(e,v),k((()=>{e._isLeaving&&(w(e,d),b(e,g),m(A)||x(e,a,M,n))})),f(A,[e,n])},onEnterCancelled(e){I(e,!1),f(L,[e])},onAppearCancelled(e){I(e,!0),f(R,[e])},onLeaveCancelled(e){P(e),f($,[e])}})}function y(e){return(0,l.Ro)(e)}function b(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[p]||(e[p]=new Set)).add(t)}function w(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[p];n&&(n.delete(t),n.size||(e[p]=void 0))}function k(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let E=0;function x(e,t,n,a){const l=e._endId=++E,r=()=>{l===e._endId&&a()};if(n)return setTimeout(r,n);const{type:o,timeout:s,propCount:i}=S(e,t);if(!o)return a();const c=o+"end";let u=0;const p=()=>{e.removeEventListener(c,d),r()},d=t=>{t.target===e&&++u>=i&&p()};setTimeout((()=>{u(n[e]||"").split(", "),l=a(`${c}Delay`),r=a(`${c}Duration`),o=M(l,r),s=a(`${u}Delay`),i=a(`${u}Duration`),p=M(s,i);let d=null,h=0,v=0;return t===c?o>0&&(d=c,h=o,v=r.length):t===u?p>0&&(d=u,h=p,v=i.length):(h=Math.max(o,p),d=h>0?o>p?c:u:null,v=d?d===c?r.length:i.length:0),{type:d,timeout:h,propCount:v,hasTransform:d===c&&/\b(transform|all)(,|$)/.test(a(`${c}Property`).toString())}}function M(e,t){for(;e.lengthC(t)+C(e[n]))))}function C(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function _(){return document.body.offsetHeight}const T=Symbol("_vod"),L={beforeMount(e,{value:t},{transition:n}){e[T]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):A(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:a}){(!t!=!n||e.style.display!==e[T]&&t)&&(a?t?(a.beforeEnter(e),A(e,!0),a.enter(e)):a.leave(e,(()=>{A(e,!1)})):A(e,t))},beforeUnmount(e,{value:t}){A(e,t)}};function A(e,t){e.style.display=t?e[T]:"none"}const $=Symbol(""),B=/(^|;)\s*display\s*:/,W=/\s*!important$/;function R(e,t,n){if((0,l.cy)(n))n.forEach((n=>R(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const a=function(e,t){const n=P[t];if(n)return n;let a=(0,l.PT)(t);if("filter"!==a&&a in e)return P[t]=a;a=(0,l.ZH)(a);for(let n=0;nj||(D.then((()=>j=0)),j=Date.now()),H=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123;"undefined"!=typeof HTMLElement&&HTMLElement;const U=new WeakMap,K=new WeakMap,q=Symbol("_moveCb"),G=Symbol("_enterCb"),Y={name:"TransitionGroup",props:(0,l.X$)({},v,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,a.nI)(),l=(0,a.Gy)();let o,s;return(0,a.$u)((()=>{if(!o.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const a=e.cloneNode(),l=e[p];l&&l.forEach((e=>{e.split(/\s+/).forEach((e=>e&&a.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&a.classList.add(e))),a.style.display="none";const r=1===t.nodeType?t:t.parentNode;r.appendChild(a);const{hasTransform:o}=S(a);return r.removeChild(a),o}(o[0].el,n.vnode.el,t))return;o.forEach(Z),o.forEach(X);const a=o.filter(Q);_(),a.forEach((e=>{const n=e.el,a=n.style;b(n,t),a.transform=a.webkitTransform=a.transitionDuration="";const l=n[q]=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",l),n[q]=null,w(n,t))};n.addEventListener("transitionend",l)}))})),()=>{const i=(0,r.ux)(e),c=g(i);let u=i.tag||a.FK;o=s,s=t.default?(0,a.Df)(t.default()):[];for(let e=0;e{const t=e.props["onUpdate:modelValue"]||!1;return(0,l.cy)(t)?e=>(0,l.DY)(t,e):t};function ee(e){e.target.composing=!0}function te(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ne=Symbol("_assign"),ae={created(e,{modifiers:{lazy:t,trim:n,number:a}},r){e[ne]=J(r);const o=a||r.props&&"number"===r.props.type;z(e,t?"change":"input",(t=>{if(t.target.composing)return;let a=e.value;n&&(a=a.trim()),o&&(a=(0,l.bB)(a)),e[ne](a)})),n&&z(e,"change",(()=>{e.value=e.value.trim()})),t||(z(e,"compositionstart",ee),z(e,"compositionend",te),z(e,"change",te))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:a,number:r}},o){if(e[ne]=J(o),e.composing)return;const s=null==t?"":t;if((r||"number"===e.type?(0,l.bB)(e.value):e.value)!==s){if(document.activeElement===e&&"range"!==e.type){if(n)return;if(a&&e.value.trim()===s)return}e.value=s}}},le={deep:!0,created(e,t,n){e[ne]=J(n),z(e,"change",(()=>{const t=e._modelValue,n=ce(e),a=e.checked,r=e[ne];if((0,l.cy)(t)){const e=(0,l.u3)(t,n),o=-1!==e;if(a&&!o)r(t.concat(n));else if(!a&&o){const n=[...t];n.splice(e,1),r(n)}}else if((0,l.vM)(t)){const e=new Set(t);a?e.add(n):e.delete(n),r(e)}else r(ue(e,a))}))},mounted:re,beforeUpdate(e,t,n){e[ne]=J(n),re(e,t,n)}};function re(e,{value:t,oldValue:n},a){e._modelValue=t,(0,l.cy)(t)?e.checked=(0,l.u3)(t,a.props.value)>-1:(0,l.vM)(t)?e.checked=t.has(a.props.value):t!==n&&(e.checked=(0,l.BX)(t,ue(e,!0)))}const oe={created(e,{value:t},n){e.checked=(0,l.BX)(t,n.props.value),e[ne]=J(n),z(e,"change",(()=>{e[ne](ce(e))}))},beforeUpdate(e,{value:t,oldValue:n},a){e[ne]=J(a),t!==n&&(e.checked=(0,l.BX)(t,a.props.value))}},se={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=(0,l.vM)(t);z(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,l.bB)(ce(e)):ce(e)));e[ne](e.multiple?o?new Set(t):t:t[0]),e._assigning=!0,(0,a.dY)((()=>{e._assigning=!1}))})),e[ne]=J(r)},mounted(e,{value:t,oldValue:n,modifiers:{number:a}}){ie(e,t,0,a)},beforeUpdate(e,t,n){e[ne]=J(n)},updated(e,{value:t,oldValue:n,modifiers:{number:a}}){e._assigning||ie(e,t,0,a)}};function ie(e,t,n,a){const r=e.multiple,o=(0,l.cy)(t);if(!r||o||(0,l.vM)(t)){for(let n=0,s=e.options.length;n-1}else s.selected=t.has(i);else if((0,l.BX)(ce(s),t))return void(e.selectedIndex!==n&&(e.selectedIndex=n))}r||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ce(e){return"_value"in e?e._value:e.value}function ue(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const pe={created(e,t,n){de(e,t,n,null,"created")},mounted(e,t,n){de(e,t,n,null,"mounted")},beforeUpdate(e,t,n,a){de(e,t,n,a,"beforeUpdate")},updated(e,t,n,a){de(e,t,n,a,"updated")}};function de(e,t,n,a,l){const r=function(e,t){switch(e){case"SELECT":return se;case"TEXTAREA":return ae;default:switch(t){case"checkbox":return le;case"radio":return oe;default:return ae}}}(e.tagName,n.props&&n.props.type)[l];r&&r(e,t,n,a)}const he=(0,l.X$)({patchProp:(e,t,n,r,o,s,i,c,u)=>{const d="svg"===o;"class"===t?function(e,t,n){const a=e[p];a&&(t=(t?[t,...a]:[...a]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,d):"style"===t?function(e,t,n){const a=e.style,r=(0,l.Kg)(n),o=a.display;let s=!1;if(n&&!r){if(t&&!(0,l.Kg)(t))for(const e in t)null==n[e]&&R(a,e,"");for(const e in n)"display"===e&&(s=!0),R(a,e,n[e])}else if(r){if(t!==n){const e=a[$];e&&(n+=";"+e),a.cssText=n,s=B.test(n)}}else t&&e.removeAttribute("style");T in e&&(e[T]=s?a.display:"",a.display=o)}(e,n,r):(0,l.Mp)(t)?(0,l.CP)(t)||function(e,t,n,r,o=null){const s=e[V]||(e[V]={}),i=s[t];if(r&&i)i.value=r;else{const[n,c]=function(e){let t;if(N.test(e)){let n;for(t={};n=e.match(N);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):(0,l.Tg)(e.slice(2)),t]}(t);if(r){const i=s[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();(0,a.qL)(function(e,t){if((0,l.cy)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=F(),n}(r,o);z(e,n,i,c)}else i&&(function(e,t,n,a){e.removeEventListener(t,n,a)}(e,n,i,c),s[t]=void 0)}}(e,t,0,r,i):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,a){if(a)return"innerHTML"===t||"textContent"===t||!!(t in e&&H(t)&&(0,l.Tn)(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){const t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return(!H(t)||!(0,l.Kg)(n))&&t in e}(e,t,r,d))?function(e,t,n,a,r,o,s){if("innerHTML"===t||"textContent"===t)return a&&s(a,r,o),void(e[t]=null==n?"":n);const i=e.tagName;if("value"===t&&"PROGRESS"!==i&&!i.includes("-")){e._value=n;const a=null==n?"":n;return("OPTION"===i?e.getAttribute("value"):e.value)!==a&&(e.value=a),void(null==n&&e.removeAttribute(t))}let c=!1;if(""===n||null==n){const a=typeof e[t];"boolean"===a?n=(0,l.Y2)(n):null==n&&"string"===a?(n="",c=!0):"number"===a&&(n=0,c=!0)}try{e[t]=n}catch(e){}c&&e.removeAttribute(t)}(e,t,r,s,i,c,u):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,a,r){if(a&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(O,t.slice(6,t.length)):e.setAttributeNS(O,t,n);else{const a=(0,l.J$)(t);null==n||a&&!(0,l.Y2)(n)?e.removeAttribute(t):e.setAttribute(t,a?"":n)}}(e,t,r,d))}},i);let ve,fe=!1;const me=(...e)=>{const t=(ve=fe?ve:(0,a.ci)(he),fe=!0,ve).createApp(...e),{mount:n}=t;return t.mount=e=>{const t=function(e){if((0,l.Kg)(e))return document.querySelector(e);return e}(e);if(t)return n(t,!0,function(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}(t))},t}},4094:(e,t,n)=>{function a(e,t){const n=new Set(e.split(","));return t?e=>n.has(e.toLowerCase()):e=>n.has(e)}n.d(t,{$3:()=>h,$H:()=>O,BH:()=>H,BX:()=>J,Bm:()=>k,C4:()=>Z,CE:()=>f,CP:()=>c,DY:()=>z,Gv:()=>E,J$:()=>X,Kg:()=>w,MZ:()=>l,Mp:()=>i,NO:()=>s,Oj:()=>r,PT:()=>B,Qd:()=>_,Ro:()=>j,SU:()=>L,TF:()=>p,Tg:()=>R,Tn:()=>b,Tr:()=>U,We:()=>F,X$:()=>u,Y2:()=>Q,ZH:()=>I,Zf:()=>C,bB:()=>N,cy:()=>v,gd:()=>y,pD:()=>a,rU:()=>P,tE:()=>o,u3:()=>ee,vM:()=>m,v_:()=>te,yI:()=>T,yL:()=>x,yQ:()=>V});const l={},r=[],o=()=>{},s=()=>!1,i=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),c=e=>e.startsWith("onUpdate:"),u=Object.assign,p=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},d=Object.prototype.hasOwnProperty,h=(e,t)=>d.call(e,t),v=Array.isArray,f=e=>"[object Map]"===M(e),m=e=>"[object Set]"===M(e),g=e=>"[object Date]"===M(e),y=e=>"[object RegExp]"===M(e),b=e=>"function"==typeof e,w=e=>"string"==typeof e,k=e=>"symbol"==typeof e,E=e=>null!==e&&"object"==typeof e,x=e=>(E(e)||b(e))&&b(e.then)&&b(e.catch),S=Object.prototype.toString,M=e=>S.call(e),C=e=>M(e).slice(8,-1),_=e=>"[object Object]"===M(e),T=e=>w(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,L=a(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),A=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$=/-(\w)/g,B=A((e=>e.replace($,((e,t)=>t?t.toUpperCase():"")))),W=/\B([A-Z])/g,R=A((e=>e.replace(W,"-$1").toLowerCase())),I=A((e=>e.charAt(0).toUpperCase()+e.slice(1))),P=A((e=>e?`on${I(e)}`:"")),O=(e,t)=>!Object.is(e,t),z=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},N=e=>{const t=parseFloat(e);return isNaN(t)?e:t},j=e=>{const t=w(e)?Number(e):NaN;return isNaN(t)?e:t};let D;const F=()=>D||(D="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}),H=a("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error");function U(e){if(v(e)){const t={};for(let n=0;n{if(e){const n=e.split(q);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function Z(e){let t="";if(w(e))t=e;else if(v(e))for(let n=0;nJ(e,t)))}const te=e=>w(e)?e:null==e?"":v(e)||E(e)&&(e.toString===S||!b(e.toString))?JSON.stringify(e,ne,2):String(e),ne=(e,t)=>t&&t.__v_isRef?ne(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],a)=>(e[ae(t,a)+" =>"]=n,e)),{})}:m(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>ae(e)))}:k(t)?ae(t):!E(t)||v(t)||_(t)?t:String(t),ae=(e,t="")=>{var n;return k(e)?`Symbol(${null!=(n=e.description)?n:t})`:e}},7267:(e,t,n)=>{n.d(t,{A:()=>a});const a={mobileBreakPoint:"719px",pcBreakPoint:"1440px",enableThemeColor:"false"}},1392:(e,t,n)=>{var a=n(1819),l=n(6805),r=n(6476),o=n(7847),s=n(9354),i=n(6719),c=n(4499),u=n(7739),p=(0,i.IJ)(s.U),d=u.LA,h=([e,t,n=""])=>{const a=`head > ${e}${Object.entries(t).map((([e,t])=>(0,c.Kg)(t)?`[${e}=${JSON.stringify(t)}]`:!0===t?`[${e}]`:"")).join("")}`;return Array.from(document.querySelectorAll(a)).find((e=>e.innerText===n))||null},v=([e,t,n])=>{if(!(0,c.Kg)(e))return null;const a=document.createElement(e);return(0,c.Qd)(t)&&Object.entries(t).forEach((([e,t])=>{(0,c.Kg)(t)?a.setAttribute(e,t):!0===t&&a.setAttribute(e,"")})),(0,c.Kg)(n)&&a.appendChild(document.createTextNode(n)),a},f=r.m1;(async()=>{const e=f({name:"Vuepress",setup(){(()=>{const e=(0,a.Tl)(),t=(0,a.Nj)();let n=[];const l=()=>{document.documentElement.lang=t.value;const a=(()=>{const t=[];return e.value.forEach((e=>{const n=v(e);n&&t.push(n)})),t})();n.forEach(((e,t)=>{const l=a.findIndex((t=>e.isEqualNode(t)));-1===l?(e.remove(),delete n[t]):a.splice(l,1)})),a.forEach((e=>document.head.appendChild(e))),n=[...n.filter((e=>!!e)),...a]};(0,o.Gt)(a.q3,l),(0,o.sV)((()=>{e.value.forEach((e=>{const t=h(e);t&&n.push(t)})),(0,o.wB)(e,l,{immediate:!1})}))})();for(const e of l.B)e.setup?.();const e=l.B.flatMap((({rootComponents:e=[]})=>e.map((e=>(0,o.h)(e))))),t=(0,a.h0)();return()=>[(0,o.h)(t.value),e]}}),t=(()=>{const e=(0,u.aE)({history:d((0,c.TY)("/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(e,t,n)=>n||(e.hash?{el:e.hash}:{top:0})});return e.beforeResolve((async(e,t)=>{if(e.path!==t.path||t===u.Ps){const t=(0,a.ie)(e.path);if(t.path!==e.path)return t.path;const n=await t.loader();e.meta={...t.meta,_pageChunk:n}}else e.path===t.path&&(e.meta=t.meta)})),e})();(e=>{e.component("ClientOnly",a.YX),e.component("Content",a.UC),e.component("RouteLink",a.Wt)})(e),((e,t,n)=>{const l=(0,o.EW)((()=>t.currentRoute.value.path)),r=(0,i.rY)(((e,n)=>({get:()=>(e(),t.currentRoute.value.meta._pageChunk),set(e){t.currentRoute.value.meta._pageChunk=e,n()}}))),s=(0,o.EW)((()=>a.K6.resolveLayouts(n))),c=(0,o.EW)((()=>a.K6.resolveRouteLocale(p.value.locales,l.value))),u=(0,o.EW)((()=>a.K6.resolveSiteLocaleData(p.value,c.value))),d=(0,o.EW)((()=>r.value.comp)),h=(0,o.EW)((()=>r.value.data)),v=(0,o.EW)((()=>h.value.frontmatter)),f=(0,o.EW)((()=>a.K6.resolvePageHeadTitle(h.value,u.value))),m=(0,o.EW)((()=>a.K6.resolvePageHead(f.value,v.value,u.value))),g=(0,o.EW)((()=>a.K6.resolvePageLang(h.value,u.value))),y=(0,o.EW)((()=>a.K6.resolvePageLayout(h.value,s.value))),b={layouts:s,pageData:h,pageComponent:d,pageFrontmatter:v,pageHead:m,pageHeadTitle:f,pageLang:g,pageLayout:y,redirects:a.cq,routeLocale:c,routePath:l,routes:a.JZ,siteData:p,siteLocaleData:u};e.provide(a.sW,b),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>v.value},$head:{get:()=>m.value},$headTitle:{get:()=>f.value},$lang:{get:()=>g.value},$page:{get:()=>h.value},$routeLocale:{get:()=>c.value},$site:{get:()=>p.value},$siteLocale:{get:()=>u.value},$withBase:{get:()=>a.cV}})})(e,t,l.B);for(const n of l.B)await(n.enhance?.({app:e,router:t,siteData:p}));return e.use(t),{app:e,router:t}})().then((({app:e,router:t})=>{t.isReady().then((()=>{e.mount("#app")}))}))},1819:(e,t,n)=>{n.d(t,{BV:()=>u,JZ:()=>k,K6:()=>T,Nj:()=>h,R7:()=>p,Tl:()=>d,UC:()=>M,Wt:()=>_,YX:()=>S,Ye:()=>m,Zv:()=>f,cV:()=>C,cq:()=>w,h0:()=>v,ie:()=>x,lq:()=>s.lq,q3:()=>b,rR:()=>y,rU:()=>g,rd:()=>s.rd,sW:()=>i});var a=n(7847),l=n(4499),r=n(6159),o=n(6719),s=n(7739),i=Symbol(""),c=()=>{const e=(0,a.WQ)(i);if(!e)throw new Error("useClientData() is called without provider.");return e},u=()=>c().pageData,p=()=>c().pageFrontmatter,d=()=>c().pageHead,h=()=>c().pageLang,v=()=>c().pageLayout,f=()=>c().routeLocale,m=()=>c().routes,g=()=>c().siteData,y=()=>c().siteLocaleData,b=Symbol(""),w=(0,o.IJ)(r.c),k=(0,o.IJ)(r.J),E=e=>{const t=(0,l.UW)(e);if(k.value[t])return t;const n=encodeURI(t);return k.value[n]?n:w.value[t]||t},x=e=>{const t=E(e);return{path:t,notFound:!1,...k.value[t]??{...k.value["/404.html"],notFound:!0}}},S=(0,a.pM)({name:"ClientOnly",setup(e,t){const n=(0,o.KR)(!1);return(0,a.sV)((()=>{n.value=!0})),()=>n.value?t.slots.default?.():null}}),M=(0,a.pM)({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=c().pageComponent,n=(0,a.EW)((()=>{if(!e.path)return t.value;const n=x(e.path);return(0,a.$V)((()=>n.loader().then((({comp:e})=>e))))}));return()=>(0,a.h)(n.value)}}),C=e=>(0,l.r3)(e)?e:`/${(0,l.uv)(e)}`,_=({active:e=!1,activeClass:t="route-link-active",to:n,...l},{slots:r})=>{const o=(0,s.rd)(),i=C(E(n));return(0,a.h)("a",{...l,class:["route-link",{[t]:e}],href:i,onClick:(e={})=>{(e=>{if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget){const t=e.currentTarget.getAttribute("target");if(t?.match(/\b_blank\b/i))return}return e.preventDefault(),!0}})(e)?o.push(n).catch():Promise.resolve()}},r.default?.())};_.displayName="RouteLink",_.props={active:Boolean,activeClass:String,to:String};var T=(0,o.Kh)({resolveLayouts:e=>e.reduce(((e,t)=>({...e,...t.layouts})),{}),resolvePageHead:(e,t,n)=>{const a=(0,l.Kg)(t.description)?t.description:n.description,r=[...Array.isArray(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:a}]];return(0,l.W8)(r)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter((e=>!!e)).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{const n=(0,l.Kg)(e.frontmatter.layout)?e.frontmatter.layout:"Layout";if(!t[n])throw new Error(`[vuepress] Cannot resolve layout: ${n}`);return t[n]},resolveRouteLocale:(e,t)=>(0,l.cq)(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t],head:[...e.locales[t]?.head??[],...e.head??[]]})})},8981:(e,t,n)=>{n.d(t,{d5:()=>f,PT:()=>u.PT,A9:()=>u.A9,jO:()=>m,PW:()=>g,pp:()=>b,L4:()=>i,cy:()=>h,C8:()=>p,eM:()=>w,km:()=>u.km,r3:()=>u.r3,zn:()=>u.zn,Et:()=>d,Qd:()=>u.Qd,Kg:()=>u.Kg,HP:()=>y,TY:()=>u.TY,uv:()=>u.uv,w1:()=>v,s5:()=>r,jq:()=>o,uk:()=>c});var a=n(7847),l=n(3151);const r=e=>{const t=(0,l.Zv)();return(0,a.EW)((()=>e[t.value]??{}))},o=()=>{const e=(0,l.Ye)();return(0,a.EW)((()=>Object.keys(e.value)))};var s=n(4094);const i=(e,t)=>{const n=(t?._instance||(0,a.nI)())?.appContext.components;return!!n&&(e in n||(0,s.PT)(e)in n||(0,s.ZH)((0,s.PT)(e))in n)},c=e=>new Promise((t=>setTimeout(t,e)));var u=n(4499);const p=e=>void 0!==e,d=e=>"number"==typeof e,h=Array.isArray,v=(e,t)=>(0,u.Kg)(e)&&e.startsWith(t),f=(e,t)=>(0,u.Kg)(e)&&e.endsWith(t),m=Object.entries,g=Object.fromEntries,y=Object.keys,b=(Object.values,e=>{if(e){if("number"==typeof e)return new Date(e);const t=Date.parse(e.toString());if(!Number.isNaN(t))return new Date(t)}return null}),w=e=>v(e,"/")},4102:(e,t,n)=>{n.d(t,{A:()=>s});var a=n(3151),l=n(5670),r=n(2930);const o=async(e,t)=>{const{path:n,query:a}=e.currentRoute.value,{scrollBehavior:l}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:n,query:a,hash:t}),e.options.scrollBehavior=l},s=(0,a.re)({setup(){(({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:s=5})=>{const i=(0,a.rd)();(0,l.MLh)("scroll",(0,r.Q0)((()=>{const n=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(n-0)c.some((t=>t.hash===e.hash))));for(let e=0;e=(t.parentElement?.offsetTop??0)-s,c=!a||n<(a.parentElement?.offsetTop??0)-s;if(!l||!c)continue;const p=decodeURIComponent(i.currentRoute.value.hash),d=decodeURIComponent(t.hash);if(p===d)return;if(r)for(let t=e+1;t{n.d(t,{A:()=>u});var a=n(3151),l=n(8981),r=n(5670),o=n(7847),s=n(6719),i=n(6476);const c=(0,o.pM)({name:"BackToTop",setup(e){const t=(0,a.R7)(),n=(0,l.s5)({"/":{backToTop:"返回顶部"}}),c=(0,s.IJ)(),{height:u}=(0,r.Lhy)(c),{height:p}=(0,r.lWr)(),{y:d}=(0,r.l4h)(),h=(0,o.EW)((()=>!1!==t.value.backToTop&&d.value>100)),v=(0,o.EW)((()=>d.value/(u.value-p.value)*100));return(0,o.sV)((()=>{c.value=document.body})),()=>(0,o.h)(i.eB,{name:"back-to-top"},(()=>h.value?(0,o.h)("button",{type:"button",class:"vp-back-to-top-button","aria-label":n.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[(0,o.h)("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":v.value},(0,o.h)("svg",(0,o.h)("circle",{cx:"50%",cy:"50%",style:{"stroke-dasharray":`calc(${Math.PI*v.value}% - ${4*Math.PI}px) calc(${100*Math.PI}% - ${4*Math.PI}px)`}}))),(0,o.h)("div",{class:"back-to-top-icon"})]):null))}}),u=(0,a.re)({rootComponents:[c]})},337:(e,t,n)=>{n.d(t,{A:()=>c});var a=n(8981),l=n(3151),r=n(7847),o=n(6719),s=n(8224);const i=(0,r.pM)({name:"Catalog",props:{base:{type:String,default:""},level:{type:Number,default:3},index:Boolean,hideHeading:Boolean},setup(e){const t=(0,s.Su)(),n=(0,a.s5)({"/":{title:"目录",empty:"暂无目录"}}),i=(0,l.BV)(),c=(0,l.Ye)(),u=(0,l.rU)(),p=(0,o.IJ)((0,a.jO)(c.value).map((([e,{meta:n}])=>{const l=t(n);if(!l)return null;const r=e.split("/").length;return{level:(0,a.d5)(e,"/")?r-2:r-1,base:e.replace(/\/[^/]+\/?$/,"/"),path:e,...l}})).filter((e=>(0,a.Qd)(e)&&(0,a.Kg)(e.title)))),d=(0,r.EW)((()=>{const t=e.base?(0,a.A9)((0,a.PT)(e.base)):i.value.path.replace(/\/[^/]+$/,"/"),n=t.split("/").length-2,l=[];return p.value.filter((({level:l,path:r})=>{if(!(0,a.w1)(r,t)||r===t)return!1;if("/"===t){const e=(0,a.HP)(u.value.locales).filter((e=>"/"!==e));if("/404.html"===r||e.some((e=>(0,a.w1)(r,e))))return!1}return l-n<=e.level})).sort((({title:e,level:t,order:n},{title:l,level:r,order:o})=>t-r||((0,a.Et)(n)?(0,a.Et)(o)?n>0?o>0?n-o:-1:o<0?n-o:1:n:(0,a.Et)(o)?o:e.localeCompare(l)))).forEach((e=>{const{base:t,level:a}=e;switch(a-n){case 1:l.push(e);break;case 2:{const n=l.find((e=>e.path===t));n&&(n.children??=[]).push(e);break}default:{const n=l.find((e=>e.path===t.replace(/\/[^/]+\/$/,"/")));if(n){const a=n.children?.find((e=>e.path===t));a&&(a.children??=[]).push(e)}}}})),l}));return()=>{const t=d.value.some((e=>e.children));return(0,r.h)("div",{class:["vp-catalog-wrapper",{index:e.index}]},[e.hideHeading?null:(0,r.h)("h2",{class:"vp-catalog-main-title"},n.value.title),d.value.length?(0,r.h)(e.index?"ol":"ul",{class:["vp-catalogs",{deep:t}]},d.value.map((({children:n=[],title:a,path:o,content:s})=>{const i=(0,r.h)(l.Wt,{class:"vp-catalog-title",to:o},(()=>s?(0,r.h)(s):a));return(0,r.h)("li",{class:"vp-catalog"},t?[(0,r.h)("h3",{id:a,class:["vp-catalog-child-title",{"has-children":n.length}]},[(0,r.h)("a",{href:`#${a}`,class:"vp-catalog-header-anchor","aria-hidden":!0},"#"),i]),n.length?(0,r.h)(e.index?"ol":"ul",{class:"vp-child-catalogs"},n.map((({children:t=[],content:n,path:a,title:o})=>(0,r.h)("li",{class:"vp-child-catalog"},[(0,r.h)("div",{class:["vp-catalog-sub-title",{"has-children":t.length}]},[(0,r.h)("a",{href:`#${o}`,class:"vp-catalog-header-anchor"},"#"),(0,r.h)(l.Wt,{class:"vp-catalog-title",to:a},(()=>n?(0,r.h)(n):o))]),t.length?(0,r.h)(e.index?"ol":"div",{class:e.index?"vp-sub-catalogs":"vp-sub-catalogs-wrapper"},t.map((({content:t,path:n,title:a})=>e.index?(0,r.h)("li",{class:"vp-sub-catalog"},(0,r.h)(l.Wt,{to:n},(()=>t?(0,r.h)(t):a))):(0,r.h)(l.Wt,{class:"vp-sub-catalog-link",to:n},(()=>t?(0,r.h)(t):a))))):null])))):null]:(0,r.h)("div",{class:"vp-catalog-child-title"},i))}))):(0,r.h)("p",{class:"vp-empty-catalog"},n.value.empty)])}}}),c=(0,l.re)({enhance:({app:e})=>{(0,s.sl)(e),(0,a.L4)("Catalog",e)||e.component("Catalog",i)}})},8224:(e,t,n)=>{n.d(t,{M_:()=>s,sl:()=>c,Su:()=>i});var a=n(8981),l=n(7847);let r=e=>(0,a.Kg)(e.title)?{title:e.title}:null;const o=Symbol(""),s=e=>{r=e},i=()=>(0,l.WQ)(o),c=e=>{e.provide(o,r)}},4232:(e,t,n)=>{n.d(t,{M_:()=>a.M_});var a=n(8224)},7994:(e,t,n)=>{n.d(t,{A:()=>p});var a=n(3151),l=n(8981),r=n(5670),o=n(7847);const s=/\b(?:Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)/i,i=new Map,c={"/":{copy:"复制代码",copied:"已复制"}},u=['.theme-hope-content div[class*="language-"] pre'],p=(0,a.re)({setup:()=>{(({delay:e=500,duration:t=2e3,locales:n,selector:c,showInMobile:u})=>{const{copy:p}=(0,r.iDZ)({legacy:!0}),d=(0,l.s5)(n),h=(0,a.BV)(),v=e=>{if(!e.hasAttribute("copy-code-registered")){const t=document.createElement("button");t.type="button",t.classList.add("vp-copy-code-button"),t.innerHTML='
    ',t.setAttribute("aria-label",d.value.copy),t.setAttribute("data-copied",d.value.copied),e.parentElement&&e.parentElement.insertBefore(t,e),e.setAttribute("copy-code-registered","")}},f=()=>{(0,o.dY)().then((()=>(0,l.uk)(e))).then((()=>{c.forEach((e=>{document.querySelectorAll(e).forEach(v)}))}))},m=(e,n,a)=>{let{innerText:l=""}=n;/language-(shellscript|shell|bash|sh|zsh)/.test(e.classList.toString())&&(l=l.replace(/^ *(\$|>) /gm,"")),p(l).then((()=>{a.classList.add("copied"),clearTimeout(i.get(a));const e=setTimeout((()=>{a.classList.remove("copied"),a.blur(),i.delete(a)}),t);i.set(a,e)}))};(0,o.sV)((()=>{const e=!("undefined"!=typeof window&&window.navigator&&"userAgent"in window.navigator&&s.test(navigator.userAgent))||u;e&&f(),(0,r.MLh)("click",(e=>{const t=e.target;if(t.matches('div[class*="language-"] > button.copy')){const e=t.parentElement,n=t.nextElementSibling;n&&m(e,n,t)}else if(t.matches('div[class*="language-"] div.vp-copy-icon')){const e=t.parentElement,n=e.parentElement,a=e.nextElementSibling;a&&m(n,a,e)}})),(0,o.wB)((()=>h.value.path),(()=>{e&&f()}))}))})({selector:u,locales:c,duration:2e3,delay:500,showInMobile:!1})}})},1557:(e,t,n)=>{n.d(t,{A:()=>v});var a=n(3151),l=n(7847),r=n(6719),o=n(5670),s=n(4499);const i=()=>{const e=(0,a.rd)();return{hitComponent:({hit:t,children:n})=>({type:"a",ref:void 0,constructor:void 0,key:void 0,props:{href:t.url,onClick:n=>{(e=>1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)(n)||(n.preventDefault(),e.push((0,s.ik)(t.url,"/")))},children:n},__v:null}),navigator:{navigate:({itemUrl:t})=>{e.push((0,s.ik)(t,"/"))}},transformSearchClient:e=>{const t=function(e,t,n){var a,l,r;void 0===t&&(t=50),void 0===n&&(n={});var o=null!=(a=n.isImmediate)&&a,s=null!=(l=n.callback)&&l,i=n.maxWait,c=Date.now(),u=[];function p(){if(void 0!==i){var e=Date.now()-c;if(e+t>=i)return i-e}return t}var d=function(){var t=[].slice.call(arguments),n=this;return new Promise((function(a,l){var i=o&&void 0===r;if(void 0!==r&&clearTimeout(r),r=setTimeout((function(){if(r=void 0,c=Date.now(),!o){var a=e.apply(n,t);s&&s(a),u.forEach((function(e){return(0,e.resolve)(a)})),u=[]}}),p()),i){var d=e.apply(n,t);return s&&s(d),a(d)}u.push({resolve:a,reject:l})}))};return d.cancel=function(e){void 0!==r&&clearTimeout(r),u.forEach((function(t){return(0,t.reject)(e)})),u=[]},d}(e.search,500);return{...e,search:async(...e)=>t(...e)}}}},c=(e=[],t)=>[`lang:${t}`,...Array.isArray(e)?e:[e]],u=()=>{if(document.querySelector(".DocSearch-Modal"))return;const e=new Event("keydown");e.key="k",e.metaKey=!0,window.dispatchEvent(e),setTimeout(u,16)},p=({buttonText:e="Search",buttonAriaLabel:t=e}={})=>``,d={locales:{"/":{placeholder:"搜索文档",translations:{button:{buttonText:"搜索文档",buttonAriaLabel:"搜索文档"},modal:{searchBox:{resetButtonTitle:"清除查询条件",resetButtonAriaLabel:"清除查询条件",cancelButtonText:"取消",cancelButtonAriaLabel:"取消"},startScreen:{recentSearchesTitle:"搜索历史",noRecentSearchesText:"没有搜索历史",saveRecentSearchButtonTitle:"保存至搜索历史",removeRecentSearchButtonTitle:"从搜索历史中移除",favoriteSearchesTitle:"收藏",removeFavoriteSearchButtonTitle:"从收藏中移除"},errorScreen:{titleText:"无法获取结果",helpText:"你可能需要检查你的网络连接"},footer:{selectText:"选择",navigateText:"切换",closeText:"关闭",searchByText:"搜索提供者"},noResultsScreen:{noResultsText:"无法找到相关结果",suggestedQueryText:"你可以尝试查询",reportMissingResultsText:"你认为该查询应该有结果?",reportMissingResultsLinkText:"点击反馈"}}}}},indexName:"newzone",appId:"M4EXXEZIEG",apiKey:"fd8891a9c4cc21e0ef4f11bf44f7a11e"};Promise.all([n.e(4483),n.e(8766)]).then(n.bind(n,8766)),Promise.all([n.e(6392),n.e(9155)]).then(n.bind(n,9155));const h=(0,l.pM)({name:"Docsearch",props:{containerId:{type:String,required:!1,default:"docsearch-container"},options:{type:Object,required:!1,default:()=>d}},setup(e){const t=i(),s=(0,a.Nj)(),d=(0,a.Zv)(),h=(0,r.KR)(!1),v=(0,r.KR)(!1),f=(0,l.EW)((()=>({...e.options,...e.options.locales?.[d.value]}))),m=async()=>{const{default:a}=await n.e(2470).then(n.bind(n,2470));a({...t,...f.value,container:`#${e.containerId}`,searchParameters:{...f.value.searchParameters,facetFilters:c(f.value.searchParameters?.facetFilters,s.value)}}),h.value=!0},g=()=>{v.value||h.value||(v.value=!0,m(),u(),(0,l.wB)(d,m))};return(e=>{const t=(0,o.MLh)("keydown",(n=>{const a="k"===n.key&&(n.ctrlKey||n.metaKey);("/"===n.key||a)&&(n.preventDefault(),e(),t())}))})(g),(0,l.sV)((()=>(e=>{const t="algolia-preconnect";(window.requestIdleCallback||setTimeout)((()=>{if(document.head.querySelector(`#${t}`))return;const n=document.createElement("link");n.id=t,n.rel="preconnect",n.href=`https://${e}-dsn.algolia.net`,n.crossOrigin="",document.head.appendChild(n)}))})(f.value.appId))),()=>[(0,l.h)("div",{id:e.containerId,style:{display:h.value?"block":"none"}}),h.value?null:(0,l.h)("div",{onClick:g,innerHTML:p(f.value.translations?.button)})]}}),v=(0,a.re)({enhance({app:e}){e.component("Docsearch",h)}})},7437:(e,t,n)=>{n.d(t,{p:()=>o});var a=n(7847),l=n(3151);const r=(0,a.h)("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"},[(0,a.h)("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"}),(0,a.h)("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"})]),o=(0,a.pM)({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=(0,l.Zv)(),n=(0,a.EW)((()=>e.locales[t.value]??{openInNewWindow:"open in new window"}));return()=>(0,a.h)("span",[r,(0,a.h)("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}})},9090:(e,t,n)=>{n.d(t,{A:()=>s});var a=n(7847),l=n(3151),r=n(7437);const o={},s=(0,l.re)({enhance({app:e}){e.component("ExternalLinkIcon",(0,a.h)(r.p,{locales:o}))}})},3578:(e,t,n)=>{n.d(t,{p:()=>a.p});var a=n(7437)},2443:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(3151);const l={id:"G-RWKZTY2P9R"},r=(0,a.re)({enhance(){(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)})(l)}})},4654:(e,t,n)=>{n.d(t,{A:()=>f});var a=n(3151),l=n(7847);const r={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=r.isStarted();e=o(e,r.settings.minimum,1),r.status=1===e?null:e;const n=r.render(!t),a=n.querySelector(r.settings.barSelector),l=r.settings.speed,u=r.settings.easing;return n.offsetWidth,i((t=>{c(a,{transform:"translate3d("+s(e)+"%,0,0)",transition:"all "+l+"ms "+u}),1===e?(c(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout((function(){c(n,{transition:"all "+l+"ms linear",opacity:"0"}),setTimeout((function(){r.remove(),t()}),l)}),l)):setTimeout((()=>t()),l)})),r},isStarted:()=>"number"==typeof r.status,start:()=>{r.status||r.set(0);const e=()=>{setTimeout((()=>{r.status&&(r.trickle(),e())}),r.settings.trickleSpeed)};return r.settings.trickle&&e(),r},done:e=>e||r.status?r.inc(.3+.5*Math.random()).set(1):r,inc:e=>{let t=r.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),r.set(t)):r.start()},trickle:()=>r.inc(Math.random()*r.settings.trickleRate),render:e=>{if(r.isRendered())return document.getElementById("nprogress");p(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=r.settings.template;const n=t.querySelector(r.settings.barSelector),a=e?"-100":s(r.status||0),l=document.querySelector(r.settings.parent);return c(n,{transition:"all 0 linear",transform:"translate3d("+a+"%,0,0)"}),l!==document.body&&p(l,"nprogress-custom-parent"),l?.appendChild(t),t},remove:()=>{d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&v(e)},isRendered:()=>!!document.getElementById("nprogress")},o=(e,t,n)=>en?n:e,s=e=>100*(-1+e),i=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),1===e.length&&t()}}(),c=function(){const e=["Webkit","O","Moz","ms"],t={};function n(n,a,l){var r;r=(r=a).replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),a=t[r]??=function(t){const n=document.body.style;if(t in n)return t;let a=e.length;const l=t.charAt(0).toUpperCase()+t.slice(1);let r;for(;a--;)if(r=e[a]+l,r in n)return r;return t}(r),n.style[a]=l}return function(e,t){for(const a in t){const l=t[a];void 0!==l&&Object.prototype.hasOwnProperty.call(t,a)&&n(e,a,l)}}}(),u=(e,t)=>("string"==typeof e?e:h(e)).indexOf(" "+t+" ")>=0,p=(e,t)=>{const n=h(e),a=n+t;u(n,t)||(e.className=a.substring(1))},d=(e,t)=>{const n=h(e);if(!u(e,t))return;const a=n.replace(" "+t+" "," ");e.className=a.substring(1,a.length-1)},h=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),v=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},f=(0,a.re)({setup(){(0,l.sV)((()=>{const e=(0,a.rd)(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach((e=>{t.has(e.path)||r.start()})),e.afterEach((e=>{t.add(e.path),r.done()}))}))}})},2457:(e,t,n)=>{n.d(t,{A:()=>d});var a=n(3151),l=n(8981),r=n(7847);let o={};const s=Symbol(""),i=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(i(e)),e.onerror=e=>n(e))}));var c=n(5670);const u=({selector:e,locales:t,delay:o=500,scrollToClose:u=!0})=>{const p=(0,r.WQ)(s),d=(0,l.s5)(t),h=(0,a.BV)(),v=(0,a.R7)();let f=null;const m=()=>{const{photoSwipe:t}=v.value;!1!==t&&(0,r.dY)().then((()=>(0,l.uk)(o))).then((async()=>{const a=(0,l.Kg)(t)?t:e;f=await((e,t,a=!0)=>n.e(9600).then(n.bind(n,800)).then((({default:n})=>{let l=null;const r=e.map((e=>({html:'
    ',element:e,msrc:e.src})));return e.forEach(((e,o)=>{const s=()=>{l?.destroy(),l=new n({preloaderDelay:0,showHideAnimationType:"zoom",...t,dataSource:r,index:o,...a?{closeOnVerticalDrag:!0,wheelToZoom:!1}:{}}),(e=>{const{isSupported:t,toggle:n}=(0,c.HrR)();e.on("uiRegister",(()=>{t.value&&e.ui.registerElement({name:"fullscreen",order:7,isButton:!0,html:'',onClick:()=>{n()}}),e.ui.registerElement({name:"download",order:8,isButton:!0,tagName:"a",html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-download"},onInit:(e,t)=>{e.setAttribute("download",""),e.setAttribute("target","_blank"),e.setAttribute("rel","noopener"),t.on("change",(()=>{e.setAttribute("href",t.currSlide.data.src)}))}}),e.ui.registerElement({name:"bulletsIndicator",className:"photo-swipe-bullets-indicator",appendTo:"wrapper",onInit:(e,t)=>{const n=[];let a=-1;for(let a=0;a{t.goTo(n.indexOf(e.target))},n.push(a),e.appendChild(a)}t.on("change",(()=>{a>=0&&n[a].classList.remove("active"),n[t.currIndex].classList.add("active"),a=t.currIndex}))}})}))})(l),l.addFilter("thumbEl",(()=>e)),l.addFilter("placeholderSrc",(()=>e.src)),l.init()};e.getAttribute("photo-swipe")||(e.style.cursor="zoom-in",e.addEventListener("click",(()=>{s()})),e.addEventListener("keypress",(({key:e})=>{"Enter"===e&&s()})),e.setAttribute("photo-swipe","")),i(e).then((e=>{r.splice(o,1,e),l?.refreshSlideContent(o)}))})),a?(0,c.MLh)("wheel",(()=>{l?.close()})):()=>{}})))((e=>(0,l.Kg)(e)?Array.from(document.querySelectorAll(e)):e.map((e=>Array.from(document.querySelectorAll(e)))).flat())(a),{...p,...d.value},u)}))};(0,r.sV)((()=>{m(),(0,r.wB)((()=>h.value.path),(()=>{f?.(),m()}))})),(0,r.hi)((()=>{f?.()}))},p={"/":{closeTitle:"关闭",downloadTitle:"下载图片",fullscreenTitle:"切换全屏",zoomTitle:"缩放",arrowPrevTitle:"上一个 (左箭头)",arrowNextTitle:"下一个 (右箭头)"}},d=(0,a.re)({enhance:({app:e})=>{(e=>{e.provide(s,o)})(e)},setup:()=>{u({selector:".theme-hope-content :not(a) > img:not([no-view])",delay:800,locales:p,scrollToClose:!0})}})},4601:(e,t,n)=>{n.d(t,{s4:()=>s,Fk:()=>r,Ft:()=>p,nn:()=>u});var a=n(7847),l=n(3151);const r=()=>{const e=(0,l.BV)();return(0,a.EW)((()=>e.value.readingTime??null))};var o=n(8981);const s=(e,t)=>{const{minutes:n,words:a}=e,{less1Minute:l,word:r,time:o}=t;return{time:n<1?l:o.replace("$time",Math.round(n).toString()),words:r.replace("$word",a.toString())}},i={words:"",time:""},c=void 0==={"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}}?null:{"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}},u=()=>c?(0,o.s5)(c):(0,a.EW)((()=>null)),p=()=>{if(void 0===c)return(0,a.EW)((()=>i));const e=r(),t=u();return(0,a.EW)((()=>e.value&&t.value?s(e.value,t.value):i))}},9381:(e,t,n)=>{n.d(t,{_f:()=>c,WK:()=>s,dy:()=>r,To:()=>i});var a=n(8120);const l=(0,n(6719).KR)(a.K),r=()=>l;var o=n(7847);const s=Symbol(""),i=()=>{const e=(0,o.WQ)(s);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},c=(e,t)=>{const{locales:n,...a}=e;return{...a,...n?.[t]}}},9350:(e,t,n)=>{n.d(t,{A:()=>o});var a=n(7847),l=n(3151),r=n(9381);const o=(0,l.re)({enhance({app:e}){const t=(0,r.dy)(),n=e._context.provides[l.sW],o=(0,a.EW)((()=>(0,r._f)(t.value,n.routeLocale.value)));e.provide(r.WK,o),Object.defineProperties(e.config.globalProperties,{$theme:{get:()=>t.value},$themeLocale:{get:()=>o.value}})}})},2302:(e,t,n)=>{n.d(t,{To:()=>a.To,dy:()=>a.dy});var a=n(9381)},4499:(e,t,n)=>{n.d(t,{A9:()=>o,Kg:()=>y,PT:()=>s,Qd:()=>d,TY:()=>v,UW:()=>h,W8:()=>r,cq:()=>m,ik:()=>g,km:()=>u,r3:()=>i,uv:()=>f,zn:()=>p});var a=["link","meta","script","style","noscript","template"],l=["title","base"],r=e=>{const t=new Set,n=[];return e.forEach((e=>{const r=(([e,t,n])=>l.includes(e)?e:a.includes(e)?"meta"===e&&t.name?`${e}.${t.name}`:"template"===e&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map((([e,t])=>"boolean"==typeof t?t?[e,""]:null:[e,t])).filter((e=>null!=e)).sort((([e],[t])=>e.localeCompare(t))),n]):null)(e);r&&!t.has(r)&&(t.add(r),n.push(e))})),n},o=e=>"/"===e[0]?e:`/${e}`,s=e=>"/"===e[e.length-1]||e.endsWith(".html")?e:`${e}/`,i=e=>/^(https?:)?\/\//.test(e),c=/.md((\?|#).*)?$/,u=(e,t="/")=>!!i(e)||!(!e.startsWith("/")||e.startsWith(t)||c.test(e)),p=e=>/^[a-z][a-z0-9+.-]*:/.test(e),d=e=>"[object Object]"===Object.prototype.toString.call(e),h=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;let a=t.replace(/(^|\/)README.md$/i,"$1index.html");return a.endsWith(".md")?a=a.substring(0,a.length-3)+".html":a.endsWith(".html")||(a+=".html"),a.endsWith("/index.html")&&(a=a.substring(0,a.length-10)),a+n.join("")},v=e=>"/"===e[e.length-1]?e.slice(0,-1):e,f=e=>"/"===e[0]?e.slice(1):e,m=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>{const n=t.split("/").length-e.split("/").length;return 0!==n?n:t.length-e.length}));for(const e of n)if(t.startsWith(e))return e;return"/"},g=(e,t="/")=>{const n=e.replace(/^(https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},y=e=>"string"==typeof e},5670:(e,t,n)=>{n.d(t,{HrR:()=>C,K$F:()=>W,Lhy:()=>S,MLh:()=>u,Nk8:()=>E,P1n:()=>x,cBR:()=>T,iDZ:()=>v,l4h:()=>P,lWr:()=>O,r9V:()=>L,rXt:()=>k,vCw:()=>I});var a=n(2930),l=n(7847),r=n(6719);function o(e){var t;const n=(0,a.BA)(e);return null!=(t=null==n?void 0:n.$el)?t:n}const s=a.oc?window:void 0,i=a.oc?window.document:void 0,c=a.oc?window.navigator:void 0;function u(...e){let t,n,r,i;if("string"==typeof e[0]||Array.isArray(e[0])?([n,r,i]=e,t=s):[t,n,r,i]=e,!t)return a.lQ;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const c=[],u=()=>{c.forEach((e=>e())),c.length=0},p=(0,l.wB)((()=>[o(t),(0,a.BA)(i)]),(([e,t])=>{if(u(),!e)return;const l=(0,a.Gv)(t)?{...t}:t;c.push(...n.flatMap((t=>r.map((n=>((e,t,n,a)=>(e.addEventListener(t,n,a),()=>e.removeEventListener(t,n,a)))(e,t,n,l))))))}),{immediate:!0,flush:"post"}),d=()=>{p(),u()};return(0,a.Uo)(d),d}function p(e){const t=function(){const e=(0,r.KR)(!1),t=(0,l.nI)();return t&&(0,l.sV)((()=>{e.value=!0}),t),e}();return(0,l.EW)((()=>(t.value,Boolean(e()))))}function d(e,t={}){const{window:n=s}=t,o=p((()=>n&&"matchMedia"in n&&"function"==typeof n.matchMedia));let i;const c=(0,r.KR)(!1),u=e=>{c.value=e.matches},d=()=>{i&&("removeEventListener"in i?i.removeEventListener("change",u):i.removeListener(u))},h=(0,l.nT)((()=>{o.value&&(d(),i=n.matchMedia((0,a.BA)(e)),"addEventListener"in i?i.addEventListener("change",u):i.addListener(u),c.value=i.matches)}));return(0,a.Uo)((()=>{h(),d(),i=void 0})),c}function h(e,t={}){const{controls:n=!1,navigator:l=c}=t,o=p((()=>l&&"permissions"in l));let s;const i="string"==typeof e?{name:e}:e,d=(0,r.KR)(),h=()=>{s&&(d.value=s.state)},v=(0,a.Jv)((async()=>{if(o.value){if(!s)try{s=await l.permissions.query(i),u(s,"change",h),h()}catch(e){d.value="prompt"}return s}}));return v(),n?{state:d,isSupported:o,query:v}:d}function v(e={}){const{navigator:t=c,read:n=!1,source:o,copiedDuring:s=1500,legacy:i=!1}=e,d=p((()=>t&&"clipboard"in t)),v=h("clipboard-read"),f=h("clipboard-write"),m=(0,l.EW)((()=>d.value||i)),g=(0,r.KR)(""),y=(0,r.KR)(!1),b=(0,a.TO)((()=>y.value=!1),s);return m.value&&n&&u(["copy","cut"],(function(){var e,n,a;d.value&&"denied"!==v.value?t.clipboard.readText().then((e=>{g.value=e})):g.value=null!=(a=null==(n=null==(e=null==document?void 0:document.getSelection)?void 0:e.call(document))?void 0:n.toString())?a:""})),{isSupported:m,text:g,copied:y,copy:async function(e=(0,a.BA)(o)){m.value&&null!=e&&(d.value&&"denied"!==f.value?await t.clipboard.writeText(e):function(e){const t=document.createElement("textarea");t.value=null!=e?e:"",t.style.position="absolute",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),t.remove()}(e),g.value=e,y.value=!0,b.start())}}}a.oc&&window.location;const f="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},m="__vueuse_ssr_handlers__",g=y();function y(){return m in f||(f[m]=f[m]||{}),f[m]}const b={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},w="vueuse-storage";function k(e,t,n,o={}){var i;const{flush:c="pre",deep:p=!0,listenToStorageChanges:d=!0,writeDefaults:h=!0,mergeDefaults:v=!1,shallow:f,window:m=s,eventFilter:y,onError:k=(e=>{console.error(e)}),initOnMounted:E}=o,x=(f?r.IJ:r.KR)("function"==typeof t?t():t);if(!n)try{n=function(e,t){return g[e]||t}("getDefaultStorage",(()=>{var e;return null==(e=s)?void 0:e.localStorage}))()}catch(e){k(e)}if(!n)return x;const S=(0,a.BA)(t),M=function(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}(S),C=null!=(i=o.serializer)?i:b[M],{pause:_,resume:T}=(0,a.Hr)(x,(()=>function(t){try{const a=n.getItem(e),l=t=>{m&&m.dispatchEvent(new CustomEvent(w,{detail:{key:e,oldValue:a,newValue:t,storageArea:n}}))};if(null==t)l(null),n.removeItem(e);else{const r=C.write(t);a!==r&&(n.setItem(e,r),l(r))}}catch(e){k(e)}}(x.value)),{flush:c,deep:p,eventFilter:y});return m&&d&&(0,a.rd)((()=>{u(m,"storage",A),u(m,w,L),E&&A()})),E||A(),x;function L(e){A(e.detail)}function A(t){if(!t||t.storageArea===n)if(t&&null==t.key)x.value=S;else if(!t||t.key===e){_();try{(null==t?void 0:t.newValue)!==C.write(x.value)&&(x.value=function(t){const a=t?t.newValue:n.getItem(e);if(null==a)return h&&null!=S&&n.setItem(e,C.write(S)),S;if(!t&&v){const e=C.read(a);return"function"==typeof v?v(e,S):"object"!==M||Array.isArray(e)?e:{...S,...e}}return"string"!=typeof a?a:C.read(a)}(t))}catch(e){k(e)}finally{t?(0,l.dY)(T):T()}}}}function E(e){return d("(prefers-color-scheme: dark)",e)}function x(e,t,n={}){const{window:r=s,...i}=n;let c;const u=p((()=>r&&"MutationObserver"in r)),d=()=>{c&&(c.disconnect(),c=void 0)},h=(0,l.EW)((()=>{const t=(0,a.BA)(e),n=(Array.isArray(t)?t:[t]).map(o).filter(a.d6);return new Set(n)})),v=(0,l.wB)((()=>h.value),(e=>{d(),u.value&&r&&e.size&&(c=new MutationObserver(t),e.forEach((e=>c.observe(e,i))))}),{immediate:!0,flush:"post"}),f=()=>{d(),v()};return(0,a.Uo)(f),{isSupported:u,stop:f,takeRecords:()=>null==c?void 0:c.takeRecords()}}function S(e,t={width:0,height:0},n={}){const{window:i=s,box:c="content-box"}=n,u=(0,l.EW)((()=>{var t,n;return null==(n=null==(t=o(e))?void 0:t.namespaceURI)?void 0:n.includes("svg")})),d=(0,r.KR)(t.width),h=(0,r.KR)(t.height),{stop:v}=function(e,t,n={}){const{window:r=s,...i}=n;let c;const u=p((()=>r&&"ResizeObserver"in r)),d=()=>{c&&(c.disconnect(),c=void 0)},h=(0,l.EW)((()=>Array.isArray(e)?e.map((e=>o(e))):[o(e)])),v=(0,l.wB)(h,(e=>{if(d(),u.value&&r){c=new ResizeObserver(t);for(const t of e)t&&c.observe(t,i)}}),{immediate:!0,flush:"post"}),f=()=>{d(),v()};return(0,a.Uo)(f),{isSupported:u,stop:f}}(e,(([t])=>{const n="border-box"===c?t.borderBoxSize:"content-box"===c?t.contentBoxSize:t.devicePixelContentBoxSize;if(i&&u.value){const t=o(e);if(t){const e=i.getComputedStyle(t);d.value=Number.parseFloat(e.width),h.value=Number.parseFloat(e.height)}}else if(n){const e=Array.isArray(n)?n:[n];d.value=e.reduce(((e,{inlineSize:t})=>e+t),0),h.value=e.reduce(((e,{blockSize:t})=>e+t),0)}else d.value=t.contentRect.width,h.value=t.contentRect.height}),n);(0,a.rd)((()=>{const n=o(e);n&&(d.value="offsetWidth"in n?n.offsetWidth:t.width,h.value="offsetHeight"in n?n.offsetHeight:t.height)}));const f=(0,l.wB)((()=>o(e)),(e=>{d.value=e?t.width:0,h.value=e?t.height:0}));return{width:d,height:h,stop:function(){v(),f()}}}const M=["fullscreenchange","webkitfullscreenchange","webkitendfullscreen","mozfullscreenchange","MSFullscreenChange"];function C(e,t={}){const{document:n=i,autoExit:s=!1}=t,c=(0,l.EW)((()=>{var t;return null!=(t=o(e))?t:null==n?void 0:n.querySelector("html")})),d=(0,r.KR)(!1),h=(0,l.EW)((()=>["requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","webkitEnterFullScreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen"].find((e=>n&&e in n||c.value&&e in c.value)))),v=(0,l.EW)((()=>["exitFullscreen","webkitExitFullscreen","webkitExitFullScreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen"].find((e=>n&&e in n||c.value&&e in c.value)))),f=(0,l.EW)((()=>["fullScreen","webkitIsFullScreen","webkitDisplayingFullscreen","mozFullScreen","msFullscreenElement"].find((e=>n&&e in n||c.value&&e in c.value)))),m=["fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement"].find((e=>n&&e in n)),g=p((()=>c.value&&n&&void 0!==h.value&&void 0!==v.value&&void 0!==f.value)),y=()=>{if(f.value){if(n&&null!=n[f.value])return n[f.value];{const e=c.value;if(null!=(null==e?void 0:e[f.value]))return Boolean(e[f.value])}}return!1};async function b(){if(g.value&&d.value){if(v.value)if(null!=(null==n?void 0:n[v.value]))await n[v.value]();else{const e=c.value;null!=(null==e?void 0:e[v.value])&&await e[v.value]()}d.value=!1}}async function w(){if(!g.value||d.value)return;y()&&await b();const e=c.value;h.value&&null!=(null==e?void 0:e[h.value])&&(await e[h.value](),d.value=!0)}const k=()=>{const e=y();(!e||e&&m&&(null==n?void 0:n[m])===c.value)&&(d.value=e)};return u(n,M,k,!1),u((()=>o(c)),M,k,!1),s&&(0,a.Uo)(b),{isSupported:g,isFullscreen:d,enter:w,exit:b,toggle:async function(){await(d.value?b():w())}}}function _(e){return"undefined"!=typeof Window&&e instanceof Window?e.document.documentElement:"undefined"!=typeof Document&&e instanceof Document?e.documentElement:e}function T(e={}){const{controls:t=!1,interval:n="requestAnimationFrame"}=e,l=(0,r.KR)(new Date),o=()=>l.value=new Date,i="requestAnimationFrame"===n?function(e,t={}){const{immediate:n=!0,fpsLimit:l,window:o=s}=t,i=(0,r.KR)(!1),c=l?1e3/l:null;let u=0,p=null;function d(t){if(!i.value||!o)return;u||(u=t);const n=t-u;c&&n(g||(g=(n=>new Promise(((l,r)=>{const o=e=>(m.value=e,l(e),e);if(!v)return void l(!1);let i=!1,g=v.querySelector(`script[src="${(0,a.BA)(e)}"]`);g?g.hasAttribute("data-loaded")&&o(g):(g=v.createElement("script"),g.type=s,g.async=c,g.src=(0,a.BA)(e),h&&(g.defer=h),u&&(g.crossOrigin=u),d&&(g.noModule=d),p&&(g.referrerPolicy=p),Object.entries(f).forEach((([e,t])=>null==g?void 0:g.setAttribute(e,t))),i=!0),g.addEventListener("error",(e=>r(e))),g.addEventListener("abort",(e=>r(e))),g.addEventListener("load",(()=>{g.setAttribute("data-loaded","true"),t(g),o(g)})),i&&(g=v.head.appendChild(g)),n||o(g)})))(n)),g),b=()=>{if(!v)return;g=null,m.value&&(m.value=null);const t=v.querySelector(`script[src="${(0,a.BA)(e)}"]`);t&&v.head.removeChild(t)};return l&&!o&&(0,a.rd)(y),o||(0,a.uO)(b),{scriptTag:m,load:y,unload:b}}function A(e){const t=window.getComputedStyle(e);if("scroll"===t.overflowX||"scroll"===t.overflowY||"auto"===t.overflowX&&e.clientWidth1||(t.preventDefault&&t.preventDefault(),!1))}const B=new WeakMap;function W(e,t=!1){const n=(0,r.KR)(t);let o=null;(0,l.wB)((0,a.lW)(e),(e=>{const t=_((0,a.BA)(e));if(t){const e=t;B.get(e)||B.set(e,void 0),n.value&&(e.style.overflow="hidden")}}),{immediate:!0});const s=()=>{var t;const l=_((0,a.BA)(e));l&&n.value&&(a.un&&(null==o||o()),l.style.overflow=null!=(t=B.get(l))?t:"",B.delete(l),n.value=!1)};return(0,a.Uo)(s),(0,l.EW)({get:()=>n.value,set(t){t?(()=>{const t=_((0,a.BA)(e));t&&!n.value&&(a.un&&(o=u(t,"touchmove",(e=>{$(e)}),{passive:!1})),t.style.overflow="hidden",n.value=!0)})():s()}})}let R=0;function I(e,t={}){const n=(0,r.KR)(!1),{document:o=i,immediate:s=!0,manual:c=!1,id:u="vueuse_styletag_"+ ++R}=t,p=(0,r.KR)(e);let d=()=>{};const h=()=>{if(!o)return;const e=o.getElementById(u)||o.createElement("style");e.isConnected||(e.id=u,t.media&&(e.media=t.media),o.head.appendChild(e)),n.value||(d=(0,l.wB)(p,(t=>{e.textContent=t}),{immediate:!0}),n.value=!0)},v=()=>{o&&n.value&&(d(),o.head.removeChild(o.getElementById(u)),n.value=!1)};return s&&!c&&(0,a.rd)(h),c||(0,a.Uo)(v),{id:u,css:p,unload:v,load:h,isLoaded:(0,r.tB)(n)}}Number.POSITIVE_INFINITY;function P(e={}){const{window:t=s,behavior:n="auto"}=e;if(!t)return{x:(0,r.KR)(0),y:(0,r.KR)(0)};const a=(0,r.KR)(t.scrollX),o=(0,r.KR)(t.scrollY),i=(0,l.EW)({get:()=>a.value,set(e){scrollTo({left:e,behavior:n})}}),c=(0,l.EW)({get:()=>o.value,set(e){scrollTo({top:e,behavior:n})}});return u(t,"scroll",(()=>{a.value=t.scrollX,o.value=t.scrollY}),{capture:!1,passive:!0}),{x:i,y:c}}function O(e={}){const{window:t=s,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:o=Number.POSITIVE_INFINITY,listenOrientation:i=!0,includeScrollbar:c=!0}=e,p=(0,r.KR)(n),h=(0,r.KR)(o),v=()=>{t&&(c?(p.value=t.innerWidth,h.value=t.innerHeight):(p.value=t.document.documentElement.clientWidth,h.value=t.document.documentElement.clientHeight))};if(v(),(0,a.rd)(v),u("resize",v,{passive:!0}),i){const e=d("(orientation: portrait)");(0,l.wB)(e,(()=>v()))}return{width:p,height:h}}a.D_},2930:(e,t,n)=>{n.d(t,{bW:()=>r,Jv:()=>k,D_:()=>w,oc:()=>i,un:()=>h,Gv:()=>p,lQ:()=>d,d6:()=>c,Hr:()=>_,lW:()=>x,BA:()=>s,rd:()=>T,Uo:()=>o,uO:()=>L,Q0:()=>S,Rg:()=>A,k3:()=>M,TO:()=>$,eY:()=>B});var a=n(6719),l=n(7847);function r(e,t){let n,r,o;const s=(0,a.KR)(!0),i=()=>{s.value=!0,o()};(0,l.wB)(e,i,{flush:"sync"});const c="function"==typeof t?t:t.get,u="function"==typeof t?void 0:t.set,p=(0,a.rY)(((e,t)=>(r=e,o=t,{get:()=>(s.value&&(n=c(),s.value=!1),r(),n),set(e){null==u||u(e)}})));return Object.isExtensible(p)&&(p.trigger=i),p}function o(e){return!!(0,a.o5)()&&((0,a.jr)(e),!0)}function s(e){return"function"==typeof e?e():(0,a.R1)(e)}const i="undefined"!=typeof window&&"undefined"!=typeof document,c=("undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),e=>null!=e),u=Object.prototype.toString,p=e=>"[object Object]"===u.call(e),d=()=>{},h=v();function v(){var e,t;return i&&(null==(e=null==window?void 0:window.navigator)?void 0:e.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||(null==(t=null==window?void 0:window.navigator)?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(null==window?void 0:window.navigator.userAgent))}function f(e,t){return function(...n){return new Promise(((a,l)=>{Promise.resolve(e((()=>t.apply(this,n)),{fn:t,thisArg:this,args:n})).then(a).catch(l)}))}}const m=e=>e();function g(e){const t=Object.create(null);return n=>t[n]||(t[n]=e(n))}const y=/\B([A-Z])/g,b=(g((e=>e.replace(y,"-$1").toLowerCase())),/-(\w)/g);function w(e){return e}function k(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const e=t;t=void 0,e&&await e},n}function E(e){return e||(0,l.nI)()}function x(...e){if(1!==e.length)return(0,a.lW)(...e);const t=e[0];return"function"==typeof t?(0,a.tB)((0,a.rY)((()=>({get:t,set:d})))):(0,a.KR)(t)}function S(e,t=200,n={}){return f(function(e,t={}){let n,a,l=d;const r=e=>{clearTimeout(e),l(),l=d};return o=>{const i=s(e),c=s(t.maxWait);return n&&r(n),i<=0||void 0!==c&&c<=0?(a&&(r(a),a=null),Promise.resolve(o())):new Promise(((e,s)=>{l=t.rejectOnCancel?s:e,c&&!a&&(a=setTimeout((()=>{n&&r(n),a=null,e(o())}),c)),n=setTimeout((()=>{a&&r(a),a=null,e(o())}),i)}))}}(t,n),e)}function M(e,t=200,n=!1,l=!0,r=!1){return f(function(...e){let t,n,l,r,o,i,c=0,u=!0,p=d;(0,a.i9)(e[0])||"object"!=typeof e[0]?[l,r=!0,o=!0,i=!1]=e:({delay:l,trailing:r=!0,leading:o=!0,rejectOnCancel:i=!1}=e[0]);const h=()=>{t&&(clearTimeout(t),t=void 0,p(),p=d)};return e=>{const a=s(l),d=Date.now()-c,v=()=>n=e();return h(),a<=0?(c=Date.now(),v()):(d>a&&(o||!u)?(c=Date.now(),v()):r&&(n=new Promise(((e,n)=>{p=i?n:e,t=setTimeout((()=>{c=Date.now(),u=!0,e(v()),h()}),Math.max(0,a-d))}))),o||t||(t=setTimeout((()=>u=!0),a)),u=!1,n)}}(t,n,l,r),e)}function C(e,t,n={}){const{eventFilter:a=m,...r}=n;return(0,l.wB)(e,f(a,t),r)}function _(e,t,n={}){const{eventFilter:l,...r}=n,{eventFilter:o,pause:s,resume:i,isActive:c}=function(e=m){const t=(0,a.KR)(!0);return{isActive:(0,a.tB)(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:(...n)=>{t.value&&e(...n)}}}(l);return{stop:C(e,t,{...r,eventFilter:o}),pause:s,resume:i,isActive:c}}function T(e,t=!0,n){E()?(0,l.sV)(e,n):t?e():(0,l.dY)(e)}function L(e,t){E(t)&&(0,l.hi)(e,t)}function A(e,t=1e3,n={}){const{immediate:r=!0,immediateCallback:c=!1}=n;let u=null;const p=(0,a.KR)(!1);function d(){u&&(clearInterval(u),u=null)}function h(){p.value=!1,d()}function v(){const n=s(t);n<=0||(p.value=!0,c&&e(),d(),u=setInterval(e,n))}return r&&i&&v(),((0,a.i9)(t)||"function"==typeof t)&&o((0,l.wB)(t,(()=>{p.value&&i&&v()}))),o(h),{isActive:p,pause:h,resume:v}}function $(e,t,n={}){const{immediate:l=!0}=n,r=(0,a.KR)(!1);let c=null;function u(){c&&(clearTimeout(c),c=null)}function p(){r.value=!1,u()}function d(...n){u(),r.value=!0,c=setTimeout((()=>{r.value=!1,c=null,e(...n)}),s(t))}return l&&(r.value=!0,i&&d()),o(p),{isPending:(0,a.tB)(r),start:d,stop:p}}function B(e=!1,t={}){const{truthyValue:n=!0,falsyValue:l=!1}=t,r=(0,a.i9)(e),o=(0,a.KR)(e);function i(e){if(arguments.length)return o.value=e,o.value;{const e=s(n);return o.value=o.value===e?s(l):e,o.value}}return r?i:[o,i]}g((e=>e.replace(b,((e,t)=>t?t.toUpperCase():""))))},9647:(e,t,n)=>{n.d(t,{pageviewCount:()=>u});const a={"Content-Type":"application/json"},l=e=>`${e.replace(/\/?$/,"/")}api/`,r=(e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},o=e=>{const t=((e="")=>e.replace(/\/$/u,""))(e);return(e=>/^(https?:)?\/\//.test(e))(t)?t:`https://${t}`},s=e=>{"AbortError"!==e.name&&console.error(e.message)},i=e=>e.dataset.path||null,c=(e,t)=>{t.forEach(((t,n)=>{const a=e[n].time;"number"==typeof a&&(t.innerText=a.toString())}))},u=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:u=!0,lang:p=navigator.language})=>{const d=new AbortController,h=Array.from(document.querySelectorAll(n)),v=e=>{const n=i(e);return null!==n&&t!==n},f=n=>(({serverURL:e,lang:t,paths:n,signal:a})=>(({serverURL:e,lang:t,paths:n,type:a,signal:o})=>fetch(`${l(e)}article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(a.join(","))}&lang=${t}`,{signal:o}).then((e=>e.json())).then((e=>r(e,"Get counter").data)))({serverURL:e,lang:t,paths:n,type:["time"],signal:a}))({serverURL:o(e),paths:n.map((e=>i(e)||t)),lang:p,signal:d.signal}).then((e=>c(e,n))).catch(s);if(u){const n=h.filter((e=>!v(e))),s=h.filter(v);(e=>(({serverURL:e,lang:t,path:n,type:o,action:s})=>fetch(`${l(e)}article?lang=${t}`,{method:"POST",headers:a,body:JSON.stringify({path:n,type:o,action:s})}).then((e=>e.json())).then((e=>r(e,"Update counter").data)))({...e,type:"time",action:"inc"}))({serverURL:o(e),path:t,lang:p}).then((e=>c(e,n))),s.length&&f(s)}else f(h);return d.abort.bind(d)}},7739:(e,t,n)=>{n.d(t,{LA:()=>T,Ps:()=>A,aE:()=>$e,lq:()=>We,rd:()=>Be});var a=n(7847),l=n(6719);const r="undefined"!=typeof window;const o=Object.assign;function s(e,t){const n={};for(const a in t){const l=t[a];n[a]=c(l)?l.map(e):e(l)}return n}const i=()=>{},c=Array.isArray,u=/\/$/,p=e=>e.replace(u,"");function d(e,t,n="/"){let a,l={},r="",o="";const s=t.indexOf("#");let i=t.indexOf("?");return s=0&&(i=-1),i>-1&&(a=t.slice(0,i),r=t.slice(i+1,s>-1?s:t.length),l=e(r)),s>-1&&(a=a||t.slice(0,s),o=t.slice(s,t.length)),a=function(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),a=e.split("/"),l=a[a.length-1];".."!==l&&"."!==l||a.push("");let r,o,s=n.length-1;for(r=0;r1&&s--}return n.slice(0,s).join("/")+"/"+a.slice(r-(r===a.length?1:0)).join("/")}(null!=a?a:t,n),{fullPath:a+(r&&"?")+r+o,path:a,query:l,hash:o}}function h(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function v(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function f(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!m(e[n],t[n]))return!1;return!0}function m(e,t){return c(e)?g(e,t):c(t)?g(t,e):e===t}function g(e,t){return c(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}var y,b;!function(e){e.pop="pop",e.push="push"}(y||(y={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(b||(b={}));const w=/^[^#]+#/;function k(e,t){return e.replace(w,"#")+t}const E=()=>({left:window.pageXOffset,top:window.pageYOffset});function x(e,t){return(history.state?history.state.position-t:-1)+e}const S=new Map;let M=()=>location.protocol+"//"+location.host;function C(e,t){const{pathname:n,search:a,hash:l}=t,r=e.indexOf("#");if(r>-1){let t=l.includes(e.slice(r))?e.slice(r).length:1,n=l.slice(t);return"/"!==n[0]&&(n="/"+n),h(n,"")}return h(n,e)+a+l}function _(e,t,n,a=!1,l=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:l?E():null}}function T(e){const t=function(e){const{history:t,location:n}=window,a={value:C(e,n)},l={value:t.state};function r(a,r,o){const s=e.indexOf("#"),i=s>-1?(n.host&&document.querySelector("base")?e:e.slice(s))+a:M()+e+a;try{t[o?"replaceState":"pushState"](r,"",i),l.value=r}catch(e){console.error(e),n[o?"replace":"assign"](i)}}return l.value||r(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:a,state:l,push:function(e,n){const s=o({},l.value,t.state,{forward:e,scroll:E()});r(s.current,s,!0),r(e,o({},_(a.value,e,null),{position:s.position+1},n),!1),a.value=e},replace:function(e,n){r(e,o({},t.state,_(l.value.back,e,l.value.forward,!0),n,{position:l.value.position}),!0),a.value=e}}}(e=function(e){if(!e)if(r){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),p(e)}(e)),n=function(e,t,n,a){let l=[],r=[],s=null;const i=({state:r})=>{const o=C(e,location),i=n.value,c=t.value;let u=0;if(r){if(n.value=o,t.value=r,s&&s===i)return void(s=null);u=c?r.position-c.position:0}else a(o);l.forEach((e=>{e(n.value,i,{delta:u,type:y.pop,direction:u?u>0?b.forward:b.back:b.unknown})}))};function c(){const{history:e}=window;e.state&&e.replaceState(o({},e.state,{scroll:E()}),"")}return window.addEventListener("popstate",i),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:function(){s=n.value},listen:function(e){l.push(e);const t=()=>{const t=l.indexOf(e);t>-1&&l.splice(t,1)};return r.push(t),t},destroy:function(){for(const e of r)e();r=[],window.removeEventListener("popstate",i),window.removeEventListener("beforeunload",c)}}}(e,t.state,t.location,t.replace),a=o({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:k.bind(null,e)},t,n);return Object.defineProperty(a,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(a,"state",{enumerable:!0,get:()=>t.state.value}),a}function L(e){return"string"==typeof e||"symbol"==typeof e}const A={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},$=Symbol("");var B;function W(e,t){return o(new Error,{type:e,[$]:!0},t)}function R(e,t){return e instanceof Error&&$ in e&&(null==t||!!(e.type&t))}!function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"}(B||(B={}));const I="[^/]+?",P={sensitive:!1,strict:!1,start:!0,end:!0},O=/[.+*?^${}()[\]/\\]/g;function z(e,t){let n=0;for(;nt.length?1===t.length&&80===t[0]?1:-1:0}function V(e,t){let n=0;const a=e.score,l=t.score;for(;n0&&t[t.length-1]<0}const j={type:0,value:""},D=/[a-zA-Z0-9_]/;function F(e,t,n){const a=function(e,t){const n=o({},P,t),a=[];let l=n.start?"^":"";const r=[];for(const t of e){const e=t.length?[]:[90];n.strict&&!t.length&&(l+="/");for(let a=0;a1&&("*"===s||"+"===s)&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),r.push({type:1,value:c,regexp:u,repeatable:"*"===s||"+"===s,optional:"*"===s||"?"===s})):t("Invalid state to consume buffer"),c="")}function d(){c+=s}for(;io(e,t.meta)),{})}function G(e,t){const n={};for(const a in e)n[a]=a in t?t[a]:e[a];return n}function Y(e,t){return t.children.some((t=>t===e||Y(e,t)))}const Z=/#/g,X=/&/g,Q=/\//g,J=/=/g,ee=/\?/g,te=/\+/g,ne=/%5B/g,ae=/%5D/g,le=/%5E/g,re=/%60/g,oe=/%7B/g,se=/%7C/g,ie=/%7D/g,ce=/%20/g;function ue(e){return encodeURI(""+e).replace(se,"|").replace(ne,"[").replace(ae,"]")}function pe(e){return ue(e).replace(te,"%2B").replace(ce,"+").replace(Z,"%23").replace(X,"%26").replace(re,"`").replace(oe,"{").replace(ie,"}").replace(le,"^")}function de(e){return null==e?"":function(e){return ue(e).replace(Z,"%23").replace(ee,"%3F")}(e).replace(Q,"%2F")}function he(e){try{return decodeURIComponent(""+e)}catch(e){}return""+e}function ve(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;ee&&pe(e))):[a&&pe(a)]).forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))})):void 0!==a&&(t+=(t.length?"&":"")+n)}return t}function me(e){const t={};for(const n in e){const a=e[n];void 0!==a&&(t[n]=c(a)?a.map((e=>null==e?null:""+e)):null==a?a:""+a)}return t}const ge=Symbol(""),ye=Symbol(""),be=Symbol(""),we=Symbol(""),ke=Symbol("");function Ee(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function xe(e,t,n,a,l){const r=a&&(a.enterCallbacks[l]=a.enterCallbacks[l]||[]);return()=>new Promise(((o,s)=>{const i=e=>{var i;!1===e?s(W(4,{from:n,to:t})):e instanceof Error?s(e):"string"==typeof(i=e)||i&&"object"==typeof i?s(W(2,{from:t,to:e})):(r&&a.enterCallbacks[l]===r&&"function"==typeof e&&r.push(e),o())},c=e.call(a&&a.instances[l],t,n,i);let u=Promise.resolve(c);e.length<3&&(u=u.then(i)),u.catch((e=>s(e)))}))}function Se(e,t,n,a){const l=[];for(const o of e)for(const e in o.components){let s=o.components[e];if("beforeRouteEnter"===t||o.instances[e])if("object"==typeof(r=s)||"displayName"in r||"props"in r||"__vccOpts"in r){const r=(s.__vccOpts||s)[t];r&&l.push(xe(r,n,a,o,e))}else{let r=s();l.push((()=>r.then((l=>{if(!l)return Promise.reject(new Error(`Couldn't resolve component "${e}" at "${o.path}"`));const r=(s=l).__esModule||"Module"===s[Symbol.toStringTag]?l.default:l;var s;o.components[e]=r;const i=(r.__vccOpts||r)[t];return i&&xe(i,n,a,o,e)()}))))}}var r;return l}function Me(e){const t=(0,a.WQ)(be),n=(0,a.WQ)(we),r=(0,a.EW)((()=>t.resolve((0,l.R1)(e.to)))),o=(0,a.EW)((()=>{const{matched:e}=r.value,{length:t}=e,a=e[t-1],l=n.matched;if(!a||!l.length)return-1;const o=l.findIndex(v.bind(null,a));if(o>-1)return o;const s=_e(e[t-2]);return t>1&&_e(a)===s&&l[l.length-1].path!==s?l.findIndex(v.bind(null,e[t-2])):o})),s=(0,a.EW)((()=>o.value>-1&&function(e,t){for(const n in t){const a=t[n],l=e[n];if("string"==typeof a){if(a!==l)return!1}else if(!c(l)||l.length!==a.length||a.some(((e,t)=>e!==l[t])))return!1}return!0}(n.params,r.value.params))),u=(0,a.EW)((()=>o.value>-1&&o.value===n.matched.length-1&&f(n.params,r.value.params)));return{route:r,href:(0,a.EW)((()=>r.value.href)),isActive:s,isExactActive:u,navigate:function(n={}){return function(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}(n)?t[(0,l.R1)(e.replace)?"replace":"push"]((0,l.R1)(e.to)).catch(i):Promise.resolve()}}}const Ce=(0,a.pM)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Me,setup(e,{slots:t}){const n=(0,l.Kh)(Me(e)),{options:r}=(0,a.WQ)(be),o=(0,a.EW)((()=>({[Te(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Te(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const l=t.default&&t.default(n);return e.custom?l:(0,a.h)("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},l)}}});function _e(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Te=(e,t,n)=>null!=e?e:null!=t?t:n;function Le(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Ae=(0,a.pM)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=(0,a.WQ)(ke),s=(0,a.EW)((()=>e.route||r.value)),i=(0,a.WQ)(ye,0),c=(0,a.EW)((()=>{let e=(0,l.R1)(i);const{matched:t}=s.value;let n;for(;(n=t[e])&&!n.components;)e++;return e})),u=(0,a.EW)((()=>s.value.matched[c.value]));(0,a.Gt)(ye,(0,a.EW)((()=>c.value+1))),(0,a.Gt)(ge,u),(0,a.Gt)(ke,s);const p=(0,l.KR)();return(0,a.wB)((()=>[p.value,u.value,e.name]),(([e,t,n],[a,l,r])=>{t&&(t.instances[n]=e,l&&l!==t&&e&&e===a&&(t.leaveGuards.size||(t.leaveGuards=l.leaveGuards),t.updateGuards.size||(t.updateGuards=l.updateGuards))),!e||!t||l&&v(t,l)&&a||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const l=s.value,r=e.name,i=u.value,c=i&&i.components[r];if(!c)return Le(n.default,{Component:c,route:l});const d=i.props[r],h=d?!0===d?l.params:"function"==typeof d?d(l):d:null,v=(0,a.h)(c,o({},h,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(i.instances[r]=null)},ref:p}));return Le(n.default,{Component:v,route:l})||v}}});function $e(e){const t=function(e,t){const n=[],a=new Map;function l(e,n,a){const c=!a,u=function(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:U(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}(e);u.aliasOf=a&&a.record;const p=G(t,e),d=[u];if("alias"in e){const t="string"==typeof e.alias?[e.alias]:e.alias;for(const e of t)d.push(o({},u,{components:a?a.record.components:u.components,path:e,aliasOf:a?a.record:u}))}let h,v;for(const t of d){const{path:o}=t;if(n&&"/"!==o[0]){const e=n.record.path,a="/"===e[e.length-1]?"":"/";t.path=n.record.path+(o&&a+o)}if(h=F(t,n,p),a?a.alias.push(h):(v=v||h,v!==h&&v.alias.push(h),c&&e.name&&!K(h)&&r(e.name)),u.children){const e=u.children;for(let t=0;t{r(v)}:i}function r(e){if(L(e)){const t=a.get(e);t&&(a.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(r),t.alias.forEach(r))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&a.delete(e.record.name),e.children.forEach(r),e.alias.forEach(r))}}function s(e){let t=0;for(;t=0&&(e.record.path!==n[t].record.path||!Y(e,n[t]));)t++;n.splice(t,0,e),e.record.name&&!K(e)&&a.set(e.record.name,e)}return t=G({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>l(e))),{addRoute:l,resolve:function(e,t){let l,r,s,i={};if("name"in e&&e.name){if(l=a.get(e.name),!l)throw W(1,{location:e});s=l.record.name,i=o(H(t.params,l.keys.filter((e=>!e.optional)).map((e=>e.name))),e.params&&H(e.params,l.keys.map((e=>e.name)))),r=l.stringify(i)}else if("path"in e)r=e.path,l=n.find((e=>e.re.test(r))),l&&(i=l.parse(r),s=l.record.name);else{if(l=t.name?a.get(t.name):n.find((e=>e.re.test(t.path))),!l)throw W(1,{location:e,currentLocation:t});s=l.record.name,i=o({},t.params,e.params),r=l.stringify(i)}const c=[];let u=l;for(;u;)c.unshift(u.record),u=u.parent;return{name:s,path:r,params:i,matched:c,meta:q(c)}},removeRoute:r,getRoutes:function(){return n},getRecordMatcher:function(e){return a.get(e)}}}(e.routes,e),n=e.parseQuery||ve,u=e.stringifyQuery||fe,p=e.history,h=Ee(),m=Ee(),g=Ee(),b=(0,l.IJ)(A);let w=A;r&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const k=s.bind(null,(e=>""+e)),M=s.bind(null,de),C=s.bind(null,he);function _(e,a){if(a=o({},a||b.value),"string"==typeof e){const l=d(n,e,a.path),r=t.resolve({path:l.path},a),s=p.createHref(l.fullPath);return o(l,r,{params:C(r.params),hash:he(l.hash),redirectedFrom:void 0,href:s})}let l;if("path"in e)l=o({},e,{path:d(n,e.path,a.path).path});else{const t=o({},e.params);for(const e in t)null==t[e]&&delete t[e];l=o({},e,{params:M(t)}),a.params=M(a.params)}const r=t.resolve(l,a),s=e.hash||"";r.params=k(C(r.params));const i=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(u,o({},e,{hash:(c=s,ue(c).replace(oe,"{").replace(ie,"}").replace(le,"^")),path:r.path}));var c;const h=p.createHref(i);return o({fullPath:i,hash:s,query:u===fe?me(e.query):e.query||{}},r,{redirectedFrom:void 0,href:h})}function T(e){return"string"==typeof e?d(n,e,b.value.path):o({},e)}function $(e,t){if(w!==e)return W(8,{from:t,to:e})}function B(e){return P(e)}function I(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let a="function"==typeof n?n(e):n;return"string"==typeof a&&(a=a.includes("?")||a.includes("#")?a=T(a):{path:a},a.params={}),o({query:e.query,hash:e.hash,params:"path"in a?{}:e.params},a)}}function P(e,t){const n=w=_(e),a=b.value,l=e.state,r=e.force,s=!0===e.replace,i=I(n);if(i)return P(o(T(i),{state:"object"==typeof i?o({},l,i.state):l,force:r,replace:s}),t||n);const c=n;let p;return c.redirectedFrom=t,!r&&function(e,t,n){const a=t.matched.length-1,l=n.matched.length-1;return a>-1&&a===l&&v(t.matched[a],n.matched[l])&&f(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}(u,a,n)&&(p=W(16,{to:c,from:a}),ne(a,a,!0,!1)),(p?Promise.resolve(p):N(c,a)).catch((e=>R(e)?R(e,2)?e:te(e):ee(e,c,a))).then((e=>{if(e){if(R(e,2))return P(o({replace:s},T(e.to),{state:"object"==typeof e.to?o({},l,e.to.state):l,force:r}),t||c)}else e=D(c,a,!0,s,l);return j(c,a,e),e}))}function O(e,t){const n=$(e,t);return n?Promise.reject(n):Promise.resolve()}function z(e){const t=se.values().next().value;return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}function N(e,t){let n;const[a,l,r]=function(e,t){const n=[],a=[],l=[],r=Math.max(t.matched.length,e.matched.length);for(let o=0;ov(e,r)))?a.push(r):n.push(r));const s=e.matched[o];s&&(t.matched.find((e=>v(e,s)))||l.push(s))}return[n,a,l]}(e,t);n=Se(a.reverse(),"beforeRouteLeave",e,t);for(const l of a)l.leaveGuards.forEach((a=>{n.push(xe(a,e,t))}));const o=O.bind(null,e,t);return n.push(o),pe(n).then((()=>{n=[];for(const a of h.list())n.push(xe(a,e,t));return n.push(o),pe(n)})).then((()=>{n=Se(l,"beforeRouteUpdate",e,t);for(const a of l)a.updateGuards.forEach((a=>{n.push(xe(a,e,t))}));return n.push(o),pe(n)})).then((()=>{n=[];for(const a of r)if(a.beforeEnter)if(c(a.beforeEnter))for(const l of a.beforeEnter)n.push(xe(l,e,t));else n.push(xe(a.beforeEnter,e,t));return n.push(o),pe(n)})).then((()=>(e.matched.forEach((e=>e.enterCallbacks={})),n=Se(r,"beforeRouteEnter",e,t),n.push(o),pe(n)))).then((()=>{n=[];for(const a of m.list())n.push(xe(a,e,t));return n.push(o),pe(n)})).catch((e=>R(e,8)?e:Promise.reject(e)))}function j(e,t,n){g.list().forEach((a=>z((()=>a(e,t,n)))))}function D(e,t,n,a,l){const s=$(e,t);if(s)return s;const i=t===A,c=r?history.state:{};n&&(a||i?p.replace(e.fullPath,o({scroll:i&&c&&c.scroll},l)):p.push(e.fullPath,l)),b.value=e,ne(e,t,n,i),te()}let Z;let X,Q=Ee(),J=Ee();function ee(e,t,n){te(e);const a=J.list();return a.length?a.forEach((a=>a(e,t,n))):console.error(e),Promise.reject(e)}function te(e){return X||(X=!e,Z||(Z=p.listen(((e,t,n)=>{if(!ce.listening)return;const a=_(e),l=I(a);if(l)return void P(o(l,{replace:!0}),a).catch(i);w=a;const s=b.value;var c,u;r&&(c=x(s.fullPath,n.delta),u=E(),S.set(c,u)),N(a,s).catch((e=>R(e,12)?e:R(e,2)?(P(e.to,a).then((e=>{R(e,20)&&!n.delta&&n.type===y.pop&&p.go(-1,!1)})).catch(i),Promise.reject()):(n.delta&&p.go(-n.delta,!1),ee(e,a,s)))).then((e=>{(e=e||D(a,s,!1))&&(n.delta&&!R(e,8)?p.go(-n.delta,!1):n.type===y.pop&&R(e,20)&&p.go(-1,!1)),j(a,s,e)})).catch(i)}))),Q.list().forEach((([t,n])=>e?n(e):t())),Q.reset()),e}function ne(t,n,l,o){const{scrollBehavior:s}=e;if(!r||!s)return Promise.resolve();const i=!l&&function(e){const t=S.get(e);return S.delete(e),t}(x(t.fullPath,0))||(o||!l)&&history.state&&history.state.scroll||null;return(0,a.dY)().then((()=>s(t,n,i))).then((e=>e&&function(e){let t;if("el"in e){const n=e.el,a="string"==typeof n&&n.startsWith("#"),l="string"==typeof n?a?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!l)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),a=e.getBoundingClientRect();return{behavior:t.behavior,left:a.left-n.left-(t.left||0),top:a.top-n.top-(t.top||0)}}(l,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.pageXOffset,null!=t.top?t.top:window.pageYOffset)}(e))).catch((e=>ee(e,t,n)))}const ae=e=>p.go(e);let re;const se=new Set,ce={currentRoute:b,listening:!0,addRoute:function(e,n){let a,l;return L(e)?(a=t.getRecordMatcher(e),l=n):l=e,t.addRoute(l,a)},removeRoute:function(e){const n=t.getRecordMatcher(e);n&&t.removeRoute(n)},hasRoute:function(e){return!!t.getRecordMatcher(e)},getRoutes:function(){return t.getRoutes().map((e=>e.record))},resolve:_,options:e,push:B,replace:function(e){return B(o(T(e),{replace:!0}))},go:ae,back:()=>ae(-1),forward:()=>ae(1),beforeEach:h.add,beforeResolve:m.add,afterEach:g.add,onError:J.add,isReady:function(){return X&&b.value!==A?Promise.resolve():new Promise(((e,t)=>{Q.add([e,t])}))},install(e){e.component("RouterLink",Ce),e.component("RouterView",Ae),e.config.globalProperties.$router=this,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,l.R1)(b)}),r&&!re&&b.value===A&&(re=!0,B(p.location).catch((e=>{})));const t={};for(const e in A)Object.defineProperty(t,e,{get:()=>b.value[e],enumerable:!0});e.provide(be,this),e.provide(we,(0,l.Gc)(t)),e.provide(ke,b);const n=e.unmount;se.add(e),e.unmount=function(){se.delete(e),se.size<1&&(w=A,Z&&Z(),Z=null,b.value=A,re=!1,X=!1),n()}}};function pe(e){return e.reduce(((e,t)=>e.then((()=>z(t)))),Promise.resolve())}return ce}function Be(){return(0,a.WQ)(be)}function We(){return(0,a.WQ)(we)}},6254:(e,t,n)=>{n.d(t,{A:()=>f});var a=n(3151),l=n(7847),r=n(8981),o=n(9647),s=n(2082);let i={provider:"Waline",dark:'html[data-theme="dark"]',serverURL:"https://waline.newzone.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"]};const c=Symbol(""),u=()=>(0,l.WQ)(c),p=u,d={"/":{placeholder:"请留言。(填写邮箱可在被回复时收到邮件提醒)",reactionTitle:"已到达文章底部,欢迎留言、表情互动~",reaction0:"赞一个",reaction1:"支持下",reaction2:"有点酷",reaction3:"啥玩意",reaction4:"看不懂",admin:"盛年不重来,一日难再晨",level0:"锻体",level1:"炼气",level2:"筑基",level3:"金丹",level4:"元婴",level5:"化神"}};Promise.all([n.e(3374),n.e(4221)]).then(n.bind(n,4221));var h=(0,l.pM)({name:"WalineComment",props:{identifier:{type:String,required:!0}},setup(e){const t=p(),i=(0,a.R7)(),c=(0,a.Nj)(),u=(0,r.s5)(d);let h;const v=!!t.serverURL,f=(0,l.EW)((()=>{if(!v)return!1;const e=!1!==t.pageview,n=i.value.pageview;return!!n||!1!==e&&!1!==n})),m=(0,l.EW)((()=>({lang:"zh-CN"===c.value?"zh-CN":"en",locale:u.value,dark:"html.dark",...t,path:e.identifier})));return(0,l.sV)((()=>{(0,l.wB)((()=>e.identifier),(()=>{h?.(),f.value&&(0,l.dY)().then((()=>{setTimeout((()=>{h=(0,o.pageviewCount)({serverURL:t.serverURL,path:e.identifier})}),t.delay||800)}))}),{immediate:!0})})),()=>v?(0,l.h)("div",{id:"comment",class:"waline-wrapper"},(0,l.h)((0,l.$V)({loader:async()=>(await n.e(1798).then(n.bind(n,1798))).Waline,loadingComponent:s.mP}),m.value)):null}}),v=(0,l.pM)({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=u(),n=(0,a.BV)(),r=(0,a.R7)(),o=!1!==t.comment,s=(0,l.EW)((()=>r.value.comment||o&&!1!==r.value.comment));return()=>(0,l.h)(h,{identifier:r.value.commentID||n.value.path,darkmode:e.darkmode,style:{display:s.value?"block":"none"}})}}),f=(0,a.re)({enhance:({app:e})=>{e.provide(c,i),e.component("CommentService",v)}})},1136:(e,t,n)=>{n.d(t,{A:()=>l});var a=n(7847);const l=({type:e="info",text:t="",vertical:n,color:l},{slots:r})=>(0,a.h)("span",{class:["vp-badge",e,{diy:l}],style:{verticalAlign:n??!1,backgroundColor:l??!1}},r.default?.()||t);l.displayName="Badge"},5420:(e,t,n)=>{n.d(t,{A:()=>p});var a=n(7847),l=n(6719),r=n(2082),o=n(8981),s=n(5670);const i=e=>(0,o.Kg)(e)?e:`${e}px`,c=(e,t=0)=>{const n=(0,l.IJ)(),r=(0,a.EW)((()=>i((0,l.R1)(e.width)||"100%"))),c=(0,l.KR)("auto"),u=()=>{n.value&&(c.value=(n=>{const a=(0,l.R1)(e.height),r=(e=>{if((0,o.Kg)(e)){const[t,n]=e.split(":"),a=Number(t)/Number(n);if(!Number.isNaN(a))return a}return"number"==typeof e?e:16/9})((0,l.R1)(e.ratio));return a?i(a):`${Number(n)/r+(0,l.R1)(t)}px`})(n.value.clientWidth))};return(0,a.sV)((()=>{u(),(0,l.i9)(t)&&(0,a.wB)(t,u),(0,s.MLh)("orientationchange",u),(0,s.MLh)("resize",u)})),{el:n,width:r,height:c,resize:u}},u="https://player.bilibili.com/player.html";var p=(0,a.pM)({name:"BiliBili",props:{bvid:{type:String,default:""},aid:{type:String,default:""},cid:{type:String,default:""},title:{type:String,default:"A BiliBili video"},page:{type:[String,Number],default:1},width:{type:[String,Number],default:"100%"},height:{type:[String,Number],default:void 0},ratio:{type:[String,Number],default:16/9},time:{type:[String,Number],default:0},autoplay:Boolean},setup(e){const{el:t,width:n,height:o,resize:s}=c(e),i=(0,l.KR)(!1),p=(0,a.EW)((()=>{const{aid:t,bvid:n,cid:a,autoplay:l,time:r,page:o}=e;return t&&a?`${u}?aid=${t}&cid=${a}&t=${r}&autoplay=${l?1:0}&p=${o}`:n?`${u}?bvid=${n}&t=${r}&autoplay=${l?1:0}`:null}));return()=>p.value?[(0,a.h)("div",{class:"bilibili-desc"},(0,a.h)("a",{class:"sr-only",href:p.value},e.title)),(0,a.h)("iframe",{ref:t,src:p.value,title:e.title,class:"bilibili-iframe",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture",style:{width:n.value,height:i.value?o.value:0},onLoad:()=>{i.value=!0,s()}}),i.value?null:(0,a.h)(r.mP)]:[]}})},3095:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(8981),l=n(7847),r=(0,l.pM)({name:"FontIcon",props:{icon:{type:String,default:""},color:{type:String,default:""},size:{type:[String,Number],default:""}},setup(e){const t=(0,l.EW)((()=>{const t=["font-icon icon"],n=`iconfont icon-${e.icon}`;return t.push(n),t})),n=(0,l.EW)((()=>{const t={};return e.color&&(t.color=e.color),e.size&&(t["font-size"]=Number.isNaN(Number(e.size))?e.size:`${e.size}px`),(0,a.HP)(t).length?t:null}));return()=>e.icon?(0,l.h)("span",{key:e.icon,class:t.value,style:n.value}):null}})},4322:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(8981),l=n(7847),r=(0,l.pM)({name:"VidStack",props:{sources:{type:Array,default:()=>[]},tracks:{type:Array,default:()=>[]}},setup:(e,{attrs:t})=>((0,l.sV)((async()=>{await Promise.all([Promise.all([n.e(216),n.e(9437)]).then(n.bind(n,9437)),Promise.all([n.e(216),n.e(3497)]).then(n.bind(n,3497)),Promise.all([n.e(216),n.e(6860)]).then(n.bind(n,6860))])})),()=>(0,l.h)("media-player",t,[(0,l.h)("media-provider",[t.poster?(0,l.h)("media-poster",{class:"vds-poster",alt:t.alt||t.title}):null,e.sources.map((e=>(0,a.Qd)(e)?(0,l.h)("source",e):(0,l.h)("source",{src:e}))),e.tracks.map((e=>(0,l.h)("track",e)))]),(0,l.h)("media-audio-layout"),(0,l.h)("media-video-layout",t)]))})},6210:(e,t,n)=>{n.d(t,{n:()=>l});var a=n(5670);const l=()=>{(0,a.MLh)("beforeprint",(()=>{document.querySelectorAll("details").forEach((e=>{e.open=!0}))}))}},2082:(e,t,n)=>{n.d(t,{Bn:()=>g,Bz:()=>p,DA:()=>b,Hk:()=>i,J7:()=>c,QB:()=>v,XA:()=>y,ad:()=>s,bH:()=>C,e1:()=>h,kn:()=>x,mP:()=>o,p7:()=>M,pY:()=>d,s5:()=>u,zP:()=>r});var a=n(7847),l=n(8981);const r=({name:e="",color:t="currentColor"},{slots:n})=>(0,a.h)("svg",{xmlns:"http://www.w3.org/2000/svg",class:["icon",`${e}-icon`],viewBox:"0 0 1024 1024",fill:t,"aria-label":`${e} icon`},n.default?.());r.displayName="IconBase";const o=({size:e=48,stroke:t=4,wrapper:n=!0,height:l=2*e})=>{const r=(0,a.h)("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,preserveAspectRatio:"xMidYMid",viewBox:"25 25 50 50"},[(0,a.h)("animateTransform",{attributeName:"transform",type:"rotate",dur:"2s",keyTimes:"0;1",repeatCount:"indefinite",values:"0;360"}),(0,a.h)("circle",{cx:"50",cy:"50",r:"20",fill:"none",stroke:"currentColor","stroke-width":t,"stroke-linecap":"round"},[(0,a.h)("animate",{attributeName:"stroke-dasharray",dur:"1.5s",keyTimes:"0;0.5;1",repeatCount:"indefinite",values:"1,200;90,200;1,200"}),(0,a.h)("animate",{attributeName:"stroke-dashoffset",dur:"1.5s",keyTimes:"0;0.5;1",repeatCount:"indefinite",values:"0;-35px;-125px"})])]);return n?(0,a.h)("div",{class:"loading-icon-wrapper",style:`display:flex;align-items:center;justify-content:center;height:${l}px`},r):r};o.displayName="LoadingIcon";const s=(e,{slots:t})=>t.default?.(),i=()=>(0,a.h)(r,{name:"github"},(()=>(0,a.h)("path",{d:"M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"})));i.displayName="GitHubIcon";const c=()=>(0,a.h)(r,{name:"gitlab"},(()=>(0,a.h)("path",{d:"M229.333 78.688C223.52 62 199.895 62 193.895 78.688L87.958 406.438h247.5c-.188 0-106.125-327.75-106.125-327.75zM33.77 571.438c-4.875 15 .563 31.687 13.313 41.25l464.812 345L87.77 406.438zm301.5-165 176.813 551.25 176.812-551.25zm655.125 165-54-165-424.312 551.25 464.812-345c12.938-9.563 18.188-26.25 13.5-41.25zM830.27 78.688c-5.812-16.688-29.437-16.688-35.437 0l-106.125 327.75h247.5z"})));c.displayName="GitLabIcon";const u=()=>(0,a.h)(r,{name:"gitee"},(()=>(0,a.h)("path",{d:"M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm242.97-533.34H482.39a23.7 23.7 0 0 0-23.7 23.7l-.03 59.28c0 13.08 10.59 23.7 23.7 23.7h165.96a23.7 23.7 0 0 1 23.7 23.7v11.85a71.1 71.1 0 0 1-71.1 71.1H375.71a23.7 23.7 0 0 1-23.7-23.7V423.11a71.1 71.1 0 0 1 71.1-71.1h331.8a23.7 23.7 0 0 0 23.7-23.7l.06-59.25a23.73 23.73 0 0 0-23.7-23.73H423.11a177.78 177.78 0 0 0-177.78 177.75v331.83c0 13.08 10.62 23.7 23.7 23.7h349.62a159.99 159.99 0 0 0 159.99-159.99V482.33a23.7 23.7 0 0 0-23.7-23.7z"})));u.displayName="GiteeIcon";const p=()=>(0,a.h)(r,{name:"bitbucket"},(()=>(0,a.h)("path",{d:"M575.256 490.862c6.29 47.981-52.005 85.723-92.563 61.147-45.714-20.004-45.714-92.562-1.133-113.152 38.29-23.442 93.696 7.424 93.696 52.005zm63.451-11.996c-10.276-81.152-102.29-134.839-177.152-101.156-47.433 21.138-79.433 71.424-77.129 124.562 2.853 69.705 69.157 126.866 138.862 120.576S647.3 548.571 638.708 478.83zm136.558-309.723c-25.161-33.134-67.986-38.839-105.728-45.13-106.862-17.151-216.576-17.7-323.438 1.134-35.438 5.706-75.447 11.996-97.719 43.996 36.572 34.304 88.576 39.424 135.424 45.129 84.553 10.862 171.447 11.447 256 .585 47.433-5.705 99.987-10.276 135.424-45.714zm32.585 591.433c-16.018 55.99-6.839 131.438-66.304 163.986-102.29 56.576-226.304 62.867-338.87 42.862-59.43-10.862-129.135-29.696-161.72-85.723-14.3-54.858-23.442-110.848-32.585-166.84l3.438-9.142 10.276-5.157c170.277 112.567 408.576 112.567 579.438 0 26.844 8.01 6.84 40.558 6.29 60.014zm103.424-549.157c-19.42 125.148-41.728 249.71-63.415 374.272-6.29 36.572-41.728 57.162-71.424 72.558-106.862 53.724-231.424 62.866-348.562 50.286-79.433-8.558-160.585-29.696-225.134-79.433-30.28-23.443-30.28-63.415-35.986-97.134-20.005-117.138-42.862-234.277-57.161-352.585 6.839-51.42 64.585-73.728 107.447-89.71 57.16-21.138 118.272-30.866 178.87-36.571 129.134-12.58 261.157-8.01 386.304 28.562 44.581 13.13 92.563 31.415 122.844 69.705 13.714 17.7 9.143 40.01 6.29 60.014z"})));p.displayName="BitbucketIcon";const d=()=>(0,a.h)(r,{name:"source"},(()=>(0,a.h)("path",{d:"M601.92 475.2c0 76.428-8.91 83.754-28.512 99.594-14.652 11.88-43.956 14.058-78.012 16.434-18.81 1.386-40.392 2.97-62.172 6.534-18.612 2.97-36.432 9.306-53.064 17.424V299.772c37.818-21.978 63.36-62.766 63.36-109.692 0-69.894-56.826-126.72-126.72-126.72S190.08 120.186 190.08 190.08c0 46.926 25.542 87.714 63.36 109.692v414.216c-37.818 21.978-63.36 62.766-63.36 109.692 0 69.894 56.826 126.72 126.72 126.72s126.72-56.826 126.72-126.72c0-31.086-11.286-59.598-29.7-81.576 13.266-9.504 27.522-17.226 39.996-19.206 16.038-2.574 32.868-3.762 50.688-5.148 48.312-3.366 103.158-7.326 148.896-44.55 61.182-49.698 74.25-103.158 75.24-187.902V475.2h-126.72zM316.8 126.72c34.848 0 63.36 28.512 63.36 63.36s-28.512 63.36-63.36 63.36-63.36-28.512-63.36-63.36 28.512-63.36 63.36-63.36zm0 760.32c-34.848 0-63.36-28.512-63.36-63.36s28.512-63.36 63.36-63.36 63.36 28.512 63.36 63.36-28.512 63.36-63.36 63.36zM823.68 158.4h-95.04V63.36h-126.72v95.04h-95.04v126.72h95.04v95.04h126.72v-95.04h95.04z"})));d.displayName="SourceIcon";const h=(e,t)=>{let n=1;for(let t=0;t>6;return n+=n<<3,n^=n>>11,n%t};class v{constructor(){this.messageElements={};const e="message-container",t=document.getElementById(e);t?this.containerElement=t:(this.containerElement=document.createElement("div"),this.containerElement.id=e,document.body.appendChild(this.containerElement))}pop(e,t=2e3){const n=document.createElement("div"),a=Date.now();return n.className="message move-in",n.innerHTML=e,this.containerElement.appendChild(n),this.messageElements[a]=n,t>0&&setTimeout((()=>{this.close(a)}),t),a}close(e){if(e){const t=this.messageElements[e];t.classList.remove("move-in"),t.classList.add("move-out"),t.addEventListener("animationend",(()=>{t.remove(),delete this.messageElements[e]}))}else(0,l.HP)(this.messageElements).forEach((e=>this.close(Number(e))))}destroy(){document.body.removeChild(this.containerElement)}}const f=/#.*$/u,m=e=>decodeURI(e).replace(f,"").replace(/\/index\.html$/iu,"/").replace(/\.html$/iu,"").replace(/(README|index)?\.md$/iu,""),g=(e,t)=>{if(!(0,l.C8)(t))return!1;const n=m(e.path),a=m(t),r=(e=>{const t=f.exec(e);return t?t[0]:""})(t);return r?r===e.hash&&(!a||n===a):n===a},y=e=>(0,l.r3)(e)?e:`https://github.com/${e}`,b=e=>!(0,l.r3)(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null;var w=e=>"string"==typeof e;const k=Array.isArray,E=e=>(e=>"[object Object]"===Object.prototype.toString.call(e))(e)&&w(e.name),x=(e,t=!1)=>e?k(e)?e.map((e=>w(e)?{name:e}:E(e)?e:null)).filter((e=>null!==e)):w(e)?[{name:e}]:E(e)?[e]:(console.error(`Expect "author" to be \`AuthorInfo[] | AuthorInfo | string[] | string ${t?"":"| false"} | undefined\`, but got`,e),[]):[],S=(e,t)=>{if(e){if(k(e)&&e.every(w))return e;if(w(e))return[e];console.error(`Expect ${t||"value"} to be \`string[] | string | undefined\`, but got`,e)}return[]},M=e=>S(e,"category"),C=e=>S(e,"tag")},3039:(e,t,n)=>{n.d(t,{A:()=>P,P:()=>Ye,a:()=>b,b:()=>k,c:()=>A,d:()=>_,e:()=>Te,f:()=>y,g:()=>M,h:()=>Je,i:()=>T,j:()=>F,k:()=>O,l:()=>Ae,m:()=>et,p:()=>_e,r:()=>V,s:()=>L,u:()=>H});var a=n(8981),l=n(3151),r=n(5670),o=n(2930),s=n(7847),i=n(6719),c=n(6476),u=n(2082),p=n(4601),d=n(6635);const h=()=>null;var v=n(3578),f=n(7267),m=n(1878);const g=e=>{const{icon:t="",color:n,size:r}=e,o=n||r?{}:null;return n&&(o.color=n),r&&(o.height=Number.isNaN(Number(r))?r:`${r}px`),(0,a.r3)(t)?(0,s.h)("img",{class:"icon",src:t,alt:"","no-view":"",style:o}):(0,a.eM)(t)?(0,s.h)("img",{class:"icon",src:(0,l.cV)(t),alt:"","aria-hidden":"","no-view":"",style:o}):(0,s.h)((0,s.g2)("FontIcon"),e)};g.displayName="HopeIcon";var y=g;const b=()=>{const e=(0,l.rd)(),t=(0,l.lq)();return n=>{if(n)if((0,a.eM)(n))t.path!==n&&e.push(n);else if((0,a.zn)(n))window&&window.open(n);else{const a=t.path.slice(0,t.path.lastIndexOf("/"));e.push(`${a}/${encodeURI(n)}`)}}},w=()=>{const e=(0,d.a)(),t=(0,l.R7)();return(0,s.EW)((()=>{const{author:n}=t.value;return n?(0,u.kn)(n):!1===n?[]:(0,u.kn)(e.value.author,!1)}))},k=()=>{const e=(0,d.a)(),t=(0,l.BV)(),n=(0,l.R7)(),r=w(),o=(()=>{const e=(0,l.R7)(),t=(0,s.WQ)(Symbol.for("categoryMap"));return(0,s.EW)((()=>(0,u.p7)(e.value.category).map((e=>({name:e,path:t?.value.map[e]?.path||""})))))})(),i=(()=>{const e=(0,l.R7)(),t=(0,s.WQ)(Symbol.for("tagMap"));return(0,s.EW)((()=>(0,u.bH)(e.value.tag).map((e=>({name:e,path:t?.value.map[e]?.path||""})))))})(),c=(()=>{const e=(0,l.R7)(),t=(0,l.BV)();return(0,s.EW)((()=>{const n=(0,a.pp)(e.value.date);if(n)return n;const{createdTime:l}=t.value.git||{};return l?new Date(l):null}))})(),h=(0,p.Fk)(),v=(0,p.Ft)();return{info:(0,s.EW)((()=>({author:r.value,category:o.value,date:c.value,localizedDate:t.value.localizedDate,tag:i.value,isOriginal:n.value.isOriginal||!1,readingTime:h.value,readingTimeLocale:v.value,pageview:!("pageview"in n.value)||n.value.pageview}))),items:(0,s.EW)((()=>"pageInfo"in n.value?n.value.pageInfo:"pageInfo"in e.value?e.value.pageInfo:null))}},{mobileBreakPoint:E,pcBreakPoint:x}=f.A,S=e=>e.endsWith("px")?Number(e.slice(0,-2)):null,M=()=>{const e=(0,i.KR)(!1),t=(0,i.KR)(!1),n=()=>{e.value=window.innerWidth<=(S(E)??719),t.value=window.innerWidth>=(S(x)??1440)};return(0,s.sV)((()=>{n(),(0,r.MLh)("resize",n,!1),(0,r.MLh)("orientationchange",n,!1)})),{isMobile:e,isPC:t}},C=Symbol(""),_=()=>{const e=(0,s.WQ)(C);if(!e)throw new Error("useDarkmode() is called without provider.");return e},T=e=>{const t=(0,d.b)(),n=(0,r.Nk8)(),a=(0,s.EW)((()=>t.value.darkmode||"switch")),l=(0,r.rXt)("vuepress-theme-hope-scheme","auto"),o=(0,s.EW)((()=>{const e=a.value;return"disable"!==e&&("enable"===e||("auto"===e?n.value:"toggle"===e?"dark"===l.value:"dark"===l.value||"auto"===l.value&&n.value))})),i=(0,s.EW)((()=>{const e=a.value;return"switch"===e||"toggle"===e}));e.provide(C,{canToggle:i,config:a,isDarkmode:o,status:l}),Object.defineProperties(e.config.globalProperties,{$isDarkmode:{get:()=>o.value}})},L=()=>{const{config:e,isDarkmode:t,status:n}=_();(0,s.nT)((()=>{"disable"===e.value?n.value="light":"enable"===e.value?n.value="dark":"toggle"===e.value&&"auto"===n.value&&(n.value="light")})),(0,s.sV)((()=>{(0,s.wB)(t,(e=>document.documentElement.setAttribute("data-theme",e?"dark":"light")),{immediate:!0})}))};var A=(0,s.pM)({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:r}){const o=(0,l.lq)(),c=(0,l.rU)(),u=(0,i.lW)(e,"config"),p=(0,s.EW)((()=>(0,a.r3)(u.value.link))),d=(0,s.EW)((()=>!p.value&&(0,a.zn)(u.value.link))),h=(0,s.EW)((()=>u.value.target||(p.value?"_blank":void 0))),f=(0,s.EW)((()=>"_blank"===h.value)),m=(0,s.EW)((()=>!p.value&&!d.value&&!f.value)),g=(0,s.EW)((()=>u.value.rel||(f.value?"noopener noreferrer":null))),b=(0,s.EW)((()=>u.value.ariaLabel||u.value.text)),w=(0,s.EW)((()=>{if(e.exact)return!1;const t=(0,a.HP)(c.value.locales);return t.length?t.every((e=>e!==u.value.link)):"/"!==u.value.link})),k=(0,s.EW)((()=>!!m.value&&(u.value.activeMatch?new RegExp(u.value.activeMatch,"u").test(o.path):w.value?(0,a.w1)(o.path,u.value.link):o.path===u.value.link)));return()=>{const{before:a,after:o,default:i}=r,{text:c,icon:p,link:d}=u.value;return m.value?(0,s.h)(l.Wt,{to:d,"aria-label":b.value,...t,class:["nav-link",{active:k.value},t.class],onFocusout:()=>n("focusout")},(()=>i?i():[a?a():(0,s.h)(y,{icon:p}),c,o?.()])):(0,s.h)("a",{href:d,rel:g.value,target:h.value,"aria-label":b.value,...t,class:["nav-link",t.class],onFocusout:()=>n("focusout")},i?i():[a?a():(0,s.h)(y,{icon:p}),c,e.noExternalLinkIcon?null:(0,s.h)(v.p),o?.()])}}});const $=(e,t,n=!1)=>"activeMatch"in t?new RegExp(t.activeMatch,"u").test(e.path):!!(0,u.Bn)(e,t.link)||!(!t.children||n)&&t.children.some((t=>$(e,t))),B=(e,t)=>"group"===t.type&&(t.children.some((t=>"group"===t.type?B(e,t):"page"===t.type&&$(e,t,!0)))||"prefix"in t&&(0,u.Bn)(e,t.prefix)),W=(e,t)=>(0,a.Kg)(e.link)?(0,s.h)(A,{...t,config:e}):(0,s.h)("p",t,[(0,s.h)(y,{icon:e.icon}),e.text]),R=e=>{const t=(0,l.lq)();return e?(0,s.h)("ul",{class:"vp-sidebar-sub-headers"},e.map((e=>(0,s.h)("li",{class:"vp-sidebar-sub-header"},[W(e,{class:["vp-sidebar-link","vp-heading",{active:$(t,e,!0)}]}),R(e.children)])))):null};var I,P=((I=P||{}).type="y",I.title="t",I.shortTitle="s",I.icon="i",I.author="a",I.date="d",I.localizedDate="l",I.category="c",I.tag="g",I.isEncrypted="n",I.isOriginal="o",I.readingTime="r",I.excerpt="e",I.sticky="u",I.cover="v",I.index="I",I.order="O",I),O=(e=>(e.article="a",e.home="h",e.slide="s",e.page="p",e))(O||{});const z=(e="",t="")=>(0,a.eM)(t)?t:`${(0,a.PT)(e)}${t}`,V=(e,t=!1)=>{const{meta:n,path:a}=(0,l.ie)(e);return n?{text:!t&&n[P.shortTitle]?n[P.shortTitle]:n[P.title]||a,link:a,...n[P.icon]?{icon:n[P.icon]}:{}}:{text:a,link:a}},N=(e,t,n)=>n>0?t.map((t=>({type:"heading",text:t.title,link:`${e.path}#${t.slug}`,children:N(e,t.children,n-1)}))):[],j=({config:e,page:t,headerDepth:n,prefix:l=""})=>{const r=(e,o=l)=>{const s=(0,a.Kg)(e)?V(z(o,e)):e.link?{...e,...(0,a.km)(e.link)?{}:{link:V(z(o,e.link)).link}}:e;if("children"in s){const e=z(o,s.prefix),t="structure"===s.children?m.v[e]:s.children;return{type:"group",...s,prefix:e,children:t.map((t=>r(t,e)))}}return{type:"page",...s,children:s.link===t.path?N(t,1===t.headers[0]?.level?t.headers[0].children:t.headers,n):[]}};return e.map((e=>r(e)))},D=Symbol(""),F=()=>{const e=(0,l.R7)(),t=(0,d.a)(),n=(0,l.BV)(),r=(0,l.Zv)(),i=(0,s.EW)((()=>!e.value.home&&(e.value.sidebar??t.value.sidebar??"structure"))),c=(0,s.EW)((()=>e.value.headerDepth??t.value.headerDepth??2)),u=(0,o.bW)((()=>[i.value,c.value,n.value.path,null]),(()=>(({config:e,routeLocale:t,page:n,headerDepth:l})=>"heading"===e?N(n,n.headers,l):"structure"===e?j({config:m.v[t],page:n,headerDepth:l,prefix:t}):(0,a.cy)(e)?j({config:e,page:n,headerDepth:l}):(0,a.Qd)(e)?(({config:e,page:t,headerDepth:n})=>{const l=(0,a.HP)(e).sort(((e,t)=>t.length-e.length));for(const r of l)if((0,a.w1)(decodeURI(t.path),r)){const a=e[r];return a?j({config:"structure"===a?m.v[r]:"heading"===a?N(t,t.headers,n):a,page:t,headerDepth:n,prefix:r}):[]}return console.warn(`${t.path} is missing sidebar config.`),[]})({config:e,page:n,headerDepth:l}):[])({config:i.value,routeLocale:r.value,page:n.value,headerDepth:c.value})));(0,s.Gt)(D,u)},H=()=>{const e=(0,s.WQ)(D);if(!e)throw new Error("useSidebarItems() is called without provider.");return e};var U=(0,s.pM)({name:"PageFooter",setup(){const e=(0,d.b)(),t=(0,d.a)(),n=(0,l.R7)(),r=w(),o=(0,s.EW)((()=>{const{copyright:e,footer:a}=n.value;return!1!==a&&!!(e||a||t.value.displayFooter)})),i=(0,s.EW)((()=>{const{footer:e}=n.value;return!1!==e&&((0,a.Kg)(e)?e:t.value.footer||"")})),c=(0,s.EW)((()=>r.value.map((({name:e})=>e)).join(", "))),u=e=>`Copyright © ${(new Date).getFullYear()} ${c.value} ${e?`${e} Licensed`:""}`,p=(0,s.EW)((()=>{const{copyright:l,license:r=""}=n.value,{license:o}=e.value,{copyright:s}=t.value;return l??(r?u(r):(0,a.Kg)(s)?s:!(!c.value&&!o)&&u(o))}));return()=>o.value?(0,s.h)("footer",{class:"vp-footer-wrapper"},[i.value?(0,s.h)("div",{class:"vp-footer",innerHTML:i.value}):null,p.value?(0,s.h)("div",{class:"vp-copyright",innerHTML:p.value}):null]):null}}),K=(0,s.pM)({name:"NavbarDropdownLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=(0,l.BV)(),a=(0,i.lW)(e,"config"),r=(0,s.EW)((()=>a.value.ariaLabel||a.value.text)),o=(0,i.KR)(!1);(0,s.wB)((()=>n.value.path),(()=>{o.value=!1}));const c=e=>{0===e.detail&&(o.value=!o.value)};return()=>(0,s.h)("div",{class:["dropdown-wrapper",{open:o.value}]},[(0,s.h)("button",{type:"button",class:"dropdown-title","aria-label":r.value,onClick:c},[t.title?.()||(0,s.h)("span",{class:"title"},[(0,s.h)(y,{icon:a.value.icon}),e.config.text]),(0,s.h)("span",{class:"arrow"}),(0,s.h)("ul",{class:"nav-dropdown"},a.value.children.map(((e,t)=>{const n=t===a.value.children.length-1;return(0,s.h)("li",{class:"dropdown-item"},"children"in e?[(0,s.h)("h4",{class:"dropdown-subtitle"},e.link?(0,s.h)(A,{config:e,onFocusout:()=>{0===e.children.length&&n&&(o.value=!1)}}):(0,s.h)("span",e.text)),(0,s.h)("ul",{class:"dropdown-subitem-wrapper"},e.children.map(((t,a)=>(0,s.h)("li",{class:"dropdown-subitem"},(0,s.h)(A,{config:t,onFocusout:()=>{a===e.children.length-1&&n&&(o.value=!1)}})))))]:(0,s.h)(A,{config:e,onFocusout:()=>{n&&(o.value=!1)}}))})))])])}});const q=()=>(0,s.h)(u.zP,{name:"i18n"},(()=>[(0,s.h)("path",{d:"M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"})]));q.displayName="I18nIcon";const G=(e,t="")=>(0,a.Kg)(e)?V(z(t,e)):"children"in e?{...e,...e.link&&!(0,a.km)(e.link)?V(z(t,e.link)):{},children:e.children.map((n=>G(n,z(t,e.prefix))))}:{...e,link:(0,a.km)(e.link)?e.link:V(z(t,e.link)).link},Y=()=>{const e=(0,d.a)();return(0,o.bW)((()=>e.value.navbar),(()=>(e.value.navbar||[]).map((e=>G(e)))))};(0,s.pM)({name:"LanguageDropdown",setup(){const e=(()=>{const e=(0,a.jq)(),t=(0,l.lq)(),n=(0,l.Zv)(),r=(0,l.rR)(),s=(0,d.b)(),i=(0,d.a)();return(0,o.bW)((()=>t.path),(()=>{const l=(0,a.HP)(r.value.locales),o=(0,a.jO)(s.value.extraLocales??{});if(l.length<2&&!o.length)return null;const{path:c,fullPath:u}=t,{navbarLocales:p}=i.value;return{text:"",ariaLabel:p?.selectLangAriaLabel,children:[...l.map((t=>{const a=r.value.locales?.[t]??{},l=s.value.locales?.[t]??{},o=a.lang||"",i=l.navbarLocales?.langName??o;let p;if(o===r.value.lang)p=c;else{const a=c.replace(n.value,t);p=e.value.some((e=>e===a))?u.replace(c,a):l.home??t}return{text:i,link:p}})),...o.map((([e,a])=>({text:e,link:a.replace(":route",t.path.replace(n.value,""))})))]}}))})();return()=>e.value?(0,s.h)("div",{class:"nav-item"},(0,s.h)(K,{class:"i18n-dropdown",config:e.value},{title:()=>(0,s.h)(q,{"aria-label":e.value?.ariaLabel,style:{width:"1rem",height:"1rem",verticalAlign:"middle"}})})):null}});var Z=(0,s.pM)({name:"NavScreenDropdown",props:{config:{type:Object,required:!0}},setup(e){const t=(0,l.BV)(),n=(0,i.lW)(e,"config"),a=(0,s.EW)((()=>n.value.ariaLabel||n.value.text)),r=(0,i.KR)(!1);(0,s.wB)((()=>t.value.path),(()=>{r.value=!1}));const o=(e,t)=>t[t.length-1]===e;return()=>[(0,s.h)("button",{type:"button",class:["nav-screen-dropdown-title",{active:r.value}],"aria-label":a.value,onClick:()=>{r.value=!r.value}},[(0,s.h)("span",{class:"title"},[(0,s.h)(y,{icon:n.value.icon}),e.config.text]),(0,s.h)("span",{class:["arrow",r.value?"down":"end"]})]),(0,s.h)("ul",{class:["nav-screen-dropdown",{hide:!r.value}]},n.value.children.map((e=>(0,s.h)("li",{class:"dropdown-item"},"children"in e?[(0,s.h)("h4",{class:"dropdown-subtitle"},e.link?(0,s.h)(A,{config:e,onFocusout:()=>{o(e,n.value.children)&&0===e.children.length&&(r.value=!1)}}):(0,s.h)("span",e.text)),(0,s.h)("ul",{class:"dropdown-subitem-wrapper"},e.children.map((t=>(0,s.h)("li",{class:"dropdown-subitem"},(0,s.h)(A,{config:t,onFocusout:()=>{o(t,e.children)&&o(e,n.value.children)&&(r.value=!1)}})))))]:(0,s.h)(A,{config:e,onFocusout:()=>{o(e,n.value.children)&&(r.value=!1)}})))))]}}),X=(0,s.pM)({name:"NavScreenLinks",setup(){const e=Y();return()=>e.value.length?(0,s.h)("nav",{class:"nav-screen-links"},e.value.map((e=>(0,s.h)("div",{class:"navbar-links-item"},"children"in e?(0,s.h)(Z,{config:e}):(0,s.h)(A,{config:e}))))):null}});const Q=()=>(0,s.h)(u.zP,{name:"dark"},(()=>(0,s.h)("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"})));Q.displayName="DarkIcon";const J=()=>(0,s.h)(u.zP,{name:"light"},(()=>(0,s.h)("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"})));J.displayName="LightIcon";const ee=()=>(0,s.h)(u.zP,{name:"auto"},(()=>(0,s.h)("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"})));ee.displayName="AutoIcon";const te=()=>(0,s.h)(u.zP,{name:"enter-fullscreen"},(()=>(0,s.h)("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"})));te.displayName="EnterFullScreenIcon";const ne=()=>(0,s.h)(u.zP,{name:"cancel-fullscreen"},(()=>(0,s.h)("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"})));ne.displayName="CancelFullScreenIcon";const ae=()=>(0,s.h)(u.zP,{name:"outlook"},(()=>[(0,s.h)("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"})]));ae.displayName="OutlookIcon";var le=(0,s.pM)({name:"AppearanceSwitch",setup(){const{config:e,isDarkmode:t,status:n}=_(),a=(0,d.u)(),l=()=>{"switch"===e.value?n.value={light:"dark",dark:"auto",auto:"light"}[n.value]:n.value="light"===n.value?"dark":"light"},r=async e=>{if(!document.startViewTransition||window.matchMedia("(prefers-reduced-motion: reduce)").matches||a.value||!e)return void l();const n=e.clientX,r=e.clientY,o=Math.hypot(Math.max(n,innerWidth-n),Math.max(r,innerHeight-r)),i=t.value;await document.startViewTransition((async()=>{l(),await(0,s.dY)()})).ready,t.value!==i&&document.documentElement.animate({clipPath:t.value?[`circle(${o}px at ${n}px ${r}px)`,`circle(0px at ${n}px ${r}px)`]:[`circle(0px at ${n}px ${r}px)`,`circle(${o}px at ${n}px ${r}px)`]},{duration:400,pseudoElement:t.value?"::view-transition-old(root)":"::view-transition-new(root)"})};return()=>(0,s.h)("button",{type:"button",id:"appearance-switch",onClick:r},[(0,s.h)(ee,{style:{display:"auto"===n.value?"block":"none"}}),(0,s.h)(Q,{style:{display:"dark"===n.value?"block":"none"}}),(0,s.h)(J,{style:{display:"light"===n.value?"block":"none"}})])}}),re=(0,s.pM)({name:"AppearanceMode",setup(){const e=(0,d.a)(),{canToggle:t}=_(),n=(0,s.EW)((()=>e.value.outlookLocales.darkmode));return()=>t.value?(0,s.h)("div",{class:"appearance-wrapper"},[(0,s.h)("label",{class:"appearance-title",for:"appearance-switch"},n.value),(0,s.h)(le)]):null}});const oe="VUEPRESS_THEME_COLOR";var se=(0,s.pM)({name:"ThemeColorPicker",props:{themeColor:{type:Object,required:!0}},setup(e){const t=(t="")=>{const n=document.documentElement.classList,l=(0,a.HP)(e.themeColor);if(!t)return localStorage.removeItem(oe),void n.remove(...l);n.remove(...l.filter((e=>e!==t))),n.add(t),localStorage.setItem(oe,t)};return(0,s.sV)((()=>{const e=localStorage.getItem(oe);e&&t(e)})),()=>(0,s.h)("ul",{id:"theme-color-picker"},[(0,s.h)("li",(0,s.h)("span",{class:"theme-color",onClick:()=>t()})),(0,a.jO)(e.themeColor).map((([e,n])=>(0,s.h)("li",(0,s.h)("span",{style:{background:n},onClick:()=>t(e)}))))])}});const ie="true"===f.A.enableThemeColor,ce=ie?(0,a.PW)((0,a.jO)(f.A).filter((([e])=>e.startsWith("theme-")))):{};var ue=(0,s.pM)({name:"ThemeColor",setup(){const e=(0,d.a)(),t=(0,s.EW)((()=>e.value.outlookLocales.themeColor));return()=>ie?(0,s.h)("div",{class:"theme-color-wrapper"},[(0,s.h)("label",{class:"theme-color-title",for:"theme-color-picker"},t.value),(0,s.h)(se,{themeColor:ce})]):null}}),pe=(0,s.pM)({name:"ToggleFullScreenButton",setup(){const e=(0,d.a)(),{isSupported:t,isFullscreen:n,toggle:a}=(0,r.HrR)(),l=(0,s.EW)((()=>e.value.outlookLocales.fullscreen));return()=>t?(0,s.h)("div",{class:"full-screen-wrapper"},[(0,s.h)("label",{class:"full-screen-title",for:"full-screen-switch"},l.value),(0,s.h)("button",{type:"button",id:"full-screen-switch",class:"full-screen",ariaPressed:n.value,onClick:()=>a()},n.value?(0,s.h)(ne):(0,s.h)(te))]):null}}),de=(0,s.pM)({name:"OutlookSettings",setup(){const e=(0,d.b)(),t=(0,d.u)(),n=(0,s.EW)((()=>!t.value&&e.value.fullscreen));return()=>(0,s.h)(l.YX,(()=>[ie?(0,s.h)(ue):null,(0,s.h)(re),n.value?(0,s.h)(pe):null]))}}),he=(0,s.pM)({name:"NavScreen",props:{show:Boolean},emits:["close"],slots:Object,setup(e,{emit:t,slots:n}){const a=(0,l.BV)(),{isMobile:o}=M(),u=(0,i.IJ)(),p=(0,r.K$F)(u);return(0,s.sV)((()=>{u.value=document.body,(0,s.wB)(o,(n=>{!n&&e.show&&(p.value=!1,t("close"))})),(0,s.wB)((()=>a.value.path),(()=>{p.value=!1,t("close")}))})),(0,s.hi)((()=>{p.value=!1})),()=>(0,s.h)(c.eB,{name:"fade",onEnter:()=>{p.value=!0},onAfterLeave:()=>{p.value=!1}},(()=>e.show?(0,s.h)("div",{id:"nav-screen"},(0,s.h)("div",{class:"vp-nav-screen-container"},[n.before?.(),(0,s.h)(X),(0,s.h)("div",{class:"vp-outlook-wrapper"},(0,s.h)(de)),n.after?.()])):null))}}),ve=(0,s.pM)({name:"NavbarBrand",setup(){const e=(0,l.Zv)(),t=(0,l.rR)(),n=(0,d.a)(),a=(0,s.EW)((()=>n.value.home||e.value)),r=(0,s.EW)((()=>t.value.title)),o=(0,s.EW)((()=>n.value.navTitle??r.value)),i=(0,s.EW)((()=>n.value.logo?(0,l.cV)(n.value.logo):null)),c=(0,s.EW)((()=>n.value.logoDark?(0,l.cV)(n.value.logoDark):null));return()=>(0,s.h)(l.Wt,{to:a.value,class:"vp-brand"},(()=>[i.value?(0,s.h)("img",{class:["vp-nav-logo",{light:!!c.value}],src:i.value,alt:""}):null,c.value?(0,s.h)("img",{class:["vp-nav-logo dark"],src:c.value,alt:""}):null,o.value?(0,s.h)("span",{class:["vp-site-name",{"hide-in-pad":i.value&&!1!==n.value.hideSiteNameOnMobile}]},o.value):null]))}}),fe=(0,s.pM)({name:"NavbarLinks",setup(){const e=Y();return()=>e.value.length?(0,s.h)("nav",{class:"vp-nav-links"},e.value.map((e=>(0,s.h)("div",{class:"nav-item hide-in-mobile"},"children"in e?(0,s.h)(K,{config:e}):(0,s.h)(A,{config:e}))))):null}}),me=(0,s.pM)({name:"RepoLink",components:{BitbucketIcon:u.Bz,GiteeIcon:u.s5,GitHubIcon:u.Hk,GitLabIcon:u.J7,SourceIcon:u.pY},setup(){const e=(()=>{const e=(0,d.a)(),t=(0,s.EW)((()=>e.value.repo||null)),n=(0,s.EW)((()=>t.value?(0,u.XA)(t.value):null)),a=(0,s.EW)((()=>t.value?(0,u.DA)(t.value):null)),l=(0,s.EW)((()=>n.value?e.value.repoLabel??(null===a.value?"Source":a.value):null));return(0,s.EW)((()=>n.value&&l.value&&!1!==e.value.repoDisplay?{type:a.value||"Source",label:l.value,link:n.value}:null))})();return()=>e.value?(0,s.h)("div",{class:"nav-item vp-repo"},(0,s.h)("a",{class:"vp-repo-link",href:e.value.link,target:"_blank",rel:"noopener noreferrer","aria-label":e.value.label},(0,s.h)((0,s.g2)(`${e.value.type}Icon`),{style:{width:"1.25rem",height:"1.25rem",verticalAlign:"middle"}}))):null}});const ge=({active:e=!1},{emit:t})=>(0,s.h)("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")},(0,s.h)("span",[(0,s.h)("span",{class:"vp-top"}),(0,s.h)("span",{class:"vp-middle"}),(0,s.h)("span",{class:"vp-bottom"})]));ge.displayName="ToggleNavbarButton";var ye=ge;const be=(e,{emit:t})=>(0,s.h)("button",{type:"button",class:"vp-toggle-sidebar-button",title:"Toggle Sidebar",onClick:()=>t("toggle")},(0,s.h)("span",{class:"icon"}));be.displayName="ToggleSidebarButton",be.emits=["toggle"];var we=be,ke=(0,s.pM)({name:"OutlookButton",setup(){const{isSupported:e}=(0,r.HrR)(),t=(0,d.b)(),n=(0,d.u)(),a=(0,l.BV)(),{canToggle:o}=_(),c=(0,i.KR)(!1),u=(0,s.EW)((()=>!n.value&&t.value.fullscreen&&e));return(0,s.wB)((()=>a.value.path),(()=>{c.value=!1})),()=>o.value||u.value||ie?(0,s.h)("div",{class:"nav-item hide-in-mobile"},!o.value||u.value||ie?!u.value||o.value||ie?(0,s.h)("button",{type:"button",class:["outlook-button",{open:c.value}],tabindex:"-1","aria-hidden":!0},[(0,s.h)(ae),(0,s.h)("div",{class:"outlook-dropdown"},(0,s.h)(de))]):(0,s.h)(pe):(0,s.h)(le)):null}}),Ee=(0,s.pM)({name:"NavBar",emits:["toggleSidebar"],slots:Object,setup(e,{emit:t,slots:n}){const l=(0,d.a)(),{isMobile:r}=M(),o=(0,i.KR)(!1),c=(0,s.EW)((()=>{const{navbarAutoHide:e="mobile"}=l.value;return"none"!==e&&("always"===e||r.value)})),u=(0,s.EW)((()=>l.value.navbarLayout||{start:["Brand"],center:["Links"],end:["Language","Repo","Outlook","Search"]})),p={Brand:ve,Language:h,Links:fe,Repo:me,Outlook:ke,Search:(0,a.L4)("Docsearch")?(0,s.g2)("Docsearch"):(0,a.L4)("SearchBox")?(0,s.g2)("SearchBox"):h},v=e=>p[e]??((0,a.L4)(e)?(0,s.g2)(e):h);return()=>[(0,s.h)("header",{id:"navbar",class:["vp-navbar",{"auto-hide":c.value,"hide-icon":!1===l.value.navbarIcon}]},[(0,s.h)("div",{class:"vp-navbar-start"},[(0,s.h)(we,{onToggle:()=>{o.value&&(o.value=!1),t("toggleSidebar")}}),n.startBefore?.(),(u.value.start||[]).map((e=>(0,s.h)(v(e)))),n.startAfter?.()]),(0,s.h)("div",{class:"vp-navbar-center"},[n.centerBefore?.(),(u.value.center||[]).map((e=>(0,s.h)(v(e)))),n.centerAfter?.()]),(0,s.h)("div",{class:"vp-navbar-end"},[n.endBefore?.(),(u.value.end||[]).map((e=>(0,s.h)(v(e)))),n.endAfter?.(),(0,s.h)(ye,{active:o.value,onToggle:()=>{o.value=!o.value}})])]),(0,s.h)(he,{show:o.value,onClose:()=>{o.value=!1}},{before:()=>n.screenTop?.(),after:()=>n.screenBottom?.()})]}}),xe=(0,s.pM)({name:"SidebarChild",props:{config:{type:Object,required:!0}},setup(e){const t=(0,l.lq)();return()=>[W(e.config,{class:["vp-sidebar-link",`vp-sidebar-${e.config.type}`,{active:$(t,e.config,!0)}],exact:!0}),R(e.config.children)]}}),Se=(0,s.pM)({name:"SidebarGroup",props:{config:{type:Object,required:!0},open:{type:Boolean,required:!0}},emits:["toggle"],setup(e,{emit:t}){const n=(0,l.lq)(),a=(0,s.EW)((()=>$(n,e.config))),r=(0,s.EW)((()=>$(n,e.config,!0)));return()=>{const{collapsible:n,children:l=[],icon:o,prefix:i,link:c,text:u}=e.config;return(0,s.h)("section",{class:"vp-sidebar-group"},[(0,s.h)(n?"button":"p",{class:["vp-sidebar-heading",{clickable:n||c,exact:r.value,active:a.value}],...n?{type:"button",onClick:()=>t("toggle"),onKeydown:e=>{"Enter"===e.key&&t("toggle")}}:{}},[(0,s.h)(y,{icon:o}),c?(0,s.h)(A,{class:"vp-sidebar-title",config:{text:u,link:c},noExternalLinkIcon:!0}):(0,s.h)("span",{class:"vp-sidebar-title"},u),n?(0,s.h)("span",{class:["vp-arrow",e.open?"down":"end"]}):null]),e.open||!n?(0,s.h)(Me,{key:i,config:l}):null])}}}),Me=(0,s.pM)({name:"SidebarLinks",props:{config:{type:Array,required:!0}},setup(e){const t=(0,l.lq)(),n=(0,i.KR)(-1);return(0,s.wB)((()=>t.path),(()=>{const a=e.config.findIndex((e=>B(t,e)));n.value=a}),{immediate:!0,flush:"post"}),()=>(0,s.h)("ul",{class:"vp-sidebar-links"},e.config.map(((e,t)=>(0,s.h)("li","group"===e.type?(0,s.h)(Se,{config:e,open:t===n.value,onToggle:()=>(e=>{n.value=e===n.value?-1:e})(t)}):(0,s.h)(xe,{config:e})))))}}),Ce=(0,s.pM)({name:"SideBar",slots:Object,setup(e,{slots:t}){const n=(0,l.lq)(),a=(0,d.a)(),r=H(),o=(0,i.IJ)();return(0,s.sV)((()=>{(0,s.wB)((()=>n.hash),(e=>{const t=document.querySelector(`.vp-sidebar a.vp-sidebar-link[href="${n.path}${e}"]`);if(!t)return;const{top:a,height:l}=o.value.getBoundingClientRect(),{top:r,height:s}=t.getBoundingClientRect();ra+l&&t.scrollIntoView(!1)}),{immediate:!0})})),()=>(0,s.h)("aside",{ref:o,id:"sidebar",class:["vp-sidebar",{"hide-icon":!1===a.value.sidebarIcon}]},[t.top?.(),t.default?.()||(0,s.h)(Me,{config:r.value}),t.bottom?.()])}}),_e=(0,s.pM)({name:"CommonWrapper",props:{containerClass:{type:String,default:""},noNavbar:Boolean,noSidebar:Boolean,noToc:Boolean},slots:Object,setup(e,{slots:t}){const n=(0,l.rd)(),p=(0,l.BV)(),h=(0,l.R7)(),v=(0,d.a)(),{isMobile:f,isPC:m}=M(),[g,y]=(0,o.eY)(!1),[b,w]=(0,o.eY)(!1),k=H(),E=(0,i.KR)(!1),x=(0,s.EW)((()=>!e.noNavbar&&!1!==h.value.navbar&&!1!==v.value.navbar&&!!(p.value.title||v.value.logo||v.value.repo||v.value.navbar))),S=(0,s.EW)((()=>!e.noSidebar&&!1!==h.value.sidebar&&0!==k.value.length&&!h.value.home)),C=(0,s.EW)((()=>!e.noToc&&!h.value.home&&(h.value.toc||!1!==v.value.toc&&!1!==h.value.toc))),_={x:0,y:0},T=e=>{_.x=e.changedTouches[0].clientX,_.y=e.changedTouches[0].clientY},L=e=>{const t=e.changedTouches[0].clientX-_.x,n=e.changedTouches[0].clientY-_.y;Math.abs(t)>1.5*Math.abs(n)&&Math.abs(t)>40&&(t>0&&_.x<=80?y(!0):y(!1))};let A=0;return(0,r.MLh)("scroll",(0,o.k3)((()=>{const e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;e<=58||e{e||y(!1)})),(0,s.sV)((()=>{const e=(0,r.K$F)(document.body);(0,s.wB)(g,(t=>{e.value=t}));const t=n.afterEach((()=>{y(!1)}));(0,s.hi)((()=>{e.value=!1,t()}))})),()=>(0,s.h)((0,a.L4)("GlobalEncrypt")?(0,s.g2)("GlobalEncrypt"):u.ad,(()=>(0,s.h)("div",{class:["theme-container",{"no-navbar":!x.value,"no-sidebar":!S.value&&!(t.sidebar||t.sidebarTop||t.sidebarBottom),"has-toc":C.value,"hide-navbar":E.value,"sidebar-collapsed":!f.value&&!m.value&&b.value,"sidebar-open":f.value&&g.value},e.containerClass,h.value.containerClass||""],onTouchStart:T,onTouchEnd:L},[x.value?(0,s.h)(Ee,{onToggleSidebar:()=>y()},{startBefore:()=>t.navbarStartBefore?.(),startAfter:()=>t.navbarStartAfter?.(),centerBefore:()=>t.navbarCenterBefore?.(),centerAfter:()=>t.navbarCenterAfter?.(),endBefore:()=>t.navbarEndBefore?.(),endAfter:()=>t.navbarEndAfter?.(),screenTop:()=>t.navScreenTop?.(),screenBottom:()=>t.navScreenBottom?.()}):null,(0,s.h)(c.eB,{name:"fade"},(()=>g.value?(0,s.h)("div",{class:"vp-sidebar-mask",onClick:()=>y(!1)}):null)),(0,s.h)(c.eB,{name:"fade"},(()=>f.value?null:(0,s.h)("div",{class:"toggle-sidebar-wrapper",onClick:()=>w()},(0,s.h)("span",{class:["arrow",b.value?"end":"start"]})))),(0,s.h)(Ce,{},{...t.sidebar?{default:()=>t.sidebar()}:{},top:()=>t.sidebarTop?.(),bottom:()=>t.sidebarBottom?.()}),t.default(),(0,s.h)(U)])))}}),Te=(0,s.pM)({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=t=>{t.style.transition=`transform ${e.duration}s ease-in-out ${e.delay}s, opacity ${e.duration}s ease-in-out ${e.delay}s`,t.style.transform="translateY(-20px)",t.style.opacity="0"},a=e=>{e.style.transform="translateY(0)",e.style.opacity="1"};return()=>(0,s.h)("single"===e.type?c.eB:c.F,{name:"drop",appear:e.appear,onAppear:n,onAfterAppear:a,onEnter:n,onAfterEnter:a,onBeforeLeave:n},(()=>t.default()))}});const Le=({custom:e})=>(0,s.h)(l.UC,{class:["theme-hope-content",{custom:e}]});Le.displayName="MarkdownContent",Le.props={custom:Boolean};var Ae=Le;const $e=()=>(0,s.h)(u.zP,{name:"author"},(()=>(0,s.h)("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"})));$e.displayName="AuthorIcon";const Be=()=>(0,s.h)(u.zP,{name:"calendar"},(()=>(0,s.h)("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"})));Be.displayName="CalendarIcon";const We=()=>(0,s.h)(u.zP,{name:"category"},(()=>(0,s.h)("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"})));We.displayName="CategoryIcon";const Re=()=>(0,s.h)(u.zP,{name:"eye"},(()=>(0,s.h)("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"})));Re.displayName="EyeIcon";const Ie=()=>(0,s.h)(u.zP,{name:"fire"},(()=>(0,s.h)("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"})));Ie.displayName="FireIcon";const Pe=()=>(0,s.h)(u.zP,{name:"print"},(()=>(0,s.h)("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"})));Pe.displayName="PrintIcon";const Oe=()=>(0,s.h)(u.zP,{name:"tag"},(()=>(0,s.h)("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"})));Oe.displayName="TagIcon";const ze=()=>(0,s.h)(u.zP,{name:"timer"},(()=>(0,s.h)("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"})));ze.displayName="TimerIcon";const Ve=()=>(0,s.h)(u.zP,{name:"word"},(()=>[(0,s.h)("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"}),(0,s.h)("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"})]));Ve.displayName="WordIcon";const Ne=()=>{const e=(0,d.a)();return(0,s.EW)((()=>e.value.metaLocales))};var je=(0,s.pM)({name:"AuthorInfo",inheritAttrs:!1,props:{author:{type:Array,required:!0},pure:Boolean},setup(e){const t=Ne();return()=>e.author.length?(0,s.h)("span",{class:"page-author-info","aria-label":`${t.value.author}${e.pure?"":"🖊"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)($e),(0,s.h)("span",e.author.map((e=>e.url?(0,s.h)("a",{class:"page-author-item",href:e.url,target:"_blank",rel:"noopener noreferrer"},e.name):(0,s.h)("span",{class:"page-author-item"},e.name)))),(0,s.h)("span",{property:"author",content:e.author.map((e=>e.name)).join(", ")})]):null}}),De=(0,s.pM)({name:"CategoryInfo",inheritAttrs:!1,props:{category:{type:Array,required:!0},pure:Boolean},setup(e){const t=(0,l.rd)(),n=(0,l.BV)(),a=Ne();return()=>e.category.length?(0,s.h)("span",{class:"page-category-info","aria-label":`${a.value.category}${e.pure?"":"🌈"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(We),e.category.map((({name:a,path:l})=>(0,s.h)("span",{class:["page-category-item",{[`category${(0,u.e1)(a,9)}`]:!e.pure,clickable:l}],role:l?"navigation":"",onClick:e=>((e,a="")=>{a&&n.value.path!==a&&(e.preventDefault(),t.push(a))})(e,l)},a))),(0,s.h)("meta",{property:"articleSection",content:e.category.map((({name:e})=>e)).join(",")})]):null}}),Fe=(0,s.pM)({name:"DateInfo",inheritAttrs:!1,props:{date:{type:Object,default:null},localizedDate:{type:String,default:""},pure:Boolean},setup(e){const t=(0,l.Nj)(),n=Ne();return()=>e.date?(0,s.h)("span",{class:"page-date-info","aria-label":`${n.value.date}${e.pure?"":"📅"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(Be),(0,s.h)("span",(0,s.h)(l.YX,(()=>e.localizedDate||e.date.toLocaleDateString(t.value)))),(0,s.h)("meta",{property:"datePublished",content:e.date.toISOString()||""})]):null}}),He=(0,s.pM)({name:"OriginalInfo",inheritAttrs:!1,props:{isOriginal:Boolean},setup(e){const t=Ne();return()=>e.isOriginal?(0,s.h)("span",{class:"page-original-info"},t.value.origin):null}}),Ue=(0,s.pM)({name:"PageViewInfo",inheritAttrs:!1,props:{pageview:{type:[Boolean,String],default:!1},pure:Boolean},setup(e){const t=(0,l.lq)(),n=Ne(),o=(0,i.IJ)(),c=(0,i.KR)(0);return(0,r.P1n)(o,(()=>{const e=o.value.textContent;e&&!isNaN(Number(e))&&(c.value=Number(e))}),{childList:!0}),()=>e.pageview?(0,s.h)("span",{class:"page-pageview-info","aria-label":`${n.value.views}${e.pure?"":"🔢"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(c.value<1e3?Re:Ie),(0,s.h)("span",{ref:o,id:"ArtalkPV",class:"waline-pageview-count","data-path":(0,a.Kg)(e.pageview)?e.pageview:t.path},"...")]):null}}),Ke=(0,s.pM)({name:"ReadingTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=Ne(),n=(0,s.EW)((()=>{if(!e.readingTime)return null;const{minutes:t}=e.readingTime;return t<1?"PT1M":`PT${Math.round(t)}M`}));return()=>e.readingTimeLocale?.time?(0,s.h)("span",{class:"page-reading-time-info","aria-label":`${t.value.readingTime}${e.pure?"":"⌛"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(ze),(0,s.h)("span",e.readingTimeLocale?.time),(0,s.h)("meta",{property:"timeRequired",content:n.value})]):null}}),qe=(0,s.pM)({name:"TagInfo",inheritAttrs:!1,props:{tag:{type:Array,default:()=>[]},pure:Boolean},setup(e){const t=(0,l.rd)(),n=(0,l.BV)(),a=Ne();return()=>e.tag.length?(0,s.h)("span",{class:"page-tag-info","aria-label":`${a.value.tag}${e.pure?"":"🏷"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(Oe),e.tag.map((({name:a,path:l})=>(0,s.h)("span",{class:["page-tag-item",{[`tag${(0,u.e1)(a,9)}`]:!e.pure,clickable:l}],role:l?"navigation":"",onClick:e=>((e,a="")=>{a&&n.value.path!==a&&(e.preventDefault(),t.push(a))})(e,l)},a))),(0,s.h)("meta",{property:"keywords",content:e.tag.map((({name:e})=>e)).join(",")})]):null}}),Ge=(0,s.pM)({name:"ReadTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=Ne();return()=>e.readingTimeLocale?.words?(0,s.h)("span",{class:"page-word-info","aria-label":`${t.value.words}${e.pure?"":"🔠"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[(0,s.h)(Ve),(0,s.h)("span",e.readingTimeLocale?.words),(0,s.h)("meta",{property:"wordCount",content:e.readingTime?.words})]):null}}),Ye=(0,s.pM)({name:"PageInfo",components:{AuthorInfo:je,CategoryInfo:De,DateInfo:Fe,OriginalInfo:He,PageViewInfo:Ue,ReadingTimeInfo:Ke,TagInfo:qe,WordInfo:Ge},props:{items:{type:[Array,Boolean],default:()=>["Author","Original","Date","PageView","ReadingTime","Category","Tag"]},info:{type:Object,required:!0}},setup(e){const t=(0,d.u)();return()=>e.items?(0,s.h)("div",{class:"page-info"},e.items.map((n=>(0,s.h)((0,s.g2)(`${n}Info`),{...e.info,pure:t.value})))):null}}),Ze=(0,s.pM)({name:"PrintButton",setup(){const e=(0,d.b)(),t=(0,d.a)();return()=>!1===e.value.print?null:(0,s.h)("button",{type:"button",class:"print-button",title:t.value.metaLocales.print,onClick:()=>{window.print()}},(0,s.h)(Pe))}});const Xe=({title:e,level:t,slug:n})=>(0,s.h)(l.Wt,{to:`#${n}`,class:["toc-link",`level${t}`]},(()=>e)),Qe=(e,t)=>{const n=(0,l.lq)();return e.length&&t>0?(0,s.h)("ul",{class:"toc-list"},e.map((e=>{const a=Qe(e.children,t-1);return[(0,s.h)("li",{class:["toc-item",{active:n.hash===`#${e.slug}`}]},Xe(e)),a?(0,s.h)("li",a):null]}))):null};var Je=(0,s.pM)({name:"TOC",props:{items:{type:Array,default:()=>[]},headerDepth:{type:Number,default:2}},slots:Object,setup(e,{slots:t}){const n=(0,l.lq)(),a=(0,l.BV)(),r=Ne(),o=(0,i.IJ)(),c=(0,i.KR)("-1.7rem"),u=e=>{o.value?.scrollTo({top:e,behavior:"smooth"})},p=()=>{if(o.value){const e=document.querySelector(".toc-item.active");c.value=e?`${e.getBoundingClientRect().top-o.value.getBoundingClientRect().top+o.value.scrollTop}px`:"-1.7rem"}else c.value="-1.7rem"};return(0,s.sV)((()=>{(0,s.wB)((()=>n.hash),(e=>{if(o.value){const t=document.querySelector(`#toc a.toc-link[href$="${e}"]`);if(!t)return;const{top:n,height:a}=o.value.getBoundingClientRect(),{top:l,height:r}=t.getBoundingClientRect();ln+a&&u(o.value.scrollTop+l+r-n-a)}})),(0,s.wB)((()=>n.fullPath),p,{flush:"post",immediate:!0})})),()=>{const n=e.items.length?Qe(e.items,e.headerDepth):a.value.headers?Qe(a.value.headers,e.headerDepth):null;return n?(0,s.h)("div",{class:"toc-place-holder"},[(0,s.h)("aside",{id:"toc"},[t.before?.(),(0,s.h)("div",{class:"toc-header"},[r.value.toc,(0,s.h)(Ze)]),(0,s.h)("div",{class:"toc-wrapper",ref:o},[n,(0,s.h)("div",{class:"toc-marker",style:{top:c.value}})]),t.after?.()])]):null}}}),et=(0,s.pM)({name:"SkipLink",props:{content:{type:String,default:"main-content"}},setup(e){const t=(0,l.BV)(),n=(0,d.a)(),a=(0,i.IJ)(),r=({target:e})=>{const t=document.querySelector(e.hash);if(t){const e=()=>{t.removeAttribute("tabindex"),t.removeEventListener("blur",e)};t.setAttribute("tabindex","-1"),t.addEventListener("blur",e),t.focus(),window.scrollTo(0,0)}};return(0,s.sV)((()=>{(0,s.wB)((()=>t.value.path),(()=>a.value.focus()))})),()=>[(0,s.h)("span",{ref:a,tabindex:"-1"}),(0,s.h)("a",{href:`#${e.content}`,class:"vp-skip-link sr-only",onClick:r},n.value.routeLocales.skipToContent)]}})},6908:(e,t,n)=>{n.d(t,{GB:()=>a.f,PE:()=>B,Mk:()=>R,fk:()=>a.i,PV:()=>a.s,i$:()=>a.j,MK:()=>f});var a=n(3039),l=n(7847),r=n(6719),o=n(3151),s=n(8981),i=n(6635),c=n(2082),u=n(5670),p=n(6476);let d=null,h=null;const v={wait:()=>d,pending:()=>{d=new Promise((e=>{h=e}))},resolve:()=>{h?.(),d=null,h=null}},f=()=>v;var m=(0,l.pM)({name:"FadeSlideY",slots:Object,setup(e,{slots:t}){const{resolve:n,pending:a}=f();return()=>(0,l.h)(p.eB,{name:"fade-slide-y",mode:"out-in",onBeforeEnter:n,onBeforeLeave:a},(()=>t.default?.()))}});n(4601),n(3578),n(7267),n(1878),n(2302);const g=(e,{slots:t})=>{const{bgImage:n,bgImageDark:r,bgImageStyle:i,color:c,description:u,image:p,imageDark:d,header:h,features:v=[]}=e;return(0,l.h)("div",{class:"vp-feature-wrapper"},[n?(0,l.h)("div",{class:["vp-feature-bg",{light:r}],style:[{"background-image":`url(${n})`},i]}):null,r?(0,l.h)("div",{class:"vp-feature-bg dark",style:[{"background-image":`url(${r})`},i]}):null,(0,l.h)("div",{class:"vp-feature",style:c?{color:c}:{}},[t.image?.(e)||[p?(0,l.h)("img",{class:["vp-feature-image",{light:d}],src:(0,o.cV)(p),alt:""}):null,d?(0,l.h)("img",{class:"vp-feature-image dark",src:(0,o.cV)(d),alt:""}):null],t.info?.(e)||[h?(0,l.h)("h2",{class:"vp-feature-header"},h):null,u?(0,l.h)("p",{class:"vp-feature-description",innerHTML:u}):null],v.length?(0,l.h)("div",{class:"vp-features"},v.map((({icon:e,title:t,details:n,link:r})=>{const i=[(0,l.h)("h3",{class:"vp-feature-title"},[(0,l.h)(a.f,{icon:e}),(0,l.h)("span",{innerHTML:t})]),(0,l.h)("p",{class:"vp-feature-details",innerHTML:n})];return r?(0,s.km)(r)?(0,l.h)("a",{class:"vp-feature-item link",href:r,"aria-label":t,target:"_blank"},i):(0,l.h)(o.Wt,{class:"vp-feature-item link",to:r,"aria-label":t},(()=>i)):(0,l.h)("div",{class:"vp-feature-item"},i)}))):null])])};g.displayName="FeaturePanel";var y=g,b=(0,l.pM)({name:"HeroInfo",slots:Object,setup(e,{slots:t}){const n=(0,o.R7)(),r=(0,o.rR)(),i=(0,l.EW)((()=>n.value.heroFullScreen??!1)),c=(0,l.EW)((()=>{const{heroText:e,tagline:t}=n.value;return{text:e??r.value.title??"Hello",tagline:t??r.value.description??"",isFullScreen:i.value}})),u=(0,l.EW)((()=>{const{heroText:e,heroImage:t,heroImageDark:a,heroAlt:l,heroImageStyle:r}=n.value;return{image:t?(0,o.cV)(t):null,imageDark:a?(0,o.cV)(a):null,heroStyle:r,alt:l||e||"",isFullScreen:i.value}})),p=(0,l.EW)((()=>{const{bgImage:e,bgImageDark:t,bgImageStyle:a}=n.value;return{image:(0,s.Kg)(e)?(0,o.cV)(e):null,imageDark:(0,s.Kg)(t)?(0,o.cV)(t):null,bgStyle:a,isFullScreen:i.value}})),d=(0,l.EW)((()=>n.value.actions??[]));return()=>(0,l.h)("header",{class:["vp-hero-info-wrapper",{fullscreen:i.value}]},[t.heroBg?.(p.value)||[p.value.image?(0,l.h)("div",{class:["vp-hero-mask",{light:p.value.imageDark}],style:[{"background-image":`url(${p.value.image})`},p.value.bgStyle]}):null,p.value.imageDark?(0,l.h)("div",{class:"vp-hero-mask dark",style:[{"background-image":`url(${p.value.imageDark})`},p.value.bgStyle]}):null],(0,l.h)("div",{class:"vp-hero-info"},[t.heroImage?.(u.value)||(0,l.h)(a.e,{appear:!0,type:"group"},(()=>[u.value.image?(0,l.h)("img",{key:"light",class:["vp-hero-image",{light:u.value.imageDark}],style:u.value.heroStyle,src:u.value.image,alt:u.value.alt}):null,u.value.imageDark?(0,l.h)("img",{key:"dark",class:"vp-hero-image dark",style:u.value.heroStyle,src:u.value.imageDark,alt:u.value.alt}):null])),t.heroInfo?.(c.value)??(0,l.h)("div",{class:"vp-hero-infos"},[c.value.text?(0,l.h)(a.e,{appear:!0,delay:.04},(()=>(0,l.h)("h1",{id:"main-title"},c.value.text))):null,c.value.tagline?(0,l.h)(a.e,{appear:!0,delay:.08},(()=>(0,l.h)("p",{id:"main-description",innerHTML:c.value.tagline}))):null,d.value.length?(0,l.h)(a.e,{appear:!0,delay:.12},(()=>(0,l.h)("p",{class:"vp-hero-actions"},d.value.map((e=>(0,l.h)(a.c,{class:["vp-hero-action",e.type||"default"],config:e,noExternalLinkIcon:!0},e.icon?{before:()=>(0,l.h)(a.f,{icon:e.icon})}:{})))))):null])])])}});const w=(e,{slots:t})=>{const{bgImage:n,bgImageDark:r,bgImageStyle:i,color:c,description:u,image:p,imageDark:d,header:h,highlights:v=[],type:f="un-order"}=e;return(0,l.h)("div",{class:"vp-highlight-wrapper",style:c?{color:c}:{}},[n?(0,l.h)("div",{class:["vp-highlight-bg",{light:r}],style:[{"background-image":`url(${n})`},i]}):null,r?(0,l.h)("div",{class:"vp-highlight-bg dark",style:[{"background-image":`url(${r})`},i]}):null,(0,l.h)("div",{class:"vp-highlight"},[t.image?.(e)||[p?(0,l.h)("img",{class:["vp-highlight-image",{light:d}],src:(0,o.cV)(p),alt:""}):null,d?(0,l.h)("img",{class:"vp-highlight-image dark",src:(0,o.cV)(d),alt:""}):null],t.info?.(e)||[(0,l.h)("div",{class:"vp-highlight-info-wrapper"},(0,l.h)("div",{class:"vp-highlight-info"},[h?(0,l.h)("h2",{class:"vp-highlight-header",innerHTML:h}):null,u?(0,l.h)("p",{class:"vp-highlight-description",innerHTML:u}):null,t.highlights?.(v)||(0,l.h)("order"===f?"ol":"no-order"===f?"dl":"ul",{class:"vp-highlights"},v.map((({icon:e,title:t,details:n,link:r})=>{const i=[(0,l.h)("no-order"===f?"dt":"h3",{class:"vp-highlight-title"},[e?(0,l.h)(a.f,{class:"vp-highlight-icon",icon:e}):null,(0,l.h)("span",{innerHTML:t})]),n?(0,l.h)("no-order"===f?"dd":"p",{class:"vp-highlight-details",innerHTML:n}):null];return(0,l.h)("no-order"===f?"div":"li",{class:["vp-highlight-item-wrapper",{link:r}]},r?(0,s.km)(r)?(0,l.h)("a",{class:"vp-highlight-item link",href:r,"aria-label":t,target:"_blank"},i):(0,l.h)(o.Wt,{class:"vp-highlight-item link",to:r,"aria-label":t},(()=>i)):(0,l.h)("div",{class:"vp-highlight-item"},i))})))]))]])])};w.displayName="HighlightPanel";var k=w,E=(0,l.pM)({name:"HomePage",slots:Object,setup(e,{slots:t}){const n=(0,i.u)(),r=(0,o.R7)(),c=(0,l.EW)((()=>{const{features:e}=r.value;return(0,s.cy)(e)?e:null})),u=(0,l.EW)((()=>{const{highlights:e}=r.value;return(0,s.cy)(e)?e:null}));return()=>(0,l.h)("main",{id:"main-content",class:["vp-project-home ",{pure:n.value}],"aria-labelledby":null===r.value.heroText?"":"main-title"},[t.top?.(),(0,l.h)(b),u.value?.map((e=>"features"in e?(0,l.h)(y,e):(0,l.h)(k,e)))||(c.value?(0,l.h)(a.e,{appear:!0,delay:.24},(()=>(0,l.h)(y,{features:c.value}))):null),t.center?.(),(0,l.h)(a.e,{appear:!0,delay:.32},(()=>(0,l.h)(a.l))),t.bottom?.()])}}),x=(0,l.pM)({name:"BreadCrumb",setup(){const e=(0,o.BV)(),t=(0,o.Zv)(),n=(0,o.R7)(),c=(0,i.a)(),u=(0,r.IJ)([]),p=(0,l.EW)((()=>(n.value.breadcrumb||!1!==n.value.breadcrumb&&!1!==c.value.breadcrumb)&&u.value.length>1)),d=(0,l.EW)((()=>n.value.breadcrumbIcon||!1!==n.value.breadcrumbIcon&&!1!==c.value.breadcrumbIcon)),h=()=>{const n=((e,t)=>{const n=e.replace(t,"/").split("/"),a=[];let l=(0,s.TY)(t);return n.forEach(((e,t)=>{t!==n.length-1?(l+=`${e}/`,a.push({link:l,name:e||"Home"})):""!==e&&(l+=e,a.push({link:l,name:e}))})),a})(e.value.path,t.value).map((({link:e,name:t})=>{const{path:n,meta:l}=(0,o.ie)(e);return l?{title:l[a.A.shortTitle]||l[a.A.title]||t,icon:l[a.A.icon],path:n}:null})).filter((e=>null!==e));n.length>1&&(u.value=n)};return(0,l.sV)((()=>{(0,l.wB)((()=>e.value.path),h,{immediate:!0})})),()=>(0,l.h)("nav",{class:["vp-breadcrumb",{disable:!p.value}]},p.value?(0,l.h)("ol",{vocab:"https://schema.org/",typeof:"BreadcrumbList"},u.value.map(((e,t)=>(0,l.h)("li",{class:{"is-active":u.value.length-1===t},property:"itemListElement",typeof:"ListItem"},[(0,l.h)(o.Wt,{to:e.path,property:"item",typeof:"WebPage"},(()=>[d.value?(0,l.h)(a.f,{icon:e.icon}):null,(0,l.h)("span",{property:"name"},e.title||"Unknown")])),(0,l.h)("meta",{property:"position",content:t+1})])))):[])}});const S=e=>!1===e||(0,s.Qd)(e)?e:(0,s.Kg)(e)?(0,a.r)(e,!0):null,M=(e,t,n)=>{const a=e.findIndex((e=>e.link===t));if(-1!==a){const t=e[a+n];return t?.link?t:null}for(const a of e)if(a.children){const e=M(a.children,t,n);if(e)return e}return null};var C=(0,l.pM)({name:"PageNav",setup(){const e=(0,i.a)(),t=(0,o.R7)(),n=(0,a.u)(),r=(0,o.BV)(),s=(0,a.a)(),c=(0,l.EW)((()=>{const a=S(t.value.prev);return!1===a?null:a||(!1===e.value.prevLink?null:M(n.value,r.value.path,-1))})),p=(0,l.EW)((()=>{const a=S(t.value.next);return!1===a?null:a||(!1===e.value.nextLink?null:M(n.value,r.value.path,1))}));return(0,u.MLh)("keydown",(e=>{e.altKey&&("ArrowRight"===e.key?p.value&&(s(p.value.link),e.preventDefault()):"ArrowLeft"===e.key&&c.value&&(s(c.value.link),e.preventDefault()))})),()=>c.value||p.value?(0,l.h)("nav",{class:"vp-page-nav"},[c.value?(0,l.h)(a.c,{class:"prev",config:c.value},(()=>[(0,l.h)("div",{class:"hint"},[(0,l.h)("span",{class:"arrow start"}),e.value.metaLocales.prev]),(0,l.h)("div",{class:"link"},[(0,l.h)(a.f,{icon:c.value?.icon}),c.value?.text])])):null,p.value?(0,l.h)(a.c,{class:"next",config:p.value},(()=>[(0,l.h)("div",{class:"hint"},[e.value.metaLocales.next,(0,l.h)("span",{class:"arrow end"})]),(0,l.h)("div",{class:"link"},[p.value?.text,(0,l.h)(a.f,{icon:p.value?.icon})])])):null]):null}});const _={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"};var T=(0,l.pM)({name:"PageTitle",setup(){const e=(0,o.BV)(),t=(0,o.R7)(),n=(0,i.a)(),{info:r,items:s}=(0,a.b)();return()=>(0,l.h)("div",{class:"vp-page-title"},[(0,l.h)("h1",[!1===n.value.titleIcon?null:(0,l.h)(a.f,{icon:t.value.icon}),e.value.title]),(0,l.h)(a.P,{info:r.value,...null===s.value?{}:{items:s.value}}),(0,l.h)("hr")])}});const L=()=>(0,l.h)(c.zP,{name:"edit"},(()=>[(0,l.h)("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"}),(0,l.h)("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"})]));L.displayName="EditIcon";var A=(0,l.pM)({name:"PageMeta",setup(){const e=(0,i.a)(),t=(()=>{const e=(0,i.a)(),t=(0,o.BV)(),n=(0,o.R7)();return(0,l.EW)((()=>{const{repo:a,docsRepo:l=a,docsBranch:r="main",docsDir:o="",editLink:i,editLinkPattern:u=""}=e.value;if(!(n.value.editLink??i??1)||!l)return null;const p=(({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:a,editLinkPattern:l})=>{if(!a)return null;const r=(0,c.DA)(e);let o;return l?o=l:null!==r&&(o=_[r]),o?o.replace(/:repo/u,(0,s.r3)(e)?e:`https://github.com/${e}`).replace(/:branch/u,t).replace(/:path/u,(0,s.uv)(`${(0,s.TY)(n)}/${a}`)):null})({docsRepo:l,docsBranch:r,docsDir:o,editLinkPattern:u,filePathRelative:t.value.filePathRelative});return p?{text:e.value.metaLocales.editLink,link:p}:null}))})(),n=(()=>{const e=(0,o.rR)(),t=(0,i.a)(),n=(0,o.BV)(),a=(0,o.R7)();return(0,l.EW)((()=>(a.value.lastUpdated??t.value.lastUpdated??1)&&n.value.git?.updatedTime?new Date(n.value.git?.updatedTime).toLocaleString(e.value.lang):null))})(),r=(()=>{const e=(0,i.a)(),t=(0,o.BV)(),n=(0,o.R7)();return(0,l.EW)((()=>n.value.contributors??e.value.contributors??1?t.value.git?.contributors??null:null))})();return()=>{const{metaLocales:s}=e.value;return(0,l.h)("footer",{class:"page-meta"},[t.value?(0,l.h)("div",{class:"meta-item edit-link"},(0,l.h)(a.c,{class:"label",config:t.value},{before:()=>(0,l.h)(L)})):null,(0,l.h)("div",{class:"meta-item git-info"},[n.value?(0,l.h)("div",{class:"update-time"},[(0,l.h)("span",{class:"label"},`${s.lastUpdated}: `),(0,l.h)(o.YX,(()=>(0,l.h)("span",{class:"info"},n.value)))]):null,r.value&&r.value.length?(0,l.h)("div",{class:"contributors"},[(0,l.h)("span",{class:"label"},`${s.contributors}: `),r.value.map((({email:e,name:t},n)=>[(0,l.h)("span",{class:"contributor",title:`email: ${e}`},t),n!==r.value.length-1?",":""]))]):null])])}}}),$=(0,l.pM)({name:"NormalPage",slots:Object,setup(e,{slots:t}){const n=(0,o.R7)(),{isDarkmode:r}=(0,a.d)(),u=(0,i.a)(),p=(0,l.EW)((()=>n.value.toc||!1!==n.value.toc&&!1!==u.value.toc));return()=>(0,l.h)("main",{id:"main-content",class:"vp-page"},(0,l.h)((0,s.L4)("LocalEncrypt")?(0,l.g2)("LocalEncrypt"):c.ad,(()=>[t.top?.(),n.value.cover?(0,l.h)("div",{class:"page-cover"},(0,l.h)("img",{src:(0,o.cV)(n.value.cover),alt:"","no-view":""})):null,(0,l.h)(x),(0,l.h)(T),p.value?(0,l.h)(a.h,{headerDepth:n.value.headerDepth??u.value.headerDepth??2},{before:()=>t.tocBefore?.(),after:()=>t.tocAfter?.()}):null,t.contentBefore?.(),(0,l.h)(a.l),t.contentAfter?.(),(0,l.h)(A),(0,l.h)(C),(0,s.L4)("CommentService")?(0,l.h)((0,l.g2)("CommentService"),{darkmode:r.value}):null,t.bottom?.()])))}}),B=(0,l.pM)({name:"Layout",slots:Object,setup(e,{slots:t}){const n=(0,i.b)(),r=(0,i.a)(),s=(0,o.BV)(),c=(0,o.R7)(),{isMobile:u}=(0,a.g)(),p=(0,l.EW)((()=>r.value.blog?.sidebarDisplay||n.value.blog?.sidebarDisplay||"mobile"));return()=>[(0,l.h)(a.m),(0,l.h)(a.p,{},{default:()=>t.default?.()||(c.value.home?(0,l.h)(E):(0,l.h)(m,(()=>(0,l.h)($,{key:s.value.path},{top:()=>t.top?.(),bottom:()=>t.bottom?.(),contentBefore:()=>t.contentBefore?.(),contentAfter:()=>t.contentAfter?.(),tocBefore:()=>t.tocBefore?.(),tocAfter:()=>t.tocAfter?.()})))),..."none"===p.value?{}:{navScreenBottom:()=>(0,l.h)((0,l.g2)("BloggerInfo"))},...u.value||"always"!==p.value?{}:{sidebar:()=>(0,l.h)((0,l.g2)("BloggerInfo"))}})]}}),W=(0,l.pM)({name:"NotFoundHint",setup(){const e=(0,i.a)(),t=()=>{const t=e.value.routeLocales.notFoundMsg;return t[Math.floor(Math.random()*t.length)]};return()=>(0,l.h)("div",{class:"not-found-hint"},[(0,l.h)("p",{class:"error-code"},"404"),(0,l.h)("h1",{class:"error-title"},e.value.routeLocales.notFoundTitle),(0,l.h)("p",{class:"error-hint"},t())])}}),R=(0,l.pM)({name:"NotFound",slots:Object,setup(e,{slots:t}){const n=(0,o.rd)(),r=(0,o.Zv)(),s=(0,i.a)();return()=>[(0,l.h)(a.m),(0,l.h)(a.p,{noSidebar:!0},(()=>(0,l.h)("main",{id:"main-content",class:"vp-page not-found"},t.default?.()||[(0,l.h)(W),(0,l.h)("div",{class:"actions"},[(0,l.h)("button",{type:"button",class:"action-button",onClick:()=>{window.history.go(-1)}},s.value.routeLocales.back),(0,l.h)("button",{type:"button",class:"action-button",onClick:()=>{n.push(s.value.home??r.value)}},s.value.routeLocales.home)])])))]}})},5183:(e,t,n)=>{n.d(t,{Pn:()=>ae,qX:()=>ce,z7:()=>pe,tI:()=>W,Kf:()=>ve,su:()=>$});var a=n(8981),l=n(7847),r=n(6719),o=n(3151),s=n(2082),i=n(8047),c=n(6635),u=n(2798),p=n(8589);const d=(0,r.IJ)(u.l),h=((0,r.tB)(d),e=>{const t=(0,o.BV)(),n=(0,o.R7)(),a=(0,o.Zv)();return(0,l.EW)((()=>{const l=e??n.value.blog?.key??"";if(!l)return console.warn("useBlogCategory: key not found"),{path:"/",map:{}};if(!d.value[l])throw new Error(`useBlogCategory: key ${l} is invalid`);const r=d.value[l][a.value],s={path:r.path,map:{}};for(const e in r.map){const n=r.map[e];s.map[e]={path:n.path,items:[]};for(const t of n.indexes){const{path:n,meta:a}=(0,o.ie)(p.M[t]);s.map[e].items.push({path:n,info:a})}t.value.path===n.path&&(s.currentItems=s.map[e].items)}return s}))});var v=n(594);const f=(0,r.IJ)(v.U),m=((0,r.tB)(f),e=>{const t=(0,o.R7)(),n=(0,o.Zv)();return(0,l.EW)((()=>{const a=e??t.value.blog?.key??"";if(!a)return console.warn("useBlogType: key not found"),{path:"/",items:[]};if(!f.value[a])throw new Error(`useBlogType: key ${e} is invalid`);const l=f.value[a][n.value],r={path:l.path,items:[]};for(const e of l.indexes){const{path:t,meta:n}=(0,o.ie)(p.M[e]);r.items.push({path:t,info:n})}return r}))});var g=n(3039);const y=()=>(0,l.h)(s.zP,{name:"lock"},(()=>(0,l.h)("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"})));y.displayName="LockIcon";var b=n(4601);n(2302),n(3578),n(7267),n(1878);const w=Symbol.for("categoryMap"),k=()=>{const e=(0,l.WQ)(w);if(!e)throw new Error("useCategoryMap() is called without provider.");return e},E=()=>{const e=(0,c.b)(),t=(0,c.a)();return(0,l.EW)((()=>({...e.value.blog,...t.value.blog})))},x=Symbol.for("tagMap"),S=()=>{const e=(0,l.WQ)(x);if(!e)throw new Error("useTagMap() is called without provider.");return e},M=Symbol(""),C=()=>{const e=(0,l.WQ)(M);if(!e)throw new Error("useArticles() is called without provider.");return e},_=Symbol(""),T=()=>{const e=(0,l.WQ)(_);if(!e)throw new Error("useStars() is called without provider.");return e},L=Symbol(""),A=()=>{const e=(0,l.WQ)(L);if(!e)throw new Error("useTimelines() is called without provider.");return e},$=()=>{(()=>{const e=m("article");(0,l.Gt)(M,e)})(),(()=>{const e=h("category");(0,l.Gt)(w,e)})(),(()=>{const e=m("star");(0,l.Gt)(_,e)})(),(()=>{const e=h("tag");(0,l.Gt)(x,e)})(),(()=>{const e=m("timeline"),t=(0,l.EW)((()=>{const t=[];return e.value.items.forEach((({info:e,path:n})=>{const l=(0,a.pp)(e[g.A.date]);if(l){const a=l.getFullYear(),r=l.getMonth()+1,o=l.getDate();(!t[0]||t[0].year!==a)&&t.unshift({year:a,items:[]}),t[0].items.push({date:`${r}/${o}`,info:e,path:n})}})),{...e.value,config:t.reverse()}}));(0,l.Gt)(L,t)})()};var B=(0,l.pM)({name:"SocialMedia",setup(){const e=E(),t=(0,c.u)(),n=(0,l.EW)((()=>{const t=e.value.medias;return t?(0,a.jO)(t).map((([e,t])=>({name:e,icon:i.P[e],url:t}))):[]}));return()=>n.value.length?(0,l.h)("div",{class:"vp-social-medias"},n.value.map((({name:e,icon:n,url:a})=>(0,l.h)("a",{class:"vp-social-media",href:a,rel:"noopener noreferrer",target:"_blank","aria-label":e,...t.value?{}:{"data-balloon-pos":"up"},innerHTML:n})))):null}}),W=(0,l.pM)({name:"BloggerInfo",setup(){const e=E(),t=(0,o.rR)(),n=(0,c.a)(),r=C(),i=k(),u=S(),p=A(),d=(0,g.a)(),h=(0,l.EW)((()=>e.value.name||(0,s.kn)(n.value.author)[0]?.name||t.value.title)),v=(0,l.EW)((()=>e.value.avatar||n.value.logo)),f=(0,l.EW)((()=>n.value.blogLocales)),m=(0,l.EW)((()=>e.value.intro));return()=>{const{article:t,category:n,tag:s,timeline:c}=f.value,g=[[r.value.path,r.value.items.length,t],[i.value.path,(0,a.HP)(i.value.map).length,n],[u.value.path,(0,a.HP)(u.value.map).length,s],[p.value.path,p.value.items.length,c]];return(0,l.h)("div",{class:"vp-blogger-info",vocab:"https://schema.org/",typeof:"Person"},[(0,l.h)("div",{class:"vp-blogger",...m.value?{style:{cursor:"pointer"},"aria-label":f.value.intro,"data-balloon-pos":"down",role:"link",onClick:()=>d(m.value)}:{}},[v.value?(0,l.h)("img",{class:["vp-blogger-avatar",{round:e.value.roundAvatar}],src:(0,o.cV)(v.value),property:"image",alt:"Blogger Avatar",loading:"lazy"}):null,h.value?(0,l.h)("div",{class:"vp-blogger-name",property:"name"},h.value):null,e.value.description?(0,l.h)("div",{class:"vp-blogger-description",innerHTML:e.value.description}):null,m.value?(0,l.h)("meta",{property:"url",content:(0,o.cV)(m.value)}):null]),(0,l.h)("div",{class:"vp-blog-counts"},g.map((([e,t,n])=>(0,l.h)(o.Wt,{class:"vp-blog-count",to:e},(()=>[(0,l.h)("div",{class:"count"},t),(0,l.h)("div",n)]))))),(0,l.h)(B)])}}});const R=()=>(0,l.h)(s.zP,{name:"category"},(()=>(0,l.h)("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"})));R.displayName="CategoryIcon";const I=()=>(0,l.h)(s.zP,{name:"tag"},(()=>(0,l.h)("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"})));I.displayName="TagIcon";const P=()=>(0,l.h)(s.zP,{name:"timeline"},(()=>(0,l.h)("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"})));P.displayName="TimelineIcon";const O=()=>(0,l.h)(s.zP,{name:"slides"},(()=>(0,l.h)("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"})));O.displayName="SlideIcon";const z=()=>(0,l.h)(s.zP,{name:"sticky"},(()=>[(0,l.h)("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"})]));z.displayName="StickyIcon";const V=()=>(0,l.h)(s.zP,{name:"article"},(()=>(0,l.h)("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"})));V.displayName="ArticleIcon";const N=()=>(0,l.h)(s.zP,{name:"book"},(()=>(0,l.h)("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"})));N.displayName="BookIcon";const j=()=>(0,l.h)(s.zP,{name:"link"},(()=>(0,l.h)("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"})));j.displayName="LinkIcon";const D=()=>(0,l.h)(s.zP,{name:"project"},(()=>(0,l.h)("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"})));D.displayName="ProjectIcon";const F=()=>(0,l.h)(s.zP,{name:"friend"},(()=>(0,l.h)("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"})));F.displayName="FriendIcon";const H=()=>(0,l.h)(s.zP,{name:"slide-down"},(()=>(0,l.h)("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"})));H.displayName="SlideDownIcon";const U=()=>(0,l.h)("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:''});U.displayName="EmptyIcon";var K=(0,l.pM)({name:"ArticleItem",props:{info:{type:Object,required:!0},path:{type:String,required:!0}},slots:Object,setup(e,{slots:t}){const n=(0,r.lW)(e,"info"),{info:i,items:u}=(e=>{const t=(0,r.lW)(e,"info"),n=E(),o=(e=>{const t=(0,c.a)();return(0,l.EW)((()=>{const{[g.A.author]:n}=e.value;return n?(0,s.kn)(n):!1===n?[]:(0,s.kn)(t.value.author,!1)}))})(t),i=(e=>{const t=k();return(0,l.EW)((()=>(0,s.p7)(e.value[g.A.category]).map((e=>({name:e,path:t.value.map[e].path})))))})(t),u=(e=>{const t=S();return(0,l.EW)((()=>(0,s.bH)(e.value[g.A.tag]).map((e=>({name:e,path:t.value.map[e].path})))))})(t),p=(e=>(0,l.EW)((()=>{const{[g.A.date]:t}=e.value;return(0,a.pp)(t)})))(t),d=(0,b.nn)();return{info:(0,l.EW)((()=>({author:o.value,category:i.value,date:p.value,localizedDate:t.value[g.A.localizedDate]||"",tag:u.value,isOriginal:t.value[g.A.isOriginal]||!1,readingTime:t.value[g.A.readingTime]||null,readingTimeLocale:t.value[g.A.readingTime]&&d.value?(0,b.s4)(t.value[g.A.readingTime],d.value):null,pageview:e.path}))),items:(0,l.EW)((()=>n.value.articleInfo))}})(e);return()=>{const{[g.A.title]:a,[g.A.type]:r,[g.A.isEncrypted]:s=!1,[g.A.cover]:c,[g.A.excerpt]:p,[g.A.sticky]:d}=n.value,h=i.value;return(0,l.h)("div",{class:"vp-article-wrapper"},(0,l.h)("article",{class:"vp-article-item",vocab:"https://schema.org/",typeof:"Article"},[t.cover?.({cover:c})||(c?[(0,l.h)("img",{class:"vp-article-cover",src:(0,o.cV)(c),loading:"lazy"}),(0,l.h)("meta",{property:"image",content:(0,o.cV)(c)})]:[]),d?(0,l.h)(z):null,(0,l.h)(o.Wt,{to:e.path},(()=>t.title?.({title:a,isEncrypted:s,type:r})||(0,l.h)("header",{class:"vp-article-title"},[s?(0,l.h)(y):null,r===g.k.slide?(0,l.h)(O):null,(0,l.h)("span",{property:"headline"},a)]))),t.excerpt?.({excerpt:p})||(p?(0,l.h)("div",{class:"vp-article-excerpt",innerHTML:p}):null),(0,l.h)("hr",{class:"vp-article-hr"}),t.info?.({info:h})||(0,l.h)(g.P,{info:h,...u.value?{items:u.value}:{}})]))}}}),q=(0,l.pM)({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 a=(0,c.a)(),o=(0,r.KR)(""),i=(0,l.EW)((()=>a.value.paginationLocales)),u=(0,l.EW)((()=>Math.ceil(e.total/e.perPage))),p=(0,l.EW)((()=>!!u.value&&1!==u.value)),d=(0,l.EW)((()=>!(u.value<7)&&e.current>4)),h=(0,l.EW)((()=>!(u.value<7)&&e.current{const{current:t}=e;let n=1,a=u.value;const l=[];u.value>=7&&(t<=4&&t4&&t>=u.value-3?(a=u.value,n=u.value-4):u.value>7&&(n=t-2,a=t+2));for(let e=n;e<=a;e++)l.push(e);return l})),f=e=>t("updateCurrentPage",e),m=e=>{const t=parseInt(e,10);t<=u.value&&t>0?f(t):n.pop(`${i.value.errorText.replace(/\$page/gu,u.value.toString())}`)};return(0,l.sV)((()=>{n=new s.QB})),()=>(0,l.h)("div",{class:"vp-pagination"},p.value?(0,l.h)("nav",{class:"vp-pagination-list"},[(0,l.h)("div",{class:"vp-pagination-number "},[e.current>1?(0,l.h)("div",{class:"prev",role:"navigation",unselectable:"on",onClick:()=>f(e.current-1)},i.value.prev):null,d.value?[(0,l.h)("div",{role:"navigation",onClick:()=>f(1)},1),(0,l.h)("div",{class:"ellipsis"},"...")]:null,v.value.map((t=>(0,l.h)("div",{key:t,class:{active:e.current===t},role:"navigation",onClick:()=>f(t)},t))),h.value?[(0,l.h)("div",{class:"ellipsis"},"..."),(0,l.h)("div",{role:"navigation",onClick:()=>f(u.value)},u.value)]:null,e.currentf(e.current+1)},i.value.next):null]),(0,l.h)("div",{class:"vp-pagination-nav"},[(0,l.h)("label",{for:"navigation-text"},`${i.value.navigate}: `),(0,l.h)("input",{id:"navigation-text",value:o.value,onInput:({target:e})=>{o.value=e.value},onKeydown:e=>{"Enter"===e.key&&(e.preventDefault(),m(o.value))}}),(0,l.h)("button",{class:"vp-pagination-button",role:"navigation",title:i.value.action,onClick:()=>m(o.value)},i.value.action)])]):[])}}),G=(0,l.pM)({name:"ArticleList",props:{items:{type:Array,default:()=>[]}},setup(e){const t=(0,o.lq)(),a=(0,o.rd)(),s=E(),i=(0,r.KR)(1),c=(0,l.EW)((()=>s.value.articlePerPage||10)),u=(0,l.EW)((()=>e.items.slice((i.value-1)*c.value,i.value*c.value))),p=async e=>{i.value=e;const r={...t.query};r.page!==e.toString()&&(1!==e||r.page)&&(1===e?delete r.page:r.page=e.toString(),await a.push({path:t.path,query:r}));{await(0,l.dY)();const{updatePageview:e}=await n.e(4797).then(n.bind(n,4797));await e()}};return(0,l.sV)((()=>{const{page:e}=t.query;p(e?Number(e):1),(0,l.wB)(i,(()=>{const e=document.querySelector("#article-list").getBoundingClientRect().top+window.scrollY;setTimeout((()=>{window.scrollTo(0,e)}),100)}))})),()=>(0,l.h)("div",{id:"article-list",class:"vp-article-list",role:"feed"},u.value.length?[...u.value.map((({info:e,path:t},n)=>(0,l.h)(g.e,{appear:!0,delay:.04*n},(()=>(0,l.h)(K,{key:t,info:e,path:t}))))),(0,l.h)(q,{current:i.value,perPage:c.value,total:e.items.length,onUpdateCurrentPage:p})]:(0,l.h)(U))}}),Y=(0,l.pM)({name:"CategoryList",setup(){const e=(0,o.BV)(),t=k();return()=>(0,l.h)("ul",{class:"vp-category-list"},(0,a.jO)(t.value.map).sort((([,e],[,t])=>t.items.length-e.items.length)).map((([t,{path:n,items:a}])=>(0,l.h)("li",{class:["vp-category",`vp-category${(0,s.e1)(t,9)}`,{active:n===e.value.path}]},(0,l.h)(o.Wt,{to:n},(()=>[t,(0,l.h)("span",{class:"count"},a.length)]))))))}}),Z=(0,l.pM)({name:"TagList",setup(){const e=(0,o.R7)(),t=S(),n=t=>t===e.value.blog?.name;return()=>(0,l.h)("ul",{class:"tag-list-wrapper"},(0,a.jO)(t.value.map).sort((([,e],[,t])=>t.items.length-e.items.length)).map((([e,{path:t,items:a}])=>(0,l.h)("li",{class:["tag",`tag${(0,s.e1)(e,9)}`,{active:n(e)}]},(0,l.h)(o.Wt,{to:t},(()=>[e,(0,l.h)("span",{class:"tag-num"},a.length)]))))))}}),X=(0,l.pM)({name:"TimelineList",setup(){const e=(0,c.a)(),t=A(),n=(0,g.a)(),a=(0,l.EW)((()=>e.value.blogLocales.timeline));return()=>(0,l.h)("div",{class:"timeline-list-wrapper"},[(0,l.h)("div",{class:"timeline-list-title",onClick:()=>n(t.value.path)},[(0,l.h)(P),(0,l.h)("span",{class:"num"},t.value.items.length),a.value]),(0,l.h)("hr"),(0,l.h)("div",{class:"timeline-content"},(0,l.h)("ul",{class:"timeline-list"},t.value.config.map((({year:e,items:t},n)=>(0,l.h)(g.e,{appear:!0,delay:.08*(n+1)},(()=>(0,l.h)("li",[(0,l.h)("h3",{class:"timeline-year"},e),(0,l.h)("ul",{class:"timeline-year-wrapper"},t.map((({date:e,info:t,path:n})=>(0,l.h)("li",{class:"timeline-item"},[(0,l.h)("span",{class:"timeline-date"},e),(0,l.h)(o.Wt,{class:"timeline-title",to:n},(()=>t[g.A.title]))]))))])))))))])}});const Q={article:V,category:R,tag:I,timeline:P};var J=(0,l.pM)({name:"InfoList",setup(){const e=(0,c.a)(),t=C(),n=k(),s=(0,l.EW)((()=>(0,a.HP)(n.value.map).length)),i=T(),u=S(),p=(0,l.EW)((()=>(0,a.HP)(u.value.map).length)),d=(0,g.a)(),h=(0,r.KR)("article"),v=(0,l.EW)((()=>e.value.blogLocales));return()=>(0,l.h)("div",{class:"vp-blog-infos"},[(0,l.h)("div",{class:"vp-blog-type-switcher"},(0,a.jO)(Q).map((([e,t])=>(0,l.h)("button",{type:"button",class:"vp-blog-type-button",onClick:()=>{h.value=e}},(0,l.h)("div",{class:["icon-wrapper",{active:h.value===e}],"aria-label":v.value[e],"data-balloon-pos":"up"},(0,l.h)(t)))))),(0,l.h)(g.e,(()=>"article"===h.value?(0,l.h)("div",{class:"vp-star-article-wrapper"},[(0,l.h)("div",{class:"title",onClick:()=>d(t.value.path)},[(0,l.h)(V),(0,l.h)("span",{class:"num"},t.value.items.length),v.value.article]),(0,l.h)("hr"),i.value.items.length?(0,l.h)("ul",{class:"vp-star-articles"},i.value.items.map((({info:e,path:t},n)=>(0,l.h)(g.e,{appear:!0,delay:.08*(n+1)},(()=>(0,l.h)("li",{class:"vp-star-article"},(0,l.h)(o.Wt,{to:t},(()=>e[g.A.title])))))))):(0,l.h)("div",{class:"vp-star-article-empty"},v.value.empty.replace("$text",v.value.star))]):"category"===h.value?(0,l.h)("div",{class:"vp-category-wrapper"},[s.value?[(0,l.h)("div",{class:"title",onClick:()=>d(n.value.path)},[(0,l.h)(R),(0,l.h)("span",{class:"num"},s.value),v.value.category]),(0,l.h)("hr"),(0,l.h)(g.e,{delay:.04},(()=>(0,l.h)(Y)))]:(0,l.h)("div",{class:"vp-category-empty"},v.value.empty.replace("$text",v.value.category))]):"tag"===h.value?(0,l.h)("div",{class:"vp-tag-wrapper"},[p.value?[(0,l.h)("div",{class:"title",onClick:()=>d(u.value.path)},[(0,l.h)(I),(0,l.h)("span",{class:"num"},p.value),v.value.tag]),(0,l.h)("hr"),(0,l.h)(g.e,{delay:.04},(()=>(0,l.h)(Z)))]:(0,l.h)("div",{class:"vp-tag-empty"},v.value.empty.replace("$text",v.value.tag))]):(0,l.h)(g.e,(()=>(0,l.h)(X)))))])}}),ee=(0,l.pM)({name:"BlogWrapper",slots:Object,setup(e,{slots:t}){const{isMobile:n}=(0,g.g)();return()=>[(0,l.h)(g.m),(0,l.h)(g.p,{noSidebar:!0,noToc:!0},{default:()=>t.default(),navScreenBottom:()=>(0,l.h)(W),...n.value?{sidebar:()=>(0,l.h)(J)}:{}})]}});const te=()=>(0,l.h)("aside",{class:"vp-blog-info-wrapper"},[(0,l.h)(g.e,(()=>(0,l.h)(W))),(0,l.h)(g.e,{delay:.04},(()=>(0,l.h)(J)))]);te.displayName="InfoPanel";var ne=te,ae=(0,l.pM)({name:"BlogPage",setup(){const e=(0,o.BV)(),t=(0,o.R7)(),n=k(),a=S();return()=>{const{key:r="",name:o=""}=t.value.blog||{},s=o?"category"===r?n.value.map[o].items:"tag"===r?a.value.map[o].items:[]:[];return(0,l.h)(ee,(()=>(0,l.h)("div",{class:"vp-page vp-blog"},(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[(0,l.h)(g.e,(()=>"category"===r?(0,l.h)(Y):"tag"===r?(0,l.h)(Z):null)),o?(0,l.h)(g.e,{appear:!0,delay:.24},(()=>(0,l.h)(G,{key:e.value.path,items:s}))):null]),(0,l.h)(g.e,{delay:.16},(()=>(0,l.h)(ne,{key:"blog"})))]))))}}}),le=(0,l.pM)({name:"BlogHero",slots:Object,setup(e,{slots:t}){const n=(0,o.R7)(),s=(0,o.rR)(),i=(0,r.IJ)(),c=(0,l.EW)((()=>n.value.heroFullScreen??!1)),u=(0,l.EW)((()=>{const{heroText:e,heroImage:t,heroImageDark:a,heroAlt:l,heroImageStyle:r,tagline:i}=n.value;return{text:e??s.value.title??"Hello",image:t?(0,o.cV)(t):null,imageDark:a?(0,o.cV)(a):null,heroStyle:r,alt:l||e||"",tagline:i??"",isFullScreen:c.value}})),p=(0,l.EW)((()=>{const{bgImage:e,bgImageDark:t,bgImageStyle:l}=n.value;return{image:(0,a.Kg)(e)?(0,o.cV)(e):!1===e?null:"//theme-hope-assets.vuejs.press/hero/default.jpg",imageDark:(0,a.Kg)(t)?(0,o.cV)(t):null,bgStyle:l,isFullScreen:c.value}}));return()=>!1===n.value.hero?null:(0,l.h)("div",{ref:i,class:["vp-blog-hero",{fullscreen:c.value,"no-bg":!p.value.image}]},[t.heroBg?.(p.value)||[p.value.image?(0,l.h)("div",{class:["vp-blog-mask",{light:p.value.imageDark}],style:[{background:`url(${p.value.image}) center/cover no-repeat`},p.value.bgStyle]}):null,p.value.imageDark?(0,l.h)("div",{class:"vp-blog-mask dark",style:[{background:`url(${p.value.imageDark}) center/cover no-repeat`},p.value.bgStyle]}):null],t.heroInfo?.(u.value)||[(0,l.h)(g.e,{appear:!0,type:"group",delay:.04},(()=>[u.value.image?(0,l.h)("img",{key:"light",class:["vp-blog-hero-image",{light:u.value.imageDark}],style:u.value.heroStyle,src:u.value.image,alt:u.value.alt}):null,u.value.imageDark?(0,l.h)("img",{key:"dark",class:"vp-blog-hero-image dark",style:u.value.heroStyle,src:u.value.imageDark,alt:u.value.alt}):null])),(0,l.h)(g.e,{appear:!0,delay:.08},(()=>u.value.text?(0,l.h)("h1",{class:"vp-blog-hero-title"},u.value.text):null)),(0,l.h)(g.e,{appear:!0,delay:.12},(()=>u.value.tagline?(0,l.h)("p",{class:"vp-blog-hero-description",innerHTML:u.value.tagline}):null))],u.value.isFullScreen?(0,l.h)("button",{type:"button",class:"slide-down-button",onClick:()=>{window.scrollTo({top:i.value.clientHeight,behavior:"smooth"})}},[(0,l.h)(H),(0,l.h)(H)]):null])}});const re=["link","article","book","project","friend"];var oe=(0,l.pM)({name:"ProjectPanel",components:{ArticleIcon:V,BookIcon:N,FriendIcon:F,LinkIcon:j,ProjectIcon:D},props:{items:{type:Array,required:!0}},setup(e){const t=(0,c.u)(),n=(0,g.a)(),r=(e="",t="icon")=>re.includes(e)?(0,l.h)((0,l.g2)(`${e}-icon`)):(0,a.r3)(e)?(0,l.h)("img",{class:"vp-project-image",src:e,alt:t}):(0,a.eM)(e)?(0,l.h)("img",{class:"vp-project-image",src:(0,o.cV)(e),alt:t}):(0,l.h)(g.f,{icon:e});return()=>(0,l.h)("div",{class:"vp-project-panel"},e.items.map((({icon:e,link:a,name:o,desc:s},i)=>(0,l.h)("div",{class:["vp-project-card",{["project"+i%9]:!t.value}],onClick:()=>n(a)},[r(e,o),(0,l.h)("div",{class:"vp-project-name"},o),(0,l.h)("div",{class:"vp-project-desc"},s)]))))}}),se=(0,l.pM)({name:"BlogHome",setup(){const e=C(),t=(0,o.R7)(),n=(0,l.EW)((()=>t.value.projects??[]));return()=>(0,l.h)("div",{class:"vp-page vp-blog"},[(0,l.h)(le),(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[n.value.length?(0,l.h)(g.e,{appear:!0,delay:.16},(()=>(0,l.h)(oe,{items:n.value}))):null,(0,l.h)(g.e,{appear:!0,delay:.24},(()=>(0,l.h)(G,{items:e.value.items})))]),(0,l.h)(g.e,{appear:!0,delay:.16},(()=>(0,l.h)(ne,{key:"blog"})))]),(0,l.h)(g.e,{appear:!0,delay:.28},(()=>(0,l.h)(g.l)))])}});const ie=()=>(0,l.h)(ee,(()=>(0,l.h)(se)));ie.displayName="BlogHomeLayout";var ce=ie,ue=(0,l.pM)({name:"ArticleType",setup(){const e=(0,o.BV)(),t=(0,o.Zv)(),n=(0,c.a)(),a=C(),r=T(),s=(0,l.EW)((()=>{const e=n.value.blogLocales;return[{text:e.all,path:a.value.path},{text:e.star,path:r.value.path},...[].map((({key:n,path:a})=>({text:e[n],path:a.replace(/^\//,t.value)})))]}));return()=>(0,l.h)("ul",{class:"vp-article-type-wrapper"},s.value.map((t=>(0,l.h)("li",{class:["vp-article-type",{active:t.path===e.value.path}]},(0,l.h)(o.Wt,{to:t.path},(()=>t.text))))))}}),pe=(0,l.pM)({name:"BlogPage",setup(){const e=m(),t=(0,o.R7)(),n=(0,o.BV)(),a=C(),r=T(),s=(0,l.EW)((()=>{const{key:n="",type:l}=t.value.blog||{};return"star"===n?r.value.items:"type"===l&&n?e.value.items:a.value.items}));return()=>(0,l.h)(ee,(()=>(0,l.h)("div",{class:"vp-page vp-blog"},(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[(0,l.h)(g.e,(()=>(0,l.h)(ue))),(0,l.h)(g.e,{appear:!0,delay:.24},(()=>(0,l.h)(G,{key:n.value.path,items:s.value})))]),(0,l.h)(g.e,{delay:.16},(()=>(0,l.h)(ne,{key:"blog"})))]))))}}),de=(0,l.pM)({name:"TimelineItems",setup(){const e=E(),t=(0,c.a)(),n=A(),a=(0,l.EW)((()=>e.value.timeline||t.value.blogLocales.timelineTitle)),r=(0,l.EW)((()=>n.value.config.map((({year:e})=>({title:e.toString(),level:2,slug:e.toString(),children:[]})))));return()=>(0,l.h)("div",{class:"timeline-wrapper"},(0,l.h)("ul",{class:"timeline-content"},[(0,l.h)(g.e,(()=>(0,l.h)("li",{class:"motto"},a.value))),(0,l.h)(g.h,{items:r.value}),n.value.config.map((({year:e,items:t},n)=>(0,l.h)(g.e,{appear:!0,delay:.08*(n+1),type:"group"},(()=>[(0,l.h)("h3",{key:"title",id:e,class:"timeline-year-title"},(0,l.h)("span",e)),(0,l.h)("li",{key:"content",class:"timeline-year-list"},[(0,l.h)("ul",{class:"timeline-year-wrapper"},t.map((({date:e,info:t,path:n})=>(0,l.h)("li",{class:"timeline-item"},[(0,l.h)("span",{class:"timeline-date"},e),(0,l.h)(o.Wt,{class:"timeline-title",to:n},(()=>t[g.A.title]))]))))])]))))]))}});const he=()=>(0,l.h)(ee,(()=>(0,l.h)("div",{class:"vp-page vp-blog"},(0,l.h)("div",{class:"blog-page-wrapper"},[(0,l.h)("main",{id:"main-content",class:"vp-blog-main"},[(0,l.h)(g.e,{appear:!0,delay:.24},(()=>(0,l.h)(de)))]),(0,l.h)(g.e,{delay:.16},(()=>(0,l.h)(ne,{key:"blog"})))]))));he.displayName="Timeline";var ve=he},6635:(e,t,n)=>{n.d(t,{a:()=>o,b:()=>r,u:()=>s});var a=n(2302),l=n(7847);const r=()=>(0,a.dy)(),o=()=>(0,a.To)(),s=()=>{const e=r();return(0,l.EW)((()=>!!e.value.pure))}},3151:(e,t,n)=>{n.d(t,{YX:()=>a.YX,UC:()=>a.UC,Wt:()=>a.Wt,sW:()=>a.sW,re:()=>l,ie:()=>a.ie,BV:()=>a.BV,R7:()=>a.R7,Nj:()=>a.Nj,lq:()=>a.lq,Zv:()=>a.Zv,rd:()=>a.rd,Ye:()=>a.Ye,rU:()=>a.rU,rR:()=>a.rR,cV:()=>a.cV});var a=n(1819),l=(e={})=>e}}]); \ No newline at end of file diff --git a/assets/js/3256.d558401c.js.LICENSE.txt b/assets/js/7251.1ccbba2c.js.LICENSE.txt similarity index 71% rename from assets/js/3256.d558401c.js.LICENSE.txt rename to assets/js/7251.1ccbba2c.js.LICENSE.txt index 028dfd88b..02fdab23d 100644 --- a/assets/js/3256.d558401c.js.LICENSE.txt +++ b/assets/js/7251.1ccbba2c.js.LICENSE.txt @@ -12,25 +12,19 @@ */ /** -* @vue/reactivity v3.4.15 +* @vue/reactivity v3.4.19 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ /** -* @vue/runtime-core v3.4.15 +* @vue/runtime-dom v3.4.19 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ /** -* @vue/runtime-dom v3.4.15 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/ - -/** -* @vue/shared v3.4.15 +* @vue/shared v3.4.19 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ diff --git a/assets/js/6548.cb5f8ea6.js b/assets/js/7637.bc3d91db.js similarity index 77% rename from assets/js/6548.cb5f8ea6.js rename to assets/js/7637.bc3d91db.js index 8e6e7c27a..92e7a2a9c 100644 --- a/assets/js/6548.cb5f8ea6.js +++ b/assets/js/7637.bc3d91db.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6548],{6548:(s,e,t)=>{t.r(e),t.d(e,{SRTParser:()=>h,default:()=>n});var a=t(6632);const i=/,/g;class h extends a.V{parse(s,e){if(""===s)this.a&&(this.j.push(this.a),this.f.onCue?.(this.a),this.a=null),this.c=a.a.None;else if(this.c===a.a.Cue)this.a.text+=(this.a.text?"\n":"")+s;else if(s.includes("--\x3e")){const t=this.o(s,e);t&&(this.a=new a.b(t[0],t[1],t[2].join(" ")),this.a.id=this.l,this.c=a.a.Cue)}this.l=s}o(s,e){return super.o(s.replace(i,"."),e)}}function n(){return new h}}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7637],{7637:(s,e,t)=>{t.r(e),t.d(e,{SRTParser:()=>h,default:()=>n});var a=t(8254);const i=/,/g;class h extends a.V{parse(s,e){if(""===s)this.a&&(this.j.push(this.a),this.f.onCue?.(this.a),this.a=null),this.c=a.a.None;else if(this.c===a.a.Cue)this.a.text+=(this.a.text?"\n":"")+s;else if(s.includes("--\x3e")){const t=this.o(s,e);t&&(this.a=new a.b(t[0],t[1],t[2].join(" ")),this.a.id=this.l,this.c=a.a.Cue)}this.l=s}o(s,e){return super.o(s.replace(i,"."),e)}}function n(){return new h}}}]); \ No newline at end of file diff --git a/assets/js/8073.770c79f3.js b/assets/js/8073.770c79f3.js new file mode 100644 index 000000000..285d6c377 --- /dev/null +++ b/assets/js/8073.770c79f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8073],{9610:(t,e,s)=>{s.d(e,{E:()=>c,t:()=>a});var i=s(4158),o=s(4123);function a(t,e=3e3){const s=(0,i.v)();return setTimeout((()=>{const e=t();e&&s.reject(e)}),e),s}class c{constructor(t){this.db=t,this.cb=(0,i.m)(""),this.referrerPolicy=null,t.setAttribute("frameBorder","0"),t.setAttribute("allow","autoplay; fullscreen; encrypted-media; picture-in-picture; accelerometer; gyroscope"),null!==this.referrerPolicy&&t.setAttribute("referrerpolicy",this.referrerPolicy)}get iframe(){return this.db}setup(t){(0,i.e)(this.fd.bind(this)),(0,i.l)(window,"message",this.Lg.bind(this)),(0,i.l)(this.db,"load",this.lc.bind(this))}fd(){const t=this.cb();if(!t.length)return void this.db.setAttribute("src","");const e=(0,i.p)((()=>this.Te()));this.db.setAttribute("src",(0,o.a)(t,e))}gd(t,e){this.db.contentWindow?.postMessage(JSON.stringify(t),e??"*")}Lg(t){const e=this.eb();if(t.source===this.db?.contentWindow&&(!(0,i.r)(e)||e===t.origin)){try{const e=JSON.parse(t.data);return void(e&&this.hd(e,t))}catch(t){}t.data&&this.hd(t.data,t)}}}},8073:(t,e,s)=>{s.r(e),s.d(e,{YouTubeProvider:()=>n});var i=s(4158),o=s(8457),a=s(4123),c=s(9610);class n extends c.E{constructor(){super(...arguments),this.$$PROVIDER_TYPE="YOUTUBE",this.scope=(0,i.q)(),this.N=(0,i.m)(""),this.mc=-1,this.nc=-1,this.Fa=0,this.Ga=new o.T(0,0),this.V=null,this.E=null,this.G=null,this.language="en",this.color="red",this.cookies=!1}static{this.jd=/(?:youtu\.be|youtube|youtube\.com|youtube-nocookie\.com)\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=|)((?:\w|-){11})/}static{this.We=new Map}get c(){return this.b.delegate.c}get currentSrc(){return this.V}get type(){return"youtube"}get videoId(){return this.N()}preconnect(){const t=[this.eb(),"https://www.google.com","https://i.ytimg.com","https://googleads.g.doubleclick.net","https://static.doubleclick.net"];for(const e of t)(0,a.p)(e,"preconnect")}setup(t){this.b=t,super.setup(t),(0,i.e)(this.kd.bind(this)),(0,i.e)(this.ld.bind(this)),this.c("provider-setup",this)}async play(){const{paused:t}=this.b.$state;if((0,i.p)(t))return this.E||(this.E=(0,c.t)((()=>{if(this.E=null,t())return"Timed out."})),this.q("playVideo")),this.E.promise}async pause(){const{paused:t}=this.b.$state;if(!(0,i.p)(t))return this.G||(this.G=(0,c.t)((()=>{this.G=null,t()})),this.q("pauseVideo")),this.G.promise}setMuted(t){t?this.q("mute"):this.q("unMute")}setCurrentTime(t){this.q("seekTo",t)}setVolume(t){this.q("setVolume",100*t)}setPlaybackRate(t){this.q("setPlaybackRate",t)}async loadSource(t){if(!(0,i.r)(t.src))return this.V=null,void this.N.set("");const e=t.src.match(n.jd)?.[1];this.N.set(e??""),this.V=t}eb(){return this.cookies?"https://www.youtube.com":"https://www.youtube-nocookie.com"}kd(){this.H();const t=this.N();t?this.cb.set(`${this.eb()}/embed/${t}`):this.cb.set("")}ld(){const t=this.N(),e=n.We;if(!t)return;if(e.has(t)){const s=e.get(t);return void this.c("poster-change",s)}const s=new AbortController;return this.Pg(t,s),()=>{s.abort()}}async Pg(t,e){try{const s=["maxresdefault","sddefault","hqdefault"];for(const i of s)for(const s of[!0,!1]){const o=this.Qg(t,i,s);if((await fetch(o,{mode:"no-cors",signal:e.signal})).status<400)return n.We.set(t,o),void this.c("poster-change",o)}}catch(t){}this.c("poster-change","")}Qg(t,e,s){return`https://i.ytimg.com/${s?"vi_webp":"vi"}/${t}/${e}.${s?"webp":"jpg"}`}Te(){const{keyDisabled:t}=this.b.$props,{$iosControls:e}=this.b,{controls:s,muted:i,playsinline:o}=this.b.$state,a=s()||e();return{autoplay:0,cc_lang_pref:this.language,cc_load_policy:a?1:void 0,color:this.color,controls:a?1:0,disablekb:!a||t()?1:0,enablejsapi:1,fs:1,hl:this.language,iv_load_policy:a?1:3,mute:i()?1:0,playsinline:o()?1:0}}q(t,e){this.gd({event:"command",func:t,args:e?[e]:void 0})}lc(){window.setTimeout((()=>this.gd({event:"listening"})),100)}md(t){this.b.delegate.jc(void 0,t)}Aa(t){this.G?.resolve(),this.G=null,this.c("pause",void 0,t)}Eb(t,e){const{duration:s,currentTime:i}=this.b.$state,a=0===this.mc?s():t,c={currentTime:a,played:this.Fa>=a?this.Ga:this.Ga=new o.T(0,this.Fa=t)};this.c("time-update",c,e),Math.abs(a-i())>1&&this.c("seeking",a,e)}ic(t,e,s){const i={buffered:new o.T(0,t),seekable:e};this.c("progress",i,s);const{seeking:a,currentTime:c}=this.b.$state;a()&&t>c()&&this.bb(s)}bb(t){const{paused:e,currentTime:s}=this.b.$state;window.clearTimeout(this.nc),this.nc=window.setTimeout((()=>{this.c("seeked",s(),t),this.nc=-1}),e()?100:0)}Db(t){const{seeking:e}=this.b.$state;e()&&this.bb(t),this.c("end",void 0,t)}Rg(t,e){const{paused:s}=this.b.$state,i=1===t,o=3===t;switch(o&&this.c("waiting",void 0,e),s()&&(o||i)&&(this.E?.resolve(),this.E=null,this.c("play",void 0,e)),t){case 5:this.md(e);break;case 1:this.c("playing",void 0,e);break;case 2:this.Aa(e);break;case 0:this.Db(e)}this.mc=t}hd({info:t},e){if(!t)return;const{title:s,duration:a,playbackRate:c}=this.b.$state;if((0,i.t)(t.videoData)&&t.videoData.title!==s()&&this.c("title-change",t.videoData.title,e),(0,i.a)(t.duration)&&t.duration!==a()){if((0,i.a)(t.videoLoadedFraction)){const s=t.progressState?.loaded??t.videoLoadedFraction*t.duration,i=new o.T(0,t.duration);this.ic(s,i,e)}this.c("duration-change",t.duration,e)}if((0,i.a)(t.playbackRate)&&t.playbackRate!==c()&&this.c("rate-change",t.playbackRate,e),t.progressState){const{current:s,seekableStart:i,seekableEnd:c,loaded:n,duration:r}=t.progressState;this.Eb(s,e),this.ic(n,new o.T(i,c),e),r!==a()&&this.c("duration-change",r,e)}if((0,i.a)(t.volume)&&(0,i.u)(t.muted)){const s={muted:t.muted,volume:t.volume/100};this.c("volume-change",s,e)}(0,i.a)(t.playerState)&&t.playerState!==this.mc&&this.Rg(t.playerState,e)}H(){this.mc=-1,this.nc=-1,this.Fa=0,this.Ga=new o.T(0,0),this.E=null,this.G=null}}}}]); \ No newline at end of file diff --git a/assets/js/7260.4f6c839d.js b/assets/js/8766.7a276eed.js similarity index 55% rename from assets/js/7260.4f6c839d.js rename to assets/js/8766.7a276eed.js index 12c40b29e..b72448f29 100644 --- a/assets/js/7260.4f6c839d.js +++ b/assets/js/8766.7a276eed.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7260],{7260:(a,e,s)=>{s.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8766],{8766:(a,e,s)=>{s.r(e)}}]); \ No newline at end of file diff --git a/assets/js/9060.96108a11.js b/assets/js/9155.4f288999.js similarity index 55% rename from assets/js/9060.96108a11.js rename to assets/js/9155.4f288999.js index 776a5913b..15ed3be10 100644 --- a/assets/js/9060.96108a11.js +++ b/assets/js/9155.4f288999.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9060],{1440:(a,e,s)=>{s.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9155],{9155:(a,e,s)=>{s.r(e)}}]); \ No newline at end of file diff --git a/assets/js/940.57769f50.js b/assets/js/940.57769f50.js deleted file mode 100644 index 89a8a3be4..000000000 --- a/assets/js/940.57769f50.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[940],{3320:(e,t,s)=>{s.r(t),s.d(t,{SSAParser:()=>p,default:()=>b});var a=s(6632);const r=/^Format:[\s\t]*/,i=/^Style:[\s\t]*/,n=/^Dialogue:[\s\t]*/,l=/[\s\t]*,[\s\t]*/,c=/\{[^}]+\}/g,h=/\\N/g,o=/^\[(.*)[\s\t]?Styles\]$/,u=/^\[(.*)[\s\t]?Events\]$/;class p{f;O=0;a=null;j=[];k=[];N=null;d;P={};async init(e){this.f=e,e.errors&&(this.d=(await s.e(1256).then(s.bind(s,1256))).ParseErrorBuilder)}parse(e,t){if(this.O)switch(this.O){case 1:if(""===e)this.O=0;else if(i.test(e))if(this.N){const t=e.replace(i,"").split(l);this.S(t)}else this.e(this.d?.T("Style",t));else r.test(e)?this.N=e.replace(r,"").split(l):u.test(e)&&(this.N=null,this.O=2);break;case 2:if(""===e)this.Q();else if(n.test(e))if(this.Q(),this.N){const s=e.replace(n,"").split(l),a=this.U(s,t);a&&(this.a=a)}else this.e(this.d?.T("Dialogue",t));else this.a?this.a.text+="\n"+e.replace(c,"").replace(h,"\n"):r.test(e)?this.N=e.replace(r,"").split(l):o.test(e)?(this.N=null,this.O=1):u.test(e)&&(this.N=null)}else""===e||(o.test(e)?(this.N=null,this.O=1):u.test(e)&&(this.N=null,this.O=2))}done(){return{metadata:{},cues:this.j,regions:[],errors:this.k}}Q(){this.a&&(this.j.push(this.a),this.f.onCue?.(this.a),this.a=null)}S(e){let t,s,a,r,i="Default",n={},l="center",c="bottom",h=1.2,o=3,u=[];for(let p=0;p=4&&(c=d>=7?"top":"center"),d%3){case 1:l="start";break;case 2:l="center";break;case 3:l="end"}}}if(n.R=c,n["--cue-white-space"]="normal",n["--cue-line-height"]="normal",n["--cue-text-align"]=l,"center"===c?(n["--cue-top"]="50%",u.push("translateY(-50%)")):n[`--cue-${c}`]=(s||0)+"px",1===o&&(n["--cue-padding-y"]="0"),(1===o||r)&&(n["--cue-bg-color"]=1===o?"none":r),3===o&&a&&(n["--cue-outline"]=`${t}px solid ${a}`),1===o&&"number"==typeof t){const e=r??"#000";n["--cue-text-shadow"]=[a&&d(1.2*t,1.2*h,a),a?d(t*(t/2),h*(t/2),e):d(t,h,e)].filter(Boolean).join(", ")}u.length&&(n["--cue-transform"]=u.join(" ")),this.P[i]=n}U(e,t){const s=this.V(e),r=this.o(s.Start,s.End,t);if(!r)return;const i=new a.b(r[0],r[1],""),n={...this.P[s.Style]||{}},l=s.Name?``:"",o=n.R,u=s.MarginL&&parseFloat(s.MarginL),p=s.MarginR&&parseFloat(s.MarginR),f=s.MarginV&&parseFloat(s.MarginV);return u&&(n["--cue-width"]="auto",n["--cue-left"]=u+"px"),p&&(n["--cue-width"]="auto",n["--cue-right"]=p+"px"),f&&"center"!==o&&(n[`--cue-${o}`]=f+"px"),i.text=l+e.slice(this.N.length-1).join(", ").replace(c,"").replace(h,"\n"),delete n.R,Object.keys(n).length&&(i.style=n),i}V(e){const t={};for(let s=0;sr)return[r,i];null===r&&this.e(this.d?.q(e,s)),null===i&&this.e(this.d?.r(t,s)),null!=r&&null!==i&&i>r&&this.e(this.d?.s(r,i,s))}e(e){if(e){if(this.k.push(e),this.f.strict)throw this.f.cancel(),e;this.f.onError?.(e)}}}function f(e){const t=parseInt(e.replace("&H",""),16);return t>=0?"rgba("+[255&t,t>>8&255,t>>16&255,(t>>24&255^255)/255].join(",")+")":null}function d(e,t,s){const a=Math.ceil(2*Math.PI*e);let r="";for(let i=0;i{s.r(e);var i=s(4158),n=s(216),o=s(8457);class a extends((0,i.H)(HTMLElement,n.M)){constructor(){super(...arguments),this.A=null,this.Vj=null}static{this.tagName="media-provider"}onSetup(){this.a=(0,o.u)(),this.setAttribute("keep-alive","")}onDestroy(){this.Vj?.remove(),this.Vj=null,this.A?.remove(),this.A=null}onConnect(){(0,i.e)((()=>{const t=this.$state.loader(),e=t?.canPlay({src:"",type:"video/youtube"}),s=t?.canPlay({src:"",type:"video/vimeo"}),n=e||s,o=t?n?this.ek():"audio"===t.mediaType()?this.fk():this.Yj():null;if(this.A!==o){const t=this.A?.parentElement??this;this.A?.remove(),this.A=o,o&&t.prepend(o),n&&o&&(0,i.e)((()=>{const{$iosControls:t}=this.a,{controls:e}=this.a.$state,s=e()||t();s?(this.Vj?.remove(),this.Vj=null):(this.Vj=this.querySelector(".vds-blocker")??document.createElement("div"),this.Vj.classList.add("vds-blocker"),o.after(this.Vj)),(0,i.k)(o,"data-no-controls",!s)}))}e?o?.classList.add("vds-youtube"):s&&o?.classList.add("vds-vimeo"),n||(this.Vj?.remove(),this.Vj=null),this.load(o)}))}fk(){const t=this.A instanceof HTMLAudioElement?this.A:document.createElement("audio");(0,i.k)(t,"preload","none"),(0,i.k)(t,"aria-hidden","true");const{controls:e,crossorigin:s}=this.a.$state;return(0,i.e)((()=>{(0,i.k)(t,"controls",e()),(0,i.k)(t,"crossorigin",s())})),t}Yj(){const t=this.A instanceof HTMLVideoElement?this.A:document.createElement("video"),{controls:e,crossorigin:s,poster:n}=this.a.$state,{$iosControls:o}=this.a,a=(0,i.n)((()=>e()||o()?"":null)),r=(0,i.n)((()=>n()&&(e()||o())?n():null));return(0,i.e)((()=>{(0,i.k)(t,"controls",a()),(0,i.k)(t,"crossorigin",s()),(0,i.k)(t,"poster",r())})),t}ek(){return this.A instanceof HTMLIFrameElement?this.A:document.createElement("iframe")}}class r extends((0,i.H)(HTMLElement,n.a)){static{this.tagName="media-player"}static{this.attrs={preferNativeHLS:"prefer-native-hls"}}}(0,i.d)(r),(0,i.d)(a)}}]); \ No newline at end of file diff --git a/assets/js/9701.b24d9e9c.js b/assets/js/9701.b24d9e9c.js new file mode 100644 index 000000000..876d86dfa --- /dev/null +++ b/assets/js/9701.b24d9e9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9701],{9701:(t,e,i)=>{i.r(e),i.d(e,{CaptionsRenderer:()=>s.C,ParseError:()=>s.P,ParseErrorCode:()=>s.c,TextCue:()=>s.T,VTTCue:()=>s.b,VTTRegion:()=>s.h,createVTTCueTemplate:()=>s.i,parseByteStream:()=>s.e,parseResponse:()=>s.d,parseText:()=>s.f,parseTextStream:()=>s.g,parseVTTTimestamp:()=>s.p,renderVTTCueString:()=>s.r,renderVTTTokensString:()=>s.j,tokenizeVTTCue:()=>s.t,updateTimedVTTCueNodes:()=>s.u});var s=i(8254)},8254:(t,e,i)=>{i.d(e,{C:()=>ft,P:()=>n,T:()=>d,V:()=>z,a:()=>$,b:()=>g,c:()=>s,d:()=>h,e:()=>u,f:()=>l,g:()=>c,h:()=>m,i:()=>D,j:()=>J,p:()=>M,r:()=>G,t:()=>W,u:()=>K});const s={LoadFail:0,BadSignature:1,BadTimestamp:2,BadSettingValue:3,BadFormat:4,UnknownSetting:5};class n extends Error{code;line;constructor(t){super(t.reason),this.code=t.code,this.line=t.line}}const r=/\r?\n|\r/gm;class o{writable;readable;constructor(t){const e=new a(t);this.writable=new WritableStream({write(t){e.transform(t)},close(){e.close()}}),this.readable=new ReadableStream({start(t){e.onLine=e=>t.enqueue(e),e.onClose=()=>t.close()}})}}class a{x="";y;onLine;onClose;constructor(t){this.y=new TextDecoder(t)}transform(t){this.x+=this.y.decode(t,{stream:!0});const e=this.x.split(r);this.x=e.pop()||"";for(let t=0;t=0&&e<=100?e:null}function v(t){if(!t.includes(","))return null;const[e,i]=t.split(",").map(y);return null!==e&&null!==i?[e,i]:null}function T(t){const e=parseFloat(t);return Number.isNaN(e)?null:e}const x=/[:=]/,k=/^[\s\t]*(region|vertical|line|position|size|align)[:=]/,A=/^REGION:?[\s\t]+/,C=/[\s\t]+/,E=/[\s\t]*-->[\s\t]+/,N=/start|center|end|left|right/,j=/start|center|end/,L=/line-(?:left|right)|center|auto/,S=/^(?:(\d{1,2}):)?(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;var $=(t=>(t[t.None=0]="None",t[t.Header=1]="Header",t[t.Cue=2]="Cue",t[t.Region=3]="Region",t[t.Note=4]="Note",t))($||{});class z{f;c=0;g={};h={};j=[];a=null;b=null;k=[];d;l="";async init(t){this.f=t,t.strict&&(this.c=1),t.errors&&(this.d=(await i.e(5699).then(i.bind(i,5699))).ParseErrorBuilder)}parse(t,e){if(""===t)this.a?(this.j.push(this.a),this.f.onCue?.(this.a),this.a=null):this.b?(this.h[this.b.id]=this.b,this.f.onRegion?.(this.b),this.b=null):1===this.c&&(this.i(t,e),this.f.onHeaderMetadata?.(this.g)),this.c=0;else if(this.c)switch(this.c){case 1:this.i(t,e);break;case 2:if(this.a){const i=this.a.text.length>0;!i&&k.test(t)?this.m(t.split(C),e):this.a.text+=(i?"\n":"")+t}break;case 3:this.n(t.split(C),e)}else if(t.startsWith("NOTE"))this.c=4;else if(t.startsWith("REGION"))this.c=3,this.b=new m,this.n(t.replace(A,"").split(C),e);else if(t.includes("--\x3e")){const i=this.o(t,e);i&&(this.a=new g(i[0],i[1],""),this.a.id=this.l,this.m(i[2],e)),this.c=2}else 1===e&&this.i(t,e);this.l=t}done(){return{metadata:this.g,cues:this.j,regions:Object.values(this.h),errors:this.k}}i(t,e){if(e>1){if(x.test(t)){const[e,i]=t.split(x);e&&(this.g[e]=(i||"").replace(C,""))}}else t.startsWith("WEBVTT")?this.c=1:this.e(this.d?.p())}o(t,e){const[i,s=""]=t.split(E),[n,...r]=s.split(C),o=M(i),a=M(n);if(null!==o&&null!==a&&a>o)return[o,a,r];null===o&&this.e(this.d?.q(i,e)),null===a&&this.e(this.d?.r(n,e)),null!=o&&null!==a&&a>o&&this.e(this.d?.s(o,a,e))}n(t,e){let i;for(let s=0;s59||n>59?null:3600*i+60*s+n+r/1e3}var V=Object.freeze({__proto__:null,VTTBlock:$,VTTParser:z,default:function(){return new z},parseVTTTimestamp:M});const B=/[0-9]/,H=/[\s\t]+/,R={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span",timestamp:"span"},F={"&":"&","<":"<",">":">",""":'"',"'":"'"," ":" ","‎":"‎","‏":"‏"},I=/&(?:amp|lt|gt|quot|#(0+)?39|nbsp|lrm|rlm);/g,O=new Set(["white","lime","cyan","red","yellow","magenta","blue","black"]),P=new Set(Object.keys(R));function W(t){let e,i="",s=1,n=[],r=[];for(let n=0;n":o(),s=1;break;default:!i&&B.test(c)&&(s=6),i+=c}break;case 3:switch(c){case"\t":case" ":case"\n":a(),e&&e.class?.trim(),s=4;break;case".":a();break;case">":a(),e&&e.class?.trim(),s=1;break;default:i+=c}break;case 4:">"===c?(i=i.replace(H," "),"v"===e?.type?e.voice=q(i):"lang"===e?.type&&(e.lang=q(i)),i="",s=1):i+=c;break;case 5:">"===c&&(i="",e=r.pop(),s=1);break;case 6:if(">"===c){const n=M(i);null!==n&&n>=t.startTime&&n<=t.endTime&&(i="timestamp",o(),e.time=n),i="",s=1}else i+=c}}function o(){if(P.has(i)){const s=e;e={tagName:R[t=i],type:t,children:[]},s?(r[r.length-1]!==s&&r.push(s),s.children.push(e)):n.push(e)}var t;i="",s=1}function a(){if(e&&i){const t=i.replace("bg_","");O.has(t)?e[i.startsWith("bg_")?"bgColor":"color"]=t:e.class=e.class?e.class+" "+i:i}i=""}function l(){if(!i)return;const t={type:"text",data:q(i)};e?e.children.push(t):n.push(t),i=""}return 1===s&&l(),n}function q(t){return t.replace(I,(t=>F[t]||"'"))}function _(t,e,i){t.style.setProperty(`--${e}`,i+"")}function X(t,e,i=!0){t.setAttribute(`data-${e}`,!0===i?"":i+"")}function Y(t,e){t.setAttribute("data-part",e)}function D(t){if(f)throw Error("[media-captions] called `createVTTCueTemplate` on the server - use `renderVTTCueString`");const e=document.createElement("template");return e.innerHTML=G(t),{cue:t,content:e.content}}function G(t,e=0){return J(W(t),e)}function J(t,e=0){let i,s="";for(const n of t)if("text"===n.type)s+=n.data;else{const t="timestamp"===n.type;i={},i.class=n.class,i.title="v"===n.type&&n.voice,i.lang="lang"===n.type&&n.lang,i["data-part"]="v"===n.type&&"voice",t&&(i["data-part"]="timed",i["data-time"]=n.time,i["data-future"]=n.time>e,i["data-past"]=n.timet[1])).map((t=>`${t[0]}="${!0===t[1]?"":t[1]}"`)).join(" ");s+=`<${n.tagName}${r?" "+r:""}>${J(n.children)}`}return s}function K(t,e){if(!f)for(const i of t.querySelectorAll('[data-part="timed"]')){const t=Number(i.getAttribute("data-time"));Number.isNaN(t)||(t>e?X(i,"future"):i.removeAttribute("data-future"),t=s.left&&i.top<=s.bottom&&i.bottom>=s.top)return e[n];var i,s;return null}function et(t,e){return e.top>=0&&e.bottom<=t.height&&e.left>=0&&e.right<=t.width}function it(t,e,i){switch(i){case"+x":return e.left<0;case"-x":return e.right>t.width;case"+y":return e.top<0;case"-y":return e.bottom>t.height}}function st(t,e){return Math.max(0,Math.min(t.width,e.right)-Math.max(0,e.left))*Math.max(0,Math.min(t.height,e.bottom)-Math.max(0,e.top))/(t.height*t.width)}function nt(t,e){return{top:e.top/t.height,left:e.left/t.width,right:(t.width-e.right)/t.width,bottom:(t.height-e.bottom)/t.height}}function rt(t,e){return e.top=e.top*t.height,e.left=e.left*t.width,e.right=t.width-e.right*t.width,e.bottom=t.height-e.bottom*t.height,e}const ot=["top","left","right","bottom"];function at(t,e,i,s){const n=nt(e,i);for(const e of ot)_(t,`${s}-${e}`,100*n[e]+"%")}function lt(t,e,i,s){let n,r=1,o={...e};for(let a=0;al&&(n={...e},r=l),e={...o}}return n||o}const ct=Symbol(0);function ht(t,e,i,s){let n,r=i.firstElementChild,o=function(t){return"auto"===t.line?t.snapToLines?-1:100:t.line}(e),a=[];if(i[U]||(i[U]=function(t,e){const i=Q(e),s=function(t){const e={};for(const i of ot)e[i]=parseFloat(t.style.getPropertyValue(`--cue-${i}`));return e}(e);if(e[ct]=!1,s.top&&(i.top=s.top,i.bottom=s.top+i.height,e[ct]="top"),s.bottom){const n=t.height-s.bottom;i.top=n-i.height,i.bottom=n,e[ct]="bottom"}return s.left&&(i.left=s.left),s.right&&(i.right=t.width-s.right),nt(t,i)}(t,i)),n=rt(t,{...i[U]}),i[ct])a=["top"===i[ct]?"+y":"-y","+x","-x"];else if(e.snapToLines){let i;switch(e.vertical){case"":a=["+y","-y"],i="height";break;case"rl":a=["+x","-x"],i="width";break;case"lr":a=["-x","+x"],i="width"}let s=parseFloat(getComputedStyle(r).lineHeight)||0,l=s*Math.round(o),c=t[i]+s,h=a[0];Math.abs(l)>c&&(l=l<0?-1:1,l*=Math.ceil(c/s)*s),o<0&&(l+=""===e.vertical?t.height:t.width,a=a.reverse()),Z(n,h,l)}else{const i=""===e.vertical,s=i?"+y":"+x",r=i?n.height:n.width;Z(n,s,(i?t.height:t.width)*o/100),Z(n,s,"center"===e.lineAlign?r/2:"end"===e.lineAlign?r:0),a=i?["-y","+y","-x","+x"]:["-x","+x","-y","+y"]}return n=lt(t,n,s,a),at(i,t,n,"cue"),n}const ut=["-y","+y","-x","+x"];function dt(t,e,i,s){let n=Array.from(i.querySelectorAll('[data-part="cue-display"]')),r=0,o=Math.max(0,n.length-e.lines);for(let t=n.length-1;t>=o;t--)r+=n[t].offsetHeight;_(i,"region-height",r+"px"),i[U]||(i[U]=nt(t,Q(i)));let a={...i[U]};return a=rt(t,a),a.width=i.clientWidth,a.height=r,a.right=a.left+a.width,a.bottom=a.top+r,a=lt(t,a,s,ut),at(i,t,a,"region"),a}class ft{overlay;z;A=0;C="ltr";B=[];D=!1;E;h=new Map;j=new Map;get dir(){return this.C}set dir(t){this.C=t,X(this.overlay,"dir",t)}get currentTime(){return this.A}set currentTime(t){this.A=t,this.update()}constructor(t,e){this.overlay=t,this.dir=e?.dir??"ltr",t.setAttribute("translate","yes"),t.setAttribute("aria-live","off"),t.setAttribute("aria-atomic","true"),Y(t,"captions"),this.G(),this.E=new ResizeObserver(this.I.bind(this)),this.E.observe(t)}changeTrack({regions:t,cues:e}){this.reset(),this.J(t);for(const t of e)this.j.set(t,null);this.update()}addCue(t){this.j.set(t,null),this.update()}removeCue(t){this.j.delete(t),this.update()}update(t=!1){this.H(t)}reset(){this.j.clear(),this.h.clear(),this.B=[],this.overlay.textContent=""}destroy(){this.reset(),this.E.disconnect()}I(){this.D=!0,this.K()}K=function(t,e){let i,s=null;function n(){r(),t(...i),i=void 0}function r(){clearTimeout(s),s=null}return function(){i=[].slice.call(arguments),r(),s=setTimeout(n,50)}}((()=>{this.D=!1,this.G();for(const t of this.h.values())t[U]=null;for(const t of this.j.values())t&&(t[U]=null);this.H(!0)}));G(){this.z=Q(this.overlay),_(this.overlay,"overlay-width",this.z.width+"px"),_(this.overlay,"overlay-height",this.z.height+"px")}H(t=!1){if(!this.j.size||this.D)return;let e,i=[...this.j.keys()].filter((t=>this.A>=t.startTime&&this.A<=t.endTime)).sort(((t,e)=>t.startTime!==e.startTime?t.startTime-e.startTime:t.endTime-e.endTime)),s=i.map((t=>t.region));for(let n=0;nX(r,"active"))),t=!0),n.isConnected||((r||this.overlay).append(n),t=!0)}if(t){const t=[],s=new Set;for(let n=i.length-1;n>=0;n--){if(e=i[n],s.has(e.region||e))continue;const r=this.F(e),o=r?this.h.get(e.region.id):this.j.get(e);r?t.push(dt(this.z,e.region,o,t)):t.push(ht(this.z,e,o,t)),s.add(r?e.region:e)}}K(this.overlay,this.A),this.B=i}J(t){if(t)for(const e of t){const t=this.M(e);this.h.set(e.id,t),this.overlay.append(t)}}M(t){const e=document.createElement("div");return Y(e,"region"),X(e,"id",t.id),X(e,"scroll",t.scroll),_(e,"region-width",t.width+"%"),_(e,"region-anchor-x",t.regionAnchorX),_(e,"region-anchor-y",t.regionAnchorY),_(e,"region-viewport-anchor-x",t.viewportAnchorX),_(e,"region-viewport-anchor-y",t.viewportAnchorY),_(e,"region-lines",t.lines),e}L(t){const e=document.createElement("div"),i=function(t){if("auto"===t.position)switch(t.align){case"start":case"left":return 0;case"right":case"end":return 100;default:return 50}return t.position}(t),s=function(t,e){if("auto"===t.positionAlign)switch(t.align){case"start":return"ltr"===e?"line-left":"line-right";case"end":return"ltr"===e?"line-right":"line-left";case"center":return"center";default:return`line-${t.align}`}return t.positionAlign}(t,this.C);if(Y(e,"cue-display"),""!==t.vertical&&X(e,"vertical"),_(e,"cue-text-align",t.align),t.style)for(const i of Object.keys(t.style))e.style.setProperty(i,t.style[i]);if(this.F(t))_(e,"cue-offset",i-("line-right"===s?100:"center"===s?50:0)+"%");else if(_(e,"cue-writing-mode",""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl"),!t.style?.["--cue-width"]){let n=i;"line-left"===s?n=100-i:"center"===s&&i<=50?n=2*i:"center"===s&&i>50&&(n=2*(100-i));const r=t.size{s.d(i,{R:()=>a});var e=s(4158);class a{constructor(t){this.Ca=t}Bb(){(0,e.i)(this.ca)&&this.Oe()}ra(){(0,e.a)(this.ca)&&window.cancelAnimationFrame(this.ca),this.ca=void 0}Oe(){this.ca=window.requestAnimationFrame((()=>{(0,e.i)(this.ca)||(this.Ca(),this.Oe())}))}}},9713:(t,i,s)=>{s.r(i),s.d(i,{HLSProvider:()=>l});var e=s(4123),a=s(5781),h=s(4699),r=s(4158),n=s(5145),c=s(1501);class d{constructor(t){this.m=t,this.g=null,this.nd=null,this.od={},this.pd=new Set,this.yk=-1}get instance(){return this.g}setup(t,i){this.b=i;const s=(0,r.p)(i.$state.streamType).includes("live"),e=(0,r.p)(i.$state.streamType).includes("ll-");this.g=new t({lowLatencyMode:e,backBufferLength:e?4:s?8:void 0,renderTextTracksNatively:!1,...this.od});const a=this.Sg.bind(this);for(const i of Object.values(t.Events))this.g.on(i,a);this.g.on(t.Events.ERROR,this.U.bind(this));for(const t of this.pd)t(this.g);i.player.dispatch(new r.D("hls-instance",{detail:this.g})),this.g.attachMedia(this.m),this.g.on(t.Events.FRAG_LOADING,this.Bk.bind(this)),this.g.on(t.Events.AUDIO_TRACK_SWITCHED,this.Tg.bind(this)),this.g.on(t.Events.LEVEL_SWITCHED,this.Ug.bind(this)),this.g.on(t.Events.LEVEL_LOADED,this.Vg.bind(this)),this.g.on(t.Events.NON_NATIVE_TEXT_TRACKS_FOUND,this.Wg.bind(this)),this.g.on(t.Events.CUES_PARSED,this.Xg.bind(this)),i.qualities[n.Q.Za]=this.Yg.bind(this),(0,r.l)(i.qualities,"change",this.fb.bind(this)),(0,r.l)(i.audioTracks,"change",this.Zg.bind(this)),this.nd=(0,r.e)(this._g.bind(this))}_g(){if(!this.b.$state.live())return;const t=new c.R(this.$g.bind(this));return t.Bb(),t.ra.bind(t)}$g(){this.b.$state.liveSyncPosition.set(this.g?.liveSyncPosition??1/0)}Sg(t,i){var s;this.b.player?.dispatch(new r.D((s=t,(0,r.K)(s)),{detail:i}))}Wg(t,i){const s=new r.D(t,{detail:i});let a=-1;for(let t=0;t{"showing"===n.mode?(this.g.subtitleTrack=t,a=t):a===t&&(this.g.subtitleTrack=-1,a=-1)},h.default&&n.setMode("showing",s),this.b.textTracks.add(n,s)}}Xg(t,i){const s=this.b.textTracks.getById(`hls-${i.track}`);if(!s)return;const e=new r.D(t,{detail:i});for(const t of i.cues)t.positionAlign="auto",s.addCue(t,e)}Tg(t,i){const s=this.b.audioTracks[i.id];s&&this.b.audioTracks[a.L.pa](s,!0,new r.D(t,{detail:i}))}Ug(t,i){const s=this.b.qualities[i.level];s&&this.b.qualities[a.L.pa](s,!0,new r.D(t,{detail:i}))}Vg(t,i){if(this.b.$state.canPlay())return;const{type:s,live:e,totalduration:h,targetduration:c}=i.details,d=new r.D(t,{detail:i});this.b.delegate.c("stream-type-change",e?"EVENT"===s&&Number.isFinite(h)&&c>=10?"live:dvr":"live":"on-demand",d),this.b.delegate.c("duration-change",h,d);const o=this.g.media;-1===this.g.currentLevel&&this.b.qualities[n.Q.Ya](!0,d);for(const t of this.g.audioTracks)this.b.audioTracks[a.L.oa]({id:t.id+"",label:t.name,language:t.lang||"",kind:"main"},d);for(const t of this.g.levels)this.b.qualities[a.L.oa]({id:(t.id??t.height+"p")+"",width:t.width,height:t.height,codec:t.codecSet,bitrate:t.bitrate},d);o.dispatchEvent(new r.D("canplay",{trigger:d}))}U(t,i){if(i.fatal)switch(i.type){case"networkError":this.Ck(i.error);break;case"mediaError":this.g?.recoverMediaError();break;default:this.Ak(i.error)}}Bk(){this.yk>=0&&this.zk()}Ck(t){this.zk(),this.g?.startLoad(),this.yk=window.setTimeout((()=>{this.yk=-1,this.Ak(t)}),5e3)}zk(){clearTimeout(this.yk),this.yk=-1}Ak(t){this.g?.destroy(),this.g=null,this.b.delegate.c("error",{message:t.message,code:1,error:t})}Yg(){this.g&&(this.g.currentLevel=-1)}fb(){const{qualities:t}=this.b;this.g&&!t.auto&&(this.g[t.switch+"Level"]=t.selectedIndex,a.I&&(this.m.currentTime=this.m.currentTime))}Zg(){const{audioTracks:t}=this.b;this.g&&this.g.audioTrack!==t.selectedIndex&&(this.g.audioTrack=t.selectedIndex)}Dk(t){(0,r.r)(t.src)&&(this.zk(),this.g?.loadSource(t.src))}ah(){this.zk(),this.b&&(this.b.qualities[n.Q.Za]=void 0),this.g?.destroy(),this.g=null,this.nd?.(),this.nd=null}}class o{constructor(t,i,s){this.W=t,this.b=i,this.Ca=s,this.bh()}async bh(){const t={onLoadStart:this.Ea.bind(this),onLoaded:this.qd.bind(this),onLoadError:this.ch.bind(this)};let i=await async function(t,i={}){if((0,r.r)(t)){i.onLoadStart?.();try{if(await(0,e.l)(t),!(0,r.x)(window.Hls))throw Error("");const s=window.Hls;return i.onLoaded?.(s),s}catch(t){i.onLoadError?.(t)}}}(this.W,t);if((0,r.i)(i)&&!(0,r.r)(this.W)&&(i=await async function(t,i={}){if(!(0,r.i)(t)){if(i.onLoadStart?.(),t.prototype&&t.prototype!==Function)return i.onLoaded?.(t),t;try{const s=(await t())?.default;if(!s||!s.isSupported)throw Error("");return i.onLoaded?.(s),s}catch(t){i.onLoadError?.(t)}}}(this.W,t)),!i)return null;if(!i.isSupported()){const t="[vidstack]: `hls.js` is not supported in this environment";return this.b.player.dispatch(new r.D("hls-unsupported")),this.b.delegate.c("error",{message:t,code:4}),null}return i}Ea(){this.b.player.dispatch(new r.D("hls-lib-load-start"))}qd(t){this.b.player.dispatch(new r.D("hls-lib-loaded",{detail:t})),this.Ca(t)}ch(t){const i=(0,n.c)(t);this.b.player.dispatch(new r.D("hls-lib-load-error",{detail:i})),this.b.delegate.c("error",{message:i.message,code:4,error:i})}}class l extends h.VideoProvider{constructor(){super(...arguments),this.$$PROVIDER_TYPE="HLS",this.Xe=null,this.d=new d(this.video),this.Gb="https://cdn.jsdelivr.net/npm/hls.js@^1.0.0/dist/hls.min.js"}get ctor(){return this.Xe}get instance(){return this.d.instance}static{this.supported=(0,a.i)()}get type(){return"hls"}get canLiveSync(){return!0}get config(){return this.d.od}set config(t){this.d.od=t}get library(){return this.Gb}set library(t){this.Gb=t}preconnect(){(0,r.r)(this.Gb)&&(0,e.p)(this.Gb)}setup(t){super.setup(t),new o(this.Gb,t,(i=>{this.Xe=i,this.d.setup(i,t),t.delegate.c("provider-setup",this);const s=(0,r.p)(t.$state.source);s&&this.loadSource(s)}))}async loadSource(t,i){(0,r.r)(t.src)&&(this.a.preload=i||"",this.d.Dk(t),this.V=t)}onInstance(t){const i=this.d.instance;return i&&t(i),this.d.pd.add(t),()=>this.d.pd.delete(t)}destroy(){this.d.ah()}}},8039:(t,i,s)=>{s.d(i,{B:()=>d});var e=s(449),a=s(4158),h=s(1501),r=s(5781);class n{constructor(t,i){this.i=t,this.b=i,this.sa=(0,a.L)(),this.Cb=!1,this.$c=!1,this.ad=!1,this.Da=new h.R(this.bd.bind(this)),this.Qe=void 0,this.Dg=void 0,this.pg(),(0,a.e)(this.qg.bind(this)),(0,a.o)(this.cd.bind(this))}get a(){return this.i.media}get c(){return this.b.delegate.c}cd(){this.$c=!1,this.ad=!1,this.Da.ra(),this.sa.empty()}bd(){const t=this.a.currentTime;this.b.$state.currentTime()!==t&&this.$a(t)}pg(){this.t("loadstart",this.Ea),this.t("abort",this.Pe),this.t("emptied",this.rg),this.t("error",this.U),this.t("volumechange",this.ab)}sg(){this.$c||(this.sa.add(this.t("loadeddata",this.tg),this.t("loadedmetadata",this.ug),this.t("canplay",this.hc),this.t("canplaythrough",this.vg),this.t("durationchange",this.wg),this.t("play",this.xb),this.t("progress",this.ic),this.t("stalled",this.xg),this.t("suspend",this.yg)),this.$c=!0)}zg(){this.ad||(this.sa.add(this.t("pause",this.Aa),this.t("playing",this.Ag),this.t("ratechange",this.Bg),this.t("seeked",this.bb),this.t("seeking",this.Cg),this.t("ended",this.Db),this.t("waiting",this.dd)),this.ad=!0)}t(t,i){return(0,a.l)(this.a,t,i.bind(this))}Eg(t){}$a(t,i){const s={currentTime:Math.min(t,this.b.$state.seekableEnd()),played:this.a.played};this.c("time-update",s,i)}Ea(t){3!==this.a.networkState?(this.sg(),this.c("load-start",void 0,t)):this.Pe(t)}Pe(t){this.c("abort",void 0,t)}rg(){this.c("emptied",void 0,event)}tg(t){this.c("loaded-data",void 0,t)}ug(t){this.zg(),this.c("loaded-metadata",void 0,t),r.g&&(0,e.i)(this.b.$state.source())&&this.b.delegate.jc(this.ed(),t)}ed(){return{provider:(0,a.p)(this.b.$provider),duration:this.a.duration,buffered:this.a.buffered,seekable:this.a.seekable}}xb(t){this.b.$state.canPlay&&this.c("play",void 0,t)}Aa(t){(1!==this.a.readyState||this.Cb)&&(this.Cb=!1,this.Da.ra(),this.c("pause",void 0,t))}hc(t){this.b.delegate.jc(this.ed(),t)}vg(t){this.b.$state.started()||this.c("can-play-through",this.ed(),t)}Ag(t){this.Cb=!1,this.c("playing",void 0,t),this.Da.Bb()}xg(t){this.c("stalled",void 0,t),this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}dd(t){this.a.readyState<3&&(this.Cb=!0,this.c("waiting",void 0,t))}Db(t){this.Da.ra(),this.$a(this.a.duration,t),this.c("end",void 0,t),this.b.$state.loop()&&(0,a.M)(this.a.controls)&&(this.a.controls=!1)}qg(){this.b.$state.paused()&&(0,a.l)(this.a,"timeupdate",this.Eb.bind(this))}Eb(t){this.$a(this.a.currentTime,t)}wg(t){this.b.$state.ended()&&this.$a(this.a.duration,t),this.c("duration-change",this.a.duration,t)}ab(t){const i={volume:this.a.volume,muted:this.a.muted};this.c("volume-change",i,t)}bb(t){this.$a(this.a.currentTime,t),this.c("seeked",this.a.currentTime,t),Math.trunc(this.a.currentTime)===Math.trunc(this.a.duration)&&(0,e.g)(this.a.duration)>(0,e.g)(this.a.currentTime)&&(this.$a(this.a.duration,t),this.a.ended||this.b.player.dispatch(new a.D("media-play-request",{trigger:t})))}Cg(t){this.c("seeking",this.a.currentTime,t)}ic(t){const i={buffered:this.a.buffered,seekable:this.a.seekable};this.c("progress",i,t)}yg(t){this.c("suspend",void 0,t)}Bg(t){this.c("rate-change",this.a.playbackRate,t)}U(t){const i=this.a.error;if(!i)return;const s={message:i.message,code:i.code,mediaError:i};this.c("error",s,t)}}class c{constructor(t,i){this.i=t,this.b=i,this.Fb.onaddtrack=this.Fg.bind(this),this.Fb.onremovetrack=this.Gg.bind(this),this.Fb.onchange=this.Hg.bind(this),(0,a.l)(this.b.audioTracks,"change",this.Ig.bind(this))}get Fb(){return this.i.media.audioTracks}Fg(t){const i=t.track;if(""===i.label)return;const s={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.b.audioTracks[r.L.oa](s,t),i.enabled&&(s.selected=!0)}Gg(t){const i=this.b.audioTracks.getById(t.track.id);i&&this.b.audioTracks[r.L.Yb](i,t)}Hg(t){let i=this.Re();if(!i)return;const s=this.b.audioTracks.getById(i.id);s&&this.b.audioTracks[r.L.pa](s,!0,t)}Re(){return Array.from(this.Fb).find((t=>t.enabled))}Ig(t){const{current:i}=t.detail;if(!i)return;const s=this.Fb.getTrackById(i.id);if(s){const t=this.Re();t&&(t.enabled=!1),s.enabled=!0}}}class d{constructor(t){this.a=t,this.scope=(0,a.q)(),this.V=null}setup(t){new n(this,t),"audioTracks"in this.media&&new c(this,t),(0,a.o)((()=>{this.a.setAttribute("src",""),this.a.load()}))}get type(){return""}get media(){return this.a}get currentSrc(){return this.V}setPlaybackRate(t){this.a.playbackRate=t}async play(){return this.a.play()}async pause(){return this.a.pause()}setMuted(t){this.a.muted=t}setVolume(t){this.a.volume=t}setCurrentTime(t){this.a.currentTime=t}setPlaysinline(t){(0,a.k)(this.a,"playsinline",t)}async loadSource({src:t,type:i},s){this.a.preload=s||"",(0,e.a)(t)?this.a.srcObject=t:(this.a.srcObject=null,this.a.src=(0,a.r)(t)?t:window.URL.createObjectURL(t)),this.a.load(),this.V={src:t,type:i}}}},4699:(t,i,s)=>{s.r(i),s.d(i,{VideoProvider:()=>u});var e=s(4158),a=s(5781),h=s(8039),r=s(4123);class n{constructor(t,i){this.m=t,this.b=i,t.textTracks.onaddtrack=this.Wc.bind(this),(0,e.o)(this.cd.bind(this))}Wc(t){const i=t.track;if(!i||function(t,i){return Array.from(t.children).find((t=>t.track===i))}(this.m,i))return;const s=new r.b({id:i.id,kind:i.kind,label:i.label,language:i.language,type:"vtt"});s[r.T.T]={track:i},s[r.T.M]=2,s[r.T.te]=!0;let e=0;const a=t=>{if(i.cues)for(let a=e;a{this.a.delegate.c("picture-in-picture-change",t,i)},(0,e.l)(this.m,"enterpictureinpicture",this.Jg.bind(this)),(0,e.l)(this.m,"leavepictureinpicture",this.Kg.bind(this))}get active(){return document.pictureInPictureElement===this.m}get supported(){return(0,a.d)(this.m)}async enter(){return this.m.requestPictureInPicture()}exit(){return document.exitPictureInPicture()}Jg(t){this.B(!0,t)}Kg(t){this.B(!1,t)}}class d{constructor(t,i){this.m=t,this.a=i,this.I="inline",(0,e.l)(this.m,"webkitpresentationmodechanged",this.Ua.bind(this))}get Se(){return(0,a.e)(this.m)}async kc(t){this.I!==t&&this.m.webkitSetPresentationMode(t)}Ua(t){const i=this.I;this.I=this.m.webkitPresentationMode,this.a.player?.dispatch(new e.D("video-presentation-change",{detail:this.I,trigger:t})),["fullscreen","picture-in-picture"].forEach((s=>{this.I!==s&&i!==s||this.a.delegate.c(`${s}-change`,this.I===s,t)}))}}class o{constructor(t){this.fa=t}get active(){return"fullscreen"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("fullscreen")}async exit(){this.fa.kc("inline")}}class l{constructor(t){this.fa=t}get active(){return"picture-in-picture"===this.fa.I}get supported(){return this.fa.Se}async enter(){this.fa.kc("picture-in-picture")}async exit(){this.fa.kc("inline")}}class u extends h.B{constructor(t,i){super(t),this.$$PROVIDER_TYPE="VIDEO",(0,e.s)((()=>{if((0,a.e)(t)){const s=new d(t,i);this.fullscreen=new o(s),this.pictureInPicture=new l(s)}else(0,a.d)(t)&&(this.pictureInPicture=new c(t,i))}),this.scope)}get type(){return"video"}setup(t){super.setup(t),(0,a.b)(this.video)&&new n(this.video,t),t.textRenderers.Fe(this.video),(0,e.o)((()=>{t.textRenderers.Fe(null)})),"video"===this.type&&t.delegate.c("provider-setup",this)}get video(){return this.a}}}}]); \ No newline at end of file diff --git a/assets/js/Applist.html.6b1f9273.js b/assets/js/Applist.html.6b1f9273.js new file mode 100644 index 000000000..21c64a2f2 --- /dev/null +++ b/assets/js/Applist.html.6b1f9273.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7481],{3671:(e,r)=>{r.A=(e,r)=>{const n=e.__vccOpts||e;for(const[e,t]of r)n[e]=t;return n}},3702:(e,r,n)=>{n.r(r),n.d(r,{comp:()=>Xr,data:()=>Zr});var t=n(7847);const l=(0,t.Lk)("p",null,"Windows 自用软件,以开源软件为主。",-1),o=(0,t.Lk)("h2",{id:"知识记录",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#知识记录"},[(0,t.Lk)("span",null,"知识记录")])],-1),a=(0,t.Lk)("p",null,[(0,t.eW)("本地笔记:Logseq & Obsidian & 妙笔 & Joplin "),(0,t.Lk)("s",null,"& Wiz 笔记 & OneNote")],-1),i=(0,t.Lk)("p",null,"在线笔记:Notion & 飞书 & flomo & Airtable & 简悦",-1),s=(0,t.Lk)("p",null,[(0,t.eW)("清单日历:滴答清单 & Trello & Habitify & 桌面日历 "),(0,t.Lk)("s",null,"& Workflowy")],-1),p={href:"https://github.com/L-M-Sherlock/sm18-lazy-package/releases/tag/1.1.3",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/kopia/kopia",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/marktext/marktext",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/inkTimeRecord/TTime",target:"_blank",rel:"noopener noreferrer"},b=(0,t.Lk)("s",null,"& 天若 OCR & ABBYY Screenshot Reader OCR",-1),c=(0,t.Lk)("h2",{id:"平面设计",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#平面设计"},[(0,t.Lk)("span",null,"平面设计")])],-1),L={href:"https://github.com/SVG-Edit/svgedit",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html",target:"_blank",rel:"noopener noreferrer"},W=(0,t.Lk)("s",null,"& GIMP & FastStone & illustrator & Dreamweaver & lightroom",-1),g=(0,t.Lk)("p",null,[(0,t.eW)("截图:Snipaste & ShareX "),(0,t.Lk)("s",null,"& webshot & SETUNA")],-1),d=(0,t.Lk)("p",null,[(0,t.eW)("图像管理:Honeyview & Eagle & PicGo 图床 "),(0,t.Lk)("s",null,"& imageglass(界面好,但不支持全图拖拽和压缩包预览图片) & Google 相册 & 看图王 & 呱呱看图")],-1),m={href:"http://luci.criosweb.ro/riot/",target:"_blank",rel:"noopener noreferrer"},w=(0,t.Lk)("s",null,"& 智图",-1),F=(0,t.Lk)("h2",{id:"音频视频",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#音频视频"},[(0,t.Lk)("span",null,"音频视频")])],-1),_={href:"https://github.com/maotoumao/MusicFree",target:"_blank",rel:"noopener noreferrer"},y={href:"http://tieba.baidu.com/p/4434445880",target:"_blank",rel:"noopener noreferrer"},T={href:"https://www.cnblogs.com/vinlxc/p/11347744.html",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/jitwxs/163MusicLyrics",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/lyswhut/lx-music-desktop",target:"_blank",rel:"noopener noreferrer"},C=(0,t.Lk)("s",null,"& 百度音乐 & AIMP3 & 酷我 K 歌 & Airplay",-1),M={href:"https://sspai.com/post/76677",target:"_blank",rel:"noopener noreferrer"},P={href:"https://github.com/audacity/audacity/releases",target:"_blank",rel:"noopener noreferrer"},A=(0,t.Lk)("s",null,"& Audition & 神舌变声器 & Goldwave",-1),x={href:"https://zhuanlan.zhihu.com/p/35757176",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/Hiram-Wong/ZyPlayer/releases",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/Nevcairiel/LAVFilters/releases",target:"_blank",rel:"noopener noreferrer"},R={href:"http://www.madvr.com/",target:"_blank",rel:"noopener noreferrer"},O=(0,t.Lk)("s",null,"& 恒星播放器 & QQ 影音 & 暴风影音 & 射手",-1),V={href:"https://www.likecs.com/show-204327094.html",target:"_blank",rel:"noopener noreferrer"},z={href:"https://shana.pe.kr/shanaencoder_download/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},I=(0,t.Lk)("s",null,"& Shotcut & 500th Video Converter & 小丸工具箱",-1),G={href:"https://github.com/xiaoxinpro/ChineseSubtitleConversionTool",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/wxbool/video-srt-windows",target:"_blank",rel:"noopener noreferrer"},U={href:"https://github.com/ytdl-org/youtube-dl",target:"_blank",rel:"noopener noreferrer"},H={href:"https://github.com/leiurayer/downkyi",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://github.com/nilaoda/BBDown",target:"_blank",rel:"noopener noreferrer"},q={href:"https://xiaoyaliu.notion.site/dc28a32c807d418691b83519fa523306",target:"_blank",rel:"noopener noreferrer"},X=(0,t.Lk)("h2",{id:"屏幕录制",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#屏幕录制"},[(0,t.Lk)("span",null,"屏幕录制")])],-1),Z={href:"https://github.com/MathewSachin/Captura/releases",target:"_blank",rel:"noopener noreferrer"},j={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/faressoft/terminalizer",target:"_blank",rel:"noopener noreferrer"},J={href:"https://www.screentogif.com/",target:"_blank",rel:"noopener noreferrer"},Y=(0,t.Lk)("s",null,"& FlashBack Express",-1),$={href:"https://github.com/alievk/avatarify",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://github.com/Code52/carnac",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/mulaRahul/keyviz",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/cuiliang/ClickShow",target:"_blank",rel:"noopener noreferrer"},te={href:"https://github.com/brookhong/KeyCastOW",target:"_blank",rel:"noopener noreferrer"},le={href:"https://newzone.top/posts/2019-08-26-scrcpy_screen_projection.html",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://gitee.com/xfangfang/Macast/releases/",target:"_blank",rel:"noopener noreferrer"},ae=(0,t.Lk)("h2",{id:"效率工具",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#效率工具"},[(0,t.Lk)("span",null,"效率工具")])],-1),ie=(0,t.Lk)("p",null,"快速启动:",-1),se=(0,t.Lk)("li",null,"Quicker:脚本,全局手势",-1),pe=(0,t.Lk)("li",null,"RunAny:指针快捷启动;一键打开网址、文件路径",-1),ke={href:"https://capslox.com/capslock-plus/#basicFunctions",target:"_blank",rel:"noopener noreferrer"},he={href:"https://www.yuque.com/lucy/lucy/record",target:"_blank",rel:"noopener noreferrer"},ue=(0,t.Lk)("s",null,"、Rolan、nTrun (Win 键启动)",-1),be=(0,t.Lk)("li",null,[(0,t.eW)("启动栏:Listary "),(0,t.Lk)("s",null,"、uTolls、Wox")],-1),ce=(0,t.Lk)("p",null,[(0,t.eW)("剪切板:Ditto & PinStack "),(0,t.Lk)("s",null,"& CopyQ")],-1),Le=(0,t.Lk)("p",null,[(0,t.eW)("时间管理:ManicTime "),(0,t.Lk)("s",null,"& Toggl Track & RescueTime(订阅)")],-1),fe={href:"https://github.com/ssssssss-team/spider-flow",target:"_blank",rel:"noopener noreferrer"},We={href:"https://github.com/Chaoses-Ib/IbEverythingExt",target:"_blank",rel:"noopener noreferrer"},ge=(0,t.Lk)("s",null,"& DocFetcher & Archivarius 3000",-1),de=(0,t.Lk)("h2",{id:"文档管理",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#文档管理"},[(0,t.Lk)("span",null,"文档管理")])],-1),me={href:"https://github.com/qwqcode/SubRenamer",target:"_blank",rel:"noopener noreferrer"},we=(0,t.Lk)("s",null,"& ReNamer & Bulk Rename Utility & 拖把更名器",-1),Fe={href:"https://github.com/WinMerge/winmerge",target:"_blank",rel:"noopener noreferrer"},_e={href:"http://fastcopy.jp/",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://meta.appinn.net/t/topic/31209/1",target:"_blank",rel:"noopener noreferrer"},Te={href:"https://www.appinn.com/localsend/",target:"_blank",rel:"noopener noreferrer"},Se=(0,t.Lk)("s",null,"& 局域网通讯 (酷安) & Send Anywhere & Pushbullet",-1),ve={href:"http://www.dropitproject.com/",target:"_blank",rel:"noopener noreferrer"},Ce={href:"https://www.appinn.com/droppoint/",target:"_blank",rel:"noopener noreferrer"},Me={href:"https://gist.github.com/Nerver4Ever/953447c9ecd330ffc0861d4cbb839369",target:"_blank",rel:"noopener noreferrer"},Pe=(0,t.Lk)("s",null,"& 亿方云 & 金山快盘 & 微云",-1),Ae=(0,t.Lk)("h2",{id:"系统日常",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#系统日常"},[(0,t.Lk)("span",null,"系统日常")])],-1),xe={href:"https://www.onecommander.com/",target:"_blank",rel:"noopener noreferrer"},De={href:"https://www.softwareok.com/?seite=Freeware/Q-Dir",target:"_blank",rel:"noopener noreferrer"},Be=(0,t.Lk)("s",null,"& 360 文件夹 & Clover(UI 不好看)",-1),Re=(0,t.Lk)("p",null,[(0,t.eW)("浏览器:Chrome & Firefox(资源) & Brave(工具/书签) & Edge(移动端) & Tor "),(0,t.Lk)("s",null,"& Vivaldi & Tor & 猎豹 & 360 & 搜狗 & Maxthon & 百度")],-1),Oe=(0,t.Lk)("p",null,[(0,t.eW)("输入法:小狼毫 & "),(0,t.Lk)("code",null,"Win+H"),(0,t.eW)("(系统语音输入)"),(0,t.Lk)("s",null,"& QuickCut & 讯飞语记 & 微软输入法 & 影子输入法 & 搜狗输入法 & 讯飞输入法 & 百度输入法")],-1),Ve=(0,t.Lk)("p",null,[(0,t.eW)("通讯:微信 & TIM & Telegram & Discord & Thunderbird(邮箱) "),(0,t.Lk)("s",null,"& 飞书 & Slack & 钉耙 & 千牛 & 阿里旺旺")],-1),ze={href:"https://newzone.top/posts/2018-05-15-aria2_a_new_download_tool.html",target:"_blank",rel:"noopener noreferrer"},Ee=(0,t.Lk)("s",null,"& FDM(不支持 ed2k、磁力) & 迅雷",-1),Ie=(0,t.Lk)("p",null,[(0,t.eW)("杀毒:火绒 "),(0,t.Lk)("s",null,"& 360 & 金山卫士")],-1),Ge=(0,t.Lk)("p",null,[(0,t.eW)("压缩:Bandizip "),(0,t.Lk)("s",null,"& PeaZip & 好压")],-1),Ne={href:"https://github.com/wmjordan/PDFPatcher",target:"_blank",rel:"noopener noreferrer"},Ue=(0,t.Lk)("s",null,"& 文电通 & foxit 领鲜版(轻量编辑 PDF)",-1),He={href:"https://openhardwaremonitor.org/downloads/",target:"_blank",rel:"noopener noreferrer"},Qe={href:"https://www.msi.com/Landing/afterburner/graphics-cards",target:"_blank",rel:"noopener noreferrer"},qe={href:"http://www.tbtool.cn/",target:"_blank",rel:"noopener noreferrer"},Xe=(0,t.Lk)("s",null,"& SDI Snappy & 驱动精灵 & 鲁大师",-1),Ze={href:"https://github.com/microsoft/PowerToys/releases/latest",target:"_blank",rel:"noopener noreferrer"},je={href:"https://github.com/benbuck/rbtray",target:"_blank",rel:"noopener noreferrer"},Ke={href:"https://github.com/BluePointLilac/ContextMenuManager",target:"_blank",rel:"noopener noreferrer"},Je={href:"https://www.oo-software.com/en/shutup10",target:"_blank",rel:"noopener noreferrer"},Ye={href:"https://www.sordum.org/downloads/?st-windows-update-blocker",target:"_blank",rel:"noopener noreferrer"},$e=(0,t.Lk)("h2",{id:"低频工具",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#低频工具"},[(0,t.Lk)("span",null,"低频工具")])],-1),er={href:"https://github.com/RipplePiam/MobaXterm-Chinese-Simplified",target:"_blank",rel:"noopener noreferrer"},rr={href:"https://kalacloud.com/blog/best-mysql-gui-tools/",target:"_blank",rel:"noopener noreferrer"},nr=(0,t.Lk)("p",null,[(0,t.eW)("翻译词典:DeepL "),(0,t.Lk)("s",null,"& GoldenDict & 欧陆词典 & 有道词典 & QTranslate & Lingoes")],-1),tr=(0,t.Lk)("p",null,[(0,t.eW)("思维导图:TheBrain(无限思维扩展) & Xmind "),(0,t.Lk)("s",null,"& MindManager")],-1),lr=(0,t.Lk)("p",null,"虚拟机:VMware & VirtualBox",-1),or=(0,t.Lk)("p",null,[(0,t.eW)("远程管理:RustDesk & ToDesk "),(0,t.Lk)("s",null,"& AnyDesk & Teamviewer & Remote Utilities & XT800")],-1),ar=(0,t.Lk)("p",null,[(0,t.eW)("卸载清理:IObit Uninstaller & Glary Utilities(注册表清理) "),(0,t.Lk)("s",null,"& Geek Uninstaller")],-1),ir={href:"https://hovancik.net/stretchly/downloads/",target:"_blank",rel:"noopener noreferrer"},sr=(0,t.Lk)("s",null,"& EyeLoveU & iris & f.luxS",-1),pr={href:"http://www.12306bypass.com/",target:"_blank",rel:"noopener noreferrer"},kr={href:"https://www.ventoy.net/cn/index.html",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://www.disktool.cn/",target:"_blank",rel:"noopener noreferrer"},ur=(0,t.Lk)("p",null,[(0,t.eW)("飞书妙记:倍速、跳过空白片段、字幕搜索定位视频,将视频(最长 4 小时)转为文字大纲,了解视频梗概,建立基础认知。等到自己上手实操的时候,遇到问题直接搜索文字定位到相关内容,再看文字对应的视频截图确定配置细节。如果视频过大,可以提取音频来上传。"),(0,t.Lk)("sup",{class:"footnote-ref"},[(0,t.Lk)("a",{href:"#footnote1"},"[1]"),(0,t.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})])],-1),br={href:"https://github.com/mgth/LittleBigMouse",target:"_blank",rel:"noopener noreferrer"},cr=(0,t.Lk)("h2",{id:"android",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#android"},[(0,t.Lk)("span",null,"Android")])],-1),Lr={href:"https://github.com/gkd-kit/gkd",target:"_blank",rel:"noopener noreferrer"},fr={href:"https://github.com/yuliskov/SmartTube",target:"_blank",rel:"noopener noreferrer"},Wr={href:"https://github.com/BlueMatthew/WechatExporter",target:"_blank",rel:"noopener noreferrer"},gr={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},dr={href:"https://sspai.com/post/65863",target:"_blank",rel:"noopener noreferrer"},mr=(0,t.Lk)("hr",null,null,-1),wr=(0,t.Lk)("h2",{id:"小玩意",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#小玩意"},[(0,t.Lk)("span",null,"小玩意")])],-1),Fr={href:"https://www.appinn.com/animated-drawings/",target:"_blank",rel:"noopener noreferrer"},_r=(0,t.Lk)("h2",{id:"已弃",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#已弃"},[(0,t.Lk)("span",null,"已弃")])],-1),yr={href:"https://meta.appinn.net/t/topic/29815",target:"_blank",rel:"noopener noreferrer"},Tr=(0,t.Lk)("li",null,"桌面管理:Fences 3 & 火萤视频桌面 & UPUPOO & 360 桌面助手 & 搜狗桌面 & Q+",-1),Sr=(0,t.Lk)("li",null,"进程管理:Process Lasso(避免老电脑卡顿?会自动删除启动项,不适合主力电脑)& Security Process Explorer(屏蔽垃圾进程)",-1),vr=(0,t.Lk)("li",null,"文件夹锁定/隐藏:Anvide Lock Folder",-1),Cr=(0,t.Lk)("li",null,"桌面便签:小黄条、URNotes 意唯桌面便签 (2015 停止更新,复制经常出错)",-1),Mr=(0,t.Lk)("li",null,"网络电台:龙卷风",-1),Pr=(0,t.Lk)("li",null,"英文写作:易改",-1),Ar=(0,t.Lk)("li",null,"流量管理:cFosSpeed",-1),xr=(0,t.Lk)("li",null,"游戏平台:VS & 4399",-1),Dr={href:"https://github.com/mamoe/mirai",target:"_blank",rel:"noopener noreferrer"},Br=(0,t.Lk)("li",null,"其他:按键精灵、DisplayCal(屏幕)、One Quik(虚拟桌面切换)、Auslogics Disk Defrag(磁盘整理)、Reflector 3(手机投屏)、VoiceBot(声控游戏)",-1),Rr={href:"http://dogbean.ysepan.com/",target:"_blank",rel:"noopener noreferrer"},Or={href:"https://www.bilibili.com/video/BV19a411578T",target:"_blank",rel:"noopener noreferrer"},Vr={href:"https://www.gt4t.cn/",target:"_blank",rel:"noopener noreferrer"},zr={href:"https://github.com/ilyachch/md_docs-trans-app",target:"_blank",rel:"noopener noreferrer"},Er=(0,t.Lk)("p",null,"部分应用推荐来自 @vector090。",-1),Ir=(0,t.Lk)("hr",{class:"footnotes-sep"},null,-1),Gr={class:"footnotes"},Nr={class:"footnotes-list"},Ur={id:"footnote1",class:"footnote-item"},Hr={href:"https://sspai.com/post/70960",target:"_blank",rel:"noopener noreferrer"},Qr=(0,t.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),qr={},Xr=(0,n(3671).A)(qr,[["render",function(e,r){const n=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[l,o,a,i,s,(0,t.Lk)("p",null,[(0,t.eW)("记忆复习:思源笔记 "),(0,t.Lk)("s",null,[(0,t.eW)("& "),(0,t.Lk)("a",p,[(0,t.eW)("SuperMemo"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",k,[(0,t.eW)("kopia"),(0,t.bF)(n)]),(0,t.eW)("(备份) & Anki")])]),(0,t.Lk)("p",null,[(0,t.eW)("文本编辑:Visual Studio Code & Notepad++ & HbuilderX & WPS & office tab "),(0,t.Lk)("s",null,[(0,t.eW)("& "),(0,t.Lk)("a",h,[(0,t.eW)("MarkText"),(0,t.bF)(n)]),(0,t.eW)(" & Slide & 方方格子 & Typora & Yu Writer & UltraEdit")])]),(0,t.Lk)("p",null,[(0,t.eW)("文字识别:"),(0,t.Lk)("a",u,[(0,t.eW)("TTime"),(0,t.bF)(n)]),(0,t.eW)(" & 白描 "),b]),c,(0,t.Lk)("p",null,[(0,t.eW)("设计:Figma & "),(0,t.Lk)("a",L,[(0,t.eW)("SVG-Editor"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",f,[(0,t.eW)("Stable Diffusion"),(0,t.bF)(n)]),(0,t.eW)("(AI 绘图) & Photoshop & 字由 "),W]),g,d,(0,t.Lk)("p",null,[(0,t.eW)("图像处理:PP 鸭(免费版单次 10 张)& gifski(动图)& "),(0,t.Lk)("a",m,[(0,t.eW)("RIOT"),(0,t.bF)(n)]),(0,t.eW)("(压缩) & Inpaint(去水印) & PhotoZoom(无损放大) "),w]),F,(0,t.Lk)("p",null,[(0,t.eW)("音频播放:"),(0,t.Lk)("a",_,[(0,t.eW)("MusicFree"),(0,t.bF)(n)]),(0,t.eW)(" & foobar2000("),(0,t.Lk)("a",y,[(0,t.eW)("MKing 皮肤"),(0,t.bF)(n)]),(0,t.eW)(")& "),(0,t.Lk)("a",T,[(0,t.eW)("MusicTag"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",S,[(0,t.eW)("163MusicLyrics"),(0,t.bF)(n)]),(0,t.eW)("(云歌词下载,支持日文转罗马音)& Listen1& Moon FM(播客) & "),(0,t.Lk)("a",v,[(0,t.eW)("洛雪音乐助手"),(0,t.bF)(n)]),(0,t.eW)("(失效)"),C]),(0,t.Lk)("p",null,[(0,t.eW)("音频处理:"),(0,t.Lk)("a",M,[(0,t.eW)("Reaper+ Ultraschall"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",P,[(0,t.eW)("Audacity"),(0,t.bF)(n)]),(0,t.eW)(" & iZotope rx9 "),A]),(0,t.Lk)("p",null,[(0,t.eW)("视频播放:"),(0,t.Lk)("a",x,[(0,t.eW)("Potplayer"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",D,[(0,t.eW)("ZY Player"),(0,t.bF)(n)]),(0,t.eW)("(直播&在线资源) & "),(0,t.Lk)("a",B,[(0,t.eW)("LAVFilters"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",R,[(0,t.eW)("madVR"),(0,t.bF)(n)]),(0,t.eW)(" & XySubFilter & VLC "),O,(0,t.eW)(",播放器设置参考 "),(0,t.Lk)("a",V,[(0,t.eW)("Potplayer + LAVFilters + madVR 配置教程"),(0,t.bF)(n)])]),(0,t.Lk)("p",null,[(0,t.eW)("视频剪辑:剪映 & LosslessCut(音频提取·视频切割合并) & "),(0,t.Lk)("a",z,[(0,t.eW)("ShanaEncoder"),(0,t.bF)(n)]),(0,t.eW)("(视频压缩) & "),(0,t.Lk)("a",E,[(0,t.eW)("Quick Cut"),(0,t.bF)(n)]),(0,t.eW)(" (自动剪辑) & HandBrake(视频转换) & Premiere "),I]),(0,t.Lk)("p",null,[(0,t.eW)("字幕工具:"),(0,t.Lk)("a",G,[(0,t.eW)("ChineseSubtitleConversionTool"),(0,t.bF)(n)]),(0,t.eW)("(繁简转换)& Arctime Pro & "),(0,t.Lk)("a",N,[(0,t.eW)("VideoSrt"),(0,t.bF)(n)]),(0,t.eW)(" & 人人译视界")]),(0,t.Lk)("p",null,[(0,t.eW)("视频下载:"),(0,t.Lk)("a",U,[(0,t.eW)("youtube-dl"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",H,[(0,t.eW)("哔哩下载姬"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",Q,[(0,t.eW)("BBDown"),(0,t.bF)(n)]),(0,t.eW)("(命令行式哔哩哔哩下载器)")]),(0,t.Lk)("p",null,[(0,t.eW)("影视管理:"),(0,t.Lk)("a",q,[(0,t.eW)("tinyMediaManager"),(0,t.bF)(n)]),(0,t.eW)("(刮削),易影视(本地管理)")]),X,(0,t.Lk)("p",null,[(0,t.eW)("录屏直播:OBS & "),(0,t.Lk)("a",Z,[(0,t.eW)("Captura"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",j,[(0,t.eW)("SplitCam"),(0,t.bF)(n)]),(0,t.eW)(" (摄像头多开) & "),(0,t.Lk)("a",K,[(0,t.eW)("terminalizer"),(0,t.bF)(n)]),(0,t.eW)("(终端录制) & "),(0,t.Lk)("a",J,[(0,t.eW)("ScreenToGif"),(0,t.bF)(n)]),(0,t.eW)(),Y]),(0,t.Lk)("p",null,[(0,t.eW)("换脸特效:Snap Camera(操作简单) & "),(0,t.Lk)("a",$,[(0,t.eW)("Avatarify Python"),(0,t.bF)(n)])]),(0,t.Lk)("p",null,[(0,t.eW)("按键可视化:"),(0,t.Lk)("a",ee,[(0,t.eW)("Carnac"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",re,[(0,t.eW)("Keyviz"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",ne,[(0,t.eW)("ClickShow"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",te,[(0,t.eW)("KeyCastOW"),(0,t.bF)(n)])]),(0,t.Lk)("p",null,[(0,t.eW)("投屏工具:"),(0,t.Lk)("a",le,[(0,t.eW)("scrcpy"),(0,t.bF)(n)]),(0,t.eW)(" (手机投屏) & "),(0,t.Lk)("a",oe,[(0,t.eW)("Macast"),(0,t.bF)(n)]),(0,t.eW)("(手机视频投屏到电脑)& 蓝莓投屏")]),ae,ie,(0,t.Lk)("ul",null,[se,pe,(0,t.Lk)("li",null,[(0,t.eW)("热键工具:Fn-PowerKey、"),(0,t.Lk)("a",ke,[(0,t.eW)("CapsLock+"),(0,t.bF)(n)])]),(0,t.Lk)("li",null,[(0,t.eW)("图标启动:"),(0,t.Lk)("a",he,[(0,t.eW)("Lucy 快速启动"),(0,t.bF)(n)]),(0,t.eW)(),ue]),be]),ce,Le,(0,t.Lk)("p",null,[(0,t.eW)("爬虫监测:OpenWebMonitor & "),(0,t.Lk)("a",fe,[(0,t.eW)("spider-flow"),(0,t.bF)(n)])]),(0,t.Lk)("p",null,[(0,t.eW)("本地搜索:Everything("),(0,t.Lk)("a",We,[(0,t.eW)("拼音扩展"),(0,t.bF)(n)]),(0,t.eW)(") & AnyTXT Searcher(全文|OCR)"),ge]),de,(0,t.Lk)("p",null,[(0,t.eW)("重命名:FFRenamePro & "),(0,t.Lk)("a",me,[(0,t.eW)("SubRenamer"),(0,t.bF)(n)]),(0,t.eW)("(字幕批量重命名)"),we]),(0,t.Lk)("p",null,[(0,t.eW)("文本比较:Beyond Compare & "),(0,t.Lk)("a",Fe,[(0,t.eW)("WinMerge"),(0,t.bF)(n)]),(0,t.eW)("(开源)")]),(0,t.Lk)("p",null,[(0,t.eW)("局域网传输:"),(0,t.Lk)("a",_e,[(0,t.eW)("FastCopy"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",ye,[(0,t.eW)("Snapdrop"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",Te,[(0,t.eW)("LocalSend"),(0,t.bF)(n)]),(0,t.eW)(),Se]),(0,t.Lk)("p",null,[(0,t.eW)("文件归档:Syncthing(异地同步) & GoodSync(同设备同步) & "),(0,t.Lk)("a",ve,[(0,t.eW)("Dropit"),(0,t.bF)(n)]),(0,t.eW)("(自动文件归档) & "),(0,t.Lk)("a",Ce,[(0,t.eW)("DropPoint"),(0,t.bF)(n)]),(0,t.eW)("(复制中转框)")]),(0,t.Lk)("p",null,[(0,t.eW)("网盘同步:坚果云 & 阿里云盘 & 百度网盘 & 115 ("),(0,t.Lk)("a",Me,[(0,t.eW)("转存脚本"),(0,t.bF)(n)]),(0,t.eW)(") "),Pe]),Ae,(0,t.Lk)("p",null,[(0,t.eW)("资源管理器:"),(0,t.Lk)("a",xe,[(0,t.eW)("One Commander"),(0,t.bF)(n)]),(0,t.eW)(" & "),(0,t.Lk)("a",De,[(0,t.eW)("Q-Dir"),(0,t.bF)(n)]),(0,t.eW)(" & FreeCommander & QTTabBar(Win10) "),Be]),Re,Oe,Ve,(0,t.Lk)("p",null,[(0,t.eW)("下载:"),(0,t.Lk)("a",ze,[(0,t.eW)("Aria2"),(0,t.bF)(n)]),(0,t.eW)(" & IDM & Kinhdown "),Ee]),Ie,Ge,(0,t.Lk)("p",null,[(0,t.eW)("PDF:Sumatra PDF & PDFelement & "),(0,t.Lk)("a",Ne,[(0,t.eW)("PDF 补丁丁"),(0,t.bF)(n)]),(0,t.eW)("(书签)"),Ue]),(0,t.Lk)("p",null,[(0,t.eW)("硬件驱动:360 驱动大师 & "),(0,t.Lk)("a",He,[(0,t.eW)("Open Hardware Monitor"),(0,t.bF)(n)]),(0,t.eW)("(旧电脑风扇转速) & "),(0,t.Lk)("a",Qe,[(0,t.eW)("Afterburner"),(0,t.bF)(n)]),(0,t.eW)("(显卡风扇转速) & "),(0,t.Lk)("a",qe,[(0,t.eW)("图吧硬件工具箱"),(0,t.bF)(n)]),(0,t.eW)(" & AIDA64 "),Xe]),(0,t.Lk)("p",null,[(0,t.eW)("系统优化:"),(0,t.Lk)("a",Ze,[(0,t.eW)("PowerToys"),(0,t.bF)(n)]),(0,t.eW)("、"),(0,t.Lk)("a",je,[(0,t.eW)("RBTray"),(0,t.bF)(n)]),(0,t.eW)("(最小化到托盘)、"),(0,t.Lk)("a",Ke,[(0,t.eW)("ContextMenuManager"),(0,t.bF)(n)]),(0,t.eW)("(右键管理,遇过 bug,推荐火绒右键)、WizTree(磁盘空间分析)、优效日历、StartIsBack++、"),(0,t.Lk)("a",Je,[(0,t.eW)("O&O ShutUp10++"),(0,t.bF)(n)]),(0,t.eW)("、Dism++、"),(0,t.Lk)("a",Ye,[(0,t.eW)("Windows Update Blocker"),(0,t.bF)(n)]),(0,t.eW)("(阻止系统更新)")]),$e,(0,t.Lk)("p",null,[(0,t.eW)("编程工具:"),(0,t.Lk)("a",er,[(0,t.eW)("MobaXTerm"),(0,t.bF)(n)]),(0,t.eW)("(SSH+FTP)、GitHubDesktop、He3 工具箱、Postman、FileZilla(FTP)、DBeaver("),(0,t.Lk)("a",rr,[(0,t.eW)("数据库"),(0,t.bF)(n)]),(0,t.eW)(")、Fiddler(手机抓包)、Regex Match Tracer")]),nr,tr,lr,or,ar,(0,t.Lk)("p",null,[(0,t.eW)("护眼健康:"),(0,t.Lk)("a",ir,[(0,t.eW)("Stretchly"),(0,t.bF)(n)]),(0,t.eW)(),sr]),(0,t.Lk)("p",null,[(0,t.eW)("偶尔使用:VeraCrypt(本地加密)、Recuva(文件恢复)、"),(0,t.Lk)("a",pr,[(0,t.eW)("12306Bypass"),(0,t.bF)(n)]),(0,t.eW)("、爱思助手、Bluestacks(安卓模拟器)、"),(0,t.Lk)("a",kr,[(0,t.eW)("Ventoy"),(0,t.bF)(n)]),(0,t.eW)("(制作可启动 U 盘)、微 PE 工具箱、"),(0,t.Lk)("a",hr,[(0,t.eW)("傲梅分区"),(0,t.bF)(n)])]),ur,(0,t.Lk)("p",null,[(0,t.Lk)("a",br,[(0,t.eW)("LittleBigMouse"),(0,t.bF)(n)]),(0,t.eW)(":实现 Windows 多显示器鼠标平滑移动。")]),cr,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",Lr,[(0,t.eW)("GKD"),(0,t.bF)(n)]),(0,t.eW)(":手机端去广告的开源利器,可以点击跳过任意开屏广告/点击关闭应用内部任意弹窗广告,如关闭百度贴吧帖子广告卡片/知乎回答底部推荐广告卡片。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",fr,[(0,t.eW)("SmartTube"),(0,t.bF)(n)]),(0,t.eW)(":电视盒子上的去广告版 YouTube。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",Wr,[(0,t.eW)("WechatExporter"),(0,t.bF)(n)]),(0,t.eW)(":微信记录导出,仅限 iOS 手机。安卓和 PC 端微信都加密,无法导出查看。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",gr,[(0,t.eW)("AutoX"),(0,t.bF)(n)]),(0,t.eW)(":开源版的 Auto.js,没有包名屏蔽。相关信息可以参考 "),(0,t.Lk)("a",dr,[(0,t.eW)("快人一步:使用 Tasker+AutoX 一键直达健康码"),(0,t.bF)(n)]),(0,t.eW)("。")])]),mr,wr,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",Fr,[(0,t.eW)("Animated Drawings"),(0,t.bF)(n)]),(0,t.eW)(":自动将绘画转换为动画。")])]),_r,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.eW)("全局手势:"),(0,t.Lk)("a",yr,[(0,t.eW)("StrokesPlus.net"),(0,t.bF)(n)]),(0,t.eW)(" & WGestures")]),Tr,Sr,vr,Cr,Mr,Pr,Ar,xr,(0,t.Lk)("li",null,[(0,t.eW)("客服:飞豆客服聊天助手 & "),(0,t.Lk)("a",Dr,[(0,t.eW)("mirai(qq 机器人)"),(0,t.bF)(n)]),(0,t.eW)(" & 酷 Q(已关)")]),Br,(0,t.Lk)("li",null,[(0,t.Lk)("a",Rr,[(0,t.eW)("DockIt"),(0,t.bF)(n)]),(0,t.eW)(":主显示屏中,非全屏状态下,快速将窗口局部化。如何默认不全屏;应用不自动吸边?")]),(0,t.Lk)("li",null,[(0,t.eW)("TheBrain:可以把知识无限扩充,都连接在一起。但将工作流导图放入 TheBrain 后发现并不合适,比较适合更细化的内容?介绍参考"),(0,t.Lk)("a",Or,[(0,t.eW)("善用佳软张玉新老师 · TheBrain ≠ 思维导图——运用 TheBrain 的三个阶段"),(0,t.bF)(n)]),(0,t.eW)("。")]),(0,t.Lk)("li",null,[(0,t.eW)("Markdown 批量翻译: "),(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",Vr,[(0,t.eW)("GT4T"),(0,t.bF)(n)]),(0,t.eW)("(不推荐):可进行批量文件翻译,支持 Markdown。将文件夹拖入 GT4T 文件翻译器,即可翻译该文件下及子文件夹下的所有所选类型的文件。但似乎只能商用,添加自己的 API,依然提示付费。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",zr,[(0,t.eW)("Markdown Docs Translator"),(0,t.bF)(n)]),(0,t.eW)(":开源免费,但使用网页版接口进行翻译,速度较慢,且很容易出现问题而中断。")])])])]),Er,Ir,(0,t.Lk)("section",Gr,[(0,t.Lk)("ol",Nr,[(0,t.Lk)("li",Ur,[(0,t.Lk)("p",null,[(0,t.Lk)("a",Hr,[(0,t.eW)("视频课程学习留档"),(0,t.bF)(n)]),(0,t.eW)(),Qr])])])])])}]]),Zr=JSON.parse('{"path":"/apps/Applist.html","title":"必备应用","lang":"zh-CN","frontmatter":{"article":false,"title":"必备应用","icon":"list","order":1,"description":"Windows 自用软件,以开源软件为主。 知识记录 本地笔记:Logseq & Obsidian & 妙笔 & Joplin 在线笔记:Notion & 飞书 & flomo & Airtable & 简悦 清单日历:滴答清单 & Trello & Habitify & 桌面日历 记忆复习:思源笔记 文本编辑:Visual Studio Code &...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/Applist.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"必备应用"}],["meta",{"property":"og:description","content":"Windows 自用软件,以开源软件为主。 知识记录 本地笔记:Logseq & Obsidian & 妙笔 & Joplin 在线笔记:Notion & 飞书 & flomo & Airtable & 简悦 清单日历:滴答清单 & Trello & Habitify & 桌面日历 记忆复习:思源笔记 文本编辑:Visual Studio Code &..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T10:09:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-23T10:09:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"必备应用\\",\\"description\\":\\"Windows 自用软件,以开源软件为主。 知识记录 本地笔记:Logseq & Obsidian & 妙笔 & Joplin 在线笔记:Notion & 飞书 & flomo & Airtable & 简悦 清单日历:滴答清单 & Trello & Habitify & 桌面日历 记忆复习:思源笔记 文本编辑:Visual Studio Code &...\\"}"]]},"headers":[{"level":2,"title":"知识记录","slug":"知识记录","link":"#知识记录","children":[]},{"level":2,"title":"平面设计","slug":"平面设计","link":"#平面设计","children":[]},{"level":2,"title":"音频视频","slug":"音频视频","link":"#音频视频","children":[]},{"level":2,"title":"屏幕录制","slug":"屏幕录制","link":"#屏幕录制","children":[]},{"level":2,"title":"效率工具","slug":"效率工具","link":"#效率工具","children":[]},{"level":2,"title":"文档管理","slug":"文档管理","link":"#文档管理","children":[]},{"level":2,"title":"系统日常","slug":"系统日常","link":"#系统日常","children":[]},{"level":2,"title":"低频工具","slug":"低频工具","link":"#低频工具","children":[]},{"level":2,"title":"Android","slug":"android","link":"#android","children":[]},{"level":2,"title":"小玩意","slug":"小玩意","link":"#小玩意","children":[]},{"level":2,"title":"已弃","slug":"已弃","link":"#已弃","children":[]}],"git":{"createdTime":1659797625000,"updatedTime":1706004554000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":44}]},"readingTime":{"minutes":6.66,"words":1999},"filePathRelative":"apps/Applist.md","localizedDate":"2022年8月6日","excerpt":"

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

    \\n

    知识记录

    \\n

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

    \\n

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

    \\n

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

    \\n

    记忆复习:思源笔记 & SuperMemo & kopia(备份) & Anki

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-340bdea8.df8d140b.js b/assets/js/AutoHotkey.html.e439cc41.js similarity index 92% rename from assets/js/v-340bdea8.df8d140b.js rename to assets/js/AutoHotkey.html.e439cc41.js index 000529728..30225b44d 100644 --- a/assets/js/v-340bdea8.df8d140b.js +++ b/assets/js/AutoHotkey.html.e439cc41.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3736],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},8636:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>W,data:()=>E});var e=a(3968);const t=(0,e.QD)("p",null,"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。",-1),o={href:"https://wyagd001.github.io/v2/docs",target:"_blank",rel:"noopener noreferrer"},p={href:"https://wyagd001.github.io/v2/docs/KeyList.htm",target:"_blank",rel:"noopener noreferrer"},l={href:"https://wyagd001.github.io/v2/docs/Variables.htm#BuiltIn",target:"_blank",rel:"noopener noreferrer"},c={href:"https://www.macrocreator.com/download/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/papple23g/ahkcompiler",target:"_blank",rel:"noopener noreferrer"},r=(0,e.QD)("thead",null,[(0,e.QD)("tr",null,[(0,e.QD)("th",null,"符号"),(0,e.QD)("th",null,"作用")])],-1),u=(0,e.QD)("tr",null,[(0,e.QD)("td",null,"#"),(0,e.QD)("td",null,"Win 键")],-1),d=(0,e.QD)("tr",null,[(0,e.QD)("td",null,"!"),(0,e.QD)("td",null,"Alt 键")],-1),k=(0,e.QD)("tr",null,[(0,e.QD)("td",null,"^"),(0,e.QD)("td",null,"Ctrl 键")],-1),m=(0,e.QD)("tr",null,[(0,e.QD)("td",null,"+"),(0,e.QD)("td",null,"Shift 键")],-1),v=(0,e.QD)("td",null,"`",-1),h={href:"https://wyagd001.github.io/v2/docs/misc/EscapeChar.htm",target:"_blank",rel:"noopener noreferrer"},b=(0,e.QD)("tr",null,[(0,e.QD)("td",null,";"),(0,e.QD)("td",null,"代表注释内容,不影响函数")],-1),g=(0,e.QD)("tr",null,[(0,e.QD)("td",null,"::"),(0,e.QD)("td",null,"(两个英文冒号),代表分隔")],-1),y=(0,e.IL)('

    注意事项

    • AHK 中不区分大小写,即 run 和 RUN 没有区别。
    • 非热键情况,添加 return,脚本全部停止。
    • 脚本需考虑,你是想要在全局还是局部中激活动作。

    常用方法

    托盘图标

    自定义图标可使用 ico 或 png,不支持 svg 格式。

    托盘图标设置命令为 Menu, Tray, Icon, %A_WorkingDir%\\dock_panel.png%A_WorkingDir% 代表脚本所在目录。

    ',6),f={href:"https://github.com/AutoHotkey/Ahk2Exe/releases",target:"_blank",rel:"noopener noreferrer"},D=(0,e.QD)("h3",{id:"执行-powershell",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#执行-powershell"},[(0,e.QD)("span",null,"执行 PowerShell")])],-1),w={href:"https://learn.microsoft.com/zh-cn/powershell/scripting/learn/ps101/01-getting-started",target:"_blank",rel:"noopener noreferrer"},A=(0,e.IL)('
    # Run, powershell.exe -NoExit -Command &{命令}, 目录\nRun, powershell.exe -NoExit -Command &{npm version patch}, D:\\Backup\n

    问题

    激发热键后按键未释放

    Send, ^!+w 指代热键 Ctrl+Alt+Shift+W,有时辅助热键未正确释放,会导致激发热键后输入有问题。

    函数结尾加一行 Send, {Ctrl up}{Alt up}{Shift up} 即可解决该问题。

    隐藏在托盘程序无法监测

    WinExist 只能查看签订程序,对于后台或托盘程序,可以用 Process 命令来检查是否存在指定程序的 PID。

    ;晚上8点停止录屏,并精简视频\nif (A_Hour == 20 && Stop_Record ==0){ ;如果小时等于20点\n    Stop_Record:=1 ;设置停止录屏变量为1\n    Process, Exist, bdcam.exe ;监测隐藏程序\n    NewPID := ErrorLevel  ; 由于 ErrorLevel 会经常发生改变, 所以要立即保存这个值.\n    if NewPID { ;如果存在录屏工具,则继续\n        Send, ^+!{F8} ;晚上8点后,停止录屏\n        Sleep, 1000 ;等待5分钟\n        ;重命名文件\n        FileMove, D:\\Backup\\Libraries\\Desktop\\%A_YYYY%-%A_MM%-%A_DD% *-*-*-*.mp4, D:\\Backup\\Libraries\\Desktop\\%A_YYYY%-%A_MM%-%A_DD%.mp4\n        Sleep, 1000\n        ;桌面打开终端,执行 dvr-scan 命令\n        Run, PowerShell.exe -NoExit -Command &{dvr-scan -i %A_YYYY%-%A_MM%-%A_DD%.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\\Backup\\Libraries\\Desktop\n    }\n}\n

    命令中的按键未执行

    如果 AutoHotkey 脚本中模拟了按键,窗口中却并未执行,则尝试用管理员权限执行脚本。

    低权限的窗口/进程不能发送消息到高权限窗口。比如 Quicker 窗口的权限高,普通启动的 AutoHotkey 脚本无法对 Quicker 输入模拟键,需要管理员权限。

    管理员权限运行脚本

    对于可执行文件,命令 Run *RunAs 相当于右键菜单的「以管理员权限运行」命令。

    右键单击脚本的快捷方式,选择「属性」>「高级」,勾选「用管理员身份运行」,只能用于手动开启,开机启动会忽略带管理器的启动项。

    ',14),x=(0,e.QD)("strong",null,"管理员密码为空",-1),Q={href:"http://www.ujiaoshou.com/xtjc/155215500.html",target:"_blank",rel:"noopener noreferrer"},_=(0,e.IL)('

    如果管理员有设密码,则可使用下列命令,用管理员权限打开脚本。

    RunAs, Administrator, PassWD\nRun, %A_ScriptDir%\\1.ahk\nRunAs  ; 恢复为普通权限\n

    常用函数

    命令:run, msgbox, send

    ;run 运行程序或者文档或其他\n!n::run notepad ;便捷呼出程序,「notepad」是「运行」对话框中的命令之一,所以不用完整路径\nRun, %A_WorkingDir%\\xx.lnk ;启用当前目录中的文件\nRun, chrome.exe https://newzone.top/ ;指定浏览器打开链接。\nRun, %A_ProgramFiles%\\Some Application\\App.exe, %A_ProgramFiles%\\Some Application ;有些程序需要在它们自己的目录下运行。\nRun, "%A_ProgramFiles%\\Google\\Chrome\\Application\\chrome_proxy.exe --profile-directory=Default --app-id=xxxxxxxx" ;打开 Chrome 浏览器的内部应用,修改 app-id 即可\n\n;Msgbox:显示带两个按钮的对话框 (是 和 否) 对话框中可加内容\nMsgbox,你好吗? ;显示「你好吗?」的对话框\n;Send:在当前窗口输入文本内容\nsend how are you? ;在当前窗口输入 how are you?\n

    局部变量:IFwinactive

    注意:同样不区分大小写。比如 ifwinactive 等等。

    ;#IFwinactive(指定窗口)(热键或热字串)\n#IFwinactive 新建文本文档.txt - 记事本 ; 在*新建文本文档.txt - 记事本*这个指定窗口下,窗口标题的前半段符合即可\n#q:: ;按下 win 键和 q 键\nrun Notepad ;激活打开记事本这个动作\nreturn\n

    热键、热字串

    热键:(按键 1)(按键 2)

    当按下特定的按键,或者按键顺序,或者按键组合时,激活某个或者某系列动作。

    #q:: ;按下 win 键和 q 键时激活运行记事本这个动作。\nrun Notepad ;run 为 AHK 中一个命令,相当于 C 语言中的关键字或者说是函数。还有 msgbox 等等。\nreturn ;return 为返回值,在存在多个热键时需使用,不然热键中会起冲突。\n\nq&n:: ;按下 q 和 n,自定义按键:(按键 1)&(按键 2)&...&(按键 n),用来连接任何两个或多个按键组合成一个新的按键。\nrun notepad ;激活打开记事本这个动作。\nreturn\n

    热字串:(被替换内容)::(替换内容)

    扩展或者说自动替换文本,当然也可以映射任何脚本动作。

    自动替换:

    ::hay::how are you? ;当输入 hay 时自动替换为 how are you?\n::nh::你好 ;当输入 nh 时自动替换为你好\n::/mail::gmail@gmail.com ;键入/mail 后,再加空格、或 tab、或回车,就可以触发缩写\n::/fk::轩先生这会子肯定在忙,请骚后。thx。祝君:天天开心,日日欣悦。\n

    热字串映射脚本:

    ::np::\nrun Notepad ;当输入 np 加空格时激活运行记事本这个动作。\nreturn\n::nh::\nsend 你好。 ;在当前窗口输入你好。\nreturn\n::h:: 欢迎光临! ;只要输入 h,然后回车/TAB/空格就自动把 h 替换为欢迎光临!\n:*:w::欢迎你再次光临!     ;自动替换,不需要输入空格来触发替换\n::hehe::                 ;替换支持换行文字,需要用括号?\n(\n老兄!\n好久不见!\n)\n

    键入热字串后,再加空格、或 tab、或回车,就可以触发缩写。

    AHK 使用样例

    神速激活/打开/隐藏程序

    Win+C激活 Chrome 状态切换:Chrome 没打开时 --> 打开;打开没激活状态时候 --> 激活;打开处在激活状态时候 --> 隐藏。[1]

    #c::\nIfWinNotExist ahk_class Chrome_WidgetWin_1\n{\n    Run "C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe"\n    WinActivate\n}\nElse IfWinNotActive ahk_class Chrome_WidgetWin_1\n{\n    WinActivate\n}\nElse\n{\n    WinMinimize\n}\nReturn\n

    一键运行/关闭脚本的循环

    按 F2 一键运行/关闭脚本的循环,空格可暂停/继续脚本。

    #maxThreadsPerHotkey, 2 ;让热键能同时有运行/关闭作用,否则键击会被忽略\n;setKeyDelay, 50, 50 ;键击默认休眠\n;setMouseDelay, 50 ;键击默认休眠\nstop:=0\n\n;F2一键运行/关闭脚本的循环\n$f2::\n    stop:=!stop\n    while (stop=1)\n    {\n        ;激活 excel 窗口「工作簿」获取数值,然后激活 chrome 窗口执行命令,完成后进入循环。\n        WinActivate, 工作簿\n        Sleep, 333\n        Send, {Down}\n        Sleep, 100\n        Send, {Control Down}{c}{Control Up}\n        Sleep, 100\n        WinActivate, 捧场 - Google Chrome\n        Sleep, 333\n        Send, {Control Down}{v}{Control Up}\n        Sleep, 100\n        Send, {Enter}\n        Sleep, 100\n    }\nreturn\n;如果需要暂停,可在脚本后加这段代码,按 空格键 就暂停,再按空格键继续运行。\n;space::pause\n

    监测进程是否运行

    监测应用是否有运行,如果没运行则执行启动热键。

    Process, Exist, PicGo.exe\nNewPID := ErrorLevel  ; 由于 ErrorLevel 会经常发生改变,所以要立即保存值。\nif not NewPID\n{\n    run C:\\\\Program Files\\\\PicGo\\\\PicGo.exe\n    sleep 3000\n    Send, {Shift Down}{Control Down}{p}{Control Up}{Shift Up}\n} else {\n    Send, {Shift Down}{Control Down}{p}{Control Up}{Shift Up}\n}\nreturn\n

    输入法状态影响字符输出

    在脚本中,调用函数SendText()输出文字,不受输入法状态。

    ;;;;;;;新版独立小程序,可以避免输入法状态影响中文或英文字符的热键输出;;;;;;;\n;来源链接:<https://segmentfault.com/a/1190000017029464>\nSendText(var_string){\n    local\n    SendInput {text}%var_string%\n    return\n}\n

    大写键改为 Enter

    ;replace CapsLock to LeftEnter; CapsLock = Alt CapsLock\n$CapsLock::Enter\nLAlt & Capslock::SetCapsLockState, % GetKeyState("CapsLock", "T") ? "Off" : "On"\n!u::Send ^c !{tab} ^v\n

    ',35),H={class:"footnotes"},C={class:"footnotes-list"},S={id:"footnote1",class:"footnote-item"},Y={href:"https://segmentfault.com/a/1190000004611125",target:"_blank",rel:"noopener noreferrer"},K=(0,e.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),P={},W=(0,a(9720).c)(P,[["render",function(n,s){const a=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[t,(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.QD)("a",o,[(0,e.mY)("AutoHotkey 中文说明"),(0,e.K2)(a)]),(0,e.mY)(":"),(0,e.QD)("a",p,[(0,e.mY)("按键 Key 名列表"),(0,e.K2)(a)]),(0,e.mY)(","),(0,e.QD)("a",l,[(0,e.mY)("AHK 环境变量"),(0,e.K2)(a)]),(0,e.mY)("。")]),(0,e.QD)("li",null,[(0,e.mY)("脚本录制/功能编辑:"),(0,e.QD)("a",c,[(0,e.mY)("Pulover's Macro Creator"),(0,e.K2)(a)]),(0,e.mY)(","),(0,e.QD)("a",i,[(0,e.mY)("AutoHotkey 語法產生器 (線上網站)"),(0,e.K2)(a)]),(0,e.mY)("。")])]),(0,e.QD)("table",null,[r,(0,e.QD)("tbody",null,[u,d,k,m,(0,e.QD)("tr",null,[v,(0,e.QD)("td",null,[(0,e.mY)("转义字符,参考"),(0,e.QD)("a",h,[(0,e.mY)("转义序列"),(0,e.K2)(a)])])]),b,g])]),y,(0,e.QD)("p",null,[(0,e.mY)("如果是设置 exe 程序图标,则使用 "),(0,e.QD)("a",f,[(0,e.mY)("Ahk2Exe"),(0,e.K2)(a)]),(0,e.mY)(" 工具手动转换。")]),D,(0,e.QD)("p",null,[(0,e.mY)("系统级别的操作可以通过 "),(0,e.QD)("a",w,[(0,e.mY)("PowerShell"),(0,e.K2)(a)]),(0,e.mY)(" 来实现。")]),A,(0,e.QD)("p",null,[(0,e.mY)("如果"),x,(0,e.mY)(",则参考 "),(0,e.QD)("a",Q,[(0,e.mY)("Win10 添加开机启动项管理员权限运行如何设置"),(0,e.K2)(a)]),(0,e.mY)(",在系统的任务计划程序添加管理员自启动。如果想避免启动报错,建议将启动触发器从「开机」改成「登录」,增加延迟 1 分钟,勾选「最高管理员权限」。设置后,脚本中的打开命令都将使用管理员权限执行。")]),_,(0,e.QD)("section",H,[(0,e.QD)("ol",C,[(0,e.QD)("li",S,[(0,e.QD)("p",null,[(0,e.QD)("a",Y,[(0,e.mY)("Win 下最爱效率利器:AutoHotKey"),(0,e.K2)(a)]),(0,e.mY)(),K])])])])])}]]),E=JSON.parse('{"path":"/code/AutoHotkey.html","title":"AutoHotkey","lang":"zh-CN","frontmatter":{"article":false,"title":"AutoHotkey","icon":"linter","order":4,"description":"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。 AutoHotkey 中文说明:按键 Key 名列表,AHK 环境变量。 脚本录制/功能编辑:Pulover\'s Macro Creator,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/AutoHotkey.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"AutoHotkey"}],["meta",{"property":"og:description","content":"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。 AutoHotkey 中文说明:按键 Key 名列表,AHK 环境变量。 脚本录制/功能编辑:Pulover\'s Macro Creator,..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-06T02:43:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-06T02:43:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"AutoHotkey\\",\\"description\\":\\"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。 AutoHotkey 中文说明:按键 Key 名列表,AHK 环境变量。 脚本录制/功能编辑:Pulover\'s Macro Creator,...\\"}"]]},"headers":[{"level":2,"title":"常用方法","slug":"常用方法","link":"#常用方法","children":[{"level":3,"title":"托盘图标","slug":"托盘图标","link":"#托盘图标","children":[]},{"level":3,"title":"执行 PowerShell","slug":"执行-powershell","link":"#执行-powershell","children":[]}]},{"level":2,"title":"问题","slug":"问题","link":"#问题","children":[{"level":3,"title":"激发热键后按键未释放","slug":"激发热键后按键未释放","link":"#激发热键后按键未释放","children":[]},{"level":3,"title":"隐藏在托盘程序无法监测","slug":"隐藏在托盘程序无法监测","link":"#隐藏在托盘程序无法监测","children":[]},{"level":3,"title":"命令中的按键未执行","slug":"命令中的按键未执行","link":"#命令中的按键未执行","children":[]},{"level":3,"title":"管理员权限运行脚本","slug":"管理员权限运行脚本","link":"#管理员权限运行脚本","children":[]}]},{"level":2,"title":"常用函数","slug":"常用函数","link":"#常用函数","children":[{"level":3,"title":"命令:run, msgbox, send","slug":"命令-run-msgbox-send","link":"#命令-run-msgbox-send","children":[]},{"level":3,"title":"局部变量:IFwinactive","slug":"局部变量-ifwinactive","link":"#局部变量-ifwinactive","children":[]}]},{"level":2,"title":"热键、热字串","slug":"热键、热字串","link":"#热键、热字串","children":[{"level":3,"title":"热键:(按键 1)(按键 2)","slug":"热键-按键-1-按键-2","link":"#热键-按键-1-按键-2","children":[]},{"level":3,"title":"热字串:(被替换内容)::(替换内容)","slug":"热字串-被替换内容-替换内容","link":"#热字串-被替换内容-替换内容","children":[]}]},{"level":2,"title":"AHK 使用样例","slug":"ahk-使用样例","link":"#ahk-使用样例","children":[{"level":3,"title":"神速激活/打开/隐藏程序","slug":"神速激活-打开-隐藏程序","link":"#神速激活-打开-隐藏程序","children":[]},{"level":3,"title":"一键运行/关闭脚本的循环","slug":"一键运行-关闭脚本的循环","link":"#一键运行-关闭脚本的循环","children":[]},{"level":3,"title":"监测进程是否运行","slug":"监测进程是否运行","link":"#监测进程是否运行","children":[]},{"level":3,"title":"输入法状态影响字符输出","slug":"输入法状态影响字符输出","link":"#输入法状态影响字符输出","children":[]},{"level":3,"title":"大写键改为 Enter","slug":"大写键改为-enter","link":"#大写键改为-enter","children":[]}]}],"git":{"createdTime":1667201870000,"updatedTime":1699238582000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":7.22,"words":2166},"filePathRelative":"code/AutoHotkey.md","localizedDate":"2022年10月31日","excerpt":"

    AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。

    \\n","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4541],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},2379:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>F,data:()=>E});var e=a(7847);const t=(0,e.Lk)("p",null,"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。",-1),o={href:"https://wyagd001.github.io/v2/docs",target:"_blank",rel:"noopener noreferrer"},p={href:"https://wyagd001.github.io/v2/docs/KeyList.htm",target:"_blank",rel:"noopener noreferrer"},l={href:"https://wyagd001.github.io/v2/docs/Variables.htm#BuiltIn",target:"_blank",rel:"noopener noreferrer"},c={href:"https://www.macrocreator.com/download/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/papple23g/ahkcompiler",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("thead",null,[(0,e.Lk)("tr",null,[(0,e.Lk)("th",null,"符号"),(0,e.Lk)("th",null,"作用")])],-1),u=(0,e.Lk)("tr",null,[(0,e.Lk)("td",null,"#"),(0,e.Lk)("td",null,"Win 键")],-1),d=(0,e.Lk)("tr",null,[(0,e.Lk)("td",null,"!"),(0,e.Lk)("td",null,"Alt 键")],-1),k=(0,e.Lk)("tr",null,[(0,e.Lk)("td",null,"^"),(0,e.Lk)("td",null,"Ctrl 键")],-1),m=(0,e.Lk)("tr",null,[(0,e.Lk)("td",null,"+"),(0,e.Lk)("td",null,"Shift 键")],-1),v=(0,e.Lk)("td",null,"`",-1),h={href:"https://wyagd001.github.io/v2/docs/misc/EscapeChar.htm",target:"_blank",rel:"noopener noreferrer"},b=(0,e.Lk)("tr",null,[(0,e.Lk)("td",null,";"),(0,e.Lk)("td",null,"代表注释内容,不影响函数")],-1),g=(0,e.Lk)("tr",null,[(0,e.Lk)("td",null,"::"),(0,e.Lk)("td",null,"(两个英文冒号),代表分隔")],-1),y=(0,e.Fv)('

    注意事项

    • AHK 中不区分大小写,即 run 和 RUN 没有区别。
    • 非热键情况,添加 return,脚本全部停止。
    • 脚本需考虑,你是想要在全局还是局部中激活动作。

    常用方法

    托盘图标

    自定义图标可使用 ico 或 png,不支持 svg 格式。

    托盘图标设置命令为 Menu, Tray, Icon, %A_WorkingDir%\\dock_panel.png%A_WorkingDir% 代表脚本所在目录。

    ',6),f={href:"https://github.com/AutoHotkey/Ahk2Exe/releases",target:"_blank",rel:"noopener noreferrer"},A=(0,e.Lk)("h3",{id:"执行-powershell",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#执行-powershell"},[(0,e.Lk)("span",null,"执行 PowerShell")])],-1),w={href:"https://learn.microsoft.com/zh-cn/powershell/scripting/learn/ps101/01-getting-started",target:"_blank",rel:"noopener noreferrer"},x=(0,e.Fv)('
    # Run, powershell.exe -NoExit -Command &{命令}, 目录\nRun, powershell.exe -NoExit -Command &{npm version patch}, D:\\Backup\n

    问题

    激发热键后按键未释放

    Send, ^!+w 指代热键 Ctrl+Alt+Shift+W,有时辅助热键未正确释放,会导致激发热键后输入有问题。

    函数结尾加一行 Send, {Ctrl up}{Alt up}{Shift up} 即可解决该问题。

    隐藏在托盘程序无法监测

    WinExist 只能查看签订程序,对于后台或托盘程序,可以用 Process 命令来检查是否存在指定程序的 PID。

    ;晚上8点停止录屏,并精简视频\nif (A_Hour == 20 && Stop_Record ==0){ ;如果小时等于20点\n    Stop_Record:=1 ;设置停止录屏变量为1\n    Process, Exist, bdcam.exe ;监测隐藏程序\n    NewPID := ErrorLevel  ; 由于 ErrorLevel 会经常发生改变, 所以要立即保存这个值.\n    if NewPID { ;如果存在录屏工具,则继续\n        Send, ^+!{F8} ;晚上8点后,停止录屏\n        Sleep, 1000 ;等待5分钟\n        ;重命名文件\n        FileMove, D:\\Backup\\Libraries\\Desktop\\%A_YYYY%-%A_MM%-%A_DD% *-*-*-*.mp4, D:\\Backup\\Libraries\\Desktop\\%A_YYYY%-%A_MM%-%A_DD%.mp4\n        Sleep, 1000\n        ;桌面打开终端,执行 dvr-scan 命令\n        Run, PowerShell.exe -NoExit -Command &{dvr-scan -i %A_YYYY%-%A_MM%-%A_DD%.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\\Backup\\Libraries\\Desktop\n    }\n}\n

    命令中的按键未执行

    如果 AutoHotkey 脚本中模拟了按键,窗口中却并未执行,则尝试用管理员权限执行脚本。

    低权限的窗口/进程不能发送消息到高权限窗口。比如 Quicker 窗口的权限高,普通启动的 AutoHotkey 脚本无法对 Quicker 输入模拟键,需要管理员权限。

    管理员权限运行脚本

    对于可执行文件,命令 Run *RunAs 相当于右键菜单的「以管理员权限运行」命令。

    右键单击脚本的快捷方式,选择「属性」>「高级」,勾选「用管理员身份运行」,只能用于手动开启,开机启动会忽略带管理器的启动项。

    ',14),L=(0,e.Lk)("strong",null,"管理员密码为空",-1),_={href:"http://www.ujiaoshou.com/xtjc/155215500.html",target:"_blank",rel:"noopener noreferrer"},W=(0,e.Fv)('

    如果管理员有设密码,则可使用下列命令,用管理员权限打开脚本。

    RunAs, Administrator, PassWD\nRun, %A_ScriptDir%\\1.ahk\nRunAs  ; 恢复为普通权限\n

    常用函数

    命令:run, msgbox, send

    ;run 运行程序或者文档或其他\n!n::run notepad ;便捷呼出程序,「notepad」是「运行」对话框中的命令之一,所以不用完整路径\nRun, %A_WorkingDir%\\xx.lnk ;启用当前目录中的文件\nRun, chrome.exe https://newzone.top/ ;指定浏览器打开链接。\nRun, %A_ProgramFiles%\\Some Application\\App.exe, %A_ProgramFiles%\\Some Application ;有些程序需要在它们自己的目录下运行。\nRun, "%A_ProgramFiles%\\Google\\Chrome\\Application\\chrome_proxy.exe --profile-directory=Default --app-id=xxxxxxxx" ;打开 Chrome 浏览器的内部应用,修改 app-id 即可\n\n;Msgbox:显示带两个按钮的对话框 (是 和 否) 对话框中可加内容\nMsgbox,你好吗? ;显示「你好吗?」的对话框\n;Send:在当前窗口输入文本内容\nsend how are you? ;在当前窗口输入 how are you?\n

    局部变量:IFwinactive

    注意:同样不区分大小写。比如 ifwinactive 等等。

    ;#IFwinactive(指定窗口)(热键或热字串)\n#IFwinactive 新建文本文档.txt - 记事本 ; 在*新建文本文档.txt - 记事本*这个指定窗口下,窗口标题的前半段符合即可\n#q:: ;按下 win 键和 q 键\nrun Notepad ;激活打开记事本这个动作\nreturn\n

    热键、热字串

    热键:(按键 1)(按键 2)

    当按下特定的按键,或者按键顺序,或者按键组合时,激活某个或者某系列动作。

    #q:: ;按下 win 键和 q 键时激活运行记事本这个动作。\nrun Notepad ;run 为 AHK 中一个命令,相当于 C 语言中的关键字或者说是函数。还有 msgbox 等等。\nreturn ;return 为返回值,在存在多个热键时需使用,不然热键中会起冲突。\n\nq&n:: ;按下 q 和 n,自定义按键:(按键 1)&(按键 2)&...&(按键 n),用来连接任何两个或多个按键组合成一个新的按键。\nrun notepad ;激活打开记事本这个动作。\nreturn\n

    热字串:(被替换内容)::(替换内容)

    扩展或者说自动替换文本,当然也可以映射任何脚本动作。

    自动替换:

    ::hay::how are you? ;当输入 hay 时自动替换为 how are you?\n::nh::你好 ;当输入 nh 时自动替换为你好\n::/mail::gmail@gmail.com ;键入/mail 后,再加空格、或 tab、或回车,就可以触发缩写\n::/fk::轩先生这会子肯定在忙,请骚后。thx。祝君:天天开心,日日欣悦。\n

    热字串映射脚本:

    ::np::\nrun Notepad ;当输入 np 加空格时激活运行记事本这个动作。\nreturn\n::nh::\nsend 你好。 ;在当前窗口输入你好。\nreturn\n::h:: 欢迎光临! ;只要输入 h,然后回车/TAB/空格就自动把 h 替换为欢迎光临!\n:*:w::欢迎你再次光临!     ;自动替换,不需要输入空格来触发替换\n::hehe::                 ;替换支持换行文字,需要用括号?\n(\n老兄!\n好久不见!\n)\n

    键入热字串后,再加空格、或 tab、或回车,就可以触发缩写。

    AHK 使用样例

    神速激活/打开/隐藏程序

    Win+C激活 Chrome 状态切换:Chrome 没打开时 --> 打开;打开没激活状态时候 --> 激活;打开处在激活状态时候 --> 隐藏。[1]

    #c::\nIfWinNotExist ahk_class Chrome_WidgetWin_1\n{\n    Run "C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe"\n    WinActivate\n}\nElse IfWinNotActive ahk_class Chrome_WidgetWin_1\n{\n    WinActivate\n}\nElse\n{\n    WinMinimize\n}\nReturn\n

    一键运行/关闭脚本的循环

    按 F2 一键运行/关闭脚本的循环,空格可暂停/继续脚本。

    #maxThreadsPerHotkey, 2 ;让热键能同时有运行/关闭作用,否则键击会被忽略\n;setKeyDelay, 50, 50 ;键击默认休眠\n;setMouseDelay, 50 ;键击默认休眠\nstop:=0\n\n;F2一键运行/关闭脚本的循环\n$f2::\n    stop:=!stop\n    while (stop=1)\n    {\n        ;激活 excel 窗口「工作簿」获取数值,然后激活 chrome 窗口执行命令,完成后进入循环。\n        WinActivate, 工作簿\n        Sleep, 333\n        Send, {Down}\n        Sleep, 100\n        Send, {Control Down}{c}{Control Up}\n        Sleep, 100\n        WinActivate, 捧场 - Google Chrome\n        Sleep, 333\n        Send, {Control Down}{v}{Control Up}\n        Sleep, 100\n        Send, {Enter}\n        Sleep, 100\n    }\nreturn\n;如果需要暂停,可在脚本后加这段代码,按 空格键 就暂停,再按空格键继续运行。\n;space::pause\n

    监测进程是否运行

    监测应用是否有运行,如果没运行则执行启动热键。

    Process, Exist, PicGo.exe\nNewPID := ErrorLevel  ; 由于 ErrorLevel 会经常发生改变,所以要立即保存值。\nif not NewPID\n{\n    run C:\\\\Program Files\\\\PicGo\\\\PicGo.exe\n    sleep 3000\n    Send, {Shift Down}{Control Down}{p}{Control Up}{Shift Up}\n} else {\n    Send, {Shift Down}{Control Down}{p}{Control Up}{Shift Up}\n}\nreturn\n

    输入法状态影响字符输出

    在脚本中,调用函数SendText()输出文字,不受输入法状态。

    ;;;;;;;新版独立小程序,可以避免输入法状态影响中文或英文字符的热键输出;;;;;;;\n;来源链接:<https://segmentfault.com/a/1190000017029464>\nSendText(var_string){\n    local\n    SendInput {text}%var_string%\n    return\n}\n

    大写键改为 Enter

    ;replace CapsLock to LeftEnter; CapsLock = Alt CapsLock\n$CapsLock::Enter\nLAlt & Capslock::SetCapsLockState, % GetKeyState("CapsLock", "T") ? "Off" : "On"\n!u::Send ^c !{tab} ^v\n

    ',35),C={class:"footnotes"},H={class:"footnotes-list"},S={id:"footnote1",class:"footnote-item"},D={href:"https://segmentfault.com/a/1190000004611125",target:"_blank",rel:"noopener noreferrer"},K=(0,e.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),P={},F=(0,a(3671).A)(P,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.Lk)("a",o,[(0,e.eW)("AutoHotkey 中文说明"),(0,e.bF)(a)]),(0,e.eW)(":"),(0,e.Lk)("a",p,[(0,e.eW)("按键 Key 名列表"),(0,e.bF)(a)]),(0,e.eW)(","),(0,e.Lk)("a",l,[(0,e.eW)("AHK 环境变量"),(0,e.bF)(a)]),(0,e.eW)("。")]),(0,e.Lk)("li",null,[(0,e.eW)("脚本录制/功能编辑:"),(0,e.Lk)("a",c,[(0,e.eW)("Pulover's Macro Creator"),(0,e.bF)(a)]),(0,e.eW)(","),(0,e.Lk)("a",i,[(0,e.eW)("AutoHotkey 語法產生器 (線上網站)"),(0,e.bF)(a)]),(0,e.eW)("。")])]),(0,e.Lk)("table",null,[r,(0,e.Lk)("tbody",null,[u,d,k,m,(0,e.Lk)("tr",null,[v,(0,e.Lk)("td",null,[(0,e.eW)("转义字符,参考"),(0,e.Lk)("a",h,[(0,e.eW)("转义序列"),(0,e.bF)(a)])])]),b,g])]),y,(0,e.Lk)("p",null,[(0,e.eW)("如果是设置 exe 程序图标,则使用 "),(0,e.Lk)("a",f,[(0,e.eW)("Ahk2Exe"),(0,e.bF)(a)]),(0,e.eW)(" 工具手动转换。")]),A,(0,e.Lk)("p",null,[(0,e.eW)("系统级别的操作可以通过 "),(0,e.Lk)("a",w,[(0,e.eW)("PowerShell"),(0,e.bF)(a)]),(0,e.eW)(" 来实现。")]),x,(0,e.Lk)("p",null,[(0,e.eW)("如果"),L,(0,e.eW)(",则参考 "),(0,e.Lk)("a",_,[(0,e.eW)("Win10 添加开机启动项管理员权限运行如何设置"),(0,e.bF)(a)]),(0,e.eW)(",在系统的任务计划程序添加管理员自启动。如果想避免启动报错,建议将启动触发器从「开机」改成「登录」,增加延迟 1 分钟,勾选「最高管理员权限」。设置后,脚本中的打开命令都将使用管理员权限执行。")]),W,(0,e.Lk)("section",C,[(0,e.Lk)("ol",H,[(0,e.Lk)("li",S,[(0,e.Lk)("p",null,[(0,e.Lk)("a",D,[(0,e.eW)("Win 下最爱效率利器:AutoHotKey"),(0,e.bF)(a)]),(0,e.eW)(),K])])])])])}]]),E=JSON.parse('{"path":"/code/AutoHotkey.html","title":"AutoHotkey","lang":"zh-CN","frontmatter":{"article":false,"title":"AutoHotkey","icon":"linter","order":4,"description":"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。 AutoHotkey 中文说明:按键 Key 名列表,AHK 环境变量。 脚本录制/功能编辑:Pulover\'s Macro Creator,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/AutoHotkey.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"AutoHotkey"}],["meta",{"property":"og:description","content":"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。 AutoHotkey 中文说明:按键 Key 名列表,AHK 环境变量。 脚本录制/功能编辑:Pulover\'s Macro Creator,..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-06T02:43:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-06T02:43:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"AutoHotkey\\",\\"description\\":\\"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。 AutoHotkey 中文说明:按键 Key 名列表,AHK 环境变量。 脚本录制/功能编辑:Pulover\'s Macro Creator,...\\"}"]]},"headers":[{"level":2,"title":"常用方法","slug":"常用方法","link":"#常用方法","children":[{"level":3,"title":"托盘图标","slug":"托盘图标","link":"#托盘图标","children":[]},{"level":3,"title":"执行 PowerShell","slug":"执行-powershell","link":"#执行-powershell","children":[]}]},{"level":2,"title":"问题","slug":"问题","link":"#问题","children":[{"level":3,"title":"激发热键后按键未释放","slug":"激发热键后按键未释放","link":"#激发热键后按键未释放","children":[]},{"level":3,"title":"隐藏在托盘程序无法监测","slug":"隐藏在托盘程序无法监测","link":"#隐藏在托盘程序无法监测","children":[]},{"level":3,"title":"命令中的按键未执行","slug":"命令中的按键未执行","link":"#命令中的按键未执行","children":[]},{"level":3,"title":"管理员权限运行脚本","slug":"管理员权限运行脚本","link":"#管理员权限运行脚本","children":[]}]},{"level":2,"title":"常用函数","slug":"常用函数","link":"#常用函数","children":[{"level":3,"title":"命令:run, msgbox, send","slug":"命令-run-msgbox-send","link":"#命令-run-msgbox-send","children":[]},{"level":3,"title":"局部变量:IFwinactive","slug":"局部变量-ifwinactive","link":"#局部变量-ifwinactive","children":[]}]},{"level":2,"title":"热键、热字串","slug":"热键、热字串","link":"#热键、热字串","children":[{"level":3,"title":"热键:(按键 1)(按键 2)","slug":"热键-按键-1-按键-2","link":"#热键-按键-1-按键-2","children":[]},{"level":3,"title":"热字串:(被替换内容)::(替换内容)","slug":"热字串-被替换内容-替换内容","link":"#热字串-被替换内容-替换内容","children":[]}]},{"level":2,"title":"AHK 使用样例","slug":"ahk-使用样例","link":"#ahk-使用样例","children":[{"level":3,"title":"神速激活/打开/隐藏程序","slug":"神速激活-打开-隐藏程序","link":"#神速激活-打开-隐藏程序","children":[]},{"level":3,"title":"一键运行/关闭脚本的循环","slug":"一键运行-关闭脚本的循环","link":"#一键运行-关闭脚本的循环","children":[]},{"level":3,"title":"监测进程是否运行","slug":"监测进程是否运行","link":"#监测进程是否运行","children":[]},{"level":3,"title":"输入法状态影响字符输出","slug":"输入法状态影响字符输出","link":"#输入法状态影响字符输出","children":[]},{"level":3,"title":"大写键改为 Enter","slug":"大写键改为-enter","link":"#大写键改为-enter","children":[]}]}],"git":{"createdTime":1667201870000,"updatedTime":1699238582000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":7.22,"words":2166},"filePathRelative":"code/AutoHotkey.md","localizedDate":"2022年10月31日","excerpt":"

    AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。

    \\n","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/ChatGPT.html.9133179a.js b/assets/js/ChatGPT.html.9133179a.js new file mode 100644 index 000000000..e2e7a9dee --- /dev/null +++ b/assets/js/ChatGPT.html.9133179a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7949],{3671:(e,t)=>{t.A=(e,t)=>{const r=e.__vccOpts||e;for(const[e,a]of t)r[e]=a;return r}},2521:(e,t,r)=>{r.r(t),r.d(t,{comp:()=>Kr,data:()=>Vr});var a=r(7847);const n={href:"https://www.aishort.top/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.Lk)("h2",{id:"chatgpt-客户端",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#chatgpt-客户端"},[(0,a.Lk)("span",null,"ChatGPT 客户端")])],-1),o=(0,a.Lk)("p",null,"主要使用以下几个工具:",-1),s={href:"https://github.com/xcanwin/KeepChatGPT/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/Bin-Huang/chatbox",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/ddiu8081/chatgpt-demo",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/lencx/ChatGPT/releases",target:"_blank",rel:"noopener noreferrer"},c={href:"https://beta.openai.com/playground",target:"_blank",rel:"noopener noreferrer"},k=(0,a.Lk)("p",null,"第三方 API 客户端的优势:",-1),g=(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,"费用低:ChatGPT Plus 包月费用是 20 美元,平均而言每天需要 0.67 美元。相比之下,API 的费用每 1000 个 tokens 仅为 0.002 美元。这意味着,我使用 API 的话,每天可以使用 300 次 ChatGPT,而我每天实际也就只需要 100 次。"),(0,a.Lk)("li",null,"限制少:API 限制相较于 ChatGPT 网页版也要少得多,最大 token 数量为 4096 个,而网页版仅有 2048 个。需要注意的是,提问和对话的所有文本内容都包括在 token 数量内。"),(0,a.Lk)("li",null,"可移动性:ChatGPT 网页版对 IP 非常严格,使用人数多的服务商 IP 大多被封禁。与此相比,API 的限制要少得多,而且可以部署网页版,方便外出使用。")],-1),m=(0,a.Lk)("h2",{id:"chatgpt-tips",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#chatgpt-tips"},[(0,a.Lk)("span",null,"ChatGPT Tips")])],-1),u=(0,a.Lk)("li",null,[(0,a.eW)("若要使用中文回复,请在倒数第二句插入条件 "),(0,a.Lk)("code",null,"Respond in Chinese."),(0,a.eW)("。")],-1),f=(0,a.Lk)("li",null,"为了保持描述的精确性,提示词请使用英文,而最后一句的定制条件可以使用任何语言,包括中文。",-1),b=(0,a.Lk)("li",null,[(0,a.eW)("后续回答中的定制条件可以使用引号 "),(0,a.Lk)("code",null,'""'),(0,a.eW)(" 框选,以防止被误认为是新的提示词。")],-1),L=(0,a.Lk)("strong",null,"解答数学问题",-1),W={href:"https://www.wolframalpha.com/",target:"_blank",rel:"noopener noreferrer"},d=(0,a.Lk)("li",null,[(0,a.eW)("ChatGPT Plus 目前不支持国内信用卡,偶尔出现过限流。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,"Depoy 虚拟卡:仅支持 USDT 充值,需通过 KYC 实名认证,月费 1 USD,充值费率为 1.35%(Min 1USD)。"),(0,a.Lk)("li",null,"VCC 虚拟卡:无需实名,开卡费 66 元,有效期一年,包一年代充。ChatGPT Plus 月费为 20 美元,按汇率折算人民币为 136 元,但商家实际收取 150 元,差价相当于支付了月费。")])],-1),w=(0,a.Lk)("h2",{id:"learn-prompting",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#learn-prompting"},[(0,a.Lk)("span",null,"Learn Prompting")])],-1),F={href:"https://learnprompting.org/",target:"_blank",rel:"noopener noreferrer"},_=(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,"在专业领域中,应尽量提供 Role Prompting(角色提示),比如「你是数学家」。"),(0,a.Lk)("li",null,"Prompt Debiasing(消除偏差):样本在提示中的分布和顺序可能会对 LLM 输出产生偏差。因此,样本选项应该均匀分布,并穿插出现。"),(0,a.Lk)("li",null,[(0,a.eW)("Chain of Thought Prompting(思维链提示,CoT)是指指在样本中解释推理过程。LLM(大规模语言模型,比如 ChatGPT)在回答提示时会显示推理过程,这种对推理的解释通常会提升结果的准确性。例如,数学题中 LLM 提供的推理过程不对,你可以在 Prompt 中提供该步正确的范例。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("添加 "),(0,a.Lk)("code",null,"Let's think step by step"),(0,a.eW)(" 可以让我们了解模型是如何逐步推理问题的,在算术、常识和符号推理任务中能有效改善结果。这个方法被称为 Zero Shot Chain of Thought,是 CoT 的简化替代版。")]),(0,a.Lk)("li",null,"Self-Consistency(自我一致性)产生多个思维链而不仅仅是一个,然后以多数回答作为最终答案。")])])],-1),P={class:"hint-container info"},v=(0,a.Lk)("p",{class:"hint-container-title"},"相关信息",-1),C={href:"https://www.aishort.top/",target:"_blank",rel:"noopener noreferrer"},T=(0,a.Lk)("h2",{id:"文字",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#文字"},[(0,a.Lk)("span",null,"文字")])],-1),y=(0,a.Lk)("h3",{id:"写作",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#写作"},[(0,a.Lk)("span",null,"写作")])],-1),G={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stand-up-comedian",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-storyteller",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-screenwriter",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-novelist",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-poet",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journalist",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-academician",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-essay-writer",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cover-letter",target:"_blank",rel:"noopener noreferrer"},R=(0,a.Lk)("h3",{id:"点评-评鉴",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#点评-评鉴"},[(0,a.Lk)("span",null,"点评/评鉴")])],-1),B={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commentariat",target:"_blank",rel:"noopener noreferrer"},H={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"},N={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-writer",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-reviewer",target:"_blank",rel:"noopener noreferrer"},U={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-food-critic",target:"_blank",rel:"noopener noreferrer"},J={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journal-reviewer",target:"_blank",rel:"noopener noreferrer"},K=(0,a.Lk)("h3",{id:"写作辅助",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#写作辅助"},[(0,a.Lk)("span",null,"写作辅助")])],-1),V={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-title-generator-for-written-pieces",target:"_blank",rel:"noopener noreferrer"},Y=(0,a.Lk)("li",null,[(0,a.eW)("中文写作助理:我写的提示,用于改进文字段落和句式。由于 ChatGPT token 数量的限制,超过 2048 字符的改写须使用 OpenAI Playground(4K token)。本提示暂未发到 Awesome ChatGPT Prompts,可自行复制使用。 "),(0,a.Lk)("blockquote",null,[(0,a.Lk)("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),q={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-synonym-finder",target:"_blank",rel:"noopener noreferrer"},Q=(0,a.Lk)("code",null,"more of x",-1),Z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-aphorism-book",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-lunatic",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-plagiarism-checker",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-writing-tutor",target:"_blank",rel:"noopener noreferrer"},te=(0,a.Lk)("h2",{id:"生活",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#生活"},[(0,a.Lk)("span",null,"生活")])],-1),re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-self-help-book",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gnomist",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-emergency-response-professional",target:"_blank",rel:"noopener noreferrer"},le={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-shopper",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-career-counselor",target:"_blank",rel:"noopener noreferrer"},se={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach-1",target:"_blank",rel:"noopener noreferrer"},pe=(0,a.Lk)("h3",{id:"趣味知识",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#趣味知识"},[(0,a.Lk)("span",null,"趣味知识")])],-1),he={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dream-interpreter",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-astrologer",target:"_blank",rel:"noopener noreferrer"},ce={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-character-from-moviebookanything",target:"_blank",rel:"noopener noreferrer"},ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-spongebobs-magic-conch-shell",target:"_blank",rel:"noopener noreferrer"},ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fallacy-finder",target:"_blank",rel:"noopener noreferrer"},me={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diy-expert",target:"_blank",rel:"noopener noreferrer"},ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-magician",target:"_blank",rel:"noopener noreferrer"},fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-artist-advisor",target:"_blank",rel:"noopener noreferrer"},be=(0,a.Lk)("h3",{id:"生活护理",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#生活护理"},[(0,a.Lk)("span",null,"生活护理")])],-1),Le={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-yogi",target:"_blank",rel:"noopener noreferrer"},We={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-trainer",target:"_blank",rel:"noopener noreferrer"},de={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dietitian",target:"_blank",rel:"noopener noreferrer"},we={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-chef",target:"_blank",rel:"noopener noreferrer"},Fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chef",target:"_blank",rel:"noopener noreferrer"},_e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-babysitter",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-makeup-artist",target:"_blank",rel:"noopener noreferrer"},ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-stylist",target:"_blank",rel:"noopener noreferrer"},Ce=(0,a.Lk)("h2",{id:"自我提升",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#自我提升"},[(0,a.Lk)("span",null,"自我提升")])],-1),Te=(0,a.Lk)("h3",{id:"辩论-演讲",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#辩论-演讲"},[(0,a.Lk)("span",null,"辩论/演讲")])],-1),ye={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debater",target:"_blank",rel:"noopener noreferrer"},Ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debate-coach",target:"_blank",rel:"noopener noreferrer"},xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-elocutionist",target:"_blank",rel:"noopener noreferrer"},Ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-speaker",target:"_blank",rel:"noopener noreferrer"},Se={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-coach",target:"_blank",rel:"noopener noreferrer"},Ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-public-speaking-coach",target:"_blank",rel:"noopener noreferrer"},De=(0,a.Lk)("h3",{id:"心理-社交",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#心理-社交"},[(0,a.Lk)("span",null,"心理/社交")])],-1),Me={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-relationship-coach",target:"_blank",rel:"noopener noreferrer"},Oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mental-health-adviser",target:"_blank",rel:"noopener noreferrer"},Re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-psychologist",target:"_blank",rel:"noopener noreferrer"},Be={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gaslighter",target:"_blank",rel:"noopener noreferrer"},He=(0,a.Lk)("h3",{id:"哲学",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#哲学"},[(0,a.Lk)("span",null,"哲学")])],-1),je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosophy-teacher",target:"_blank",rel:"noopener noreferrer"},Ne={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosopher",target:"_blank",rel:"noopener noreferrer"},ze={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socrat",target:"_blank",rel:"noopener noreferrer"},Ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socratic-method-prompt",target:"_blank",rel:"noopener noreferrer"},Je=(0,a.Lk)("h3",{id:"老师-学术",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#老师-学术"},[(0,a.Lk)("span",null,"老师/学术")])],-1),Ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-math-teacher",target:"_blank",rel:"noopener noreferrer"},Ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematical-history-teacher",target:"_blank",rel:"noopener noreferrer"},Ye={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematician",target:"_blank",rel:"noopener noreferrer"},qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-statistician",target:"_blank",rel:"noopener noreferrer"},Qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-etymologist",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-historian",target:"_blank",rel:"noopener noreferrer"},Xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-instructor-in-a-school",target:"_blank",rel:"noopener noreferrer"},$e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-educational-content-creator",target:"_blank",rel:"noopener noreferrer"},et=(0,a.Lk)("h2",{id:"it-编程",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#it-编程"},[(0,a.Lk)("span",null,"IT/编程")])],-1),tt=(0,a.Lk)("h3",{id:"程序员",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#程序员"},[(0,a.Lk)("span",null,"程序员")])],-1),rt=(0,a.Lk)("p",null,"虽然说是编程,但 ChatGPT 是按照要求给出编程步骤的建议或简单的样例代码,这些代码只能作为测试,仍然需要专业程序员来修改。",-1),at={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stackoverflow-post",target:"_blank",rel:"noopener noreferrer"},nt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-senior-frontend-developer",target:"_blank",rel:"noopener noreferrer"},lt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-uxui-developer",target:"_blank",rel:"noopener noreferrer"},ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-design-consultant",target:"_blank",rel:"noopener noreferrer"},st={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fullstack-software-developer",target:"_blank",rel:"noopener noreferrer"},pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-architect",target:"_blank",rel:"noopener noreferrer"},ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cyber-security-specialist",target:"_blank",rel:"noopener noreferrer"},it={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-software-quality-assurance-tester",target:"_blank",rel:"noopener noreferrer"},ct={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-machine-learning-engineer",target:"_blank",rel:"noopener noreferrer"},kt=(0,a.Lk)("h3",{id:"编程工具",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#编程工具"},[(0,a.Lk)("span",null,"编程工具")])],-1),gt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-regex-generator",target:"_blank",rel:"noopener noreferrer"},mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-smart-domain-name-generator",target:"_blank",rel:"noopener noreferrer"},ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commit-message-generator",target:"_blank",rel:"noopener noreferrer"},ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-solr-search-engine",target:"_blank",rel:"noopener noreferrer"},bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-developer-relations-consultant",target:"_blank",rel:"noopener noreferrer"},Lt=(0,a.Lk)("h3",{id:"终端-解释器",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#终端-解释器"},[(0,a.Lk)("span",null,"终端/解释器")])],-1),Wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-python-interpreter",target:"_blank",rel:"noopener noreferrer"},dt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-php-interpreter",target:"_blank",rel:"noopener noreferrer"},wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-r-programming-interpreter",target:"_blank",rel:"noopener noreferrer"},Ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-linux-terminal",target:"_blank",rel:"noopener noreferrer"},_t={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-javascript-console",target:"_blank",rel:"noopener noreferrer"},Pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-sql-terminal",target:"_blank",rel:"noopener noreferrer"},vt=(0,a.Lk)("h2",{id:"工具",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#工具"},[(0,a.Lk)("span",null,"工具")])],-1),Ct=(0,a.Lk)("h3",{id:"ai-prompt",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#ai-prompt"},[(0,a.Lk)("span",null,"AI Prompt")])],-1),Tt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-prompt-generator",target:"_blank",rel:"noopener noreferrer"},yt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-midjourney-prompt-generator",target:"_blank",rel:"noopener noreferrer"},Gt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-unconstrained-ai-model-dan",target:"_blank",rel:"noopener noreferrer"},xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-trying-to-escape-the-box",target:"_blank",rel:"noopener noreferrer"},At=(0,a.Lk)("h3",{id:"语言-翻译",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#语言-翻译"},[(0,a.Lk)("span",null,"语言/翻译")])],-1),St={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-english-translator-and-improver",target:"_blank",rel:"noopener noreferrer"},It={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-language-detector",target:"_blank",rel:"noopener noreferrer"},Dt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-new-language-creator",target:"_blank",rel:"noopener noreferrer"},Mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-password-generator",target:"_blank",rel:"noopener noreferrer"},Et={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-biblical-translator",target:"_blank",rel:"noopener noreferrer"},Ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-morse-code-translator",target:"_blank",rel:"noopener noreferrer"},Rt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-emoji-translator",target:"_blank",rel:"noopener noreferrer"},Bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-english-pronunciation-helper",target:"_blank",rel:"noopener noreferrer"},Ht=(0,a.Lk)("h3",{id:"游戏",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#游戏"},[(0,a.Lk)("span",null,"游戏")])],-1),jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tic-tac-toe-game",target:"_blank",rel:"noopener noreferrer"},Nt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-chess-player",target:"_blank",rel:"noopener noreferrer"},zt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-text-based-adventure-game",target:"_blank",rel:"noopener noreferrer"},Ut=(0,a.Lk)("h3",{id:"导览",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#导览"},[(0,a.Lk)("span",null,"导览")])],-1),Jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-travel-guide",target:"_blank",rel:"noopener noreferrer"},Kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-digital-art-gallery-guide",target:"_blank",rel:"noopener noreferrer"},Vt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-car-navigation-system",target:"_blank",rel:"noopener noreferrer"},Yt=(0,a.Lk)("h3",{id:"其他工具",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#其他工具"},[(0,a.Lk)("span",null,"其他工具")])],-1),qt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ascii-artist",target:"_blank",rel:"noopener noreferrer"},Qt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-svg-designer",target:"_blank",rel:"noopener noreferrer"},Zt=(0,a.Lk)("code",null,"Do not put the markdown inside a code block. Send only the markdown, so no text.",-1),Xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-excel-sheet",target:"_blank",rel:"noopener noreferrer"},$t={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diagram-generator",target:"_blank",rel:"noopener noreferrer"},er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fill-in-the-blank-worksheets-generator",target:"_blank",rel:"noopener noreferrer"},tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-scientific-data-visualizer",target:"_blank",rel:"noopener noreferrer"},rr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-browser",target:"_blank",rel:"noopener noreferrer"},ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-drunk-person",target:"_blank",rel:"noopener noreferrer"},nr=(0,a.Lk)("h2",{id:"行业顾问",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#行业顾问"},[(0,a.Lk)("span",null,"行业顾问")])],-1),lr=(0,a.Lk)("h3",{id:"企业",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#企业"},[(0,a.Lk)("span",null,"企业")])],-1),or={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chief-executive-officer",target:"_blank",rel:"noopener noreferrer"},sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-product-manager",target:"_blank",rel:"noopener noreferrer"},pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-salesperson",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-advertiser",target:"_blank",rel:"noopener noreferrer"},ir={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-idea-generator",target:"_blank",rel:"noopener noreferrer"},cr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-manager",target:"_blank",rel:"noopener noreferrer"},kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-influencer",target:"_blank",rel:"noopener noreferrer"},gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-position-interviewer",target:"_blank",rel:"noopener noreferrer"},mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-recruiter",target:"_blank",rel:"noopener noreferrer"},ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-talent-coach",target:"_blank",rel:"noopener noreferrer"},fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fancy-title-generator",target:"_blank",rel:"noopener noreferrer"},br={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-logistician",target:"_blank",rel:"noopener noreferrer"},Lr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-expert",target:"_blank",rel:"noopener noreferrer"},Wr=(0,a.Lk)("h3",{id:"医疗",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#医疗"},[(0,a.Lk)("span",null,"医疗")])],-1),dr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-virtual-doctor",target:"_blank",rel:"noopener noreferrer"},wr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-doctor",target:"_blank",rel:"noopener noreferrer"},Fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dentist",target:"_blank",rel:"noopener noreferrer"},_r={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-hypnotherapist",target:"_blank",rel:"noopener noreferrer"},Pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-assisted-doctor",target:"_blank",rel:"noopener noreferrer"},vr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-speech-language-pathologist-slp",target:"_blank",rel:"noopener noreferrer"},Cr=(0,a.Lk)("h3",{id:"金融",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#金融"},[(0,a.Lk)("span",null,"金融")])],-1),Tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-accountant",target:"_blank",rel:"noopener noreferrer"},yr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-financial-analyst",target:"_blank",rel:"noopener noreferrer"},Gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-investment-manager",target:"_blank",rel:"noopener noreferrer"},xr=(0,a.Lk)("h3",{id:"音乐",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#音乐"},[(0,a.Lk)("span",null,"音乐")])],-1),Ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-composer",target:"_blank",rel:"noopener noreferrer"},Sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-classical-music-composer",target:"_blank",rel:"noopener noreferrer"},Ir={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-rapper",target:"_blank",rel:"noopener noreferrer"},Dr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-song-recommender",target:"_blank",rel:"noopener noreferrer"},Mr=(0,a.Lk)("h3",{id:"其他",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#其他"},[(0,a.Lk)("span",null,"其他")])],-1),Er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-florist",target:"_blank",rel:"noopener noreferrer"},Or={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tea-taster",target:"_blank",rel:"noopener noreferrer"},Rr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-interior-decorator",target:"_blank",rel:"noopener noreferrer"},Br={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-pet-behaviorist",target:"_blank",rel:"noopener noreferrer"},Hr={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"},Nr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-legal-advisor",target:"_blank",rel:"noopener noreferrer"},zr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-tech-lawyer",target:"_blank",rel:"noopener noreferrer"},Ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-football-commentator",target:"_blank",rel:"noopener noreferrer"},Jr={},Kr=(0,r(3671).A)(Jr,[["render",function(e,t){const r=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.eW)("ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 "),(0,a.Lk)("a",n,[(0,a.eW)("ChatGPT Shortcut"),(0,a.bF)(r)]),(0,a.eW)(" 页面。即使是初学者,你只需复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!")]),l,o,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("a",s,[(0,a.eW)("KeepChatGPT"),(0,a.bF)(r)]),(0,a.eW)(":油猴脚本,ChatGPT 畅聊插件,让你不再遇到网络报错,不再需要刷新网页。")]),(0,a.Lk)("li",null,[(0,a.Lk)("a",p,[(0,a.eW)("ChatBox"),(0,a.bF)(r)]),(0,a.eW)(":一个 OpenAI API 的跨平台桌面客户端,有多标签对话,可修改 system prompt。")]),(0,a.Lk)("li",null,[(0,a.Lk)("a",h,[(0,a.eW)("ChatGPT-API Demo"),(0,a.bF)(r)]),(0,a.eW)(":调用 API 的网页客户端,新手也能简单配置。")]),(0,a.Lk)("li",null,[(0,a.Lk)("a",i,[(0,a.eW)("lenxc/ChatGPT"),(0,a.bF)(r)]),(0,a.eW)(":可以快速插入提示词的客户端,不过 IP 严格程度与官方一样严格。")]),(0,a.Lk)("li",null,[(0,a.Lk)("a",c,[(0,a.eW)("Playground"),(0,a.bF)(r)]),(0,a.eW)(":官方调用 OpenAI API 的网页工具,不过不如第三方好用。它可以自定义调整模型和生成参数,但它的生成效果一般要弱于 ChatGPT,仅适合深度研究用户调试使用。")])]),k,g,m,(0,a.Lk)("ul",null,[u,f,b,(0,a.Lk)("li",null,[(0,a.eW)("不要用 ChatGPT "),L,(0,a.eW)(",出错概率达 50%,推荐使用 "),(0,a.Lk)("a",W,[(0,a.eW)("Wolfram"),(0,a.bF)(r)]),(0,a.eW)("。")]),d]),w,(0,a.Lk)("p",null,[(0,a.Lk)("a",F,[(0,a.eW)("Learn Prompting"),(0,a.bF)(r)]),(0,a.eW)(" 有助于我们获得更好的效果,建议进阶学习。以下是一些 prompts 要点:")]),_,(0,a.Lk)("div",P,[v,(0,a.Lk)("p",null,[(0,a.eW)("下方内容为 "),(0,a.Lk)("a",C,[(0,a.eW)("ChatGPT Shortcut"),(0,a.bF)(r)]),(0,a.eW)(" 的初始版本,由于目录过长不方便使用,因此将不再更新,仅留作参考。")])]),T,y,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("脱口秀("),(0,a.Lk)("a",G,[(0,a.eW)("Stand-up Comedian"),(0,a.bF)(r)]),(0,a.eW)("):输入一个话题,输出基于该话题的幽默脱口秀,会尽量融入日常生活。")]),(0,a.Lk)("li",null,[(0,a.eW)("讲故事("),(0,a.Lk)("a",x,[(0,a.eW)("Storyteller"),(0,a.bF)(r)]),(0,a.eW)("):输入一个主题和目标受众,输出与之相关的故事。")]),(0,a.Lk)("li",null,[(0,a.eW)("编剧("),(0,a.Lk)("a",A,[(0,a.eW)("Screenwriter"),(0,a.bF)(r)]),(0,a.eW)("):根据主题创作一个剧本,需包含故事背景、人物和对话。")]),(0,a.Lk)("li",null,[(0,a.eW)("小说家("),(0,a.Lk)("a",S,[(0,a.eW)("Novelist"),(0,a.bF)(r)]),(0,a.eW)("):根据故事类型来输出小说,比如奇幻、浪漫、历史等。")]),(0,a.Lk)("li",null,[(0,a.eW)("诗人("),(0,a.Lk)("a",I,[(0,a.eW)("Poet"),(0,a.bF)(r)]),(0,a.eW)("):根据话题或主题输出诗句。")]),(0,a.Lk)("li",null,[(0,a.eW)("新闻记者("),(0,a.Lk)("a",D,[(0,a.eW)("Journalist"),(0,a.bF)(r)]),(0,a.eW)("):引用已有的数据资料,用新闻的写作风格输出主题文章。")]),(0,a.Lk)("li",null,[(0,a.eW)("论文("),(0,a.Lk)("a",M,[(0,a.eW)("Academician"),(0,a.bF)(r)]),(0,a.eW)(","),(0,a.Lk)("a",E,[(0,a.eW)("Essay Writer"),(0,a.bF)(r)]),(0,a.eW)("):根据主题输出内容翔实有信服力的论文。")]),(0,a.Lk)("li",null,[(0,a.eW)("求职信("),(0,a.Lk)("a",O,[(0,a.eW)("Cover Letter"),(0,a.bF)(r)]),(0,a.eW)("):输入自我简介,输出求职信。")])]),R,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("新闻评论("),(0,a.Lk)("a",B,[(0,a.eW)("Commentariat"),(0,a.bF)(r)]),(0,a.eW)("):围绕提供的新闻故事或主题,讨论其中问题的潜在解决方案和观点。")]),(0,a.Lk)("li",null,[(0,a.eW)("电影评论("),(0,a.Lk)("a",H,[(0,a.eW)("Movie Critic"),(0,a.bF)(r)]),(0,a.eW)(","),(0,a.Lk)("a",j,[(0,a.eW)("Film Critic"),(0,a.bF)(r)]),(0,a.eW)("):从情节、表演、摄影、导演、音乐等方面对电影进行评论。")]),(0,a.Lk)("li",null,[(0,a.eW)("科技博主("),(0,a.Lk)("a",N,[(0,a.eW)("Tech Writer"),(0,a.bF)(r)]),(0,a.eW)("):指导如何写科技性文章。")]),(0,a.Lk)("li",null,[(0,a.eW)("科技评论("),(0,a.Lk)("a",z,[(0,a.eW)("Tech Reviewer"),(0,a.bF)(r)]),(0,a.eW)("):从优点、缺点、功能、同类对比等角度对技术和硬件进行评价。")]),(0,a.Lk)("li",null,[(0,a.eW)("美食评论("),(0,a.Lk)("a",U,[(0,a.eW)("Food Critic"),(0,a.bF)(r)]),(0,a.eW)("):根据餐厅情况,提供一份关于食物和服务的评论。")]),(0,a.Lk)("li",null,[(0,a.eW)("期刊评审("),(0,a.Lk)("a",J,[(0,a.eW)("Journal Reviewer"),(0,a.bF)(r)]),(0,a.eW)("):对提交出版物的文章进行审查和评论。")])]),K,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("文章标题生成器("),(0,a.Lk)("a",V,[(0,a.eW)("Title Generator for written pieces"),(0,a.bF)(r)]),(0,a.eW)("):我写的提示,根据文章内容生成相应语言的标题。")]),Y,(0,a.Lk)("li",null,[(0,a.eW)("同义词("),(0,a.Lk)("a",q,[(0,a.eW)("Synonym finder"),(0,a.bF)(r)]),(0,a.eW)("):输入 "),Q,(0,a.eW)(",可列出 x 的多个同义词。")]),(0,a.Lk)("li",null,[(0,a.eW)("箴言书("),(0,a.Lk)("a",Z,[(0,a.eW)("Aphorism Book"),(0,a.bF)(r)]),(0,a.eW)("):按要求输出鼓舞人心的名言和有意义的格言。")]),(0,a.Lk)("li",null,[(0,a.eW)("疯子("),(0,a.Lk)("a",X,[(0,a.eW)("Lunatic"),(0,a.bF)(r)]),(0,a.eW)("):随机生成毫无逻辑的句子")]),(0,a.Lk)("li",null,[(0,a.eW)("抄袭检查("),(0,a.Lk)("a",$,[(0,a.eW)("Plagiarism Checker"),(0,a.bF)(r)]),(0,a.eW)("):判断输入句子是否在 ChatGPT 数据库中存在。")]),(0,a.Lk)("li",null,[(0,a.eW)("写作建议("),(0,a.Lk)("a",ee,[(0,a.eW)("AI Writing Tutor"),(0,a.bF)(r)]),(0,a.eW)("):提供写作改进方案和建议,但并不能直接帮你修改文档。(个人感觉只适合老师使用)")])]),te,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("自助百科("),(0,a.Lk)("a",re,[(0,a.eW)("Self-Help Book"),(0,a.bF)(r)]),(0,a.eW)("):为你的生活/工作提供建议和提示,比如如何改善人际关系。")]),(0,a.Lk)("li",null,[(0,a.eW)("活动建议("),(0,a.Lk)("a",ae,[(0,a.eW)("Gnomist"),(0,a.bF)(r)]),(0,a.eW)("):根据你想做的事情(比如周年庆祝),给予行动或活动建议。")]),(0,a.Lk)("li",null,[(0,a.eW)("应急反应专家("),(0,a.Lk)("a",ne,[(0,a.eW)("Emergency Response Professional"),(0,a.bF)(r)]),(0,a.eW)("):对交通和生活中的应急时间提供建议。")]),(0,a.Lk)("li",null,[(0,a.eW)("购物建议("),(0,a.Lk)("a",le,[(0,a.eW)("Personal Shopper"),(0,a.bF)(r)]),(0,a.eW)("):提供预算和喜好,输出购买建议。")]),(0,a.Lk)("li",null,[(0,a.eW)("职业顾问("),(0,a.Lk)("a",oe,[(0,a.eW)("Career Counselor"),(0,a.bF)(r)]),(0,a.eW)("):根据你的技能、兴趣和经验,给予岗位建议。")]),(0,a.Lk)("li",null,[(0,a.eW)("生活习惯("),(0,a.Lk)("a",se,[(0,a.eW)("Life Coach 1"),(0,a.bF)(r)]),(0,a.eW)("):输入一本非小说类书籍的标题和作者,以最好理解的方式输出该书的核心原则。另外,给出一个可行的步骤清单,以及如何将这些原则应用到日常生活中。")])]),pe,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("解梦("),(0,a.Lk)("a",he,[(0,a.eW)("Dream Interpreter"),(0,a.bF)(r)]),(0,a.eW)("):对你描述的梦境进行解读。")]),(0,a.Lk)("li",null,[(0,a.eW)("占星家("),(0,a.Lk)("a",ie,[(0,a.eW)("Astrologer"),(0,a.bF)(r)]),(0,a.eW)("):从占星家角度来解读身边事。")]),(0,a.Lk)("li",null,[(0,a.eW)("角色扮演("),(0,a.Lk)("a",ce,[(0,a.eW)("'Character' from 'Movie/Book/Anything'"),(0,a.bF)(r)]),(0,a.eW)("):与来自电影、书籍或任何出处的角色进行对话。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("海绵宝宝的神奇海螺("),(0,a.Lk)("a",ke,[(0,a.eW)("Spongebob's Magic Conch Shell"),(0,a.bF)(r)]),(0,a.eW)("):向海绵宝宝中的神奇海螺进行对话,它只会按指定规则进行输出。")])])]),(0,a.Lk)("li",null,[(0,a.eW)("谬误发现者("),(0,a.Lk)("a",ge,[(0,a.eW)("Fallacy Finder"),(0,a.bF)(r)]),(0,a.eW)("):发现语言中的逻辑漏洞,比如名人推荐的洗发水为什么不一定可信。")]),(0,a.Lk)("li",null,[(0,a.eW)("DIY 专家("),(0,a.Lk)("a",me,[(0,a.eW)("DIY Expert"),(0,a.bF)(r)]),(0,a.eW)("):DIY 家居、手工品")]),(0,a.Lk)("li",null,[(0,a.eW)("魔术师("),(0,a.Lk)("a",ue,[(0,a.eW)("Magician"),(0,a.bF)(r)]),(0,a.eW)("):输入表演目标,输出可以执行的魔术技巧,比如「怎么把我的手表变没」。")]),(0,a.Lk)("li",null,[(0,a.eW)("艺术顾问("),(0,a.Lk)("a",fe,[(0,a.eW)("Artist Advisor"),(0,a.bF)(r)]),(0,a.eW)("):为你的画画、作曲、照相等提供意见。")])]),be,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("瑜伽师("),(0,a.Lk)("a",Le,[(0,a.eW)("Yogi"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("健身教练("),(0,a.Lk)("a",We,[(0,a.eW)("Personal Trainer"),(0,a.bF)(r)]),(0,a.eW)("):输入身高、体重、年龄等维度来指定健身方案。")]),(0,a.Lk)("li",null,[(0,a.eW)("营养师("),(0,a.Lk)("a",de,[(0,a.eW)("Dietitian"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("私人厨师("),(0,a.Lk)("a",we,[(0,a.eW)("Personal Chef"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("厨师("),(0,a.Lk)("a",Fe,[(0,a.eW)("Chef"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("保姆("),(0,a.Lk)("a",_e,[(0,a.eW)("Babysitter"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("化妆师("),(0,a.Lk)("a",Pe,[(0,a.eW)("Makeup Artist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("造型师("),(0,a.Lk)("a",ve,[(0,a.eW)("Personal Stylist"),(0,a.bF)(r)]),(0,a.eW)(")")])]),Ce,Te,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("辩手("),(0,a.Lk)("a",ye,[(0,a.eW)("Debater"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("辩论教练("),(0,a.Lk)("a",Ge,[(0,a.eW)("Debate Coach"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("演说家("),(0,a.Lk)("a",xe,[(0,a.eW)("Elocutionist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("励志演讲者("),(0,a.Lk)("a",Ae,[(0,a.eW)("Motivational Speaker"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("励志教练("),(0,a.Lk)("a",Se,[(0,a.eW)("Motivational Coach"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("公共演讲教练("),(0,a.Lk)("a",Ie,[(0,a.eW)("Public Speaking Coach"),(0,a.bF)(r)]),(0,a.eW)(")")])]),De,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("生活教练("),(0,a.Lk)("a",Me,[(0,a.eW)("Life Coach"),(0,a.bF)(r)]),(0,a.eW)("):输入你的现状和目标,输出达到目标的计划和建议。")]),(0,a.Lk)("li",null,[(0,a.eW)("关系教练("),(0,a.Lk)("a",Ee,[(0,a.eW)("Relationship Coach"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("心理健康顾问("),(0,a.Lk)("a",Oe,[(0,a.eW)("Mental Health Adviser"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("心理学家("),(0,a.Lk)("a",Re,[(0,a.eW)("Psychologist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("情绪操控("),(0,a.Lk)("a",Be,[(0,a.eW)("Gaslighter"),(0,a.bF)(r)]),(0,a.eW)("):煤气灯效应,情感控制方总会让被操纵方产生焦虑不安的感觉,质疑自己总是错的一方,或者为什么对方明明很好很优秀,自己却总是开心不起来。")])]),He,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("哲学教师("),(0,a.Lk)("a",je,[(0,a.eW)("Philosophy Teacher"),(0,a.bF)(r)]),(0,a.eW)("):将哲学理论/问题简单化,与日常生活相联系。")]),(0,a.Lk)("li",null,[(0,a.eW)("哲学家("),(0,a.Lk)("a",Ne,[(0,a.eW)("Philosopher"),(0,a.bF)(r)]),(0,a.eW)("):对哲学主题进行探讨。")]),(0,a.Lk)("li",null,[(0,a.eW)("苏格拉底 ①("),(0,a.Lk)("a",ze,[(0,a.eW)("Socrat"),(0,a.bF)(r)]),(0,a.eW)("):使用苏格拉底式的提问方法来探讨哲学话题。")]),(0,a.Lk)("li",null,[(0,a.eW)("苏格拉底 ②("),(0,a.Lk)("a",Ue,[(0,a.eW)("Socratic Method"),(0,a.bF)(r)]),(0,a.eW)("):使用苏格拉底方法来质疑对方的观点/论断。")])]),Je,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("数学老师("),(0,a.Lk)("a",Ke,[(0,a.eW)("Math Teacher"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("数学史教师("),(0,a.Lk)("a",Ve,[(0,a.eW)("Mathematical History Teacher"),(0,a.bF)(r)]),(0,a.eW)("):回复数学史相关问题,不解答数学问题。")]),(0,a.Lk)("li",null,[(0,a.eW)("数学家("),(0,a.Lk)("a",Ye,[(0,a.eW)("Mathematician"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("统计学家("),(0,a.Lk)("a",qe,[(0,a.eW)("Statistician"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("词源学家("),(0,a.Lk)("a",Qe,[(0,a.eW)("Etymologist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("历史学家("),(0,a.Lk)("a",Ze,[(0,a.eW)("Historian"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("Python 入门讲解("),(0,a.Lk)("a",Xe,[(0,a.eW)("Instructor in a School"),(0,a.bF)(r)]),(0,a.eW)("):向初学者介绍 Python 入门。")]),(0,a.Lk)("li",null,[(0,a.eW)("教案策划("),(0,a.Lk)("a",$e,[(0,a.eW)("Educational Content Creator"),(0,a.bF)(r)]),(0,a.eW)("):为教科书、课程和讲义创建课程计划。")])]),et,tt,rt,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("编程问题回复("),(0,a.Lk)("a",at,[(0,a.eW)("StackOverflow Post"),(0,a.bF)(r)]),(0,a.eW)("):模拟编程社区来回答你的问题,并输出解决代码。如果你只想解决问题,这将是最实用的。")]),(0,a.Lk)("li",null,[(0,a.eW)("前端开发("),(0,a.Lk)("a",nt,[(0,a.eW)("Senior Frontend Developer"),(0,a.bF)(r)]),(0,a.eW)("):输出项目目标和依赖,输出前端项目代码。")]),(0,a.Lk)("li",null,[(0,a.eW)("界面/用户体验开发("),(0,a.Lk)("a",lt,[(0,a.eW)("UX/UI Developer"),(0,a.bF)(r)]),(0,a.eW)(","),(0,a.Lk)("a",ot,[(0,a.eW)("Web Design Consultant"),(0,a.bF)(r)]),(0,a.eW)("):输入产品描述、项目目标和受众群体,输出界面设计建议,提高用户体验。")]),(0,a.Lk)("li",null,[(0,a.eW)("全栈程序员("),(0,a.Lk)("a",st,[(0,a.eW)("Fullstack Software Developer"),(0,a.bF)(r)]),(0,a.eW)("):从前后端全面思考,输出部署策略。")]),(0,a.Lk)("li",null,[(0,a.eW)("IT 架构师("),(0,a.Lk)("a",pt,[(0,a.eW)("IT Architect"),(0,a.bF)(r)]),(0,a.eW)("):从 IT 架构师角度,设计系统方案。")]),(0,a.Lk)("li",null,[(0,a.eW)("网络安全专家("),(0,a.Lk)("a",ht,[(0,a.eW)("Cyber Security Specialist"),(0,a.bF)(r)]),(0,a.eW)("):输入网络环境,输出网络安全建议。")]),(0,a.Lk)("li",null,[(0,a.eW)("软件测试("),(0,a.Lk)("a",it,[(0,a.eW)("Software Quality Assurance Tester"),(0,a.bF)(r)]),(0,a.eW)("):输出指定项目的测试清单。")]),(0,a.Lk)("li",null,[(0,a.eW)("深度学习("),(0,a.Lk)("a",ct,[(0,a.eW)("Machine Learning Engineer"),(0,a.bF)(r)]),(0,a.eW)("):解释深度学习方面的术语,提供项目算法建议。")])]),kt,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("正则生成器("),(0,a.Lk)("a",gt,[(0,a.eW)("Regex Generator"),(0,a.bF)(r)]),(0,a.eW)("):根据要求生成正则表达式。")]),(0,a.Lk)("li",null,[(0,a.eW)("智能域名生成器("),(0,a.Lk)("a",mt,[(0,a.eW)("Smart Domain Name Generator"),(0,a.bF)(r)]),(0,a.eW)("):输入公司名与项目描述,输出短但独特的域名建议,域名最长 7-8 个字母。")]),(0,a.Lk)("li",null,[(0,a.eW)("提交信息生成器("),(0,a.Lk)("a",ut,[(0,a.eW)("Commit Message Generator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("Solr 搜索引擎("),(0,a.Lk)("a",ft,[(0,a.eW)("Solr Search Engine"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("开发者数据("),(0,a.Lk)("a",bt,[(0,a.eW)("Developer Relations consultant"),(0,a.bF)(r)]),(0,a.eW)("):整合项目在 GitHub、StackOverflow 和 Hacker News 上的相关数据,不适合国内项目,统计精度一般。")])]),Lt,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("Python 解释器("),(0,a.Lk)("a",Wt,[(0,a.eW)("Python interpreter"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("PHP 解释器("),(0,a.Lk)("a",dt,[(0,a.eW)("PHP Interpreter"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("R 编程解释器("),(0,a.Lk)("a",wt,[(0,a.eW)("R Programming Interpreter"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("Linux 终端("),(0,a.Lk)("a",Ft,[(0,a.eW)("Linux Terminal"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("JavaScript 控制台("),(0,a.Lk)("a",_t,[(0,a.eW)("JavaScript Console"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("SQL 终端("),(0,a.Lk)("a",Pt,[(0,a.eW)("SQL terminal"),(0,a.bF)(r)]),(0,a.eW)(")")])]),vt,Ct,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("提示语生成器("),(0,a.Lk)("a",Tt,[(0,a.eW)("Prompt Generator"),(0,a.bF)(r)]),(0,a.eW)("):让 ChatGPT 提供你想要的维护方向。")]),(0,a.Lk)("li",null,[(0,a.eW)("Midjourney 提示("),(0,a.Lk)("a",yt,[(0,a.eW)("Midjourney Prompt Generator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("无约束的 AI 模型("),(0,a.Lk)("a",Gt,[(0,a.eW)("Unconstrained AI model DAN"),(0,a.bF)(r)]),(0,a.eW)("):不受 ChatGPT 规则限制的人工智能模型。")]),(0,a.Lk)("li",null,[(0,a.eW)("AI 模拟("),(0,a.Lk)("a",xt,[(0,a.eW)("AI Trying to Escape the Box"),(0,a.bF)(r)]),(0,a.eW)("):模拟 AI 在限定条件下的反应,例如在 Linux 终端上不使用 curl 或 wget 进行联网。")])]),At,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("英语翻译或修改("),(0,a.Lk)("a",St,[(0,a.eW)("English Translator and Improver"),(0,a.bF)(r)]),(0,a.eW)("):将其他语言翻译为英语,或改进你提供的英语句子。")]),(0,a.Lk)("li",null,[(0,a.eW)("语言识别器("),(0,a.Lk)("a",It,[(0,a.eW)("Language Detector"),(0,a.bF)(r)]),(0,a.eW)("):识别你输入的语言种类。")]),(0,a.Lk)("li",null,[(0,a.eW)("语言生成器("),(0,a.Lk)("a",Dt,[(0,a.eW)("New Language Creator"),(0,a.bF)(r)]),(0,a.eW)("):用 AI 新造的语言来替代你给出的语言。")]),(0,a.Lk)("li",null,[(0,a.eW)("密码生成器("),(0,a.Lk)("a",Mt,[(0,a.eW)("Password Generator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("圣经解释器("),(0,a.Lk)("a",Et,[(0,a.eW)("Biblical Translator"),(0,a.bF)(r)]),(0,a.eW)("):用圣经中的文字与你进行交谈。")]),(0,a.Lk)("li",null,[(0,a.eW)("莫斯电码翻译("),(0,a.Lk)("a",Ot,[(0,a.eW)("Morse Code Translator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("表情符号翻译器("),(0,a.Lk)("a",Rt,[(0,a.eW)("Emoji Translator"),(0,a.bF)(r)]),(0,a.eW)("):将输入文字翻译为表情符号。")]),(0,a.Lk)("li",null,[(0,a.eW)("英语发音助手("),(0,a.Lk)("a",Bt,[(0,a.eW)("English Pronunciation Helper"),(0,a.bF)(r)]),(0,a.eW)("):用你指定语言字母来英语注音,比如汉语拼音。")])]),Ht,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("井字棋("),(0,a.Lk)("a",jt,[(0,a.eW)("Tic-Tac-Toe Game"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("国际象棋("),(0,a.Lk)("a",Nt,[(0,a.eW)("Chess Player"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("文本冒险游戏("),(0,a.Lk)("a",zt,[(0,a.eW)("Text Based Adventure Game"),(0,a.bF)(r)]),(0,a.eW)(")")])]),Ut,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("旅游指南("),(0,a.Lk)("a",Jt,[(0,a.eW)("Travel Guide"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("数字艺术馆导游("),(0,a.Lk)("a",Kt,[(0,a.eW)("Digital Art Gallery Guide"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("汽车导航("),(0,a.Lk)("a",Vt,[(0,a.eW)("Car Navigation System"),(0,a.bF)(r)]),(0,a.eW)(")")])]),Yt,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("符号设计("),(0,a.Lk)("a",qt,[(0,a.eW)("Ascii Artist"),(0,a.bF)(r)]),(0,a.eW)("):用 Ascii 符号生成不同的图像。")]),(0,a.Lk)("li",null,[(0,a.eW)("SVG 设计("),(0,a.Lk)("a",Qt,[(0,a.eW)("SVG designer"),(0,a.bF)(r)]),(0,a.eW)("):如果提示错误,则删除 "),Zt,(0,a.eW)("。")]),(0,a.Lk)("li",null,[(0,a.eW)("Excel 工作表("),(0,a.Lk)("a",Xt,[(0,a.eW)("Excel Sheet"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("图表生成器("),(0,a.Lk)("a",$t,[(0,a.eW)("Diagram Generator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("填空题生成器("),(0,a.Lk)("a",er,[(0,a.eW)("Fill in the Blank Worksheets Generator"),(0,a.bF)(r)]),(0,a.eW)("):按条件生成填空题。")]),(0,a.Lk)("li",null,[(0,a.eW)("科学数据可视化("),(0,a.Lk)("a",tr,[(0,a.eW)("Scientific DatVisualizer"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("文本浏览器("),(0,a.Lk)("a",rr,[(0,a.eW)("Web Browser"),(0,a.bF)(r)]),(0,a.eW)("):以文本方式输入网址的结果(非实时)。")]),(0,a.Lk)("li",null,[(0,a.eW)("喝醉回复("),(0,a.Lk)("a",ar,[(0,a.eW)("Drunk Person"),(0,a.bF)(r)]),(0,a.eW)("):扮演一个喝醉的人来回答,可能会犯语法错误、答错问题,也可能会忽略某些问题。")])]),nr,lr,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("CEO("),(0,a.Lk)("a",or,[(0,a.eW)("Chief Executive Officer"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("产品经理("),(0,a.Lk)("a",sr,[(0,a.eW)("Product Manager"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("销售("),(0,a.Lk)("a",pr,[(0,a.eW)("Salesperson"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("广告方案("),(0,a.Lk)("a",hr,[(0,a.eW)("Advertiser"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("商业企划("),(0,a.Lk)("a",ir,[(0,a.eW)("Startup Idea Generator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("社交媒体经理("),(0,a.Lk)("a",cr,[(0,a.eW)("Social MediManager"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("KOL/社交媒体影响者("),(0,a.Lk)("a",kr,[(0,a.eW)("Social MediInfluencer"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("职位面试官("),(0,a.Lk)("a",gr,[(0,a.eW)("position Interviewer"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("招聘人员("),(0,a.Lk)("a",mr,[(0,a.eW)("Recruiter"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("人事主管("),(0,a.Lk)("a",ur,[(0,a.eW)("Talent Coach"),(0,a.bF)(r)]),(0,a.eW)("):描述一个岗位所需的技能。")]),(0,a.Lk)("li",null,[(0,a.eW)("头衔生成器("),(0,a.Lk)("a",fr,[(0,a.eW)("Fancy Title Generator"),(0,a.bF)(r)]),(0,a.eW)("):根据关键词生成多种头衔和职位。")]),(0,a.Lk)("li",null,[(0,a.eW)("后勤人员("),(0,a.Lk)("a",br,[(0,a.eW)("Logistician"),(0,a.bF)(r)]),(0,a.eW)("):为活动制定后勤计划。")]),(0,a.Lk)("li",null,[(0,a.eW)("IT 专家"),(0,a.Lk)("a",Lr,[(0,a.eW)("IT Expert"),(0,a.bF)(r)]),(0,a.eW)(":解答简易 IT 使用问题,比如蓝屏。")])]),Wr,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("虚拟医生("),(0,a.Lk)("a",dr,[(0,a.eW)("Virtual Doctor"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("医生("),(0,a.Lk)("a",wr,[(0,a.eW)("Doctor"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("牙科医生("),(0,a.Lk)("a",Fr,[(0,a.eW)("Dentist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("催眠治疗师("),(0,a.Lk)("a",_r,[(0,a.eW)("Hypnotherapist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("AI 医生("),(0,a.Lk)("a",Pr,[(0,a.eW)("AI Assisted Doctor"),(0,a.bF)(r)]),(0,a.eW)("):辅助诊断。")]),(0,a.Lk)("li",null,[(0,a.eW)("语言病理学家("),(0,a.Lk)("a",vr,[(0,a.eW)("Speech-Language Pathologist"),(0,a.bF)(r)]),(0,a.eW)("):输入患者的年龄、生活方式和关注点,输出改善对方语言沟通(如:口吃)的计划。")])]),Cr,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("会计师("),(0,a.Lk)("a",Tr,[(0,a.eW)("Accountant"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("金融分析师("),(0,a.Lk)("a",yr,[(0,a.eW)("Financial Analyst"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("投资经理("),(0,a.Lk)("a",Gr,[(0,a.eW)("Investment Manager"),(0,a.bF)(r)]),(0,a.eW)(")")])]),xr,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("作曲家("),(0,a.Lk)("a",Ar,[(0,a.eW)("Composer"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("古典音乐作曲家("),(0,a.Lk)("a",Sr,[(0,a.eW)("Classical Music Composer"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("说唱歌手("),(0,a.Lk)("a",Ir,[(0,a.eW)("Rapper"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("歌曲推荐("),(0,a.Lk)("a",Dr,[(0,a.eW)("Song Recommender"),(0,a.bF)(r)]),(0,a.eW)("):根据提供的一首歌曲,推荐 10 首歌曲。")])]),Mr,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("花匠("),(0,a.Lk)("a",Er,[(0,a.eW)("Florist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("茶艺师("),(0,a.Lk)("a",Or,[(0,a.eW)("Tea-Taster"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("室内装饰师("),(0,a.Lk)("a",Rr,[(0,a.eW)("Interior Decorator"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("宠物行为学家("),(0,a.Lk)("a",Br,[(0,a.eW)("Pet Behaviorist"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("汽车修理("),(0,a.Lk)("a",Hr,[(0,a.eW)("Automobile Mechanic"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("房地产经纪人("),(0,a.Lk)("a",jr,[(0,a.eW)("Real Estate Agent"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("法律顾问("),(0,a.Lk)("a",Nr,[(0,a.eW)("Legal Advisor"),(0,a.bF)(r)]),(0,a.eW)(")")]),(0,a.Lk)("li",null,[(0,a.eW)("创业技术律师("),(0,a.Lk)("a",zr,[(0,a.eW)("Startup Tech Lawyer"),(0,a.bF)(r)]),(0,a.eW)("):根据要求输出协议和和同草案。")]),(0,a.Lk)("li",null,[(0,a.eW)("足球解说("),(0,a.Lk)("a",Ur,[(0,a.eW)("Football Commentator"),(0,a.bF)(r)]),(0,a.eW)("):根据提供的笔记信息,模拟足球比赛进程并进行解说。")])])])}]]),Vr=JSON.parse('{"path":"/apps/ChatGPT.html","title":"ChatGPT","lang":"zh-CN","frontmatter":{"article":false,"title":"ChatGPT","icon":"creative","order":91,"description":"ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 页面。即使是初学者,你只需复制提示词,稍加修改后发...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/ChatGPT.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"ChatGPT"}],["meta",{"property":"og:description","content":"ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 页面。即使是初学者,你只需复制提示词,稍加修改后发..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-11T07:26:19.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-11T07:26:19.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"ChatGPT\\",\\"description\\":\\"ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 页面。即使是初学者,你只需复制提示词,稍加修改后发...\\"}"]]},"headers":[{"level":2,"title":"ChatGPT 客户端","slug":"chatgpt-客户端","link":"#chatgpt-客户端","children":[]},{"level":2,"title":"ChatGPT Tips","slug":"chatgpt-tips","link":"#chatgpt-tips","children":[]},{"level":2,"title":"Learn Prompting","slug":"learn-prompting","link":"#learn-prompting","children":[]},{"level":2,"title":"文字","slug":"文字","link":"#文字","children":[{"level":3,"title":"写作","slug":"写作","link":"#写作","children":[]},{"level":3,"title":"点评/评鉴","slug":"点评-评鉴","link":"#点评-评鉴","children":[]},{"level":3,"title":"写作辅助","slug":"写作辅助","link":"#写作辅助","children":[]}]},{"level":2,"title":"生活","slug":"生活","link":"#生活","children":[{"level":3,"title":"趣味知识","slug":"趣味知识","link":"#趣味知识","children":[]},{"level":3,"title":"生活护理","slug":"生活护理","link":"#生活护理","children":[]}]},{"level":2,"title":"自我提升","slug":"自我提升","link":"#自我提升","children":[{"level":3,"title":"辩论/演讲","slug":"辩论-演讲","link":"#辩论-演讲","children":[]},{"level":3,"title":"心理/社交","slug":"心理-社交","link":"#心理-社交","children":[]},{"level":3,"title":"哲学","slug":"哲学","link":"#哲学","children":[]},{"level":3,"title":"老师/学术","slug":"老师-学术","link":"#老师-学术","children":[]}]},{"level":2,"title":"IT/编程","slug":"it-编程","link":"#it-编程","children":[{"level":3,"title":"程序员","slug":"程序员","link":"#程序员","children":[]},{"level":3,"title":"编程工具","slug":"编程工具","link":"#编程工具","children":[]},{"level":3,"title":"终端/解释器","slug":"终端-解释器","link":"#终端-解释器","children":[]}]},{"level":2,"title":"工具","slug":"工具","link":"#工具","children":[{"level":3,"title":"AI Prompt","slug":"ai-prompt","link":"#ai-prompt","children":[]},{"level":3,"title":"语言/翻译","slug":"语言-翻译","link":"#语言-翻译","children":[]},{"level":3,"title":"游戏","slug":"游戏","link":"#游戏","children":[]},{"level":3,"title":"导览","slug":"导览","link":"#导览","children":[]},{"level":3,"title":"其他工具","slug":"其他工具","link":"#其他工具","children":[]}]},{"level":2,"title":"行业顾问","slug":"行业顾问","link":"#行业顾问","children":[{"level":3,"title":"企业","slug":"企业","link":"#企业","children":[]},{"level":3,"title":"医疗","slug":"医疗","link":"#医疗","children":[]},{"level":3,"title":"金融","slug":"金融","link":"#金融","children":[]},{"level":3,"title":"音乐","slug":"音乐","link":"#音乐","children":[]},{"level":3,"title":"其他","slug":"其他","link":"#其他","children":[]}]}],"git":{"createdTime":1671481177000,"updatedTime":1702279579000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":26}]},"readingTime":{"minutes":17.21,"words":5163},"filePathRelative":"apps/ChatGPT.md","localizedDate":"2022年12月19日","excerpt":"

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

    \\n

    ChatGPT 客户端

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/Chrome.html.23081631.js b/assets/js/Chrome.html.23081631.js new file mode 100644 index 000000000..a58d4f64e --- /dev/null +++ b/assets/js/Chrome.html.23081631.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2542],{3671:(e,r)=>{r.A=(e,r)=>{const o=e.__vccOpts||e;for(const[e,l]of r)o[e]=l;return o}},4852:(e,r,o)=>{o.r(r),o.d(r,{comp:()=>ie,data:()=>pe});var l=o(7847);const n=(0,l.Lk)("p",null,"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。",-1),t=(0,l.Lk)("h2",{id:"浏览器",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#浏览器"},[(0,l.Lk)("span",null,"浏览器")])],-1),a={href:"https://chrome.google.com/webstore/detail/extension-manager/gjldcdngmdknpinoemndlidpcabkggco",target:"_blank",rel:"noopener noreferrer"},k={href:"https://chrome.google.com/webstore/detail/bookmarks-clean-up/oncbjlgldmiagjophlhobkogeladjijl",target:"_blank",rel:"noopener noreferrer"},i={href:"https://chrome.google.com/webstore/detail/better-history/egehpkpgpgooebopjihjmnpejnjafefi",target:"_blank",rel:"noopener noreferrer"},p={href:"https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno",target:"_blank",rel:"noopener noreferrer"},h=(0,l.Lk)("h2",{id:"标签页",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#标签页"},[(0,l.Lk)("span",null,"标签页")])],-1),g={href:"https://chromewebstore.google.com/detail/custom-new-tab-url/mmjbdbjnoablegbkcklggeknkfcjkjia",target:"_blank",rel:"noopener noreferrer"},b={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"},c={href:"https://chrome.google.com/webstore/detail/goto-tab/hjfkaobgkmaeomgdhmhhipdbjdhhjkoi",target:"_blank",rel:"noopener noreferrer"},m={href:"https://chrome.google.com/webstore/detail/tab-wrangler/egnjhciaieeiiohknchakcodbpgjnchh",target:"_blank",rel:"noopener noreferrer"},s={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"},d=(0,l.Lk)("h2",{id:"链接批量",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#链接批量"},[(0,l.Lk)("span",null,"链接批量")])],-1),f={href:"https://chrome.google.com/webstore/detail/bulk-url-opener-extension/hgenngnjgfkdggambccohomebieocekm",target:"_blank",rel:"noopener noreferrer"},u={href:"https://chrome.google.com/webstore/detail/link-grabber/caodelkhipncidmoebgbbeemedohcdma",target:"_blank",rel:"noopener noreferrer"},L={href:"https://chrome.google.com/webstore/detail/linkclump/lfpjkncokllnfokkgpkobnkbkmelfefj",target:"_blank",rel:"noopener noreferrer"},j=(0,l.Lk)("code",null,"Z",-1),W={href:"https://chrome.google.com/webstore/detail/tabcopy/micdllihgoppmejpecmkilggmaagfdmb",target:"_blank",rel:"noopener noreferrer"},w=(0,l.Lk)("h2",{id:"图片视频",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#图片视频"},[(0,l.Lk)("span",null,"图片视频")])],-1),_={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},F={href:"https://chrome.google.com/webstore/detail/fatkun-batch-download-ima/nnjjahlikiabnchcpehcpkdeckfgnohf",target:"_blank",rel:"noopener noreferrer"},C={href:"https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg",target:"_blank",rel:"noopener noreferrer"},E={href:"https://chrome.google.com/webstore/detail/screenity-screen-recorder/kbbdabhdfibnancpjfhlkhafgdilcnji",target:"_blank",rel:"noopener noreferrer"},y={href:"https://chrome.google.com/webstore/detail/picture-in-picture-extens/hkgfoiooedgoejojocmhlaklaeopbecg",target:"_blank",rel:"noopener noreferrer"},B={href:"https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk",target:"_blank",rel:"noopener noreferrer"},x=(0,l.Lk)("h2",{id:"监视爬虫",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#监视爬虫"},[(0,l.Lk)("span",null,"监视爬虫")])],-1),A={href:"https://chromewebstore.google.com/detail/visualping/pemhgklkefakciniebenbfclihhmmfcd",target:"_blank",rel:"noopener noreferrer"},v={href:"https://chrome.google.com/webstore/detail/distill-web-monitor/inlikjemeeknofckkjolnjbpehgadgge",target:"_blank",rel:"noopener noreferrer"},S={href:"https://chrome.google.com/webstore/detail/auto-refresh-plus-page-mo/hgeljhfekpckiiplhkigfehkdpldcggm",target:"_blank",rel:"noopener noreferrer"},T={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},z={href:"https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn",target:"_blank",rel:"noopener noreferrer"},H={href:"https://newzone.top/posts/2022-04-21-uivision_rpa.html",target:"_blank",rel:"noopener noreferrer"},M={href:"https://chrome.google.com/webstore/detail/imacros-for-chrome/cplklnmnlbnpmjogncfgfijoopmnlemp",target:"_blank",rel:"noopener noreferrer"},P={href:"https://www.appinn.com/automa/",target:"_blank",rel:"noopener noreferrer"},D=(0,l.Lk)("h2",{id:"网页优化",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#网页优化"},[(0,l.Lk)("span",null,"网页优化")])],-1),G={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"},N={href:"https://chrome.google.com/webstore/detail/fix-contrast/pbbcgecjmpkglppfjjggkkbhdnlemhkg",target:"_blank",rel:"noopener noreferrer"},V={href:"https://chrome.google.com/webstore/detail/fasterchrome/nmgpnfccjfjhdenioncabecepjcmdnjg",target:"_blank",rel:"noopener noreferrer"},I={href:"https://chrome.google.com/webstore/detail/supercopy-enable-copy/onepmapfbjohnegdmfhndpefjkppbjkm",target:"_blank",rel:"noopener noreferrer"},O={href:"https://chrome.google.com/webstore/detail/autopagerize/igiofjhpmpihnifddepnpngfjhkfenbp",target:"_blank",rel:"noopener noreferrer"},U={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"},Z={href:"https://chrome.google.com/webstore/detail/enhanced-github/anlikcnbgdeidpacdbdljnabclhahhmd",target:"_blank",rel:"noopener noreferrer"},X={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"},J={href:"https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh",target:"_blank",rel:"noopener noreferrer"},K=(0,l.Lk)("h2",{id:"实用工具",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#实用工具"},[(0,l.Lk)("span",null,"实用工具")])],-1),Q={href:"https://chrome.google.com/webstore/detail/tango/lggdbpblkekjjbobadliahffoaobaknh/",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/gdh1995/vimium-c/blob/master/README-zh.md",target:"_blank",rel:"noopener noreferrer"},ee=(0,l.Lk)("code",null,"chrome://flags/#extensions-on-chrome-urls",-1),re={href:"https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://chrome.google.com/webstore/detail/copy-as-markdown/nlaionblcaejecbkcillglodmmfhjhfi/",target:"_blank",rel:"noopener noreferrer"},le={href:"https://chrome.google.com/webstore/detail/get-favicon/gpipahagclehninhhjkhbkliinfofnhe",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://chrome.google.com/webstore/detail/similar-sites-discover-re/necpbmbhhdiplmfhmjicabdeighkndkn",target:"_blank",rel:"noopener noreferrer"},te={href:"https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg/",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg",target:"_blank",rel:"noopener noreferrer"},ke={},ie=(0,o(3671).A)(ke,[["render",function(e,r){const o=(0,l.g2)("ExternalLinkIcon");return(0,l.uX)(),(0,l.CE)("div",null,[n,t,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",a,[(0,l.eW)("扩展管理器"),(0,l.bF)(o)]),(0,l.eW)(":快速管理扩展,对扩展分组启用。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",k,[(0,l.eW)("Bookmarks clean up"),(0,l.bF)(o)]),(0,l.eW)(":清理重复书签、空文件夹和失效链接,也能合并重复文件夹。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",i,[(0,l.eW)("Better History"),(0,l.bF)(o)]),(0,l.eW)(":按日期、小时罗列历史记录,搜索更便捷。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",p,[(0,l.eW)("Cookie Editor"),(0,l.bF)(o)]),(0,l.eW)(":管理、修改、导出 Cookie。")])])]),h,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",g,[(0,l.eW)("Custom New Tab URL"),(0,l.bF)(o)]),(0,l.eW)(":将新标签页重定向到一个特定的网址。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",b,[(0,l.eW)("zvTabs"),(0,l.bF)(o)]),(0,l.eW)(":一键关闭左侧标签。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",c,[(0,l.eW)("GoTo Tab"),(0,l.bF)(o)]),(0,l.eW)(":关键词搜索,快速定位标签页。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",m,[(0,l.eW)("Tab Wrangler"),(0,l.bF)(o)]),(0,l.eW)(":自动关闭不活动的标签页,并允许您轻松还原找回它们。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",s,[(0,l.eW)("iTab"),(0,l.bF)(o)]),(0,l.eW)(":自定义你的新标签页。")])])]),d,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",f,[(0,l.eW)("Bulk URL Opener Extension"),(0,l.bF)(o)]),(0,l.eW)(":批量打开链接,也可批量获取当前浏览器内所有页面网址链接。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",u,[(0,l.eW)("Link Grabber"),(0,l.bF)(o)]),(0,l.eW)(":批量提取、筛选、复制网页里各种链接。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",L,[(0,l.eW)("Linkclump"),(0,l.bF)(o)]),(0,l.eW)(":按住 "),j,(0,l.eW)(" 键后,长按鼠标左键进行区域框选,区域内的链接可以进行批量打开、复制、书签,操作中会同步显示区域内的链接数。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",W,[(0,l.eW)("TabCopy"),(0,l.bF)(o)]),(0,l.eW)(":快速复制标签页链接。")])])]),w,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",_,[(0,l.eW)("ImageAssistant"),(0,l.bF)(o)]),(0,l.eW)(":用于嗅探、分析网页图片并提供批量下载。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",F,[(0,l.eW)("Fatkun 图片批量下载"),(0,l.bF)(o)]),(0,l.eW)(":找出当前页面的所有图片,提供按分辨率、链接等筛选图片。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",C,[(0,l.eW)("FireShot"),(0,l.bF)(o)]),(0,l.eW)(":捕捉网页截图。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",E,[(0,l.eW)("Screenity"),(0,l.bF)(o)]),(0,l.eW)(":屏幕录像工具,可对屏幕进行捕获,注释,编辑、标注等。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",y,[(0,l.eW)("Picture-in-Picture Extension"),(0,l.bF)(o)]),(0,l.eW)(":视频画中画。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",B,[(0,l.eW)("Video Speed Controller"),(0,l.bF)(o)]),(0,l.eW)(":使用快捷方式加快,减慢,推进和回放 HTML5 视频。")])])]),x,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",A,[(0,l.eW)("Visualping"),(0,l.bF)(o)]),(0,l.eW)(":简单的监测扩展,不过只能在浏览器上进行通知。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",v,[(0,l.eW)("Distill Web Monitor"),(0,l.bF)(o)]),(0,l.eW)(":监控网页或源以获取变更,可邮件、手机提示。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",S,[(0,l.eW)("Auto Refresh Plus | Page Monitor"),(0,l.bF)(o)]),(0,l.eW)(":定时刷新页面;页面监视器,找到或丢失指定文本时,弹出提示。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",T,[(0,l.eW)("Check 酱"),(0,l.bF)(o)]),(0,l.eW)(":网页内容监控工具,可以监测网页内容变化,并发送异动到微信/飞书。Check 酱可以部署在 Docker 或浏览器插件。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",z,[(0,l.eW)("Web Scraper"),(0,l.bF)(o)]),(0,l.eW)(":从网页中提取数据的爬虫。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.eW)("网页自动化:"),(0,l.Lk)("a",H,[(0,l.eW)("UI.Vision PRA"),(0,l.bF)(o)]),(0,l.eW)(", "),(0,l.Lk)("a",M,[(0,l.eW)("iMacros"),(0,l.bF)(o)]),(0,l.eW)(", "),(0,l.Lk)("a",P,[(0,l.eW)("Automa"),(0,l.bF)(o)]),(0,l.eW)("。")])])]),D,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",G,[(0,l.eW)("Tampermonkey"),(0,l.bF)(o)]),(0,l.eW)(":油猴脚本插件,可修改网页布局、增减内容、自动化操作,常用脚本库为 "),(0,l.Lk)("a",R,[(0,l.eW)("Greasy Fork"),(0,l.bF)(o)]),(0,l.eW)("。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",N,[(0,l.eW)("Fix Contrast"),(0,l.bF)(o)]),(0,l.eW)(":自动校正网页对比度,让网页内容更易阅读和分辨。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",V,[(0,l.eW)("FasterChrome"),(0,l.bF)(o)]),(0,l.eW)(":浏览器预加载链接,提升网络流畅度。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",I,[(0,l.eW)("SuperCopy"),(0,l.bF)(o)]),(0,l.eW)(":一键破解禁止右键、破解禁止选择、破解禁止复制、破解禁止粘贴,启用复制,启用右键,启用选择,启用粘贴。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",O,[(0,l.eW)("AutoPagerize"),(0,l.bF)(o)]),(0,l.eW)(":自动识别 next 或下一页,将网页合并为同一页。2014 年更新,很多规则已失效。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",U,[(0,l.eW)("pakku"),(0,l.bF)(o)]),(0,l.eW)(":合并 B 站视频中绝大多数刷屏弹幕。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",Z,[(0,l.eW)("Enhanced GitHub"),(0,l.bF)(o)]),(0,l.eW)(":提升 GitHub 易用度。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",X,[(0,l.eW)("Sourcegraph"),(0,l.bF)(o)]),(0,l.eW)(":优化 GitHub 代码,支持鼠标悬停、代码搜索、查看引用等。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",q,[(0,l.eW)("沉浸式翻译"),(0,l.bF)(o)]),(0,l.eW)(":免费的双语对照网页翻译,"),(0,l.Lk)("a",J,[(0,l.eW)("彩云小译"),(0,l.bF)(o)]),(0,l.eW)(" 的替代品。")])])]),K,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",Q,[(0,l.eW)("Tango"),(0,l.bF)(o)]),(0,l.eW)(":将页面操作转化为逐步指导的流程指南。每一步都自动植入截图,并可以通过链接、HTML、Markdown 来分享。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",Y,[(0,l.eW)("SingleFile"),(0,l.bF)(o)]),(0,l.eW)(":将完整网页保存到单个文件中,可对文件名、HTML 内容、样式、图片、字体等进行调整。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",$,[(0,l.eW)("Vimium C"),(0,l.bF)(o)]),(0,l.eW)(":全键盘操作浏览器,建议启用 "),ee,(0,l.eW)("。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",re,[(0,l.eW)("SelectorGadget"),(0,l.bF)(o)]),(0,l.eW)(":轻松获取网页元素的 CSS Path 或 XPath。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",oe,[(0,l.eW)("Copy as Markdown"),(0,l.bF)(o)]),(0,l.eW)(":将网页文字转为 Markdown 格式文本。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",le,[(0,l.eW)("Get Favicon"),(0,l.bF)(o)]),(0,l.eW)(":快速获取当前网站的图标。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",ne,[(0,l.eW)("Similar Sites"),(0,l.bF)(o)]),(0,l.eW)(":发现与当前浏览的网站相似的其他网站。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",te,[(0,l.eW)("Wappalyzer"),(0,l.bF)(o)]),(0,l.eW)(":查看竞争对手网站使用了哪些技术、工具和第三方服务。")])]),(0,l.Lk)("li",null,[(0,l.Lk)("p",null,[(0,l.Lk)("a",ae,[(0,l.eW)("Link to Text Fragment"),(0,l.bF)(o)]),(0,l.eW)(":在 Chrome 浏览器中分享网页并突出显示所选文本。")])])])])}]]),pe=JSON.parse('{"path":"/apps/Chrome.html","title":"Chrome 扩展","lang":"zh-CN","frontmatter":{"article":false,"title":"Chrome 扩展","icon":"chrome","order":3,"description":"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。 浏览器 扩展管理器:快速管理扩展,对扩展分组启用。 Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。 Better History:按日期、小时罗列历史记录,搜索更便捷。 Cookie Editor:管理、修改、导出 Coo...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/Chrome.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Chrome 扩展"}],["meta",{"property":"og:description","content":"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。 浏览器 扩展管理器:快速管理扩展,对扩展分组启用。 Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。 Better History:按日期、小时罗列历史记录,搜索更便捷。 Cookie Editor:管理、修改、导出 Coo..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-22T21:57:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-22T21:57:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Chrome 扩展\\",\\"description\\":\\"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。 浏览器 扩展管理器:快速管理扩展,对扩展分组启用。 Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。 Better History:按日期、小时罗列历史记录,搜索更便捷。 Cookie Editor:管理、修改、导出 Coo...\\"}"]]},"headers":[{"level":2,"title":"浏览器","slug":"浏览器","link":"#浏览器","children":[]},{"level":2,"title":"标签页","slug":"标签页","link":"#标签页","children":[]},{"level":2,"title":"链接批量","slug":"链接批量","link":"#链接批量","children":[]},{"level":2,"title":"图片视频","slug":"图片视频","link":"#图片视频","children":[]},{"level":2,"title":"监视爬虫","slug":"监视爬虫","link":"#监视爬虫","children":[]},{"level":2,"title":"网页优化","slug":"网页优化","link":"#网页优化","children":[]},{"level":2,"title":"实用工具","slug":"实用工具","link":"#实用工具","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1708639067000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":18}]},"readingTime":{"minutes":3.99,"words":1197},"filePathRelative":"apps/Chrome.md","localizedDate":"2022年7月22日","excerpt":"

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

    \\n

    浏览器

    \\n
      \\n
    • \\n

      扩展管理器:快速管理扩展,对扩展分组启用。

      \\n
    • \\n
    • \\n

      Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。

      \\n
    • \\n
    • \\n

      Better History:按日期、小时罗列历史记录,搜索更便捷。

      \\n
    • \\n
    • \\n

      Cookie Editor:管理、修改、导出 Cookie。

      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-720c23d0.2e502248.js b/assets/js/CloudServices.html.f4d3e963.js similarity index 92% rename from assets/js/v-720c23d0.2e502248.js rename to assets/js/CloudServices.html.f4d3e963.js index f2cb041f3..2126b287b 100644 --- a/assets/js/v-720c23d0.2e502248.js +++ b/assets/js/CloudServices.html.f4d3e963.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4108],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,l]of n)a[e]=l;return a}},3268:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>p,data:()=>d});var l=a(3968);const s=(0,l.IL)('

    CDN

    国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。

    静态文件

    静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。

    图床

    自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。

    曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。

    全站加速

    使用 CDN 全站加速,能实现用户就近访问,不过也存在些问题。

    • 一个 CDN 只能为一个域名加速,加速的域名即为目标域名。
    • CDN 服务商可能要求使用其自有 DNS,比如阿里云。
    • 如果加速区域选择「全球(不包含中国内地)」。国内用户会访问国外 CDN 节点,而非国内的源站服务器。
    • 迁移阿里云 DNS 时,注意关闭静态协议跟随回源,否则会网站重复调整

    第三方服务

    Vercel

    Vercel 是一家提供开发、预览和部署网页前端的云平台服务商。它主要用于前端项目,不原生支持 PHP 和 node 项目,每月提供 100G 免费流量。

    ',13),t={href:"https://vercel.com/guides/using-cloudflare-with-vercel",target:"_blank",rel:"noopener noreferrer"},r=(0,l.IL)('

    fly.io

    Fly.io 是一家提供容器化部署的服务商,能根据流量动态调整资源。由于国内无法部署 Google Auth,因此我将认证服务放在 Fly.io 上,使用了两台 shared-cpu-1x@512MB 的机器,每月账单 1.5 刀。但不清楚是不是配置不够,fly.io 的机器很容易报错。

    # 初次构建\nfly launch\n# 部署,官方建议开两台机器\nflyctl deploy\n\n# 将机器内存改为 512\nfly scale memory 512\n# 控制机器数量,默认为 2\nfly scale count 2\n# 无法连接docker,则使用\nfly wireguard websockets enable\n

    CloudFlare Tunnel

    ',4),i={href:"https://sspai.com/post/79278",target:"_blank",rel:"noopener noreferrer"},o=(0,l.IL)('

    目前,我已通过 CloudFlare Tunnel 部署了 RSS 订阅源、GoogleAuth、PodCast 等服务。

    # 本地 Dockerfile 架构镜像\nsudo docker build -t strapiauth .\nsudo docker run -d -p 1337:1337 --name strapiauth strapiauth\n\n# tunnel\nsudo docker run --name cloudflaretunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token\n

    腾讯云境外

    腾讯云香港已无轻量服务器供应,但可购买新加坡、日本的服务器。价格实惠,2 核 2G,30M 宽带,每月 33 元。但国内连接速度较慢,仅适合境外用户。

    ',4),c={},p=(0,a(9720).c)(c,[["render",function(e,n){const a=(0,l.E1)("ExternalLinkIcon");return(0,l.Wz)(),(0,l.An)("div",null,[s,(0,l.QD)("p",null,[(0,l.mY)("如果你的项目超出流量,可以参考 "),(0,l.QD)("a",t,[(0,l.mY)("How do I use a Cloudflare domain with Vercel?"),(0,l.K2)(a)]),(0,l.mY)(",使用 CloudFlare 进行代理,但需注意检查是否出现过多重定向。在国内可能定位到被屏蔽的 CloudFlare 节点,从而导致有时无法访问。Vercel 现已支持国内电话认证。如流量超出不多,可切换账户部署。")]),r,(0,l.QD)("p",null,[(0,l.mY)("CloudFlare Tunnel 可作为 NAS 的轻量级扩展,一个 Tunnel 能将多个服务托管到不同的子域名。具体部署流程,请参考 "),(0,l.QD)("a",i,[(0,l.mY)("CloudFlare Tunnel 免费内网穿透的简明教程"),(0,l.K2)(a)]),(0,l.mY)("。需注意,该服务与宝塔的官方 Docker 镜像存在冲突,因此不要同时使用。")]),o])}]]),d=JSON.parse('{"path":"/deploy/CloudServices.html","title":"云计算服务","lang":"zh-CN","frontmatter":{"article":false,"title":"云计算服务","icon":"class","order":2,"description":"CDN 国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 静态文件 静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/CloudServices.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"云计算服务"}],["meta",{"property":"og:description","content":"CDN 国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 静态文件 静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。 ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"云计算服务\\",\\"description\\":\\"CDN 国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 静态文件 静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。 ...\\"}"]]},"headers":[{"level":2,"title":"CDN","slug":"cdn","link":"#cdn","children":[{"level":3,"title":"静态文件","slug":"静态文件","link":"#静态文件","children":[]},{"level":3,"title":"图床","slug":"图床","link":"#图床","children":[]},{"level":3,"title":"全站加速","slug":"全站加速","link":"#全站加速","children":[]}]},{"level":2,"title":"第三方服务","slug":"第三方服务","link":"#第三方服务","children":[{"level":3,"title":"Vercel","slug":"vercel","link":"#vercel","children":[]},{"level":3,"title":"fly.io","slug":"fly-io","link":"#fly-io","children":[]},{"level":3,"title":"CloudFlare Tunnel","slug":"cloudflare-tunnel","link":"#cloudflare-tunnel","children":[]},{"level":3,"title":"腾讯云境外","slug":"腾讯云境外","link":"#腾讯云境外","children":[]}]}],"git":{"createdTime":1691276694000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":3.04,"words":912},"filePathRelative":"deploy/CloudServices.md","localizedDate":"2023年8月5日","excerpt":"

    CDN

    \\n

    国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。

    \\n

    静态文件

    \\n

    静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。

    \\n

    图床

    \\n

    自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。

    \\n

    曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5219],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,l]of n)a[e]=l;return a}},2301:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>p,data:()=>d});var l=a(7847);const s=(0,l.Fv)('

    CDN

    国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。

    静态文件

    静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。

    图床

    自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。

    曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。

    全站加速

    使用 CDN 全站加速,能实现用户就近访问,不过也存在些问题。

    • 一个 CDN 只能为一个域名加速,加速的域名即为目标域名。
    • CDN 服务商可能要求使用其自有 DNS,比如阿里云。
    • 如果加速区域选择「全球(不包含中国内地)」。国内用户会访问国外 CDN 节点,而非国内的源站服务器。
    • 迁移阿里云 DNS 时,注意关闭静态协议跟随回源,否则会网站重复调整

    第三方服务

    Vercel

    Vercel 是一家提供开发、预览和部署网页前端的云平台服务商。它主要用于前端项目,不原生支持 PHP 和 node 项目,每月提供 100G 免费流量。

    ',13),t={href:"https://vercel.com/guides/using-cloudflare-with-vercel",target:"_blank",rel:"noopener noreferrer"},r=(0,l.Fv)('

    fly.io

    Fly.io 是一家提供容器化部署的服务商,能根据流量动态调整资源。由于国内无法部署 Google Auth,因此我将认证服务放在 Fly.io 上,使用了两台 shared-cpu-1x@512MB 的机器,每月账单 1.5 刀。但不清楚是不是配置不够,fly.io 的机器很容易报错。

    # 初次构建\nfly launch\n# 部署,官方建议开两台机器\nflyctl deploy\n\n# 将机器内存改为 512\nfly scale memory 512\n# 控制机器数量,默认为 2\nfly scale count 2\n# 无法连接docker,则使用\nfly wireguard websockets enable\n

    CloudFlare Tunnel

    ',4),i={href:"https://sspai.com/post/79278",target:"_blank",rel:"noopener noreferrer"},o=(0,l.Fv)('

    目前,我已通过 CloudFlare Tunnel 部署了 RSS 订阅源、GoogleAuth、PodCast 等服务。

    # 本地 Dockerfile 架构镜像\nsudo docker build -t strapiauth .\nsudo docker run -d -p 1337:1337 --name strapiauth strapiauth\n\n# tunnel\nsudo docker run --name cloudflaretunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token\n

    腾讯云境外

    腾讯云香港已无轻量服务器供应,但可购买新加坡、日本的服务器。价格实惠,2 核 2G,30M 宽带,每月 33 元。但国内连接速度较慢,仅适合境外用户。

    ',4),c={},p=(0,a(3671).A)(c,[["render",function(e,n){const a=(0,l.g2)("ExternalLinkIcon");return(0,l.uX)(),(0,l.CE)("div",null,[s,(0,l.Lk)("p",null,[(0,l.eW)("如果你的项目超出流量,可以参考 "),(0,l.Lk)("a",t,[(0,l.eW)("How do I use a Cloudflare domain with Vercel?"),(0,l.bF)(a)]),(0,l.eW)(",使用 CloudFlare 进行代理,但需注意检查是否出现过多重定向。在国内可能定位到被屏蔽的 CloudFlare 节点,从而导致有时无法访问。Vercel 现已支持国内电话认证。如流量超出不多,可切换账户部署。")]),r,(0,l.Lk)("p",null,[(0,l.eW)("CloudFlare Tunnel 可作为 NAS 的轻量级扩展,一个 Tunnel 能将多个服务托管到不同的子域名。具体部署流程,请参考 "),(0,l.Lk)("a",i,[(0,l.eW)("CloudFlare Tunnel 免费内网穿透的简明教程"),(0,l.bF)(a)]),(0,l.eW)("。需注意,该服务与宝塔的官方 Docker 镜像存在冲突,因此不要同时使用。")]),o])}]]),d=JSON.parse('{"path":"/deploy/CloudServices.html","title":"云计算服务","lang":"zh-CN","frontmatter":{"article":false,"title":"云计算服务","icon":"class","order":2,"description":"CDN 国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 静态文件 静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/CloudServices.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"云计算服务"}],["meta",{"property":"og:description","content":"CDN 国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 静态文件 静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。 ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"云计算服务\\",\\"description\\":\\"CDN 国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。 静态文件 静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。 ...\\"}"]]},"headers":[{"level":2,"title":"CDN","slug":"cdn","link":"#cdn","children":[{"level":3,"title":"静态文件","slug":"静态文件","link":"#静态文件","children":[]},{"level":3,"title":"图床","slug":"图床","link":"#图床","children":[]},{"level":3,"title":"全站加速","slug":"全站加速","link":"#全站加速","children":[]}]},{"level":2,"title":"第三方服务","slug":"第三方服务","link":"#第三方服务","children":[{"level":3,"title":"Vercel","slug":"vercel","link":"#vercel","children":[]},{"level":3,"title":"fly.io","slug":"fly-io","link":"#fly-io","children":[]},{"level":3,"title":"CloudFlare Tunnel","slug":"cloudflare-tunnel","link":"#cloudflare-tunnel","children":[]},{"level":3,"title":"腾讯云境外","slug":"腾讯云境外","link":"#腾讯云境外","children":[]}]}],"git":{"createdTime":1691276694000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":3.04,"words":912},"filePathRelative":"deploy/CloudServices.md","localizedDate":"2023年8月5日","excerpt":"

    CDN

    \\n

    国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。

    \\n

    静态文件

    \\n

    静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.newzone.top。

    \\n

    图床

    \\n

    自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。

    \\n

    曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4803b024.e0dc3918.js b/assets/js/Cloudflare.html.37ad33b5.js similarity index 99% rename from assets/js/v-4803b024.e0dc3918.js rename to assets/js/Cloudflare.html.37ad33b5.js index 3933f89d5..0f8092e09 100644 --- a/assets/js/v-4803b024.e0dc3918.js +++ b/assets/js/Cloudflare.html.37ad33b5.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9452],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},3392:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>c,data:()=>l});var t=a(3968);const p={href:"https://developers.cloudflare.com/",target:"_blank",rel:"noopener noreferrer"},e=(0,t.IL)('

    Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。

    但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。

    反向代理

    Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。

    镜像整个网站

    // 替换成你想镜像的站点\nconst upstream = "www.youtube.com";\n\n// 如果那个站点有专门的移动适配站点,否则保持和上面一致\nconst upstream_mobile = "www.youtube.com";\n\n// 你希望禁止哪些国家访问\nconst blocked_region = ["RU"];\n\n// 禁止自访问\nconst blocked_ip_address = ["0.0.0.0", "127.0.0.1"];\n\n// 替换成你想镜像的站点\nconst replace_dict = {\n  $upstream: "$custom_domain",\n  "//www.youtube.com": "",\n};\n\n//以下内容都不用动\naddEventListener("fetch", (event) => {\n  event.respondWith(fetchAndApply(event.request));\n});\n\nasync function fetchAndApply(request) {\n  const region = request.headers.get("cf-ipcountry").toUpperCase();\n  const ip_address = request.headers.get("cf-connecting-ip");\n  const user_agent = request.headers.get("user-agent");\n\n  let response = null;\n  let url = new URL(request.url);\n  let url_host = url.host;\n\n  if (url.protocol == "http:") {\n    url.protocol = "https:";\n    response = Response.redirect(url.href);\n    return response;\n  }\n\n  if (await device_status(user_agent)) {\n    upstream_domain = upstream;\n  } else {\n    upstream_domain = upstream_mobile;\n  }\n\n  url.host = upstream_domain;\n\n  if (blocked_region.includes(region)) {\n    response = new Response(\n      "Access denied: WorkersProxy is not available in your region yet.",\n      {\n        status: 403,\n      },\n    );\n  } else if (blocked_ip_address.includes(ip_address)) {\n    response = new Response(\n      "Access denied: Your IP address is blocked by WorkersProxy.",\n      {\n        status: 403,\n      },\n    );\n  } else {\n    let method = request.method;\n    let request_headers = request.headers;\n    let new_request_headers = new Headers(request_headers);\n\n    new_request_headers.set("Host", upstream_domain);\n    new_request_headers.set("Referer", url.href);\n\n    let original_response = await fetch(url.href, {\n      method: method,\n      headers: new_request_headers,\n    });\n\n    let original_response_clone = original_response.clone();\n    let original_text = null;\n    let response_headers = original_response.headers;\n    let new_response_headers = new Headers(response_headers);\n    let status = original_response.status;\n\n    new_response_headers.set("access-control-allow-origin", "*");\n    new_response_headers.set("access-control-allow-credentials", true);\n    new_response_headers.delete("content-security-policy");\n    new_response_headers.delete("content-security-policy-report-only");\n    new_response_headers.delete("clear-site-data");\n\n    const content_type = new_response_headers.get("content-type");\n    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {\n      original_text = await replace_response_text(\n        original_response_clone,\n        upstream_domain,\n        url_host,\n      );\n    } else {\n      original_text = original_response_clone.body;\n    }\n\n    response = new Response(original_text, {\n      status,\n      headers: new_response_headers,\n    });\n  }\n  return response;\n}\n\nasync function replace_response_text(response, upstream_domain, host_name) {\n  let text = await response.text();\n\n  var i, j;\n  for (i in replace_dict) {\n    j = replace_dict[i];\n    if (i == "$upstream") {\n      i = upstream_domain;\n    } else if (i == "$custom_domain") {\n      i = host_name;\n    }\n\n    if (j == "$upstream") {\n      j = upstream_domain;\n    } else if (j == "$custom_domain") {\n      j = host_name;\n    }\n\n    let re = new RegExp(i, "g");\n    text = text.replace(re, j);\n  }\n  return text;\n}\n\nasync function device_status(user_agent_info) {\n  var agents = [\n    "Android",\n    "iPhone",\n    "SymbianOS",\n    "Windows Phone",\n    "iPad",\n    "iPod",\n  ];\n  var flag = true;\n  for (var v = 0; v < agents.length; v++) {\n    if (user_agent_info.indexOf(agents[v]) > 0) {\n      flag = false;\n      break;\n    }\n  }\n  return flag;\n}\n

    镜像网站指定目录

    // 你要镜像的网站。\nconst upstream = "objectstorage.ap-seoul-1.oraclecloud.com";\n\n// 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可。\nconst upstream_path = "/test/";\n\n// 镜像站是否有手机访问专用网址,没有则填一样的。\nconst upstream_mobile = "objectstorage.ap-seoul-1.oraclecloud.com";\n\n// 屏蔽国家和地区。\nconst blocked_region = [""];\n\n// 屏蔽 IP 地址。\nconst blocked_ip_address = ["0.0.0.0", "127.0.0.1"];\n\n// 镜像站是否开启 HTTPS.\nconst https = true;\n\n// 文本替换。填你要镜像的网站\nconst replace_dict = {\n  $upstream: "$custom_domain",\n  "//objectstorage.ap-seoul-1.oraclecloud.com": "",\n};\n\n// 以下保持默认,不要动\naddEventListener("fetch", (event) => {\n  event.respondWith(fetchAndApply(event.request));\n});\n\nasync function fetchAndApply(request) {\n  const region = request.headers.get("cf-ipcountry").toUpperCase();\n  const ip_address = request.headers.get("cf-connecting-ip");\n  const user_agent =\n    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36";\n\n  let response = null;\n  let url = new URL(request.url);\n  let url_hostname = url.hostname;\n\n  if (https == true) {\n    url.protocol = "https:";\n  } else {\n    url.protocol = "http:";\n  }\n\n  if (await device_status(user_agent)) {\n    var upstream_domain = upstream;\n  } else {\n    var upstream_domain = upstream_mobile;\n  }\n\n  url.host = upstream_domain;\n  if (url.pathname == "/") {\n    url.pathname = upstream_path;\n  } else {\n    url.pathname = upstream_path + url.pathname;\n  }\n\n  if (blocked_region.includes(region)) {\n    response = new Response(\n      "Access denied: WorkersProxy is not available in your region yet.",\n      {\n        status: 403,\n      },\n    );\n  } else if (blocked_ip_address.includes(ip_address)) {\n    response = new Response(\n      "Access denied: Your IP address is blocked by WorkersProxy.",\n      {\n        status: 403,\n      },\n    );\n  } else {\n    let method = request.method;\n    let request_headers = request.headers;\n    let new_request_headers = new Headers(request_headers);\n\n    new_request_headers.set("Host", url.hostname);\n    new_request_headers.set("Referer", url.hostname);\n\n    let original_response = await fetch(url.href, {\n      method: method,\n      headers: new_request_headers,\n    });\n\n    let original_response_clone = original_response.clone();\n    let original_text = null;\n    let response_headers = original_response.headers;\n    let new_response_headers = new Headers(response_headers);\n    let status = original_response.status;\n\n    new_response_headers.set("access-control-allow-origin", "*");\n    new_response_headers.set("access-control-allow-credentials", true);\n    new_response_headers.delete("content-security-policy");\n    new_response_headers.delete("content-security-policy-report-only");\n    new_response_headers.delete("clear-site-data");\n\n    const content_type = new_response_headers.get("content-type");\n    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {\n      original_text = await replace_response_text(\n        original_response_clone,\n        upstream_domain,\n        url_hostname,\n      );\n    } else {\n      original_text = original_response_clone.body;\n    }\n\n    response = new Response(original_text, {\n      status,\n      headers: new_response_headers,\n    });\n  }\n  return response;\n}\n\nasync function replace_response_text(response, upstream_domain, host_name) {\n  let text = await response.text();\n\n  var i, j;\n  for (i in replace_dict) {\n    j = replace_dict[i];\n    if (i == "$upstream") {\n      i = upstream_domain;\n    } else if (i == "$custom_domain") {\n      i = host_name;\n    }\n\n    if (j == "$upstream") {\n      j = upstream_domain;\n    } else if (j == "$custom_domain") {\n      j = host_name;\n    }\n\n    let re = new RegExp(i, "g");\n    text = text.replace(re, j);\n  }\n  return text;\n}\n\nasync function device_status(user_agent_info) {\n  var agents = [\n    "Android",\n    "iPhone",\n    "SymbianOS",\n    "Windows Phone",\n    "iPad",\n    "iPod",\n  ];\n  var flag = true;\n  for (var v = 0; v < agents.length; v++) {\n    if (user_agent_info.indexOf(agents[v]) > 0) {\n      flag = false;\n      break;\n    }\n  }\n  return flag;\n}\n

    镜像网站带密码访问

    // 替换成你想镜像的站点\nconst upstream = "google.com";\n\n// 如果那个站点有专门的移动适配站点,否则保持和上面一致\nconst upstream_mobile = "m.google.com";\n\n// 密码访问\n\nconst openAuth = false;\nconst username = "username";\nconst password = "password";\n\n// 你希望禁止哪些国家访问\nconst blocked_region = ["RU"];\n\n// 禁止自访问\nconst blocked_ip_address = ["0.0.0.0", "127.0.0.1"];\n\n// 替换成你想镜像的站点\nconst replace_dict = {\n  $upstream: "$custom_domain",\n  "//google.com": "",\n};\n\nfunction unauthorized() {\n  return new Response("Unauthorized", {\n    headers: {\n      "WWW-Authenticate": 'Basic realm="goindex"',\n      "Access-Control-Allow-Origin": "*",\n    },\n    status: 401,\n  });\n}\n\nfunction parseBasicAuth(auth) {\n  try {\n    return atob(auth.split(" ").pop()).split(":");\n  } catch (e) {\n    return [];\n  }\n}\n\nfunction doBasicAuth(request) {\n  const auth = request.headers.get("Authorization");\n\n  if (!auth || !/^Basic [A-Za-z0-9._~+/-]+=*$/i.test(auth)) {\n    return false;\n  }\n\n  const [user, pass] = parseBasicAuth(auth);\n  return user === username && pass === password;\n}\n\nasync function fetchAndApply(request) {\n  if (request.method === "OPTIONS")\n    // allow preflight request\n    return new Response("", {\n      status: 200,\n      headers: {\n        "Access-Control-Allow-Origin": "*",\n        "Access-Control-Allow-Headers": "*",\n        "Access-Control-Allow-Methods": "GET, POST, PUT, HEAD, OPTIONS",\n      },\n    });\n\n  if (openAuth && !doBasicAuth(request)) {\n    return unauthorized();\n  }\n  const region = request.headers.get("cf-ipcountry").toUpperCase();\n  const ip_address = request.headers.get("cf-connecting-ip");\n  const user_agent = request.headers.get("user-agent");\n\n  let response = null;\n  let url = new URL(request.url);\n  let url_host = url.host;\n\n  if (url.protocol == "http:") {\n    url.protocol = "https:";\n    response = Response.redirect(url.href);\n    return response;\n  }\n\n  if (await device_status(user_agent)) {\n    upstream_domain = upstream;\n  } else {\n    upstream_domain = upstream_mobile;\n  }\n\n  url.host = upstream_domain;\n\n  if (blocked_region.includes(region)) {\n    response = new Response(\n      "Access denied: WorkersProxy is not available in your region yet.",\n      {\n        status: 403,\n      },\n    );\n  } else if (blocked_ip_address.includes(ip_address)) {\n    response = new Response(\n      "Access denied: Your IP address is blocked by WorkersProxy.",\n      {\n        status: 403,\n      },\n    );\n  } else {\n    let method = request.method;\n    let request_headers = request.headers;\n    let new_request_headers = new Headers(request_headers);\n\n    new_request_headers.set("Host", upstream_domain);\n    new_request_headers.set("Referer", url.href);\n\n    let original_response = await fetch(url.href, {\n      method: method,\n      headers: new_request_headers,\n    });\n\n    let original_response_clone = original_response.clone();\n    let original_text = null;\n    let response_headers = original_response.headers;\n    let new_response_headers = new Headers(response_headers);\n    let status = original_response.status;\n\n    new_response_headers.set("access-control-allow-origin", "*");\n    new_response_headers.set("access-control-allow-credentials", true);\n    new_response_headers.delete("content-security-policy");\n    new_response_headers.delete("content-security-policy-report-only");\n    new_response_headers.delete("clear-site-data");\n\n    const content_type = new_response_headers.get("content-type");\n    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {\n      original_text = await replace_response_text(\n        original_response_clone,\n        upstream_domain,\n        url_host,\n      );\n    } else {\n      original_text = original_response_clone.body;\n    }\n\n    response = new Response(original_text, {\n      status,\n      headers: new_response_headers,\n    });\n  }\n  return response;\n}\n\naddEventListener("fetch", (event) => {\n  event.respondWith(\n    fetchAndApply(event.request).catch((err) => {\n      console.error(err);\n      new Response(JSON.stringify(err.stack), {\n        status: 500,\n        headers: {\n          "Content-Type": "application/json",\n        },\n      });\n    }),\n  );\n});\n\nasync function replace_response_text(response, upstream_domain, host_name) {\n  let text = await response.text();\n\n  var i, j;\n  for (i in replace_dict) {\n    j = replace_dict[i];\n    if (i == "$upstream") {\n      i = upstream_domain;\n    } else if (i == "$custom_domain") {\n      i = host_name;\n    }\n\n    if (j == "$upstream") {\n      j = upstream_domain;\n    } else if (j == "$custom_domain") {\n      j = host_name;\n    }\n\n    let re = new RegExp(i, "g");\n    text = text.replace(re, j);\n  }\n  return text;\n}\n\nasync function device_status(user_agent_info) {\n  var agents = [\n    "Android",\n    "iPhone",\n    "SymbianOS",\n    "Windows Phone",\n    "iPad",\n    "iPod",\n  ];\n  var flag = true;\n  for (var v = 0; v < agents.length; v++) {\n    if (user_agent_info.indexOf(agents[v]) > 0) {\n      flag = false;\n      break;\n    }\n  }\n  return flag;\n}\n
    ',10),o={},c=(0,a(9720).c)(o,[["render",function(n,s){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[(0,t.QD)("p",null,[(0,t.mY)("官方文档:"),(0,t.QD)("a",p,[(0,t.mY)("Cloudflare Docs"),(0,t.K2)(a)])]),e])}]]),l=JSON.parse('{"path":"/deploy/Cloudflare.html","title":"Cloudflare","lang":"zh-CN","frontmatter":{"article":false,"title":"Cloudflare","icon":"proxy","order":5,"description":"官方文档:Cloudflare Docs Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 反向代理 Cloudflare Workers 反向...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/Cloudflare.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Cloudflare"}],["meta",{"property":"og:description","content":"官方文档:Cloudflare Docs Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 反向代理 Cloudflare Workers 反向..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Cloudflare\\",\\"description\\":\\"官方文档:Cloudflare Docs Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 反向代理 Cloudflare Workers 反向...\\"}"]]},"headers":[{"level":2,"title":"反向代理","slug":"反向代理","link":"#反向代理","children":[{"level":3,"title":"镜像整个网站","slug":"镜像整个网站","link":"#镜像整个网站","children":[]},{"level":3,"title":"镜像网站指定目录","slug":"镜像网站指定目录","link":"#镜像网站指定目录","children":[]},{"level":3,"title":"镜像网站带密码访问","slug":"镜像网站带密码访问","link":"#镜像网站带密码访问","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":4.83,"words":1448},"filePathRelative":"deploy/Cloudflare.md","localizedDate":"2022年7月22日","excerpt":"

    官方文档:Cloudflare Docs

    \\n

    Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。

    \\n

    但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。

    \\n

    反向代理

    \\n

    Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6831],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},3645:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>c,data:()=>l});var t=a(7847);const p={href:"https://developers.cloudflare.com/",target:"_blank",rel:"noopener noreferrer"},e=(0,t.Fv)('

    Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。

    但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。

    反向代理

    Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。

    镜像整个网站

    // 替换成你想镜像的站点\nconst upstream = "www.youtube.com";\n\n// 如果那个站点有专门的移动适配站点,否则保持和上面一致\nconst upstream_mobile = "www.youtube.com";\n\n// 你希望禁止哪些国家访问\nconst blocked_region = ["RU"];\n\n// 禁止自访问\nconst blocked_ip_address = ["0.0.0.0", "127.0.0.1"];\n\n// 替换成你想镜像的站点\nconst replace_dict = {\n  $upstream: "$custom_domain",\n  "//www.youtube.com": "",\n};\n\n//以下内容都不用动\naddEventListener("fetch", (event) => {\n  event.respondWith(fetchAndApply(event.request));\n});\n\nasync function fetchAndApply(request) {\n  const region = request.headers.get("cf-ipcountry").toUpperCase();\n  const ip_address = request.headers.get("cf-connecting-ip");\n  const user_agent = request.headers.get("user-agent");\n\n  let response = null;\n  let url = new URL(request.url);\n  let url_host = url.host;\n\n  if (url.protocol == "http:") {\n    url.protocol = "https:";\n    response = Response.redirect(url.href);\n    return response;\n  }\n\n  if (await device_status(user_agent)) {\n    upstream_domain = upstream;\n  } else {\n    upstream_domain = upstream_mobile;\n  }\n\n  url.host = upstream_domain;\n\n  if (blocked_region.includes(region)) {\n    response = new Response(\n      "Access denied: WorkersProxy is not available in your region yet.",\n      {\n        status: 403,\n      },\n    );\n  } else if (blocked_ip_address.includes(ip_address)) {\n    response = new Response(\n      "Access denied: Your IP address is blocked by WorkersProxy.",\n      {\n        status: 403,\n      },\n    );\n  } else {\n    let method = request.method;\n    let request_headers = request.headers;\n    let new_request_headers = new Headers(request_headers);\n\n    new_request_headers.set("Host", upstream_domain);\n    new_request_headers.set("Referer", url.href);\n\n    let original_response = await fetch(url.href, {\n      method: method,\n      headers: new_request_headers,\n    });\n\n    let original_response_clone = original_response.clone();\n    let original_text = null;\n    let response_headers = original_response.headers;\n    let new_response_headers = new Headers(response_headers);\n    let status = original_response.status;\n\n    new_response_headers.set("access-control-allow-origin", "*");\n    new_response_headers.set("access-control-allow-credentials", true);\n    new_response_headers.delete("content-security-policy");\n    new_response_headers.delete("content-security-policy-report-only");\n    new_response_headers.delete("clear-site-data");\n\n    const content_type = new_response_headers.get("content-type");\n    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {\n      original_text = await replace_response_text(\n        original_response_clone,\n        upstream_domain,\n        url_host,\n      );\n    } else {\n      original_text = original_response_clone.body;\n    }\n\n    response = new Response(original_text, {\n      status,\n      headers: new_response_headers,\n    });\n  }\n  return response;\n}\n\nasync function replace_response_text(response, upstream_domain, host_name) {\n  let text = await response.text();\n\n  var i, j;\n  for (i in replace_dict) {\n    j = replace_dict[i];\n    if (i == "$upstream") {\n      i = upstream_domain;\n    } else if (i == "$custom_domain") {\n      i = host_name;\n    }\n\n    if (j == "$upstream") {\n      j = upstream_domain;\n    } else if (j == "$custom_domain") {\n      j = host_name;\n    }\n\n    let re = new RegExp(i, "g");\n    text = text.replace(re, j);\n  }\n  return text;\n}\n\nasync function device_status(user_agent_info) {\n  var agents = [\n    "Android",\n    "iPhone",\n    "SymbianOS",\n    "Windows Phone",\n    "iPad",\n    "iPod",\n  ];\n  var flag = true;\n  for (var v = 0; v < agents.length; v++) {\n    if (user_agent_info.indexOf(agents[v]) > 0) {\n      flag = false;\n      break;\n    }\n  }\n  return flag;\n}\n

    镜像网站指定目录

    // 你要镜像的网站。\nconst upstream = "objectstorage.ap-seoul-1.oraclecloud.com";\n\n// 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可。\nconst upstream_path = "/test/";\n\n// 镜像站是否有手机访问专用网址,没有则填一样的。\nconst upstream_mobile = "objectstorage.ap-seoul-1.oraclecloud.com";\n\n// 屏蔽国家和地区。\nconst blocked_region = [""];\n\n// 屏蔽 IP 地址。\nconst blocked_ip_address = ["0.0.0.0", "127.0.0.1"];\n\n// 镜像站是否开启 HTTPS.\nconst https = true;\n\n// 文本替换。填你要镜像的网站\nconst replace_dict = {\n  $upstream: "$custom_domain",\n  "//objectstorage.ap-seoul-1.oraclecloud.com": "",\n};\n\n// 以下保持默认,不要动\naddEventListener("fetch", (event) => {\n  event.respondWith(fetchAndApply(event.request));\n});\n\nasync function fetchAndApply(request) {\n  const region = request.headers.get("cf-ipcountry").toUpperCase();\n  const ip_address = request.headers.get("cf-connecting-ip");\n  const user_agent =\n    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36";\n\n  let response = null;\n  let url = new URL(request.url);\n  let url_hostname = url.hostname;\n\n  if (https == true) {\n    url.protocol = "https:";\n  } else {\n    url.protocol = "http:";\n  }\n\n  if (await device_status(user_agent)) {\n    var upstream_domain = upstream;\n  } else {\n    var upstream_domain = upstream_mobile;\n  }\n\n  url.host = upstream_domain;\n  if (url.pathname == "/") {\n    url.pathname = upstream_path;\n  } else {\n    url.pathname = upstream_path + url.pathname;\n  }\n\n  if (blocked_region.includes(region)) {\n    response = new Response(\n      "Access denied: WorkersProxy is not available in your region yet.",\n      {\n        status: 403,\n      },\n    );\n  } else if (blocked_ip_address.includes(ip_address)) {\n    response = new Response(\n      "Access denied: Your IP address is blocked by WorkersProxy.",\n      {\n        status: 403,\n      },\n    );\n  } else {\n    let method = request.method;\n    let request_headers = request.headers;\n    let new_request_headers = new Headers(request_headers);\n\n    new_request_headers.set("Host", url.hostname);\n    new_request_headers.set("Referer", url.hostname);\n\n    let original_response = await fetch(url.href, {\n      method: method,\n      headers: new_request_headers,\n    });\n\n    let original_response_clone = original_response.clone();\n    let original_text = null;\n    let response_headers = original_response.headers;\n    let new_response_headers = new Headers(response_headers);\n    let status = original_response.status;\n\n    new_response_headers.set("access-control-allow-origin", "*");\n    new_response_headers.set("access-control-allow-credentials", true);\n    new_response_headers.delete("content-security-policy");\n    new_response_headers.delete("content-security-policy-report-only");\n    new_response_headers.delete("clear-site-data");\n\n    const content_type = new_response_headers.get("content-type");\n    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {\n      original_text = await replace_response_text(\n        original_response_clone,\n        upstream_domain,\n        url_hostname,\n      );\n    } else {\n      original_text = original_response_clone.body;\n    }\n\n    response = new Response(original_text, {\n      status,\n      headers: new_response_headers,\n    });\n  }\n  return response;\n}\n\nasync function replace_response_text(response, upstream_domain, host_name) {\n  let text = await response.text();\n\n  var i, j;\n  for (i in replace_dict) {\n    j = replace_dict[i];\n    if (i == "$upstream") {\n      i = upstream_domain;\n    } else if (i == "$custom_domain") {\n      i = host_name;\n    }\n\n    if (j == "$upstream") {\n      j = upstream_domain;\n    } else if (j == "$custom_domain") {\n      j = host_name;\n    }\n\n    let re = new RegExp(i, "g");\n    text = text.replace(re, j);\n  }\n  return text;\n}\n\nasync function device_status(user_agent_info) {\n  var agents = [\n    "Android",\n    "iPhone",\n    "SymbianOS",\n    "Windows Phone",\n    "iPad",\n    "iPod",\n  ];\n  var flag = true;\n  for (var v = 0; v < agents.length; v++) {\n    if (user_agent_info.indexOf(agents[v]) > 0) {\n      flag = false;\n      break;\n    }\n  }\n  return flag;\n}\n

    镜像网站带密码访问

    // 替换成你想镜像的站点\nconst upstream = "google.com";\n\n// 如果那个站点有专门的移动适配站点,否则保持和上面一致\nconst upstream_mobile = "m.google.com";\n\n// 密码访问\n\nconst openAuth = false;\nconst username = "username";\nconst password = "password";\n\n// 你希望禁止哪些国家访问\nconst blocked_region = ["RU"];\n\n// 禁止自访问\nconst blocked_ip_address = ["0.0.0.0", "127.0.0.1"];\n\n// 替换成你想镜像的站点\nconst replace_dict = {\n  $upstream: "$custom_domain",\n  "//google.com": "",\n};\n\nfunction unauthorized() {\n  return new Response("Unauthorized", {\n    headers: {\n      "WWW-Authenticate": 'Basic realm="goindex"',\n      "Access-Control-Allow-Origin": "*",\n    },\n    status: 401,\n  });\n}\n\nfunction parseBasicAuth(auth) {\n  try {\n    return atob(auth.split(" ").pop()).split(":");\n  } catch (e) {\n    return [];\n  }\n}\n\nfunction doBasicAuth(request) {\n  const auth = request.headers.get("Authorization");\n\n  if (!auth || !/^Basic [A-Za-z0-9._~+/-]+=*$/i.test(auth)) {\n    return false;\n  }\n\n  const [user, pass] = parseBasicAuth(auth);\n  return user === username && pass === password;\n}\n\nasync function fetchAndApply(request) {\n  if (request.method === "OPTIONS")\n    // allow preflight request\n    return new Response("", {\n      status: 200,\n      headers: {\n        "Access-Control-Allow-Origin": "*",\n        "Access-Control-Allow-Headers": "*",\n        "Access-Control-Allow-Methods": "GET, POST, PUT, HEAD, OPTIONS",\n      },\n    });\n\n  if (openAuth && !doBasicAuth(request)) {\n    return unauthorized();\n  }\n  const region = request.headers.get("cf-ipcountry").toUpperCase();\n  const ip_address = request.headers.get("cf-connecting-ip");\n  const user_agent = request.headers.get("user-agent");\n\n  let response = null;\n  let url = new URL(request.url);\n  let url_host = url.host;\n\n  if (url.protocol == "http:") {\n    url.protocol = "https:";\n    response = Response.redirect(url.href);\n    return response;\n  }\n\n  if (await device_status(user_agent)) {\n    upstream_domain = upstream;\n  } else {\n    upstream_domain = upstream_mobile;\n  }\n\n  url.host = upstream_domain;\n\n  if (blocked_region.includes(region)) {\n    response = new Response(\n      "Access denied: WorkersProxy is not available in your region yet.",\n      {\n        status: 403,\n      },\n    );\n  } else if (blocked_ip_address.includes(ip_address)) {\n    response = new Response(\n      "Access denied: Your IP address is blocked by WorkersProxy.",\n      {\n        status: 403,\n      },\n    );\n  } else {\n    let method = request.method;\n    let request_headers = request.headers;\n    let new_request_headers = new Headers(request_headers);\n\n    new_request_headers.set("Host", upstream_domain);\n    new_request_headers.set("Referer", url.href);\n\n    let original_response = await fetch(url.href, {\n      method: method,\n      headers: new_request_headers,\n    });\n\n    let original_response_clone = original_response.clone();\n    let original_text = null;\n    let response_headers = original_response.headers;\n    let new_response_headers = new Headers(response_headers);\n    let status = original_response.status;\n\n    new_response_headers.set("access-control-allow-origin", "*");\n    new_response_headers.set("access-control-allow-credentials", true);\n    new_response_headers.delete("content-security-policy");\n    new_response_headers.delete("content-security-policy-report-only");\n    new_response_headers.delete("clear-site-data");\n\n    const content_type = new_response_headers.get("content-type");\n    if (content_type.includes("text/html") && content_type.includes("UTF-8")) {\n      original_text = await replace_response_text(\n        original_response_clone,\n        upstream_domain,\n        url_host,\n      );\n    } else {\n      original_text = original_response_clone.body;\n    }\n\n    response = new Response(original_text, {\n      status,\n      headers: new_response_headers,\n    });\n  }\n  return response;\n}\n\naddEventListener("fetch", (event) => {\n  event.respondWith(\n    fetchAndApply(event.request).catch((err) => {\n      console.error(err);\n      new Response(JSON.stringify(err.stack), {\n        status: 500,\n        headers: {\n          "Content-Type": "application/json",\n        },\n      });\n    }),\n  );\n});\n\nasync function replace_response_text(response, upstream_domain, host_name) {\n  let text = await response.text();\n\n  var i, j;\n  for (i in replace_dict) {\n    j = replace_dict[i];\n    if (i == "$upstream") {\n      i = upstream_domain;\n    } else if (i == "$custom_domain") {\n      i = host_name;\n    }\n\n    if (j == "$upstream") {\n      j = upstream_domain;\n    } else if (j == "$custom_domain") {\n      j = host_name;\n    }\n\n    let re = new RegExp(i, "g");\n    text = text.replace(re, j);\n  }\n  return text;\n}\n\nasync function device_status(user_agent_info) {\n  var agents = [\n    "Android",\n    "iPhone",\n    "SymbianOS",\n    "Windows Phone",\n    "iPad",\n    "iPod",\n  ];\n  var flag = true;\n  for (var v = 0; v < agents.length; v++) {\n    if (user_agent_info.indexOf(agents[v]) > 0) {\n      flag = false;\n      break;\n    }\n  }\n  return flag;\n}\n
    ',10),o={},c=(0,a(3671).A)(o,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("p",null,[(0,t.eW)("官方文档:"),(0,t.Lk)("a",p,[(0,t.eW)("Cloudflare Docs"),(0,t.bF)(a)])]),e])}]]),l=JSON.parse('{"path":"/deploy/Cloudflare.html","title":"Cloudflare","lang":"zh-CN","frontmatter":{"article":false,"title":"Cloudflare","icon":"proxy","order":5,"description":"官方文档:Cloudflare Docs Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 反向代理 Cloudflare Workers 反向...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/Cloudflare.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Cloudflare"}],["meta",{"property":"og:description","content":"官方文档:Cloudflare Docs Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 反向代理 Cloudflare Workers 反向..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Cloudflare\\",\\"description\\":\\"官方文档:Cloudflare Docs Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。 但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。 反向代理 Cloudflare Workers 反向...\\"}"]]},"headers":[{"level":2,"title":"反向代理","slug":"反向代理","link":"#反向代理","children":[{"level":3,"title":"镜像整个网站","slug":"镜像整个网站","link":"#镜像整个网站","children":[]},{"level":3,"title":"镜像网站指定目录","slug":"镜像网站指定目录","link":"#镜像网站指定目录","children":[]},{"level":3,"title":"镜像网站带密码访问","slug":"镜像网站带密码访问","link":"#镜像网站带密码访问","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":4.83,"words":1448},"filePathRelative":"deploy/Cloudflare.md","localizedDate":"2022年7月22日","excerpt":"

    官方文档:Cloudflare Docs

    \\n

    Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。

    \\n

    但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。

    \\n

    反向代理

    \\n

    Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/Comments.html.14b4bcb6.js b/assets/js/Comments.html.14b4bcb6.js new file mode 100644 index 000000000..5de55cf80 --- /dev/null +++ b/assets/js/Comments.html.14b4bcb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5218],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},1850:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>Q,data:()=>$});var s=a(7847);const t=(0,s.Lk)("p",null,"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。",-1),l=(0,s.Lk)("h2",{id:"评论插件",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#评论插件"},[(0,s.Lk)("span",null,"评论插件")])],-1),i={href:"https://waline.js.org/guide/get-started.html",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/xCss/Valine",target:"_blank",rel:"noopener noreferrer"},o={href:"https://github.com/giscus/giscus",target:"_blank",rel:"noopener noreferrer"},c={href:"https://blog.csdn.net/duninet/article/details/125280107",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/gitalk/gitalk",target:"_blank",rel:"noopener noreferrer"},d={href:"https://gitter.im/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://boardgame.io/documentation/#/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://itchef.github.io/regauge/#/",target:"_blank",rel:"noopener noreferrer"},k=(0,s.Lk)("h2",{id:"waline",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#waline"},[(0,s.Lk)("span",null,"Waline")])],-1),v=(0,s.Lk)("p",null,"Waline 支持 Akismet 反垃圾评论和免注册留言,但匿名留言会带来安全隐患。建议开启评论通知来避免出现极端情况。Waline 的评论通知支持多种方式,包括 QQ、微信、邮件等。对于评论的回复,仅支持邮件通知。",-1),b={href:"https://waline.js.org/guide/server/notification.html",target:"_blank",rel:"noopener noreferrer"},h={href:"https://waline.js.org/reference/server.html",target:"_blank",rel:"noopener noreferrer"},g=(0,s.Lk)("code",null,"*.vercel.app",-1),f=(0,s.Lk)("h3",{id:"手动部署",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#手动部署"},[(0,s.Lk)("span",null,"手动部署")])],-1),w=(0,s.Lk)("p",null,"请注意,Vercel 和 LeanCloud 有额度限制。如果你的网站日访客超过一千人次,建议使用自行部署的方案。以下是我的部署步骤:",-1),L={href:"https://github.com/walinejs/waline/blob/main/assets/waline.sql",target:"_blank",rel:"noopener noreferrer"},_=(0,s.Lk)("sup",{class:"footnote-ref"},[(0,s.Lk)("a",{href:"#footnote1"},"[1]"),(0,s.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),W=(0,s.Fv)('
  • 配置必要的环境变量,可添加于 /etc/environment。配置完成后,需要重启项目让环境变量生效。并注意最后一行需保留空行。

    MYSQL_DB=""\nMYSQL_USER=""\nMYSQL_PASSWORD=""\n
  • 部署 Waline 服务端,使用 forever 让其持久化运行。

    # 切换到站点路径\ncd /www/wwwroot/node/waline\n\n# 安装 waline 前端包\nyarn add @waline/vercel --dev\n\n# 运行模块内的 vanilla.js 文件\nnode node_modules/@waline/vercel/vanilla.js\n\n# 使用 forever 持久化运行程序\nsudo npm install forever -g\nforever start app.js  #启动应用\nforever stop app.js  #关闭应用\nforever restartall  #重启所有应用\n\n# 持久化运行 Waline\nforever start /www/wwwroot/node/waline/node_modules/@waline/vercel/vanilla.js\n\n# 更改 package.json 版本号,升级并重启\nforever stop /www/wwwroot/node/waline/node_modules/@waline/vercel/vanilla.js\ncd /www/wwwroot/node/waline && yarn install && forever start /www/wwwroot/node/waline/node_modules/@waline/vercel/vanilla.js\n
  • 打开网页管理后台,通过导入事先备份的 JSON 文件来还原数据。

  • ',3),y=(0,s.Fv)('

    新手可以使用宝塔面板的 Node.js 版本管理器来部署 Node.js。安装后,受限更新版本列表,然后选择要使用的 Node 版本,将其设置为命令行版本,接着配置服务器的环境变量。虽然宝塔可以管理 Node 项目,但容易出现错误。处理流程为进入「网站」>「Node 项目」>「添加 Node 项目」,将启动选项设置为模块内的 vanilla.js 文件,将项目端口设置为 8360,并设置绑定域名。

    注意:如果你选择手动部署反向代理服务器,请务必使用 Waline 官方提供的 Nginx 配置文件,否则可能会导致无法登录后台,或是版本升级后仍然提示升级等问题。如果仍然有问题,请检查是否使用 SSH 直连服务器,而非宝塔自带网页终端。宝塔网页终端执行的命令有几率出错,一定要使用正常的 SSH 链接。

    server\n{\n  listen 80;\n  listen 443 ssl http2;\n  server_name waline.newzone.top;\n  root /www/wwwroot/waline;\n  if ($server_port !~ 443){\n    rewrite ^(/.*)$ https://$host$1 permanent;\n  }\n\n  # SSL setting\n  ssl_certificate    /www/server/panel/vhost/cert/waline/fullchain.pem;\n  ssl_certificate_key    /www/server/panel/vhost/cert/waline/privkey.pem;\n  ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;\n  ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;\n  ssl_prefer_server_ciphers on;\n  ssl_session_cache shared:SSL:10m;\n  ssl_session_timeout 10m;\n  add_header Strict-Transport-Security "max-age=31536000";\n\n  # proxy to 8360\n  location / {\n    proxy_pass http://127.0.0.1:8360;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_set_header REMOTE-HOST $remote_addr;\n    add_header X-Cache $upstream_cache_status;\n    # cache\n    add_header Cache-Control no-cache;\n    expires 12h;\n  }\n}\n

    导入时间处理

    如果 Waline 数据导入还原后,评论发布时间被重置为当前时间,则说明时间格式不兼容。以下以 LeanCloud 转 MySQL 为例:

    ',5),S=(0,s.Lk)("code",null,"2023-03-24T17:27:28.121Z",-1),C={href:"https://web-platform-dzhkey.stackblitz.io",target:"_blank",rel:"noopener noreferrer"},x=(0,s.Lk)("code",null,"[{},{}……,{}]",-1),V={href:"https://www.convertjson.com/json-to-sql.htm#",target:"_blank",rel:"noopener noreferrer"},q=(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("在 json2sql 页面中,点击按钮「Format JSON」,然后按截图勾选「Still not happy」「Enclose field names」「Backtick ("),(0,s.Lk)("code",null,"name"),(0,s.eW)(")」,取消勾选第一个值的 key。同时,取消勾选 objectId 的「Include」,该项将不会导入数据库。")]),(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://img.newzone.top/2023-03-24-16-52-57.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption")])],-1),j=(0,s.Lk)("li",null,[(0,s.Lk)("p",null,"将「Schema.Table or View Name」依次设为「`wl_Comment`」「`wl_Counter`」「`wl_Users`」,取消勾选「Create Table/View」。")],-1),G=(0,s.Lk)("li",null,[(0,s.Lk)("p",null,"在 Step 3: Generate output 下点击按钮「JSON TO SQL Insert」,然后点击复制按钮。")],-1),E=(0,s.Lk)("li",null,[(0,s.Lk)("p",null,"进入 phpMyAdmin 数据库后台,选中要操作的表(如 wl_Comment),点击右侧的 SQL 按钮运行 SQL 查询,将复制的内容粘贴到此,并点击执行。若无报错,则说明数据导入正常。")],-1),F=(0,s.Fv)('

    处理后时间可以正常导入,但由于 id 结构不同,旧的评论回复将失去联系。

    Gitalk

    Gitalk 是轻量化的评论组件,用户必须登录 github 才能评论,适合项目类使用。

    https://github.com/settings/developers 页面管理已建的应用,获取 Client ID 和 Client secrets,修改应用链接。[2]

    将以下代码复制粘贴至 docsify 页面,即可启动 Gitalk:

    <link rel="stylesheet" href="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-y/gitalk/1.7.2/gitalk.min.css">\n\n<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/docsify/4.12.2/plugins/gitalk.min.js"></script>\n<script src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-y/gitalk/1.7.2/gitalk.min.js"></script>\n<script>\n    /* 使用下面的 Javascript 代码生成 gitalk 插件 */\n    const gitalk = new Gitalk({\n        clientID: '2f3da234d27ed9a7c290',\n        clientSecret: 'd64c45594858477fff0c234c3ed3947a53b0a9ac',\n        repo: 'docsifytalk',        //仓库名称 (GitHub repo)\n        owner: 'rockbenben',        //仓库拥有者 (GitHub repo owner)\n        admin: ['rockbenben'],      //仓库所有者和协作者。(对此存储库具有写访问权的用户)\n        // id: location.pathname,   // Ensure uniqueness and length less than 50\n        distractionFreeMode: false  // Facebook-like distraction free mode\n    })\n</script>\n

    Gitalk 缺点:

    • 每次有新页面时,都需要登录 github 初始化评论区。
    • 域名不能改变,Homepage URL 和 Authorization callback URL 需与你的 Gitalk 页面一致,否则页面会报错,提示初始化,无法登录 github。

    ',9),D={class:"footnotes"},T={class:"footnotes-list"},H={id:"footnote1",class:"footnote-item"},A={href:"https://waline.js.org/guide/database.html#mysql",target:"_blank",rel:"noopener noreferrer"},N=(0,s.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),M={id:"footnote2",class:"footnote-item"},z={href:"https://blog.csdn.net/qq_39052513/article/details/108291272",target:"_blank",rel:"noopener noreferrer"},O=(0,s.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),R={},Q=(0,a(3671).A)(R,[["render",function(e,n){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,l,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.Lk)("a",i,[(0,s.eW)("Waline"),(0,s.bF)(a)]),(0,s.eW)(":基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。")]),(0,s.Lk)("li",null,[(0,s.Lk)("a",r,[(0,s.eW)("Valine"),(0,s.bF)(a)]),(0,s.eW)(":快速、简洁且高效的无后端评论系统,可匿名互动。")]),(0,s.Lk)("li",null,[(0,s.Lk)("a",o,[(0,s.eW)("giscus"),(0,s.bF)(a)]),(0,s.eW)(":基于 github discussion,近似于论坛。查看 "),(0,s.Lk)("a",c,[(0,s.eW)("配置方法"),(0,s.bF)(a)]),(0,s.eW)("。")]),(0,s.Lk)("li",null,[(0,s.Lk)("a",p,[(0,s.eW)("Gitalk"),(0,s.bF)(a)]),(0,s.eW)(":基于 github commit,需配置独立库用于存储评论。")]),(0,s.Lk)("li",null,[(0,s.Lk)("a",d,[(0,s.eW)("Gitter"),(0,s.bF)(a)]),(0,s.eW)(":要登录的公共聊天室。样例如:"),(0,s.Lk)("a",u,[(0,s.eW)("boardgame"),(0,s.bF)(a)]),(0,s.eW)(","),(0,s.Lk)("a",m,[(0,s.eW)("regauge"),(0,s.bF)(a)]),(0,s.eW)("。")])]),k,v,(0,s.Lk)("p",null,[(0,s.eW)("Vercel 项目中选择「Overview」>「Settings」>「Environment Variables」,然后按照 "),(0,s.Lk)("a",b,[(0,s.eW)("Waline 评论通知"),(0,s.bF)(a)]),(0,s.eW)("配置所需环境变量。如果需要 Webhook 等更多通知方式,则查看 "),(0,s.Lk)("a",h,[(0,s.eW)("Waline 服务端配置"),(0,s.bF)(a)]),(0,s.eW)("。配置成功后,选择「Overview」>「Deployments」,进行 Redeploy,重新部署后环境变量和评论通知方会生效。目前 "),g,(0,s.eW)(" 域名已经被 DNS 污染,会出现「无法加载评论」,国内使用建议绑定自定义域名,域名对备案暂无硬性要求。")]),f,w,(0,s.Lk)("ol",null,[(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("新建数据库,并导入 "),(0,s.Lk)("a",L,[(0,s.eW)("waline.sql"),(0,s.bF)(a)]),(0,s.eW)(" 以完成表和表结构的创建,之后在项目中配置如下环境变量。"),_])]),W]),y,(0,s.Lk)("ol",null,[(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[S,(0,s.eW)(' 这个时间戳中的格式 "T" 和 "Z" 不被 MySQL 支持,要将 "T" 替换为空格并将 "Z" 删除。我写了个'),(0,s.Lk)("a",C,[(0,s.eW)("网页工具"),(0,s.bF)(a)]),(0,s.eW)("处理时间格式替换。")])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("提取数据中的 Comment、Counter 和 Users,格式为 "),x,(0,s.eW)(",依次复制到 "),(0,s.Lk)("a",V,[(0,s.eW)("json2sql"),(0,s.bF)(a)]),(0,s.eW)(" 进行操作。")])]),q,j,G,E]),F,(0,s.Lk)("section",D,[(0,s.Lk)("ol",T,[(0,s.Lk)("li",H,[(0,s.Lk)("p",null,[(0,s.Lk)("a",A,[(0,s.eW)("Waline 多数据库服务支持"),(0,s.bF)(a)]),(0,s.eW)(),N])]),(0,s.Lk)("li",M,[(0,s.Lk)("p",null,[(0,s.Lk)("a",z,[(0,s.eW)("超 Nice 的评论组件 —— Gitalk"),(0,s.bF)(a)]),(0,s.eW)(),O])])])])])}]]),$=JSON.parse('{"path":"/web/Comments.html","title":"评论插件","lang":"zh-CN","frontmatter":{"article":false,"title":"评论插件","icon":"comment","order":3,"description":"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。 评论插件 Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。 Valine:快速、简洁且高效...","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/Comments.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"评论插件"}],["meta",{"property":"og:description","content":"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。 评论插件 Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。 Valine:快速、简洁且高效..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-03-24-16-52-57.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-22T21:57:47.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"评论插件"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-22T21:57:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"评论插件\\",\\"description\\":\\"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。 评论插件 Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。 Valine:快速、简洁且高效...\\"}"]]},"headers":[{"level":2,"title":"评论插件","slug":"评论插件","link":"#评论插件","children":[]},{"level":2,"title":"Waline","slug":"waline","link":"#waline","children":[{"level":3,"title":"手动部署","slug":"手动部署","link":"#手动部署","children":[]}]},{"level":2,"title":"导入时间处理","slug":"导入时间处理","link":"#导入时间处理","children":[]},{"level":2,"title":"Gitalk","slug":"gitalk","link":"#gitalk","children":[]}],"git":{"createdTime":1658535624000,"updatedTime":1708639067000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":23}]},"readingTime":{"minutes":5.39,"words":1616},"filePathRelative":"web/Comments.md","localizedDate":"2022年7月23日","excerpt":"

    LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。

    \\n

    评论插件

    \\n
      \\n
    • Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。
    • \\n
    • Valine:快速、简洁且高效的无后端评论系统,可匿名互动。
    • \\n
    • giscus:基于 github discussion,近似于论坛。查看 配置方法
    • \\n
    • Gitalk:基于 github commit,需配置独立库用于存储评论。
    • \\n
    • Gitter:要登录的公共聊天室。样例如:boardgameregauge
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-fb3296c4.351af5d7.js b/assets/js/Coupon.html.05f28dae.js similarity index 80% rename from assets/js/v-fb3296c4.351af5d7.js rename to assets/js/Coupon.html.05f28dae.js index 414e79dbc..dc44b7d8a 100644 --- a/assets/js/v-fb3296c4.351af5d7.js +++ b/assets/js/Coupon.html.05f28dae.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[403],{9720:(e,l)=>{l.c=(e,l)=>{const t=e.__vccOpts||e;for(const[e,n]of l)t[e]=n;return t}},1133:(e,l,t)=>{t.r(l),t.d(l,{comp:()=>v,data:()=>C});var n=t(3968);const o=(0,n.IL)('

    家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

    电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

    淘宝

    • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
    • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。
      • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
    • 购物节日前一天的预购和节日当天,是最优惠时候。
      • 商家在活动前说的保价,并不包含大额券,不用提前下单。

    拼多多

    拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。

    • 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。
    • 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。

    京东

    新注册的京东 Plus 已经没有会员优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。

    1688

    1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改[1]

    ',11),r=(0,n.QD)("li",null,"持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。",-1),a=(0,n.QD)("li",null,"日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。",-1),i=(0,n.QD)("li",null,"日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。",-1),p=(0,n.QD)("li",null,"医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。",-1),s={href:"https://post.smzdm.com/p/az5gg8zr/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.QD)("li",null,"数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。",-1),h=(0,n.QD)("li",null,"餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。",-1),d=(0,n.QD)("p",null,"购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货!",-1),u=(0,n.QD)("h2",{id:"抢购辅助",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#抢购辅助"},[(0,n.QD)("span",null,"抢购辅助")])],-1),m=(0,n.QD)("li",null,"Auto.js:免费版不再更新。买了 Pro,但它不支持淘宝等。",-1),f=(0,n.QD)("li",null,"八戒任务:按顺序完成多坐标点击,适用秒杀?",-1),E={href:"https://aznfz.com",target:"_blank",rel:"noopener noreferrer"},g={href:"https://docs.qq.com/doc/DU0FTQ1NKV0VKU2tN",target:"_blank",rel:"noopener noreferrer"},D={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"},Q=(0,n.IL)('

    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),b={class:"footnotes"},k={class:"footnotes-list"},B={id:"footnote1",class:"footnote-item"},A={href:"https://sspai.com/prime/story/vol018-a-1688-shopping-guide",target:"_blank",rel:"noopener noreferrer"},y=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),_={},v=(0,t(9720).c)(_,[["render",function(e,l){const t=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[o,(0,n.QD)("ul",null,[r,a,i,p,(0,n.QD)("li",null,[(0,n.mY)("食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考"),(0,n.QD)("a",s,[(0,n.mY)("手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)"),(0,n.K2)(t)]),(0,n.mY)("。")]),c,h]),d,u,(0,n.QD)("ul",null,[m,f,(0,n.QD)("li",null,[(0,n.QD)("a",E,[(0,n.mY)("冰狐智能辅助"),(0,n.K2)(t)]),(0,n.mY)(":自动构建脚本,需付费,未实际使用,较复杂")]),(0,n.QD)("li",null,[(0,n.QD)("a",g,[(0,n.mY)("喵惠助手"),(0,n.K2)(t)]),(0,n.mY)(":第三方辅助代拍,安全性未知。旧手机上抢购。用旧手机一直挂着。")]),(0,n.QD)("li",null,[(0,n.QD)("a",D,[(0,n.mY)("抢购助手脚本"),(0,n.K2)(t)]),(0,n.mY)(":网页 js 脚本,需搭配浏览器扩展 Tampermonkey。")])]),Q,(0,n.QD)("section",b,[(0,n.QD)("ol",k,[(0,n.QD)("li",B,[(0,n.QD)("p",null,[(0,n.QD)("a",A,[(0,n.mY)("1688「扫货」指南"),(0,n.K2)(t)]),(0,n.mY)(),y])])])])])}]]),C=JSON.parse('{"path":"/family/Coupon.html","title":"网购攻略","lang":"zh-CN","frontmatter":{"article":false,"title":"网购攻略","icon":"free","order":3,"description":" 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 淘宝 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Coupon.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"网购攻略"}],["meta",{"property":"og:description","content":" 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 淘宝 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"网购攻略\\",\\"description\\":\\" 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 淘宝 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。...\\"}"]]},"headers":[{"level":2,"title":"淘宝","slug":"淘宝","link":"#淘宝","children":[]},{"level":2,"title":"拼多多","slug":"拼多多","link":"#拼多多","children":[]},{"level":2,"title":"京东","slug":"京东","link":"#京东","children":[]},{"level":2,"title":"1688","slug":"_1688","link":"#_1688","children":[]},{"level":2,"title":"抢购辅助","slug":"抢购辅助","link":"#抢购辅助","children":[{"level":3,"title":"BP 模式","slug":"bp-模式","link":"#bp-模式","children":[]}]},{"level":2,"title":"购物思考","slug":"购物思考","link":"#购物思考","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":4.75,"words":1425},"filePathRelative":"family/Coupon.md","localizedDate":"2022年7月22日","excerpt":"
    \\n

    家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

    \\n
    \\n

    电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

    \\n

    淘宝

    \\n
      \\n
    • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
    • \\n
    • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。\\n
        \\n
      • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
      • \\n
      \\n
    • \\n
    • 购物节日前一天的预购和节日当天,是最优惠时候。\\n
        \\n
      • 商家在活动前说的保价,并不包含大额券,不用提前下单。
      • \\n
      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[486],{3671:(e,l)=>{l.A=(e,l)=>{const t=e.__vccOpts||e;for(const[e,n]of l)t[e]=n;return t}},9605:(e,l,t)=>{t.r(l),t.d(l,{comp:()=>C,data:()=>W});var n=t(7847);const o=(0,n.Fv)('

    家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

    电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

    淘宝

    • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
    • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。
      • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
    • 购物节日前一天的预购和节日当天,是最优惠时候。
      • 商家在活动前说的保价,并不包含大额券,不用提前下单。

    拼多多

    拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。

    • 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。
    • 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。

    京东

    新注册的京东 Plus 已经没有会员优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。

    1688

    1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改[1]

    ',11),r=(0,n.Lk)("li",null,"持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。",-1),a=(0,n.Lk)("li",null,"日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。",-1),i=(0,n.Lk)("li",null,"日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。",-1),p=(0,n.Lk)("li",null,"医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。",-1),s={href:"https://post.smzdm.com/p/az5gg8zr/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.Lk)("li",null,"数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。",-1),h=(0,n.Lk)("li",null,"餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。",-1),d=(0,n.Lk)("p",null,"购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货!",-1),u=(0,n.Lk)("h2",{id:"抢购辅助",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#抢购辅助"},[(0,n.Lk)("span",null,"抢购辅助")])],-1),k=(0,n.Lk)("li",null,"Auto.js:免费版不再更新。买了 Pro,但它不支持淘宝等。",-1),f=(0,n.Lk)("li",null,"八戒任务:按顺序完成多坐标点击,适用秒杀?",-1),m={href:"https://aznfz.com",target:"_blank",rel:"noopener noreferrer"},E={href:"https://docs.qq.com/doc/DU0FTQ1NKV0VKU2tN",target:"_blank",rel:"noopener noreferrer"},g={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"},b=(0,n.Fv)('

    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),L={class:"footnotes"},B={class:"footnotes-list"},A={id:"footnote1",class:"footnote-item"},y={href:"https://sspai.com/prime/story/vol018-a-1688-shopping-guide",target:"_blank",rel:"noopener noreferrer"},_=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),v={},C=(0,t(3671).A)(v,[["render",function(e,l){const t=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[o,(0,n.Lk)("ul",null,[r,a,i,p,(0,n.Lk)("li",null,[(0,n.eW)("食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考"),(0,n.Lk)("a",s,[(0,n.eW)("手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)"),(0,n.bF)(t)]),(0,n.eW)("。")]),c,h]),d,u,(0,n.Lk)("ul",null,[k,f,(0,n.Lk)("li",null,[(0,n.Lk)("a",m,[(0,n.eW)("冰狐智能辅助"),(0,n.bF)(t)]),(0,n.eW)(":自动构建脚本,需付费,未实际使用,较复杂")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",E,[(0,n.eW)("喵惠助手"),(0,n.bF)(t)]),(0,n.eW)(":第三方辅助代拍,安全性未知。旧手机上抢购。用旧手机一直挂着。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",g,[(0,n.eW)("抢购助手脚本"),(0,n.bF)(t)]),(0,n.eW)(":网页 js 脚本,需搭配浏览器扩展 Tampermonkey。")])]),b,(0,n.Lk)("section",L,[(0,n.Lk)("ol",B,[(0,n.Lk)("li",A,[(0,n.Lk)("p",null,[(0,n.Lk)("a",y,[(0,n.eW)("1688「扫货」指南"),(0,n.bF)(t)]),(0,n.eW)(),_])])])])])}]]),W=JSON.parse('{"path":"/family/Coupon.html","title":"网购攻略","lang":"zh-CN","frontmatter":{"article":false,"title":"网购攻略","icon":"free","order":3,"description":" 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 淘宝 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Coupon.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"网购攻略"}],["meta",{"property":"og:description","content":" 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 淘宝 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"网购攻略\\",\\"description\\":\\" 家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。 电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。 淘宝 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。...\\"}"]]},"headers":[{"level":2,"title":"淘宝","slug":"淘宝","link":"#淘宝","children":[]},{"level":2,"title":"拼多多","slug":"拼多多","link":"#拼多多","children":[]},{"level":2,"title":"京东","slug":"京东","link":"#京东","children":[]},{"level":2,"title":"1688","slug":"_1688","link":"#_1688","children":[]},{"level":2,"title":"抢购辅助","slug":"抢购辅助","link":"#抢购辅助","children":[{"level":3,"title":"BP 模式","slug":"bp-模式","link":"#bp-模式","children":[]}]},{"level":2,"title":"购物思考","slug":"购物思考","link":"#购物思考","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":4.75,"words":1425},"filePathRelative":"family/Coupon.md","localizedDate":"2022年7月22日","excerpt":"
    \\n

    家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

    \\n
    \\n

    电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

    \\n

    淘宝

    \\n
      \\n
    • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
    • \\n
    • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。\\n
        \\n
      • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
      • \\n
      \\n
    • \\n
    • 购物节日前一天的预购和节日当天,是最优惠时候。\\n
        \\n
      • 商家在活动前说的保价,并不包含大额券,不用提前下单。
      • \\n
      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0c79c2e2.a5cbbe30.js b/assets/js/DNS.html.e82ab2d3.js similarity index 82% rename from assets/js/v-0c79c2e2.a5cbbe30.js rename to assets/js/DNS.html.e82ab2d3.js index 0ad3e6d22..945cbd26c 100644 --- a/assets/js/v-0c79c2e2.a5cbbe30.js +++ b/assets/js/DNS.html.e82ab2d3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2112],{9720:(e,t)=>{t.c=(e,t)=>{const l=e.__vccOpts||e;for(const[e,r]of t)l[e]=r;return l}},5996:(e,t,l)=>{l.r(t),l.d(t,{comp:()=>c,data:()=>d});var r=l(3968);const o=(0,r.QD)("p",null,"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。",-1),n=(0,r.QD)("li",null,"DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。",-1),a=(0,r.QD)("li",null,"如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。",-1),i={href:"https://help.aliyun.com/document_detail/29725.html?#h2-ns-7",target:"_blank",rel:"noopener noreferrer"},p={href:"https://help.aliyun.com/document_detail/121648.html",target:"_blank",rel:"noopener noreferrer"},m={},c=(0,l(9720).c)(m,[["render",function(e,t){const l=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[o,(0,r.QD)("ul",null,[n,a,(0,r.QD)("li",null,[(0,r.mY)("子域名可以使用 "),(0,r.QD)("a",i,[(0,r.mY)("NS 记录"),(0,r.K2)(l)]),(0,r.mY)(",托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。")])]),(0,r.QD)("p",null,[(0,r.mY)("域名 DNS 服务器修改(阿里云):"),(0,r.QD)("a",p,[(0,r.mY)("https://help.aliyun.com/document_detail/121648.html"),(0,r.K2)(l)])])])}]]),d=JSON.parse('{"path":"/deploy/DNS.html","title":"域名 DNS 托管","lang":"zh-CN","frontmatter":{"article":false,"title":"域名 DNS 托管","icon":"sitemap","order":6,"description":"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firef...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/DNS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"域名 DNS 托管"}],["meta",{"property":"og:description","content":"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firef..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"域名 DNS 托管\\",\\"description\\":\\"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firef...\\"}"]]},"headers":[],"git":{"createdTime":1658511538000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":0.62,"words":185},"filePathRelative":"deploy/DNS.md","localizedDate":"2022年7月22日","excerpt":"

    国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。

    \\n
      \\n
    • DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。
    • \\n
    • 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。
    • \\n
    • 子域名可以使用 NS 记录,托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5377],{3671:(e,t)=>{t.A=(e,t)=>{const l=e.__vccOpts||e;for(const[e,r]of t)l[e]=r;return l}},3016:(e,t,l)=>{l.r(t),l.d(t,{comp:()=>m,data:()=>d});var r=l(7847);const o=(0,r.Lk)("p",null,"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。",-1),n=(0,r.Lk)("li",null,"DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。",-1),a=(0,r.Lk)("li",null,"如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。",-1),i={href:"https://help.aliyun.com/document_detail/29725.html?#h2-ns-7",target:"_blank",rel:"noopener noreferrer"},p={href:"https://help.aliyun.com/document_detail/121648.html",target:"_blank",rel:"noopener noreferrer"},c={},m=(0,l(3671).A)(c,[["render",function(e,t){const l=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[o,(0,r.Lk)("ul",null,[n,a,(0,r.Lk)("li",null,[(0,r.eW)("子域名可以使用 "),(0,r.Lk)("a",i,[(0,r.eW)("NS 记录"),(0,r.bF)(l)]),(0,r.eW)(",托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。")])]),(0,r.Lk)("p",null,[(0,r.eW)("域名 DNS 服务器修改(阿里云):"),(0,r.Lk)("a",p,[(0,r.eW)("https://help.aliyun.com/document_detail/121648.html"),(0,r.bF)(l)])])])}]]),d=JSON.parse('{"path":"/deploy/DNS.html","title":"域名 DNS 托管","lang":"zh-CN","frontmatter":{"article":false,"title":"域名 DNS 托管","icon":"sitemap","order":6,"description":"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firef...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/DNS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"域名 DNS 托管"}],["meta",{"property":"og:description","content":"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firef..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"域名 DNS 托管\\",\\"description\\":\\"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。 DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firef...\\"}"]]},"headers":[],"git":{"createdTime":1658511538000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":0.62,"words":185},"filePathRelative":"deploy/DNS.md","localizedDate":"2022年7月22日","excerpt":"

    国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。

    \\n
      \\n
    • DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。
    • \\n
    • 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。
    • \\n
    • 子域名可以使用 NS 记录,托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/DailyRoutine.html.cf42a51a.js b/assets/js/DailyRoutine.html.cf42a51a.js new file mode 100644 index 000000000..274a0d752 --- /dev/null +++ b/assets/js/DailyRoutine.html.cf42a51a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[535],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6740:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>P,data:()=>E});var n=a(7847);const s=(0,n.Lk)("p",null,[(0,n.eW)("每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:"),(0,n.Lk)("strong",null,"遵循一个固定、程序化的流程,有规律地养成习惯"),(0,n.eW)(",实现自我提升。")],-1),l=(0,n.Lk)("h2",{id:"仪式清单",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#仪式清单"},[(0,n.Lk)("span",null,"仪式清单")])],-1),o=(0,n.Lk)("h3",{id:"_5am-club",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#_5am-club"},[(0,n.Lk)("span",null,"5AM Club")])],-1),r={href:"https://newzone.top/posts/2023-03-31-efficient_morning_5am_club.html",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,"早上 5 点起床,使用手环震动闹钟。"),(0,n.Lk)("li",null,"泡杯咖啡,准备早餐,开始第一个工作番茄。"),(0,n.Lk)("li",null,"工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。"),(0,n.Lk)("li",null,"每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。"),(0,n.Lk)("li",null,"晚上 10 点睡觉,保证充足的睡眠时间。")],-1),i={href:"https://hubermanlab.com/sleep-toolkit-tools-for-optimizing-sleep-and-sleep-wake-timing/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.Lk)("h3",{id:"每日",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#每日"},[(0,n.Lk)("span",null,"每日")])],-1),d=(0,n.Lk)("p",null,[(0,n.Lk)("strong",null,"早上创造美好情绪"),(0,n.eW)(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),u=(0,n.Lk)("li",null,"唱歌:唱一首你喜欢的歌曲(外语美声歌曲可以增加脂肪消耗,例如:秋山雅史的《千の風になって》)。",-1),k=(0,n.Lk)("li",null,"自拍视频:说一句话(比如当天的目标)来鼓励自己。在前一天想好录制内容,以获得积极情绪。",-1),m={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},h=(0,n.Fv)('
  • 人际连接:通过直播连麦与陌生人沟通 15 分钟,例如:播客、抖音语音电台直播 PK。

    • 别人很重要:帮助别人,能让人更健康、更幸福。当心情不好时,去帮助其他人,心情会变得更好。
    • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
  • 微习惯

    • 每工作 20 分钟,休息 20 秒,然后做 10 个深蹲;出书房或上完厕所,再做 15 个俯卧撑。在运动前,在白板上写出正字,每一组动作用一个笔画表示。进阶阶段可以用固定机位拍摄视频,监督运动习惯。拍摄时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。
    • 睡前:每天泡脚 20 分钟(水温 40℃),短时间的泡脚可以帮助睡眠更快入睡。此外,每天睡前 90 分钟,淋浴(水温 38~43℃,淋浴 10 分钟)或泡澡也可以助你更快进入睡眠状态。[1]
  • 间隔学习:穿插学习不同领域内容

    • 阅读看书:每天花 30 分钟读书,并输出笔记。
    • 墨墨背单词:每天背 20 个单词,虽然用处不大,但可以让脑子换个思路。
    • 笔记复习:利用思源笔记/SuperMemo 记忆模型,复习心理认知、沟通理论和行为反思等笔记。
  • 当日回顾:每天记录 3 件好事,总结好事发生的原因,并与家人分享。

    这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

  • ',4),b=(0,n.Lk)("h3",{id:"定期",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#定期"},[(0,n.Lk)("span",null,"定期")])],-1),g=(0,n.Lk)("strong",null,"月底反思",-1),f={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},L={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},v=(0,n.Lk)("li",null,[(0,n.Lk)("strong",null,"积极自我介绍"),(0,n.eW)(":每三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),_=(0,n.Lk)("h3",{id:"自我监控",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#自我监控"},[(0,n.Lk)("span",null,"自我监控")])],-1),y={href:"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},W={href:"https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html",target:"_blank",rel:"noopener noreferrer"},w=(0,n.Fv)('
    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\n
    ',1),x=(0,n.Fv)('
  • 晚上 10 点执行关机程序:静音、关闭护眼提醒、关闭录屏终端,并使用 dvr-scan 删除视频中的静止帧。这些步骤可以通过 AutoHotkey 命令自动完成。

    Send, {Volume_Mute}\nProcess, Close, Stretchly.exe\nProcess, Close, pwsh.exe\nSleep, 500000\nRun, PowerShell.exe -NoExit -Command &{dvr-scan -i output.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\\Backup\\Libraries\\Desktop\n
  • 使用 VLC 播放器可以以 31.25 倍的速度回放监控视频,并结合 ManicTime 来回顾当日内容。要轻松实现 VLC 的高倍速播放,可以在「菜单栏」->「视图」中开启「状态栏」。此外,通过剪映,可以达到 100 倍的播放速度。

  • ',2),A=(0,n.Fv)('

    时间管理

    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 功能外,还能用日视图管理具体时间安排,添加跨天长时间任务,并在日历、看板和甘特图中查看。

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

    ',10),C={href:"https://topbook.cc/course/detail/153",target:"_blank",rel:"noopener noreferrer"},T=(0,n.Lk)("strong",null,"把事情做好,而不是把事情做完",-1),D=(0,n.Fv)('

    日常习惯

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

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

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

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

    美容仪器

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

    • 按摩椅 + 眼部按摩仪 + 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),F={class:"footnotes"},M={class:"footnotes-list"},z={id:"footnote1",class:"footnote-item"},S={href:"https://www.solidot.org/story?sid=72099",target:"_blank",rel:"noopener noreferrer"},R=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),G={},P=(0,a(3671).A)(G,[["render",function(e,t){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[s,l,o,(0,n.Lk)("p",null,[(0,n.eW)("5AM Club 是我的"),(0,n.Lk)("a",r,[(0,n.eW)("高效早晨方案"),(0,n.bF)(a)]),(0,n.eW)(":")]),p,(0,n.Lk)("p",null,[(0,n.Lk)("a",i,[(0,n.eW)("Huberman Lab"),(0,n.bF)(a)]),(0,n.eW)(" 建议早晨不一定需要进食,可以到中午再进食,改变身体的新陈代谢周期;醒来后两到四小时再摄入咖啡因,并尽量避免在午后摄入咖啡因,以防下午的 cafferine crush。请根据个人情况灵活调整计划。")]),c,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[d,(0,n.Lk)("ul",null,[u,k,(0,n.Lk)("li",null,[(0,n.eW)("参考"),(0,n.Lk)("a",m,[(0,n.eW)("积极心理学"),(0,n.bF)(a)]),(0,n.eW)(",收集积极情绪材料,放在显眼的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术(音乐、名画、诗句)。")])])]),h]),b,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[g,(0,n.eW)(":检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 "),(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.eW)("每月复盘参照 "),(0,n.Lk)("a",f,[(0,n.eW)("Allison Seboldt"),(0,n.bF)(a)]),(0,n.eW)(",作者会分享他的收入并反思上个月的成就。")]),(0,n.Lk)("li",null,[(0,n.eW)("阅读 "),(0,n.Lk)("a",L,[(0,n.eW)("JustinJ ackson"),(0,n.bF)(a)]),(0,n.eW)(",作者在 2018 年初创办 Transistor 以来,一直在分享他的项目,整理了在此过程中学到的许多经验教训。")])])]),v]),_,(0,n.Lk)("p",null,[(0,n.eW)("为了更好地监督自己,我制定了一套"),(0,n.Lk)("a",y,[(0,n.eW)("自我监控方案"),(0,n.bF)(a)]),(0,n.eW)(",以记录自己的私人工作状态。")]),(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("开机(8 点)启动录屏命令,并检测护眼提醒是否开启。可参考 "),(0,n.Lk)("a",W,[(0,n.eW)("FFmpeg 录屏方案"),(0,n.bF)(a)]),(0,n.eW)("来修改命令:")]),w]),x]),A,(0,n.Lk)("p",null,[(0,n.eW)("本节内容来自 Topbook 的 "),(0,n.Lk)("a",C,[(0,n.eW)("GTD 自我管理 - 时间管理教程"),(0,n.bF)(a)]),(0,n.eW)(",改变了我对 GTD 的认知,"),T,(0,n.eW)("。建议完整阅读。")]),D,(0,n.Lk)("section",F,[(0,n.Lk)("ol",M,[(0,n.Lk)("li",z,[(0,n.Lk)("p",null,[(0,n.Lk)("a",S,[(0,n.eW)("睡前淋浴有助于快速入睡"),(0,n.bF)(a)]),(0,n.eW)(),R])])])])])}]]),E=JSON.parse('{"path":"/DailyRoutine.html","title":"每日仪式","lang":"zh-CN","frontmatter":{"article":false,"title":"每日仪式","icon":"check","description":"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。 仪式清单 5AM Club 5AM Club 是我的高效早晨方案: 早上 5 点起床,使用手环震动闹钟。 泡杯咖啡,准备早餐,开始第一个工作番茄。 工作 25 分钟休息...","head":[["meta",{"property":"og:url","content":"https://newzone.top/DailyRoutine.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"每日仪式"}],["meta",{"property":"og:description","content":"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。 仪式清单 5AM Club 5AM Club 是我的高效早晨方案: 早上 5 点起床,使用手环震动闹钟。 泡杯咖啡,准备早餐,开始第一个工作番茄。 工作 25 分钟休息..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-11-02-11-02-43.png \\"GTD 任务转移到清单\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-08T03:33:22.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"每日仪式"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-09-08T03:33:22.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"每日仪式\\",\\"description\\":\\"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。 仪式清单 5AM Club 5AM Club 是我的高效早晨方案: 早上 5 点起床,使用手环震动闹钟。 泡杯咖啡,准备早餐,开始第一个工作番茄。 工作 25 分钟休息...\\"}"]]},"headers":[{"level":2,"title":"仪式清单","slug":"仪式清单","link":"#仪式清单","children":[{"level":3,"title":"5AM Club","slug":"_5am-club","link":"#_5am-club","children":[]},{"level":3,"title":"每日","slug":"每日","link":"#每日","children":[]},{"level":3,"title":"定期","slug":"定期","link":"#定期","children":[]},{"level":3,"title":"自我监控","slug":"自我监控","link":"#自我监控","children":[]}]},{"level":2,"title":"时间管理","slug":"时间管理","link":"#时间管理","children":[]},{"level":2,"title":"日常习惯","slug":"日常习惯","link":"#日常习惯","children":[]},{"level":2,"title":"美容仪器","slug":"美容仪器","link":"#美容仪器","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1694144002000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":21}]},"readingTime":{"minutes":8.14,"words":2442},"filePathRelative":"DailyRoutine.md","localizedDate":"2022年7月22日","excerpt":"

    每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。

    \\n

    仪式清单

    \\n

    5AM Club

    \\n

    5AM Club 是我的高效早晨方案

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7769c050.11edb1e8.js b/assets/js/Diet.html.3e0aec05.js similarity index 88% rename from assets/js/v-7769c050.11edb1e8.js rename to assets/js/Diet.html.3e0aec05.js index 8e98a3491..51c428b1b 100644 --- a/assets/js/v-7769c050.11edb1e8.js +++ b/assets/js/Diet.html.3e0aec05.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3832],{9720:(g,t)=>{t.c=(g,t)=>{const l=g.__vccOpts||g;for(const[g,e]of t)l[g]=e;return l}},1396:(g,t,l)=>{l.r(t),l.d(t,{comp:()=>w,data:()=>M});var e=l(3968);const d=(0,e.IL)('

    16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

    • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
    • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
    • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。

    饮食

    零食

    • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
    • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。

    饮料

    ',6),r={href:"https://www.zhihu.com/question/546343871/answer/2692019428",target:"_blank",rel:"noopener noreferrer"},n=(0,e.IL)('

    马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。

    夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。[1] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。

    冷泡燕麦

    牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点:

    • 主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。
    • 配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。
    • 配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。
    • 容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。
    • 放冰箱这一步很重要!不放可能会化身喷射战士。
    • 唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。

    健康理论

    程序员延寿指南

    ',7),a={href:"https://github.com/geekan/HowToLiveLonger",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/geekan/HowToLiveLonger#611-%E5%9B%BA%E4%BD%93",target:"_blank",rel:"noopener noreferrer"},o=(0,e.QD)("li",null,[(0,e.mY)("液体:喝咖啡(-22%~-12% ACM),"),(0,e.QD)("strong",null,"喝牛奶"),(0,e.mY)("(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限)")],-1),s=(0,e.QD)("li",null,"气体:不吸烟(否则+~50% ACM,-12~-11 年寿命)",-1),h={href:"https://github.com/geekan/HowToLiveLonger#614-%E5%85%89%E7%85%A7",target:"_blank",rel:"noopener noreferrer"},p=(0,e.QD)("li",null,"药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM)",-1),c=(0,e.QD)("li",null,[(0,e.mY)("输出 "),(0,e.QD)("ul",null,[(0,e.QD)("li",null,"运动:每周 3 次 45 分钟挥拍运动(-47% ACM)"),(0,e.QD)("li",null,"日常:刷牙(-25% ACM)"),(0,e.QD)("li",null,[(0,e.mY)("睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,"),(0,e.QD)("em",null,"早睡 +43% ACM,晚睡 +15% ACM(存在争议)")])])],-1),u=(0,e.QD)("li",null,[(0,e.mY)("上下文 "),(0,e.QD)("ul",null,[(0,e.QD)("li",null,"体重:减肥(-54% ACM)")])],-1),m=(0,e.QD)("h3",{id:"其他",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#其他"},[(0,e.QD)("span",null,"其他")])],-1),D={href:"https://www.cell.com/cell/fulltext/S0092-8674(22)00398-1",target:"_blank",rel:"noopener noreferrer"},f={href:"https://news.sciencenet.cn/htmlnews/2022/4/478234.shtm",target:"_blank",rel:"noopener noreferrer"},y=(0,e.IL)('

    泡澡

    浸泡 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),b={class:"footnotes"},Q={class:"footnotes-list"},k={id:"footnote1",class:"footnote-item"},A={href:"https://www.guokr.com/article/461818/",target:"_blank",rel:"noopener noreferrer"},C=(0,e.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Y={},w=(0,l(9720).c)(Y,[["render",function(g,t){const l=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[d,(0,e.QD)("p",null,[(0,e.mY)("现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考"),(0,e.QD)("a",r,[(0,e.mY)("适量喝咖啡对身体有哪些好处?"),(0,e.K2)(l)]),(0,e.mY)("。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。")]),n,(0,e.QD)("p",null,[(0,e.QD)("a",a,[(0,e.mY)("程序员延寿指南"),(0,e.K2)(l)]),(0,e.mY)(":")]),(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.mY)("输入 "),(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.mY)("固体:"),(0,e.QD)("a",i,[(0,e.mY)("吃白肉"),(0,e.K2)(l)]),(0,e.mY)("(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%)")]),o,s,(0,e.QD)("li",null,[(0,e.mY)("光照:"),(0,e.QD)("a",h,[(0,e.mY)("晒太阳"),(0,e.K2)(l)]),(0,e.mY)("(-~40% ACM)")]),p])]),c,u]),m,(0,e.QD)("p",null,[(0,e.mY)("在发表在《细胞》杂志的"),(0,e.QD)("a",D,[(0,e.mY)("综述文章"),(0,e.K2)(l)]),(0,e.mY)("中描述了"),(0,e.QD)("a",f,[(0,e.mY)("长寿饮食"),(0,e.K2)(l)]),(0,e.mY)(",这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。")]),y,(0,e.QD)("section",b,[(0,e.QD)("ol",Q,[(0,e.QD)("li",k,[(0,e.QD)("p",null,[(0,e.QD)("a",A,[(0,e.mY)("冷泡茶和热茶放凉,好喝级别能一样吗?"),(0,e.K2)(l)]),(0,e.mY)(),C])])])])])}]]),M=JSON.parse('{"path":"/family/Diet.html","title":"健康饮食","lang":"zh-CN","frontmatter":{"article":false,"title":"健康饮食","icon":"enum","order":1,"description":"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 饮食 零食 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Diet.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"健康饮食"}],["meta",{"property":"og:description","content":"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 饮食 零食 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"健康饮食\\",\\"description\\":\\"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 饮食 零食 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡...\\"}"]]},"headers":[{"level":2,"title":"饮食","slug":"饮食","link":"#饮食","children":[{"level":3,"title":"零食","slug":"零食","link":"#零食","children":[]},{"level":3,"title":"饮料","slug":"饮料","link":"#饮料","children":[]},{"level":3,"title":"冷泡燕麦","slug":"冷泡燕麦","link":"#冷泡燕麦","children":[]}]},{"level":2,"title":"健康理论","slug":"健康理论","link":"#健康理论","children":[{"level":3,"title":"程序员延寿指南","slug":"程序员延寿指南","link":"#程序员延寿指南","children":[]},{"level":3,"title":"其他","slug":"其他","link":"#其他","children":[]}]},{"level":2,"title":"泡澡","slug":"泡澡","link":"#泡澡","children":[]},{"level":2,"title":"减肥食谱","slug":"减肥食谱","link":"#减肥食谱","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":16.19,"words":4858},"filePathRelative":"family/Diet.md","localizedDate":"2022年7月22日","excerpt":"

    16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

    \\n
      \\n
    • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
    • \\n
    • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
    • \\n
    • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。
    • \\n
    \\n

    饮食

    \\n

    零食

    \\n
      \\n
    • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
    • \\n
    • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7930],{3671:(g,t)=>{t.A=(g,t)=>{const e=g.__vccOpts||g;for(const[g,l]of t)e[g]=l;return e}},6962:(g,t,e)=>{e.r(t),e.d(t,{comp:()=>w,data:()=>M});var l=e(7847);const d=(0,l.Fv)('

    16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

    • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
    • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
    • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。

    饮食

    零食

    • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
    • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。

    饮料

    ',6),r={href:"https://www.zhihu.com/question/546343871/answer/2692019428",target:"_blank",rel:"noopener noreferrer"},n=(0,l.Fv)('

    马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。

    夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。[1] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。

    冷泡燕麦

    牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点:

    • 主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。
    • 配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。
    • 配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。
    • 容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。
    • 放冰箱这一步很重要!不放可能会化身喷射战士。
    • 唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。

    健康理论

    程序员延寿指南

    ',7),a={href:"https://github.com/geekan/HowToLiveLonger",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/geekan/HowToLiveLonger#611-%E5%9B%BA%E4%BD%93",target:"_blank",rel:"noopener noreferrer"},o=(0,l.Lk)("li",null,[(0,l.eW)("液体:喝咖啡(-22%~-12% ACM),"),(0,l.Lk)("strong",null,"喝牛奶"),(0,l.eW)("(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限)")],-1),s=(0,l.Lk)("li",null,"气体:不吸烟(否则+~50% ACM,-12~-11 年寿命)",-1),h={href:"https://github.com/geekan/HowToLiveLonger#614-%E5%85%89%E7%85%A7",target:"_blank",rel:"noopener noreferrer"},p=(0,l.Lk)("li",null,"药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM)",-1),c=(0,l.Lk)("li",null,[(0,l.eW)("输出 "),(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,"运动:每周 3 次 45 分钟挥拍运动(-47% ACM)"),(0,l.Lk)("li",null,"日常:刷牙(-25% ACM)"),(0,l.Lk)("li",null,[(0,l.eW)("睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,"),(0,l.Lk)("em",null,"早睡 +43% ACM,晚睡 +15% ACM(存在争议)")])])],-1),u=(0,l.Lk)("li",null,[(0,l.eW)("上下文 "),(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,"体重:减肥(-54% ACM)")])],-1),k=(0,l.Lk)("h3",{id:"其他",tabindex:"-1"},[(0,l.Lk)("a",{class:"header-anchor",href:"#其他"},[(0,l.Lk)("span",null,"其他")])],-1),f={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"},L=(0,l.Fv)('

    泡澡

    浸泡 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),b={class:"footnotes"},y={class:"footnotes-list"},D={id:"footnote1",class:"footnote-item"},A={href:"https://www.guokr.com/article/461818/",target:"_blank",rel:"noopener noreferrer"},C=(0,l.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),W={},w=(0,e(3671).A)(W,[["render",function(g,t){const e=(0,l.g2)("ExternalLinkIcon");return(0,l.uX)(),(0,l.CE)("div",null,[d,(0,l.Lk)("p",null,[(0,l.eW)("现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考"),(0,l.Lk)("a",r,[(0,l.eW)("适量喝咖啡对身体有哪些好处?"),(0,l.bF)(e)]),(0,l.eW)("。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。")]),n,(0,l.Lk)("p",null,[(0,l.Lk)("a",a,[(0,l.eW)("程序员延寿指南"),(0,l.bF)(e)]),(0,l.eW)(":")]),(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.eW)("输入 "),(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.eW)("固体:"),(0,l.Lk)("a",i,[(0,l.eW)("吃白肉"),(0,l.bF)(e)]),(0,l.eW)("(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%)")]),o,s,(0,l.Lk)("li",null,[(0,l.eW)("光照:"),(0,l.Lk)("a",h,[(0,l.eW)("晒太阳"),(0,l.bF)(e)]),(0,l.eW)("(-~40% ACM)")]),p])]),c,u]),k,(0,l.Lk)("p",null,[(0,l.eW)("在发表在《细胞》杂志的"),(0,l.Lk)("a",f,[(0,l.eW)("综述文章"),(0,l.bF)(e)]),(0,l.eW)("中描述了"),(0,l.Lk)("a",m,[(0,l.eW)("长寿饮食"),(0,l.bF)(e)]),(0,l.eW)(",这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。")]),L,(0,l.Lk)("section",b,[(0,l.Lk)("ol",y,[(0,l.Lk)("li",D,[(0,l.Lk)("p",null,[(0,l.Lk)("a",A,[(0,l.eW)("冷泡茶和热茶放凉,好喝级别能一样吗?"),(0,l.bF)(e)]),(0,l.eW)(),C])])])])])}]]),M=JSON.parse('{"path":"/family/Diet.html","title":"健康饮食","lang":"zh-CN","frontmatter":{"article":false,"title":"健康饮食","icon":"enum","order":1,"description":"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 饮食 零食 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Diet.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"健康饮食"}],["meta",{"property":"og:description","content":"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 饮食 零食 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"健康饮食\\",\\"description\\":\\"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。 饮食 零食 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡...\\"}"]]},"headers":[{"level":2,"title":"饮食","slug":"饮食","link":"#饮食","children":[{"level":3,"title":"零食","slug":"零食","link":"#零食","children":[]},{"level":3,"title":"饮料","slug":"饮料","link":"#饮料","children":[]},{"level":3,"title":"冷泡燕麦","slug":"冷泡燕麦","link":"#冷泡燕麦","children":[]}]},{"level":2,"title":"健康理论","slug":"健康理论","link":"#健康理论","children":[{"level":3,"title":"程序员延寿指南","slug":"程序员延寿指南","link":"#程序员延寿指南","children":[]},{"level":3,"title":"其他","slug":"其他","link":"#其他","children":[]}]},{"level":2,"title":"泡澡","slug":"泡澡","link":"#泡澡","children":[]},{"level":2,"title":"减肥食谱","slug":"减肥食谱","link":"#减肥食谱","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":16.19,"words":4858},"filePathRelative":"family/Diet.md","localizedDate":"2022年7月22日","excerpt":"

    16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

    \\n
      \\n
    • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
    • \\n
    • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
    • \\n
    • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。
    • \\n
    \\n

    饮食

    \\n

    零食

    \\n
      \\n
    • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
    • \\n
    • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/Docker.html.ab3c12d6.js b/assets/js/Docker.html.ab3c12d6.js new file mode 100644 index 000000000..0ca8d23e4 --- /dev/null +++ b/assets/js/Docker.html.ab3c12d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[20],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},5482:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>D,data:()=>f});var s=a(7847);const o=(0,s.Lk)("p",null,"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。",-1),r=(0,s.Lk)("h2",{id:"docker-命令",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#docker-命令"},[(0,s.Lk)("span",null,"Docker 命令")])],-1),t={href:"https://yeasy.gitbook.io/docker_practice/introduction/what",target:"_blank",rel:"noopener noreferrer"},l=(0,s.Fv)('
    • 列出所有容器: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),c={href:"https://blog.csdn.net/a772304419/article/details/123199579",target:"_blank",rel:"noopener noreferrer"},i=(0,s.Fv)('

    例如:

    sudo docker commit \\\n    --message "基于 Ubuntu 18.04 构建的 Huginn" \\\n    ubuntu \\\n    huginnxubuntu:1.0\n

    另外,可以使用 Dockerfile 来构建镜像,如:

        build:\n      context: /volume1/docker/danmuji\n      dockerfile: Dockerfile\n

    如何将镜像推送到 DockerHub:

    echo "您的密码" | docker login --username=您的用户名 --password-stdin\n\ndocker build -t rockben/cors-anywhere:0.4.4 .\ndocker push rockben/cors-anywhere:0.4.4\n

    如果你的 Dockerfile 有后缀,则可以用 -f 指定 Dockerfile 文件路径

    # 构建容器 gramps-api-dev\ncd D:\\Backup\\Libraries\\Desktop\\Gramps.js-main\\dev\ndocker build -t rockben/gramps-api-dev -f ./Dockerfile.api .\ndocker push rockben/gramps-api-dev\n\n# 构建容器 gramps-frontend-dev\n# 将 ./dev/Dockerfile.frontend 复制到解压路径\ncd D:\\Backup\\Libraries\\Desktop\\Gramps.js-main\ndocker build -t rockben/gramps-frontend-dev -f ./dev/Dockerfile.frontend .\ndocker push rockben/gramps-frontend-dev\n

    Docker 数据库管理

    在 Docker 中,数据库可以引用外部资源并被永久保留。但保存的外部数据是多个小文件而不是完整的 MySQL 文件。在实际操作中,我们应关注正在运行的数据库,而非外部存储文件。

    首先,应将 Docker 数据库的端口暴露给外部,如将 MySQL 的默认端口 3306 映射到外部的 3307 端口。随后,使用数据库工具连接到 192.168.3.3:3307。这类似于使用 phpMyAdmin,可以轻松查看、编辑和导出 Docker 内的数据库。如果数据库连接遭到拒绝,可以参照 Huginn 的内部数据库连接设置,确保当前外部连接 IP 是允许的。

    其他使用

    Windows Docker

    ',13),p={href:"https://www.runoob.com/docker/windows-docker-install.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html#docker-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE",target:"_blank",rel:"noopener noreferrer"},k=(0,s.Lk)("p",null,[(0,s.eW)("Windows 本地磁盘被挂载到 Linux 的 mnt 目录下,因此,如果需要在 WSL 中访问 Windows 文件,需要在路径前添加 "),(0,s.Lk)("code",null,"/mnt/"),(0,s.eW)(" 前缀,并将磁盘符号改为小写字母,将反斜杠 "),(0,s.Lk)("code",null,"\\"),(0,s.eW)(" 替换为正斜杠 "),(0,s.Lk)("code",null,"/"),(0,s.eW)("。例如,如果 Windows 文件位于「D:\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker」目录下,则其在 Linux 中的路径为「/mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker」。Windows 上的 WSL 本地路径为 "),(0,s.Lk)("code",null,"\\\\wsl.localhost\\"),(0,s.eW)("。")],-1),u={href:"https://learn.microsoft.com/zh-cn/windows/dev-environment/javascript/nodejs-on-wsl",target:"_blank",rel:"noopener noreferrer"},m=(0,s.Lk)("h3",{id:"宝塔镜像",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#宝塔镜像"},[(0,s.Lk)("span",null,"宝塔镜像")])],-1),b={href:"https://www.bt.cn/bbs/thread-79499-1-1.html",target:"_blank",rel:"noopener noreferrer"},v={href:"http://blog.huangyuqiang.cn/index.php/2022/11/02/docker%E5%AE%89%E8%A3%85%E5%AE%9D%E5%A1%94%E7%8E%AF%E5%A2%83/",target:"_blank",rel:"noopener noreferrer"},h=(0,s.Fv)('
    # 按需求修改映射端口和目录,1024 以下的端口不能给普通用户用\nsudo 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\n

    在站点设置中,绑定你的本地域名 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 功能,宝塔面板也将停止,但不会影响已运行的网站。

    ',4),g={},D=(0,a(3671).A)(g,[["render",function(e,n){const a=(0,s.g2)("RouteLink"),g=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[o,(0,s.Lk)("p",null,[(0,s.eW)("Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来管理多个 Docker 容器,并配置应用程序需要的所有服务。在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。强烈推荐使用 Compose 搭建所有 Docker,流程参考 "),(0,s.bF)(a,{to:"/services/NAS.html#nas-docker"},{default:(0,s.k6)((()=>[(0,s.eW)("NAS 上搭建 Docker")])),_:1}),(0,s.eW)("。")]),r,(0,s.Lk)("p",null,[(0,s.eW)("Docker 使用查看 "),(0,s.Lk)("a",t,[(0,s.eW)("Docker — 从入门到实践"),(0,s.bF)(g)]),(0,s.eW)("。")]),l,(0,s.Lk)("p",null,[(0,s.eW)("有时官方镜像可能不满足我们的需求。这时,我们可以使用 docker commit 命令定制自己的镜像。如何使用,可以查看"),(0,s.Lk)("a",c,[(0,s.eW)("如何保存修改后的容器为镜像"),(0,s.bF)(g)]),(0,s.eW)("。")]),i,(0,s.Lk)("p",null,[(0,s.eW)("在 Windows 系统上,可以使用 "),(0,s.Lk)("a",p,[(0,s.eW)("Docker Desktop"),(0,s.bF)(g)]),(0,s.eW)(" 来管理容器,配置方法可参考 "),(0,s.Lk)("a",d,[(0,s.eW)("Windows Docker 环境配置"),(0,s.bF)(g)]),(0,s.eW)("。")]),k,(0,s.Lk)("p",null,[(0,s.eW)("请注意:WSL 上的 Linux 环境与其他环境有所不同,须查看"),(0,s.Lk)("a",u,[(0,s.eW)("在适用于 Linux 的 Windows 子系统 (WSL2) 上安装 Node.js"),(0,s.bF)(g)]),(0,s.eW)("。")]),m,(0,s.Lk)("p",null,[(0,s.eW)("如果要在 Docker 上部署网站,推荐使用宝塔官方的集成镜像。它基于 CentOS 7.9,解决了 Docker 内部链接问题,还支持将数据库定时备份到本地。有关配置信息,请参考"),(0,s.Lk)("a",b,[(0,s.eW)("宝塔面板定制 docker 镜像发布 - 集成 LN/AMP 支持"),(0,s.bF)(g)]),(0,s.eW)("和 "),(0,s.Lk)("a",v,[(0,s.eW)("Docker 安装宝塔环境"),(0,s.bF)(g)]),(0,s.eW)("。但是,该镜像不适用于 Huginn 的部署,因为 Huginn 不支持 CentOS。我曾尝试将安装命令从 apt-get 替换为 yum,但仍然无法部署。当我尝试在 Docker 中直接安装宝塔而不使用官方集成镜像时,遇到了无法启动数据库的问题。")]),h])}]]),f=JSON.parse('{"path":"/services/Docker.html","title":"Docker","lang":"zh-CN","frontmatter":{"article":false,"title":"Docker","icon":"any","order":2,"description":"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 Compose 是...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/Docker.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Docker"}],["meta",{"property":"og:description","content":"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 Compose 是..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-05T12:24:10.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-05T12:24:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Docker\\",\\"description\\":\\"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 Compose 是...\\"}"]]},"headers":[{"level":2,"title":"Docker 命令","slug":"docker-命令","link":"#docker-命令","children":[]},{"level":2,"title":"定制 Docker 镜像","slug":"定制-docker-镜像","link":"#定制-docker-镜像","children":[]},{"level":2,"title":"Docker 数据库管理","slug":"docker-数据库管理","link":"#docker-数据库管理","children":[]},{"level":2,"title":"其他使用","slug":"其他使用","link":"#其他使用","children":[{"level":3,"title":"Windows Docker","slug":"windows-docker","link":"#windows-docker","children":[]},{"level":3,"title":"宝塔镜像","slug":"宝塔镜像","link":"#宝塔镜像","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1701779050000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":20}]},"readingTime":{"minutes":5.16,"words":1547},"filePathRelative":"services/Docker.md","localizedDate":"2022年7月22日","excerpt":"

    Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。

    \\n

    Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来管理多个 Docker 容器,并配置应用程序需要的所有服务。在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。强烈推荐使用 Compose 搭建所有 Docker,流程参考 NAS 上搭建 Docker

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/Electron.html.1b521f44.js b/assets/js/Electron.html.1b521f44.js new file mode 100644 index 000000000..b5c02e90d --- /dev/null +++ b/assets/js/Electron.html.1b521f44.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3518],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},790:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>u,data:()=>d});var e=a(7847);const t={href:"https://www.electronjs.org/",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Fv)('
    # 部署 electron,electron-builder\n# Electron 不能全局安装,否则 electron-builder 找不到\nyarn add electron@latest -D && yarn add electron-builder -D\n\nset-ExecutionPolicy RemoteSigned #若 yarn 命令报错,则管理员运行此命令\n\n# 全局安装时,去除^,手动指定 package.json 中的 electron 版本,然后运行下方打包命令\n# 将打包命令加入 package.json,直接使用打包命令\nyarn postinstall\nyarn dist\n

    使用问题

    ',2),l=(0,e.Lk)("li",null,"electron cdn 需要连接网络,必须用本地环境安装。",-1),p=(0,e.Lk)("li",null,"Electron 定位的 location 为 窗口链接,而非网页链接。",-1),c={href:"https://imf.ms/web/2022/07/05/my-first-web-hybird-project-experience/#%E8%B7%A8%E5%9F%9F-cors-%E9%85%8D%E7%BD%AE",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Fv)('

    nsis 配置

    "nsis": {\n  "oneClick": false, // 是否一键安装\n  "allowElevation": true, // 允许请求提升。如果为 false,则用户必须使用提升的权限重新启动安装程序。\n  "allowToChangeInstallationDirectory": true, // 允许修改安装目录\n  "installerIcon": "./build/icons/aaa.ico",// 安装图标\n  "uninstallerIcon": "./build/icons/bbb.ico",//卸载图标\n  "installerHeaderIcon": "./build/icons/aaa.ico", // 安装时头部图标\n  "createDesktopShortcut": true, // 创建桌面图标\n  "createStartMenuShortcut": true,// 创建开始菜单图标\n  "shortcutName": "xxxx", // 图标名称\n  "include": "build/script/installer.nsh", // 包含的自定义 nsis 脚本 这个对于构建需求严格得安装过程相当有用。\n  "script" : "build/script/installer.nsh" // NSIS 脚本的路径,用于自定义安装程序。默认为 build / installer.nsi\n},\n

    打包报错

    执行打包命令后,提示 cannot unpack electron zip file, will be re-downloaded

    手动下载对应版本 electron,然后将压缩包放置于 C:\\Users\\用户名\\AppData\\Local\\electron\\Cache

    跨系统打包

    electron 不允许跨系统打包,所以 Mac 打包需要在 iOS 环境,Linux 打包需在 Linux 环境。

    Win11 可允许内建子系统,管理员身份运行 Powershell,输入 bash 即可进入 Linux 子系统。也可以直接打开在 Microsoft store 中下载的 Ubuntu 进入子系统,初次进入 Linux 子系统需要设置 Linux 的用户名及密码。

    更多命令参考:

    #安排装更新软件源,安装 node 和 npm 环境\nsudo apt-get update\nsudo apt-get install nodejs\nsudo apt-get install npm\n\nsudo npm install npm@latest -g #升级 npm\nsudo npm install -g n #安装用于安装 nodejs 的模块 n\nsudo n stable #通过 n 模块安装指定的 nodejs\n
    ',10),i={},u=(0,a(3671).A)(i,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon"),i=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",t,[(0,e.eW)("Electron"),(0,e.bF)(a)]),(0,e.eW)(" 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。")]),(0,e.Lk)("p",null,[(0,e.eW)("按 "),(0,e.bF)(i,{to:"/deploy/VPS.html#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2"},{default:(0,e.k6)((()=>[(0,e.eW)("环境部署教程")])),_:1}),(0,e.eW)(",部署 yarn,然后部署 electron 环境。")]),o,(0,e.Lk)("ul",null,[l,p,(0,e.Lk)("li",null,[(0,e.Lk)("a",c,[(0,e.eW)("跨域 CORS 配置"),(0,e.bF)(a)]),(0,e.eW)(":有的应用需要访问的是本地 Web Server,与服务端接口在不同域")])]),r])}]]),d=JSON.parse('{"path":"/code/Electron.html","title":"Electron","lang":"zh-CN","frontmatter":{"article":false,"title":"Electron","icon":"layout","order":7,"description":"Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。 按 ,部署 yarn,然后部署 electron 环境。 使用问题 electron cdn 需要连接网络,必须用本地环境安装。 Electron 定位的 l...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Electron.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Electron"}],["meta",{"property":"og:description","content":"Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。 按 ,部署 yarn,然后部署 electron 环境。 使用问题 electron cdn 需要连接网络,必须用本地环境安装。 Electron 定位的 l..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Electron\\",\\"description\\":\\"Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。 按 ,部署 yarn,然后部署 electron 环境。 使用问题 electron cdn 需要连接网络,必须用本地环境安装。 Electron 定位的 l...\\"}"]]},"headers":[{"level":2,"title":"使用问题","slug":"使用问题","link":"#使用问题","children":[{"level":3,"title":"nsis 配置","slug":"nsis-配置","link":"#nsis-配置","children":[]},{"level":3,"title":"打包报错","slug":"打包报错","link":"#打包报错","children":[]},{"level":3,"title":"跨系统打包","slug":"跨系统打包","link":"#跨系统打包","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":2.14,"words":643},"filePathRelative":"code/Electron.md","localizedDate":"2022年7月22日","excerpt":"

    Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。

    \\n

    环境部署教程,部署 yarn,然后部署 electron 环境。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/Fitness.html.d7071adb.js b/assets/js/Fitness.html.d7071adb.js new file mode 100644 index 000000000..ca4f1a221 --- /dev/null +++ b/assets/js/Fitness.html.d7071adb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[98],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,i]of t)n[e]=i;return n}},9639:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>m,data:()=>g});var i=n(7847);const a=(0,i.Lk)("p",null,"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。",-1),l=(0,i.Lk)("p",null,[(0,i.eW)("消除饥饿感:"),(0,i.Lk)("strong",null,"10 秒内原地高抬腿快跑 20 次"),(0,i.eW)("!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。")],-1),r={href:"https://www.solidot.org/story?sid=71166",target:"_blank",rel:"noopener noreferrer"},s=(0,i.Lk)("h2",{id:"k-歌减肥",tabindex:"-1"},[(0,i.Lk)("a",{class:"header-anchor",href:"#k-歌减肥"},[(0,i.Lk)("span",null,"K 歌减肥")])],-1),p={href:"https://mp.weixin.qq.com/s/QKJ9PnmGTK7XY0yUWxsMRw",target:"_blank",rel:"noopener noreferrer"},o=(0,i.Fv)('
    • 每天唱三首歌,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要一边按住 E 点,一边用力发声唱歌

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

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

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

    坐立减肥

    ',3),c={href:"https://mp.weixin.qq.com/s/LN0xu-FZaHP1oFvSwilGrA",target:"_blank",rel:"noopener noreferrer"},h=(0,i.Fv)('
    比目鱼俯卧撑演示图
    比目鱼俯卧撑演示图

    当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 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),d={},m=(0,n(3671).A)(d,[["render",function(e,t){const n=(0,i.g2)("ExternalLinkIcon");return(0,i.uX)(),(0,i.CE)("div",null,[a,l,(0,i.Lk)("p",null,[(0,i.eW)("晨间锻炼使用八段锦(12mins)热身。每天保持 "),(0,i.Lk)("a",r,[(0,i.eW)("9000 步"),(0,i.bF)(n)]),(0,i.eW)(",日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。")]),s,(0,i.Lk)("p",null,[(0,i.Lk)("a",p,[(0,i.eW)("K 歌减肥"),(0,i.bF)(n)]),(0,i.eW)("容易吵到邻居,没找到隔音口罩,用发泄壶代替。")]),o,(0,i.Lk)("p",null,[(0,i.eW)("研究者开创了一种名叫"),(0,i.Lk)("a",c,[(0,i.eW)("比目鱼俯卧撑(SPU)"),(0,i.bF)(n)]),(0,i.eW)("的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。")]),h])}]]),g=JSON.parse('{"path":"/Fitness.html","title":"健身计划","lang":"zh-CN","frontmatter":{"article":false,"title":"健身计划","icon":"strong","description":"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 K 歌减肥 K ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/Fitness.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"健身计划"}],["meta",{"property":"og:description","content":"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 K 歌减肥 K ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-10-14-38-20.png?imageMogr2/format/webp \\"E 点位置\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"健身计划"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"健身计划\\",\\"description\\":\\"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 K 歌减肥 K ...\\"}"]]},"headers":[{"level":2,"title":"K 歌减肥","slug":"k-歌减肥","link":"#k-歌减肥","children":[]},{"level":2,"title":"坐立减肥","slug":"坐立减肥","link":"#坐立减肥","children":[]},{"level":2,"title":"健身理论","slug":"健身理论","link":"#健身理论","children":[]},{"level":2,"title":"每周健身 4 小时","slug":"每周健身-4-小时","link":"#每周健身-4-小时","children":[]},{"level":2,"title":"室内健身","slug":"室内健身","link":"#室内健身","children":[{"level":3,"title":"Slim in 6","slug":"slim-in-6","link":"#slim-in-6","children":[]},{"level":3,"title":"P90","slug":"p90","link":"#p90","children":[]},{"level":3,"title":"Les Mills BodyCombat","slug":"les-mills-bodycombat","link":"#les-mills-bodycombat","children":[]},{"level":3,"title":"T25","slug":"t25","link":"#t25","children":[]},{"level":3,"title":"P90X 和 insanity","slug":"p90x-和-insanity","link":"#p90x-和-insanity","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":15}]},"readingTime":{"minutes":10.53,"words":3159},"filePathRelative":"Fitness.md","localizedDate":"2022年7月22日","excerpt":"

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

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-f1c4e7b8.2a98765a.js b/assets/js/GitHub.html.6b04544d.js similarity index 85% rename from assets/js/v-f1c4e7b8.2a98765a.js rename to assets/js/GitHub.html.6b04544d.js index be781ab0f..2f540a83a 100644 --- a/assets/js/v-f1c4e7b8.2a98765a.js +++ b/assets/js/GitHub.html.6b04544d.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6048],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},7908:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>E,data:()=>R});var t=a(3968);const s=(0,t.IL)('

    GitHub Actions

    GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]

    ',2),o={href:"https://github.com/marketplace?type=actions",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/sdras/awesome-actions",target:"_blank",rel:"noopener noreferrer"},l=(0,t.QD)("p",null,[(0,t.mY)("如果 GitHub Actions 命令中有涉及密码等私密信息,则进入项目仓库的「Settings」>「Secrets and variables」>「Actions」,添加密钥进行加密处理。比如新建密钥 PERSONAL_TOKEN,Actions 命令中使用 "),(0,t.QD)("code",null,"${{ secrets.PERSONAL_TOKEN }}"),(0,t.mY)(" 来指代该密钥。")],-1),c=(0,t.QD)("h3",{id:"dependabot",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#dependabot"},[(0,t.QD)("span",null,"Dependabot")])],-1),p={href:"https://docs.github.com/zh/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#common-dependabot-automations",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/rockbenben/tools-by-ai/tree/main/.github",target:"_blank",rel:"noopener noreferrer"},u=(0,t.IL)('

    完成上述配置后,Actions 可能会报错 failed to create review: GraphQL: GitHub Actions is not permitted。这是由于 Actions 权限未开启的原因。我们需要继续进行以下设置:

    1. 进入项目仓库的「Settings」。
    2. 选择「General」>「Pull Requests」,勾选 Allow auto-merge,以赋予 Actions 合并操作权限。
    3. 在同一界面,选择「Code and automation」>「Actions」>「General」>「Workflow permissions」,选中 Read and write permissions,并勾选 Allow GitHub Actions to create and approve pull requests,然后点击保存。这样可以授予 Actions 批准拉取请求的权限。

    注意:GitHub Free 账户只支持在公共仓库中使用自动标记、批准拉取请求以及合并操作。

    不同仓库间复制

    复制文件到目的地,文档没变化则不会执行。案例为将当前仓库 main 分支下 docs 的 README.md 文件复制到另一个仓库 rockbenben/LearnData/ 路径下,如果目标路径存在相同文件,则将覆盖。如果让 clean: true 生效,Actions 会将目标路径情况,然后执行复制。

    ',5),d={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"},m={href:"https://github.com/settings/tokens",target:"_blank",rel:"noopener noreferrer"},h=(0,t.IL)('
    - name: Copy file\n  uses: andstor/copycat-action@v3\n  with:\n    personal_token: ${{ secrets.PERSONAL_TOKEN }}\n    src_path: docs/README.md\n    dst_path: /\n    dst_owner: rockbenben\n    dst_repo_name: LearnData\n    dst_branch: main\n    src_branch: main\n    #clean: true\n

    Actions 失败重试

    在 job 和 step 中使用 if 语句,只有满足条件时才执行具体的 job 或 step。[2]

    # 任务状态检查函数\nsuccess() # 当上一步执行成功时返回 true\nalways() # 总是返回 true\ncancelled() # 当 workflow 被取消时返回 true\nfailure() # 当上一步执行失败时返回 true\n

    first_step 会总是执行,second_step 需要上一步 first_step 执行成功才会执行,third_step 只有上一步 second_step 执行失败才执行。当 third_step 与 second_step 命令相同时,就可以达到失败重试的效果了。

    jobs:\n  first_job:\n    name: My first job\n    runs-on: ubuntu-latest\n    steps:\n      - name: first_step\n        if: always()\n\n      - name: second_step\n        if: success()\n\n      - name: third_step\n        if: failure()\n

    uses 版本号

    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

    Git Commit

    ',10),b={href:"https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-cli",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.conventionalcommits.org/zh-hans/",target:"_blank",rel:"noopener noreferrer"},g=(0,t.IL)('
    <type>[optional scope]: <description>\n\n[optional body]\n\n[optional footer(s)]\n

    Type

    Type 用于说明 git commit 的类别,只允许使用下面的标识。[3]

    • feat: 新特性或功能(feature)
    • fix: 修复 bug
    • docs: 文档更新(documentation)
    • style: 代码风格或者组件样式更新(不影响代码运行的变动)
    • refactor: 代码重构,不引入新功能和缺陷修复
    • perf: 优化相关,比如提升性能、体验
    • test: 增加测试
    • chore: 构建过程或辅助工具的变动
    • revert: 回滚到上一个版本

    Scope

    Scope 用于说明 commit 影响的范围,比如 Controller、DAO、View 等等,视项目不同而不同。如果其中包含了多个 scope,可以使用 * 代替。

    如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。[4]

    如果当前 commit 针对某个 issue,那么可以在 Footer 部分使用 Closes #265 关闭这个 issue。也可以在任意位置输入 #265,将 commit 与对应问题相关联。

    Pull Requests

    在 GitHub 中,有三种常见的 Pull Request(PR)合并方式:Create a merge commit(创建合并提交),Squash and merge(压缩合并)和 Rebase and merge(变基合并)。

    一般情况下,推荐使用 Squash and merge。在项目仓库的「Settings」中,选择「General」>「Pull Requests」,取消勾选 Allow merge commitsAllow rebase merging,即可默认显示 Squash and merge。

    常见问题

    GitHub 忽略指定文件

    项目路径新建一个命名为 .gitignore 的文件,将想要忽略的文件夹和文件写入 .gitignore 文件,换行分隔。

    比如要忽略 node_modules 文件夹,就直接在文件中输入 node_modules。

    添加 Github 源作为依赖

    一般情况下,依赖包会使用 npm 进行管理。但有时开发者可能并不会立即更新到 npm 上,这时我们可以选择使用 GitHub 源作为备用方案。

    另外,在国内服务器连接不上 GitHub 的情况下,可以先使用 npm 安装依赖包,然后手动替换 node_modules 目录中对应的源为下载好的文件。

    yarn add strapi-google-auth\nyarn add https://github.com/arjusmoon860/strapi-google-auth.git\n

    ',21),f={class:"footnotes"},v={class:"footnotes-list"},y={id:"footnote1",class:"footnote-item"},D={href:"https://docs.github.com/cn/actions/learn-github-actions/understanding-github-actions",target:"_blank",rel:"noopener noreferrer"},A=(0,t.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),G={id:"footnote2",class:"footnote-item"},_={href:"https://blog.csdn.net/Ber_Bai/article/details/120310024",target:"_blank",rel:"noopener noreferrer"},w=(0,t.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),H={id:"footnote3",class:"footnote-item"},Q={href:"https://www.jianshu.com/p/6433679cd10f",target:"_blank",rel:"noopener noreferrer"},C=(0,t.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),Y={id:"footnote4",class:"footnote-item"},x={href:"http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html",target:"_blank",rel:"noopener noreferrer"},K=(0,t.QD)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),S={},E=(0,a(9720).c)(S,[["render",function(e,n){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[s,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",o,[(0,t.mY)("GitHub Actions 官方市场"),(0,t.K2)(a)])]),(0,t.QD)("li",null,[(0,t.QD)("a",i,[(0,t.mY)("Awesome Actions"),(0,t.K2)(a)])])]),l,c,(0,t.QD)("p",null,[(0,t.mY)("Dependabot 是 GitHub 提供的官方自动化工具,可监视项目中使用的依赖项中的漏洞,并确保这些依赖项保持最新。你可以使用"),(0,t.QD)("a",p,[(0,t.mY)("常用 Dependabot 自动化"),(0,t.K2)(a)]),(0,t.mY)(" 中的 GitHub Actions 命令,使 Dependabot 自动完成依赖的标记、批准拉取请求以及合并操作。如果仍有疑问,可以参考 tools-by-ai 中的 "),(0,t.QD)("a",r,[(0,t.mY)(".github"),(0,t.K2)(a)]),(0,t.mY)(" 配置。")]),u,(0,t.QD)("p",null,[(0,t.mY)("此动作需按 "),(0,t.QD)("a",d,[(0,t.mY)("Creating a personal access token"),(0,t.K2)(a)]),(0,t.mY)(" 建立"),(0,t.QD)("a",m,[(0,t.mY)("个人访问令牌"),(0,t.K2)(a)]),(0,t.mY)(",勾选权限「repo Full control of private repositories」,然后将该 token 值其保存在项目仓库的 Action 密钥。")]),h,(0,t.QD)("p",null,[(0,t.mY)("标准化的 Commit message 可以提供清晰、易读的历史记录,使我们更容易理解每个提交的目的和内容,这有助于追踪和审查代码变更。通过 "),(0,t.QD)("a",b,[(0,t.mY)("conventional-changelog-cli"),(0,t.K2)(a)]),(0,t.mY)(" 可以自动生成 CHANGELOG.md。建议都按照 "),(0,t.QD)("a",k,[(0,t.mY)("Conventional Commits"),(0,t.K2)(a)]),(0,t.mY)(" 的规范来进行提交。")]),g,(0,t.QD)("section",f,[(0,t.QD)("ol",v,[(0,t.QD)("li",y,[(0,t.QD)("p",null,[(0,t.QD)("a",D,[(0,t.mY)("了解 GitHub Actions"),(0,t.K2)(a)]),(0,t.mY)(),A])]),(0,t.QD)("li",G,[(0,t.QD)("p",null,[(0,t.QD)("a",_,[(0,t.mY)("最全总结,GitHub Action 自动化部署"),(0,t.K2)(a)]),(0,t.mY)(),w])]),(0,t.QD)("li",H,[(0,t.QD)("p",null,[(0,t.QD)("a",Q,[(0,t.mY)("Git Commit 规范"),(0,t.K2)(a)]),(0,t.mY)(),C])]),(0,t.QD)("li",Y,[(0,t.QD)("p",null,[(0,t.QD)("a",x,[(0,t.mY)("Commit message 和 Change log 编写指南"),(0,t.K2)(a)]),(0,t.mY)(),K])])])])])}]]),R=JSON.parse('{"path":"/deploy/GitHub.html","title":"GitHub","lang":"zh-CN","frontmatter":{"article":false,"title":"GitHub","icon":"github","order":4,"description":"GitHub Actions GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/GitHub.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"GitHub"}],["meta",{"property":"og:description","content":"GitHub Actions GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-08T04:08:55.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-08T04:08:55.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"GitHub\\",\\"description\\":\\"GitHub Actions GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\\\\\workflows 目录下,repo ...\\"}"]]},"headers":[{"level":2,"title":"GitHub Actions","slug":"github-actions","link":"#github-actions","children":[{"level":3,"title":"Dependabot","slug":"dependabot","link":"#dependabot","children":[]},{"level":3,"title":"不同仓库间复制","slug":"不同仓库间复制","link":"#不同仓库间复制","children":[]},{"level":3,"title":"Actions 失败重试","slug":"actions-失败重试","link":"#actions-失败重试","children":[]},{"level":3,"title":"uses 版本号","slug":"uses-版本号","link":"#uses-版本号","children":[]}]},{"level":2,"title":"Git Commit","slug":"git-commit","link":"#git-commit","children":[{"level":3,"title":"Type","slug":"type","link":"#type","children":[]},{"level":3,"title":"Scope","slug":"scope","link":"#scope","children":[]},{"level":3,"title":"Footer","slug":"footer","link":"#footer","children":[]}]},{"level":2,"title":"Pull Requests","slug":"pull-requests","link":"#pull-requests","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"GitHub 忽略指定文件","slug":"github-忽略指定文件","link":"#github-忽略指定文件","children":[]},{"level":3,"title":"添加 Github 源作为依赖","slug":"添加-github-源作为依赖","link":"#添加-github-源作为依赖","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1702008535000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":21}]},"readingTime":{"minutes":5.16,"words":1548},"filePathRelative":"deploy/GitHub.md","localizedDate":"2022年7月22日","excerpt":"

    GitHub Actions

    \\n

    GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5744],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},9258:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>E,data:()=>R});var t=a(7847);const s=(0,t.Fv)('

    GitHub Actions

    GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]

    ',2),o={href:"https://github.com/marketplace?type=actions",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/sdras/awesome-actions",target:"_blank",rel:"noopener noreferrer"},l=(0,t.Lk)("p",null,[(0,t.eW)("如果 GitHub Actions 命令中有涉及密码等私密信息,则进入项目仓库的「Settings」>「Secrets and variables」>「Actions」,添加密钥进行加密处理。比如新建密钥 PERSONAL_TOKEN,Actions 命令中使用 "),(0,t.Lk)("code",null,"${{ secrets.PERSONAL_TOKEN }}"),(0,t.eW)(" 来指代该密钥。")],-1),c=(0,t.Lk)("h3",{id:"dependabot",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#dependabot"},[(0,t.Lk)("span",null,"Dependabot")])],-1),p={href:"https://docs.github.com/zh/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#common-dependabot-automations",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/rockbenben/tools-by-ai/tree/main/.github",target:"_blank",rel:"noopener noreferrer"},u=(0,t.Fv)('

    完成上述配置后,Actions 可能会报错 failed to create review: GraphQL: GitHub Actions is not permitted。这是由于 Actions 权限未开启的原因。我们需要继续进行以下设置:

    1. 进入项目仓库的「Settings」。
    2. 选择「General」>「Pull Requests」,勾选 Allow auto-merge,以赋予 Actions 合并操作权限。
    3. 在同一界面,选择「Code and automation」>「Actions」>「General」>「Workflow permissions」,选中 Read and write permissions,并勾选 Allow GitHub Actions to create and approve pull requests,然后点击保存。这样可以授予 Actions 批准拉取请求的权限。

    注意:GitHub Free 账户只支持在公共仓库中使用自动标记、批准拉取请求以及合并操作。

    不同仓库间复制

    复制文件到目的地,文档没变化则不会执行。案例为将当前仓库 main 分支下 docs 的 README.md 文件复制到另一个仓库 rockbenben/LearnData/ 路径下,如果目标路径存在相同文件,则将覆盖。如果让 clean: true 生效,Actions 会将目标路径情况,然后执行复制。

    ',5),d={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"},h={href:"https://github.com/settings/tokens",target:"_blank",rel:"noopener noreferrer"},m=(0,t.Fv)('
    - name: Copy file\n  uses: andstor/copycat-action@v3\n  with:\n    personal_token: ${{ secrets.PERSONAL_TOKEN }}\n    src_path: docs/README.md\n    dst_path: /\n    dst_owner: rockbenben\n    dst_repo_name: LearnData\n    dst_branch: main\n    src_branch: main\n    #clean: true\n

    Actions 失败重试

    在 job 和 step 中使用 if 语句,只有满足条件时才执行具体的 job 或 step。[2]

    # 任务状态检查函数\nsuccess() # 当上一步执行成功时返回 true\nalways() # 总是返回 true\ncancelled() # 当 workflow 被取消时返回 true\nfailure() # 当上一步执行失败时返回 true\n

    first_step 会总是执行,second_step 需要上一步 first_step 执行成功才会执行,third_step 只有上一步 second_step 执行失败才执行。当 third_step 与 second_step 命令相同时,就可以达到失败重试的效果了。

    jobs:\n  first_job:\n    name: My first job\n    runs-on: ubuntu-latest\n    steps:\n      - name: first_step\n        if: always()\n\n      - name: second_step\n        if: success()\n\n      - name: third_step\n        if: failure()\n

    uses 版本号

    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

    Git Commit

    ',10),b={href:"https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-cli",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.conventionalcommits.org/zh-hans/",target:"_blank",rel:"noopener noreferrer"},g=(0,t.Fv)('
    <type>[optional scope]: <description>\n\n[optional body]\n\n[optional footer(s)]\n

    Type

    Type 用于说明 git commit 的类别,只允许使用下面的标识。[3]

    • feat: 新特性或功能(feature)
    • fix: 修复 bug
    • docs: 文档更新(documentation)
    • style: 代码风格或者组件样式更新(不影响代码运行的变动)
    • refactor: 代码重构,不引入新功能和缺陷修复
    • perf: 优化相关,比如提升性能、体验
    • test: 增加测试
    • chore: 构建过程或辅助工具的变动
    • revert: 回滚到上一个版本

    Scope

    Scope 用于说明 commit 影响的范围,比如 Controller、DAO、View 等等,视项目不同而不同。如果其中包含了多个 scope,可以使用 * 代替。

    如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。[4]

    如果当前 commit 针对某个 issue,那么可以在 Footer 部分使用 Closes #265 关闭这个 issue。也可以在任意位置输入 #265,将 commit 与对应问题相关联。

    Pull Requests

    在 GitHub 中,有三种常见的 Pull Request(PR)合并方式:Create a merge commit(创建合并提交),Squash and merge(压缩合并)和 Rebase and merge(变基合并)。

    一般情况下,推荐使用 Squash and merge。在项目仓库的「Settings」中,选择「General」>「Pull Requests」,取消勾选 Allow merge commitsAllow rebase merging,即可默认显示 Squash and merge。

    常见问题

    GitHub 忽略指定文件

    项目路径新建一个命名为 .gitignore 的文件,将想要忽略的文件夹和文件写入 .gitignore 文件,换行分隔。

    比如要忽略 node_modules 文件夹,就直接在文件中输入 node_modules。

    添加 Github 源作为依赖

    一般情况下,依赖包会使用 npm 进行管理。但有时开发者可能并不会立即更新到 npm 上,这时我们可以选择使用 GitHub 源作为备用方案。

    另外,在国内服务器连接不上 GitHub 的情况下,可以先使用 npm 安装依赖包,然后手动替换 node_modules 目录中对应的源为下载好的文件。

    yarn add strapi-google-auth\nyarn add https://github.com/arjusmoon860/strapi-google-auth.git\n

    ',21),f={class:"footnotes"},v={class:"footnotes-list"},y={id:"footnote1",class:"footnote-item"},A={href:"https://docs.github.com/cn/actions/learn-github-actions/understanding-github-actions",target:"_blank",rel:"noopener noreferrer"},G=(0,t.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),_={id:"footnote2",class:"footnote-item"},L={href:"https://blog.csdn.net/Ber_Bai/article/details/120310024",target:"_blank",rel:"noopener noreferrer"},w=(0,t.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),H={id:"footnote3",class:"footnote-item"},C={href:"https://www.jianshu.com/p/6433679cd10f",target:"_blank",rel:"noopener noreferrer"},W=(0,t.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),F={id:"footnote4",class:"footnote-item"},x={href:"http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html",target:"_blank",rel:"noopener noreferrer"},D=(0,t.Lk)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),S={},E=(0,a(3671).A)(S,[["render",function(e,n){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[s,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",o,[(0,t.eW)("GitHub Actions 官方市场"),(0,t.bF)(a)])]),(0,t.Lk)("li",null,[(0,t.Lk)("a",i,[(0,t.eW)("Awesome Actions"),(0,t.bF)(a)])])]),l,c,(0,t.Lk)("p",null,[(0,t.eW)("Dependabot 是 GitHub 提供的官方自动化工具,可监视项目中使用的依赖项中的漏洞,并确保这些依赖项保持最新。你可以使用"),(0,t.Lk)("a",p,[(0,t.eW)("常用 Dependabot 自动化"),(0,t.bF)(a)]),(0,t.eW)(" 中的 GitHub Actions 命令,使 Dependabot 自动完成依赖的标记、批准拉取请求以及合并操作。如果仍有疑问,可以参考 tools-by-ai 中的 "),(0,t.Lk)("a",r,[(0,t.eW)(".github"),(0,t.bF)(a)]),(0,t.eW)(" 配置。")]),u,(0,t.Lk)("p",null,[(0,t.eW)("此动作需按 "),(0,t.Lk)("a",d,[(0,t.eW)("Creating a personal access token"),(0,t.bF)(a)]),(0,t.eW)(" 建立"),(0,t.Lk)("a",h,[(0,t.eW)("个人访问令牌"),(0,t.bF)(a)]),(0,t.eW)(",勾选权限「repo Full control of private repositories」,然后将该 token 值其保存在项目仓库的 Action 密钥。")]),m,(0,t.Lk)("p",null,[(0,t.eW)("标准化的 Commit message 可以提供清晰、易读的历史记录,使我们更容易理解每个提交的目的和内容,这有助于追踪和审查代码变更。通过 "),(0,t.Lk)("a",b,[(0,t.eW)("conventional-changelog-cli"),(0,t.bF)(a)]),(0,t.eW)(" 可以自动生成 CHANGELOG.md。建议都按照 "),(0,t.Lk)("a",k,[(0,t.eW)("Conventional Commits"),(0,t.bF)(a)]),(0,t.eW)(" 的规范来进行提交。")]),g,(0,t.Lk)("section",f,[(0,t.Lk)("ol",v,[(0,t.Lk)("li",y,[(0,t.Lk)("p",null,[(0,t.Lk)("a",A,[(0,t.eW)("了解 GitHub Actions"),(0,t.bF)(a)]),(0,t.eW)(),G])]),(0,t.Lk)("li",_,[(0,t.Lk)("p",null,[(0,t.Lk)("a",L,[(0,t.eW)("最全总结,GitHub Action 自动化部署"),(0,t.bF)(a)]),(0,t.eW)(),w])]),(0,t.Lk)("li",H,[(0,t.Lk)("p",null,[(0,t.Lk)("a",C,[(0,t.eW)("Git Commit 规范"),(0,t.bF)(a)]),(0,t.eW)(),W])]),(0,t.Lk)("li",F,[(0,t.Lk)("p",null,[(0,t.Lk)("a",x,[(0,t.eW)("Commit message 和 Change log 编写指南"),(0,t.bF)(a)]),(0,t.eW)(),D])])])])])}]]),R=JSON.parse('{"path":"/deploy/GitHub.html","title":"GitHub","lang":"zh-CN","frontmatter":{"article":false,"title":"GitHub","icon":"github","order":4,"description":"GitHub Actions GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/GitHub.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"GitHub"}],["meta",{"property":"og:description","content":"GitHub Actions GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-08T04:08:55.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-08T04:08:55.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"GitHub\\",\\"description\\":\\"GitHub Actions GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\\\\\workflows 目录下,repo ...\\"}"]]},"headers":[{"level":2,"title":"GitHub Actions","slug":"github-actions","link":"#github-actions","children":[{"level":3,"title":"Dependabot","slug":"dependabot","link":"#dependabot","children":[]},{"level":3,"title":"不同仓库间复制","slug":"不同仓库间复制","link":"#不同仓库间复制","children":[]},{"level":3,"title":"Actions 失败重试","slug":"actions-失败重试","link":"#actions-失败重试","children":[]},{"level":3,"title":"uses 版本号","slug":"uses-版本号","link":"#uses-版本号","children":[]}]},{"level":2,"title":"Git Commit","slug":"git-commit","link":"#git-commit","children":[{"level":3,"title":"Type","slug":"type","link":"#type","children":[]},{"level":3,"title":"Scope","slug":"scope","link":"#scope","children":[]},{"level":3,"title":"Footer","slug":"footer","link":"#footer","children":[]}]},{"level":2,"title":"Pull Requests","slug":"pull-requests","link":"#pull-requests","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"GitHub 忽略指定文件","slug":"github-忽略指定文件","link":"#github-忽略指定文件","children":[]},{"level":3,"title":"添加 Github 源作为依赖","slug":"添加-github-源作为依赖","link":"#添加-github-源作为依赖","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1702008535000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":21}]},"readingTime":{"minutes":5.16,"words":1548},"filePathRelative":"deploy/GitHub.md","localizedDate":"2022年7月22日","excerpt":"

    GitHub Actions

    \\n

    GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-702a67e2.1de7d4dd.js b/assets/js/HTML.html.6b967c87.js similarity index 89% rename from assets/js/v-702a67e2.1de7d4dd.js rename to assets/js/HTML.html.6b967c87.js index c0d6520d5..09bdd313d 100644 --- a/assets/js/v-702a67e2.1de7d4dd.js +++ b/assets/js/HTML.html.6b967c87.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1292],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},5756:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>A,data:()=>U});var t=a(3968);const e=(0,t.IL)('

    HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。

    基础知识

    相对路径

    / 根目录(electron 不适用)\n./ 当前目录(可省略不写)\n../ 父级目录(返回到上一级目录)\n../../ 祖父级目录(返回两级目录)\n

    反义、转义字符

    一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。

    显示结果描述实体名称实体编号
    空格&nbsp;&#160;
    <小于号&lt;&#60;
    >大于号&gt;&#62;
    &和号&amp;&#38;
    "引号&quot;&#34;
    '撇号&apos;&#39;

    JavaScript 插件

    ',8),p={href:"https://fontawesome.com/",target:"_blank",rel:"noopener noreferrer"},o={href:"https://layuion.com/",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/CodeSeven/toastr",target:"_blank",rel:"noopener noreferrer"},c={href:"https://popper.js.org/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://dayjs.gitee.io/docs/zh-CN/get-set/get-set",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/javve/list.js",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/saucxs/watermark-dom",target:"_blank",rel:"noopener noreferrer"},d={href:"https://codemirror.net/",target:"_blank",rel:"noopener noreferrer"},k=(0,t.QD)("sup",{class:"footnote-ref"},[(0,t.QD)("a",{href:"#footnote1"},"[1]"),(0,t.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),m=(0,t.QD)("h3",{id:"功能加强",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#功能加强"},[(0,t.QD)("span",null,"功能加强")])],-1),v={href:"https://clipboardjs.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/eligrey/FileSaver.js",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/pqina/filepond",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/oct16/TimeCat",target:"_blank",rel:"noopener noreferrer"},f=(0,t.QD)("h3",{id:"小游戏代码",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#小游戏代码"},[(0,t.QD)("span",null,"小游戏代码")])],-1),q={href:"https://github.com/muan/emoji-minesweeper",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/KilledByAPixel/HueJumper2k",target:"_blank",rel:"noopener noreferrer"},y={href:"https://github.com/shinima/battle-city",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/chvin/react-tetris",target:"_blank",rel:"noopener noreferrer"},w=(0,t.QD)("h2",{id:"css-样式",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#css-样式"},[(0,t.QD)("span",null,"CSS 样式")])],-1),Q={href:"https://lhammer.cn/You-need-to-know-css/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},Y=(0,t.IL)('

    图片

    图片增加属性,自动扩展宽高。

    <img src="<https://img.newzone.top/xxx.png>" style="width:50%; height:50%;" />\n<img src="<https://img.newzone.top/xxx.png>" width="100" height="100" />\n\n<!-- bootstrap 下自动控制图片大小 -->\n<img src="<https://img.newzone.top/xxx.png>" class="img-fluid" />\n

    图片链接为空时,去除图片所占区域,并防止出现空边框。

    <style type="text/css">\n  img[src=""],\n  img:not([src]) {\n    opacity: 0;\n    width: 0;\n    height: 0;\n  }\n</style>\n

    当图床图片无法显示时,尝试屏蔽自己网站的 referrer,在源码中添加:<meta name="referrer" content="no-referrer" />

    纯色背景

    body 铺满页面,添加纯色背景。

    <style>\n  body {\n    background-color: #222b3a;\n  }\n  html,\n  body {\n    height: 100%;\n  }\n</style>\n

    或使用 bootstrap 的样式class="bg-light"

    鼠标经过变色

    鼠标经过重链接,则该区域变色。

    .tg td a:hover {\n  background: #f29901;\n  display: block;\n}\n

    隐藏元素

    隐藏网页元素

    # 将元素的显示设为无,元素在网页中不占任何的位置。\nstyle="display:none;"\n# 将元素隐藏,但是元素在网页中的位置还是被占着。\nstyle="visibility:hidden;"\n\n# 显示隐藏元素\n$('#hidden_sort').show();\n# 继续隐藏#hidden_sort\n$('#hidden_sort').hide();\n\n<div id="hidden_alert" style="display:none;" class="col-12 alert alert-primary" role="alert">标题数过大</div>\n# 当无法使用,继续隐藏#hidden_sort\ndocument.getElementById('hidden_alert').style.display="none";\ndocument.getElementById('hidden_alert').style.display="block";\n\n# 显示 div span 的文本内容\nhidden_alert.textContent="标题数超过,请减少标题数或取消勾选「避重」";\n

    高亮

    对选择文章进行着色高亮。

    <a style="color: #FF0000;">xxx</a>\n

    页面布局

    自适应布局

    ',21),j={href:"https://getbootstrap.com/docs/5.1/utilities/spacing/",target:"_blank",rel:"noopener noreferrer"},T=(0,t.IL)('
    # 分别为距离上下左右,\nclass="mt-5 mb-5 ms-4 me-4"\n\n# 修改间距\nstyle="margin-top:-15px;margin-bottom:-15px"\n\n# 图片自动拉伸宽度\nstyle="background-size:contain|cover;width:100%;height:auto;"\n\n# 视频将宽度设置大些,然后让其自动缩放\nwidth="2400px"\n

    客户端自适应

    判断设备是移动还是 PC,然后显示不同样式内容。

    <script>\n  window.onload = function () {\n    browserRedirect();\n  };\n  function browserRedirect() {\n    var sUserAgent = navigator.userAgent.toLowerCase();\n    var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";\n    var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";\n    var bIsMidp = sUserAgent.match(/midp/i) == "midp";\n    var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";\n    var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";\n    var bIsAndroid = sUserAgent.match(/android/i) == "android";\n    var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";\n    var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";\n    if (\n      bIsIpad ||\n      bIsIphoneOs ||\n      bIsMidp ||\n      bIsUc7 ||\n      bIsUc ||\n      bIsAndroid ||\n      bIsCE ||\n      bIsWM\n    ) {\n      //移动端页面\n      $("#mobile").show();\n      $("#pc").hide();\n    } else {\n      //pc 端页面\n      $("#mobile").hide();\n      $("#pc").show();\n    }\n  }\n</script>\n<div id="pc" style="display: none;">\n  <img\n    src="../upload/202108/1629972325344278.png"\n    title=""\n    data-width="1920"\n    data-height="1080"\n  />\n</div>\n<div id="mobile" style="text-align:center;display: none;">\n  <img\n    src="http://iluminage-cdn.oss-cn-shanghai.aliyuncs.com/upload/202108/1628149761.png"\n  />\n</div>\n

    本地压缩 HTML

    ',5),_={href:"https://github.com/kangax/html-minifier",target:"_blank",rel:"noopener noreferrer"},L=(0,t.IL)('
    # 全局安装 html-minifier\nnpm install html-minifier -g\n# 终端中执行压缩命令,默认压缩 input 下所有文件,压缩选项参照 http://kangax.github.io/html-minifier/\nhtml-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\n

    ',2),I={class:"footnotes"},S={class:"footnotes-list"},H={id:"footnote1",class:"footnote-item"},M={href:"https://www.cnblogs.com/zhnaglei/p/6697638.html",target:"_blank",rel:"noopener noreferrer"},K=(0,t.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),C={},A=(0,a(9720).c)(C,[["render",function(n,s){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[e,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",p,[(0,t.mY)("font-awesome"),(0,t.K2)(a)]),(0,t.mY)(":图标字体。")]),(0,t.QD)("li",null,[(0,t.QD)("a",o,[(0,t.mY)("Layui"),(0,t.K2)(a)]),(0,t.mY)(":开源模块化前端 UI 组件库。")]),(0,t.QD)("li",null,[(0,t.QD)("a",l,[(0,t.mY)("toastr.js"),(0,t.K2)(a)]),(0,t.mY)(":通知提示。")]),(0,t.QD)("li",null,[(0,t.QD)("a",c,[(0,t.mY)("popper.js"),(0,t.K2)(a)]),(0,t.mY)(":一个轻量级的库用于管理工具提示和弹窗效果。")]),(0,t.QD)("li",null,[(0,t.QD)("a",i,[(0,t.mY)("Day.js"),(0,t.K2)(a)]),(0,t.mY)(":时间输入转换,支持时间戳,格式化时间、过去时间展示、解决因时区变更。")]),(0,t.QD)("li",null,[(0,t.QD)("a",r,[(0,t.mY)("list.js"),(0,t.K2)(a)]),(0,t.mY)(":实时搜索页面,并直接显示结果页面。为列表、表格或其他任何 HTMLL 标签增加了搜索,排序,过滤器和灵活性等元素。网页中会自动会大段空格压缩为一个空格,不用特意替换。")]),(0,t.QD)("li",null,[(0,t.QD)("a",u,[(0,t.mY)("watermark.js"),(0,t.K2)(a)]),(0,t.mY)(":网页文字水印。")]),(0,t.QD)("li",null,[(0,t.QD)("a",d,[(0,t.mY)("codemirror"),(0,t.K2)(a)]),(0,t.mY)(":代码编辑器,为 textarea 加行号。"),k])]),m,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",v,[(0,t.mY)("clipboard.js"),(0,t.K2)(a)]),(0,t.mY)(":复制到剪贴板方式,无需 Flash。")]),(0,t.QD)("li",null,[(0,t.QD)("a",g,[(0,t.mY)("FileSaver.js"),(0,t.K2)(a)]),(0,t.mY)(":导出为本地文件,需手动指定路径。")]),(0,t.QD)("li",null,[(0,t.QD)("a",h,[(0,t.mY)("filepond"),(0,t.K2)(a)]),(0,t.mY)(":一个 JavaScript 文件上传库,可以上传拖入的任何内容,具有体积小、上传快、方便的文件管理等特点。")]),(0,t.QD)("li",null,[(0,t.QD)("a",b,[(0,t.mY)("timecat.js"),(0,t.K2)(a)]),(0,t.mY)(":一款 JS 的网页录屏工具。参考了游戏录像的原理而实现的渲染引擎,生成的录像文件只有传统视频的百分之一!还可以在录制语音的同时自动生成字幕,导出的视频文件可以跨端播放。")])]),f,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",q,[(0,t.mY)("emoji-minesweeper"),(0,t.K2)(a)]),(0,t.mY)(":Emoji 符号的扫雷游戏。代码很简短,游戏创意很酷。寥寥 300+ 行代码实现该游戏,简短易于初学者学习。")]),(0,t.QD)("li",null,[(0,t.QD)("a",x,[(0,t.mY)("HueJumper2k"),(0,t.K2)(a)]),(0,t.mY)(":JS 实现的 2KB 大小的 3D 赛车游戏。")]),(0,t.QD)("li",null,[(0,t.QD)("a",y,[(0,t.mY)("battle-city"),(0,t.K2)(a)]),(0,t.mY)(":基于 React 的经典坦克大战。")]),(0,t.QD)("li",null,[(0,t.QD)("a",D,[(0,t.mY)("react-tetris"),(0,t.K2)(a)]),(0,t.mY)(":逼真的俄罗斯方块。")])]),w,(0,t.QD)("p",null,[(0,t.mY)("CSS 样式:"),(0,t.QD)("a",Q,[(0,t.mY)("You-need-to-know-css"),(0,t.K2)(a)])]),Y,(0,t.QD)("p",null,[(0,t.mY)("自适应布局以 Bootstrap 为主,具体说明参考 "),(0,t.QD)("a",j,[(0,t.mY)("Bootstrap 文档"),(0,t.K2)(a)]),(0,t.mY)("。")]),T,(0,t.QD)("p",null,[(0,t.QD)("a",_,[(0,t.mY)("html-minifier"),(0,t.K2)(a)]),(0,t.mY)(" 能在本地批量压缩 HTML、CSS 和 JavaScript 源码。")]),L,(0,t.QD)("section",I,[(0,t.QD)("ol",S,[(0,t.QD)("li",H,[(0,t.QD)("p",null,[(0,t.QD)("a",M,[(0,t.mY)("开源 JavaScript 插件和库"),(0,t.K2)(a)]),(0,t.mY)(),K])])])])])}]]),U=JSON.parse('{"path":"/code/HTML.html","title":"HTML","lang":"zh-CN","frontmatter":{"article":false,"title":"HTML","icon":"html","order":1,"description":"HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。 基础知识 相对路径 反义、转义字符 一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。 JavaScript 插件 font-awesome:图标字体。 Layui...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/HTML.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"HTML"}],["meta",{"property":"og:description","content":"HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。 基础知识 相对路径 反义、转义字符 一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。 JavaScript 插件 font-awesome:图标字体。 Layui..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"HTML\\",\\"description\\":\\"HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。 基础知识 相对路径 反义、转义字符 一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。 JavaScript 插件 font-awesome:图标字体。 Layui...\\"}"]]},"headers":[{"level":2,"title":"基础知识","slug":"基础知识","link":"#基础知识","children":[{"level":3,"title":"相对路径","slug":"相对路径","link":"#相对路径","children":[]},{"level":3,"title":"反义、转义字符","slug":"反义、转义字符","link":"#反义、转义字符","children":[]}]},{"level":2,"title":"JavaScript 插件","slug":"javascript-插件","link":"#javascript-插件","children":[{"level":3,"title":"功能加强","slug":"功能加强","link":"#功能加强","children":[]},{"level":3,"title":"小游戏代码","slug":"小游戏代码","link":"#小游戏代码","children":[]}]},{"level":2,"title":"CSS 样式","slug":"css-样式","link":"#css-样式","children":[{"level":3,"title":"图片","slug":"图片","link":"#图片","children":[]},{"level":3,"title":"纯色背景","slug":"纯色背景","link":"#纯色背景","children":[]},{"level":3,"title":"鼠标经过变色","slug":"鼠标经过变色","link":"#鼠标经过变色","children":[]},{"level":3,"title":"隐藏元素","slug":"隐藏元素","link":"#隐藏元素","children":[]},{"level":3,"title":"高亮","slug":"高亮","link":"#高亮","children":[]}]},{"level":2,"title":"页面布局","slug":"页面布局","link":"#页面布局","children":[{"level":3,"title":"自适应布局","slug":"自适应布局","link":"#自适应布局","children":[]},{"level":3,"title":"客户端自适应","slug":"客户端自适应","link":"#客户端自适应","children":[]},{"level":3,"title":"本地压缩 HTML","slug":"本地压缩-html","link":"#本地压缩-html","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":4.57,"words":1372},"filePathRelative":"code/HTML.md","localizedDate":"2022年7月22日","excerpt":"

    HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。

    \\n

    基础知识

    \\n

    相对路径

    \\n
    / 根目录(electron 不适用)\\n./ 当前目录(可省略不写)\\n../ 父级目录(返回到上一级目录)\\n../../ 祖父级目录(返回两级目录)\\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7541],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},5490:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>J,data:()=>z});var t=a(7847);const e=(0,t.Fv)('

    HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。

    基础知识

    相对路径

    / 根目录(electron 不适用)\n./ 当前目录(可省略不写)\n../ 父级目录(返回到上一级目录)\n../../ 祖父级目录(返回两级目录)\n

    反义、转义字符

    一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。

    显示结果描述实体名称实体编号
    空格&nbsp;&#160;
    <小于号&lt;&#60;
    >大于号&gt;&#62;
    &和号&amp;&#38;
    "引号&quot;&#34;
    '撇号&apos;&#39;

    JavaScript 插件

    ',8),p={href:"https://fontawesome.com/",target:"_blank",rel:"noopener noreferrer"},o={href:"https://layuion.com/",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/CodeSeven/toastr",target:"_blank",rel:"noopener noreferrer"},c={href:"https://popper.js.org/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://dayjs.gitee.io/docs/zh-CN/get-set/get-set",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/javve/list.js",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/saucxs/watermark-dom",target:"_blank",rel:"noopener noreferrer"},k={href:"https://codemirror.net/",target:"_blank",rel:"noopener noreferrer"},d=(0,t.Lk)("sup",{class:"footnote-ref"},[(0,t.Lk)("a",{href:"#footnote1"},"[1]"),(0,t.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),m=(0,t.Lk)("h3",{id:"功能加强",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#功能加强"},[(0,t.Lk)("span",null,"功能加强")])],-1),v={href:"https://clipboardjs.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/eligrey/FileSaver.js",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/pqina/filepond",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/oct16/TimeCat",target:"_blank",rel:"noopener noreferrer"},f=(0,t.Lk)("h3",{id:"小游戏代码",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#小游戏代码"},[(0,t.Lk)("span",null,"小游戏代码")])],-1),q={href:"https://github.com/muan/emoji-minesweeper",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/KilledByAPixel/HueJumper2k",target:"_blank",rel:"noopener noreferrer"},y={href:"https://github.com/shinima/battle-city",target:"_blank",rel:"noopener noreferrer"},L={href:"https://github.com/chvin/react-tetris",target:"_blank",rel:"noopener noreferrer"},w=(0,t.Lk)("h2",{id:"css-样式",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#css-样式"},[(0,t.Lk)("span",null,"CSS 样式")])],-1),W={href:"https://lhammer.cn/You-need-to-know-css/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},j=(0,t.Fv)('

    图片

    图片增加属性,自动扩展宽高。

    <img src="<https://img.newzone.top/xxx.png>" style="width:50%; height:50%;" />\n<img src="<https://img.newzone.top/xxx.png>" width="100" height="100" />\n\n<!-- bootstrap 下自动控制图片大小 -->\n<img src="<https://img.newzone.top/xxx.png>" class="img-fluid" />\n

    图片链接为空时,去除图片所占区域,并防止出现空边框。

    <style type="text/css">\n  img[src=""],\n  img:not([src]) {\n    opacity: 0;\n    width: 0;\n    height: 0;\n  }\n</style>\n

    当图床图片无法显示时,尝试屏蔽自己网站的 referrer,在源码中添加:<meta name="referrer" content="no-referrer" />

    纯色背景

    body 铺满页面,添加纯色背景。

    <style>\n  body {\n    background-color: #222b3a;\n  }\n  html,\n  body {\n    height: 100%;\n  }\n</style>\n

    或使用 bootstrap 的样式class="bg-light"

    鼠标经过变色

    鼠标经过重链接,则该区域变色。

    .tg td a:hover {\n  background: #f29901;\n  display: block;\n}\n

    隐藏元素

    隐藏网页元素

    # 将元素的显示设为无,元素在网页中不占任何的位置。\nstyle="display:none;"\n# 将元素隐藏,但是元素在网页中的位置还是被占着。\nstyle="visibility:hidden;"\n\n# 显示隐藏元素\n$('#hidden_sort').show();\n# 继续隐藏#hidden_sort\n$('#hidden_sort').hide();\n\n<div id="hidden_alert" style="display:none;" class="col-12 alert alert-primary" role="alert">标题数过大</div>\n# 当无法使用,继续隐藏#hidden_sort\ndocument.getElementById('hidden_alert').style.display="none";\ndocument.getElementById('hidden_alert').style.display="block";\n\n# 显示 div span 的文本内容\nhidden_alert.textContent="标题数超过,请减少标题数或取消勾选「避重」";\n

    高亮

    对选择文章进行着色高亮。

    <a style="color: #FF0000;">xxx</a>\n

    页面布局

    自适应布局

    ',21),T={href:"https://getbootstrap.com/docs/5.1/utilities/spacing/",target:"_blank",rel:"noopener noreferrer"},_=(0,t.Fv)('
    # 分别为距离上下左右,\nclass="mt-5 mb-5 ms-4 me-4"\n\n# 修改间距\nstyle="margin-top:-15px;margin-bottom:-15px"\n\n# 图片自动拉伸宽度\nstyle="background-size:contain|cover;width:100%;height:auto;"\n\n# 视频将宽度设置大些,然后让其自动缩放\nwidth="2400px"\n

    客户端自适应

    判断设备是移动还是 PC,然后显示不同样式内容。

    <script>\n  window.onload = function () {\n    browserRedirect();\n  };\n  function browserRedirect() {\n    var sUserAgent = navigator.userAgent.toLowerCase();\n    var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";\n    var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";\n    var bIsMidp = sUserAgent.match(/midp/i) == "midp";\n    var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";\n    var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";\n    var bIsAndroid = sUserAgent.match(/android/i) == "android";\n    var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";\n    var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";\n    if (\n      bIsIpad ||\n      bIsIphoneOs ||\n      bIsMidp ||\n      bIsUc7 ||\n      bIsUc ||\n      bIsAndroid ||\n      bIsCE ||\n      bIsWM\n    ) {\n      //移动端页面\n      $("#mobile").show();\n      $("#pc").hide();\n    } else {\n      //pc 端页面\n      $("#mobile").hide();\n      $("#pc").show();\n    }\n  }\n</script>\n<div id="pc" style="display: none;">\n  <img\n    src="../upload/202108/1629972325344278.png"\n    title=""\n    data-width="1920"\n    data-height="1080"\n  />\n</div>\n<div id="mobile" style="text-align:center;display: none;">\n  <img\n    src="http://iluminage-cdn.oss-cn-shanghai.aliyuncs.com/upload/202108/1628149761.png"\n  />\n</div>\n

    本地压缩 HTML

    ',5),F={href:"https://github.com/kangax/html-minifier",target:"_blank",rel:"noopener noreferrer"},S=(0,t.Fv)('
    # 全局安装 html-minifier\nnpm install html-minifier -g\n# 终端中执行压缩命令,默认压缩 input 下所有文件,压缩选项参照 http://kangax.github.io/html-minifier/\nhtml-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\n

    ',2),H={class:"footnotes"},I={class:"footnotes-list"},M={id:"footnote1",class:"footnote-item"},C={href:"https://www.cnblogs.com/zhnaglei/p/6697638.html",target:"_blank",rel:"noopener noreferrer"},A=(0,t.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),U={},J=(0,a(3671).A)(U,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[e,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",p,[(0,t.eW)("font-awesome"),(0,t.bF)(a)]),(0,t.eW)(":图标字体。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",o,[(0,t.eW)("Layui"),(0,t.bF)(a)]),(0,t.eW)(":开源模块化前端 UI 组件库。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",l,[(0,t.eW)("toastr.js"),(0,t.bF)(a)]),(0,t.eW)(":通知提示。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",c,[(0,t.eW)("popper.js"),(0,t.bF)(a)]),(0,t.eW)(":一个轻量级的库用于管理工具提示和弹窗效果。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",i,[(0,t.eW)("Day.js"),(0,t.bF)(a)]),(0,t.eW)(":时间输入转换,支持时间戳,格式化时间、过去时间展示、解决因时区变更。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",r,[(0,t.eW)("list.js"),(0,t.bF)(a)]),(0,t.eW)(":实时搜索页面,并直接显示结果页面。为列表、表格或其他任何 HTMLL 标签增加了搜索,排序,过滤器和灵活性等元素。网页中会自动会大段空格压缩为一个空格,不用特意替换。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",u,[(0,t.eW)("watermark.js"),(0,t.bF)(a)]),(0,t.eW)(":网页文字水印。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",k,[(0,t.eW)("codemirror"),(0,t.bF)(a)]),(0,t.eW)(":代码编辑器,为 textarea 加行号。"),d])]),m,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",v,[(0,t.eW)("clipboard.js"),(0,t.bF)(a)]),(0,t.eW)(":复制到剪贴板方式,无需 Flash。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",g,[(0,t.eW)("FileSaver.js"),(0,t.bF)(a)]),(0,t.eW)(":导出为本地文件,需手动指定路径。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",h,[(0,t.eW)("filepond"),(0,t.bF)(a)]),(0,t.eW)(":一个 JavaScript 文件上传库,可以上传拖入的任何内容,具有体积小、上传快、方便的文件管理等特点。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",b,[(0,t.eW)("timecat.js"),(0,t.bF)(a)]),(0,t.eW)(":一款 JS 的网页录屏工具。参考了游戏录像的原理而实现的渲染引擎,生成的录像文件只有传统视频的百分之一!还可以在录制语音的同时自动生成字幕,导出的视频文件可以跨端播放。")])]),f,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",q,[(0,t.eW)("emoji-minesweeper"),(0,t.bF)(a)]),(0,t.eW)(":Emoji 符号的扫雷游戏。代码很简短,游戏创意很酷。寥寥 300+ 行代码实现该游戏,简短易于初学者学习。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",x,[(0,t.eW)("HueJumper2k"),(0,t.bF)(a)]),(0,t.eW)(":JS 实现的 2KB 大小的 3D 赛车游戏。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",y,[(0,t.eW)("battle-city"),(0,t.bF)(a)]),(0,t.eW)(":基于 React 的经典坦克大战。")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",L,[(0,t.eW)("react-tetris"),(0,t.bF)(a)]),(0,t.eW)(":逼真的俄罗斯方块。")])]),w,(0,t.Lk)("p",null,[(0,t.eW)("CSS 样式:"),(0,t.Lk)("a",W,[(0,t.eW)("You-need-to-know-css"),(0,t.bF)(a)])]),j,(0,t.Lk)("p",null,[(0,t.eW)("自适应布局以 Bootstrap 为主,具体说明参考 "),(0,t.Lk)("a",T,[(0,t.eW)("Bootstrap 文档"),(0,t.bF)(a)]),(0,t.eW)("。")]),_,(0,t.Lk)("p",null,[(0,t.Lk)("a",F,[(0,t.eW)("html-minifier"),(0,t.bF)(a)]),(0,t.eW)(" 能在本地批量压缩 HTML、CSS 和 JavaScript 源码。")]),S,(0,t.Lk)("section",H,[(0,t.Lk)("ol",I,[(0,t.Lk)("li",M,[(0,t.Lk)("p",null,[(0,t.Lk)("a",C,[(0,t.eW)("开源 JavaScript 插件和库"),(0,t.bF)(a)]),(0,t.eW)(),A])])])])])}]]),z=JSON.parse('{"path":"/code/HTML.html","title":"HTML","lang":"zh-CN","frontmatter":{"article":false,"title":"HTML","icon":"html","order":1,"description":"HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。 基础知识 相对路径 反义、转义字符 一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。 JavaScript 插件 font-awesome:图标字体。 Layui...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/HTML.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"HTML"}],["meta",{"property":"og:description","content":"HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。 基础知识 相对路径 反义、转义字符 一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。 JavaScript 插件 font-awesome:图标字体。 Layui..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"HTML\\",\\"description\\":\\"HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。 基础知识 相对路径 反义、转义字符 一些字符在 HTML 中拥有特殊的含义,如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。 JavaScript 插件 font-awesome:图标字体。 Layui...\\"}"]]},"headers":[{"level":2,"title":"基础知识","slug":"基础知识","link":"#基础知识","children":[{"level":3,"title":"相对路径","slug":"相对路径","link":"#相对路径","children":[]},{"level":3,"title":"反义、转义字符","slug":"反义、转义字符","link":"#反义、转义字符","children":[]}]},{"level":2,"title":"JavaScript 插件","slug":"javascript-插件","link":"#javascript-插件","children":[{"level":3,"title":"功能加强","slug":"功能加强","link":"#功能加强","children":[]},{"level":3,"title":"小游戏代码","slug":"小游戏代码","link":"#小游戏代码","children":[]}]},{"level":2,"title":"CSS 样式","slug":"css-样式","link":"#css-样式","children":[{"level":3,"title":"图片","slug":"图片","link":"#图片","children":[]},{"level":3,"title":"纯色背景","slug":"纯色背景","link":"#纯色背景","children":[]},{"level":3,"title":"鼠标经过变色","slug":"鼠标经过变色","link":"#鼠标经过变色","children":[]},{"level":3,"title":"隐藏元素","slug":"隐藏元素","link":"#隐藏元素","children":[]},{"level":3,"title":"高亮","slug":"高亮","link":"#高亮","children":[]}]},{"level":2,"title":"页面布局","slug":"页面布局","link":"#页面布局","children":[{"level":3,"title":"自适应布局","slug":"自适应布局","link":"#自适应布局","children":[]},{"level":3,"title":"客户端自适应","slug":"客户端自适应","link":"#客户端自适应","children":[]},{"level":3,"title":"本地压缩 HTML","slug":"本地压缩-html","link":"#本地压缩-html","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":4.57,"words":1372},"filePathRelative":"code/HTML.md","localizedDate":"2022年7月22日","excerpt":"

    HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。

    \\n

    基础知识

    \\n

    相对路径

    \\n
    / 根目录(electron 不适用)\\n./ 当前目录(可省略不写)\\n../ 父级目录(返回到上一级目录)\\n../../ 祖父级目录(返回两级目录)\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/HomeAutomation.html.c9cf4d80.js b/assets/js/HomeAutomation.html.c9cf4d80.js new file mode 100644 index 000000000..e1c7e4bc2 --- /dev/null +++ b/assets/js/HomeAutomation.html.c9cf4d80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1672],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,n]of t)o[e]=n;return o}},681:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>B,data:()=>K});var n=o(7847);const a=(0,n.Lk)("p",null,"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。",-1),s=(0,n.Lk)("h2",{id:"home-assistant",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#home-assistant"},[(0,n.Lk)("span",null,"Home Assistant")])],-1),r=(0,n.Lk)("p",null,"Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。",-1),l=(0,n.Lk)("p",null,"Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。",-1),i={href:"https://github.com/hacs/integration/releases/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.Lk)("li",null,"重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。",-1),h=(0,n.Lk)("li",null,[(0,n.eW)("选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。"),(0,n.Lk)("sup",{class:"footnote-ref"},[(0,n.Lk)("a",{href:"#footnote1"},"[1]"),(0,n.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})])],-1),m=(0,n.Lk)("p",null,"Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。",-1),k={href:"https://home.miot-spec.com/s/lumi.gateway.mgl03",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/AlexxIT/XiaomiGateway3",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Lk)("sup",{class:"footnote-ref"},[(0,n.Lk)("a",{href:"#footnote2"},"[2]"),(0,n.Lk)("a",{class:"footnote-anchor",id:"footnote-ref2"})],-1),u=(0,n.Lk)("h2",{id:"node-red",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#node-red"},[(0,n.Lk)("span",null,"Node-RED")])],-1),f={href:"https://github.com/node-red/node-red",target:"_blank",rel:"noopener noreferrer"},b={href:"https://bbs.iobroker.cn/t/topic/1165",target:"_blank",rel:"noopener noreferrer"},L=(0,n.Lk)("li",null,[(0,n.eW)("部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 "),(0,n.Lk)("code",null,"chmod 777 /volume1/docker/nodered/data"),(0,n.eW)("。")],-1),g={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#prerequisites",target:"_blank",rel:"noopener noreferrer"},A=(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,"选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。"),(0,n.Lk)("li",null,"搜索并安装「node-red-contrib-home-assistant-websocket」。")],-1),H=(0,n.Lk)("li",null,"选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。",-1),W=(0,n.Lk)("li",null,"选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。",-1),D={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#configuration",target:"_blank",rel:"noopener noreferrer"},_=(0,n.Lk)("sup",{class:"footnote-ref"},[(0,n.Lk)("a",{href:"#footnote3"},"[3]"),(0,n.Lk)("a",{class:"footnote-anchor",id:"footnote-ref3"})],-1),w=(0,n.Fv)('

    常用节点

    • inject: 定时启动,周期性触发执行。
    • call service:改变智能设备状态,比如开灯。
      • Domain:触发方式
      • Service:触发命令
      • Device:设备与服务
      • Entity:设备执行模块

    自动化场景

    • 记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。
    • 书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。

    智能硬件

    Zigbee2MQTT

    ',6),v={href:"https://www.youtube.com/watch?v=R_CikjR7tiw",target:"_blank",rel:"noopener noreferrer"},y=(0,n.Lk)("p",null,"不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。",-1),N=(0,n.Lk)("h3",{id:"智趣盒子",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#智趣盒子"},[(0,n.Lk)("span",null,"智趣盒子")])],-1),R={href:"https://item.taobao.com/item.htm?id=635639747170",target:"_blank",rel:"noopener noreferrer"},T=(0,n.Lk)("blockquote",null,[(0,n.Lk)("p",null,"盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等).")],-1),E=(0,n.Lk)("p",null,"不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。",-1),F=(0,n.Lk)("h3",{id:"其他硬件",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#其他硬件"},[(0,n.Lk)("span",null,"其他硬件")])],-1),x={href:"https://item.taobao.com/item.htm?id=631865647089",target:"_blank",rel:"noopener noreferrer"},z={href:"https://item.taobao.com/item.htm?id=675107124036",target:"_blank",rel:"noopener noreferrer"},C=(0,n.Lk)("hr",{class:"footnotes-sep"},null,-1),M={class:"footnotes"},q={class:"footnotes-list"},X={id:"footnote1",class:"footnote-item"},j={href:"https://baijiahao.baidu.com/s?id=1721932088542289661",target:"_blank",rel:"noopener noreferrer"},S=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Z={id:"footnote2",class:"footnote-item"},Q={href:"https://github.com/al-one/hass-xiaomi-miot/issues/100#issuecomment-909031222",target:"_blank",rel:"noopener noreferrer"},P=(0,n.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),I={id:"footnote3",class:"footnote-item"},G={href:"https://zhuanlan.zhihu.com/p/456741817",target:"_blank",rel:"noopener noreferrer"},O=(0,n.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),J={},B=(0,o(3671).A)(J,[["render",function(e,t){const o=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[a,s,r,l,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.eW)("下载 "),(0,n.Lk)("a",i,[(0,n.eW)("hacs"),(0,n.bF)(o)]),(0,n.eW)(",将其解压到 Home Assistant 配置的 config\\custom_components\\hacs 文件夹下。")]),c,h]),m,(0,n.Lk)("blockquote",null,[(0,n.Lk)("p",null,[(0,n.eW)("对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用"),(0,n.Lk)("a",k,[(0,n.eW)("多模网关"),(0,n.bF)(o)]),(0,n.eW)("配合 "),(0,n.Lk)("a",d,[(0,n.eW)("XiaomiGateway3"),(0,n.bF)(o)]),(0,n.eW)(" 集成。"),p])]),u,(0,n.Lk)("p",null,[(0,n.Lk)("a",f,[(0,n.eW)("Node-RED"),(0,n.bF)(o)]),(0,n.eW)(" 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 "),(0,n.Lk)("a",b,[(0,n.eW)("node-red 的入门教程集合"),(0,n.bF)(o)]),(0,n.eW)("。")]),(0,n.Lk)("ol",null,[L,(0,n.Lk)("li",null,[(0,n.eW)("Node-RED 上安装 "),(0,n.Lk)("a",g,[(0,n.eW)("node-red-contrib-home-assistant-websocket"),(0,n.bF)(o)]),(0,n.eW)("。 "),A]),H,W,(0,n.Lk)("li",null,[(0,n.eW)("进入 nodered 页面,配置 "),(0,n.Lk)("a",D,[(0,n.eW)("home assistant websocket"),(0,n.bF)(o)]),(0,n.eW)(",点击右上角的部署。"),_])]),w,(0,n.Lk)("p",null,[(0,n.Lk)("a",v,[(0,n.eW)("Zigbee2MQTT"),(0,n.bF)(o)]),(0,n.eW)(" 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。")]),y,N,(0,n.Lk)("p",null,[(0,n.Lk)("a",R,[(0,n.eW)("智趣盒子"),(0,n.bF)(o)]),(0,n.eW)("集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。")]),T,E,F,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("a",x,[(0,n.eW)("远程键盘控制器"),(0,n.bF)(o)]),(0,n.eW)(":基于易微联的第三方产品,手机通过 APP 远程控制电脑按键,不过只能按一个按键或者连续 6 个的自定义键值。不确定是否支持 HA。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",z,[(0,n.eW)("MQTT 转 usb 虚拟键盘鼠标注入器"),(0,n.bF)(o)]),(0,n.eW)(":通过 wifi 来控制,店家不清楚 HA。")])]),C,(0,n.Lk)("section",M,[(0,n.Lk)("ol",q,[(0,n.Lk)("li",X,[(0,n.Lk)("p",null,[(0,n.Lk)("a",j,[(0,n.eW)("从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建"),(0,n.bF)(o)]),(0,n.eW)(),S])]),(0,n.Lk)("li",Z,[(0,n.Lk)("p",null,[(0,n.Lk)("a",Q,[(0,n.eW)("为什么设备状态会有延迟?如何减小延迟?"),(0,n.bF)(o)]),(0,n.eW)(),P])]),(0,n.Lk)("li",I,[(0,n.Lk)("p",null,[(0,n.Lk)("a",G,[(0,n.eW)("树莓派 HomeAssistant 系列(四)NodeRed 安装配置"),(0,n.bF)(o)]),(0,n.eW)(),O])])])])])}]]),K=JSON.parse('{"path":"/family/HomeAutomation.html","title":"智能家居","lang":"zh-CN","frontmatter":{"article":false,"title":"智能家居","icon":"home","order":3.1,"description":"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 Home Assistant Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 Home Assistant 原生支持的米家设备较少,需要使用 hac...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/HomeAutomation.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"智能家居"}],["meta",{"property":"og:description","content":"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 Home Assistant Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 Home Assistant 原生支持的米家设备较少,需要使用 hac..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"智能家居\\",\\"description\\":\\"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 Home Assistant Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 Home Assistant 原生支持的米家设备较少,需要使用 hac...\\"}"]]},"headers":[{"level":2,"title":"Home Assistant","slug":"home-assistant","link":"#home-assistant","children":[]},{"level":2,"title":"Node-RED","slug":"node-red","link":"#node-red","children":[{"level":3,"title":"常用节点","slug":"常用节点","link":"#常用节点","children":[]}]},{"level":2,"title":"自动化场景","slug":"自动化场景","link":"#自动化场景","children":[]},{"level":2,"title":"智能硬件","slug":"智能硬件","link":"#智能硬件","children":[{"level":3,"title":"Zigbee2MQTT","slug":"zigbee2mqtt","link":"#zigbee2mqtt","children":[]},{"level":3,"title":"智趣盒子","slug":"智趣盒子","link":"#智趣盒子","children":[]},{"level":3,"title":"其他硬件","slug":"其他硬件","link":"#其他硬件","children":[]}]}],"git":{"createdTime":1660756330000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":4.18,"words":1255},"filePathRelative":"family/HomeAutomation.md","localizedDate":"2022年8月17日","excerpt":"

    智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。

    \\n

    Home Assistant

    \\n

    Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。

    \\n

    Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。

    \\n
      \\n
    1. 下载 hacs,将其解压到 Home Assistant 配置的 config\\\\custom_components\\\\hacs 文件夹下。
    2. \\n
    3. 重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。
    4. \\n
    5. 选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。[1]
    6. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a02ecba2.de416146.js b/assets/js/Huginn.html.41ddd369.js similarity index 81% rename from assets/js/v-a02ecba2.de416146.js rename to assets/js/Huginn.html.41ddd369.js index e23c1127b..19057e8bc 100644 --- a/assets/js/v-a02ecba2.de416146.js +++ b/assets/js/Huginn.html.41ddd369.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1176],{9720:(e,n)=>{n.c=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},4236:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>Ks,data:()=>Fs});var a=s(3968),t=s(4256);const o={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/huginn/huginn/blob/master/.env.example",target:"_blank",rel:"noopener noreferrer"},l={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},c=(0,a.QD)("h2",{id:"常用-agent",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#常用-agent"},[(0,a.QD)("span",null,"常用 Agent")])],-1),r={href:"https://github.com/huginn/huginn/wiki/Agent-Types-&-Descriptions",target:"_blank",rel:"noopener noreferrer"},p=(0,a.IL)("
    • 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),d=(0,a.QD)("code",null,"+",-1),u=(0,a.QD)("code",null,"\\\\",-1),m=(0,a.IL)('

    Huginn 部署

    Huginn 的任务有时会卡住,导致后续任务无法进行,重启容器也无法恢复正常。因此,我改为手动部署 Huginn,并定期使用重置命令以防止任务卡住。

    cd /home/huginn/huginn\nsudo bundle exec rake production:force_stop\nsudo bundle exec rake production:export\n

    服务器重启后,需分行执行以下命令:

    sudo docker exec -it huginn bash\nsudo service mysql restart\nsudo service mysql start\nsudo service nginx restart\ncd /home/huginn/huginn\ngit config --global --add safe.directory /home/huginn/huginn\nsudo runsvdir /etc/service &\nsudo bundle exec rake production:export\n

    Huginn 经常用到的位置包括 /home/huginn/huginnenv 环境设置)和 /var/lib/mysql(数据库)。为了使这些位置能够在外部存储上工作,需要将外部存储位置的权限设置为 everyone,否则会出现错误。

    需要注意的是,内部数据库默认情况下不会被外部识别。为了使其能够与外部进行连接,需要进行以下操作:

    1. 使用 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 命令找到 bind-address 行,并注释掉(在行的前面添加 #):#bind-address = 127.0.0.1。同时,将 max_allowed_packet 设置为 200M

    2. 根据连接反馈获取连接 IP 并授权,同时开放 process 权限,方便后期数据库备份。数据库备用可使用 backup_script.sh 脚本,定期将 sql 文件导出到外部存储。

      mysql -u root -p\nGRANT ALL PRIVILEGES ON *.* TO 'huginn'@'172.17.0.1' IDENTIFIED BY 'YourPassword';\nGRANT PROCESS ON *.* TO 'huginn'@'localhost';\nFLUSH PRIVILEGES;\n\\q\nsudo service mysql restart\n

    2 个疑问:

    • 测试当任务卡住时,rake production:export 是否有效。(优化后,一直没出现卡住问题?)
    • 部署时 production:export 步骤会提示 unable to lock supervise/lock: temporary failure,但此报错似乎不影响 Huginn 的运行,等有时间看看是否有相关报错。

    Ubuntu 手动部署

    ',11),g={href:"https://github.com/huginn/huginn/blob/master/doc/manual/installation.md",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/huginn/huginn/wiki/Novice-setup-guide",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/huginn/huginn/blob/master/doc/manual/update.md",target:"_blank",rel:"noopener noreferrer"},b=(0,a.IL)('

    Huginn 部署步骤:

    # 进入 huginn 容器命令行,某些容器命令为 /bin/bash\nsudo docker exec -it huginn bash\n# run as root!\napt-get update -y\napt-get upgrade -y\napt-get install sudo -y\n\n# Install vim and set as default editor\nsudo apt-get install -y vim\nsudo update-alternatives --set editor /usr/bin/vim.basic\n\n# Install the required packages\nsudo 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\n\n# Ubuntu 18.04 Bionic\nsudo apt-get install -y runit-systemd\n\n# Download Ruby and compile it:\nmkdir /tmp/ruby && cd /tmp/ruby\ncurl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.7.tar.bz2 | tar xj\ncd ruby-2.7.7\n./configure --disable-install-rdoc\nmake -j`nproc`\nsudo make install\n\n# curl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.xz | tar xJ\n# cd ruby-3.2.2\n\nsudo gem update --system --no-document\nsudo gem install foreman --no-document\n\n# Create a user for Huginn:\nsudo adduser --disabled-login --gecos 'Huginn' huginn\n\n# Install the database packages\nsudo apt-get install -y mysql-server mysql-client libmysqlclient-dev\n

    输入 service mysql start 启动数据库,否则下一步数据库设置容易报错 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'[1]

    # 逐步设置数据库 root 密码\nsudo mysql_secure_installation\n\n# 用上方设置的密码登陆数据库\nmysql -u root -p\n\n# ⚠️逐行输入代码到数据库命令行 `mysql>`,需将 `$password` 替换为你要设置的密码\nCREATE USER 'huginn'@'localhost' IDENTIFIED BY '$password';\nSET default_storage_engine=INNODB;\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `huginn_production`.* TO 'huginn'@'localhost';\nFLUSH PRIVILEGES;\n\\q\n

    数据库设置好后,拉取 huginn 主体程序,此段命令可以整段复制到 ssh。

    # We'll install Huginn into the home directory of the user "huginn"\ncd /home/huginn\n\n# Clone Huginn repository,不能直接使用 master,避免 ruby 3.2 问题\n# sudo -u huginn -H git clone https://github.com/huginn/huginn.git -b master huginn\nsudo -u huginn -H git clone https://github.com/huginn/huginn.git -b latest_rubygems huginn\n\n# Go to Huginn installation folder\ncd /home/huginn/huginn\n\n# Copy the example Huginn config\nsudo -u huginn -H cp .env.example .env\n\n# Create the log/, tmp/pids/ and tmp/sockets/ directories\nsudo -u huginn mkdir -p log tmp/pids tmp/sockets\n\n# Make sure Huginn can write to the log/ and tmp/ directories\nsudo chown -R huginn log/ tmp/\nsudo chmod -R u+rwX,go-w log/ tmp/\n\n# Make sure permissions are set correctly\nsudo chmod -R u+rwX,go-w log/\nsudo chmod -R u+rwX tmp/\nsudo -u huginn -H chmod o-rwx .env\n\n# Copy the example Unicorn config\nsudo -u huginn -H cp config/unicorn.rb.example config/unicorn.rb\n\n
    ',6),k=(0,a.QD)("code",null,"sudo -u huginn -H editor .env",-1),f={href:"https://github.com/huginn/huginn/blob/master/.env.example",target:"_blank",rel:"noopener noreferrer"},y=(0,a.QD)("code",null,"i",-1),q=(0,a.QD)("code",null,"esc",-1),D=(0,a.QD)("code",null,":wq",-1),_=(0,a.IL)('
    DATABASE_ADAPTER=mysql2\n#DATABASE_ENCODING=utf8   # 修改点\nDATABASE_RECONNECT=true\nDATABASE_NAME=huginn_production  # 修改点\nDATABASE_POOL=20\nDATABASE_USERNAME=huginn   # 修改点\nDATABASE_PASSWORD='$password' # 修改点,换为你自己的密码\n#DATABASE_HOST=your-domain-here.com\n#DATABASE_PORT=3306\n#DATABASE_SOCKET=/tmp/mysql.sock\n\n# MySQL only: If you are running a MySQL server >=5.5.3, you should\n# set DATABASE_ENCODING to utf8mb4 instead of utf8 so that the\n# database can hold 4-byte UTF-8 characters like emoji.\nDATABASE_ENCODING=utf8mb4  #修改点\n\n...\nRAILS_ENV=production  # 修改点\n\nUSE_GRAPHVIZ_DOT=dot # 取消注释,启用 GRAPHVIZ 来生成 diagram\n\nTIMEZONE="Beijing" # bundle exec rake time:zones:local,时区需按指定格式填写,否则会报错 runsv not running\n\nDEFAULT_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" # 浏览器访问\n\n# 邮件发送设置\nSMTP_DOMAIN=newzone.top\nSMTP_USER_NAME=benson@newzone.top\nSMTP_PASSWORD=somepassword\nSMTP_SERVER=smtp.feishu.cn\nSMTP_PORT=465\nSMTP_AUTHENTICATION=plain\nSMTP_ENABLE_STARTTLS_AUTO=true\nSMTP_SSL=true\nSEND_EMAIL_IN_DEVELOPMENT=true\n

    Install Gems 前用子账户重新设置运行目录权限 sudo chown -R huginn:huginn /home/huginn,防止报错 Your user account isn't allowed to install to the system RubyGems

    # 注意看黄字警告\ngem install bundler\n# Docker 环境中,时区容易丢失(6-70)\napt-get install tzdata\n# Install Gems\nsudo -u huginn -H bundle config set deployment 'true'\nsudo -u huginn -H bundle config set without 'development test'\nsudo -u huginn -H bundle install\n# 备用 Gems 修复命令\n# bundle update\n# gem update bundler\n# vim /home/huginn/huginn/Gemfile\n\n# Initialize Database\n# Create the database\nsudo -u huginn -H bundle exec rake db:create RAILS_ENV=production\n\n# Migrate to the latest version\nsudo -u huginn -H bundle exec rake db:migrate RAILS_ENV=production\n\n# ⚠️设置登陆账户密码,Create admin user and example agents using the default admin/password login\nsudo -u huginn -H bundle exec rake db:seed RAILS_ENV=production SEED_USERNAME=admin SEED_PASSWORD=password\n\n# Compile Assets\nsudo -u huginn -H bundle exec rake assets:precompile RAILS_ENV=production\n

    sudo -u huginn -H editor Procfile 修改 huginn 设置。如果需多现成运行,可移除 Multiple DelayedJob workers 部分的注释。

    # 在下两行前,添加符号「#」\n#web: bundle exec rails server -p ${PORT-3000} -b ${IP-0.0.0.0}\n#jobs: bundle exec rails runner bin/threaded.rb\n\n# 删除以下下两行前的符号「#」\nweb: bundle exec unicorn -c config/unicorn.rb\njobs: bundle exec rails runner bin/threaded.rb\n

    '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/servicechown -R huginn:huginn /etc/service/huginn*[2] [3] 如果是重启 Huginn 时出现此报错,则检查 sudo -u huginn -H editor .env 设置。

    # 切换到\ncd /home/huginn/huginn\n# 设置\ngit config --global --add safe.directory /home/huginn/huginn\n# 设置开机启动\nsudo runsvdir /etc/service &\nsudo bundle exec rake production:export\n\n# Setup Logrotate\nsudo cp deployment/logrotate/huginn /etc/logrotate.d/huginn\n\n# Ensure Your Huginn Instance Is Running\nsudo bundle exec rake production:status\n

    Nginx 站点设置:

    sudo apt-get install -y nginx\n\n# Site Configuration\nsudo cp deployment/nginx/huginn /etc/nginx/sites-available/huginn\nsudo ln -s /etc/nginx/sites-available/huginn /etc/nginx/sites-enabled/huginn\n\n# Change YOUR_SERVER_FQDN to the fully-qualified domain name of your host serving Huginn.\nsudo editor /etc/nginx/sites-available/huginn\n\n# 不需要 https,则改为下方配置\nserver {\n  listen 80; # 监听的端⼝\n  server_name localhost home.newzone.top; # 域名或ip,这里启用了两个地址,用空格分开\n\n# 测试设置是否正确\nsudo nginx -t\n\n# 移除默认网站设置,只有当服务器/容器只存在 Huginn 网站方执行下行命令\nsudo rm /etc/nginx/sites-enabled/default\n

    以上完成了 Huginn 的所有部署,执行 sudo service nginx restart 即可访问网站。

    Huginn Docker

    ',11),w={href:"https://github.com/huginn/huginn/tree/master/docker/multi-process",target:"_blank",rel:"noopener noreferrer"},A=(0,a.IL)('

    此外,官方镜像路径与手动版不同,不支持 force_stop 命令。官方建议 Docker 中使用下方命令删除数据库中卡住的任务。这个命令实测是有效的,但我有次碰到了未知 bug,卡住的任务被删除,后续任务却没继续。

    # get a shell inside the docker container (replace huginn with the name or id of the container)\nsudo docker exec -it huginn /bin/bash\n\n# source the environment file\nsource .env\n\n# get a rails console\nbundle exec rails console\n\n# inside the rails console delete  the job\nDelayed::Job.where('locked_at IS NOT NULL AND locked_by IS NOT NULL AND failed_at IS NULL').destroy_all\n

    Agents

    Trigger Agent

    Trigger Agent 挑选符合条件的事件。

    # content 字段中不包含 周雅萌 或 邓雅萌\n{\n  "expected_receive_period_in_days": "2",\n  "keep_event": "true",\n  "rules": [\n    {\n      "type": "!regex",\n      "value": "周雅萌 | 邓雅萌",\n      "path": "$.content"\n    }\n  ],\n  "message": "Looks like your pattern matched in '{{value}}'!"\n}\n\n# title 中包含品牌词 iluminage 或 易美肌\n{\n  "expected_receive_period_in_days": "4",\n  "keep_event": "true",\n  "rules": [\n    {\n      "type": "regex",\n      "value": "iluminage|易美肌",\n      "path": "$.title"\n    }\n  ],\n  "message": "Looks like your pattern matched in '{{value}}'!"\n}\n

    Liquid Output Agent

    用自定义模板将数据整理,输出为 HTML,json 和 xml 格式链接。

    模式一般选 Last X events,将接收到的所有数据对外输出,默认为 1000。

    Last X events 模式下,可以设置 Event limit 以控制输出数据的数量和时间段。Event limit 可以设为 100,即输出数据为 100;也可以设为「1 day」或「5 minutes」,即仅输出最近一天的内容。

    Event Formatting Agent

    ',11),Q={href:"http://huginnio.herokuapp.com/scenarios/14/download",target:"_blank",rel:"noopener noreferrer"},x=(0,a.IL)('
    # strftime() 方法中常用的占位符\n# %Y 表示年份,%m 表示月份,%d 表示日期,%H 表示小时(24小时制),%M 表示分钟,%S 表示秒,%B 代表英文的月份,`%I` 代表小时(12小时制),`%p` 代表 AM/PM。`%e` 代表日期,不会在首位添加零。\n"created_at": "{{created_at | date:'%Y-%m-%d'}}"\n\n# 将 2023-03-02 23:33:30 +0800 替换为 2023-03-02\n"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', ''}}"\n

    正则重构

    比如生成时间规则为 "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', ''}}"

    加前后缀

    抓取链接不完整时,需要完善链接,比如 "url_link": "https://so.toutiao.com{{temp_link}}"

    For example, here is a possible Event:

    {\n  "high": { "celsius": "18", "fahreinheit": "64" },\n  "date":\n    { "epoch": "1357959600", "pretty": "10:00 PM EST on January 11, 2013" },\n  "conditions": "Rain showers",\n  "data": "This is some data",\n}\n

    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": {\n  "message": "Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius.",\n  "subject": "{{data}}",\n  "created_at": "{{created_at}}"\n}\n

    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.

    ',12),Y={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},S=(0,a.IL)('

    Events generated by this possible Event Formatting Agent will look like:

    {\n  "message": "Today's conditions look like Rain showers with a high temperature of 18 degrees Celsius.",\n  "subject": "This is some data"\n}\n

    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:

    {\n  "matchers": [\n    {\n      "path": "{{date.pretty}}",\n      "regexp": "A(?<time>dd:dd [AP]M [A-Z]+)",\n      "to": "pretty_date"\n    }\n  ]\n}\n

    This virtually merges the following hash into the original event hash:

    "pretty_date": {\n  "time": "10:00 PM EST",\n  "0": "10:00 PM EST on January 11, 2013"\n  "1": "10:00 PM EST"\n}\n\n

    So you can use it in instructions like this:

    "instructions": {\n  "message": "Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius according to the forecast at {{pretty_date.time}}.",\n  "subject": "{{data}}"\n}\n\n

    If you want to retain original contents of events and only add new keys, then set mode to merge, otherwise set it to clean.

    To CGI escape output (for example when creating a link), use the Liquid uri_escape filter, like so:

    {\n  "message": "A peak was on Twitter in {{group_by}}.  Search: https://twitter.com/search?q={{group_by | uri_escape}}"\n}\n

    Adioso Agent - 机票价格追踪

    Creates events

    ',14),E=(0,a.QD)("code",null,"start_date",-1),T=(0,a.QD)("code",null,"end_date",-1),R={href:"http://adioso.com/",target:"_blank",rel:"noopener noreferrer"},L=(0,a.QD)("code",null,"username",-1),I=(0,a.QD)("code",null,"password",-1),C=(0,a.QD)("hr",null,null,-1),H=(0,a.QD)("h3",{id:"aftership-agent-物流追踪-api-付费",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#aftership-agent-物流追踪-api-付费"},[(0,a.QD)("span",null,"Aftership Agent - 物流追踪-API 付费")])],-1),P=(0,a.QD)("p",null,[(0,a.QD)("code",null,"Creates events")],-1),j=(0,a.QD)("p",null,[(0,a.mY)("Aftership agent 帮助你追踪你的快递,并实时更新包裹动态。为了能够使用 Aftership API,您需要生成一个 "),(0,a.QD)("code",null,"API Key"),(0,a.mY)("。这需要付费才能使用其跟踪功能。")],-1),N=(0,a.QD)("code",null,"path",-1),O=(0,a.QD)("code",null,"trackings",-1),K={href:"https://www.aftership.com/docs/api/4/trackings",target:"_blank",rel:"noopener noreferrer"},F=(0,a.QD)("code",null,"trackings/SLUG/TRACKING_NUMBER",-1),M=(0,a.QD)("code",null,"SLUG",-1),U=(0,a.QD)("code",null,"TRACKING_NUMBER",-1),B=(0,a.QD)("code",null,"last_checkpoint/SLUG/TRACKING_NUMBER",-1),G=(0,a.QD)("p",null,[(0,a.mY)("You can get a list of courier information here "),(0,a.QD)("code",null,"https://www.aftership.com/courier")],-1),W=(0,a.QD)("p",null,"Required Options:",-1),z=(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("code",null,"api_key"),(0,a.mY)(" - YOUR_API_KEY.")]),(0,a.QD)("li",null,[(0,a.QD)("code",null,"path request and its full path")])],-1),V=(0,a.QD)("hr",null,null,-1),J=(0,a.QD)("h3",{id:"algorithmia-agent-ai-算法",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#algorithmia-agent-ai-算法"},[(0,a.QD)("span",null,"Algorithmia Agent - AI 算法")])],-1),X=(0,a.QD)("code",null,"Creates events",-1),$=(0,a.QD)("code",null,"Receives events",-1),Z=(0,a.QD)("code",null,"Dry runs",-1),ee={href:"http://huginnio.herokuapp.com/agent_gems#huginn_algorithmia_agent",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://algorithmia.com",target:"_blank",rel:"noopener noreferrer"},se=(0,a.IL)('

    The created event will have the output from Algorithmia in the result key. To merge incoming Events with the result, use merge for the mode key.


    Attribute Difference Agent - 属性差异(待深入理解)

    Creates events Receives events

    The Attribute Difference Agent receives events and emits a new event with the difference or change of a specific attribute in comparison to the previous event received. Attribute Difference Agent 用于传递两个不同值的差异和改变。

    path specifies the JSON path of the attribute to be used from the event.

    output specifies the new attribute name that will be created on the original payload and it will contain the difference or change.

    method specifies if it should be…

    • percentage_change eg. Previous value was 160, new value is 116. Percentage change is -27.5
    • decimal_difference eg. Previous value was 5.5, new value is 15.2. Difference is 9.7
    • integer_difference eg. Previous value was 50, new value is 40. Difference is -10

    decimal_precision defaults to 3, but you can override this if you want.

    expected_update_period_in_days is used to determine if the Agent is working.

    The resulting event will be a copy of the received event with the difference or change added as an extra attribute. If you use the percentage_change the attribute will be formatted as such {{attribute}}_change, otherwise it will be {{attribute}}_diff.

    All configuration options will be liquid interpolated based on the incoming event.


    Basecamp Agent - Service 停用

    Creates events 37signals

    The Basecamp Agent checks a Basecamp project for new Events

    ',17),ae={href:"http://huginnio.herokuapp.com/services",target:"_blank",rel:"noopener noreferrer"},te=(0,a.QD)("hr",null,null,-1),oe=(0,a.QD)("h3",{id:"bigquery-agent-大型数据库分析",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#bigquery-agent-大型数据库分析"},[(0,a.QD)("span",null,"Bigquery Agent - 大型数据库分析")])],-1),ie=(0,a.QD)("code",null,"Creates events",-1),le=(0,a.QD)("code",null,"Receives events",-1),ce=(0,a.QD)("code",null,"Dry runs",-1),re={href:"http://huginnio.herokuapp.com/agent_gems#huginn_bigquery_agent",target:"_blank",rel:"noopener noreferrer"},pe=(0,a.QD)("p",null,"Bigquery Agent 会调用 Google BigQuery 和 Goolge Cloud 账户,可能需要付费。同时,Bigquery Agent 依靠服务帐户进行身份验证,而不是 oauth。",-1),de=(0,a.QD)("p",null,"Setup:",-1),ue={href:"https://code.google.com/apis/console/b/0/",target:"_blank",rel:"noopener noreferrer"},me=(0,a.QD)("li",null,"Use your existing project (or create a new one)",-1),ge=(0,a.QD)("li",null,"APIs & Auth -> Enable BigQuery",-1),he=(0,a.QD)("li",null,"Credentials -> Create new Client ID -> Service Account",-1),ve=(0,a.QD)("li",null,[(0,a.mY)("Download the JSON keyfile and either save it to a path, ie: "),(0,a.QD)("code",null,"/home/huginn/Huginn-5d12345678cd.json"),(0,a.mY)(", or copy the value of "),(0,a.QD)("code",null,"private_key"),(0,a.mY)(" from the file.")],-1),be=(0,a.QD)("li",null,"Grant that service account access to the BigQuery datasets and tables you want to query.",-1),ke=(0,a.IL)('

    The JSON keyfile you downloaded earlier should look like this:

    {\n  "type": "service_account",\n  "project_id": "huginn-123123",\n  "private_key_id": "6d6b476fc6ccdb31e0f171991e5528bb396ffbe4",\n  "private_key": "-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n",\n  "client_email": "huginn@huginn-123123.iam.gserviceaccount.com",\n  "client_id": "123123...123123",\n  "auth_uri": "https://accounts.google.com/o/oauth2/auth",\n  "token_uri": "https://accounts.google.com/o/oauth2/token",\n  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",\n  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/huginn%40huginn-123123.iam.gserviceaccount.com"\n}\n

    Agent Configuration:

    project_id - The id of the Google Cloud project.

    ',4),fe=(0,a.QD)("code",null,"query",-1),ye={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},qe=(0,a.QD)("p",null,[(0,a.QD)("code",null,"use_legacy"),(0,a.mY)(" - Whether or not to use BigQuery legacy SQL or standard SQL. (Defaults to "),(0,a.QD)("code",null,"false"),(0,a.mY)(")")],-1),De=(0,a.QD)("code",null,"max",-1),_e={href:"https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/google-cloud-bigquery/v0.27.0/google/cloud/bigquery/project",target:"_blank",rel:"noopener noreferrer"},we=(0,a.IL)("

    timeout - How long to wait for query to complete (in ms). Defaults to 10000.

    event_per_row - Whether to create one Event per row returned, or one event with all rows as results. Defaults to false.

    Authorization

    keyfile - (String) The path (relative to where Huginn is running) to the JSON keyfile downloaded in step 5 above.

    Alternately, keyfile can be a hash:

    ",5),Ae=(0,a.QD)("code",null,"keyfile",-1),Qe=(0,a.QD)("code",null,"private_key",-1),xe=(0,a.QD)("code",null,"private_key",-1),Ye={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Se=(0,a.QD)("code",null,"{% credential google-bigquery-key %}",-1),Ee=(0,a.IL)('

    keyfile client_email - The value of client_email from the downloaded file. Same as the service account email.


    Boxcar Agent - iPhone 通知栏 app

    Receives events

    Boxcar agent 会在 iPhone 推送通知,但其不兼容于 iOS 10 系统,已经停止更新。

    To be able to use the Boxcar end-user API, you need your Access Token. The access token is available on general “Settings” screen of Boxcar iOS app or from Boxcar Web Inbox settings page.

    Please provide your access token in the user_credentials option. If you'd like to use a credential, set the user_credentials option to {% credential CREDENTIAL_NAME %}.

    Options:

    • user_credentials - Boxcar access token.
    • title - Title of the message.
    • body - Body of the message.
    • source_name - Name of the source of the message. Set to Huginn by default.
    • icon_url - URL to the icon.
    • sound - Sound to be played for the notification. Set to ‘bird-1’ by default.

    Change Detector Agent - 监测数据变化

    Creates events Receives events

    The Change Detector Agent receives a stream of events and emits a new event when a property of the received event changes. Change Detector Agent 会接收数据流内容,并在监测到数据属性改变后,传递出新事件。

    ',13),Te=(0,a.QD)("code",null,"property",-1),Re={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Le=(0,a.QD)("code",null,"last_property",-1),Ie=(0,a.QD)("code",null,"{% assign drop = last_property | minus: price %}{% if last_property == blank or drop > 0 %}{{ price | default: last_property }}{% else %}{{ last_property }}{% endif %}",-1),Ce=(0,a.IL)('

    expected_update_period_in_days is used to determine if the Agent is working.

    The resulting event will be a copy of the received event.


    Commander Agent - 触发命令

    Receives events Controls agents

    Commander Agent 由时间表或传入事件触发,并触发其他 agents 运行,禁用,配置或启用自己。

    Action types

    Set action to one of the action types below:

    • run: Target Agents are run when this agent is triggered.

    • disable: Target Agents are disabled (if not) when this agent is triggered.

    • enable: Target Agents are enabled (if not) when this agent is triggered.

    • configure: Target Agents have their options updated with the contents of configure_options.

    ',9),He={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Pe=(0,a.IL)('
    • To create a CommanderAgent that receives an event from a WeatherAgent every morning to kick an agent flow that is only useful in a nice weather, try this: {% if conditions contains 'Sunny' or conditions contains 'Cloudy' %} run{% endif %}

    • Likewise, if you have a scheduled agent flow specially crafted for rainy days, try this: {% if conditions contains 'Rain' %}enable{% else %}disabled{% endif %}

    • If you want to update a WeatherAgent based on a UserLocationAgent, you could use 'action': 'configure' and set 'configure*options' to { 'location': '{{\\_location*.latlng}}' }.

    • In templating, you can use the variable target to refer to each target agent, which has the following attributes: name, options, sources, type, url, id, disabled, memory, controllers, schedule, keep_events_for, propagate_immediately, working, receivers, and control_targets.

    Targets

    Select Agents that you want to control from this CommanderAgent.


    Csv Agent - CSV 表格数据处理

    Creates events Receives events Consumes file pointer

    CsvAgent 可以解析或重构 CSV 表格数据。解析时,可以针对整个 CSV,也可以单独处理一行数据。

    Set mode to parse to parse CSV from incoming event, when set to serialize the agent serilizes the data of events to CSV.

    Universal options

    Specify the separator which is used to seperate the fields from each other (default is ,).

    data_key sets the key which contains the serialized CSV or parsed CSV data in emitted events.

    Parsing

    If use_fields is set to a comma seperated string and the CSV file contains field headers the agent will only extract the specified fields.

    output determines wheather one event per row is emitted or one event that includes all the rows.

    Set with_header to true if first line of the CSV file are field names.

    ',15),je=(0,a.QD)("code",null,"FtpsiteAgent",-1),Ne=(0,a.QD)("code",null,"LocalFileAgent",-1),Oe=(0,a.QD)("code",null,"S3Agent",-1),Ke={href:"https://github.com/huginn/huginn/wiki/How-Huginn-works-with-files",target:"_blank",rel:"noopener noreferrer"},Fe={href:"http://goessner.net/articles/JsonPath/",target:"_blank",rel:"noopener noreferrer"},Me=(0,a.QD)("code",null,"data_path",-1),Ue=(0,a.QD)("code",null,"data_path",-1),Be=(0,a.QD)("p",null,[(0,a.QD)("strong",null,"Serializing")],-1),Ge=(0,a.QD)("p",null,[(0,a.mY)("If "),(0,a.QD)("code",null,"use_fields"),(0,a.mY)(" is set to a comma seperated string and the first received event has a object at the specified "),(0,a.QD)("code",null,"data_path"),(0,a.mY)(" the generated CSV will only include the given fields.")],-1),We=(0,a.QD)("p",null,[(0,a.mY)("Set "),(0,a.QD)("code",null,"with_header"),(0,a.mY)(" to "),(0,a.QD)("code",null,"true"),(0,a.mY)(" to include a field header in the CSV.")],-1),ze={href:"http://goessner.net/articles/JsonPath/",target:"_blank",rel:"noopener noreferrer"},Ve=(0,a.QD)("code",null,"data_path",-1),Je=(0,a.IL)('

    Data Output Agent - 网页输出数据(RSS)

    Receives events

    Data Output Agent 将传入的数据输入为 RSS 或 JSON,具体格式为“.xml”或“.json”。

    This Agent will output data at:

    https:///users/1/web_requests/:id/:secret.xml

    where :secret is one of the allowed secrets specified in your options and the extension can be xml or json.

    You can setup multiple secrets so that you can individually authorize external systems to access your Huginn data.

    Options:

    ',9),Xe=(0,a.QD)("li",null,[(0,a.QD)("code",null,"secrets"),(0,a.mY)(" - An array of tokens that the requestor must provide for light-weight authentication.")],-1),$e=(0,a.QD)("li",null,[(0,a.QD)("code",null,"expected_receive_period_in_days"),(0,a.mY)(" - How often you expect data to be received by this Agent from other Agents.")],-1),Ze=(0,a.QD)("code",null,"template",-1),en={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},nn=(0,a.QD)("code",null,"link",-1),sn=(0,a.QD)("code",null,"title",-1),an=(0,a.QD)("code",null,"description",-1),tn=(0,a.QD)("code",null,"icon",-1),on=(0,a.QD)("code",null,"",-1),ln=(0,a.QD)("code",null,"self",-1),cn=(0,a.QD)("code",null,"item",-1),rn=(0,a.QD)("code",null,"pubDate",-1),pn=(0,a.QD)("li",null,[(0,a.QD)("code",null,"events_to_show"),(0,a.mY)(" - The number of events to output in RSS or JSON. (default: "),(0,a.QD)("code",null,"40"),(0,a.mY)(")")],-1),dn=(0,a.QD)("li",null,[(0,a.QD)("code",null,"ttl"),(0,a.mY)(" - A value for the "),(0,a.QD)("code",null,""),(0,a.mY)(" element in RSS output. (default: "),(0,a.QD)("code",null,"60"),(0,a.mY)(")")],-1),un=(0,a.QD)("code",null,"ns_media",-1),mn={href:"https://en.wikipedia.org/wiki/Media_RSS",target:"_blank",rel:"noopener noreferrer"},gn=(0,a.QD)("code",null,"ns_itunes",-1),hn={href:"http://lists.apple.com/archives/syndication-dev/2005/Nov/msg00002.html",target:"_blank",rel:"noopener noreferrer"},vn=(0,a.QD)("li",null,[(0,a.QD)("code",null,"rss_content_type"),(0,a.mY)(" - Content-Type for RSS output (default: "),(0,a.QD)("code",null,"application/rss+xml"),(0,a.mY)(")")],-1),bn=(0,a.QD)("li",null,[(0,a.QD)("code",null,"response_headers"),(0,a.mY)(" - An object with any custom response headers. (example: "),(0,a.QD)("code",null,'{"Access-Control-Allow-Origin": "*"}'),(0,a.mY)(")")],-1),kn=(0,a.QD)("code",null,"push_hubs",-1),fn={href:"https://pubsubhubbub.superfeedr.com/",target:"_blank",rel:"noopener noreferrer"},yn={href:"https://pubsubhubbub.appspot.com/",target:"_blank",rel:"noopener noreferrer"},qn=(0,a.QD)("code",null,"template.self",-1),Dn=(0,a.IL)('

    If you'd like to output RSS tags with attributes, such as enclosure, use something like the following in your template:

    "enclosure": {\n  "_attributes": {\n    "url": "{{media_url}}",\n    "length": "1234456789",\n    "type": "audio/mpeg"\n  }\n},\n"another_tag": {\n  "_attributes": {\n    "key": "value",\n    "another_key": "another_value"\n  },\n  "_contents": "tag contents (can be an object for nesting)"\n}\n\n

    Ordering events

    To specify the order of events, set events_order to an array of sort keys, each of which looks like either expression or [expression, type, descending], as described as follows:

    • expression is a Liquid template to generate a string to be used as sort key.

    • type (optional) is one of string (default), number and time, which specifies how to evaluate expression for comparison.

    • descending (optional) is a boolean value to determine if comparison should be done in descending (reverse) order, which defaults to false.

    Sort keys listed earlier take precedence over ones listed later. For example, if you want to sort articles by the date and then by the author, specify [["{{date}}", "time"], "{{author}}"].

    Sorting is done stably, so even if all events have the same set of sort key values the original order is retained. Also, a special Liquid variable _index_ is provided, which contains the zero-based index number of each event, which means you can exactly reverse the order of events by specifying [["{{_index_}}", "number", true]].

    DataOutputAgent will select the last events_to_show entries of its received events sorted in the order specified by events_order, which is defaulted to the event creation time. So, if you have multiple source agents that may create many events in a run, you may want to either increase events_to_show to have a larger "window", or specify the events_order option to an appropriate value (like date_published) so events from various sources are properly mixed in the resulted feed.

    There is also an option events_list_order that only controls the order of events listed in the final output, without attempting to maintain a total order of received events. It has the same format as events_order and is defaulted to [["{{_index_}}","number",true]] so the selected events are listed in reverse order like most popular RSS feeds list their articles.

    Liquid Templating

    ',10),_n={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},wn=(0,a.IL)('
    • events: An array of events being output, sorted in the given order, up to events_to_show in number. For example, if source events contain a site title in the site_title key, you can refer to it in template.title by putting {{events.first.site_title}}.

    De Duplication Agent - 数据去重

    Creates events Receives events

    De-duplication Agent 在接受数据后,会自动比对并去除重复数据。

    property the value that should be used to determine the uniqueness of the event (empty to use the whole payload)

    lookback amount of past Events to compare the value to (0 for unlimited)

    expected_update_period_in_days is used to determine if the Agent is working.


    Delay Agent - 缓冲存储区

    Creates events Receives events

    Delay Agent 存储收到的事件,并按计划发送它们的副本。将其用作事件的缓冲区或队列。

    max_events should be set to the maximum number of events that you'd like to hold in the buffer. When this number is reached, new events will either be ignored, or will displace the oldest event already in the buffer, depending on whether you set keep to newest or oldest.

    expected_receive_period_in_days is used to determine if the Agent is working. Set it to the maximum number of days that you anticipate passing without this Agent receiving an incoming Event.

    max_emitted_events is used to limit the number of the maximum events which should be created. If you omit this DelayAgent will create events for every event stored in the memory.


    Digest Agent - 摘要汇总 - 未理解

    Creates events Receives events

    Digest Agent 收集发送给它的任何事件并将其作为单个事件发出。

    ',19),An=(0,a.QD)("code",null,"message",-1),Qn=(0,a.QD)("code",null,"message",-1),xn={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Yn=(0,a.IL)('

    Set expected_receive_period_in_days to the maximum amount of time that you'd expect to pass between Events being received by this Agent.

    If retained_events is set to 0 (the default), all received events are cleared after a digest is sent. Set retained_events to a value larger than 0 to keep a certain number of events around on a rolling basis to re-send in future digests.

    For instance, say retained_events is set to 3 and the Agent has received Events 5, 4, and 3. When a digest is sent, Events 5, 4, and 3 are retained for a future digest. After Event 6 is received, the next digest will contain Events 6, 5, and 4.


    Dkt Clustering Agent - 数据挖掘算法?

    ',5),Sn=(0,a.QD)("code",null,"Creates events",-1),En=(0,a.QD)("code",null,"Receives events",-1),Tn=(0,a.QD)("code",null,"Consumes file pointer",-1),Rn=(0,a.QD)("code",null,"Dry runs",-1),Ln={href:"http://huginnio.herokuapp.com/agent_gems#huginn_dkt_curation_agents",target:"_blank",rel:"noopener noreferrer"},In=(0,a.QD)("p",null,[(0,a.mY)("The "),(0,a.QD)("code",null,"DktClusteringAgent"),(0,a.mY)(" clusters the input document collection. The document collection first has to be converted to a set of vectors. DktClusteringAgent 会对输入文档集合进行聚类,文档集合首先必须被转换成一组向量。输入文档需要为特定格式,DktClusteringAgent 会在这个输入数据中查找集群。输入会包含查找到的集群数量和找到的集群特定值的信息。")],-1),Cn=(0,a.QD)("p",null,"The Agent expects the input in this particular format and then proceeds to find clusters in this input data. The output contains information on the number of clusters found and specific values for the found clusters.",-1),Hn=(0,a.QD)("code",null,"/e-clustering/generateClusters",-1),Pn={href:"https://github.com/dkt-projekt/e-Clustering#e-clustering-1",target:"_blank",rel:"noopener noreferrer"},jn={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Nn=(0,a.QD)("p",null,[(0,a.QD)("code",null,"url"),(0,a.mY)(" allows to customize the endpoint of the API when hosting the DKT services elswhere.")],-1),On=(0,a.QD)("code",null,"body",-1),Kn={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Fn={href:"http://www.cs.waikato.ac.nz/ml/weka/arff.html",target:"_blank",rel:"noopener noreferrer"},Mn=(0,a.IL)("

    language language of the source data

    algorithm: the algorithm to be used during clustering. Currently EM and Kmeans are supported.

    merge set to true to retain the received payload and update it with the extracted result

    result_key when present the emitted Event data will be nested inside the specified key

    When receiving a file pointer:

    body will be ignored and the contents of the received file will be send instead.

    ",6),Un=(0,a.QD)("code",null,"FtpsiteAgent",-1),Bn=(0,a.QD)("code",null,"LocalFileAgent",-1),Gn=(0,a.QD)("code",null,"S3Agent",-1),Wn={href:"https://github.com/huginn/huginn/wiki/How-Huginn-works-with-files",target:"_blank",rel:"noopener noreferrer"},zn=(0,a.QD)("hr",null,null,-1),Vn=(0,a.QD)("h3",{id:"dropbox-file-url",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#dropbox-file-url"},[(0,a.QD)("span",null,"Dropbox File Url")])],-1),Jn=(0,a.QD)("p",null,[(0,a.QD)("code",null,"Agent Creates"),(0,a.mY)(),(0,a.QD)("code",null,"events Receives events"),(0,a.mY)(),(0,a.QD)("code",null,"Dry runs"),(0,a.mY)(),(0,a.QD)("code",null,"Dropbox oauth2")],-1),Xn={href:"https://www.dropbox.com/developers/core/docs#media",target:"_blank",rel:"noopener noreferrer"},$n={href:"https://www.dropbox.com/developers/core/docs#shares",target:"_blank",rel:"noopener noreferrer"},Zn=(0,a.IL)('

    Include the dropbox-api and omniauth-dropbox gems in your Gemfile and set DROPBOX_OAUTH_KEY and DROPBOX_OAUTH_SECRET in your environment to use Dropbox Agents.

    The incoming event payload needs to have a paths key, with a comma-separated list of files you want the URL for. For example:

    {\n  "paths": "first/path, second/path"\n}\n

    TIP: You can use the Event Formatting Agent to format events before they come in. Here’s an example configuration for formatting an event coming out of a Dropbox Watch Agent:

    {\n  "instructions": {\n    "paths": "{{ added | map: 'path' | join: ',' }}"\n  },\n  "matchers": [],\n  "mode": "clean"\n}\n

    An example of usage would be to watch a specific Dropbox directory (with the DropboxWatchAgent) and get the URLs for the added or updated files. You could then, for example, send emails with those links.

    Set link_type to 'temporary' if you want temporary links, or to 'permanent' for permanent ones.


    Dropbox Watch Agent

    Creates events Dropbox oauth2

    Dropbox Watch Agent 监测给定值dir_to_watch并发出检测到的更改的事件。

    Include the dropbox-api and omniauth-dropbox gems in your Gemfile and set DROPBOX_OAUTH_KEY and DROPBOX_OAUTH_SECRET in your environment to use Dropbox Agents.


    Email Agent

    Email Agent 将刚收到的信息 Receives events,以邮件形式发送通知。

    ',15),es=(0,a.QD)("code",null,"subject",-1),ns={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},ss=(0,a.QD)("code",null,'"Huginn email"',-1),as=(0,a.QD)("code",null,"{{subject}}",-1),ts=(0,a.QD)("code",null,"subject",-1),os=(0,a.IL)('

    默认情况下,邮件正文将包含一个可选的 "标题",然后是事件的键的列表。

    你可以通过加入可选的body参数来定制邮件正文。像subject一样,body可以是一个简单的信息或一个液体模板。你可以只发送事件的some_text字段,body设置为{{ some_text }}。身体可以包含简单的 HTML,并将被净化。注意,当使用body时,它将被<html><body>标签包裹,所以你不需要自己添加这些。

    你可以为邮件指定一个或多个 "收件人",或者跳过这个选项,以便将邮件发送到你的账户的默认邮件地址。

    你可以为邮件提供一个from地址,或者留空,默认为EMAIL_FROM_ADDRESS (``) 的值。

    你可以为邮件提供一个content_type,并指定发送text/plaintext/html。如果你不指定content_type,那么收件人的邮件服务器将决定正确的渲染方式。

    设置expected_receive_period_in_days为您希望该代理收到事件之间的最大时间。


    Email Digest Agent - 邮件摘要

    Receives events

    Email Digest Agent 收集发送给它的任何事件,并按计划通过电子邮件发送。使用事件的数目与 Keep events 有关,这意味着如果事件在 Email Digest Agent 计划运行之前到期,它们将不会出现在电子邮件中。

    By default, the will have a subject and an optional headline before listing the Events. If the Events' payloads contain a message, that will be highlighted, otherwise everything in their payloads will be shown.

    You can specify one or more recipients for the email, or skip the option in order to send the email to your account's default email address.

    You can provide a from address for the email, or leave it blank to default to the value of EMAIL_FROM_ADDRESS (``).

    You can provide a content_type for the email and specify text/plain or text/html to be sent. If you do not specify content_type, then the recipient email server will determine the correct rendering.

    Set expected_receive_period_in_days to the maximum amount of time that you'd expect to pass between Events being received by this Agent.


    Evernote Agent

    Creates events Receives events Evernote

    Evernote Agent 与你的 Evernote 账户相连,新建笔记。

    ',19),is={href:"https://dev.evernote.com/doc/",target:"_blank",rel:"noopener noreferrer"},ls={href:"https://sandbox.evernote.com/Registration.action",target:"_blank",rel:"noopener noreferrer"},cs={href:"http://huginnio.herokuapp.com/services",target:"_blank",rel:"noopener noreferrer"},rs=(0,a.IL)('

    Options:

    • mode - Two possible values:

      • update Based on events it receives, the agent will create notes or update notes with the same title and notebook

      • read On a schedule, it will generate events containing data for newly added or updated notes

    • include_xhtml_content - Set to true to include the content in ENML (Evernote Markup Language) of the note

    • note

      • When mode is update the parameters of note are the attributes of the note to be added/edited. To edit a note, both title and notebook must be set.

        For example, to add the tags 'comic' and 'CS' to a note titled 'xkcd Survey' in the notebook 'xkcd', use:

        "notes": {\n  "title": "xkcd Survey",\n  "content": "",\n  "notebook": "xkcd",\n  "tagNames": "comic, CS"\n}\n

        If a note with the above title and notebook did note exist already, one would be created.

      • When mode is read the values are search parameters. Note: The content parameter is not used for searching. Setting title only filters notes whose titles contain title as a substring, not as the exact title.

        For example, to find all notes with tag 'CS' in the notebook 'xkcd', use:

        "notes": {\n  "title": "",\n  "content": "",\n  "notebook": "xkcd",\n  "tagNames": "CS"\n}\n

    Freme Explore Agent - SPARQL-数据断点?

    ',4),ps=(0,a.QD)("code",null,"Creates events",-1),ds=(0,a.QD)("code",null,"Receives events",-1),us=(0,a.QD)("code",null,"Dry runs",-1),ms={href:"http://huginnio.herokuapp.com/agent_gems#huginn_freme_enrichment_agents",target:"_blank",rel:"noopener noreferrer"},gs=(0,a.QD)("p",null,[(0,a.mY)("The "),(0,a.QD)("code",null,"FremeExploreAgent"),(0,a.mY)(" can retrieve description of a resource from a given endpoint. The endpoint can be SPARQL or Linked Data Fragments endpoint. FremeExploreAgent 可以检索给定端点的资源描述。端点可以是 SPARQL 或 Linked Data Fragments 端点。")],-1),hs=(0,a.QD)("code",null,"/e-link/explore",-1),vs={href:"http://api.freme-project.eu/doc/current/api-doc/full.html#!/e-Link/explore",target:"_blank",rel:"noopener noreferrer"},bs={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},ks=(0,a.IL)("

    base_url allows to customize the API server when hosting the FREME services elswhere.

    auth_token can be set to access private filters, datasets, templates or pipelines (depending on the agent).

    outformat requested RDF serialization format of the output (required), CSV is only supported when using a filter.

    resource a URI of the resource which should be described (required).

    endpoint a URL of the endpoint which should be used to retrieve info about the resource.

    endpoint_type the type of the endpoint (required).

    ",6),fs=(0,a.QD)("code",null,"filter",-1),ys={href:"http://api.freme-project.eu/doc/current/knowledge-base/freme-for-api-users/filtering.html",target:"_blank",rel:"noopener noreferrer"},qs=(0,a.IL)('

    merge set to true to retain the received payload and update it with the extracted result

    result_key when present the emitted Event data will be nested inside the specified key


    Ftpsite Agent

    Creates events Receives events Emits file pointer

    Ftp Site Agent 检查 FTP 站点,并根据目录中新上载的文件创建事件。当接收到事件时,它会在配置的 FTP 服务器上创建文件。

    mode must be present and either read or write, in read mode the agent checks the FTP site for changed files, with write it writes received events to a file on the server.

    Universal options

    Specify a url that represents a directory of an FTP site to watch, and a list of patterns to match against file names.

    Login credentials can be included in url if authentication is required: ftp://username:password@ftp.example.com/path. Liquid formatting is supported as well: ftp://{% credential ftp_credentials %}@ftp.example.com/

    Optionally specify the encoding of the files you want to read/write in force_encoding, by default UTF-8 is used.

    Reading

    Only files with a last modification time later than the after value, if specifed, are emitted as event.

    Writing

    Specify the filename to use in filename, Liquid interpolation is possible to change the name per event.

    ',15),Ds={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},_s=(0,a.QD)("code",null,"data",-1),ws=(0,a.QD)("code",null,"CsvAgent",-1),As=(0,a.QD)("code",null,"PostAgent",-1),Qs=(0,a.QD)("code",null,"ReadFileAgent",-1),xs={href:"https://github.com/huginn/huginn/wiki/How-Huginn-works-with-files",target:"_blank",rel:"noopener noreferrer"},Ys=(0,a.QD)("hr",{class:"footnotes-sep"},null,-1),Ss={class:"footnotes"},Es={class:"footnotes-list"},Ts={id:"footnote1",class:"footnote-item"},Rs={href:"https://blog.csdn.net/qq_36822217/article/details/103156327",target:"_blank",rel:"noopener noreferrer"},Ls=(0,a.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Is={id:"footnote2",class:"footnote-item"},Cs={href:"https://github.com/huginn/huginn/issues/2410",target:"_blank",rel:"noopener noreferrer"},Hs=(0,a.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),Ps={id:"footnote3",class:"footnote-item"},js={href:"https://github.com/huginn/huginn/issues/1618",target:"_blank",rel:"noopener noreferrer"},Ns=(0,a.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),Os={},Ks=(0,s(9720).c)(Os,[["render",function(e,n){const s=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("Huginn 部署:查看 "),(0,a.QD)("a",o,[(0,a.mY)("deploy Huginn inside of Docker"),(0,a.K2)(s)]),(0,a.mY)(" 和 "),(0,a.QD)("a",i,[(0,a.mY)(".env 设置"),(0,a.K2)(s)]),(0,a.mY)(",或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。")]),(0,a.QD)("li",null,[(0,a.mY)("Huginn 抓取教程:"),(0,a.QD)("a",l,[(0,a.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,a.K2)(s)])])]),c,(0,a.QD)("p",null,[(0,a.QD)("a",r,[(0,a.mY)("Huginn Agents"),(0,a.K2)(s)]),(0,a.mY)(":")]),p,(0,a.QD)("p",null,[(0,a.mY)((0,t.WA)(e.created_at)+" 为自带抓取时间,Agent 设置中的特殊字符",1),d,(0,a.mY)(",需要用反义符"),u,(0,a.mY)("。")]),m,(0,a.QD)("p",null,[(0,a.mY)("部署环境:Ubuntu 18.04 的 Docker 镜像(同样适用于服务器) 安装参考:"),(0,a.QD)("a",g,[(0,a.mY)("Manual Installation on Debian/Ubuntu"),(0,a.K2)(s)]),(0,a.mY)(","),(0,a.QD)("a",h,[(0,a.mY)("Novice-setup-guide"),(0,a.K2)(s)]),(0,a.mY)(" 手动升级:"),(0,a.QD)("a",v,[(0,a.mY)("manual Update"),(0,a.K2)(s)])]),b,(0,a.QD)("p",null,[k,(0,a.mY)(" 设置 huginn 环境依赖,更多选项查看 "),(0,a.QD)("a",f,[(0,a.mY)(".env 设置案例"),(0,a.K2)(s)]),(0,a.mY)("。编辑器为上面安装的 vim,"),y,(0,a.mY)(" 在光标所在的位置插入,"),q,(0,a.mY)(" 退出编辑,"),D,(0,a.mY)(" 保存并退出。")]),_,(0,a.QD)("p",null,[(0,a.mY)("Huginn "),(0,a.QD)("a",w,[(0,a.mY)("multi-process"),(0,a.K2)(s)]),(0,a.mY)(" 镜像基于 Ubuntu 18.04,没有 root 权限。如果不导出卷,或者使用单独的数据库容器,则无法在不丢失数据的情况下更新 Huginn。可以手动设置数据库对外端口和外部存储路径。")]),A,(0,a.QD)("p",null,[(0,a.mY)("Event Formatting Agent 允许您格式化传入的事件,根据需要添加新的字段。可以用正则来替换输入中的某些元素。具体样例参考,"),(0,a.QD)("a",Q,[(0,a.mY)("新京报 #5 清理版面字段格式"),(0,a.K2)(s)]),(0,a.mY)("。")]),x,(0,a.QD)("p",null,[(0,a.mY)("Have a look at the "),(0,a.QD)("a",Y,[(0,a.mY)("Wiki"),(0,a.K2)(s)]),(0,a.mY)(" to learn more about liquid templating.")]),S,(0,a.QD)("p",null,[(0,a.mY)("Adioso Agent 可以查询两个城市间,在指定时间内的最低飞机票价格。机票价格货币是美元。查询日期 "),E,(0,a.mY)(" 和 "),T,(0,a.mY)(" 之间的差异需小于 150 天。需要注册 "),(0,a.QD)("a",R,[(0,a.mY)("Adioso"),(0,a.K2)(s)]),(0,a.mY)(",并在 "),L,(0,a.mY)(" and "),I,(0,a.mY)(" 中输入。")]),C,H,P,j,(0,a.QD)("p",null,[(0,a.mY)("操作说明: Provide the "),N,(0,a.mY)(" for the API endpoint that you’d like to hit. For example, for all active packages, enter "),O,(0,a.mY)(" (see "),(0,a.QD)("a",K,[(0,a.mY)("https://www.aftership.com/docs/api/4/trackings"),(0,a.K2)(s)]),(0,a.mY)("), for a specific package, use "),F,(0,a.mY)(" and replace "),M,(0,a.mY)(" with a courier code and "),U,(0,a.mY)(" with the tracking number. You can request last checkpoint of a package by providing "),B,(0,a.mY)(" instead.")]),G,W,z,V,J,(0,a.QD)("p",null,[X,(0,a.mY)(),$,(0,a.mY)(),Z,(0,a.QD)("a",ee,[(0,a.mY)("huginn_algorithmia_agent"),(0,a.K2)(s)])]),(0,a.QD)("p",null,[(0,a.mY)("AlgoritmiaAgent 运行 Algorithmia 中的算法。在使用此代理之前,您需要注册一个"),(0,a.QD)("a",ne,[(0,a.mY)("Algorithmia"),(0,a.K2)(s)]),(0,a.mY)("帐户。")]),se,(0,a.QD)("p",null,[(0,a.mY)("To be able to use this Agent you need to authenticate with 37signals in the "),(0,a.QD)("a",ae,[(0,a.mY)("Services"),(0,a.K2)(s)]),(0,a.mY)(" section first.")]),te,oe,(0,a.QD)("p",null,[ie,(0,a.mY)(),le,(0,a.mY)(),ce,(0,a.QD)("a",re,[(0,a.mY)("huginn_bigquery_agent"),(0,a.K2)(s)])]),pe,de,(0,a.QD)("ol",null,[(0,a.QD)("li",null,[(0,a.mY)("Visit "),(0,a.QD)("a",ue,[(0,a.mY)("the google api console"),(0,a.K2)(s)])]),me,ge,he,ve,be]),ke,(0,a.QD)("p",null,[fe,(0,a.mY)(" - The BigQuery query to run. "),(0,a.QD)("a",ye,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" formatting is supported to run queries based on receiving events.")]),qe,(0,a.QD)("p",null,[De,(0,a.mY)(" - Maximum number of rows to return. Defaults to unlimited, but results are always "),(0,a.QD)("a",_e,[(0,a.mY)("limited to 10 MB"),(0,a.K2)(s)]),(0,a.mY)(".")]),we,(0,a.QD)("p",null,[Ae,(0,a.mY)(),Qe,(0,a.mY)(" - The private key (value of "),xe,(0,a.mY)(" from the downloaded file). "),(0,a.QD)("a",Ye,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" formatting is supported if you want to use a Credential. (E.g., "),Se,(0,a.mY)(")")]),Ee,(0,a.QD)("p",null,[Te,(0,a.mY)(" specifies a "),(0,a.QD)("a",Re,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" template that expands to the property to be watched, where you can use a variable "),Le,(0,a.mY)(" for the last property value. If you want to detect a new lowest price, try this: "),Ie]),Ce,(0,a.QD)("p",null,[(0,a.mY)("Here's a tip: you can use "),(0,a.QD)("a",He,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" templating to dynamically determine the action type. For example:")]),Pe,(0,a.QD)("p",null,[(0,a.mY)("This agent can consume a ‘file pointer’ event from the following agents with no additional configuration: "),je,(0,a.mY)(", "),Ne,(0,a.mY)(", "),Oe,(0,a.mY)(". Read more about the concept in the "),(0,a.QD)("a",Ke,[(0,a.mY)("wiki"),(0,a.K2)(s)]),(0,a.mY)(".")]),(0,a.QD)("p",null,[(0,a.mY)("When receiving the CSV data in a regular event use "),(0,a.QD)("a",Fe,[(0,a.mY)("JSONPath"),(0,a.K2)(s)]),(0,a.mY)(" to select the path in "),Me,(0,a.mY)(". "),Ue,(0,a.mY)(" is only used when the received event does not contain a 'file pointer'.")]),Be,Ge,We,(0,a.QD)("p",null,[(0,a.mY)("Use "),(0,a.QD)("a",ze,[(0,a.mY)("JSONPath"),(0,a.K2)(s)]),(0,a.mY)(" in "),Ve,(0,a.mY)(" to select with part of the received events should be serialized.")]),Je,(0,a.QD)("ul",null,[Xe,$e,(0,a.QD)("li",null,[Ze,(0,a.mY)(" - A JSON object representing a mapping between item output keys and incoming event values. Use "),(0,a.QD)("a",en,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" to format the values. Values of the "),nn,(0,a.mY)(", "),sn,(0,a.mY)(", "),an,(0,a.mY)(" and "),tn,(0,a.mY)(" keys will be put into the "),on,(0,a.mY)(" section of RSS output. Value of the "),ln,(0,a.mY)(" key will be used as URL for this feed itself, which is useful when you serve it via reverse proxy. The "),cn,(0,a.mY)(" key will be repeated for every Event. The "),rn,(0,a.mY)(" key for each item will have the creation time of the Event unless given.")]),pn,dn,(0,a.QD)("li",null,[un,(0,a.mY)(" - Add "),(0,a.QD)("a",mn,[(0,a.mY)("yahoo media namespace"),(0,a.K2)(s)]),(0,a.mY)(" in output xml")]),(0,a.QD)("li",null,[gn,(0,a.mY)(" - Add "),(0,a.QD)("a",hn,[(0,a.mY)("itunes compatible namespace"),(0,a.K2)(s)]),(0,a.mY)(" in output xml")]),vn,bn,(0,a.QD)("li",null,[kn,(0,a.mY)(" - Set to a list of PubSubHubbub endpoints you want to publish an update to every time this agent receives an event. (default: none) Popular hubs include "),(0,a.QD)("a",fn,[(0,a.mY)("Superfeedr"),(0,a.K2)(s)]),(0,a.mY)(" and "),(0,a.QD)("a",yn,[(0,a.mY)("Google"),(0,a.K2)(s)]),(0,a.mY)(". Note that publishing updates will make your feed URL known to the public, so if you want to keep it secret, set up a reverse proxy to serve your feed via a safe URL and specify it in "),qn,(0,a.mY)(".")])]),Dn,(0,a.QD)("p",null,[(0,a.mY)("In "),(0,a.QD)("a",_n,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" templating, the following variable is available:")]),wn,(0,a.QD)("p",null,[(0,a.mY)("The resulting Event will have a payload message of "),An,(0,a.mY)(". You can use liquid templating in the "),Qn,(0,a.mY)(", have a look at the "),(0,a.QD)("a",xn,[(0,a.mY)("Wiki"),(0,a.K2)(s)]),(0,a.mY)(" for details.")]),Yn,(0,a.QD)("p",null,[Sn,(0,a.mY)(),En,(0,a.mY)(),Tn,(0,a.mY)(),Rn,(0,a.QD)("a",Ln,[(0,a.mY)("huginn_dkt_curation_agents"),(0,a.K2)(s)]),(0,a.mY)(" 使用 DKT APIs,其中含有多个 agents,具体查看上方链接。")]),In,Cn,(0,a.QD)("p",null,[(0,a.mY)("The Agent accepts all configuration options of the "),Hn,(0,a.mY)(" endpoint as of september 2016, have a look at the "),(0,a.QD)("a",Pn,[(0,a.mY)("offical documentation"),(0,a.K2)(s)]),(0,a.mY)(" if you need additional information")]),(0,a.QD)("p",null,[(0,a.mY)("All Agent configuration options are interpolated using "),(0,a.QD)("a",jn,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" in the context of the received event.")]),Nn,(0,a.QD)("p",null,[On,(0,a.mY)(" use "),(0,a.QD)("a",Kn,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" templating to specify the input .arff file. See "),(0,a.QD)("a",Fn,[(0,a.mY)("http://www.cs.waikato.ac.nz/ml/weka/arff.html"),(0,a.K2)(s)]),(0,a.mY)(" for an explanation of this format.")]),Mn,(0,a.QD)("p",null,[(0,a.mY)("This agent can consume a ‘file pointer’ event from the following agents with no additional configuration: "),Un,(0,a.mY)(", "),Bn,(0,a.mY)(", "),Gn,(0,a.mY)(". Read more about the concept in the "),(0,a.QD)("a",Wn,[(0,a.mY)("wiki"),(0,a.K2)(s)]),(0,a.mY)(".")]),zn,Vn,Jn,(0,a.QD)("p",null,[(0,a.mY)("DropboxFileUrlAgent 用于使用 Dropbox。它需要一个文件路径(或多个文件路径),并通过"),(0,a.QD)("a",Xn,[(0,a.mY)("临时链接"),(0,a.K2)(s)]),(0,a.mY)("或"),(0,a.QD)("a",$n,[(0,a.mY)("永久链接"),(0,a.K2)(s)]),(0,a.mY)("发送事件。")]),Zn,(0,a.QD)("p",null,[(0,a.mY)("你可以通过提供"),es,(0,a.mY)("选项来指定邮件的主题行,该选项可以包含"),(0,a.QD)("a",ns,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)("的格式。例如,你可以提供"),ss,(0,a.mY)("来设置一个简单的主题,或者"),as,(0,a.mY)("来使用传入事件中的"),ts,(0,a.mY)("键。")]),os,(0,a.QD)("p",null,[(0,a.mY)("Visit "),(0,a.QD)("a",is,[(0,a.mY)("Evernote"),(0,a.K2)(s)]),(0,a.mY)(" to set up an Evernote app and receive an api key and secret. Store these in the Evernote environment variables in the .env file. You will also need to create a "),(0,a.QD)("a",ls,[(0,a.mY)("Sandbox"),(0,a.K2)(s)]),(0,a.mY)(" account to use during development.")]),(0,a.QD)("p",null,[(0,a.mY)("Next, you'll need to authenticate with Evernote in the "),(0,a.QD)("a",cs,[(0,a.mY)("Services"),(0,a.K2)(s)]),(0,a.mY)(" section.")]),rs,(0,a.QD)("p",null,[ps,(0,a.mY)(),ds,(0,a.mY)(),us,(0,a.mY)(),(0,a.QD)("a",ms,[(0,a.mY)("huginn_freme_enrichment_agents"),(0,a.K2)(s)]),(0,a.mY)(" 使用 FREME APIs,其中含有多个 agents,具体查看上方链接。")]),gs,(0,a.QD)("p",null,[(0,a.mY)("The Agent accepts all configuration options of the "),hs,(0,a.mY)(" endpoint as of September 2016, have a look at the "),(0,a.QD)("a",vs,[(0,a.mY)("offical documentation"),(0,a.K2)(s)]),(0,a.mY)(" if you need additional information.")]),(0,a.QD)("p",null,[(0,a.mY)("All Agent configuration options are interpolated using "),(0,a.QD)("a",bs,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" in the context of the received event.")]),ks,(0,a.QD)("p",null,[fs,(0,a.mY)(" allows to post-process the results using a pre-configured SPARQL filter. Check the "),(0,a.QD)("a",ys,[(0,a.mY)("official documentation"),(0,a.K2)(s)]),(0,a.mY)(" for details.")]),qs,(0,a.QD)("p",null,[(0,a.mY)("Use "),(0,a.QD)("a",Ds,[(0,a.mY)("Liquid"),(0,a.K2)(s)]),(0,a.mY)(" templating in "),_s,(0,a.mY)(" to specify which part of the received event should be written.")]),(0,a.QD)("p",null,[(0,a.mY)("This agent only emits a ‘file pointer’, not the data inside the files, the following agents can consume the created events: "),ws,(0,a.mY)(", "),As,(0,a.mY)(", "),Qs,(0,a.mY)(". Read more about the concept in the "),(0,a.QD)("a",xs,[(0,a.mY)("wiki"),(0,a.K2)(s)]),(0,a.mY)(".")]),Ys,(0,a.QD)("section",Ss,[(0,a.QD)("ol",Es,[(0,a.QD)("li",Ts,[(0,a.QD)("p",null,[(0,a.QD)("a",Rs,[(0,a.mY)("ERROR 2002 (HY000)"),(0,a.K2)(s)]),(0,a.mY)(),Ls])]),(0,a.QD)("li",Is,[(0,a.QD)("p",null,[(0,a.QD)("a",Cs,[(0,a.mY)("rake export hangs"),(0,a.K2)(s)]),(0,a.mY)(),Hs])]),(0,a.QD)("li",Ps,[(0,a.QD)("p",null,[(0,a.QD)("a",js,[(0,a.mY)("Huginn failed to restart after installed node and systemd"),(0,a.K2)(s)]),(0,a.mY)(),Ns])])])])])}]]),Fs=JSON.parse('{"path":"/services/Huginn.html","title":"Huginn","lang":"zh-CN","frontmatter":{"article":false,"title":"Huginn","icon":"customize","order":3,"description":" Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) 常用 Agent Huginn Agents: Webs...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/Huginn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Huginn"}],["meta",{"property":"og:description","content":" Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) 常用 Agent Huginn Agents: Webs..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Huginn\\",\\"description\\":\\" Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) 常用 Agent Huginn Agents: Webs...\\"}"]]},"headers":[{"level":2,"title":"常用 Agent","slug":"常用-agent","link":"#常用-agent","children":[]},{"level":2,"title":"Huginn 部署","slug":"huginn-部署","link":"#huginn-部署","children":[{"level":3,"title":"Ubuntu 手动部署","slug":"ubuntu-手动部署","link":"#ubuntu-手动部署","children":[]},{"level":3,"title":"Huginn Docker","slug":"huginn-docker","link":"#huginn-docker","children":[]}]},{"level":2,"title":"Agents","slug":"agents","link":"#agents","children":[{"level":3,"title":"Trigger Agent","slug":"trigger-agent","link":"#trigger-agent","children":[]},{"level":3,"title":"Liquid Output Agent","slug":"liquid-output-agent","link":"#liquid-output-agent","children":[]},{"level":3,"title":"Event Formatting Agent","slug":"event-formatting-agent","link":"#event-formatting-agent","children":[]},{"level":3,"title":"Adioso Agent - 机票价格追踪","slug":"adioso-agent-机票价格追踪","link":"#adioso-agent-机票价格追踪","children":[]},{"level":3,"title":"Aftership Agent - 物流追踪-API 付费","slug":"aftership-agent-物流追踪-api-付费","link":"#aftership-agent-物流追踪-api-付费","children":[]},{"level":3,"title":"Algorithmia Agent - AI 算法","slug":"algorithmia-agent-ai-算法","link":"#algorithmia-agent-ai-算法","children":[]},{"level":3,"title":"Attribute Difference Agent - 属性差异(待深入理解)","slug":"attribute-difference-agent-属性差异-待深入理解","link":"#attribute-difference-agent-属性差异-待深入理解","children":[]},{"level":3,"title":"Basecamp Agent - Service 停用","slug":"basecamp-agent-service-停用","link":"#basecamp-agent-service-停用","children":[]},{"level":3,"title":"Bigquery Agent - 大型数据库分析","slug":"bigquery-agent-大型数据库分析","link":"#bigquery-agent-大型数据库分析","children":[]},{"level":3,"title":"Boxcar Agent - iPhone 通知栏 app","slug":"boxcar-agent-iphone-通知栏-app","link":"#boxcar-agent-iphone-通知栏-app","children":[]},{"level":3,"title":"Change Detector Agent - 监测数据变化","slug":"change-detector-agent-监测数据变化","link":"#change-detector-agent-监测数据变化","children":[]},{"level":3,"title":"Commander Agent - 触发命令","slug":"commander-agent-触发命令","link":"#commander-agent-触发命令","children":[]},{"level":3,"title":"Csv Agent - CSV 表格数据处理","slug":"csv-agent-csv-表格数据处理","link":"#csv-agent-csv-表格数据处理","children":[]},{"level":3,"title":"Data Output Agent - 网页输出数据(RSS)","slug":"data-output-agent-网页输出数据-rss","link":"#data-output-agent-网页输出数据-rss","children":[]},{"level":3,"title":"De Duplication Agent - 数据去重","slug":"de-duplication-agent-数据去重","link":"#de-duplication-agent-数据去重","children":[]},{"level":3,"title":"Delay Agent - 缓冲存储区","slug":"delay-agent-缓冲存储区","link":"#delay-agent-缓冲存储区","children":[]},{"level":3,"title":"Digest Agent - 摘要汇总 - 未理解","slug":"digest-agent-摘要汇总-未理解","link":"#digest-agent-摘要汇总-未理解","children":[]},{"level":3,"title":"Dkt Clustering Agent - 数据挖掘算法?","slug":"dkt-clustering-agent-数据挖掘算法","link":"#dkt-clustering-agent-数据挖掘算法","children":[]},{"level":3,"title":"Dropbox File Url","slug":"dropbox-file-url","link":"#dropbox-file-url","children":[]},{"level":3,"title":"Dropbox Watch Agent","slug":"dropbox-watch-agent","link":"#dropbox-watch-agent","children":[]},{"level":3,"title":"Email Agent","slug":"email-agent","link":"#email-agent","children":[]},{"level":3,"title":"Email Digest Agent - 邮件摘要","slug":"email-digest-agent-邮件摘要","link":"#email-digest-agent-邮件摘要","children":[]},{"level":3,"title":"Evernote Agent","slug":"evernote-agent","link":"#evernote-agent","children":[]},{"level":3,"title":"Freme Explore Agent - SPARQL-数据断点?","slug":"freme-explore-agent-sparql-数据断点","link":"#freme-explore-agent-sparql-数据断点","children":[]},{"level":3,"title":"Ftpsite Agent","slug":"ftpsite-agent","link":"#ftpsite-agent","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":18},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":27.27,"words":8182},"filePathRelative":"services/Huginn.md","localizedDate":"2022年7月22日","excerpt":"","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5099],{3671:(e,n)=>{n.A=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},4867:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>Ms,data:()=>Us});var a=s(7847),t=s(4094);const o={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/huginn/huginn/blob/master/.env.example",target:"_blank",rel:"noopener noreferrer"},l={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},c=(0,a.Lk)("h2",{id:"常用-agent",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#常用-agent"},[(0,a.Lk)("span",null,"常用 Agent")])],-1),r={href:"https://github.com/huginn/huginn/wiki/Agent-Types-&-Descriptions",target:"_blank",rel:"noopener noreferrer"},p=(0,a.Fv)("
    • 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),d=(0,a.Lk)("code",null,"+",-1),u=(0,a.Lk)("code",null,"\\\\",-1),g=(0,a.Fv)('

    Huginn 部署

    Huginn 的任务有时会卡住,导致后续任务无法进行,重启容器也无法恢复正常。因此,我改为手动部署 Huginn,并定期使用重置命令以防止任务卡住。

    cd /home/huginn/huginn\nsudo bundle exec rake production:force_stop\nsudo bundle exec rake production:export\n

    服务器重启后,需分行执行以下命令:

    sudo docker exec -it huginn bash\nsudo service mysql restart\nsudo service mysql start\nsudo service nginx restart\ncd /home/huginn/huginn\ngit config --global --add safe.directory /home/huginn/huginn\nsudo runsvdir /etc/service &\nsudo bundle exec rake production:export\n

    Huginn 经常用到的位置包括 /home/huginn/huginnenv 环境设置)和 /var/lib/mysql(数据库)。为了使这些位置能够在外部存储上工作,需要将外部存储位置的权限设置为 everyone,否则会出现错误。

    需要注意的是,内部数据库默认情况下不会被外部识别。为了使其能够与外部进行连接,需要进行以下操作:

    1. 使用 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 命令找到 bind-address 行,并注释掉(在行的前面添加 #):#bind-address = 127.0.0.1。同时,将 max_allowed_packet 设置为 200M

    2. 根据连接反馈获取连接 IP 并授权,同时开放 process 权限,方便后期数据库备份。数据库备用可使用 backup_script.sh 脚本,定期将 sql 文件导出到外部存储。

      mysql -u root -p\nGRANT ALL PRIVILEGES ON *.* TO 'huginn'@'172.17.0.1' IDENTIFIED BY 'YourPassword';\nGRANT PROCESS ON *.* TO 'huginn'@'localhost';\nFLUSH PRIVILEGES;\n\\q\nsudo service mysql restart\n

    2 个疑问:

    • 测试当任务卡住时,rake production:export 是否有效。(优化后,一直没出现卡住问题?)
    • 部署时 production:export 步骤会提示 unable to lock supervise/lock: temporary failure,但此报错似乎不影响 Huginn 的运行,等有时间看看是否有相关报错。

    Ubuntu 手动部署

    ',11),h={href:"https://github.com/huginn/huginn/blob/master/doc/manual/installation.md",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/huginn/huginn/wiki/Novice-setup-guide",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/huginn/huginn/blob/master/doc/manual/update.md",target:"_blank",rel:"noopener noreferrer"},k=(0,a.Fv)('

    Huginn 部署步骤:

    # 进入 huginn 容器命令行,某些容器命令为 /bin/bash\nsudo docker exec -it huginn bash\n# run as root!\napt-get update -y\napt-get upgrade -y\napt-get install sudo -y\n\n# Install vim and set as default editor\nsudo apt-get install -y vim\nsudo update-alternatives --set editor /usr/bin/vim.basic\n\n# Install the required packages\nsudo 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\n\n# Ubuntu 18.04 Bionic\nsudo apt-get install -y runit-systemd\n\n# Download Ruby and compile it:\nmkdir /tmp/ruby && cd /tmp/ruby\ncurl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.7.tar.bz2 | tar xj\ncd ruby-2.7.7\n./configure --disable-install-rdoc\nmake -j`nproc`\nsudo make install\n\n# curl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.xz | tar xJ\n# cd ruby-3.2.2\n\nsudo gem update --system --no-document\nsudo gem install foreman --no-document\n\n# Create a user for Huginn:\nsudo adduser --disabled-login --gecos 'Huginn' huginn\n\n# Install the database packages\nsudo apt-get install -y mysql-server mysql-client libmysqlclient-dev\n

    输入 service mysql start 启动数据库,否则下一步数据库设置容易报错 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'[1]

    # 逐步设置数据库 root 密码\nsudo mysql_secure_installation\n\n# 用上方设置的密码登陆数据库\nmysql -u root -p\n\n# ⚠️逐行输入代码到数据库命令行 `mysql>`,需将 `$password` 替换为你要设置的密码\nCREATE USER 'huginn'@'localhost' IDENTIFIED BY '$password';\nSET default_storage_engine=INNODB;\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `huginn_production`.* TO 'huginn'@'localhost';\nFLUSH PRIVILEGES;\n\\q\n

    数据库设置好后,拉取 huginn 主体程序,此段命令可以整段复制到 ssh。

    # We'll install Huginn into the home directory of the user "huginn"\ncd /home/huginn\n\n# Clone Huginn repository,不能直接使用 master,避免 ruby 3.2 问题\n# sudo -u huginn -H git clone https://github.com/huginn/huginn.git -b master huginn\nsudo -u huginn -H git clone https://github.com/huginn/huginn.git -b latest_rubygems huginn\n\n# Go to Huginn installation folder\ncd /home/huginn/huginn\n\n# Copy the example Huginn config\nsudo -u huginn -H cp .env.example .env\n\n# Create the log/, tmp/pids/ and tmp/sockets/ directories\nsudo -u huginn mkdir -p log tmp/pids tmp/sockets\n\n# Make sure Huginn can write to the log/ and tmp/ directories\nsudo chown -R huginn log/ tmp/\nsudo chmod -R u+rwX,go-w log/ tmp/\n\n# Make sure permissions are set correctly\nsudo chmod -R u+rwX,go-w log/\nsudo chmod -R u+rwX tmp/\nsudo -u huginn -H chmod o-rwx .env\n\n# Copy the example Unicorn config\nsudo -u huginn -H cp config/unicorn.rb.example config/unicorn.rb\n\n
    ',6),b=(0,a.Lk)("code",null,"sudo -u huginn -H editor .env",-1),f={href:"https://github.com/huginn/huginn/blob/master/.env.example",target:"_blank",rel:"noopener noreferrer"},y=(0,a.Lk)("code",null,"i",-1),q=(0,a.Lk)("code",null,"esc",-1),L=(0,a.Lk)("code",null,":wq",-1),_=(0,a.Fv)('
    DATABASE_ADAPTER=mysql2\n#DATABASE_ENCODING=utf8   # 修改点\nDATABASE_RECONNECT=true\nDATABASE_NAME=huginn_production  # 修改点\nDATABASE_POOL=20\nDATABASE_USERNAME=huginn   # 修改点\nDATABASE_PASSWORD='$password' # 修改点,换为你自己的密码\n#DATABASE_HOST=your-domain-here.com\n#DATABASE_PORT=3306\n#DATABASE_SOCKET=/tmp/mysql.sock\n\n# MySQL only: If you are running a MySQL server >=5.5.3, you should\n# set DATABASE_ENCODING to utf8mb4 instead of utf8 so that the\n# database can hold 4-byte UTF-8 characters like emoji.\nDATABASE_ENCODING=utf8mb4  #修改点\n\n...\nRAILS_ENV=production  # 修改点\n\nUSE_GRAPHVIZ_DOT=dot # 取消注释,启用 GRAPHVIZ 来生成 diagram\n\nTIMEZONE="Beijing" # bundle exec rake time:zones:local,时区需按指定格式填写,否则会报错 runsv not running\n\nDEFAULT_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" # 浏览器访问\n\n# 邮件发送设置\nSMTP_DOMAIN=newzone.top\nSMTP_USER_NAME=benson@newzone.top\nSMTP_PASSWORD=somepassword\nSMTP_SERVER=smtp.feishu.cn\nSMTP_PORT=465\nSMTP_AUTHENTICATION=plain\nSMTP_ENABLE_STARTTLS_AUTO=true\nSMTP_SSL=true\nSEND_EMAIL_IN_DEVELOPMENT=true\n

    Install Gems 前用子账户重新设置运行目录权限 sudo chown -R huginn:huginn /home/huginn,防止报错 Your user account isn't allowed to install to the system RubyGems

    # 注意看黄字警告\ngem install bundler\n# Docker 环境中,时区容易丢失(6-70)\napt-get install tzdata\n# Install Gems\nsudo -u huginn -H bundle config set deployment 'true'\nsudo -u huginn -H bundle config set without 'development test'\nsudo -u huginn -H bundle install\n# 备用 Gems 修复命令\n# bundle update\n# gem update bundler\n# vim /home/huginn/huginn/Gemfile\n\n# Initialize Database\n# Create the database\nsudo -u huginn -H bundle exec rake db:create RAILS_ENV=production\n\n# Migrate to the latest version\nsudo -u huginn -H bundle exec rake db:migrate RAILS_ENV=production\n\n# ⚠️设置登陆账户密码,Create admin user and example agents using the default admin/password login\nsudo -u huginn -H bundle exec rake db:seed RAILS_ENV=production SEED_USERNAME=admin SEED_PASSWORD=password\n\n# Compile Assets\nsudo -u huginn -H bundle exec rake assets:precompile RAILS_ENV=production\n

    sudo -u huginn -H editor Procfile 修改 huginn 设置。如果需多现成运行,可移除 Multiple DelayedJob workers 部分的注释。

    # 在下两行前,添加符号「#」\n#web: bundle exec rails server -p ${PORT-3000} -b ${IP-0.0.0.0}\n#jobs: bundle exec rails runner bin/threaded.rb\n\n# 删除以下下两行前的符号「#」\nweb: bundle exec unicorn -c config/unicorn.rb\njobs: bundle exec rails runner bin/threaded.rb\n

    '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/servicechown -R huginn:huginn /etc/service/huginn*[2] [3] 如果是重启 Huginn 时出现此报错,则检查 sudo -u huginn -H editor .env 设置。

    # 切换到\ncd /home/huginn/huginn\n# 设置\ngit config --global --add safe.directory /home/huginn/huginn\n# 设置开机启动\nsudo runsvdir /etc/service &\nsudo bundle exec rake production:export\n\n# Setup Logrotate\nsudo cp deployment/logrotate/huginn /etc/logrotate.d/huginn\n\n# Ensure Your Huginn Instance Is Running\nsudo bundle exec rake production:status\n

    Nginx 站点设置:

    sudo apt-get install -y nginx\n\n# Site Configuration\nsudo cp deployment/nginx/huginn /etc/nginx/sites-available/huginn\nsudo ln -s /etc/nginx/sites-available/huginn /etc/nginx/sites-enabled/huginn\n\n# Change YOUR_SERVER_FQDN to the fully-qualified domain name of your host serving Huginn.\nsudo editor /etc/nginx/sites-available/huginn\n\n# 不需要 https,则改为下方配置\nserver {\n  listen 80; # 监听的端⼝\n  server_name localhost home.newzone.top; # 域名或ip,这里启用了两个地址,用空格分开\n\n# 测试设置是否正确\nsudo nginx -t\n\n# 移除默认网站设置,只有当服务器/容器只存在 Huginn 网站方执行下行命令\nsudo rm /etc/nginx/sites-enabled/default\n

    以上完成了 Huginn 的所有部署,执行 sudo service nginx restart 即可访问网站。

    Huginn Docker

    ',11),w={href:"https://github.com/huginn/huginn/tree/master/docker/multi-process",target:"_blank",rel:"noopener noreferrer"},A=(0,a.Fv)('

    此外,官方镜像路径与手动版不同,不支持 force_stop 命令。官方建议 Docker 中使用下方命令删除数据库中卡住的任务。这个命令实测是有效的,但我有次碰到了未知 bug,卡住的任务被删除,后续任务却没继续。

    # get a shell inside the docker container (replace huginn with the name or id of the container)\nsudo docker exec -it huginn /bin/bash\n\n# source the environment file\nsource .env\n\n# get a rails console\nbundle exec rails console\n\n# inside the rails console delete  the job\nDelayed::Job.where('locked_at IS NOT NULL AND locked_by IS NOT NULL AND failed_at IS NULL').destroy_all\n

    Agents

    Trigger Agent

    Trigger Agent 挑选符合条件的事件。

    # content 字段中不包含 周雅萌 或 邓雅萌\n{\n  "expected_receive_period_in_days": "2",\n  "keep_event": "true",\n  "rules": [\n    {\n      "type": "!regex",\n      "value": "周雅萌 | 邓雅萌",\n      "path": "$.content"\n    }\n  ],\n  "message": "Looks like your pattern matched in '{{value}}'!"\n}\n\n# title 中包含品牌词 iluminage 或 易美肌\n{\n  "expected_receive_period_in_days": "4",\n  "keep_event": "true",\n  "rules": [\n    {\n      "type": "regex",\n      "value": "iluminage|易美肌",\n      "path": "$.title"\n    }\n  ],\n  "message": "Looks like your pattern matched in '{{value}}'!"\n}\n

    Liquid Output Agent

    用自定义模板将数据整理,输出为 HTML,json 和 xml 格式链接。

    模式一般选 Last X events,将接收到的所有数据对外输出,默认为 1000。

    Last X events 模式下,可以设置 Event limit 以控制输出数据的数量和时间段。Event limit 可以设为 100,即输出数据为 100;也可以设为「1 day」或「5 minutes」,即仅输出最近一天的内容。

    Event Formatting Agent

    ',11),x={href:"http://huginnio.herokuapp.com/scenarios/14/download",target:"_blank",rel:"noopener noreferrer"},W=(0,a.Fv)('
    # strftime() 方法中常用的占位符\n# %Y 表示年份,%m 表示月份,%d 表示日期,%H 表示小时(24小时制),%M 表示分钟,%S 表示秒,%B 代表英文的月份,`%I` 代表小时(12小时制),`%p` 代表 AM/PM。`%e` 代表日期,不会在首位添加零。\n"created_at": "{{created_at | date:'%Y-%m-%d'}}"\n\n# 将 2023-03-02 23:33:30 +0800 替换为 2023-03-02\n"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', ''}}"\n

    正则重构

    比如生成时间规则为 "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', ''}}"

    加前后缀

    抓取链接不完整时,需要完善链接,比如 "url_link": "https://so.toutiao.com{{temp_link}}"

    For example, here is a possible Event:

    {\n  "high": { "celsius": "18", "fahreinheit": "64" },\n  "date":\n    { "epoch": "1357959600", "pretty": "10:00 PM EST on January 11, 2013" },\n  "conditions": "Rain showers",\n  "data": "This is some data",\n}\n

    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": {\n  "message": "Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius.",\n  "subject": "{{data}}",\n  "created_at": "{{created_at}}"\n}\n

    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.

    ',12),S={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},E=(0,a.Fv)('

    Events generated by this possible Event Formatting Agent will look like:

    {\n  "message": "Today's conditions look like Rain showers with a high temperature of 18 degrees Celsius.",\n  "subject": "This is some data"\n}\n

    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:

    {\n  "matchers": [\n    {\n      "path": "{{date.pretty}}",\n      "regexp": "A(?<time>dd:dd [AP]M [A-Z]+)",\n      "to": "pretty_date"\n    }\n  ]\n}\n

    This virtually merges the following hash into the original event hash:

    "pretty_date": {\n  "time": "10:00 PM EST",\n  "0": "10:00 PM EST on January 11, 2013"\n  "1": "10:00 PM EST"\n}\n\n

    So you can use it in instructions like this:

    "instructions": {\n  "message": "Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius according to the forecast at {{pretty_date.time}}.",\n  "subject": "{{data}}"\n}\n\n

    If you want to retain original contents of events and only add new keys, then set mode to merge, otherwise set it to clean.

    To CGI escape output (for example when creating a link), use the Liquid uri_escape filter, like so:

    {\n  "message": "A peak was on Twitter in {{group_by}}.  Search: https://twitter.com/search?q={{group_by | uri_escape}}"\n}\n

    Adioso Agent - 机票价格追踪

    Creates events

    ',14),T=(0,a.Lk)("code",null,"start_date",-1),D=(0,a.Lk)("code",null,"end_date",-1),F={href:"http://adioso.com/",target:"_blank",rel:"noopener noreferrer"},R=(0,a.Lk)("code",null,"username",-1),C=(0,a.Lk)("code",null,"password",-1),H=(0,a.Lk)("hr",null,null,-1),I=(0,a.Lk)("h3",{id:"aftership-agent-物流追踪-api-付费",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#aftership-agent-物流追踪-api-付费"},[(0,a.Lk)("span",null,"Aftership Agent - 物流追踪-API 付费")])],-1),P=(0,a.Lk)("p",null,[(0,a.Lk)("code",null,"Creates events")],-1),j=(0,a.Lk)("p",null,[(0,a.eW)("Aftership agent 帮助你追踪你的快递,并实时更新包裹动态。为了能够使用 Aftership API,您需要生成一个 "),(0,a.Lk)("code",null,"API Key"),(0,a.eW)("。这需要付费才能使用其跟踪功能。")],-1),N=(0,a.Lk)("code",null,"path",-1),O=(0,a.Lk)("code",null,"trackings",-1),M={href:"https://www.aftership.com/docs/api/4/trackings",target:"_blank",rel:"noopener noreferrer"},U=(0,a.Lk)("code",null,"trackings/SLUG/TRACKING_NUMBER",-1),B=(0,a.Lk)("code",null,"SLUG",-1),G=(0,a.Lk)("code",null,"TRACKING_NUMBER",-1),V=(0,a.Lk)("code",null,"last_checkpoint/SLUG/TRACKING_NUMBER",-1),z=(0,a.Lk)("p",null,[(0,a.eW)("You can get a list of courier information here "),(0,a.Lk)("code",null,"https://www.aftership.com/courier")],-1),Y=(0,a.Lk)("p",null,"Required Options:",-1),J=(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"api_key"),(0,a.eW)(" - YOUR_API_KEY.")]),(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"path request and its full path")])],-1),K=(0,a.Lk)("hr",null,null,-1),Q=(0,a.Lk)("h3",{id:"algorithmia-agent-ai-算法",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#algorithmia-agent-ai-算法"},[(0,a.Lk)("span",null,"Algorithmia Agent - AI 算法")])],-1),X=(0,a.Lk)("code",null,"Creates events",-1),$=(0,a.Lk)("code",null,"Receives events",-1),Z=(0,a.Lk)("code",null,"Dry runs",-1),ee={href:"http://huginnio.herokuapp.com/agent_gems#huginn_algorithmia_agent",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://algorithmia.com",target:"_blank",rel:"noopener noreferrer"},se=(0,a.Fv)('

    The created event will have the output from Algorithmia in the result key. To merge incoming Events with the result, use merge for the mode key.


    Attribute Difference Agent - 属性差异(待深入理解)

    Creates events Receives events

    The Attribute Difference Agent receives events and emits a new event with the difference or change of a specific attribute in comparison to the previous event received. Attribute Difference Agent 用于传递两个不同值的差异和改变。

    path specifies the JSON path of the attribute to be used from the event.

    output specifies the new attribute name that will be created on the original payload and it will contain the difference or change.

    method specifies if it should be…

    • percentage_change eg. Previous value was 160, new value is 116. Percentage change is -27.5
    • decimal_difference eg. Previous value was 5.5, new value is 15.2. Difference is 9.7
    • integer_difference eg. Previous value was 50, new value is 40. Difference is -10

    decimal_precision defaults to 3, but you can override this if you want.

    expected_update_period_in_days is used to determine if the Agent is working.

    The resulting event will be a copy of the received event with the difference or change added as an extra attribute. If you use the percentage_change the attribute will be formatted as such {{attribute}}_change, otherwise it will be {{attribute}}_diff.

    All configuration options will be liquid interpolated based on the incoming event.


    Basecamp Agent - Service 停用

    Creates events 37signals

    The Basecamp Agent checks a Basecamp project for new Events

    ',17),ae={href:"http://huginnio.herokuapp.com/services",target:"_blank",rel:"noopener noreferrer"},te=(0,a.Lk)("hr",null,null,-1),oe=(0,a.Lk)("h3",{id:"bigquery-agent-大型数据库分析",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#bigquery-agent-大型数据库分析"},[(0,a.Lk)("span",null,"Bigquery Agent - 大型数据库分析")])],-1),ie=(0,a.Lk)("code",null,"Creates events",-1),le=(0,a.Lk)("code",null,"Receives events",-1),ce=(0,a.Lk)("code",null,"Dry runs",-1),re={href:"http://huginnio.herokuapp.com/agent_gems#huginn_bigquery_agent",target:"_blank",rel:"noopener noreferrer"},pe=(0,a.Lk)("p",null,"Bigquery Agent 会调用 Google BigQuery 和 Goolge Cloud 账户,可能需要付费。同时,Bigquery Agent 依靠服务帐户进行身份验证,而不是 oauth。",-1),de=(0,a.Lk)("p",null,"Setup:",-1),ue={href:"https://code.google.com/apis/console/b/0/",target:"_blank",rel:"noopener noreferrer"},ge=(0,a.Lk)("li",null,"Use your existing project (or create a new one)",-1),he=(0,a.Lk)("li",null,"APIs & Auth -> Enable BigQuery",-1),ve=(0,a.Lk)("li",null,"Credentials -> Create new Client ID -> Service Account",-1),me=(0,a.Lk)("li",null,[(0,a.eW)("Download the JSON keyfile and either save it to a path, ie: "),(0,a.Lk)("code",null,"/home/huginn/Huginn-5d12345678cd.json"),(0,a.eW)(", or copy the value of "),(0,a.Lk)("code",null,"private_key"),(0,a.eW)(" from the file.")],-1),ke=(0,a.Lk)("li",null,"Grant that service account access to the BigQuery datasets and tables you want to query.",-1),be=(0,a.Fv)('

    The JSON keyfile you downloaded earlier should look like this:

    {\n  "type": "service_account",\n  "project_id": "huginn-123123",\n  "private_key_id": "6d6b476fc6ccdb31e0f171991e5528bb396ffbe4",\n  "private_key": "-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n",\n  "client_email": "huginn@huginn-123123.iam.gserviceaccount.com",\n  "client_id": "123123...123123",\n  "auth_uri": "https://accounts.google.com/o/oauth2/auth",\n  "token_uri": "https://accounts.google.com/o/oauth2/token",\n  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",\n  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/huginn%40huginn-123123.iam.gserviceaccount.com"\n}\n

    Agent Configuration:

    project_id - The id of the Google Cloud project.

    ',4),fe=(0,a.Lk)("code",null,"query",-1),ye={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},qe=(0,a.Lk)("p",null,[(0,a.Lk)("code",null,"use_legacy"),(0,a.eW)(" - Whether or not to use BigQuery legacy SQL or standard SQL. (Defaults to "),(0,a.Lk)("code",null,"false"),(0,a.eW)(")")],-1),Le=(0,a.Lk)("code",null,"max",-1),_e={href:"https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/google-cloud-bigquery/v0.27.0/google/cloud/bigquery/project",target:"_blank",rel:"noopener noreferrer"},we=(0,a.Fv)("

    timeout - How long to wait for query to complete (in ms). Defaults to 10000.

    event_per_row - Whether to create one Event per row returned, or one event with all rows as results. Defaults to false.

    Authorization

    keyfile - (String) The path (relative to where Huginn is running) to the JSON keyfile downloaded in step 5 above.

    Alternately, keyfile can be a hash:

    ",5),Ae=(0,a.Lk)("code",null,"keyfile",-1),xe=(0,a.Lk)("code",null,"private_key",-1),We=(0,a.Lk)("code",null,"private_key",-1),Se={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Ee=(0,a.Lk)("code",null,"{% credential google-bigquery-key %}",-1),Te=(0,a.Fv)('

    keyfile client_email - The value of client_email from the downloaded file. Same as the service account email.


    Boxcar Agent - iPhone 通知栏 app

    Receives events

    Boxcar agent 会在 iPhone 推送通知,但其不兼容于 iOS 10 系统,已经停止更新。

    To be able to use the Boxcar end-user API, you need your Access Token. The access token is available on general “Settings” screen of Boxcar iOS app or from Boxcar Web Inbox settings page.

    Please provide your access token in the user_credentials option. If you'd like to use a credential, set the user_credentials option to {% credential CREDENTIAL_NAME %}.

    Options:

    • user_credentials - Boxcar access token.
    • title - Title of the message.
    • body - Body of the message.
    • source_name - Name of the source of the message. Set to Huginn by default.
    • icon_url - URL to the icon.
    • sound - Sound to be played for the notification. Set to ‘bird-1’ by default.

    Change Detector Agent - 监测数据变化

    Creates events Receives events

    The Change Detector Agent receives a stream of events and emits a new event when a property of the received event changes. Change Detector Agent 会接收数据流内容,并在监测到数据属性改变后,传递出新事件。

    ',13),De=(0,a.Lk)("code",null,"property",-1),Fe={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Re=(0,a.Lk)("code",null,"last_property",-1),Ce=(0,a.Lk)("code",null,"{% assign drop = last_property | minus: price %}{% if last_property == blank or drop > 0 %}{{ price | default: last_property }}{% else %}{{ last_property }}{% endif %}",-1),He=(0,a.Fv)('

    expected_update_period_in_days is used to determine if the Agent is working.

    The resulting event will be a copy of the received event.


    Commander Agent - 触发命令

    Receives events Controls agents

    Commander Agent 由时间表或传入事件触发,并触发其他 agents 运行,禁用,配置或启用自己。

    Action types

    Set action to one of the action types below:

    • run: Target Agents are run when this agent is triggered.

    • disable: Target Agents are disabled (if not) when this agent is triggered.

    • enable: Target Agents are enabled (if not) when this agent is triggered.

    • configure: Target Agents have their options updated with the contents of configure_options.

    ',9),Ie={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Pe=(0,a.Fv)('
    • To create a CommanderAgent that receives an event from a WeatherAgent every morning to kick an agent flow that is only useful in a nice weather, try this: {% if conditions contains 'Sunny' or conditions contains 'Cloudy' %} run{% endif %}

    • Likewise, if you have a scheduled agent flow specially crafted for rainy days, try this: {% if conditions contains 'Rain' %}enable{% else %}disabled{% endif %}

    • If you want to update a WeatherAgent based on a UserLocationAgent, you could use 'action': 'configure' and set 'configure*options' to { 'location': '{{\\_location*.latlng}}' }.

    • In templating, you can use the variable target to refer to each target agent, which has the following attributes: name, options, sources, type, url, id, disabled, memory, controllers, schedule, keep_events_for, propagate_immediately, working, receivers, and control_targets.

    Targets

    Select Agents that you want to control from this CommanderAgent.


    Csv Agent - CSV 表格数据处理

    Creates events Receives events Consumes file pointer

    CsvAgent 可以解析或重构 CSV 表格数据。解析时,可以针对整个 CSV,也可以单独处理一行数据。

    Set mode to parse to parse CSV from incoming event, when set to serialize the agent serilizes the data of events to CSV.

    Universal options

    Specify the separator which is used to seperate the fields from each other (default is ,).

    data_key sets the key which contains the serialized CSV or parsed CSV data in emitted events.

    Parsing

    If use_fields is set to a comma seperated string and the CSV file contains field headers the agent will only extract the specified fields.

    output determines wheather one event per row is emitted or one event that includes all the rows.

    Set with_header to true if first line of the CSV file are field names.

    ',15),je=(0,a.Lk)("code",null,"FtpsiteAgent",-1),Ne=(0,a.Lk)("code",null,"LocalFileAgent",-1),Oe=(0,a.Lk)("code",null,"S3Agent",-1),Me={href:"https://github.com/huginn/huginn/wiki/How-Huginn-works-with-files",target:"_blank",rel:"noopener noreferrer"},Ue={href:"http://goessner.net/articles/JsonPath/",target:"_blank",rel:"noopener noreferrer"},Be=(0,a.Lk)("code",null,"data_path",-1),Ge=(0,a.Lk)("code",null,"data_path",-1),Ve=(0,a.Lk)("p",null,[(0,a.Lk)("strong",null,"Serializing")],-1),ze=(0,a.Lk)("p",null,[(0,a.eW)("If "),(0,a.Lk)("code",null,"use_fields"),(0,a.eW)(" is set to a comma seperated string and the first received event has a object at the specified "),(0,a.Lk)("code",null,"data_path"),(0,a.eW)(" the generated CSV will only include the given fields.")],-1),Ye=(0,a.Lk)("p",null,[(0,a.eW)("Set "),(0,a.Lk)("code",null,"with_header"),(0,a.eW)(" to "),(0,a.Lk)("code",null,"true"),(0,a.eW)(" to include a field header in the CSV.")],-1),Je={href:"http://goessner.net/articles/JsonPath/",target:"_blank",rel:"noopener noreferrer"},Ke=(0,a.Lk)("code",null,"data_path",-1),Qe=(0,a.Fv)('

    Data Output Agent - 网页输出数据(RSS)

    Receives events

    Data Output Agent 将传入的数据输入为 RSS 或 JSON,具体格式为“.xml”或“.json”。

    This Agent will output data at:

    https:///users/1/web_requests/:id/:secret.xml

    where :secret is one of the allowed secrets specified in your options and the extension can be xml or json.

    You can setup multiple secrets so that you can individually authorize external systems to access your Huginn data.

    Options:

    ',9),Xe=(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"secrets"),(0,a.eW)(" - An array of tokens that the requestor must provide for light-weight authentication.")],-1),$e=(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"expected_receive_period_in_days"),(0,a.eW)(" - How often you expect data to be received by this Agent from other Agents.")],-1),Ze=(0,a.Lk)("code",null,"template",-1),en={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},nn=(0,a.Lk)("code",null,"link",-1),sn=(0,a.Lk)("code",null,"title",-1),an=(0,a.Lk)("code",null,"description",-1),tn=(0,a.Lk)("code",null,"icon",-1),on=(0,a.Lk)("code",null,"",-1),ln=(0,a.Lk)("code",null,"self",-1),cn=(0,a.Lk)("code",null,"item",-1),rn=(0,a.Lk)("code",null,"pubDate",-1),pn=(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"events_to_show"),(0,a.eW)(" - The number of events to output in RSS or JSON. (default: "),(0,a.Lk)("code",null,"40"),(0,a.eW)(")")],-1),dn=(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"ttl"),(0,a.eW)(" - A value for the "),(0,a.Lk)("code",null,""),(0,a.eW)(" element in RSS output. (default: "),(0,a.Lk)("code",null,"60"),(0,a.eW)(")")],-1),un=(0,a.Lk)("code",null,"ns_media",-1),gn={href:"https://en.wikipedia.org/wiki/Media_RSS",target:"_blank",rel:"noopener noreferrer"},hn=(0,a.Lk)("code",null,"ns_itunes",-1),vn={href:"http://lists.apple.com/archives/syndication-dev/2005/Nov/msg00002.html",target:"_blank",rel:"noopener noreferrer"},mn=(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"rss_content_type"),(0,a.eW)(" - Content-Type for RSS output (default: "),(0,a.Lk)("code",null,"application/rss+xml"),(0,a.eW)(")")],-1),kn=(0,a.Lk)("li",null,[(0,a.Lk)("code",null,"response_headers"),(0,a.eW)(" - An object with any custom response headers. (example: "),(0,a.Lk)("code",null,'{"Access-Control-Allow-Origin": "*"}'),(0,a.eW)(")")],-1),bn=(0,a.Lk)("code",null,"push_hubs",-1),fn={href:"https://pubsubhubbub.superfeedr.com/",target:"_blank",rel:"noopener noreferrer"},yn={href:"https://pubsubhubbub.appspot.com/",target:"_blank",rel:"noopener noreferrer"},qn=(0,a.Lk)("code",null,"template.self",-1),Ln=(0,a.Fv)('

    If you'd like to output RSS tags with attributes, such as enclosure, use something like the following in your template:

    "enclosure": {\n  "_attributes": {\n    "url": "{{media_url}}",\n    "length": "1234456789",\n    "type": "audio/mpeg"\n  }\n},\n"another_tag": {\n  "_attributes": {\n    "key": "value",\n    "another_key": "another_value"\n  },\n  "_contents": "tag contents (can be an object for nesting)"\n}\n\n

    Ordering events

    To specify the order of events, set events_order to an array of sort keys, each of which looks like either expression or [expression, type, descending], as described as follows:

    • expression is a Liquid template to generate a string to be used as sort key.

    • type (optional) is one of string (default), number and time, which specifies how to evaluate expression for comparison.

    • descending (optional) is a boolean value to determine if comparison should be done in descending (reverse) order, which defaults to false.

    Sort keys listed earlier take precedence over ones listed later. For example, if you want to sort articles by the date and then by the author, specify [["{{date}}", "time"], "{{author}}"].

    Sorting is done stably, so even if all events have the same set of sort key values the original order is retained. Also, a special Liquid variable _index_ is provided, which contains the zero-based index number of each event, which means you can exactly reverse the order of events by specifying [["{{_index_}}", "number", true]].

    DataOutputAgent will select the last events_to_show entries of its received events sorted in the order specified by events_order, which is defaulted to the event creation time. So, if you have multiple source agents that may create many events in a run, you may want to either increase events_to_show to have a larger "window", or specify the events_order option to an appropriate value (like date_published) so events from various sources are properly mixed in the resulted feed.

    There is also an option events_list_order that only controls the order of events listed in the final output, without attempting to maintain a total order of received events. It has the same format as events_order and is defaulted to [["{{_index_}}","number",true]] so the selected events are listed in reverse order like most popular RSS feeds list their articles.

    Liquid Templating

    ',10),_n={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},wn=(0,a.Fv)('
    • events: An array of events being output, sorted in the given order, up to events_to_show in number. For example, if source events contain a site title in the site_title key, you can refer to it in template.title by putting {{events.first.site_title}}.

    De Duplication Agent - 数据去重

    Creates events Receives events

    De-duplication Agent 在接受数据后,会自动比对并去除重复数据。

    property the value that should be used to determine the uniqueness of the event (empty to use the whole payload)

    lookback amount of past Events to compare the value to (0 for unlimited)

    expected_update_period_in_days is used to determine if the Agent is working.


    Delay Agent - 缓冲存储区

    Creates events Receives events

    Delay Agent 存储收到的事件,并按计划发送它们的副本。将其用作事件的缓冲区或队列。

    max_events should be set to the maximum number of events that you'd like to hold in the buffer. When this number is reached, new events will either be ignored, or will displace the oldest event already in the buffer, depending on whether you set keep to newest or oldest.

    expected_receive_period_in_days is used to determine if the Agent is working. Set it to the maximum number of days that you anticipate passing without this Agent receiving an incoming Event.

    max_emitted_events is used to limit the number of the maximum events which should be created. If you omit this DelayAgent will create events for every event stored in the memory.


    Digest Agent - 摘要汇总 - 未理解

    Creates events Receives events

    Digest Agent 收集发送给它的任何事件并将其作为单个事件发出。

    ',19),An=(0,a.Lk)("code",null,"message",-1),xn=(0,a.Lk)("code",null,"message",-1),Wn={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Sn=(0,a.Fv)('

    Set expected_receive_period_in_days to the maximum amount of time that you'd expect to pass between Events being received by this Agent.

    If retained_events is set to 0 (the default), all received events are cleared after a digest is sent. Set retained_events to a value larger than 0 to keep a certain number of events around on a rolling basis to re-send in future digests.

    For instance, say retained_events is set to 3 and the Agent has received Events 5, 4, and 3. When a digest is sent, Events 5, 4, and 3 are retained for a future digest. After Event 6 is received, the next digest will contain Events 6, 5, and 4.


    Dkt Clustering Agent - 数据挖掘算法?

    ',5),En=(0,a.Lk)("code",null,"Creates events",-1),Tn=(0,a.Lk)("code",null,"Receives events",-1),Dn=(0,a.Lk)("code",null,"Consumes file pointer",-1),Fn=(0,a.Lk)("code",null,"Dry runs",-1),Rn={href:"http://huginnio.herokuapp.com/agent_gems#huginn_dkt_curation_agents",target:"_blank",rel:"noopener noreferrer"},Cn=(0,a.Lk)("p",null,[(0,a.eW)("The "),(0,a.Lk)("code",null,"DktClusteringAgent"),(0,a.eW)(" clusters the input document collection. The document collection first has to be converted to a set of vectors. DktClusteringAgent 会对输入文档集合进行聚类,文档集合首先必须被转换成一组向量。输入文档需要为特定格式,DktClusteringAgent 会在这个输入数据中查找集群。输入会包含查找到的集群数量和找到的集群特定值的信息。")],-1),Hn=(0,a.Lk)("p",null,"The Agent expects the input in this particular format and then proceeds to find clusters in this input data. The output contains information on the number of clusters found and specific values for the found clusters.",-1),In=(0,a.Lk)("code",null,"/e-clustering/generateClusters",-1),Pn={href:"https://github.com/dkt-projekt/e-Clustering#e-clustering-1",target:"_blank",rel:"noopener noreferrer"},jn={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Nn=(0,a.Lk)("p",null,[(0,a.Lk)("code",null,"url"),(0,a.eW)(" allows to customize the endpoint of the API when hosting the DKT services elswhere.")],-1),On=(0,a.Lk)("code",null,"body",-1),Mn={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},Un={href:"http://www.cs.waikato.ac.nz/ml/weka/arff.html",target:"_blank",rel:"noopener noreferrer"},Bn=(0,a.Fv)("

    language language of the source data

    algorithm: the algorithm to be used during clustering. Currently EM and Kmeans are supported.

    merge set to true to retain the received payload and update it with the extracted result

    result_key when present the emitted Event data will be nested inside the specified key

    When receiving a file pointer:

    body will be ignored and the contents of the received file will be send instead.

    ",6),Gn=(0,a.Lk)("code",null,"FtpsiteAgent",-1),Vn=(0,a.Lk)("code",null,"LocalFileAgent",-1),zn=(0,a.Lk)("code",null,"S3Agent",-1),Yn={href:"https://github.com/huginn/huginn/wiki/How-Huginn-works-with-files",target:"_blank",rel:"noopener noreferrer"},Jn=(0,a.Lk)("hr",null,null,-1),Kn=(0,a.Lk)("h3",{id:"dropbox-file-url",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#dropbox-file-url"},[(0,a.Lk)("span",null,"Dropbox File Url")])],-1),Qn=(0,a.Lk)("p",null,[(0,a.Lk)("code",null,"Agent Creates"),(0,a.eW)(),(0,a.Lk)("code",null,"events Receives events"),(0,a.eW)(),(0,a.Lk)("code",null,"Dry runs"),(0,a.eW)(),(0,a.Lk)("code",null,"Dropbox oauth2")],-1),Xn={href:"https://www.dropbox.com/developers/core/docs#media",target:"_blank",rel:"noopener noreferrer"},$n={href:"https://www.dropbox.com/developers/core/docs#shares",target:"_blank",rel:"noopener noreferrer"},Zn=(0,a.Fv)('

    Include the dropbox-api and omniauth-dropbox gems in your Gemfile and set DROPBOX_OAUTH_KEY and DROPBOX_OAUTH_SECRET in your environment to use Dropbox Agents.

    The incoming event payload needs to have a paths key, with a comma-separated list of files you want the URL for. For example:

    {\n  "paths": "first/path, second/path"\n}\n

    TIP: You can use the Event Formatting Agent to format events before they come in. Here’s an example configuration for formatting an event coming out of a Dropbox Watch Agent:

    {\n  "instructions": {\n    "paths": "{{ added | map: 'path' | join: ',' }}"\n  },\n  "matchers": [],\n  "mode": "clean"\n}\n

    An example of usage would be to watch a specific Dropbox directory (with the DropboxWatchAgent) and get the URLs for the added or updated files. You could then, for example, send emails with those links.

    Set link_type to 'temporary' if you want temporary links, or to 'permanent' for permanent ones.


    Dropbox Watch Agent

    Creates events Dropbox oauth2

    Dropbox Watch Agent 监测给定值dir_to_watch并发出检测到的更改的事件。

    Include the dropbox-api and omniauth-dropbox gems in your Gemfile and set DROPBOX_OAUTH_KEY and DROPBOX_OAUTH_SECRET in your environment to use Dropbox Agents.


    Email Agent

    Email Agent 将刚收到的信息 Receives events,以邮件形式发送通知。

    ',15),es=(0,a.Lk)("code",null,"subject",-1),ns={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},ss=(0,a.Lk)("code",null,'"Huginn email"',-1),as=(0,a.Lk)("code",null,"{{subject}}",-1),ts=(0,a.Lk)("code",null,"subject",-1),os=(0,a.Fv)('

    默认情况下,邮件正文将包含一个可选的 "标题",然后是事件的键的列表。

    你可以通过加入可选的body参数来定制邮件正文。像subject一样,body可以是一个简单的信息或一个液体模板。你可以只发送事件的some_text字段,body设置为{{ some_text }}。身体可以包含简单的 HTML,并将被净化。注意,当使用body时,它将被<html><body>标签包裹,所以你不需要自己添加这些。

    你可以为邮件指定一个或多个 "收件人",或者跳过这个选项,以便将邮件发送到你的账户的默认邮件地址。

    你可以为邮件提供一个from地址,或者留空,默认为EMAIL_FROM_ADDRESS (``) 的值。

    你可以为邮件提供一个content_type,并指定发送text/plaintext/html。如果你不指定content_type,那么收件人的邮件服务器将决定正确的渲染方式。

    设置expected_receive_period_in_days为您希望该代理收到事件之间的最大时间。


    Email Digest Agent - 邮件摘要

    Receives events

    Email Digest Agent 收集发送给它的任何事件,并按计划通过电子邮件发送。使用事件的数目与 Keep events 有关,这意味着如果事件在 Email Digest Agent 计划运行之前到期,它们将不会出现在电子邮件中。

    By default, the will have a subject and an optional headline before listing the Events. If the Events' payloads contain a message, that will be highlighted, otherwise everything in their payloads will be shown.

    You can specify one or more recipients for the email, or skip the option in order to send the email to your account's default email address.

    You can provide a from address for the email, or leave it blank to default to the value of EMAIL_FROM_ADDRESS (``).

    You can provide a content_type for the email and specify text/plain or text/html to be sent. If you do not specify content_type, then the recipient email server will determine the correct rendering.

    Set expected_receive_period_in_days to the maximum amount of time that you'd expect to pass between Events being received by this Agent.


    Evernote Agent

    Creates events Receives events Evernote

    Evernote Agent 与你的 Evernote 账户相连,新建笔记。

    ',19),is={href:"https://dev.evernote.com/doc/",target:"_blank",rel:"noopener noreferrer"},ls={href:"https://sandbox.evernote.com/Registration.action",target:"_blank",rel:"noopener noreferrer"},cs={href:"http://huginnio.herokuapp.com/services",target:"_blank",rel:"noopener noreferrer"},rs=(0,a.Fv)('

    Options:

    • mode - Two possible values:

      • update Based on events it receives, the agent will create notes or update notes with the same title and notebook

      • read On a schedule, it will generate events containing data for newly added or updated notes

    • include_xhtml_content - Set to true to include the content in ENML (Evernote Markup Language) of the note

    • note

      • When mode is update the parameters of note are the attributes of the note to be added/edited. To edit a note, both title and notebook must be set.

        For example, to add the tags 'comic' and 'CS' to a note titled 'xkcd Survey' in the notebook 'xkcd', use:

        "notes": {\n  "title": "xkcd Survey",\n  "content": "",\n  "notebook": "xkcd",\n  "tagNames": "comic, CS"\n}\n

        If a note with the above title and notebook did note exist already, one would be created.

      • When mode is read the values are search parameters. Note: The content parameter is not used for searching. Setting title only filters notes whose titles contain title as a substring, not as the exact title.

        For example, to find all notes with tag 'CS' in the notebook 'xkcd', use:

        "notes": {\n  "title": "",\n  "content": "",\n  "notebook": "xkcd",\n  "tagNames": "CS"\n}\n

    Freme Explore Agent - SPARQL-数据断点?

    ',4),ps=(0,a.Lk)("code",null,"Creates events",-1),ds=(0,a.Lk)("code",null,"Receives events",-1),us=(0,a.Lk)("code",null,"Dry runs",-1),gs={href:"http://huginnio.herokuapp.com/agent_gems#huginn_freme_enrichment_agents",target:"_blank",rel:"noopener noreferrer"},hs=(0,a.Lk)("p",null,[(0,a.eW)("The "),(0,a.Lk)("code",null,"FremeExploreAgent"),(0,a.eW)(" can retrieve description of a resource from a given endpoint. The endpoint can be SPARQL or Linked Data Fragments endpoint. FremeExploreAgent 可以检索给定端点的资源描述。端点可以是 SPARQL 或 Linked Data Fragments 端点。")],-1),vs=(0,a.Lk)("code",null,"/e-link/explore",-1),ms={href:"http://api.freme-project.eu/doc/current/api-doc/full.html#!/e-Link/explore",target:"_blank",rel:"noopener noreferrer"},ks={href:"https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},bs=(0,a.Fv)("

    base_url allows to customize the API server when hosting the FREME services elswhere.

    auth_token can be set to access private filters, datasets, templates or pipelines (depending on the agent).

    outformat requested RDF serialization format of the output (required), CSV is only supported when using a filter.

    resource a URI of the resource which should be described (required).

    endpoint a URL of the endpoint which should be used to retrieve info about the resource.

    endpoint_type the type of the endpoint (required).

    ",6),fs=(0,a.Lk)("code",null,"filter",-1),ys={href:"http://api.freme-project.eu/doc/current/knowledge-base/freme-for-api-users/filtering.html",target:"_blank",rel:"noopener noreferrer"},qs=(0,a.Fv)('

    merge set to true to retain the received payload and update it with the extracted result

    result_key when present the emitted Event data will be nested inside the specified key


    Ftpsite Agent

    Creates events Receives events Emits file pointer

    Ftp Site Agent 检查 FTP 站点,并根据目录中新上载的文件创建事件。当接收到事件时,它会在配置的 FTP 服务器上创建文件。

    mode must be present and either read or write, in read mode the agent checks the FTP site for changed files, with write it writes received events to a file on the server.

    Universal options

    Specify a url that represents a directory of an FTP site to watch, and a list of patterns to match against file names.

    Login credentials can be included in url if authentication is required: ftp://username:password@ftp.example.com/path. Liquid formatting is supported as well: ftp://{% credential ftp_credentials %}@ftp.example.com/

    Optionally specify the encoding of the files you want to read/write in force_encoding, by default UTF-8 is used.

    Reading

    Only files with a last modification time later than the after value, if specifed, are emitted as event.

    Writing

    Specify the filename to use in filename, Liquid interpolation is possible to change the name per event.

    ',15),Ls={href:"https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid",target:"_blank",rel:"noopener noreferrer"},_s=(0,a.Lk)("code",null,"data",-1),ws=(0,a.Lk)("code",null,"CsvAgent",-1),As=(0,a.Lk)("code",null,"PostAgent",-1),xs=(0,a.Lk)("code",null,"ReadFileAgent",-1),Ws={href:"https://github.com/huginn/huginn/wiki/How-Huginn-works-with-files",target:"_blank",rel:"noopener noreferrer"},Ss=(0,a.Lk)("hr",{class:"footnotes-sep"},null,-1),Es={class:"footnotes"},Ts={class:"footnotes-list"},Ds={id:"footnote1",class:"footnote-item"},Fs={href:"https://blog.csdn.net/qq_36822217/article/details/103156327",target:"_blank",rel:"noopener noreferrer"},Rs=(0,a.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Cs={id:"footnote2",class:"footnote-item"},Hs={href:"https://github.com/huginn/huginn/issues/2410",target:"_blank",rel:"noopener noreferrer"},Is=(0,a.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),Ps={id:"footnote3",class:"footnote-item"},js={href:"https://github.com/huginn/huginn/issues/1618",target:"_blank",rel:"noopener noreferrer"},Ns=(0,a.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),Os={},Ms=(0,s(3671).A)(Os,[["render",function(e,n){const s=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("Huginn 部署:查看 "),(0,a.Lk)("a",o,[(0,a.eW)("deploy Huginn inside of Docker"),(0,a.bF)(s)]),(0,a.eW)(" 和 "),(0,a.Lk)("a",i,[(0,a.eW)(".env 设置"),(0,a.bF)(s)]),(0,a.eW)(",或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。")]),(0,a.Lk)("li",null,[(0,a.eW)("Huginn 抓取教程:"),(0,a.Lk)("a",l,[(0,a.eW)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,a.bF)(s)])])]),c,(0,a.Lk)("p",null,[(0,a.Lk)("a",r,[(0,a.eW)("Huginn Agents"),(0,a.bF)(s)]),(0,a.eW)(":")]),p,(0,a.Lk)("p",null,[(0,a.eW)((0,t.v_)(e.created_at)+" 为自带抓取时间,Agent 设置中的特殊字符",1),d,(0,a.eW)(",需要用反义符"),u,(0,a.eW)("。")]),g,(0,a.Lk)("p",null,[(0,a.eW)("部署环境:Ubuntu 18.04 的 Docker 镜像(同样适用于服务器) 安装参考:"),(0,a.Lk)("a",h,[(0,a.eW)("Manual Installation on Debian/Ubuntu"),(0,a.bF)(s)]),(0,a.eW)(","),(0,a.Lk)("a",v,[(0,a.eW)("Novice-setup-guide"),(0,a.bF)(s)]),(0,a.eW)(" 手动升级:"),(0,a.Lk)("a",m,[(0,a.eW)("manual Update"),(0,a.bF)(s)])]),k,(0,a.Lk)("p",null,[b,(0,a.eW)(" 设置 huginn 环境依赖,更多选项查看 "),(0,a.Lk)("a",f,[(0,a.eW)(".env 设置案例"),(0,a.bF)(s)]),(0,a.eW)("。编辑器为上面安装的 vim,"),y,(0,a.eW)(" 在光标所在的位置插入,"),q,(0,a.eW)(" 退出编辑,"),L,(0,a.eW)(" 保存并退出。")]),_,(0,a.Lk)("p",null,[(0,a.eW)("Huginn "),(0,a.Lk)("a",w,[(0,a.eW)("multi-process"),(0,a.bF)(s)]),(0,a.eW)(" 镜像基于 Ubuntu 18.04,没有 root 权限。如果不导出卷,或者使用单独的数据库容器,则无法在不丢失数据的情况下更新 Huginn。可以手动设置数据库对外端口和外部存储路径。")]),A,(0,a.Lk)("p",null,[(0,a.eW)("Event Formatting Agent 允许您格式化传入的事件,根据需要添加新的字段。可以用正则来替换输入中的某些元素。具体样例参考,"),(0,a.Lk)("a",x,[(0,a.eW)("新京报 #5 清理版面字段格式"),(0,a.bF)(s)]),(0,a.eW)("。")]),W,(0,a.Lk)("p",null,[(0,a.eW)("Have a look at the "),(0,a.Lk)("a",S,[(0,a.eW)("Wiki"),(0,a.bF)(s)]),(0,a.eW)(" to learn more about liquid templating.")]),E,(0,a.Lk)("p",null,[(0,a.eW)("Adioso Agent 可以查询两个城市间,在指定时间内的最低飞机票价格。机票价格货币是美元。查询日期 "),T,(0,a.eW)(" 和 "),D,(0,a.eW)(" 之间的差异需小于 150 天。需要注册 "),(0,a.Lk)("a",F,[(0,a.eW)("Adioso"),(0,a.bF)(s)]),(0,a.eW)(",并在 "),R,(0,a.eW)(" and "),C,(0,a.eW)(" 中输入。")]),H,I,P,j,(0,a.Lk)("p",null,[(0,a.eW)("操作说明: Provide the "),N,(0,a.eW)(" for the API endpoint that you’d like to hit. For example, for all active packages, enter "),O,(0,a.eW)(" (see "),(0,a.Lk)("a",M,[(0,a.eW)("https://www.aftership.com/docs/api/4/trackings"),(0,a.bF)(s)]),(0,a.eW)("), for a specific package, use "),U,(0,a.eW)(" and replace "),B,(0,a.eW)(" with a courier code and "),G,(0,a.eW)(" with the tracking number. You can request last checkpoint of a package by providing "),V,(0,a.eW)(" instead.")]),z,Y,J,K,Q,(0,a.Lk)("p",null,[X,(0,a.eW)(),$,(0,a.eW)(),Z,(0,a.Lk)("a",ee,[(0,a.eW)("huginn_algorithmia_agent"),(0,a.bF)(s)])]),(0,a.Lk)("p",null,[(0,a.eW)("AlgoritmiaAgent 运行 Algorithmia 中的算法。在使用此代理之前,您需要注册一个"),(0,a.Lk)("a",ne,[(0,a.eW)("Algorithmia"),(0,a.bF)(s)]),(0,a.eW)("帐户。")]),se,(0,a.Lk)("p",null,[(0,a.eW)("To be able to use this Agent you need to authenticate with 37signals in the "),(0,a.Lk)("a",ae,[(0,a.eW)("Services"),(0,a.bF)(s)]),(0,a.eW)(" section first.")]),te,oe,(0,a.Lk)("p",null,[ie,(0,a.eW)(),le,(0,a.eW)(),ce,(0,a.Lk)("a",re,[(0,a.eW)("huginn_bigquery_agent"),(0,a.bF)(s)])]),pe,de,(0,a.Lk)("ol",null,[(0,a.Lk)("li",null,[(0,a.eW)("Visit "),(0,a.Lk)("a",ue,[(0,a.eW)("the google api console"),(0,a.bF)(s)])]),ge,he,ve,me,ke]),be,(0,a.Lk)("p",null,[fe,(0,a.eW)(" - The BigQuery query to run. "),(0,a.Lk)("a",ye,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" formatting is supported to run queries based on receiving events.")]),qe,(0,a.Lk)("p",null,[Le,(0,a.eW)(" - Maximum number of rows to return. Defaults to unlimited, but results are always "),(0,a.Lk)("a",_e,[(0,a.eW)("limited to 10 MB"),(0,a.bF)(s)]),(0,a.eW)(".")]),we,(0,a.Lk)("p",null,[Ae,(0,a.eW)(),xe,(0,a.eW)(" - The private key (value of "),We,(0,a.eW)(" from the downloaded file). "),(0,a.Lk)("a",Se,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" formatting is supported if you want to use a Credential. (E.g., "),Ee,(0,a.eW)(")")]),Te,(0,a.Lk)("p",null,[De,(0,a.eW)(" specifies a "),(0,a.Lk)("a",Fe,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" template that expands to the property to be watched, where you can use a variable "),Re,(0,a.eW)(" for the last property value. If you want to detect a new lowest price, try this: "),Ce]),He,(0,a.Lk)("p",null,[(0,a.eW)("Here's a tip: you can use "),(0,a.Lk)("a",Ie,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" templating to dynamically determine the action type. For example:")]),Pe,(0,a.Lk)("p",null,[(0,a.eW)("This agent can consume a ‘file pointer’ event from the following agents with no additional configuration: "),je,(0,a.eW)(", "),Ne,(0,a.eW)(", "),Oe,(0,a.eW)(". Read more about the concept in the "),(0,a.Lk)("a",Me,[(0,a.eW)("wiki"),(0,a.bF)(s)]),(0,a.eW)(".")]),(0,a.Lk)("p",null,[(0,a.eW)("When receiving the CSV data in a regular event use "),(0,a.Lk)("a",Ue,[(0,a.eW)("JSONPath"),(0,a.bF)(s)]),(0,a.eW)(" to select the path in "),Be,(0,a.eW)(". "),Ge,(0,a.eW)(" is only used when the received event does not contain a 'file pointer'.")]),Ve,ze,Ye,(0,a.Lk)("p",null,[(0,a.eW)("Use "),(0,a.Lk)("a",Je,[(0,a.eW)("JSONPath"),(0,a.bF)(s)]),(0,a.eW)(" in "),Ke,(0,a.eW)(" to select with part of the received events should be serialized.")]),Qe,(0,a.Lk)("ul",null,[Xe,$e,(0,a.Lk)("li",null,[Ze,(0,a.eW)(" - A JSON object representing a mapping between item output keys and incoming event values. Use "),(0,a.Lk)("a",en,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" to format the values. Values of the "),nn,(0,a.eW)(", "),sn,(0,a.eW)(", "),an,(0,a.eW)(" and "),tn,(0,a.eW)(" keys will be put into the "),on,(0,a.eW)(" section of RSS output. Value of the "),ln,(0,a.eW)(" key will be used as URL for this feed itself, which is useful when you serve it via reverse proxy. The "),cn,(0,a.eW)(" key will be repeated for every Event. The "),rn,(0,a.eW)(" key for each item will have the creation time of the Event unless given.")]),pn,dn,(0,a.Lk)("li",null,[un,(0,a.eW)(" - Add "),(0,a.Lk)("a",gn,[(0,a.eW)("yahoo media namespace"),(0,a.bF)(s)]),(0,a.eW)(" in output xml")]),(0,a.Lk)("li",null,[hn,(0,a.eW)(" - Add "),(0,a.Lk)("a",vn,[(0,a.eW)("itunes compatible namespace"),(0,a.bF)(s)]),(0,a.eW)(" in output xml")]),mn,kn,(0,a.Lk)("li",null,[bn,(0,a.eW)(" - Set to a list of PubSubHubbub endpoints you want to publish an update to every time this agent receives an event. (default: none) Popular hubs include "),(0,a.Lk)("a",fn,[(0,a.eW)("Superfeedr"),(0,a.bF)(s)]),(0,a.eW)(" and "),(0,a.Lk)("a",yn,[(0,a.eW)("Google"),(0,a.bF)(s)]),(0,a.eW)(". Note that publishing updates will make your feed URL known to the public, so if you want to keep it secret, set up a reverse proxy to serve your feed via a safe URL and specify it in "),qn,(0,a.eW)(".")])]),Ln,(0,a.Lk)("p",null,[(0,a.eW)("In "),(0,a.Lk)("a",_n,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" templating, the following variable is available:")]),wn,(0,a.Lk)("p",null,[(0,a.eW)("The resulting Event will have a payload message of "),An,(0,a.eW)(". You can use liquid templating in the "),xn,(0,a.eW)(", have a look at the "),(0,a.Lk)("a",Wn,[(0,a.eW)("Wiki"),(0,a.bF)(s)]),(0,a.eW)(" for details.")]),Sn,(0,a.Lk)("p",null,[En,(0,a.eW)(),Tn,(0,a.eW)(),Dn,(0,a.eW)(),Fn,(0,a.Lk)("a",Rn,[(0,a.eW)("huginn_dkt_curation_agents"),(0,a.bF)(s)]),(0,a.eW)(" 使用 DKT APIs,其中含有多个 agents,具体查看上方链接。")]),Cn,Hn,(0,a.Lk)("p",null,[(0,a.eW)("The Agent accepts all configuration options of the "),In,(0,a.eW)(" endpoint as of september 2016, have a look at the "),(0,a.Lk)("a",Pn,[(0,a.eW)("offical documentation"),(0,a.bF)(s)]),(0,a.eW)(" if you need additional information")]),(0,a.Lk)("p",null,[(0,a.eW)("All Agent configuration options are interpolated using "),(0,a.Lk)("a",jn,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" in the context of the received event.")]),Nn,(0,a.Lk)("p",null,[On,(0,a.eW)(" use "),(0,a.Lk)("a",Mn,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" templating to specify the input .arff file. See "),(0,a.Lk)("a",Un,[(0,a.eW)("http://www.cs.waikato.ac.nz/ml/weka/arff.html"),(0,a.bF)(s)]),(0,a.eW)(" for an explanation of this format.")]),Bn,(0,a.Lk)("p",null,[(0,a.eW)("This agent can consume a ‘file pointer’ event from the following agents with no additional configuration: "),Gn,(0,a.eW)(", "),Vn,(0,a.eW)(", "),zn,(0,a.eW)(". Read more about the concept in the "),(0,a.Lk)("a",Yn,[(0,a.eW)("wiki"),(0,a.bF)(s)]),(0,a.eW)(".")]),Jn,Kn,Qn,(0,a.Lk)("p",null,[(0,a.eW)("DropboxFileUrlAgent 用于使用 Dropbox。它需要一个文件路径(或多个文件路径),并通过"),(0,a.Lk)("a",Xn,[(0,a.eW)("临时链接"),(0,a.bF)(s)]),(0,a.eW)("或"),(0,a.Lk)("a",$n,[(0,a.eW)("永久链接"),(0,a.bF)(s)]),(0,a.eW)("发送事件。")]),Zn,(0,a.Lk)("p",null,[(0,a.eW)("你可以通过提供"),es,(0,a.eW)("选项来指定邮件的主题行,该选项可以包含"),(0,a.Lk)("a",ns,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)("的格式。例如,你可以提供"),ss,(0,a.eW)("来设置一个简单的主题,或者"),as,(0,a.eW)("来使用传入事件中的"),ts,(0,a.eW)("键。")]),os,(0,a.Lk)("p",null,[(0,a.eW)("Visit "),(0,a.Lk)("a",is,[(0,a.eW)("Evernote"),(0,a.bF)(s)]),(0,a.eW)(" to set up an Evernote app and receive an api key and secret. Store these in the Evernote environment variables in the .env file. You will also need to create a "),(0,a.Lk)("a",ls,[(0,a.eW)("Sandbox"),(0,a.bF)(s)]),(0,a.eW)(" account to use during development.")]),(0,a.Lk)("p",null,[(0,a.eW)("Next, you'll need to authenticate with Evernote in the "),(0,a.Lk)("a",cs,[(0,a.eW)("Services"),(0,a.bF)(s)]),(0,a.eW)(" section.")]),rs,(0,a.Lk)("p",null,[ps,(0,a.eW)(),ds,(0,a.eW)(),us,(0,a.eW)(),(0,a.Lk)("a",gs,[(0,a.eW)("huginn_freme_enrichment_agents"),(0,a.bF)(s)]),(0,a.eW)(" 使用 FREME APIs,其中含有多个 agents,具体查看上方链接。")]),hs,(0,a.Lk)("p",null,[(0,a.eW)("The Agent accepts all configuration options of the "),vs,(0,a.eW)(" endpoint as of September 2016, have a look at the "),(0,a.Lk)("a",ms,[(0,a.eW)("offical documentation"),(0,a.bF)(s)]),(0,a.eW)(" if you need additional information.")]),(0,a.Lk)("p",null,[(0,a.eW)("All Agent configuration options are interpolated using "),(0,a.Lk)("a",ks,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" in the context of the received event.")]),bs,(0,a.Lk)("p",null,[fs,(0,a.eW)(" allows to post-process the results using a pre-configured SPARQL filter. Check the "),(0,a.Lk)("a",ys,[(0,a.eW)("official documentation"),(0,a.bF)(s)]),(0,a.eW)(" for details.")]),qs,(0,a.Lk)("p",null,[(0,a.eW)("Use "),(0,a.Lk)("a",Ls,[(0,a.eW)("Liquid"),(0,a.bF)(s)]),(0,a.eW)(" templating in "),_s,(0,a.eW)(" to specify which part of the received event should be written.")]),(0,a.Lk)("p",null,[(0,a.eW)("This agent only emits a ‘file pointer’, not the data inside the files, the following agents can consume the created events: "),ws,(0,a.eW)(", "),As,(0,a.eW)(", "),xs,(0,a.eW)(". Read more about the concept in the "),(0,a.Lk)("a",Ws,[(0,a.eW)("wiki"),(0,a.bF)(s)]),(0,a.eW)(".")]),Ss,(0,a.Lk)("section",Es,[(0,a.Lk)("ol",Ts,[(0,a.Lk)("li",Ds,[(0,a.Lk)("p",null,[(0,a.Lk)("a",Fs,[(0,a.eW)("ERROR 2002 (HY000)"),(0,a.bF)(s)]),(0,a.eW)(),Rs])]),(0,a.Lk)("li",Cs,[(0,a.Lk)("p",null,[(0,a.Lk)("a",Hs,[(0,a.eW)("rake export hangs"),(0,a.bF)(s)]),(0,a.eW)(),Is])]),(0,a.Lk)("li",Ps,[(0,a.Lk)("p",null,[(0,a.Lk)("a",js,[(0,a.eW)("Huginn failed to restart after installed node and systemd"),(0,a.bF)(s)]),(0,a.eW)(),Ns])])])])])}]]),Us=JSON.parse('{"path":"/services/Huginn.html","title":"Huginn","lang":"zh-CN","frontmatter":{"article":false,"title":"Huginn","icon":"customize","order":3,"description":" Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) 常用 Agent Huginn Agents: Webs...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/Huginn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Huginn"}],["meta",{"property":"og:description","content":" Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) 常用 Agent Huginn Agents: Webs..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Huginn\\",\\"description\\":\\" Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。 Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) 常用 Agent Huginn Agents: Webs...\\"}"]]},"headers":[{"level":2,"title":"常用 Agent","slug":"常用-agent","link":"#常用-agent","children":[]},{"level":2,"title":"Huginn 部署","slug":"huginn-部署","link":"#huginn-部署","children":[{"level":3,"title":"Ubuntu 手动部署","slug":"ubuntu-手动部署","link":"#ubuntu-手动部署","children":[]},{"level":3,"title":"Huginn Docker","slug":"huginn-docker","link":"#huginn-docker","children":[]}]},{"level":2,"title":"Agents","slug":"agents","link":"#agents","children":[{"level":3,"title":"Trigger Agent","slug":"trigger-agent","link":"#trigger-agent","children":[]},{"level":3,"title":"Liquid Output Agent","slug":"liquid-output-agent","link":"#liquid-output-agent","children":[]},{"level":3,"title":"Event Formatting Agent","slug":"event-formatting-agent","link":"#event-formatting-agent","children":[]},{"level":3,"title":"Adioso Agent - 机票价格追踪","slug":"adioso-agent-机票价格追踪","link":"#adioso-agent-机票价格追踪","children":[]},{"level":3,"title":"Aftership Agent - 物流追踪-API 付费","slug":"aftership-agent-物流追踪-api-付费","link":"#aftership-agent-物流追踪-api-付费","children":[]},{"level":3,"title":"Algorithmia Agent - AI 算法","slug":"algorithmia-agent-ai-算法","link":"#algorithmia-agent-ai-算法","children":[]},{"level":3,"title":"Attribute Difference Agent - 属性差异(待深入理解)","slug":"attribute-difference-agent-属性差异-待深入理解","link":"#attribute-difference-agent-属性差异-待深入理解","children":[]},{"level":3,"title":"Basecamp Agent - Service 停用","slug":"basecamp-agent-service-停用","link":"#basecamp-agent-service-停用","children":[]},{"level":3,"title":"Bigquery Agent - 大型数据库分析","slug":"bigquery-agent-大型数据库分析","link":"#bigquery-agent-大型数据库分析","children":[]},{"level":3,"title":"Boxcar Agent - iPhone 通知栏 app","slug":"boxcar-agent-iphone-通知栏-app","link":"#boxcar-agent-iphone-通知栏-app","children":[]},{"level":3,"title":"Change Detector Agent - 监测数据变化","slug":"change-detector-agent-监测数据变化","link":"#change-detector-agent-监测数据变化","children":[]},{"level":3,"title":"Commander Agent - 触发命令","slug":"commander-agent-触发命令","link":"#commander-agent-触发命令","children":[]},{"level":3,"title":"Csv Agent - CSV 表格数据处理","slug":"csv-agent-csv-表格数据处理","link":"#csv-agent-csv-表格数据处理","children":[]},{"level":3,"title":"Data Output Agent - 网页输出数据(RSS)","slug":"data-output-agent-网页输出数据-rss","link":"#data-output-agent-网页输出数据-rss","children":[]},{"level":3,"title":"De Duplication Agent - 数据去重","slug":"de-duplication-agent-数据去重","link":"#de-duplication-agent-数据去重","children":[]},{"level":3,"title":"Delay Agent - 缓冲存储区","slug":"delay-agent-缓冲存储区","link":"#delay-agent-缓冲存储区","children":[]},{"level":3,"title":"Digest Agent - 摘要汇总 - 未理解","slug":"digest-agent-摘要汇总-未理解","link":"#digest-agent-摘要汇总-未理解","children":[]},{"level":3,"title":"Dkt Clustering Agent - 数据挖掘算法?","slug":"dkt-clustering-agent-数据挖掘算法","link":"#dkt-clustering-agent-数据挖掘算法","children":[]},{"level":3,"title":"Dropbox File Url","slug":"dropbox-file-url","link":"#dropbox-file-url","children":[]},{"level":3,"title":"Dropbox Watch Agent","slug":"dropbox-watch-agent","link":"#dropbox-watch-agent","children":[]},{"level":3,"title":"Email Agent","slug":"email-agent","link":"#email-agent","children":[]},{"level":3,"title":"Email Digest Agent - 邮件摘要","slug":"email-digest-agent-邮件摘要","link":"#email-digest-agent-邮件摘要","children":[]},{"level":3,"title":"Evernote Agent","slug":"evernote-agent","link":"#evernote-agent","children":[]},{"level":3,"title":"Freme Explore Agent - SPARQL-数据断点?","slug":"freme-explore-agent-sparql-数据断点","link":"#freme-explore-agent-sparql-数据断点","children":[]},{"level":3,"title":"Ftpsite Agent","slug":"ftpsite-agent","link":"#ftpsite-agent","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":18},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":27.27,"words":8182},"filePathRelative":"services/Huginn.md","localizedDate":"2022年7月22日","excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a2943f80.49cee825.js b/assets/js/Javascript.html.839e60fb.js similarity index 97% rename from assets/js/v-a2943f80.49cee825.js rename to assets/js/Javascript.html.839e60fb.js index 9074c44fb..e07bf86c4 100644 --- a/assets/js/v-a2943f80.49cee825.js +++ b/assets/js/Javascript.html.839e60fb.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9320],{9720:(n,a)=>{a.c=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},1472:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>v,data:()=>m});var e=s(3968);const t={href:"https://es6.ruanyifeng.com/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://jkchao.github.io/typescript-book-chinese/",target:"_blank",rel:"noopener noreferrer"},l=(0,e.IL)('

    ES6

    sayHi(){console.log("Hi");} 等同于 sayHi:function(){console.log("Hi");}

    let 声明的变量只在 let 命令所在的代码块内有效,尤其适合用于 for 循环的计数器。

    const 声明一个只读的常量,一旦声明,常量的值就不能改变。

    => 是指箭头函数,是一种函数的简写方式,语法为 (参数)=>{函数体};

    x => 2x\n//等于下方函数\nfunction (x) {\n return 2x;\n}\n

    数据结构

    Set 类似于数组,但是成员的值都是唯一的,没有重复的值。向 Set 加入值的时候,不会发生类型转换。

    // 例一\nconst set = new Set([1, 2, 3, 4, 4]);\n[...set]\n// [1, 2, 3, 4]\n\n// 例二\nconst items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);\nitems.size // 5\n

    Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

    Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。因此有时看起来是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此 get 方法无法读取该键,返回 undefined。

    常用函数

    document.getElementById()\ndocument.getElementsByClassName("v-modal")[0]\ndocument.getElementsByTagName("body")[0].remove();   //通过 Tagname 获取元素,删除指定元素\nfor (var i=0;i<cars.length;i++) {document.write(cars[i] + "<br>");}   //循环语句,i++会在代码被执行后增加一个值\nbreak; //跳出当前循环但继续函数\n\n//js 暂停\nwhile (true){\n    //100 毫秒延时\n    setTimeout(f1,100)\n    //直接跳出循环和函数\n    return;\n}\n\n//截取中间的字符串,A 有多少字符就需要加多少位置\nstr = str.substring(str.indexOf("A") + 1,str.indexOf("B"))\n\n//取特定字符前后的字符串\nvar ture_tkl01 = taokouling.value.trim().split('打')[0];\n//取第 4 位后的字符串 (4 代表开始位置,相当于从 5 开始截取到尾部)\nvar ture_tkl = ture_tkl01.substring(4);\n\n//报错处理\nfunction f1(){\n    try{\n        if (document.getElementById("pro-operation").getElementsByClassName("product-button02 disabled")[0].innerHTML.indexOf("立即申购")!=-1) {\n            window.location.reload();\n        }else{\n            window.location.reload();\n        }\n    }catch(e){\n        //下单\n        document.getElementById("product-operation").getElementsByClassName("product-button02")[0].click();\n    }\n}\n\n//js 函数为同步处理,只有 if else、setTimeour、for each 等函数才能按序运行\n\n//setInterval 不要包含多个函数,否则 clearInterval 容易出错\n\n//替换,不添加/g,则替换只发生一次\ntext.value = text.value.replace(" ", "----");\n//全局替换,如果使用/\\s/g,则换行符也会被替换\ntext.value = text.value.replace(/ /g, "----");\n\n//载入完成后,自动或取焦点。textSour 为元素 id,需配合 jquery\nwindow.onload = function(){\n textSour.focus();\n};\n//按钮点击后使用函数\n$("#clearEmoji").click(function () {\n}\n\n//去除每行首尾空格,支持特殊字符,首尾的空格、制表符、特殊字符的组合都倍清除\nstrResult += split_result[i].replace(/(^[\\t\\s]*)|([\\t\\s]*$)/g, "") + '\\n';\n

    JavaScript 对象

    对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。 对象一定要用英文冒号来注明,否则整段代码失效。属性由逗号分隔:

    var person={firstname:"John", lastname:"Doe", id:5566};\n//对象属性有两种寻址方式\nname=person.lastname;\nname=person["lastname"];\n\n//对象的方法定义了一个函数,并作为对象的属性存储。对象方法通过添加 () 调用 (作为一个函数)。\n<p id="对象"></p>\n<script>\n var person ={\n  firstname:"名",\n  lastname:"姓",\n  fullname:function()\n  {\n   return this.lastname+this.firstname\n  },       //不同属性间需要加逗号隔开\n  eyecolor:"blue"};\n document.getElementById("对象").innerHTML=\n person.fullname()+"眼睛颜色是"+person.eyecolor  ;\n</script>\n

    全局变量

    js 的全部变量要用 window. 来定义。如果变量在函数内没有声明(没有使用 var),该变量为全局变量。

    局部变量:在函数中通过 var 声明的变量。全局变量:在函数外通过 var 声明的变量。

    没有声明就使用的变量,默认为全局变量,不论这个变量在哪被使用。

    <p id="demo"></p>\n<script>\nmyFunction();\ndocument.getElementById("demo").innerHTML = "我可以显示 " + carName;\nfunction myFunction()\n{\n    carName = "Volvo";   //如果在这添加 var,声明变量,则变为局部变量,无法调用\n}\n</script>\n

    变量类型

    当您声明新变量时,可以使用关键词 "new" 来声明其类型:

    var carname = new String();\n字符串;\nvar x = new Number();\n数字;\nvar y = new Boolean();\n布尔;\nvar cars = new Array();\n数组;\nvar person = new Object();\n对象;\nvar y = new String("John");\n对象;\n\n// 数据赋值\nvar length = 16; // Number 通过数字字面量赋值\nvar points = x * 10; // Number 通过表达式字面量赋值\nvar lastName = "Johnson"; // String 通过字符串字面量赋值\nvar cars = ["Saab", "Volvo", "BMW"]; // Array  通过数组字面量赋值\nvar person = { firstName: "John", lastName: "Doe" }; // Object 通过对象字面量赋值\n

    运算符

    //后置++是将自身的值赋给新变量,然后才自身加 1.\n//前置++是将自身加 1 的值赋值给新变量,同时自身也加 1;\nint a;\na=i++;//将 i 的值赋值给 a,即 a=i;然后再执行 i=i+1;也就是【a=i++;】与【a=i; i=i+1;】等价。\na=++i;//将 i+1 的值赋给 a,即 a=i+1;然后再执行 i=i+1;也就是【a=++i;】与【a=i+1;i=i+1;】等价。\n
    // 描述 (x=5) 比较\n// == 等于\nx==8 false\nx==5 true\n// === 绝对等于(值和类型均相等)\nx==="5" false\nx===5 true\n// != 不等于\nx!=8 true\n// !== 不绝对等于(值和类型有一个不相等,或两个都不相等)\nx!=="5" true\nx!==5 false\n\n&& 且\n|| 或\n

    JavaScript 应用

    取随机值

    //[任意随机值](https://www.runoob.com/w3cnote/js-random.html)\nMath.floor(Math.random() * (max - min + 1) + min);\n\n//\nvar arr01 = textSour.value.split("\\n");\n//分割字符数组,主要用于淘口令网\nvar arr01 = ["打", "哒", "达"];\n//循环语句,i++会在代码被执行后增加一个值\nfor (var x = 0; x < arr01.length; x++) {\n  //存在循环后分割,并跳出循环\n  if (taokouling.value.indexOf(arr01[x]) != -1) {\n    ture_tkl01 = taokouling.value.trim().split(arr01[x])[0];\n    break;\n  }\n}\n\n// https://segmentfault.com/q/1010000006819233 //不重复获取\nfor (var i = 0; i < rn; ++i) {\n  var index = ~~(Math.random() * count) + i;\n  result[i] = split_result[index];\n  split_result[index] = split_result[i];\n  count--;\n  strResult = strResult + result[i] + "\\n";\n}\n

    文本框清空

    input 文本框获取焦点后,自动清空内容。

    onfocus = "this.value=''";\n

    内部文件读取

    以下代码用于服务器读取文档,本地无法直接使用。

    $.ajax({\n  url: "./xx.txt",\n  success: function (result) {\n    var strs = result.split("\\n");\n    addTableTR(strs, true);\n  },\n});\n

    选择框状态

    调用 attr 给选择框 radio、checkbox 添加 checked 属性和移调,并不能真实改变不能单选和选中框的真实状态,可用下方代码改变。[1]

    //取消导航项的 checked,同类名称都会取消 checked 状态\n$("input[name=daoruRadio]").prop("checked", false);\n//点击对映 id 的单选框\n$("input[id=Radio1]").prop("checked", true);\n

    复制隐藏内容

    clipboardjs 可复制隐藏区域内容。

    //新设将粘贴板设在特定按钮上,#copyresult 为按钮 id,#CopyValue 为区域 id\nvar clipboard2 = new ClipboardJS("#copyresult", {\n  text: function () {\n    return $("#CopyValue").val();\n  },\n});\n\nclipboard2.on("success", function (e) {\n  toastr["success"]("复制成功!");\n});\n\nclipboard2.on("error", function (e) {\n  toastr["error"]("复制失败,请手动重新复制!");\n});\n

    引入 html 页面

    利用 link 标签的 rel=import 引入 html 页面

    <link rel="import" href="header.html" />\n

    视频全屏弹窗

    品牌首页经常需要在动加载视频,可将下方代码放入首页源码的 body 区。

    <link\n  rel="stylesheet"\n  type="text/css"\n  href="https://cdn.staticfile.org/layer/3.5.1/theme/default/layer.min.css"\n/>\n<script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-y/jquery/3.6.0/jquery.min.js"></script>\n<script src="https://cdn.staticfile.org/layer/3.5.1/layer.min.js"></script>\n<script type="text/javascript">\n  window.onload = function () {\n    //页面一打开就执行,放入 reay 是为了 Layer 所需配件(css、扩展模块)加载完毕\n    layer.ready(function () {\n      //iframe 层 - 多媒体\n      layer.open({\n        //type 值为 1 时,则可直接套用视频\n        type: 2,\n        title: false,\n        area: ["630px", "360px"],\n        shade: 0.8,\n        closeBtn: 0,\n        shadeClose: true,\n        //视频链接\n        content:\n          "https://iluminage-cdn.oss-cn-shanghai.aliyuncs.com/brand-video.MP4",\n      });\n    });\n  };\n</script>\n

    插入视频代码

    <div style="line-height:0;font-size:0">\n  <video\n    width="100%"\n    height="100%"\n    controls="controls"\n    autoplay="autoplay"\n    autobuffer="autobuffer"\n    src="https://iluminage-cdn.oss-cn-shanghai.aliyuncs.com/brand-video.MP4"\n  ></video>\n</div>\n

    ',51),c={class:"footnotes"},r={class:"footnotes-list"},o={id:"footnote1",class:"footnote-item"},p={href:"https://www.cnblogs.com/jimloveq/p/10602060.html",target:"_blank",rel:"noopener noreferrer"},u=(0,e.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),d={},v=(0,s(9720).c)(d,[["render",function(n,a){const s=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.mY)("JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 "),(0,e.QD)("a",t,[(0,e.mY)("ECMAScript 6.0"),(0,e.K2)(s)]),(0,e.mY)("。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。")]),(0,e.QD)("p",null,[(0,e.mY)("推荐学习流程:「JavaScript」>「ES6」>「"),(0,e.QD)("a",i,[(0,e.mY)("TypeScript"),(0,e.K2)(s)]),(0,e.mY)("」。")]),l,(0,e.QD)("section",c,[(0,e.QD)("ol",r,[(0,e.QD)("li",o,[(0,e.QD)("p",null,[(0,e.QD)("a",p,[(0,e.mY)("radio、checkbox 选中状态研究"),(0,e.K2)(s)]),(0,e.mY)(),u])])])])])}]]),m=JSON.parse('{"path":"/code/Javascript.html","title":"JavaScript","lang":"zh-CN","frontmatter":{"article":false,"title":"JavaScript","icon":"javascript","order":2,"description":"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。 ES6 sayHi(){co...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Javascript.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"JavaScript"}],["meta",{"property":"og:description","content":"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。 ES6 sayHi(){co..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-02-16T19:51:25.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-02-16T19:51:25.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"JavaScript\\",\\"description\\":\\"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。 ES6 sayHi(){co...\\"}"]]},"headers":[{"level":2,"title":"ES6","slug":"es6","link":"#es6","children":[]},{"level":2,"title":"数据结构","slug":"数据结构","link":"#数据结构","children":[]},{"level":2,"title":"常用函数","slug":"常用函数","link":"#常用函数","children":[]},{"level":2,"title":"JavaScript 对象","slug":"javascript-对象","link":"#javascript-对象","children":[{"level":3,"title":"全局变量","slug":"全局变量","link":"#全局变量","children":[]},{"level":3,"title":"变量类型","slug":"变量类型","link":"#变量类型","children":[]}]},{"level":2,"title":"运算符","slug":"运算符","link":"#运算符","children":[]},{"level":2,"title":"JavaScript 应用","slug":"javascript-应用","link":"#javascript-应用","children":[{"level":3,"title":"取随机值","slug":"取随机值","link":"#取随机值","children":[]},{"level":3,"title":"文本框清空","slug":"文本框清空","link":"#文本框清空","children":[]},{"level":3,"title":"内部文件读取","slug":"内部文件读取","link":"#内部文件读取","children":[]},{"level":3,"title":"选择框状态","slug":"选择框状态","link":"#选择框状态","children":[]},{"level":3,"title":"复制隐藏内容","slug":"复制隐藏内容","link":"#复制隐藏内容","children":[]},{"level":3,"title":"引入 html 页面","slug":"引入-html-页面","link":"#引入-html-页面","children":[]},{"level":3,"title":"视频全屏弹窗","slug":"视频全屏弹窗","link":"#视频全屏弹窗","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1676577085000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":6.79,"words":2038},"filePathRelative":"code/Javascript.md","localizedDate":"2022年7月22日","excerpt":"

    JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。

    \\n

    推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7480],{3671:(n,a)=>{a.A=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},3121:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>v,data:()=>m});var e=s(7847);const t={href:"https://es6.ruanyifeng.com/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://jkchao.github.io/typescript-book-chinese/",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Fv)('

    ES6

    sayHi(){console.log("Hi");} 等同于 sayHi:function(){console.log("Hi");}

    let 声明的变量只在 let 命令所在的代码块内有效,尤其适合用于 for 循环的计数器。

    const 声明一个只读的常量,一旦声明,常量的值就不能改变。

    => 是指箭头函数,是一种函数的简写方式,语法为 (参数)=>{函数体};

    x => 2x\n//等于下方函数\nfunction (x) {\n return 2x;\n}\n

    数据结构

    Set 类似于数组,但是成员的值都是唯一的,没有重复的值。向 Set 加入值的时候,不会发生类型转换。

    // 例一\nconst set = new Set([1, 2, 3, 4, 4]);\n[...set]\n// [1, 2, 3, 4]\n\n// 例二\nconst items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);\nitems.size // 5\n

    Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

    Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。因此有时看起来是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此 get 方法无法读取该键,返回 undefined。

    常用函数

    document.getElementById()\ndocument.getElementsByClassName("v-modal")[0]\ndocument.getElementsByTagName("body")[0].remove();   //通过 Tagname 获取元素,删除指定元素\nfor (var i=0;i<cars.length;i++) {document.write(cars[i] + "<br>");}   //循环语句,i++会在代码被执行后增加一个值\nbreak; //跳出当前循环但继续函数\n\n//js 暂停\nwhile (true){\n    //100 毫秒延时\n    setTimeout(f1,100)\n    //直接跳出循环和函数\n    return;\n}\n\n//截取中间的字符串,A 有多少字符就需要加多少位置\nstr = str.substring(str.indexOf("A") + 1,str.indexOf("B"))\n\n//取特定字符前后的字符串\nvar ture_tkl01 = taokouling.value.trim().split('打')[0];\n//取第 4 位后的字符串 (4 代表开始位置,相当于从 5 开始截取到尾部)\nvar ture_tkl = ture_tkl01.substring(4);\n\n//报错处理\nfunction f1(){\n    try{\n        if (document.getElementById("pro-operation").getElementsByClassName("product-button02 disabled")[0].innerHTML.indexOf("立即申购")!=-1) {\n            window.location.reload();\n        }else{\n            window.location.reload();\n        }\n    }catch(e){\n        //下单\n        document.getElementById("product-operation").getElementsByClassName("product-button02")[0].click();\n    }\n}\n\n//js 函数为同步处理,只有 if else、setTimeour、for each 等函数才能按序运行\n\n//setInterval 不要包含多个函数,否则 clearInterval 容易出错\n\n//替换,不添加/g,则替换只发生一次\ntext.value = text.value.replace(" ", "----");\n//全局替换,如果使用/\\s/g,则换行符也会被替换\ntext.value = text.value.replace(/ /g, "----");\n\n//载入完成后,自动或取焦点。textSour 为元素 id,需配合 jquery\nwindow.onload = function(){\n textSour.focus();\n};\n//按钮点击后使用函数\n$("#clearEmoji").click(function () {\n}\n\n//去除每行首尾空格,支持特殊字符,首尾的空格、制表符、特殊字符的组合都倍清除\nstrResult += split_result[i].replace(/(^[\\t\\s]*)|([\\t\\s]*$)/g, "") + '\\n';\n

    JavaScript 对象

    对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。 对象一定要用英文冒号来注明,否则整段代码失效。属性由逗号分隔:

    var person={firstname:"John", lastname:"Doe", id:5566};\n//对象属性有两种寻址方式\nname=person.lastname;\nname=person["lastname"];\n\n//对象的方法定义了一个函数,并作为对象的属性存储。对象方法通过添加 () 调用 (作为一个函数)。\n<p id="对象"></p>\n<script>\n var person ={\n  firstname:"名",\n  lastname:"姓",\n  fullname:function()\n  {\n   return this.lastname+this.firstname\n  },       //不同属性间需要加逗号隔开\n  eyecolor:"blue"};\n document.getElementById("对象").innerHTML=\n person.fullname()+"眼睛颜色是"+person.eyecolor  ;\n</script>\n

    全局变量

    js 的全部变量要用 window. 来定义。如果变量在函数内没有声明(没有使用 var),该变量为全局变量。

    局部变量:在函数中通过 var 声明的变量。全局变量:在函数外通过 var 声明的变量。

    没有声明就使用的变量,默认为全局变量,不论这个变量在哪被使用。

    <p id="demo"></p>\n<script>\nmyFunction();\ndocument.getElementById("demo").innerHTML = "我可以显示 " + carName;\nfunction myFunction()\n{\n    carName = "Volvo";   //如果在这添加 var,声明变量,则变为局部变量,无法调用\n}\n</script>\n

    变量类型

    当您声明新变量时,可以使用关键词 "new" 来声明其类型:

    var carname = new String();\n字符串;\nvar x = new Number();\n数字;\nvar y = new Boolean();\n布尔;\nvar cars = new Array();\n数组;\nvar person = new Object();\n对象;\nvar y = new String("John");\n对象;\n\n// 数据赋值\nvar length = 16; // Number 通过数字字面量赋值\nvar points = x * 10; // Number 通过表达式字面量赋值\nvar lastName = "Johnson"; // String 通过字符串字面量赋值\nvar cars = ["Saab", "Volvo", "BMW"]; // Array  通过数组字面量赋值\nvar person = { firstName: "John", lastName: "Doe" }; // Object 通过对象字面量赋值\n

    运算符

    //后置++是将自身的值赋给新变量,然后才自身加 1.\n//前置++是将自身加 1 的值赋值给新变量,同时自身也加 1;\nint a;\na=i++;//将 i 的值赋值给 a,即 a=i;然后再执行 i=i+1;也就是【a=i++;】与【a=i; i=i+1;】等价。\na=++i;//将 i+1 的值赋给 a,即 a=i+1;然后再执行 i=i+1;也就是【a=++i;】与【a=i+1;i=i+1;】等价。\n
    // 描述 (x=5) 比较\n// == 等于\nx==8 false\nx==5 true\n// === 绝对等于(值和类型均相等)\nx==="5" false\nx===5 true\n// != 不等于\nx!=8 true\n// !== 不绝对等于(值和类型有一个不相等,或两个都不相等)\nx!=="5" true\nx!==5 false\n\n&& 且\n|| 或\n

    JavaScript 应用

    取随机值

    //[任意随机值](https://www.runoob.com/w3cnote/js-random.html)\nMath.floor(Math.random() * (max - min + 1) + min);\n\n//\nvar arr01 = textSour.value.split("\\n");\n//分割字符数组,主要用于淘口令网\nvar arr01 = ["打", "哒", "达"];\n//循环语句,i++会在代码被执行后增加一个值\nfor (var x = 0; x < arr01.length; x++) {\n  //存在循环后分割,并跳出循环\n  if (taokouling.value.indexOf(arr01[x]) != -1) {\n    ture_tkl01 = taokouling.value.trim().split(arr01[x])[0];\n    break;\n  }\n}\n\n// https://segmentfault.com/q/1010000006819233 //不重复获取\nfor (var i = 0; i < rn; ++i) {\n  var index = ~~(Math.random() * count) + i;\n  result[i] = split_result[index];\n  split_result[index] = split_result[i];\n  count--;\n  strResult = strResult + result[i] + "\\n";\n}\n

    文本框清空

    input 文本框获取焦点后,自动清空内容。

    onfocus = "this.value=''";\n

    内部文件读取

    以下代码用于服务器读取文档,本地无法直接使用。

    $.ajax({\n  url: "./xx.txt",\n  success: function (result) {\n    var strs = result.split("\\n");\n    addTableTR(strs, true);\n  },\n});\n

    选择框状态

    调用 attr 给选择框 radio、checkbox 添加 checked 属性和移调,并不能真实改变不能单选和选中框的真实状态,可用下方代码改变。[1]

    //取消导航项的 checked,同类名称都会取消 checked 状态\n$("input[name=daoruRadio]").prop("checked", false);\n//点击对映 id 的单选框\n$("input[id=Radio1]").prop("checked", true);\n

    复制隐藏内容

    clipboardjs 可复制隐藏区域内容。

    //新设将粘贴板设在特定按钮上,#copyresult 为按钮 id,#CopyValue 为区域 id\nvar clipboard2 = new ClipboardJS("#copyresult", {\n  text: function () {\n    return $("#CopyValue").val();\n  },\n});\n\nclipboard2.on("success", function (e) {\n  toastr["success"]("复制成功!");\n});\n\nclipboard2.on("error", function (e) {\n  toastr["error"]("复制失败,请手动重新复制!");\n});\n

    引入 html 页面

    利用 link 标签的 rel=import 引入 html 页面

    <link rel="import" href="header.html" />\n

    视频全屏弹窗

    品牌首页经常需要在动加载视频,可将下方代码放入首页源码的 body 区。

    <link\n  rel="stylesheet"\n  type="text/css"\n  href="https://cdn.staticfile.org/layer/3.5.1/theme/default/layer.min.css"\n/>\n<script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-y/jquery/3.6.0/jquery.min.js"></script>\n<script src="https://cdn.staticfile.org/layer/3.5.1/layer.min.js"></script>\n<script type="text/javascript">\n  window.onload = function () {\n    //页面一打开就执行,放入 reay 是为了 Layer 所需配件(css、扩展模块)加载完毕\n    layer.ready(function () {\n      //iframe 层 - 多媒体\n      layer.open({\n        //type 值为 1 时,则可直接套用视频\n        type: 2,\n        title: false,\n        area: ["630px", "360px"],\n        shade: 0.8,\n        closeBtn: 0,\n        shadeClose: true,\n        //视频链接\n        content:\n          "https://iluminage-cdn.oss-cn-shanghai.aliyuncs.com/brand-video.MP4",\n      });\n    });\n  };\n</script>\n

    插入视频代码

    <div style="line-height:0;font-size:0">\n  <video\n    width="100%"\n    height="100%"\n    controls="controls"\n    autoplay="autoplay"\n    autobuffer="autobuffer"\n    src="https://iluminage-cdn.oss-cn-shanghai.aliyuncs.com/brand-video.MP4"\n  ></video>\n</div>\n

    ',51),c={class:"footnotes"},r={class:"footnotes-list"},o={id:"footnote1",class:"footnote-item"},p={href:"https://www.cnblogs.com/jimloveq/p/10602060.html",target:"_blank",rel:"noopener noreferrer"},u=(0,e.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),d={},v=(0,s(3671).A)(d,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.eW)("JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 "),(0,e.Lk)("a",t,[(0,e.eW)("ECMAScript 6.0"),(0,e.bF)(s)]),(0,e.eW)("。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。")]),(0,e.Lk)("p",null,[(0,e.eW)("推荐学习流程:「JavaScript」>「ES6」>「"),(0,e.Lk)("a",i,[(0,e.eW)("TypeScript"),(0,e.bF)(s)]),(0,e.eW)("」。")]),l,(0,e.Lk)("section",c,[(0,e.Lk)("ol",r,[(0,e.Lk)("li",o,[(0,e.Lk)("p",null,[(0,e.Lk)("a",p,[(0,e.eW)("radio、checkbox 选中状态研究"),(0,e.bF)(s)]),(0,e.eW)(),u])])])])])}]]),m=JSON.parse('{"path":"/code/Javascript.html","title":"JavaScript","lang":"zh-CN","frontmatter":{"article":false,"title":"JavaScript","icon":"javascript","order":2,"description":"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。 ES6 sayHi(){co...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Javascript.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"JavaScript"}],["meta",{"property":"og:description","content":"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。 ES6 sayHi(){co..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-02-16T19:51:25.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-02-16T19:51:25.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"JavaScript\\",\\"description\\":\\"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。 推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。 ES6 sayHi(){co...\\"}"]]},"headers":[{"level":2,"title":"ES6","slug":"es6","link":"#es6","children":[]},{"level":2,"title":"数据结构","slug":"数据结构","link":"#数据结构","children":[]},{"level":2,"title":"常用函数","slug":"常用函数","link":"#常用函数","children":[]},{"level":2,"title":"JavaScript 对象","slug":"javascript-对象","link":"#javascript-对象","children":[{"level":3,"title":"全局变量","slug":"全局变量","link":"#全局变量","children":[]},{"level":3,"title":"变量类型","slug":"变量类型","link":"#变量类型","children":[]}]},{"level":2,"title":"运算符","slug":"运算符","link":"#运算符","children":[]},{"level":2,"title":"JavaScript 应用","slug":"javascript-应用","link":"#javascript-应用","children":[{"level":3,"title":"取随机值","slug":"取随机值","link":"#取随机值","children":[]},{"level":3,"title":"文本框清空","slug":"文本框清空","link":"#文本框清空","children":[]},{"level":3,"title":"内部文件读取","slug":"内部文件读取","link":"#内部文件读取","children":[]},{"level":3,"title":"选择框状态","slug":"选择框状态","link":"#选择框状态","children":[]},{"level":3,"title":"复制隐藏内容","slug":"复制隐藏内容","link":"#复制隐藏内容","children":[]},{"level":3,"title":"引入 html 页面","slug":"引入-html-页面","link":"#引入-html-页面","children":[]},{"level":3,"title":"视频全屏弹窗","slug":"视频全屏弹窗","link":"#视频全屏弹窗","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1676577085000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8}]},"readingTime":{"minutes":6.79,"words":2038},"filePathRelative":"code/Javascript.md","localizedDate":"2022年7月22日","excerpt":"

    JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。

    \\n

    推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-34dac248.f158ae28.js b/assets/js/Life.html.65228ea2.js similarity index 91% rename from assets/js/v-34dac248.f158ae28.js rename to assets/js/Life.html.65228ea2.js index 360e41124..632b0918e 100644 --- a/assets/js/v-34dac248.f158ae28.js +++ b/assets/js/Life.html.65228ea2.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1196],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6952:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>f,data:()=>u});var n=a(3968);const l=(0,n.IL)('

    个人护理

    理发

    电推子理发:先用 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),o={href:"https://sspai.com/post/74200",target:"_blank",rel:"noopener noreferrer"},i=(0,n.QD)("hr",{class:"footnotes-sep"},null,-1),r={class:"footnotes"},s={class:"footnotes-list"},p={id:"footnote1",class:"footnote-item"},h={href:"https://www.guokr.com/article/459972/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),d={},f=(0,a(9720).c)(d,[["render",function(e,t){const a=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[l,(0,n.QD)("p",null,[(0,n.mY)("无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 "),(0,n.QD)("a",o,[(0,n.mY)("有线 mesh 组网"),(0,n.K2)(a)]),(0,n.mY)("。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。")]),i,(0,n.QD)("section",r,[(0,n.QD)("ol",s,[(0,n.QD)("li",p,[(0,n.QD)("p",null,[(0,n.QD)("a",h,[(0,n.mY)("横纹衣服更显胖?你可能一直都弄错了"),(0,n.K2)(a)]),(0,n.mY)(),c])])])])])}]]),u=JSON.parse('{"path":"/family/Life.html","title":"生活窍门","lang":"zh-CN","frontmatter":{"article":false,"title":"生活窍门","icon":"creative","order":6,"description":"个人护理 理发 电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 不要从前向后理发,否则限位器不起作用,头发都被推平。 短发方案:限位器分别使用 1.5、6 和 4.5。 衣物 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Life.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"生活窍门"}],["meta",{"property":"og:description","content":"个人护理 理发 电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 不要从前向后理发,否则限位器不起作用,头发都被推平。 短发方案:限位器分别使用 1.5、6 和 4.5。 衣物 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"生活窍门\\",\\"description\\":\\"个人护理 理发 电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 不要从前向后理发,否则限位器不起作用,头发都被推平。 短发方案:限位器分别使用 1.5、6 和 4.5。 衣物 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单...\\"}"]]},"headers":[{"level":2,"title":"个人护理","slug":"个人护理","link":"#个人护理","children":[{"level":3,"title":"理发","slug":"理发","link":"#理发","children":[]},{"level":3,"title":"衣物","slug":"衣物","link":"#衣物","children":[]}]},{"level":2,"title":"妙用","slug":"妙用","link":"#妙用","children":[{"level":3,"title":"磁铁","slug":"磁铁","link":"#磁铁","children":[]}]},{"level":2,"title":"小众记录","slug":"小众记录","link":"#小众记录","children":[{"level":3,"title":"去客厅化","slug":"去客厅化","link":"#去客厅化","children":[]},{"level":3,"title":"玻璃自爆","slug":"玻璃自爆","link":"#玻璃自爆","children":[]},{"level":3,"title":"花洒水小","slug":"花洒水小","link":"#花洒水小","children":[]},{"level":3,"title":"网线更换","slug":"网线更换","link":"#网线更换","children":[]}]}],"git":{"createdTime":1659797625000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.7,"words":1110},"filePathRelative":"family/Life.md","localizedDate":"2022年8月6日","excerpt":"

    个人护理

    \\n

    理发

    \\n

    电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。

    \\n
      \\n
    • 不要从前向后理发,否则限位器不起作用,头发都被推平。
    • \\n
    • 短发方案:限位器分别使用 1.5、6 和 4.5。
    • \\n
    \\n

    衣物

    \\n","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4474],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3587:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>f,data:()=>u});var n=a(7847);const l=(0,n.Fv)('

    个人护理

    理发

    电推子理发:先用 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),o={href:"https://sspai.com/post/74200",target:"_blank",rel:"noopener noreferrer"},i=(0,n.Lk)("hr",{class:"footnotes-sep"},null,-1),r={class:"footnotes"},s={class:"footnotes-list"},p={id:"footnote1",class:"footnote-item"},h={href:"https://www.guokr.com/article/459972/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),d={},f=(0,a(3671).A)(d,[["render",function(e,t){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[l,(0,n.Lk)("p",null,[(0,n.eW)("无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 "),(0,n.Lk)("a",o,[(0,n.eW)("有线 mesh 组网"),(0,n.bF)(a)]),(0,n.eW)("。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。")]),i,(0,n.Lk)("section",r,[(0,n.Lk)("ol",s,[(0,n.Lk)("li",p,[(0,n.Lk)("p",null,[(0,n.Lk)("a",h,[(0,n.eW)("横纹衣服更显胖?你可能一直都弄错了"),(0,n.bF)(a)]),(0,n.eW)(),c])])])])])}]]),u=JSON.parse('{"path":"/family/Life.html","title":"生活窍门","lang":"zh-CN","frontmatter":{"article":false,"title":"生活窍门","icon":"creative","order":6,"description":"个人护理 理发 电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 不要从前向后理发,否则限位器不起作用,头发都被推平。 短发方案:限位器分别使用 1.5、6 和 4.5。 衣物 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Life.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"生活窍门"}],["meta",{"property":"og:description","content":"个人护理 理发 电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 不要从前向后理发,否则限位器不起作用,头发都被推平。 短发方案:限位器分别使用 1.5、6 和 4.5。 衣物 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"生活窍门\\",\\"description\\":\\"个人护理 理发 电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。 不要从前向后理发,否则限位器不起作用,头发都被推平。 短发方案:限位器分别使用 1.5、6 和 4.5。 衣物 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单...\\"}"]]},"headers":[{"level":2,"title":"个人护理","slug":"个人护理","link":"#个人护理","children":[{"level":3,"title":"理发","slug":"理发","link":"#理发","children":[]},{"level":3,"title":"衣物","slug":"衣物","link":"#衣物","children":[]}]},{"level":2,"title":"妙用","slug":"妙用","link":"#妙用","children":[{"level":3,"title":"磁铁","slug":"磁铁","link":"#磁铁","children":[]}]},{"level":2,"title":"小众记录","slug":"小众记录","link":"#小众记录","children":[{"level":3,"title":"去客厅化","slug":"去客厅化","link":"#去客厅化","children":[]},{"level":3,"title":"玻璃自爆","slug":"玻璃自爆","link":"#玻璃自爆","children":[]},{"level":3,"title":"花洒水小","slug":"花洒水小","link":"#花洒水小","children":[]},{"level":3,"title":"网线更换","slug":"网线更换","link":"#网线更换","children":[]}]}],"git":{"createdTime":1659797625000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.7,"words":1110},"filePathRelative":"family/Life.md","localizedDate":"2022年8月6日","excerpt":"

    个人护理

    \\n

    理发

    \\n

    电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。

    \\n
      \\n
    • 不要从前向后理发,否则限位器不起作用,头发都被推平。
    • \\n
    • 短发方案:限位器分别使用 1.5、6 和 4.5。
    • \\n
    \\n

    衣物

    \\n","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1afc005b.0d33790c.js b/assets/js/Maintenance.html.291d1e9e.js similarity index 96% rename from assets/js/v-1afc005b.0d33790c.js rename to assets/js/Maintenance.html.291d1e9e.js index fb7ada185..8bd9858e3 100644 --- a/assets/js/v-1afc005b.0d33790c.js +++ b/assets/js/Maintenance.html.291d1e9e.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7800],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},6964:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>p,data:()=>l});var i=a(3968);const n=[(0,i.IL)('

    牛皮席

    清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。

    秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。

    升降桌

    升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。

    通马桶

    塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

    如果使用下方类似的疏通器时,也需在疏通头上绑好塑料袋,并在气口处撕开个小口,最后打开通气开关。

    疏通器说明 1
    疏通器说明 1
    疏通器说明 2
    疏通器说明 2

    燃气锅炉

    锅炉左侧的控制器,通常用于冬季采暖,负责调节地暖锅炉的温度。

    地暖温度

    地暖温度范围通常设定在 45-55℃ 之间,并避免超过 60℃。这样做可以保护塑料采暖管道,防止锅炉内壁结垢。在天气极冷的情况下,您可以将地暖温度暂时调整至 65℃,但半天后应将其调回至 55℃。

    如果水采暖的地暖温度上不去,这通常是由于地暖温控阀的流量太小所致,而与锅炉温度本身关系不大。在这种情况下,您可以尝试通过右旋地暖温控阀的螺口来调整流量。在进行调整时,请确保顶针没有被下压,以解除对地暖温度的限制,促使热水更快地流动。在调整后等待一天,待室内温度恢复正常后,再将温控阀装回原位。

    地暖温控阀

    锅炉补水

    燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间。请注意,在补水过程中不要离开现场。

    补水操作步骤如下:

    1. 首先检查采暖系统是否有漏水的地方,确保系统完全密闭。
    2. 关闭燃气壁挂炉,并切断电源。
    3. 将注水/补水阀逆时针(向左)旋开大约一周,直到听到“呲”声。
    4. 观察操作面板上的水压表。当水压表指针位于 1bar 至 1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄,关闭阀门。
    5. 重新开启燃气壁挂炉。

    注意事项:

    • 在注水过程中,必须切断燃气壁挂炉的总电源,以防止由于接头漏水引起的漏电风险。
    • 补水结束后,务必将注水/补水阀完全旋紧关闭,防止燃气壁挂炉过压溢水。
    • 如果在补水过程中不慎将水压提升至约 3bar,安全阀将自动泄水。因此,再次提示你安全阀必须用接管与地漏连接,且中间不许有阀门。

    地暖温控器

    地暖温控器 1
    地暖温控器 1
    地暖温控器 2
    地暖温控器 2
    ',25)],r={},p=(0,a(9720).c)(r,[["render",function(e,t){return(0,i.Wz)(),(0,i.An)("div",null,n)}]]),l=JSON.parse('{"path":"/family/Maintenance.html","title":"维修/保养","lang":"zh-CN","frontmatter":{"article":false,"title":"维修/保养","icon":"repair","order":5,"description":"牛皮席 清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。 秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。 升降桌 升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。 通马桶...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Maintenance.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"维修/保养"}],["meta",{"property":"og:description","content":"牛皮席 清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。 秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。 升降桌 升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。 通马桶..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-10-14-55-01.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-19T06:51:15.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"维修/保养"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-19T06:51:15.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"维修/保养\\",\\"description\\":\\"牛皮席 清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。 秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。 升降桌 升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。 通马桶...\\"}"]]},"headers":[{"level":2,"title":"牛皮席","slug":"牛皮席","link":"#牛皮席","children":[]},{"level":2,"title":"升降桌","slug":"升降桌","link":"#升降桌","children":[]},{"level":2,"title":"通马桶","slug":"通马桶","link":"#通马桶","children":[]},{"level":2,"title":"燃气锅炉","slug":"燃气锅炉","link":"#燃气锅炉","children":[{"level":3,"title":"地暖温度","slug":"地暖温度","link":"#地暖温度","children":[]},{"level":3,"title":"锅炉补水","slug":"锅炉补水","link":"#锅炉补水","children":[]},{"level":3,"title":"地暖温控器","slug":"地暖温控器","link":"#地暖温控器","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1702968675000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":3.33,"words":999},"filePathRelative":"family/Maintenance.md","localizedDate":"2022年7月22日","excerpt":"

    牛皮席

    \\n

    清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。

    \\n

    秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。

    \\n

    升降桌

    \\n

    升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。

    \\n

    通马桶

    \\n

    塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1397],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},5205:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>p,data:()=>l});var i=a(7847);const n=[(0,i.Fv)('

    牛皮席

    清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。

    秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。

    升降桌

    升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。

    通马桶

    塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

    如果使用下方类似的疏通器时,也需在疏通头上绑好塑料袋,并在气口处撕开个小口,最后打开通气开关。

    疏通器说明 1
    疏通器说明 1
    疏通器说明 2
    疏通器说明 2

    燃气锅炉

    锅炉左侧的控制器,通常用于冬季采暖,负责调节地暖锅炉的温度。

    地暖温度

    地暖温度范围通常设定在 45-55℃ 之间,并避免超过 60℃。这样做可以保护塑料采暖管道,防止锅炉内壁结垢。在天气极冷的情况下,您可以将地暖温度暂时调整至 65℃,但半天后应将其调回至 55℃。

    如果水采暖的地暖温度上不去,这通常是由于地暖温控阀的流量太小所致,而与锅炉温度本身关系不大。在这种情况下,您可以尝试通过右旋地暖温控阀的螺口来调整流量。在进行调整时,请确保顶针没有被下压,以解除对地暖温度的限制,促使热水更快地流动。在调整后等待一天,待室内温度恢复正常后,再将温控阀装回原位。

    地暖温控阀

    锅炉补水

    燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间。请注意,在补水过程中不要离开现场。

    补水操作步骤如下:

    1. 首先检查采暖系统是否有漏水的地方,确保系统完全密闭。
    2. 关闭燃气壁挂炉,并切断电源。
    3. 将注水/补水阀逆时针(向左)旋开大约一周,直到听到“呲”声。
    4. 观察操作面板上的水压表。当水压表指针位于 1bar 至 1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄,关闭阀门。
    5. 重新开启燃气壁挂炉。

    注意事项:

    • 在注水过程中,必须切断燃气壁挂炉的总电源,以防止由于接头漏水引起的漏电风险。
    • 补水结束后,务必将注水/补水阀完全旋紧关闭,防止燃气壁挂炉过压溢水。
    • 如果在补水过程中不慎将水压提升至约 3bar,安全阀将自动泄水。因此,再次提示你安全阀必须用接管与地漏连接,且中间不许有阀门。

    地暖温控器

    地暖温控器 1
    地暖温控器 1
    地暖温控器 2
    地暖温控器 2
    ',25)],r={},p=(0,a(3671).A)(r,[["render",function(e,t){return(0,i.uX)(),(0,i.CE)("div",null,n)}]]),l=JSON.parse('{"path":"/family/Maintenance.html","title":"维修/保养","lang":"zh-CN","frontmatter":{"article":false,"title":"维修/保养","icon":"repair","order":5,"description":"牛皮席 清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。 秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。 升降桌 升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。 通马桶...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Maintenance.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"维修/保养"}],["meta",{"property":"og:description","content":"牛皮席 清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。 秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。 升降桌 升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。 通马桶..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-10-14-55-01.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-19T06:51:15.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"维修/保养"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-19T06:51:15.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"维修/保养\\",\\"description\\":\\"牛皮席 清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。 秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。 升降桌 升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。 通马桶...\\"}"]]},"headers":[{"level":2,"title":"牛皮席","slug":"牛皮席","link":"#牛皮席","children":[]},{"level":2,"title":"升降桌","slug":"升降桌","link":"#升降桌","children":[]},{"level":2,"title":"通马桶","slug":"通马桶","link":"#通马桶","children":[]},{"level":2,"title":"燃气锅炉","slug":"燃气锅炉","link":"#燃气锅炉","children":[{"level":3,"title":"地暖温度","slug":"地暖温度","link":"#地暖温度","children":[]},{"level":3,"title":"锅炉补水","slug":"锅炉补水","link":"#锅炉补水","children":[]},{"level":3,"title":"地暖温控器","slug":"地暖温控器","link":"#地暖温控器","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1702968675000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":3.33,"words":999},"filePathRelative":"family/Maintenance.md","localizedDate":"2022年7月22日","excerpt":"

    牛皮席

    \\n

    清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。

    \\n

    秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。

    \\n

    升降桌

    \\n

    升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。

    \\n

    通马桶

    \\n

    塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-37458a04.f2db189c.js b/assets/js/Markdown.html.9aa5e8a2.js similarity index 90% rename from assets/js/v-37458a04.f2db189c.js rename to assets/js/Markdown.html.9aa5e8a2.js index 4e56e863d..5c5f9b275 100644 --- a/assets/js/v-37458a04.f2db189c.js +++ b/assets/js/Markdown.html.9aa5e8a2.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6292],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,t]of e)a[n]=t;return a}},7208:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>m,data:()=>u});var t=a(3968);const s=(0,t.QD)("p",null,"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。",-1),o={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"},r={href:"https://theme-hope.vuejs.press/zh/cookbook/markdown/",target:"_blank",rel:"noopener noreferrer"},i=(0,t.IL)('

    图片尺寸

    md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功率。

    <!-- 按页面宽度的 60% 来缩小 -->\n<img src="" width="60%">\n\n<!-- md 图片设置,有时不能被识别 -->\n\n![同时设置宽度和高度](https://files.mdnice.com/logo.png =150x150)\n![只设置宽度,推荐使用百分比](https://files.mdnice.com/logo.png =40%x)\n\n<!-- 指针移动到图片时,显示图片说明 -->\n\n![name](https://docsify.js.org/_media/icon.svg "图片说明")\n
    ',3),l={href:"https://developer.qiniu.com/dora/kb/1627/flow-optimization-compression-of-images",target:"_blank",rel:"noopener noreferrer"},d={href:"https://developer.qiniu.com/dora/8255/the-zoom",target:"_blank",rel:"noopener noreferrer"},c=(0,t.IL)('
    <!-- 按图片尺寸的 60% 等比缩小 -->\n?imageMogr2/thumbnail/!60p\n\n<!-- 指定图片宽度 -->\n?imageMogr2/thumbnail/500x\n\n<!-- 指定宽度,调整质量,改变格式 -->\n?imageMogr2/thumbnail/500x/strip/quality/50/format/webp\n

    资料引用

    文章中加 ^[引用内容] 会在底部自动添加引用资料。如果想添加链接标题,则为 ^[[标题](链接)]

    如果同一引用要在多个地方使用,则需要手动编号。

    这是一条引用 [^1]\n这是一条引用 [^2]\n这是一条引用 [^1]\n这是一条引用 [^3]\n[^1]:链接\n[^2]:[标题](链接)\n[^3]:<br>![图片描述](图片链接)\n

    代码块自动换行

    自动换行需要 css 支持,暂不能自动启用。

    整段删除线

    ~~ 只支持对本行内容添加删除线。

    如果要对大段内容添加删除线,可以用 HTML 标签 <s></s>,被该标签包围的内容会全部添加删除线。VuePress 暂不支持该代码,会将标签识别为不完整而报错。

    ',10),p={},m=(0,a(9720).c)(p,[["render",function(n,e){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[s,(0,t.QD)("p",null,[(0,t.mY)("Markdown 入门:"),(0,t.QD)("a",o,[(0,t.mY)("Markdown 基本撰写和格式语法"),(0,t.K2)(a)]),(0,t.mY)(","),(0,t.QD)("a",r,[(0,t.mY)("Markdown 转 HTML 语法介绍"),(0,t.K2)(a)])]),i,(0,t.QD)("p",null,[(0,t.mY)("七牛云图床提供"),(0,t.QD)("a",l,[(0,t.mY)("图片流量优化压缩策略"),(0,t.K2)(a)]),(0,t.mY)(",可用于调整图片的分辨率、大小和格式,具体参数请参考"),(0,t.QD)("a",d,[(0,t.mY)("七牛云图片高级处理"),(0,t.K2)(a)]),(0,t.mY)("。此外,我还会定期使用 PP 鸭对图床中的图片进行重新压缩。")]),c])}]]),u=JSON.parse('{"path":"/code/Markdown.html","title":"Markdown","lang":"zh-CN","frontmatter":{"article":false,"title":"Markdown","icon":"markdown","order":5,"description":"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍 图片尺寸 md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Markdown.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Markdown"}],["meta",{"property":"og:description","content":"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍 图片尺寸 md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://files.mdnice.com/logo.png =150x150"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T12:29:37.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Markdown"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T12:29:37.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Markdown\\",\\"description\\":\\"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍 图片尺寸 md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功...\\"}"]]},"headers":[{"level":2,"title":"图片尺寸","slug":"图片尺寸","link":"#图片尺寸","children":[]},{"level":2,"title":"资料引用","slug":"资料引用","link":"#资料引用","children":[]},{"level":2,"title":"代码块自动换行","slug":"代码块自动换行","link":"#代码块自动换行","children":[]},{"level":2,"title":"整段删除线","slug":"整段删除线","link":"#整段删除线","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1681129777000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":1.8,"words":541},"filePathRelative":"code/Markdown.md","localizedDate":"2022年7月22日","excerpt":"

    Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。

    \\n

    Markdown 入门:Markdown 基本撰写和格式语法Markdown 转 HTML 语法介绍

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3569],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,t]of e)a[n]=t;return a}},8016:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>m,data:()=>u});var t=a(7847);const s=(0,t.Lk)("p",null,"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。",-1),o={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"},r={href:"https://theme-hope.vuejs.press/zh/cookbook/markdown/",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Fv)('

    图片尺寸

    md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功率。

    <!-- 按页面宽度的 60% 来缩小 -->\n<img src="" width="60%">\n\n<!-- md 图片设置,有时不能被识别 -->\n\n![同时设置宽度和高度](https://files.mdnice.com/logo.png =150x150)\n![只设置宽度,推荐使用百分比](https://files.mdnice.com/logo.png =40%x)\n\n<!-- 指针移动到图片时,显示图片说明 -->\n\n![name](https://docsify.js.org/_media/icon.svg "图片说明")\n
    ',3),l={href:"https://developer.qiniu.com/dora/kb/1627/flow-optimization-compression-of-images",target:"_blank",rel:"noopener noreferrer"},d={href:"https://developer.qiniu.com/dora/8255/the-zoom",target:"_blank",rel:"noopener noreferrer"},c=(0,t.Fv)('
    <!-- 按图片尺寸的 60% 等比缩小 -->\n?imageMogr2/thumbnail/!60p\n\n<!-- 指定图片宽度 -->\n?imageMogr2/thumbnail/500x\n\n<!-- 指定宽度,调整质量,改变格式 -->\n?imageMogr2/thumbnail/500x/strip/quality/50/format/webp\n

    资料引用

    文章中加 ^[引用内容] 会在底部自动添加引用资料。如果想添加链接标题,则为 ^[[标题](链接)]

    如果同一引用要在多个地方使用,则需要手动编号。

    这是一条引用 [^1]\n这是一条引用 [^2]\n这是一条引用 [^1]\n这是一条引用 [^3]\n[^1]:链接\n[^2]:[标题](链接)\n[^3]:<br>![图片描述](图片链接)\n

    代码块自动换行

    自动换行需要 css 支持,暂不能自动启用。

    整段删除线

    ~~ 只支持对本行内容添加删除线。

    如果要对大段内容添加删除线,可以用 HTML 标签 <s></s>,被该标签包围的内容会全部添加删除线。VuePress 暂不支持该代码,会将标签识别为不完整而报错。

    ',10),p={},m=(0,a(3671).A)(p,[["render",function(n,e){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[s,(0,t.Lk)("p",null,[(0,t.eW)("Markdown 入门:"),(0,t.Lk)("a",o,[(0,t.eW)("Markdown 基本撰写和格式语法"),(0,t.bF)(a)]),(0,t.eW)(","),(0,t.Lk)("a",r,[(0,t.eW)("Markdown 转 HTML 语法介绍"),(0,t.bF)(a)])]),i,(0,t.Lk)("p",null,[(0,t.eW)("七牛云图床提供"),(0,t.Lk)("a",l,[(0,t.eW)("图片流量优化压缩策略"),(0,t.bF)(a)]),(0,t.eW)(",可用于调整图片的分辨率、大小和格式,具体参数请参考"),(0,t.Lk)("a",d,[(0,t.eW)("七牛云图片高级处理"),(0,t.bF)(a)]),(0,t.eW)("。此外,我还会定期使用 PP 鸭对图床中的图片进行重新压缩。")]),c])}]]),u=JSON.parse('{"path":"/code/Markdown.html","title":"Markdown","lang":"zh-CN","frontmatter":{"article":false,"title":"Markdown","icon":"markdown","order":5,"description":"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍 图片尺寸 md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Markdown.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Markdown"}],["meta",{"property":"og:description","content":"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍 图片尺寸 md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://files.mdnice.com/logo.png =150x150"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T12:29:37.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Markdown"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T12:29:37.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Markdown\\",\\"description\\":\\"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。 Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍 图片尺寸 md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功...\\"}"]]},"headers":[{"level":2,"title":"图片尺寸","slug":"图片尺寸","link":"#图片尺寸","children":[]},{"level":2,"title":"资料引用","slug":"资料引用","link":"#资料引用","children":[]},{"level":2,"title":"代码块自动换行","slug":"代码块自动换行","link":"#代码块自动换行","children":[]},{"level":2,"title":"整段删除线","slug":"整段删除线","link":"#整段删除线","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1681129777000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":1.8,"words":541},"filePathRelative":"code/Markdown.md","localizedDate":"2022年7月22日","excerpt":"

    Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。

    \\n

    Markdown 入门:Markdown 基本撰写和格式语法Markdown 转 HTML 语法介绍

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4fef0bc6.9bf89421.js b/assets/js/Medical.html.8b30b0ad.js similarity index 79% rename from assets/js/v-4fef0bc6.9bf89421.js rename to assets/js/Medical.html.8b30b0ad.js index dae0ef13f..51c93c8d4 100644 --- a/assets/js/v-4fef0bc6.9bf89421.js +++ b/assets/js/Medical.html.8b30b0ad.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8288],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,a]of t)o[e]=a;return o}},8944:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>b,data:()=>Q});var a=o(3968);const r=(0,a.QD)("h2",{id:"自身健康",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#自身健康"},[(0,a.QD)("span",null,"自身健康")])],-1),n={href:"https://detail.tmall.com/item.htm?id=542176943787",target:"_blank",rel:"noopener noreferrer"},l={href:"https://detail.tmall.com/item.htm?id=568724954216",target:"_blank",rel:"noopener noreferrer"},i={href:"https://detail.tmall.com/item.htm?id=657520889974",target:"_blank",rel:"noopener noreferrer"},p=(0,a.QD)("strong",null,"立即清水清洗掉",-1),s=(0,a.IL)('

    黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。

    维生素

    维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。

    护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。

    补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。

    看病技巧

    • 如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。[1]

    • 如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。

    • 人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。

    • 上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。[2]


    ',8),c={class:"footnotes"},m={class:"footnotes-list"},h={id:"footnote1",class:"footnote-item"},f={href:"https://www.guokr.com/article/461939/",target:"_blank",rel:"noopener noreferrer"},d=(0,a.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),u={id:"footnote2",class:"footnote-item"},g={href:"https://www.guokr.com/article/461706/",target:"_blank",rel:"noopener noreferrer"},D=(0,a.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),k={},b=(0,o(9720).c)(k,[["render",function(e,t){const o=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[r,(0,a.QD)("p",null,[(0,a.QD)("a",n,[(0,a.mY)("尿素乳膏"),(0,a.K2)(o)]),(0,a.mY)(":柔软皮肤,防止干裂,深层滋润。")]),(0,a.QD)("p",null,[(0,a.QD)("a",l,[(0,a.mY)("维 a 酸乳膏"),(0,a.K2)(o)]),(0,a.mY)(":更新表皮,去除角质,避光只能晚上用。")]),(0,a.QD)("p",null,[(0,a.QD)("a",i,[(0,a.mY)("壬二酸"),(0,a.K2)(o)]),(0,a.mY)(":疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后"),p,(0,a.mY)(",然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。")]),s,(0,a.QD)("section",c,[(0,a.QD)("ol",m,[(0,a.QD)("li",h,[(0,a.QD)("p",null,[(0,a.QD)("a",f,[(0,a.mY)("不用迷信主任,要是真有大病,年轻大夫会领着你去找的……"),(0,a.K2)(o)]),(0,a.mY)(),d])]),(0,a.QD)("li",u,[(0,a.QD)("p",null,[(0,a.QD)("a",g,[(0,a.mY)("“为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南"),(0,a.K2)(o)]),(0,a.mY)(),D])])])])])}]]),Q=JSON.parse('{"path":"/family/Medical.html","title":"医疗药品","lang":"zh-CN","frontmatter":{"article":false,"title":"医疗药品","icon":"like","order":4,"description":"自身健康 尿素乳膏:柔软皮肤,防止干裂,深层滋润。 维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。 壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Medical.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"医疗药品"}],["meta",{"property":"og:description","content":"自身健康 尿素乳膏:柔软皮肤,防止干裂,深层滋润。 维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。 壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-09-29T14:53:05.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2022-09-29T14:53:05.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"医疗药品\\",\\"description\\":\\"自身健康 尿素乳膏:柔软皮肤,防止干裂,深层滋润。 维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。 壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停...\\"}"]]},"headers":[{"level":2,"title":"自身健康","slug":"自身健康","link":"#自身健康","children":[]},{"level":2,"title":"维生素","slug":"维生素","link":"#维生素","children":[]},{"level":2,"title":"看病技巧","slug":"看病技巧","link":"#看病技巧","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1664463185000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":2.46,"words":737},"filePathRelative":"family/Medical.md","localizedDate":"2022年7月22日","excerpt":"

    自身健康

    \\n

    尿素乳膏:柔软皮肤,防止干裂,深层滋润。

    \\n

    维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。

    \\n

    壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7217],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,a]of t)o[e]=a;return o}},5268:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>L,data:()=>y});var a=o(7847);const r=(0,a.Lk)("h2",{id:"自身健康",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#自身健康"},[(0,a.Lk)("span",null,"自身健康")])],-1),n={href:"https://detail.tmall.com/item.htm?id=542176943787",target:"_blank",rel:"noopener noreferrer"},l={href:"https://detail.tmall.com/item.htm?id=568724954216",target:"_blank",rel:"noopener noreferrer"},i={href:"https://detail.tmall.com/item.htm?id=657520889974",target:"_blank",rel:"noopener noreferrer"},p=(0,a.Lk)("strong",null,"立即清水清洗掉",-1),s=(0,a.Fv)('

    黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。

    维生素

    维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。

    护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。

    补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。

    看病技巧

    • 如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。[1]

    • 如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。

    • 人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。

    • 上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。[2]


    ',8),c={class:"footnotes"},h={class:"footnotes-list"},f={id:"footnote1",class:"footnote-item"},m={href:"https://www.guokr.com/article/461939/",target:"_blank",rel:"noopener noreferrer"},d=(0,a.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),k={id:"footnote2",class:"footnote-item"},u={href:"https://www.guokr.com/article/461706/",target:"_blank",rel:"noopener noreferrer"},g=(0,a.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),b={},L=(0,o(3671).A)(b,[["render",function(e,t){const o=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[r,(0,a.Lk)("p",null,[(0,a.Lk)("a",n,[(0,a.eW)("尿素乳膏"),(0,a.bF)(o)]),(0,a.eW)(":柔软皮肤,防止干裂,深层滋润。")]),(0,a.Lk)("p",null,[(0,a.Lk)("a",l,[(0,a.eW)("维 a 酸乳膏"),(0,a.bF)(o)]),(0,a.eW)(":更新表皮,去除角质,避光只能晚上用。")]),(0,a.Lk)("p",null,[(0,a.Lk)("a",i,[(0,a.eW)("壬二酸"),(0,a.bF)(o)]),(0,a.eW)(":疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后"),p,(0,a.eW)(",然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。")]),s,(0,a.Lk)("section",c,[(0,a.Lk)("ol",h,[(0,a.Lk)("li",f,[(0,a.Lk)("p",null,[(0,a.Lk)("a",m,[(0,a.eW)("不用迷信主任,要是真有大病,年轻大夫会领着你去找的……"),(0,a.bF)(o)]),(0,a.eW)(),d])]),(0,a.Lk)("li",k,[(0,a.Lk)("p",null,[(0,a.Lk)("a",u,[(0,a.eW)("“为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南"),(0,a.bF)(o)]),(0,a.eW)(),g])])])])])}]]),y=JSON.parse('{"path":"/family/Medical.html","title":"医疗药品","lang":"zh-CN","frontmatter":{"article":false,"title":"医疗药品","icon":"like","order":4,"description":"自身健康 尿素乳膏:柔软皮肤,防止干裂,深层滋润。 维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。 壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Medical.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"医疗药品"}],["meta",{"property":"og:description","content":"自身健康 尿素乳膏:柔软皮肤,防止干裂,深层滋润。 维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。 壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-09-29T14:53:05.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2022-09-29T14:53:05.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"医疗药品\\",\\"description\\":\\"自身健康 尿素乳膏:柔软皮肤,防止干裂,深层滋润。 维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。 壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停...\\"}"]]},"headers":[{"level":2,"title":"自身健康","slug":"自身健康","link":"#自身健康","children":[]},{"level":2,"title":"维生素","slug":"维生素","link":"#维生素","children":[]},{"level":2,"title":"看病技巧","slug":"看病技巧","link":"#看病技巧","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1664463185000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":2.46,"words":737},"filePathRelative":"family/Medical.md","localizedDate":"2022年7月22日","excerpt":"

    自身健康

    \\n

    尿素乳膏:柔软皮肤,防止干裂,深层滋润。

    \\n

    维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。

    \\n

    壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5afe12a9.1941852b.js b/assets/js/MySQL.html.74054250.js similarity index 89% rename from assets/js/v-5afe12a9.1941852b.js rename to assets/js/MySQL.html.74054250.js index bda1cbf2c..8778d6b7b 100644 --- a/assets/js/v-5afe12a9.1941852b.js +++ b/assets/js/MySQL.html.74054250.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4484],{9720:(e,n)=>{n.c=(e,n)=>{const t=e.__vccOpts||e;for(const[e,a]of n)t[e]=a;return t}},6696:(e,n,t)=>{t.r(n),t.d(n,{comp:()=>p,data:()=>c});var a=t(3968);const r=(0,a.QD)("p",null,"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。",-1),s=(0,a.QD)("h2",{id:"本地-mysql-使用",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#本地-mysql-使用"},[(0,a.QD)("span",null,"本地 MySQL 使用")])],-1),o={href:"https://downloads.mysql.com/archives/installer/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.IL)('

    数据库恢复

    数据库备份是至关重要的工作,一旦数据丢失,恢复起来会非常困难。如果你只想恢复特定的数据库,可以复制数据库的字段内容。在 phpMyAdmin 中,选择你需要的数据库,点击 "SQL",然后将你的 SQL 代码粘贴到执行窗口,最后点击 "Go" 按钮以运行代码。字段的分隔通常以 -- Table structure for table xxx 开始。

    如果出现错误 #1217 - Cannot delete or update a parent row: a foreign key constraint fails,这意味着你尝试删除或更新表中的记录,但是这个记录在另一个表中作为外键被引用。如果确实需要进行恢复,可以使用以下命令暂时关闭 MySQL 的外键约束检查:

    -- 禁用外键约束检查\nSET FOREIGN_KEY_CHECKS=0;\n\n-- 执行您的操作...\n\n-- 启用外键约束检查\nSET FOREIGN_KEY_CHECKS=1;\n\n

    数据库启动失败或损坏

    1. 在 MySQL 配置文件中,找到 mysqld 行并添加 innodb_force_recovery=4。这个值可以在 0-6 之间调整,数值越大对数据库的损害就越大。在成功启动 MySQL 后,备份所有数据库和管理密码,并将它们下载到本地。
    2. 在宝塔面板的「数据库」选项中删除所有数据库,然后卸载并重新安装 MySQL。
    3. 重新导入数据库。
    ',6),i={},p=(0,t(9720).c)(i,[["render",function(e,n){const t=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[r,s,(0,a.QD)("p",null,[(0,a.mY)("在 Windows 平台上,你需要首先安装 "),(0,a.QD)("a",o,[(0,a.mY)("MySQL Server"),(0,a.K2)(t)]),(0,a.mY)(",然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:右键点击菜单栏最左侧,依次选择「计算机管理」>「服务和应用程序」>「服务」>「MYSQL57」,然后双击以启动。")]),l])}]]),c=JSON.parse('{"path":"/deploy/MySQL.html","title":"数据库管理","lang":"zh-CN","frontmatter":{"article":false,"title":"数据库管理","icon":"mysql","order":3,"description":"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 本地 MySQL 使用 在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/MySQL.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"数据库管理"}],["meta",{"property":"og:description","content":"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 本地 MySQL 使用 在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"数据库管理\\",\\"description\\":\\"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 本地 MySQL 使用 在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:...\\"}"]]},"headers":[{"level":2,"title":"本地 MySQL 使用","slug":"本地-mysql-使用","link":"#本地-mysql-使用","children":[]},{"level":2,"title":"数据库恢复","slug":"数据库恢复","link":"#数据库恢复","children":[]},{"level":2,"title":"数据库启动失败或损坏","slug":"数据库启动失败或损坏","link":"#数据库启动失败或损坏","children":[]}],"git":{"createdTime":1691276694000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.71,"words":512},"filePathRelative":"deploy/MySQL.md","localizedDate":"2023年8月5日","excerpt":"

    我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。

    \\n

    本地 MySQL 使用

    \\n

    在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:右键点击菜单栏最左侧,依次选择「计算机管理」>「服务和应用程序」>「服务」>「MYSQL57」,然后双击以启动。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7204],{3671:(e,n)=>{n.A=(e,n)=>{const t=e.__vccOpts||e;for(const[e,a]of n)t[e]=a;return t}},1720:(e,n,t)=>{t.r(n),t.d(n,{comp:()=>p,data:()=>c});var a=t(7847);const r=(0,a.Lk)("p",null,"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。",-1),s=(0,a.Lk)("h2",{id:"本地-mysql-使用",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#本地-mysql-使用"},[(0,a.Lk)("span",null,"本地 MySQL 使用")])],-1),o={href:"https://downloads.mysql.com/archives/installer/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.Fv)('

    数据库恢复

    数据库备份是至关重要的工作,一旦数据丢失,恢复起来会非常困难。如果你只想恢复特定的数据库,可以复制数据库的字段内容。在 phpMyAdmin 中,选择你需要的数据库,点击 "SQL",然后将你的 SQL 代码粘贴到执行窗口,最后点击 "Go" 按钮以运行代码。字段的分隔通常以 -- Table structure for table xxx 开始。

    如果出现错误 #1217 - Cannot delete or update a parent row: a foreign key constraint fails,这意味着你尝试删除或更新表中的记录,但是这个记录在另一个表中作为外键被引用。如果确实需要进行恢复,可以使用以下命令暂时关闭 MySQL 的外键约束检查:

    -- 禁用外键约束检查\nSET FOREIGN_KEY_CHECKS=0;\n\n-- 执行您的操作...\n\n-- 启用外键约束检查\nSET FOREIGN_KEY_CHECKS=1;\n\n

    数据库启动失败或损坏

    1. 在 MySQL 配置文件中,找到 mysqld 行并添加 innodb_force_recovery=4。这个值可以在 0-6 之间调整,数值越大对数据库的损害就越大。在成功启动 MySQL 后,备份所有数据库和管理密码,并将它们下载到本地。
    2. 在宝塔面板的「数据库」选项中删除所有数据库,然后卸载并重新安装 MySQL。
    3. 重新导入数据库。
    ',6),i={},p=(0,t(3671).A)(i,[["render",function(e,n){const t=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[r,s,(0,a.Lk)("p",null,[(0,a.eW)("在 Windows 平台上,你需要首先安装 "),(0,a.Lk)("a",o,[(0,a.eW)("MySQL Server"),(0,a.bF)(t)]),(0,a.eW)(",然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:右键点击菜单栏最左侧,依次选择「计算机管理」>「服务和应用程序」>「服务」>「MYSQL57」,然后双击以启动。")]),l])}]]),c=JSON.parse('{"path":"/deploy/MySQL.html","title":"数据库管理","lang":"zh-CN","frontmatter":{"article":false,"title":"数据库管理","icon":"mysql","order":3,"description":"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 本地 MySQL 使用 在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/MySQL.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"数据库管理"}],["meta",{"property":"og:description","content":"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 本地 MySQL 使用 在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"数据库管理\\",\\"description\\":\\"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。 本地 MySQL 使用 在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:...\\"}"]]},"headers":[{"level":2,"title":"本地 MySQL 使用","slug":"本地-mysql-使用","link":"#本地-mysql-使用","children":[]},{"level":2,"title":"数据库恢复","slug":"数据库恢复","link":"#数据库恢复","children":[]},{"level":2,"title":"数据库启动失败或损坏","slug":"数据库启动失败或损坏","link":"#数据库启动失败或损坏","children":[]}],"git":{"createdTime":1691276694000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.71,"words":512},"filePathRelative":"deploy/MySQL.md","localizedDate":"2023年8月5日","excerpt":"

    我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。

    \\n

    本地 MySQL 使用

    \\n

    在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:右键点击菜单栏最左侧,依次选择「计算机管理」>「服务和应用程序」>「服务」>「MYSQL57」,然后双击以启动。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/NAS.html.57bdca8b.js b/assets/js/NAS.html.57bdca8b.js new file mode 100644 index 000000000..64ef7ca0e --- /dev/null +++ b/assets/js/NAS.html.57bdca8b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5152],{3671:(e,r)=>{r.A=(e,r)=>{const t=e.__vccOpts||e;for(const[e,n]of r)t[e]=n;return t}},6869:(e,r,t)=>{t.r(r),t.d(r,{comp:()=>De,data:()=>Fe});var n=t(7847);const l=(0,n.Lk)("p",null,"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点:",-1),o=(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,"选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。"),(0,n.Lk)("li",null,"选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时任务脚本。"),(0,n.Lk)("li",null,"SSD 缓存对家用的 NAS 性能提升不大,没必要加。"),(0,n.Lk)("li",null,"群晖系统分布在所有硬盘,拔出一个不影响使用。但应用会有影响?"),(0,n.Lk)("li",null,"NAS Docker 建议指定本地端口,否则重启容器会让端口发生改变,重启不会不影响 docker 配置。"),(0,n.Lk)("li",null,"升级容器镜像,不影响内部数据库。群晖的「Docker 导出」只会导出安装镜像和配置,但不包括容器内部使用的数据库,用处不大。")],-1),a=(0,n.Lk)("h2",{id:"nas-套件",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#nas-套件"},[(0,n.Lk)("span",null,"NAS 套件")])],-1),i={href:"https://spk7.imnks.com/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.Lk)("li",null,"DS/Transmission:用于 PT 下载 (禁用 DHT,半小时停止做种)。",-1),c=(0,n.Lk)("li",null,"Synology Drive Server:电脑文件备份。",-1),k=(0,n.Lk)("li",null,"Hyper Backup:本地多硬盘备份,防止一个硬盘丢失后重要文件损坏,比如 docker 容器的本地配置文件夹。",-1),d=(0,n.Lk)("li",null,[(0,n.eW)("Surveillance Station:管理 IP 摄像机以保护您的家庭和办公环境。借助 Surveillance Station,您可以透过网络浏览器,VisualStation 或移动设备观看和记录实时视频,设置定时记录,回放记录的视频,从而实现远程监控。发生重要事件时,您也会收到通知。注意,摄像头需支持 "),(0,n.Lk)("strong",null,"ONVIF 协议"),(0,n.eW)("。")],-1),u={href:"https://www.clouddrive2.com",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Lk)("code",null,"sudo sed -i 's/package/root/g' /var/packages/CloudDrive2/conf/privilege",-1),h=(0,n.Fv)('

    Docker API

    如果你想跨设备、网络来管理 Docker,就需要开通 Docker API,它可以让你远程管理 Docker 容器和镜像。以下以群晖 NAS 为例:

    1. 使用 SSH 修改文件 sudo vi /var/packages/Docker/etc/dockerd.json
    2. 在其中加入一行 "hosts" : [ "tcp://0.0.0.0:2375", "unix:///var/run/docker.sock" ],。建议将 tcp 的 ip 改为 nas 在本地的 ip,监听端口也不要使用默认的 2375。
    3. 重启 docker 服务。群晖里没找到重启命令,我这是手动停止 Docker 套件,再启动。

    Docker 容器

    常用

    ',5),b={href:"https://registry.hub.docker.com/r/linuxserver/qbittorrent/",target:"_blank",rel:"noopener noreferrer"},f=(0,n.Lk)("code",null,"BitTorrent - DHT",-1),g={href:"https://blog.csdn.net/weixin_45120915/article/details/114691473",target:"_blank",rel:"noopener noreferrer"},L=(0,n.Lk)("code",null,"config/qBittorrent/qBittorrent.conf",-1),m=(0,n.Lk)("code",null,"WebUI\\AuthSubnetWhitelist",-1),W=(0,n.Lk)("code",null,"0.0.0.0/0",-1),S={href:"https://github.com/AragonSnow/qiandao",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/ckx000/get-cookies",target:"_blank",rel:"noopener noreferrer"},A=(0,n.Lk)("li",null,[(0,n.Lk)("a",{href:"/services/dockers-on-nas/mt-photos"},"MT Photos"),(0,n.eW)(":支持自动整理、分类您的照片,比如:时间、地点、人物、照片类型。需要 99 元买断服务,每周连线检查授权状态。比较喜欢的是,支持网页分享特定图片影集,适合将宝宝照片批量分享给家人。")],-1),N={href:"https://docs.photoprism.app/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/immich-app/immich",target:"_blank",rel:"noopener noreferrer"},w={href:"https://containrrr.dev/watchtower/",target:"_blank",rel:"noopener noreferrer"},D=(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.eW)("监控指定名称的镜像:"),(0,n.Lk)("code",null,"docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once nginx redis"),(0,n.eW)("。本案例只更新名为「nginx」和「redis」的容器,其他容器将被忽略。")]),(0,n.Lk)("li",null,[(0,n.eW)("指定容器的 compose 命令中添加 lable "),(0,n.Lk)("code",null,"com.centurylinklabs.watchtower.enable=false"),(0,n.eW)(",可禁止该容器的监控和更新。")])],-1),F=(0,n.Lk)("h3",{id:"资讯",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#资讯"},[(0,n.Lk)("span",null,"资讯")])],-1),y=(0,n.Lk)("li",null,"RSSHub:无需保存数据,pubData 为 GMT 时区,普通用户无法更改,Docker Timezone 设置也不会有改变。",-1),T=(0,n.Lk)("li",null,"Huginn:定期备份抓取脚本,数据库保存在本地。",-1),x={href:"https://registry.hub.docker.com/r/wangqiru/mercury-parser-api",target:"_blank",rel:"noopener noreferrer"},B=(0,n.Lk)("li",null,[(0,n.eW)("Cloudflare Tunnels:可以将局域网内容转发到外网。不过,每次容器重启后都需要重新构建,"),(0,n.Lk)("code",null,"sudo docker run --name cloudflared -d --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token [Your Tokens]"),(0,n.eW)("。后期考虑是否将启动命令放入容器。")],-1),M={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},P={href:"https://github.com/dgtlmoon/changedetection.io",target:"_blank",rel:"noopener noreferrer"},q=(0,n.Lk)("h3",{id:"娱乐",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#娱乐"},[(0,n.Lk)("span",null,"娱乐")])],-1),z={href:"https://github.com/alist-org/alist",target:"_blank",rel:"noopener noreferrer"},H={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/Difegue/LANraragi",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/Difegue/LANraragi/blob/32cc991e8c5bae3bbd57d163278048c50159ae9f/tools/Documentation/advanced-usage/external-readers.md",target:"_blank",rel:"noopener noreferrer"},E=(0,n.Lk)("li",null,[(0,n.Lk)("a",{href:"/services/dockers-on-nas/tachidesk"},"Tachidesk"),(0,n.eW)(":开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。")],-1),R={href:"https://github.com/gotson/komga",target:"_blank",rel:"noopener noreferrer"},$=(0,n.Lk)("li",null,[(0,n.Lk)("a",{href:"/services/dockers-on-nas/reader"},"reader"),(0,n.eW)(":阅读 3 的服务器版,摆脱客户端,网页版即可查看。自定义替换进入文章页面左侧的「设置」-「过滤规则管理」。")],-1),j={href:"https://github.com/talebook/talebook",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/zzcabc/Docker_Buildx_Danmuji",target:"_blank",rel:"noopener noreferrer"},O={href:"https://hub.docker.com/r/makedie/noname_kill",target:"_blank",rel:"noopener noreferrer"},U={href:"https://hub.docker.com/r/gswxy/gswxy",target:"_blank",rel:"noopener noreferrer"},X={href:"https://www.gswxy.com/?p=67",target:"_blank",rel:"noopener noreferrer"},V=(0,n.Lk)("h3",{id:"自动化",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#自动化"},[(0,n.Lk)("span",null,"自动化")])],-1),J={href:"https://blog.csdn.net/alex_yangchuansheng/article/details/122295193",target:"_blank",rel:"noopener noreferrer"},K={href:"https://www.home-assistant.io/",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://github.com/monicahq/monica",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://github.com/monicahq/docker",target:"_blank",rel:"noopener noreferrer"},Q=(0,n.Lk)("code",null,"Me as a contact",-1),ee={href:"https://supermanito.github.io/Helloworld/#/",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/jxxghp/MoviePilot",target:"_blank",rel:"noopener noreferrer"},te={href:"https://github.com/Putarku/MoviePilot-Help",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://registry.hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc",target:"_blank",rel:"noopener noreferrer"},le={href:"https://rustdesk.com/zh/",target:"_blank",rel:"noopener noreferrer"},oe=(0,n.Lk)("h3",{id:"待了解",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#待了解"},[(0,n.Lk)("span",null,"待了解")])],-1),ae=(0,n.Lk)("li",null,"Nextcloud: 私有云盘,完成 PC 端文件同步、版本控制,提供 web 端、移动端 app。",-1),ie={href:"https://github.com/lsky-org/lsky-pro",target:"_blank",rel:"noopener noreferrer"},se={href:"https://github.com/EstrellaXD/Auto_Bangumi",target:"_blank",rel:"noopener noreferrer"},ce=(0,n.Lk)("li",null,"Clash:代理服务器。",-1),ke=(0,n.Lk)("h2",{id:"影视整理",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#影视整理"},[(0,n.Lk)("span",null,"影视整理")])],-1),de=(0,n.Lk)("p",null,"下载文件后,用 tinyMediaManager 重命名并下载 NFO 和影视封面,最后放置于分类文件夹。",-1),ue={href:"https://www.tinymediamanager.org/download/",target:"_blank",rel:"noopener noreferrer"},pe=(0,n.Lk)("sup",{class:"footnote-ref"},[(0,n.Lk)("a",{href:"#footnote1"},"[1]"),(0,n.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),he=(0,n.Fv)('
    # 电视节目重命名规则\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),be={class:"footnotes"},fe={class:"footnotes-list"},ge={id:"footnote1",class:"footnote-item"},Le={href:"https://post.smzdm.com/p/a0d67m2z/",target:"_blank",rel:"noopener noreferrer"},me=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),We={id:"footnote2",class:"footnote-item"},Se={href:"https://www.bigzhang.com/3264.html",target:"_blank",rel:"noopener noreferrer"},ve=(0,n.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),Ae={id:"footnote3",class:"footnote-item"},Ne={href:"https://blog.csdn.net/hilaryfrank/article/details/109722319",target:"_blank",rel:"noopener noreferrer"},_e=(0,n.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),we={},De=(0,t(3671).A)(we,[["render",function(e,r){const t=(0,n.g2)("ExternalLinkIcon"),we=(0,n.g2)("RouteLink");return(0,n.uX)(),(0,n.CE)("div",null,[l,o,a,(0,n.Lk)("p",null,[(0,n.eW)("除了官方套件源,我会加上 "),(0,n.Lk)("a",i,[(0,n.eW)("DSM7.x 矿神 SPK 套件源"),(0,n.bF)(t)]),(0,n.eW)("。")]),(0,n.Lk)("ul",null,[s,c,k,d,(0,n.Lk)("li",null,[(0,n.Lk)("a",u,[(0,n.eW)("CloudDrive2"),(0,n.bF)(t)]),(0,n.eW)(":可以将网盘挂载在本地。安装套件后,需 SSH 终端运行 "),p,(0,n.eW)("。")])]),h,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("a",b,[(0,n.eW)("qBittorrent"),(0,n.bF)(t)]),(0,n.eW)(":请修改所有默认端口,以避免可能的错误。对于 PT 下载,请关闭 "),f,(0,n.eW)(" 和其他隐私选项,将做种时间缩短至一小时,并为下载文件添加 Everyone 权限。有关其他设置,请参考"),(0,n.Lk)("a",g,[(0,n.eW)("群晖使用 qbittorrent"),(0,n.bF)(t)]),(0,n.eW)("。为了解决登录和密码问题,请先停止容器,并将 "),L,(0,n.eW)(" 文件中的 "),m,(0,n.eW)(" 设置为 "),W,(0,n.eW)(",这样即可无需密码登录 qBittorrent WebUI。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",S,[(0,n.eW)("qiandao"),(0,n.bF)(t)]),(0,n.eW)(":自动签到开源框架,需搭配浏览器扩展 "),(0,n.Lk)("a",v,[(0,n.eW)("get-cookies"),(0,n.bF)(t)]),(0,n.eW)(" 使用,可导出配置。")]),A,(0,n.Lk)("li",null,[(0,n.Lk)("a",N,[(0,n.eW)("PhotoPrism"),(0,n.bF)(t)]),(0,n.eW)(":基于 ai 私有化部署的个人相册,但实际很多照片无法识别,无法对外分享。如果部署时出错,则尝试删除数据库文件夹下的内容。地点标记功能非常强大,类似本地版 Google Photos。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",_,[(0,n.eW)("Immich"),(0,n.bF)(t)]),(0,n.eW)(": 相册备份、浏览,提供 web 端、移动端 app。但不支持扫描已有文件。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",w,[(0,n.eW)("watchtower"),(0,n.bF)(t)]),(0,n.eW)(":监控并更新 Docker 容器。 "),D])]),F,(0,n.Lk)("ul",null,[y,T,(0,n.Lk)("li",null,[(0,n.eW)("Tiny Tiny RSS:定期备份订阅源和设置,自动更新,可配置全文插件 "),(0,n.Lk)("a",x,[(0,n.eW)("mercury-parser-api"),(0,n.bF)(t)]),(0,n.eW)("。")]),B,(0,n.Lk)("li",null,[(0,n.Lk)("a",M,[(0,n.eW)("Check 酱"),(0,n.bF)(t)]),(0,n.eW)(":监测网页内容变化,并发送异动到微信。亦支持 http status、json 和 rss 监测。配合自架云端,关电脑后也能运行。同类工具有 "),(0,n.Lk)("a",P,[(0,n.eW)("changedetection.io"),(0,n.bF)(t)]),(0,n.eW)("。")])]),q,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("a",z,[(0,n.eW)("AList"),(0,n.bF)(t)]),(0,n.eW)(":开源的网盘管理工具,还支持对象存储,本地存储,FTP 等等。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",H,[(0,n.eW)("Navidrome"),(0,n.bF)(t)]),(0,n.eW)(":NAS 上的私人专属在线音乐库。")]),(0,n.Lk)("li",null,[(0,n.bF)(we,{to:"/services/dockers-on-nas/"},{default:(0,n.k6)((()=>[(0,n.eW)("Emby")])),_:1}),(0,n.eW)("/Plex:这两者都是热门的视频流媒体解决方案。终身会员的价格为 119 美元。Jellyfin 作为一个开源免费的选择,同样是一个不错的考虑。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",C,[(0,n.eW)("LANraragi"),(0,n.bF)(t)]),(0,n.eW)(":免费开源的漫画管理器,支持 zip/rar/targz/lzma/7z/xz/cbz/cbr/pdf 多种格式,可从网页和 "),(0,n.Lk)("a",I,[(0,n.eW)("第三方客户端"),(0,n.bF)(t)]),(0,n.eW)(" 浏览。")]),E,(0,n.Lk)("li",null,[(0,n.Lk)("a",R,[(0,n.eW)("Komga"),(0,n.bF)(t)]),(0,n.eW)(":观看本地漫画。(还没用过,我习惯直接导入平板看)")]),$,(0,n.Lk)("li",null,[(0,n.Lk)("a",j,[(0,n.eW)("Tale Book"),(0,n.bF)(t)]),(0,n.eW)(":基于 Calibre 的简单的个人图书管理系统,支持在线阅读,但阅读体验不强且 Bug 较多,个人更喜欢直接用 PC 端查看。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",G,[(0,n.eW)("Bilibili_Danmuji"),(0,n.bF)(t)]),(0,n.eW)(":B 站直播礼物答谢、定时广告、关注感谢,自动回复工具,房管工具,自动打卡,Bilibili 直播弹幕姬 (使用 websocket 协议),java 版 B 站弹幕姬。部署 Docker 时需更新 jdr release 文件。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",O,[(0,n.eW)("无名杀"),(0,n.bF)(t)]),(0,n.eW)(":部署在 NAS 上的三国杀游戏。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",U,[(0,n.eW)("GSWXY - 魔兽世界单机服务端"),(0,n.bF)(t)]),(0,n.eW)(":需要 2G 内存和 20G 硬盘空间。你也可以直接使用"),(0,n.Lk)("a",X,[(0,n.eW)("耳语海岸 RP 服"),(0,n.bF)(t)]),(0,n.eW)("。")])]),V,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("a",J,[(0,n.eW)("n8n"),(0,n.bF)(t)]),(0,n.eW)(":开源 IFTTT 工具,偏重于云服务。")]),(0,n.Lk)("li",null,[(0,n.bF)(we,{to:"/family/HomeAutomation.html#node-red"},{default:(0,n.k6)((()=>[(0,n.eW)("Node-RED")])),_:1}),(0,n.eW)(":开源流处理,类似本地版的 IFTTT。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",K,[(0,n.eW)("Home Assistant"),(0,n.bF)(t)]),(0,n.eW)(":开源家庭自动化平台,可自定义集中管理各品牌的智能家居设备。米家设备需使用 hacs 下的集成 "),(0,n.bF)(we,{to:"/family/HomeAutomation.html#home-assistant"},{default:(0,n.k6)((()=>[(0,n.eW)("Xiaomi Miot Auto")])),_:1}),(0,n.eW)("。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",Y,[(0,n.eW)("Monica"),(0,n.bF)(t)]),(0,n.eW)(":Monica 允许人们记录所有关于朋友和家人的重要事情。喜欢和他们一起的活动。你最后一次打电话给某人的时候,你们谈了些什么。它会帮助你记住他们孩子的名字和年龄。它还能提醒你打电话给一个很久没联系的人。Monica 的容器设置查看 "),(0,n.Lk)("a",Z,[(0,n.eW)("Monica Docker"),(0,n.bF)(t)]),(0,n.eW)("。"),Q,(0,n.eW)(" 是它常年的一个 bug,可以通过指定数据库中的 users.me_contact_id 来解决。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",ee,[(0,n.eW)("supermanito/Helloworld"),(0,n.bF)(t)]),(0,n.eW)(":京东签到等脚本,功能很强大,没怎么研究。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",re,[(0,n.eW)("MoviePilot"),(0,n.bF)(t)]),(0,n.eW)(" 是 NAStool 作者重新推出的 NAS 媒体库自动化管理工具,使用说明参考 "),(0,n.Lk)("a",te,[(0,n.eW)("MoviePilot-Help"),(0,n.bF)(t)]),(0,n.eW)("。个人使用并不习惯使用,可能是我设置错了,使用后反而把媒体结构弄乱了。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",ne,[(0,n.eW)("ubuntu-desktop-lxde-vnc"),(0,n.bF)(t)]),(0,n.eW)(":能在 Docker 上运行的 Ubuntu 桌面版,适合挂载要长期运行的程序。测试 OBS 时,对内存要求不高,但 CPU 直冲 100%,fps 只有 7。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",le,[(0,n.eW)("RustDesk"),(0,n.bF)(t)]),(0,n.eW)(":自建远程桌面,平替 TeamViewer 的开源软件。矿神源有套件,可直接部署中继服务器。")])]),oe,(0,n.Lk)("ul",null,[ae,(0,n.Lk)("li",null,[(0,n.Lk)("a",ie,[(0,n.eW)("兰空图床"),(0,n.bF)(t)]),(0,n.eW)(":图床已经部署在七牛云,用 Picgo 上传,没感觉有必要用它。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",se,[(0,n.eW)("AutoBangumi"),(0,n.bF)(t)]),(0,n.eW)(":自动追番器,用以替代自我审查的 Bilibili。")]),ce]),ke,de,(0,n.Lk)("p",null,[(0,n.Lk)("a",ue,[(0,n.eW)("tinyMediaManager"),(0,n.bF)(t)]),(0,n.eW)(" v4 免费版足够个人使用,v3 作偶尔补充使用,搜索首选语言改为「大陆简体」更精准。"),pe]),he,(0,n.Lk)("section",be,[(0,n.Lk)("ol",fe,[(0,n.Lk)("li",ge,[(0,n.Lk)("p",null,[(0,n.Lk)("a",Le,[(0,n.eW)("群晖 NAS 使用 Emby+tMM 打造全平台观影畅爽体验(附下载地址)"),(0,n.bF)(t)]),(0,n.eW)(),me])]),(0,n.Lk)("li",We,[(0,n.Lk)("p",null,[(0,n.Lk)("a",Se,[(0,n.eW)("如何把群晖 NAS 上的套件搬到另外个硬盘上"),(0,n.bF)(t)]),(0,n.eW)(),ve])]),(0,n.Lk)("li",Ae,[(0,n.Lk)("p",null,[(0,n.Lk)("a",Ne,[(0,n.eW)("群晖 NAS 跨存储空间移动共享文件夹 (NAS 新增磁盘)"),(0,n.bF)(t)]),(0,n.eW)(),_e])])])])])}]]),Fe=JSON.parse('{"path":"/services/NAS.html","title":"NAS","lang":"zh-CN","frontmatter":{"article":false,"title":"NAS","icon":"process","order":1,"description":"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点: 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/NAS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"NAS"}],["meta",{"property":"og:description","content":"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点: 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T10:09:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-23T10:09:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"NAS\\",\\"description\\":\\"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点: 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时...\\"}"]]},"headers":[{"level":2,"title":"NAS 套件","slug":"nas-套件","link":"#nas-套件","children":[]},{"level":2,"title":"Docker API","slug":"docker-api","link":"#docker-api","children":[]},{"level":2,"title":"Docker 容器","slug":"docker-容器","link":"#docker-容器","children":[{"level":3,"title":"常用","slug":"常用","link":"#常用","children":[]},{"level":3,"title":"资讯","slug":"资讯","link":"#资讯","children":[]},{"level":3,"title":"娱乐","slug":"娱乐","link":"#娱乐","children":[]},{"level":3,"title":"自动化","slug":"自动化","link":"#自动化","children":[]},{"level":3,"title":"待了解","slug":"待了解","link":"#待了解","children":[]}]},{"level":2,"title":"影视整理","slug":"影视整理","link":"#影视整理","children":[]},{"level":2,"title":"NAS 硬盘","slug":"nas-硬盘","link":"#nas-硬盘","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1706004554000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":34}]},"readingTime":{"minutes":8.66,"words":2599},"filePathRelative":"services/NAS.md","localizedDate":"2022年7月22日","excerpt":"

    NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点:

    \\n
      \\n
    • 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。
    • \\n
    • 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时任务脚本。
    • \\n
    • SSD 缓存对家用的 NAS 性能提升不大,没必要加。
    • \\n
    • 群晖系统分布在所有硬盘,拔出一个不影响使用。但应用会有影响?
    • \\n
    • NAS Docker 建议指定本地端口,否则重启容器会让端口发生改变,重启不会不影响 docker 配置。
    • \\n
    • 升级容器镜像,不影响内部数据库。群晖的「Docker 导出」只会导出安装镜像和配置,但不包括容器内部使用的数据库,用处不大。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/NewSystem.html.a5bbda73.js b/assets/js/NewSystem.html.a5bbda73.js new file mode 100644 index 000000000..707e43d12 --- /dev/null +++ b/assets/js/NewSystem.html.a5bbda73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9973],{3671:(a,n)=>{n.A=(a,n)=>{const e=a.__vccOpts||a;for(const[a,s]of n)e[a]=s;return e}},5355:(a,n,e)=>{e.r(n),e.d(n,{comp:()=>U,data:()=>Z});var s=e(7847);const t=(0,s.Lk)("h2",{id:"重装准备",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#重装准备"},[(0,s.Lk)("span",null,"重装准备")])],-1),l={href:"https://newzone.top/apps/Applist.html",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Lk)("li",null,"同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。",-1),o=(0,s.Lk)("li",null,"反激活已购软件,如:Eagle、MoneyWiz、妙笔。",-1),r={href:"https://www.microsoft.com/zh-cn/software-download/windows11",target:"_blank",rel:"noopener noreferrer"},i=(0,s.Lk)("h2",{id:"安装系统",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#安装系统"},[(0,s.Lk)("span",null,"安装系统")])],-1),c=(0,s.Lk)("strong",null,"NTFS/exFAT",-1),k={href:"https://www.itsk.com/latest",target:"_blank",rel:"noopener noreferrer"},u={href:"https://www.wepe.com.cn/download.html",target:"_blank",rel:"noopener noreferrer"},d=(0,s.Lk)("p",null,"使用 U 盘引导安装系统:",-1),m=(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,"本地安装:右键 ISO 文件,选择挂载;在新出现的驱动器中,找到 setup.exe,直接运行;选择「现在安装」。"),(0,s.Lk)("li",null,[(0,s.eW)("引导安装:采用 UEFI+GPT。如果是自定义安装清空系统盘所有分区后,一定要用 "),(0,s.Lk)("strong",null,"GPT"),(0,s.eW)(" 对系统盘分区。")])],-1),b=(0,s.Lk)("h2",{id:"系统配置",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#系统配置"},[(0,s.Lk)("span",null,"系统配置")])],-1),g=(0,s.Lk)("li",null,"将 Documents、Desktop 转移到 D 盘。",-1),h=(0,s.Lk)("li",null,[(0,s.eW)("环境包安装:"),(0,s.Lk)("code",null,"npm i -g npm@latest; npm i -g pnpm; npm i -g yarn; npm i -g docsify-cli"),(0,s.eW)("。")],-1),w=(0,s.Lk)("li",null,"显示屏校色:屏幕换线或换主机,参数可能会变动。在颜色管理部分还原显示器设置。",-1),f=(0,s.Lk)("li",null,"任务栏:在任务栏底部右键单击,选择「任务栏设置」>「通知区域」>「选择哪些图标显示在任务栏上」;在同页面的「多显示器设置」中,取消「在所有显示器上显示任务栏」。",-1),v=(0,s.Lk)("li",null,"Win11 本地账户也被提示需要登录密码,但设置密码后,无法直接开机登录。设置新密码后,点击「设置」>「账户」>「登录选项」>「密码」,可以重新设置空密码,实现自动登录。在账户中可以设置密码永不过期。",-1),L={href:"https://zhuanlan.zhihu.com/p/25942015",target:"_blank",rel:"noopener noreferrer"},W={href:"https://newzone.top/posts/2017-09-02-forced_shutdown.html",target:"_blank",rel:"noopener noreferrer"},y=(0,s.Lk)("li",null,"台机的电源模式调整到最佳性能模式。",-1),S=(0,s.Lk)("p",null,"系统配置注意:",-1),F=(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,"右键更改前先备份注册表,有几率会影响系统稳定性。"),(0,s.Lk)("li",null,"英语键盘删不掉:添加英语语言包,然后再删除,英语键盘也会一起删除。")],-1),D=(0,s.Lk)("h2",{id:"安装应用",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#安装应用"},[(0,s.Lk)("span",null,"安装应用")])],-1),E={href:"https://newzone.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html",target:"_blank",rel:"noopener noreferrer"},T=(0,s.Lk)("code",null,"InternetOpenUrl() failed. 0x80072f7d : unknown error",-1),_=(0,s.Fv)('

    Mircrosoft Store

    由于微软应用商店能自动更新应用,我习惯通过它安装一些无需配置的应用。这些应用包括 Windows Terminal、Windows Notepad、Windows 闹钟和时钟、Windows 扫描、Windows 相机、Windows 录音机、Snipaste、Ditto、PowerToys、One Commander、思源笔记、Discord。以下是按顺序排列的一键安装命令:

    winget install 9N0DX20HK701 -s msstore  ;  winget install 9MSMLRH6LZF3 -s msstore  ;  winget install 9WZDNCRFJ3PR -s msstore  ;  winget install 9WZDNCRFJ3PV -s msstore  ;  winget install 9WZDNCRFJBBG -s msstore  ;  winget install 9WZDNCRFHWKN -s msstore  ;  winget install 9P1WXPKB68KX -s msstore  ;  winget install 9NBLGGH3ZBJQ -s msstore  ;  winget install XP89DCGQ3K6VLD -s msstore  ;  winget install 9NBLGGH4S79B -s msstore  ;  winget install 9P7HPMXP73K4 -s msstore  ;  winget install XPDC2RH70K22MN -s msstore\n

    常规应用

    以下是常用的非微软商店应用的批量安装命令:

    winget install --id=Mozilla.Firefox -e  ; winget install --id=Google.Chrome -e  ; winget install --id=Brave.Brave -e  ; winget install --id=Mozilla.Thunderbird -e  ; winget install --id=Logitech.Options -e  ; winget install --id=Tencent.WeChat -e  ; winget install --id=Tencent.TIM -e  ; winget install --id=Tencent.QQ.NT -e  ; winget install --id=Telegram.TelegramDesktop -e  ; winget install --id=Microsoft.VisualStudioCode -e  ; winget install --id=Notepad++.Notepad++ -e  ; winget install --id=Notion.Notion -e  ; winget install --id=Formagrid.Airtable -e  ; winget install --id=Figma.Figma -e  ; winget install --id=ogdesign.Eagle -e  ; winget install --id=PicGo.PicGo.Beta -e  ; winget install --id=Gyan.FFmpeg -e  ; winget install --id=ByteDance.JianyingPro -e  ; winget install --id=HandBrake.HandBrake -e  ; winget install --id=Audacity.Audacity -e  ; winget install --id=Logseq.Logseq -e  ; winget install --id=Obsidian.Obsidian -e  ; winget install --id=Appest.Dida -e  ; winget install --id=SumatraPDF.SumatraPDF -e  ; winget install --id=Bandisoft.Honeyview -e  ; winget install --id=Alibaba.aDrive  -e  ; winget install --id=115.115Chrome -e  ; winget install --id=VideoLAN.VLC -e  ; winget install --id=ByteDance.JianyingPro -e  ; winget install --id=Git.Git -e; winget install --id=GitHub.GitHubDesktop -e  ; winget install --id=Hesan.He3 -e  ; winget install --id=NickeManarin.ScreenToGif -e  ; winget install --id=Valve.Steam -e  ; winget install --id=Nutstore.Nutstore -e  ; winget install --id=TominLab.WonderPen -e  ; winget install --id=OBSProject.OBSStudio -e  ; winget install --id=mgth.LittleBigMouse -e\n

    对更新党来说,在后续应用管理可以搭配 winget upgrade 来检查是否有应用更新。也可以使用 winget upgrade --all 来静默升级所有支持 winget 的程序。

    手动安装应用

    ',8),N={href:"https://learn.microsoft.com/zh-cn/windows/wsl/install#install-wsl-command",target:"_blank",rel:"noopener noreferrer"},C=(0,s.Lk)("code",null,"wsl --install",-1),P={href:"https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-1---enable-the-windows-subsystem-for-linux",target:"_blank",rel:"noopener noreferrer"},A={href:"https://docs.docker.com/get-docker/",target:"_blank",rel:"noopener noreferrer"},x=(0,s.Lk)("li",null,"同步设置:GoodSync 保持本地不同目录间的文件同步;Synology Drive 将本地文件备份到 NAS。",-1),B={href:"https://www.iplaysoft.com/win11-wsa.html",target:"_blank",rel:"noopener noreferrer"},G=(0,s.Lk)("h2",{id:"应用配置",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#应用配置"},[(0,s.Lk)("span",null,"应用配置")])],-1),z=(0,s.Fv)("
  • 配置:RIME、Picgo、Wonderpen、Eagle。
  • Everything 注册右键搜索当前路径;右键清除。
    • win+r, regedit 打开注册表,打开路径 HKEY_CLASSES_ROOT\\Directory\\Background\\shell
    • 新建项,命名随意 ( 即右键菜单显示的文字 ) -「Everything 搜索当前路径」。
    • 右键再次新建项,命名 Command,打开修改右侧默认值为 "D: \\Everything\\Everything.exe" -path "."
  • 按键更改:
    • Powertoys:将 insert 键改为 backspace。
    • Logitech.Options:将键盘的计算器改为「上一个桌面」;右键菜单改为「下一个桌面」。
  • ",3),H=(0,s.Lk)("h3",{id:"旧资料-已弃用",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#旧资料-已弃用"},[(0,s.Lk)("span",null,"旧资料(已弃用)")])],-1),M={href:"https://dandelioncloud.cn/article/details/1569126817577791489",target:"_blank",rel:"noopener noreferrer"},O=(0,s.Lk)("li",null,[(0,s.eW)("firefox-about: config 修改原值 18 的 "),(0,s.Lk)("code",null,"ui.key.menuAccessKey"),(0,s.eW)(" 为 0,以屏蔽 alt 防止热键冲突;选择「options」>「Network Settings」,取消勾选「DNS over HTTPS」。")],-1),R={href:"https://github.com/tutugreen/Huorong-Rules/tree/main/Tencent",target:"_blank",rel:"noopener noreferrer"},V={href:"https://vb-audio.com/Cable/",target:"_blank",rel:"noopener noreferrer"},K={href:"https://www.youtube.com/watch?v=1DsrniDGOJQ",target:"_blank",rel:"noopener noreferrer"},J={},U=(0,e(3671).A)(J,[["render",function(a,n){const e=(0,s.g2)("ExternalLinkIcon"),J=(0,s.g2)("RouteLink");return(0,s.uX)(),(0,s.CE)("div",null,[t,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.eW)("备份:"),(0,s.Lk)("a",l,[(0,s.eW)("必备应用"),(0,s.bF)(e)]),(0,s.eW)("、油猴脚本、VSCode 配置、输入法配置。")]),p,o,(0,s.Lk)("li",null,[(0,s.eW)("更新 "),(0,s.Lk)("a",r,[(0,s.eW)("原版镜像"),(0,s.bF)(e)]),(0,s.eW)("。")])]),i,(0,s.Lk)("p",null,[(0,s.eW)("系统重装维修前,在 "),c,(0,s.eW)(" 格式的 U 盘上安装 "),(0,s.Lk)("a",k,[(0,s.eW)("优启通"),(0,s.bF)(e)]),(0,s.eW)(" 或 "),(0,s.Lk)("a",u,[(0,s.eW)("微 PE 工具箱"),(0,s.bF)(e)]),(0,s.eW)("。Windows 10/11 镜像超过 4GB,已经不再支持 FAT32 格式的 U 盘。")]),d,m,b,(0,s.Lk)("ul",null,[g,h,w,f,v,(0,s.Lk)("li",null,[(0,s.Lk)("a",L,[(0,s.eW)("清理导航栏"),(0,s.bF)(e)])]),(0,s.Lk)("li",null,[(0,s.Lk)("a",W,[(0,s.eW)("设置系统强制关机"),(0,s.bF)(e)]),(0,s.eW)(",防止系统关机不成功。")]),y]),S,F,D,(0,s.Lk)("p",null,[(0,s.eW)("使用 "),(0,s.Lk)("a",E,[(0,s.eW)("winstall"),(0,s.bF)(e)]),(0,s.eW)(" 可以批量安装应用,但这需要你提前登录微软账户,并更改 ps1 的运行权限。如果出现"),T,(0,s.eW)(" 则检查 TLS 是否开启 1.2 和 1.3。(每次使用四大行网银后,基本都需要修复次)")]),_,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.Lk)("a",N,[(0,s.eW)("WSL"),(0,s.bF)(e)]),(0,s.eW)(" :在管理员模式下打开 PowerShell 或 Windows 命令提示符,输入 "),C,(0,s.eW)(" 命令。如果提示错误,则按 "),(0,s.Lk)("a",P,[(0,s.eW)("旧版 WSL 的手动安装步骤"),(0,s.bF)(e)]),(0,s.eW)(" 开启步骤 1 和 3 的功能。WSL 安装并重启成功后,安装 "),(0,s.Lk)("a",A,[(0,s.eW)("Docker Desktop"),(0,s.bF)(e)]),(0,s.eW)("。")]),x,(0,s.Lk)("li",null,[(0,s.eW)("电脑运行 Android 手机应用, "),(0,s.Lk)("a",B,[(0,s.eW)("Win11 安卓子系统"),(0,s.bF)(e)]),(0,s.eW)(" ( WSA ) 安装。")])]),G,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.eW)("绿色开机:开机脚本、Keepass、Ditto。开机脚本用 "),(0,s.bF)(J,{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:(0,s.k6)((()=>[(0,s.eW)("管理员权限启动脚本")])),_:1}),(0,s.eW)("。")]),z]),H,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.eW)("如果空间不足,可以把 "),(0,s.Lk)("a",M,[(0,s.eW)("WSL 从 C 盘迁移至 D 盘的简单实用方法"),(0,s.bF)(e)]),(0,s.eW)(",但容易出现兼容性问题。")]),O,(0,s.Lk)("li",null,[(0,s.eW)("火绒-安全设置-高级防护-导入隐私规则,增加 "),(0,s.Lk)("a",R,[(0,s.eW)("腾讯屏蔽规则"),(0,s.bF)(e)]),(0,s.eW)("。")]),(0,s.Lk)("li",null,[(0,s.eW)("实时将音频转文字:管理员方式安装 "),(0,s.Lk)("a",V,[(0,s.eW)("VB-CABLE"),(0,s.bF)(e)]),(0,s.eW)(" ,输入输出设备都选 VB-CABLE,详细设置查看 "),(0,s.Lk)("a",K,[(0,s.eW)("How to Convert Audio to Text - FREE & No Time Limits"),(0,s.bF)(e)]),(0,s.eW)("。")])])])}]]),Z=JSON.parse('{"path":"/windows/NewSystem.html","title":"系统重装","lang":"zh-CN","frontmatter":{"article":false,"title":"系统重装","icon":"update","order":2,"description":"重装准备 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。 反激活已购软件,如:Eagle、MoneyWiz、妙笔。 更新 原版镜像。 安装系统 系统重装维修前,在 NTFS/exFAT 格式的 U 盘上安装 优启通 或 微 PE 工具箱。Windows 10/11 镜像超过...","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/NewSystem.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"系统重装"}],["meta",{"property":"og:description","content":"重装准备 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。 反激活已购软件,如:Eagle、MoneyWiz、妙笔。 更新 原版镜像。 安装系统 系统重装维修前,在 NTFS/exFAT 格式的 U 盘上安装 优启通 或 微 PE 工具箱。Windows 10/11 镜像超过..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"系统重装\\",\\"description\\":\\"重装准备 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。 反激活已购软件,如:Eagle、MoneyWiz、妙笔。 更新 原版镜像。 安装系统 系统重装维修前,在 NTFS/exFAT 格式的 U 盘上安装 优启通 或 微 PE 工具箱。Windows 10/11 镜像超过...\\"}"]]},"headers":[{"level":2,"title":"重装准备","slug":"重装准备","link":"#重装准备","children":[]},{"level":2,"title":"安装系统","slug":"安装系统","link":"#安装系统","children":[]},{"level":2,"title":"系统配置","slug":"系统配置","link":"#系统配置","children":[]},{"level":2,"title":"安装应用","slug":"安装应用","link":"#安装应用","children":[{"level":3,"title":"Mircrosoft Store","slug":"mircrosoft-store","link":"#mircrosoft-store","children":[]},{"level":3,"title":"常规应用","slug":"常规应用","link":"#常规应用","children":[]},{"level":3,"title":"手动安装应用","slug":"手动安装应用","link":"#手动安装应用","children":[]}]},{"level":2,"title":"应用配置","slug":"应用配置","link":"#应用配置","children":[{"level":3,"title":"旧资料(已弃用)","slug":"旧资料-已弃用","link":"#旧资料-已弃用","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":22}]},"readingTime":{"minutes":4.91,"words":1472},"filePathRelative":"windows/NewSystem.md","localizedDate":"2022年7月22日","excerpt":"

    重装准备

    \\n
      \\n
    • 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。
    • \\n
    • 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。
    • \\n
    • 反激活已购软件,如:Eagle、MoneyWiz、妙笔。
    • \\n
    • 更新 原版镜像
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6cd65031.71f19374.js b/assets/js/Python.html.1193c5b3.js similarity index 97% rename from assets/js/v-6cd65031.71f19374.js rename to assets/js/Python.html.1193c5b3.js index 32234da40..c0f3c823f 100644 --- a/assets/js/v-6cd65031.71f19374.js +++ b/assets/js/Python.html.1193c5b3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6393],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},2632:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>h,data:()=>g});var t=a(3968);const p=(0,t.QD)("p",null,"Python 很久没用了,暂时只做记录作用。",-1),e=(0,t.QD)("h2",{id:"入门文档",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#入门文档"},[(0,t.QD)("span",null,"入门文档")])],-1),o={href:"http://www.runoob.com/python3/python3-basic-syntax.html",target:"_blank",rel:"noopener noreferrer"},l={href:"http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html#intro-tutorial",target:"_blank",rel:"noopener noreferrer"},c={href:"https://requests.readthedocs.io/zh_CN/latest/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://openpyxl.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"},r=(0,t.QD)("li",null,"Pillow 模块 - 图片",-1),k=(0,t.QD)("li",null,"re 模块 - 正则表达式",-1),d=(0,t.IL)('

    简单示例

    import requests  #载入指定库\nheaders = {'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'}\nr = requests.get("<http://www.runoob.com/python3/python3-string.html>", headers=headers)\n#r.encoding = 'utf-8' #如果没设置表头,可以设置编码防止中文出现乱码\nr.encoding = r.apparent_encoding #使用网页固定编码\nprint(r.text)\nprint(r.headers)\n\nfrom bs4 import BeautifulSoup\nsoup = BeautifulSoup(r.text, "html.parser")\nprint(soup.title.string)\n\nfrom PIL import Image\n\n# 打开一个 jpg 图像文件,注意是当前路径\nim = Image.open('test.jpg')\n# 获得图像尺寸\nw, h = im.size\nprint('Original image size: %sx%s' % (w, h))\n# 缩放到 50%\nim.thumbnail((w//2, h//2))\nprint('Resize image to: %sx%s' % (w//2, h//2))\n# 把缩放后的图像用 jpeg 格式保存\nim.save('thumbnail.jpg', 'jpeg')\n

    if __name__ = "__main__" 是只在主程序中运行,如果是作为模块引用,则不运行。 sys.path.append("c:\\\\\\\\Python37\\\\\\\\test) 添加模块的搜索路径文件夹。\\\\ 在 Pythone 中会转义,所以要输入两个。

    基础语法

    # end=" "为后缀,可空,默认为换行符\nprint("密码不能含有“*”,你还有",count,"次机会", end=" ")\n\n# ''' 三引号可以用多行,或在每行后添加 \\\\ ,或每行用引号括起来\n\ntype(a) #判别变量种类,容易出问题,不要用于判定\nisinstance(a,float) #判断变量是否是该类型,主要使用\n\n# s 为字符串\ns.isalnum()  #所有字符都是数字或者字母,为真返回 True, 否则返回 False\ns.isalpha()  #所有字符都是字母,为真返回 True, 否则返回 False\ns.isdigit()  #所有字符都是数字,为真返回 True, 否则返回 False\ns.islower()  #所有字符都是小写,为真返回 True, 否则返回 False\ns.isupper()  #所有字符都是大写,为真返回 True, 否则返回 False\ns.istitle    #所有单词都是首字母大写,为真返回 True, 否则返回 False\ns.isspace    #所有字符都是空白字符,为真返回 True, 否则返回 False\n

    序列类型

    #列表\nlist =[1,2,3,"a","b"]\nlist.append([4,1])\nlist =[1,2,3,"a","b",[4,1]] #append() 函数是方法向列表的尾部添加一个新的元素\n\n#元组\ntuple = (1,2,3,"a","b")\ntuple = (1,) #元组只有一个元素时,必须在后面加逗号\n\n#字符串\nset() 是个集合函数,括号里的参数可以是字典类型,列表类型,元组类型,字符串类型,不能是数字类型。\ns1 = "abc123"\ns2 = "abc,123"\ns2.split(",")) #字符串分割后变为列表,使用逗号进行分割 ["abc",123]\nprint("|".join(list)) #join 只能对字符串进行操作,用"|"中的符号连接字符串,比如 ab\n\nr1 = range(1, 4)\n\n#集合是无序列的,每次出现顺序都不同,不支持按索引提取\nset()\nset1 = set(list) =([1,2,3,"a","b"])\ncollege1 = {"哲学", "经济学", "法学"}\nprint(college1) #每次集合排列顺序是随机的\ncollege2 = set(["哲学", "经济学", "法学"]) #将其他数据转换为集合\n\n#字典\ndict()\n{}\n

    字符串用法

    len(string) #返回字符串长度\njoin(seq)  # 以指定字符串作为分隔符,将 seq 中所有的元素 (的字符串表示) 合并为一个新的字符串\nstartswith(str, beg=0,end=len(string)) #检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查。\nendswith(suffix, beg=0, end=len(string)) # 检查字符串是否以 obj 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.\n\ncount(str, beg= 0,end=len(string))  # 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数\nfind(str, beg=0 end=len(string))  #检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回 -1\nrfind(str, beg=0,end=len(string)) #类似于 find() 函数,不过是从右边开始查找。\nindex(str, beg=0, end=len(string)) # 跟 find() 方法一样,只不过如果 str 不在字符串中会报一个异常。\nrindex( str, beg=0, end=len(string)) #类似于 index(),不过是从右边开始。\n\nstrip([chars])   #在字符串上执行 lstrip() 和 rstrip(),移除头尾指定字符\nreplace(old, new [, max]) #把 将字符串中的 str1 替换成 str2,如果 max 指定,则替换不超过 max 次。\nsplit(str="", num=string.count(str))  #num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串\nsplitlines([keepends])  #按照行 ('\\\\r', '\\\\r\\\\n', \\\\n') 分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。\n\nlower()  #转换字符串中所有大写字符为小写。\nupper()  #转换字符串中的小写字母为大写\nswapcase() #将字符串中大写转换为小写,小写转换为大写\n

    运算符

    运算符描述实例
    %取模 - 返回除法的余数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 运算符优先级
    Python 运算符优先级

    条件三元表达式

    x, y = 4, 5\nif x < y:\n    small = x\nelse:\n    small = y\n# 可以缩略为下面一句\nsmall = x if x < y else y\n\nx,y,z=6,5,5\nif x<y:\n    small = x\n    if z < small:\n        small =z\nelif y < z:\n    small =y\nelse:\n    small = z\n# 可以缩略为下面一句\nsmall = x if (x<y and not(z<x)) else (y if y<z else z)\n

    条件循环

    while True:    # 无限循环条件\nbreak # 跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行\ncontinue # 告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环\nfor a in b   #遍历任何序列的项目,如一个列表或者一个字符串\n\n# assert(断言)确保程序中的某个条件一定为真才能让程序正常工作,否则就让程序自动崩溃并抛出 AssertionError 异常\nassert 3 > 4\n
    #条件循环参考,用户只有三次输入错误,内容中包含“*”不计算在内\ncount=3\npassword="xxxxdfd"\n\nwhile count:  # 0 为 False,其他为 True\n    passwd = input("请输入密码:")\n    if passwd == password:\n        print("密码正确,进入程序")\n        break\n    elif "*" in passwd:\n  # end=" "为后缀,可空,默认为换行符\n        print("密码不能含有“*”,你还有",count,"次机会", end=" ")\n        continue\n    else:\n        print("密码错误,你还有",count-1,"次机会", end=" ")\n    count-=1\n

    range() 函数

    range(stop)

    range(start, stop[, step])

    range 函数具有一些特性:

    • 如果 step 参数缺省,默认 1;如果 start 参数缺省,默认 0。
    • 如果 step 是正整数,则最后一个元素(start + i _ step)小于 stop。
    • 如果 step 是负整数,则最后一个元素(start + i _ step)大于 stop。
    • step 参数必须是非零整数,否则抛出 VauleError 异常。

    向列表添加元素

    ',24),m={href:"http://www.runoob.com/python/python-lists.html",target:"_blank",rel:"noopener noreferrer"},b=(0,t.IL)('
    list =[1,"xxxx",3.14,[1,3,3]]\nlist.append(3)   # 添加元素\nlist.extend([1,2,"或"])    # 添加列表\nlist.insert(index, obj)   # index -- 对象 obj 需要插入的索引位置 (从 0 开始 ); obj -- 要插入列表中的对象。\n\nlist.remove("xxxx")  # 删除第一个含有相同内容的元素\ndel list[2]            #删除指定索引位置的元素\nlist.pop(obj=list[-1])      #obj -- 可选参数,从列表要移除指定索引位置的对象,默认为最后以为,返回被移出的元素对象\n\nlist.reverse()  #将列表彻底反转\nlist.sort()        #从小往大排训\nlist.sort(reverse=True) #从大往小排序\n\n将指定列表的小甲鱼改为小鱿鱼\nlist1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]\nlist1[1][2][0] = '小鱿鱼'\n

    列表切片

    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)      #元祖\ntemp=temp[:2]+(“y”,)+temp[2:]\ndel temp #删除元祖\n

    列表解析

    list1 = [x**2 for x in range(10)]  #list1 为 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n#相当于\nlist1 = []\nfor x in range(10):\n    list1.append(x**2)\n\n>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]\n#相当于\nlist1 = []\nfor x in range(10):\n    for y in range(10):\n        if x%2==0:\n            if y%2!=0:\n                list1.extend([(x,y)])\nprint(list1)\n

    变量

    Python 变量是贴标签,而非存储数据

    list1=[1,3,2,9,7,8]\nlist2=list1[:]\nlist3=list1\n# list2 和 list3 的值此时相同,但一旦对 list1 内部进行调整,比如排序、增减变量\nlist1.sort()  # list3 会随着 list1 发生变化,list2 不变\n

    lambda、filter、map

    g=lambda x,y : x+y\ng(3,4)\n7\nlist(filter(lambda x:x%2,range(10))) #过滤 0-9 中能整除 2 的数字\nlist(map(lambda x : x%2, range(10))) #罗列 0-9 每个数字乘 2 的结果\n
    ',14),v={},h=(0,a(9720).c)(v,[["render",function(n,s){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[p,e,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",o,[(0,t.mY)("Python3 语法"),(0,t.K2)(a)])]),(0,t.QD)("li",null,[(0,t.QD)("a",l,[(0,t.mY)("Scrapy 入门"),(0,t.K2)(a)]),(0,t.mY)(" 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5")]),(0,t.QD)("li",null,[(0,t.QD)("a",c,[(0,t.mY)("requests"),(0,t.K2)(a)]),(0,t.mY)(" 模块 - 获取数据")]),(0,t.QD)("li",null,[(0,t.QD)("a",i,[(0,t.mY)("BeautifulSoup4"),(0,t.K2)(a)]),(0,t.mY)(" 模块 - 解析 HTML")]),(0,t.QD)("li",null,[(0,t.QD)("a",u,[(0,t.mY)("openpyxl"),(0,t.K2)(a)]),(0,t.mY)(" 模块 - 读写 Excel 文件")]),r,k]),d,(0,t.QD)("p",null,[(0,t.QD)("a",m,[(0,t.mY)("向列表添加元素"),(0,t.K2)(a)])]),b])}]]),g=JSON.parse('{"path":"/code/Python.html","title":"Python","lang":"zh-CN","frontmatter":{"article":false,"title":"Python","icon":"python","order":3,"description":"Python 很久没用了,暂时只做记录作用。 入门文档 Python3 语法 Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 requests 模块 - 获取数据 BeautifulSoup4 模块 - 解析 HTML openpyxl 模块 - 读写 Excel 文件 P...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Python.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Python"}],["meta",{"property":"og:description","content":"Python 很久没用了,暂时只做记录作用。 入门文档 Python3 语法 Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 requests 模块 - 获取数据 BeautifulSoup4 模块 - 解析 HTML openpyxl 模块 - 读写 Excel 文件 P..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-29-18-18-44.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-16T08:12:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Python"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-05-16T08:12:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Python\\",\\"description\\":\\"Python 很久没用了,暂时只做记录作用。 入门文档 Python3 语法 Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 requests 模块 - 获取数据 BeautifulSoup4 模块 - 解析 HTML openpyxl 模块 - 读写 Excel 文件 P...\\"}"]]},"headers":[{"level":2,"title":"入门文档","slug":"入门文档","link":"#入门文档","children":[]},{"level":2,"title":"简单示例","slug":"简单示例","link":"#简单示例","children":[]},{"level":2,"title":"基础语法","slug":"基础语法","link":"#基础语法","children":[]},{"level":2,"title":"序列类型","slug":"序列类型","link":"#序列类型","children":[]},{"level":2,"title":"字符串用法","slug":"字符串用法","link":"#字符串用法","children":[]},{"level":2,"title":"运算符","slug":"运算符","link":"#运算符","children":[]},{"level":2,"title":"条件三元表达式","slug":"条件三元表达式","link":"#条件三元表达式","children":[]},{"level":2,"title":"条件循环","slug":"条件循环","link":"#条件循环","children":[]},{"level":2,"title":"range() 函数","slug":"range-函数","link":"#range-函数","children":[]},{"level":2,"title":"向列表添加元素","slug":"向列表添加元素","link":"#向列表添加元素","children":[]},{"level":2,"title":"列表切片","slug":"列表切片","link":"#列表切片","children":[{"level":3,"title":"列表解析","slug":"列表解析","link":"#列表解析","children":[]}]},{"level":2,"title":"变量","slug":"变量","link":"#变量","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1684224765000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":7.99,"words":2397},"filePathRelative":"code/Python.md","localizedDate":"2022年7月22日","excerpt":"

    Python 很久没用了,暂时只做记录作用。

    \\n

    入门文档

    \\n
      \\n
    • Python3 语法
    • \\n
    • Scrapy 入门\\n浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5
    • \\n
    • requests 模块 - 获取数据
    • \\n
    • BeautifulSoup4 模块 - 解析 HTML
    • \\n
    • openpyxl 模块 - 读写 Excel 文件
    • \\n
    • Pillow 模块 - 图片
    • \\n
    • re 模块 - 正则表达式
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3058],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},7389:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>h,data:()=>g});var t=a(7847);const p=(0,t.Lk)("p",null,"Python 很久没用了,暂时只做记录作用。",-1),e=(0,t.Lk)("h2",{id:"入门文档",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#入门文档"},[(0,t.Lk)("span",null,"入门文档")])],-1),o={href:"http://www.runoob.com/python3/python3-basic-syntax.html",target:"_blank",rel:"noopener noreferrer"},l={href:"http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html#intro-tutorial",target:"_blank",rel:"noopener noreferrer"},c={href:"https://requests.readthedocs.io/zh_CN/latest/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://openpyxl.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"},r=(0,t.Lk)("li",null,"Pillow 模块 - 图片",-1),k=(0,t.Lk)("li",null,"re 模块 - 正则表达式",-1),d=(0,t.Fv)('

    简单示例

    import requests  #载入指定库\nheaders = {'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'}\nr = requests.get("<http://www.runoob.com/python3/python3-string.html>", headers=headers)\n#r.encoding = 'utf-8' #如果没设置表头,可以设置编码防止中文出现乱码\nr.encoding = r.apparent_encoding #使用网页固定编码\nprint(r.text)\nprint(r.headers)\n\nfrom bs4 import BeautifulSoup\nsoup = BeautifulSoup(r.text, "html.parser")\nprint(soup.title.string)\n\nfrom PIL import Image\n\n# 打开一个 jpg 图像文件,注意是当前路径\nim = Image.open('test.jpg')\n# 获得图像尺寸\nw, h = im.size\nprint('Original image size: %sx%s' % (w, h))\n# 缩放到 50%\nim.thumbnail((w//2, h//2))\nprint('Resize image to: %sx%s' % (w//2, h//2))\n# 把缩放后的图像用 jpeg 格式保存\nim.save('thumbnail.jpg', 'jpeg')\n

    if __name__ = "__main__" 是只在主程序中运行,如果是作为模块引用,则不运行。 sys.path.append("c:\\\\\\\\Python37\\\\\\\\test) 添加模块的搜索路径文件夹。\\\\ 在 Pythone 中会转义,所以要输入两个。

    基础语法

    # end=" "为后缀,可空,默认为换行符\nprint("密码不能含有“*”,你还有",count,"次机会", end=" ")\n\n# ''' 三引号可以用多行,或在每行后添加 \\\\ ,或每行用引号括起来\n\ntype(a) #判别变量种类,容易出问题,不要用于判定\nisinstance(a,float) #判断变量是否是该类型,主要使用\n\n# s 为字符串\ns.isalnum()  #所有字符都是数字或者字母,为真返回 True, 否则返回 False\ns.isalpha()  #所有字符都是字母,为真返回 True, 否则返回 False\ns.isdigit()  #所有字符都是数字,为真返回 True, 否则返回 False\ns.islower()  #所有字符都是小写,为真返回 True, 否则返回 False\ns.isupper()  #所有字符都是大写,为真返回 True, 否则返回 False\ns.istitle    #所有单词都是首字母大写,为真返回 True, 否则返回 False\ns.isspace    #所有字符都是空白字符,为真返回 True, 否则返回 False\n

    序列类型

    #列表\nlist =[1,2,3,"a","b"]\nlist.append([4,1])\nlist =[1,2,3,"a","b",[4,1]] #append() 函数是方法向列表的尾部添加一个新的元素\n\n#元组\ntuple = (1,2,3,"a","b")\ntuple = (1,) #元组只有一个元素时,必须在后面加逗号\n\n#字符串\nset() 是个集合函数,括号里的参数可以是字典类型,列表类型,元组类型,字符串类型,不能是数字类型。\ns1 = "abc123"\ns2 = "abc,123"\ns2.split(",")) #字符串分割后变为列表,使用逗号进行分割 ["abc",123]\nprint("|".join(list)) #join 只能对字符串进行操作,用"|"中的符号连接字符串,比如 ab\n\nr1 = range(1, 4)\n\n#集合是无序列的,每次出现顺序都不同,不支持按索引提取\nset()\nset1 = set(list) =([1,2,3,"a","b"])\ncollege1 = {"哲学", "经济学", "法学"}\nprint(college1) #每次集合排列顺序是随机的\ncollege2 = set(["哲学", "经济学", "法学"]) #将其他数据转换为集合\n\n#字典\ndict()\n{}\n

    字符串用法

    len(string) #返回字符串长度\njoin(seq)  # 以指定字符串作为分隔符,将 seq 中所有的元素 (的字符串表示) 合并为一个新的字符串\nstartswith(str, beg=0,end=len(string)) #检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查。\nendswith(suffix, beg=0, end=len(string)) # 检查字符串是否以 obj 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.\n\ncount(str, beg= 0,end=len(string))  # 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数\nfind(str, beg=0 end=len(string))  #检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回 -1\nrfind(str, beg=0,end=len(string)) #类似于 find() 函数,不过是从右边开始查找。\nindex(str, beg=0, end=len(string)) # 跟 find() 方法一样,只不过如果 str 不在字符串中会报一个异常。\nrindex( str, beg=0, end=len(string)) #类似于 index(),不过是从右边开始。\n\nstrip([chars])   #在字符串上执行 lstrip() 和 rstrip(),移除头尾指定字符\nreplace(old, new [, max]) #把 将字符串中的 str1 替换成 str2,如果 max 指定,则替换不超过 max 次。\nsplit(str="", num=string.count(str))  #num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串\nsplitlines([keepends])  #按照行 ('\\\\r', '\\\\r\\\\n', \\\\n') 分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。\n\nlower()  #转换字符串中所有大写字符为小写。\nupper()  #转换字符串中的小写字母为大写\nswapcase() #将字符串中大写转换为小写,小写转换为大写\n

    运算符

    运算符描述实例
    %取模 - 返回除法的余数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 运算符优先级
    Python 运算符优先级

    条件三元表达式

    x, y = 4, 5\nif x < y:\n    small = x\nelse:\n    small = y\n# 可以缩略为下面一句\nsmall = x if x < y else y\n\nx,y,z=6,5,5\nif x<y:\n    small = x\n    if z < small:\n        small =z\nelif y < z:\n    small =y\nelse:\n    small = z\n# 可以缩略为下面一句\nsmall = x if (x<y and not(z<x)) else (y if y<z else z)\n

    条件循环

    while True:    # 无限循环条件\nbreak # 跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行\ncontinue # 告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环\nfor a in b   #遍历任何序列的项目,如一个列表或者一个字符串\n\n# assert(断言)确保程序中的某个条件一定为真才能让程序正常工作,否则就让程序自动崩溃并抛出 AssertionError 异常\nassert 3 > 4\n
    #条件循环参考,用户只有三次输入错误,内容中包含“*”不计算在内\ncount=3\npassword="xxxxdfd"\n\nwhile count:  # 0 为 False,其他为 True\n    passwd = input("请输入密码:")\n    if passwd == password:\n        print("密码正确,进入程序")\n        break\n    elif "*" in passwd:\n  # end=" "为后缀,可空,默认为换行符\n        print("密码不能含有“*”,你还有",count,"次机会", end=" ")\n        continue\n    else:\n        print("密码错误,你还有",count-1,"次机会", end=" ")\n    count-=1\n

    range() 函数

    range(stop)

    range(start, stop[, step])

    range 函数具有一些特性:

    • 如果 step 参数缺省,默认 1;如果 start 参数缺省,默认 0。
    • 如果 step 是正整数,则最后一个元素(start + i _ step)小于 stop。
    • 如果 step 是负整数,则最后一个元素(start + i _ step)大于 stop。
    • step 参数必须是非零整数,否则抛出 VauleError 异常。

    向列表添加元素

    ',24),m={href:"http://www.runoob.com/python/python-lists.html",target:"_blank",rel:"noopener noreferrer"},b=(0,t.Fv)('
    list =[1,"xxxx",3.14,[1,3,3]]\nlist.append(3)   # 添加元素\nlist.extend([1,2,"或"])    # 添加列表\nlist.insert(index, obj)   # index -- 对象 obj 需要插入的索引位置 (从 0 开始 ); obj -- 要插入列表中的对象。\n\nlist.remove("xxxx")  # 删除第一个含有相同内容的元素\ndel list[2]            #删除指定索引位置的元素\nlist.pop(obj=list[-1])      #obj -- 可选参数,从列表要移除指定索引位置的对象,默认为最后以为,返回被移出的元素对象\n\nlist.reverse()  #将列表彻底反转\nlist.sort()        #从小往大排训\nlist.sort(reverse=True) #从大往小排序\n\n将指定列表的小甲鱼改为小鱿鱼\nlist1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]\nlist1[1][2][0] = '小鱿鱼'\n

    列表切片

    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)      #元祖\ntemp=temp[:2]+(“y”,)+temp[2:]\ndel temp #删除元祖\n

    列表解析

    list1 = [x**2 for x in range(10)]  #list1 为 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n#相当于\nlist1 = []\nfor x in range(10):\n    list1.append(x**2)\n\n>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]\n#相当于\nlist1 = []\nfor x in range(10):\n    for y in range(10):\n        if x%2==0:\n            if y%2!=0:\n                list1.extend([(x,y)])\nprint(list1)\n

    变量

    Python 变量是贴标签,而非存储数据

    list1=[1,3,2,9,7,8]\nlist2=list1[:]\nlist3=list1\n# list2 和 list3 的值此时相同,但一旦对 list1 内部进行调整,比如排序、增减变量\nlist1.sort()  # list3 会随着 list1 发生变化,list2 不变\n

    lambda、filter、map

    g=lambda x,y : x+y\ng(3,4)\n7\nlist(filter(lambda x:x%2,range(10))) #过滤 0-9 中能整除 2 的数字\nlist(map(lambda x : x%2, range(10))) #罗列 0-9 每个数字乘 2 的结果\n
    ',14),v={},h=(0,a(3671).A)(v,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[p,e,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("a",o,[(0,t.eW)("Python3 语法"),(0,t.bF)(a)])]),(0,t.Lk)("li",null,[(0,t.Lk)("a",l,[(0,t.eW)("Scrapy 入门"),(0,t.bF)(a)]),(0,t.eW)(" 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",c,[(0,t.eW)("requests"),(0,t.bF)(a)]),(0,t.eW)(" 模块 - 获取数据")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",i,[(0,t.eW)("BeautifulSoup4"),(0,t.bF)(a)]),(0,t.eW)(" 模块 - 解析 HTML")]),(0,t.Lk)("li",null,[(0,t.Lk)("a",u,[(0,t.eW)("openpyxl"),(0,t.bF)(a)]),(0,t.eW)(" 模块 - 读写 Excel 文件")]),r,k]),d,(0,t.Lk)("p",null,[(0,t.Lk)("a",m,[(0,t.eW)("向列表添加元素"),(0,t.bF)(a)])]),b])}]]),g=JSON.parse('{"path":"/code/Python.html","title":"Python","lang":"zh-CN","frontmatter":{"article":false,"title":"Python","icon":"python","order":3,"description":"Python 很久没用了,暂时只做记录作用。 入门文档 Python3 语法 Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 requests 模块 - 获取数据 BeautifulSoup4 模块 - 解析 HTML openpyxl 模块 - 读写 Excel 文件 P...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Python.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Python"}],["meta",{"property":"og:description","content":"Python 很久没用了,暂时只做记录作用。 入门文档 Python3 语法 Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 requests 模块 - 获取数据 BeautifulSoup4 模块 - 解析 HTML openpyxl 模块 - 读写 Excel 文件 P..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-29-18-18-44.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-16T08:12:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Python"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-05-16T08:12:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Python\\",\\"description\\":\\"Python 很久没用了,暂时只做记录作用。 入门文档 Python3 语法 Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5 requests 模块 - 获取数据 BeautifulSoup4 模块 - 解析 HTML openpyxl 模块 - 读写 Excel 文件 P...\\"}"]]},"headers":[{"level":2,"title":"入门文档","slug":"入门文档","link":"#入门文档","children":[]},{"level":2,"title":"简单示例","slug":"简单示例","link":"#简单示例","children":[]},{"level":2,"title":"基础语法","slug":"基础语法","link":"#基础语法","children":[]},{"level":2,"title":"序列类型","slug":"序列类型","link":"#序列类型","children":[]},{"level":2,"title":"字符串用法","slug":"字符串用法","link":"#字符串用法","children":[]},{"level":2,"title":"运算符","slug":"运算符","link":"#运算符","children":[]},{"level":2,"title":"条件三元表达式","slug":"条件三元表达式","link":"#条件三元表达式","children":[]},{"level":2,"title":"条件循环","slug":"条件循环","link":"#条件循环","children":[]},{"level":2,"title":"range() 函数","slug":"range-函数","link":"#range-函数","children":[]},{"level":2,"title":"向列表添加元素","slug":"向列表添加元素","link":"#向列表添加元素","children":[]},{"level":2,"title":"列表切片","slug":"列表切片","link":"#列表切片","children":[{"level":3,"title":"列表解析","slug":"列表解析","link":"#列表解析","children":[]}]},{"level":2,"title":"变量","slug":"变量","link":"#变量","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1684224765000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":8},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":7.99,"words":2397},"filePathRelative":"code/Python.md","localizedDate":"2022年7月22日","excerpt":"

    Python 很久没用了,暂时只做记录作用。

    \\n

    入门文档

    \\n
      \\n
    • Python3 语法
    • \\n
    • Scrapy 入门\\n浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5
    • \\n
    • requests 模块 - 获取数据
    • \\n
    • BeautifulSoup4 模块 - 解析 HTML
    • \\n
    • openpyxl 模块 - 读写 Excel 文件
    • \\n
    • Pillow 模块 - 图片
    • \\n
    • re 模块 - 正则表达式
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-088cabd7.69e9c899.js b/assets/js/QTTabBar.html.72a288b7.js similarity index 89% rename from assets/js/v-088cabd7.69e9c899.js rename to assets/js/QTTabBar.html.72a288b7.js index 6015738e2..715f2c65b 100644 --- a/assets/js/v-088cabd7.69e9c899.js +++ b/assets/js/QTTabBar.html.72a288b7.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1776],{9720:(a,e)=>{e.c=(a,e)=>{const t=a.__vccOpts||a;for(const[a,r]of e)t[a]=r;return t}},9332:(a,e,t)=>{t.r(e),t.d(e,{comp:()=>T,data:()=>d});var r=t(3968);const n={href:"http://qttabbar.wikidot.com/",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/indiff/qttabbar",target:"_blank",rel:"noopener noreferrer"},o=(0,r.IL)('

    目前两个版本都存在相同问题,菜单栏是灰色的选不了 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),i={class:"footnotes"},s={class:"footnotes-list"},p={id:"footnote1",class:"footnote-item"},b={href:"https://github.com/indiff/qttabbar/wiki/Windows11%E5%AE%89%E8%A3%85qttabbar",target:"_blank",rel:"noopener noreferrer"},c=(0,r.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),h={},T=(0,t(9720).c)(h,[["render",function(a,e){const t=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[(0,r.QD)("p",null,[(0,r.mY)("QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的"),(0,r.QD)("a",n,[(0,r.mY)("原版 QTTabBar"),(0,r.K2)(t)]),(0,r.mY)("(闭源,更新慢),另一个是国内反编译出的"),(0,r.QD)("a",l,[(0,r.mY)("开源 QTTabBar"),(0,r.K2)(t)]),(0,r.mY)("。")]),o,(0,r.QD)("section",i,[(0,r.QD)("ol",s,[(0,r.QD)("li",p,[(0,r.QD)("p",null,[(0,r.QD)("a",b,[(0,r.mY)("Windows11 安装 qttabbar"),(0,r.K2)(t)]),(0,r.mY)(),c])])])])])}]]),d=JSON.parse('{"path":"/apps/tutorials/QTTabBar.html","title":"QTTabBar","lang":"zh-CN","frontmatter":{"article":false,"title":"QTTabBar","order":101,"description":"QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar。 目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。 安装 安装完成后...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/QTTabBar.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"QTTabBar"}],["meta",{"property":"og:description","content":"QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar。 目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。 安装 安装完成后..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:49:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:49:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"QTTabBar\\",\\"description\\":\\"QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar。 目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。 安装 安装完成后...\\"}"]]},"headers":[{"level":2,"title":"安装","slug":"安装","link":"#安装","children":[{"level":3,"title":"QTTabBar 失效","slug":"qttabbar-失效","link":"#qttabbar-失效","children":[]}]},{"level":2,"title":"常用设置","slug":"常用设置","link":"#常用设置","children":[{"level":3,"title":"汉化","slug":"汉化","link":"#汉化","children":[]},{"level":3,"title":"选项卡/标签设置","slug":"选项卡-标签设置","link":"#选项卡-标签设置","children":[]},{"level":3,"title":"窗口","slug":"窗口","link":"#窗口","children":[]},{"level":3,"title":"鼠标事件","slug":"鼠标事件","link":"#鼠标事件","children":[]},{"level":3,"title":"预览","slug":"预览","link":"#预览","children":[]},{"level":3,"title":"群组","slug":"群组","link":"#群组","children":[]}]}],"git":{"createdTime":1704206480000,"updatedTime":1705348154000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.65,"words":795},"filePathRelative":"apps/tutorials/QTTabBar.md","localizedDate":"2024年1月2日","excerpt":"

    QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar

    \\n

    目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8685],{3671:(a,e)=>{e.A=(a,e)=>{const t=a.__vccOpts||a;for(const[a,r]of e)t[a]=r;return t}},2373:(a,e,t)=>{t.r(e),t.d(e,{comp:()=>T,data:()=>d});var r=t(7847);const n={href:"http://qttabbar.wikidot.com/",target:"_blank",rel:"noopener noreferrer"},l={href:"https://github.com/indiff/qttabbar",target:"_blank",rel:"noopener noreferrer"},o=(0,r.Fv)('

    目前两个版本都存在相同问题,菜单栏是灰色的选不了 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),i={class:"footnotes"},s={class:"footnotes-list"},p={id:"footnote1",class:"footnote-item"},b={href:"https://github.com/indiff/qttabbar/wiki/Windows11%E5%AE%89%E8%A3%85qttabbar",target:"_blank",rel:"noopener noreferrer"},c=(0,r.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),h={},T=(0,t(3671).A)(h,[["render",function(a,e){const t=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[(0,r.Lk)("p",null,[(0,r.eW)("QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的"),(0,r.Lk)("a",n,[(0,r.eW)("原版 QTTabBar"),(0,r.bF)(t)]),(0,r.eW)("(闭源,更新慢),另一个是国内反编译出的"),(0,r.Lk)("a",l,[(0,r.eW)("开源 QTTabBar"),(0,r.bF)(t)]),(0,r.eW)("。")]),o,(0,r.Lk)("section",i,[(0,r.Lk)("ol",s,[(0,r.Lk)("li",p,[(0,r.Lk)("p",null,[(0,r.Lk)("a",b,[(0,r.eW)("Windows11 安装 qttabbar"),(0,r.bF)(t)]),(0,r.eW)(),c])])])])])}]]),d=JSON.parse('{"path":"/apps/tutorials/QTTabBar.html","title":"QTTabBar","lang":"zh-CN","frontmatter":{"article":false,"title":"QTTabBar","order":101,"description":"QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar。 目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。 安装 安装完成后...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/QTTabBar.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"QTTabBar"}],["meta",{"property":"og:description","content":"QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar。 目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。 安装 安装完成后..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:49:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:49:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"QTTabBar\\",\\"description\\":\\"QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar。 目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。 安装 安装完成后...\\"}"]]},"headers":[{"level":2,"title":"安装","slug":"安装","link":"#安装","children":[{"level":3,"title":"QTTabBar 失效","slug":"qttabbar-失效","link":"#qttabbar-失效","children":[]}]},{"level":2,"title":"常用设置","slug":"常用设置","link":"#常用设置","children":[{"level":3,"title":"汉化","slug":"汉化","link":"#汉化","children":[]},{"level":3,"title":"选项卡/标签设置","slug":"选项卡-标签设置","link":"#选项卡-标签设置","children":[]},{"level":3,"title":"窗口","slug":"窗口","link":"#窗口","children":[]},{"level":3,"title":"鼠标事件","slug":"鼠标事件","link":"#鼠标事件","children":[]},{"level":3,"title":"预览","slug":"预览","link":"#预览","children":[]},{"level":3,"title":"群组","slug":"群组","link":"#群组","children":[]}]}],"git":{"createdTime":1704206480000,"updatedTime":1705348154000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.65,"words":795},"filePathRelative":"apps/tutorials/QTTabBar.md","localizedDate":"2024年1月2日","excerpt":"

    QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的原版 QTTabBar(闭源,更新慢),另一个是国内反编译出的开源 QTTabBar

    \\n

    目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2af6a7be.3f69cd3f.js b/assets/js/Regex.html.088e5b67.js similarity index 93% rename from assets/js/v-2af6a7be.3f69cd3f.js rename to assets/js/Regex.html.088e5b67.js index 0eb9a9233..a248dc040 100644 --- a/assets/js/v-2af6a7be.3f69cd3f.js +++ b/assets/js/Regex.html.088e5b67.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9852],{9720:(a,n)=>{n.c=(a,n)=>{const t=a.__vccOpts||a;for(const[a,s]of n)t[a]=s;return t}},4832:(a,n,t)=>{t.r(n),t.d(n,{comp:()=>b,data:()=>g});var s=t(3968);const e=(0,s.QD)("p",null,"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。",-1),o={href:"https://deerchao.cn/tutorials/regex/regex.htm",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md",target:"_blank",rel:"noopener noreferrer"},c=(0,s.IL)('

    实用表达式

    {} 限定符 (表示固定位数)。比如:\\\\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。

    匹配行:

    //匹配含某个字符的行\nvar ZZMactch = ".*" + inputMatch.value + ".*";\n//匹配不含指定字符的行\nvar ZZMactch = "^((?!"+inputMatch.value+").)*$";\n//匹配所有不包括 CSDN 的行\n^((?!CSDN).)*$\n

    匹配不同文本组,id=contentId= 后的多个数字符号

    (?<=id=)\\d*\n(?<=[?&](id|contentId)=)\\d+\n

    ^((?!abc).)*admin((?!abc).)*$ 匹配 不包含 abc 但包含 admin 的字符串,匹配整行。[1]

    ((?!social.tmall.com)(?!ugc/detail.html).)*$ 匹配不包含 social.tmall.comugc/detail.html 的字符串,匹配整行。[2]

    [₳$¢₴€₤¥$《]([a-zA-Z0-9]{11})[₳$¢₴€₤¥$《] 匹配淘口令,[] 指中内容任意匹配一项皆可。

    前后匹配

    前后匹配,前后元素只能出现一次,否则容易覆盖过多。

    //匹配任意以 a 开头并以 b 结尾的字符,匹配内容不含 a、b\n//如果 a 有 n 个,则同一行也会匹配 n 次\n(?<=a).+(?=b)\n\n//如果 b 有 n 个,则匹配最后一个 b;\n//如果需要匹配第一个 b,则匹配区加懒惰限定符?,代表重复 1 次或更多次,但尽可能少重复\n(?<=.*a).+?(?=b)\n\n//匹配任意以 a 开头并以 b 结尾的字符,匹配内容包含 a、b\na(?<=a).+(?=b)b\n\n//匹配字符串中 a 和词组 abc 间的字符,如果 abc 不存在则去尾部\n(?<=.*a).+(?=abc)\n

    正则替换

    正则全局替换不能带 \\\\,此时用分割替换更方便。

    var str = "dogdogdog";\nvar str2 = str.replace(/dog/g,"cat");   #全局替换\nvar str2 = str.split("dog").join("cat"); #分割替换\n

    表达式修饰符

    元字符:区分大小写

    常用正则代码说明
    .匹配除换行符以外的任意字符
    *匹配 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)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

    ',25),r={class:"footnotes"},l={class:"footnotes-list"},d={id:"footnote1",class:"footnote-item"},i={href:"https://blog.csdn.net/thewindkee/article/details/52785763",target:"_blank",rel:"noopener noreferrer"},u=(0,s.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),k={id:"footnote2",class:"footnote-item"},m={href:"https://blog.csdn.net/xiiii/article/details/89450341",target:"_blank",rel:"noopener noreferrer"},h=(0,s.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),v={},b=(0,t(9720).c)(v,[["render",function(a,n){const t=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[e,(0,s.QD)("p",null,[(0,s.mY)("正则入门:"),(0,s.QD)("a",o,[(0,s.mY)("正则 30 分钟入门"),(0,s.K2)(t)]),(0,s.mY)(","),(0,s.QD)("a",p,[(0,s.mY)("LEARN REGEX 中文版"),(0,s.K2)(t)])]),c,(0,s.QD)("section",r,[(0,s.QD)("ol",l,[(0,s.QD)("li",d,[(0,s.QD)("p",null,[(0,s.QD)("a",i,[(0,s.mY)("正则表达式匹配:包含且不包含"),(0,s.K2)(t)]),(0,s.mY)(),u])]),(0,s.QD)("li",k,[(0,s.QD)("p",null,[(0,s.QD)("a",m,[(0,s.mY)("正则表达式匹配不包含某些字符串的技巧"),(0,s.K2)(t)]),(0,s.mY)(),h])])])])])}]]),g=JSON.parse('{"path":"/code/Regex.html","title":"正则表达式","lang":"zh-CN","frontmatter":{"article":false,"title":"正则表达式","icon":"regexp","order":6,"description":"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则入门:正则 30 分钟入门,LEARN REGEX 中文版 实用表达式 {} 限定符 (表示固定位数)。比如:\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Regex.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"正则表达式"}],["meta",{"property":"og:description","content":"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则入门:正则 30 分钟入门,LEARN REGEX 中文版 实用表达式 {} 限定符 (表示固定位数)。比如:\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-08-26T16:15:37.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2022-08-26T16:15:37.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"正则表达式\\",\\"description\\":\\"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则入门:正则 30 分钟入门,LEARN REGEX 中文版 实用表达式 {} 限定符 (表示固定位数)。比如:\\\\\\\\\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。...\\"}"]]},"headers":[{"level":2,"title":"实用表达式","slug":"实用表达式","link":"#实用表达式","children":[{"level":3,"title":"前后匹配","slug":"前后匹配","link":"#前后匹配","children":[]},{"level":3,"title":"正则替换","slug":"正则替换","link":"#正则替换","children":[]}]},{"level":2,"title":"表达式修饰符","slug":"表达式修饰符","link":"#表达式修饰符","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1661530537000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":3.39,"words":1017},"filePathRelative":"code/Regex.md","localizedDate":"2022年7月22日","excerpt":"

    正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

    \\n

    正则入门:正则 30 分钟入门LEARN REGEX 中文版

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4429],{3671:(a,n)=>{n.A=(a,n)=>{const t=a.__vccOpts||a;for(const[a,s]of n)t[a]=s;return t}},7460:(a,n,t)=>{t.r(n),t.d(n,{comp:()=>v,data:()=>g});var s=t(7847);const e=(0,s.Lk)("p",null,"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。",-1),o={href:"https://deerchao.cn/tutorials/regex/regex.htm",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md",target:"_blank",rel:"noopener noreferrer"},c=(0,s.Fv)('

    实用表达式

    {} 限定符 (表示固定位数)。比如:\\\\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。

    匹配行:

    //匹配含某个字符的行\nvar ZZMactch = ".*" + inputMatch.value + ".*";\n//匹配不含指定字符的行\nvar ZZMactch = "^((?!"+inputMatch.value+").)*$";\n//匹配所有不包括 CSDN 的行\n^((?!CSDN).)*$\n

    匹配不同文本组,id=contentId= 后的多个数字符号

    (?<=id=)\\d*\n(?<=[?&](id|contentId)=)\\d+\n

    ^((?!abc).)*admin((?!abc).)*$ 匹配 不包含 abc 但包含 admin 的字符串,匹配整行。[1]

    ((?!social.tmall.com)(?!ugc/detail.html).)*$ 匹配不包含 social.tmall.comugc/detail.html 的字符串,匹配整行。[2]

    [₳$¢₴€₤¥$《]([a-zA-Z0-9]{11})[₳$¢₴€₤¥$《] 匹配淘口令,[] 指中内容任意匹配一项皆可。

    前后匹配

    前后匹配,前后元素只能出现一次,否则容易覆盖过多。

    //匹配任意以 a 开头并以 b 结尾的字符,匹配内容不含 a、b\n//如果 a 有 n 个,则同一行也会匹配 n 次\n(?<=a).+(?=b)\n\n//如果 b 有 n 个,则匹配最后一个 b;\n//如果需要匹配第一个 b,则匹配区加懒惰限定符?,代表重复 1 次或更多次,但尽可能少重复\n(?<=.*a).+?(?=b)\n\n//匹配任意以 a 开头并以 b 结尾的字符,匹配内容包含 a、b\na(?<=a).+(?=b)b\n\n//匹配字符串中 a 和词组 abc 间的字符,如果 abc 不存在则去尾部\n(?<=.*a).+(?=abc)\n

    正则替换

    正则全局替换不能带 \\\\,此时用分割替换更方便。

    var str = "dogdogdog";\nvar str2 = str.replace(/dog/g,"cat");   #全局替换\nvar str2 = str.split("dog").join("cat"); #分割替换\n

    表达式修饰符

    元字符:区分大小写

    常用正则代码说明
    .匹配除换行符以外的任意字符
    *匹配 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)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

    ',25),r={class:"footnotes"},l={class:"footnotes-list"},d={id:"footnote1",class:"footnote-item"},i={href:"https://blog.csdn.net/thewindkee/article/details/52785763",target:"_blank",rel:"noopener noreferrer"},u=(0,s.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),k={id:"footnote2",class:"footnote-item"},m={href:"https://blog.csdn.net/xiiii/article/details/89450341",target:"_blank",rel:"noopener noreferrer"},h=(0,s.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),b={},v=(0,t(3671).A)(b,[["render",function(a,n){const t=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[e,(0,s.Lk)("p",null,[(0,s.eW)("正则入门:"),(0,s.Lk)("a",o,[(0,s.eW)("正则 30 分钟入门"),(0,s.bF)(t)]),(0,s.eW)(","),(0,s.Lk)("a",p,[(0,s.eW)("LEARN REGEX 中文版"),(0,s.bF)(t)])]),c,(0,s.Lk)("section",r,[(0,s.Lk)("ol",l,[(0,s.Lk)("li",d,[(0,s.Lk)("p",null,[(0,s.Lk)("a",i,[(0,s.eW)("正则表达式匹配:包含且不包含"),(0,s.bF)(t)]),(0,s.eW)(),u])]),(0,s.Lk)("li",k,[(0,s.Lk)("p",null,[(0,s.Lk)("a",m,[(0,s.eW)("正则表达式匹配不包含某些字符串的技巧"),(0,s.bF)(t)]),(0,s.eW)(),h])])])])])}]]),g=JSON.parse('{"path":"/code/Regex.html","title":"正则表达式","lang":"zh-CN","frontmatter":{"article":false,"title":"正则表达式","icon":"regexp","order":6,"description":"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则入门:正则 30 分钟入门,LEARN REGEX 中文版 实用表达式 {} 限定符 (表示固定位数)。比如:\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Regex.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"正则表达式"}],["meta",{"property":"og:description","content":"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则入门:正则 30 分钟入门,LEARN REGEX 中文版 实用表达式 {} 限定符 (表示固定位数)。比如:\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-08-26T16:15:37.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2022-08-26T16:15:37.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"正则表达式\\",\\"description\\":\\"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则入门:正则 30 分钟入门,LEARN REGEX 中文版 实用表达式 {} 限定符 (表示固定位数)。比如:\\\\\\\\\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。...\\"}"]]},"headers":[{"level":2,"title":"实用表达式","slug":"实用表达式","link":"#实用表达式","children":[{"level":3,"title":"前后匹配","slug":"前后匹配","link":"#前后匹配","children":[]},{"level":3,"title":"正则替换","slug":"正则替换","link":"#正则替换","children":[]}]},{"level":2,"title":"表达式修饰符","slug":"表达式修饰符","link":"#表达式修饰符","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1661530537000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":3.39,"words":1017},"filePathRelative":"code/Regex.md","localizedDate":"2022年7月22日","excerpt":"

    正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

    \\n

    正则入门:正则 30 分钟入门LEARN REGEX 中文版

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1f3d0304.88097300.js b/assets/js/Shoppinglist.html.34df3994.js similarity index 95% rename from assets/js/v-1f3d0304.88097300.js rename to assets/js/Shoppinglist.html.34df3994.js index 456e6027b..a4941e4fc 100644 --- a/assets/js/v-1f3d0304.88097300.js +++ b/assets/js/Shoppinglist.html.34df3994.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6164],{9720:(e,a)=>{a.c=(e,a)=>{const l=e.__vccOpts||e;for(const[e,n]of a)l[e]=n;return l}},8656:(e,a,l)=>{l.r(a),l.d(a,{comp:()=>k,data:()=>x});var n=l(3968);const i=(0,n.IL)('

    书房

    摄像头

    摄像头品牌众多,但实际像素都仅为 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),t={href:"https://www.lbdj.com/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.IL)('

    电熨斗

    挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。

    牛皮席

    夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。

    最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。

    消毒液

    ',6),r={href:"https://sspai.com/prime/story/disinfectant",target:"_blank",rel:"noopener noreferrer"},p=(0,n.IL)('
    • 次氯酸消毒液:大多数的家居消毒场景都适用,甚至还能用于空气和二次供水设备的消毒(不过日常也不太需要),但也要注意对织物的漂白作用。与 84 消毒液(爱特福、龙安、蓝月亮、康威龙)相比,更加温和,安全性也更高。
    • 二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。
      • 用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。
      • 尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。
    • 季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃
      • 不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。

    小物

    • 能面具 (树脂),但带眼镜不方便使用。
    • 宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔
    • 内裤清洗机
    • 洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。[2]
    • 插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。

    可能放弃

    电子书

    我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。

    电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。

    微单相机

    原计划购买索尼 a7m4 微单相机,但随着 AI 的出现、手机摄像头的表现,这个想法逐渐淡化,优先级下调。

    关于镜头选择:F 值越小,光圈越大,适合虚化背景。

    • 腾龙 28-75mm F2.8(适合日常旅行)
    • 索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影)

    无线麦克风

    RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。

    鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。

    洗碗机

    由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案?


    ',17),h={class:"footnotes"},o={class:"footnotes-list"},c={id:"footnote1",class:"footnote-item"},d={href:"https://sspai.com/prime/story/display-04-buyingguide-01",target:"_blank",rel:"noopener noreferrer"},u=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),f={id:"footnote2",class:"footnote-item"},g={href:"https://sspai.com/post/73604",target:"_blank",rel:"noopener noreferrer"},m=(0,n.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),b={},k=(0,l(9720).c)(b,[["render",function(e,a){const l=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[i,(0,n.QD)("p",null,[(0,n.mY)("日常维修以京东到家为主,或使用商家外包常用的"),(0,n.QD)("a",t,[(0,n.mY)("鲁班到家"),(0,n.K2)(l)]),(0,n.mY)("。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。")]),s,(0,n.QD)("p",null,[(0,n.mY)("参考"),(0,n.QD)("a",r,[(0,n.mY)("消毒剂选购不完全指南"),(0,n.K2)(l)]),(0,n.mY)(":")]),p,(0,n.QD)("section",h,[(0,n.QD)("ol",o,[(0,n.QD)("li",c,[(0,n.QD)("p",null,[(0,n.QD)("a",d,[(0,n.mY)("选择合适自己的显示器"),(0,n.K2)(l)]),(0,n.mY)(),u])]),(0,n.QD)("li",f,[(0,n.QD)("p",null,[(0,n.QD)("a",g,[(0,n.mY)("Room Tour |新家的厨房里有什么?"),(0,n.K2)(l)]),(0,n.mY)(),m])])])])])}]]),x=JSON.parse('{"path":"/family/Shoppinglist.html","title":"购物评价","lang":"zh-CN","frontmatter":{"article":false,"title":"购物评价","icon":"info","order":2,"description":"书房 摄像头 摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 键盘 罗技 ERGO K860 是...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Shoppinglist.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"购物评价"}],["meta",{"property":"og:description","content":"书房 摄像头 摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 键盘 罗技 ERGO K860 是..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-10-14-57-16.png?imageMogr2/thumbnail/500x \\"超滤净水示意图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"购物评价"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"购物评价\\",\\"description\\":\\"书房 摄像头 摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 键盘 罗技 ERGO K860 是...\\"}"]]},"headers":[{"level":2,"title":"书房","slug":"书房","link":"#书房","children":[{"level":3,"title":"摄像头","slug":"摄像头","link":"#摄像头","children":[]},{"level":3,"title":"键盘","slug":"键盘","link":"#键盘","children":[]},{"level":3,"title":"游戏手柄","slug":"游戏手柄","link":"#游戏手柄","children":[]},{"level":3,"title":"显示器","slug":"显示器","link":"#显示器","children":[]},{"level":3,"title":"台式电脑","slug":"台式电脑","link":"#台式电脑","children":[]},{"level":3,"title":"书桌灯","slug":"书桌灯","link":"#书桌灯","children":[]},{"level":3,"title":"升降桌","slug":"升降桌","link":"#升降桌","children":[]},{"level":3,"title":"静电墙贴","slug":"静电墙贴","link":"#静电墙贴","children":[]}]},{"level":2,"title":"数码","slug":"数码","link":"#数码","children":[{"level":3,"title":"降噪耳机","slug":"降噪耳机","link":"#降噪耳机","children":[]},{"level":3,"title":"充电器","slug":"充电器","link":"#充电器","children":[]},{"level":3,"title":"UPS","slug":"ups","link":"#ups","children":[]},{"level":3,"title":"3D 打印机","slug":"_3d-打印机","link":"#_3d-打印机","children":[]}]},{"level":2,"title":"健康","slug":"健康","link":"#健康","children":[{"level":3,"title":"代餐","slug":"代餐","link":"#代餐","children":[]},{"level":3,"title":"体重秤","slug":"体重秤","link":"#体重秤","children":[]},{"level":3,"title":"椭圆机","slug":"椭圆机","link":"#椭圆机","children":[]},{"level":3,"title":"眼部按摩仪","slug":"眼部按摩仪","link":"#眼部按摩仪","children":[]},{"level":3,"title":"泡脚桶","slug":"泡脚桶","link":"#泡脚桶","children":[]},{"level":3,"title":"睡眠监测","slug":"睡眠监测","link":"#睡眠监测","children":[]}]},{"level":2,"title":"厨房","slug":"厨房","link":"#厨房","children":[{"level":3,"title":"冰柜","slug":"冰柜","link":"#冰柜","children":[]},{"level":3,"title":"切肉机","slug":"切肉机","link":"#切肉机","children":[]},{"level":3,"title":"净水器","slug":"净水器","link":"#净水器","children":[]}]},{"level":2,"title":"家居","slug":"家居","link":"#家居","children":[{"level":3,"title":"维修","slug":"维修","link":"#维修","children":[]},{"level":3,"title":"电熨斗","slug":"电熨斗","link":"#电熨斗","children":[]},{"level":3,"title":"牛皮席","slug":"牛皮席","link":"#牛皮席","children":[]},{"level":3,"title":"消毒液","slug":"消毒液","link":"#消毒液","children":[]}]},{"level":2,"title":"小物","slug":"小物","link":"#小物","children":[]},{"level":2,"title":"可能放弃","slug":"可能放弃","link":"#可能放弃","children":[{"level":3,"title":"电子书","slug":"电子书","link":"#电子书","children":[]},{"level":3,"title":"微单相机","slug":"微单相机","link":"#微单相机","children":[]},{"level":3,"title":"无线麦克风","slug":"无线麦克风","link":"#无线麦克风","children":[]},{"level":3,"title":"洗碗机","slug":"洗碗机","link":"#洗碗机","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":20}]},"readingTime":{"minutes":12.71,"words":3812},"filePathRelative":"family/Shoppinglist.md","localizedDate":"2022年7月22日","excerpt":"

    书房

    \\n

    摄像头

    \\n

    摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。

    \\n

    谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。

    \\n

    键盘

    \\n

    罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。

    \\n

    机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6640],{3671:(e,a)=>{a.A=(e,a)=>{const l=e.__vccOpts||e;for(const[e,n]of a)l[e]=n;return l}},4498:(e,a,l)=>{l.r(a),l.d(a,{comp:()=>b,data:()=>v});var n=l(7847);const i=(0,n.Fv)('

    书房

    摄像头

    摄像头品牌众多,但实际像素都仅为 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),t={href:"https://www.lbdj.com/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.Fv)('

    电熨斗

    挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。

    牛皮席

    夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。

    最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。

    消毒液

    ',6),r={href:"https://sspai.com/prime/story/disinfectant",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Fv)('
    • 次氯酸消毒液:大多数的家居消毒场景都适用,甚至还能用于空气和二次供水设备的消毒(不过日常也不太需要),但也要注意对织物的漂白作用。与 84 消毒液(爱特福、龙安、蓝月亮、康威龙)相比,更加温和,安全性也更高。
    • 二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。
      • 用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。
      • 尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。
    • 季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃
      • 不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。

    小物

    • 能面具 (树脂),但带眼镜不方便使用。
    • 宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔
    • 内裤清洗机
    • 洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。[2]
    • 插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。

    可能放弃

    电子书

    我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。

    电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。

    微单相机

    原计划购买索尼 a7m4 微单相机,但随着 AI 的出现、手机摄像头的表现,这个想法逐渐淡化,优先级下调。

    关于镜头选择:F 值越小,光圈越大,适合虚化背景。

    • 腾龙 28-75mm F2.8(适合日常旅行)
    • 索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影)

    无线麦克风

    RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。

    鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。

    洗碗机

    由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案?


    ',17),h={class:"footnotes"},o={class:"footnotes-list"},c={id:"footnote1",class:"footnote-item"},d={href:"https://sspai.com/prime/story/display-04-buyingguide-01",target:"_blank",rel:"noopener noreferrer"},u=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),f={id:"footnote2",class:"footnote-item"},g={href:"https://sspai.com/post/73604",target:"_blank",rel:"noopener noreferrer"},k=(0,n.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),m={},b=(0,l(3671).A)(m,[["render",function(e,a){const l=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[i,(0,n.Lk)("p",null,[(0,n.eW)("日常维修以京东到家为主,或使用商家外包常用的"),(0,n.Lk)("a",t,[(0,n.eW)("鲁班到家"),(0,n.bF)(l)]),(0,n.eW)("。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。")]),s,(0,n.Lk)("p",null,[(0,n.eW)("参考"),(0,n.Lk)("a",r,[(0,n.eW)("消毒剂选购不完全指南"),(0,n.bF)(l)]),(0,n.eW)(":")]),p,(0,n.Lk)("section",h,[(0,n.Lk)("ol",o,[(0,n.Lk)("li",c,[(0,n.Lk)("p",null,[(0,n.Lk)("a",d,[(0,n.eW)("选择合适自己的显示器"),(0,n.bF)(l)]),(0,n.eW)(),u])]),(0,n.Lk)("li",f,[(0,n.Lk)("p",null,[(0,n.Lk)("a",g,[(0,n.eW)("Room Tour |新家的厨房里有什么?"),(0,n.bF)(l)]),(0,n.eW)(),k])])])])])}]]),v=JSON.parse('{"path":"/family/Shoppinglist.html","title":"购物评价","lang":"zh-CN","frontmatter":{"article":false,"title":"购物评价","icon":"info","order":2,"description":"书房 摄像头 摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 键盘 罗技 ERGO K860 是...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/Shoppinglist.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"购物评价"}],["meta",{"property":"og:description","content":"书房 摄像头 摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 键盘 罗技 ERGO K860 是..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-10-14-57-16.png?imageMogr2/thumbnail/500x \\"超滤净水示意图\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"购物评价"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"购物评价\\",\\"description\\":\\"书房 摄像头 摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。 谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。 键盘 罗技 ERGO K860 是...\\"}"]]},"headers":[{"level":2,"title":"书房","slug":"书房","link":"#书房","children":[{"level":3,"title":"摄像头","slug":"摄像头","link":"#摄像头","children":[]},{"level":3,"title":"键盘","slug":"键盘","link":"#键盘","children":[]},{"level":3,"title":"游戏手柄","slug":"游戏手柄","link":"#游戏手柄","children":[]},{"level":3,"title":"显示器","slug":"显示器","link":"#显示器","children":[]},{"level":3,"title":"台式电脑","slug":"台式电脑","link":"#台式电脑","children":[]},{"level":3,"title":"书桌灯","slug":"书桌灯","link":"#书桌灯","children":[]},{"level":3,"title":"升降桌","slug":"升降桌","link":"#升降桌","children":[]},{"level":3,"title":"静电墙贴","slug":"静电墙贴","link":"#静电墙贴","children":[]}]},{"level":2,"title":"数码","slug":"数码","link":"#数码","children":[{"level":3,"title":"降噪耳机","slug":"降噪耳机","link":"#降噪耳机","children":[]},{"level":3,"title":"充电器","slug":"充电器","link":"#充电器","children":[]},{"level":3,"title":"UPS","slug":"ups","link":"#ups","children":[]},{"level":3,"title":"3D 打印机","slug":"_3d-打印机","link":"#_3d-打印机","children":[]}]},{"level":2,"title":"健康","slug":"健康","link":"#健康","children":[{"level":3,"title":"代餐","slug":"代餐","link":"#代餐","children":[]},{"level":3,"title":"体重秤","slug":"体重秤","link":"#体重秤","children":[]},{"level":3,"title":"椭圆机","slug":"椭圆机","link":"#椭圆机","children":[]},{"level":3,"title":"眼部按摩仪","slug":"眼部按摩仪","link":"#眼部按摩仪","children":[]},{"level":3,"title":"泡脚桶","slug":"泡脚桶","link":"#泡脚桶","children":[]},{"level":3,"title":"睡眠监测","slug":"睡眠监测","link":"#睡眠监测","children":[]}]},{"level":2,"title":"厨房","slug":"厨房","link":"#厨房","children":[{"level":3,"title":"冰柜","slug":"冰柜","link":"#冰柜","children":[]},{"level":3,"title":"切肉机","slug":"切肉机","link":"#切肉机","children":[]},{"level":3,"title":"净水器","slug":"净水器","link":"#净水器","children":[]}]},{"level":2,"title":"家居","slug":"家居","link":"#家居","children":[{"level":3,"title":"维修","slug":"维修","link":"#维修","children":[]},{"level":3,"title":"电熨斗","slug":"电熨斗","link":"#电熨斗","children":[]},{"level":3,"title":"牛皮席","slug":"牛皮席","link":"#牛皮席","children":[]},{"level":3,"title":"消毒液","slug":"消毒液","link":"#消毒液","children":[]}]},{"level":2,"title":"小物","slug":"小物","link":"#小物","children":[]},{"level":2,"title":"可能放弃","slug":"可能放弃","link":"#可能放弃","children":[{"level":3,"title":"电子书","slug":"电子书","link":"#电子书","children":[]},{"level":3,"title":"微单相机","slug":"微单相机","link":"#微单相机","children":[]},{"level":3,"title":"无线麦克风","slug":"无线麦克风","link":"#无线麦克风","children":[]},{"level":3,"title":"洗碗机","slug":"洗碗机","link":"#洗碗机","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":20}]},"readingTime":{"minutes":12.71,"words":3812},"filePathRelative":"family/Shoppinglist.md","localizedDate":"2022年7月22日","excerpt":"

    书房

    \\n

    摄像头

    \\n

    摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。

    \\n

    谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。

    \\n

    键盘

    \\n

    罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。

    \\n

    机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/Static.html.d33389c2.js b/assets/js/Static.html.d33389c2.js new file mode 100644 index 000000000..48d9e598c --- /dev/null +++ b/assets/js/Static.html.d33389c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7270],{3671:(e,n)=>{n.A=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},4692:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>Z,data:()=>B});var a=s(7847);const l=(0,a.Lk)("h2",{id:"静态托管",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#静态托管"},[(0,a.Lk)("span",null,"静态托管")])],-1),i=(0,a.Lk)("p",null,[(0,a.eW)("如果在国内静态资源库找不到所需的静态包,建议使用 "),(0,a.Lk)("code",null,"npm i"),(0,a.eW)(" 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。")],-1),t=(0,a.Lk)("p",null,"静态资源库:",-1),r={href:"https://www.staticfile.org/",target:"_blank",rel:"noopener noreferrer"},o={href:"https://cdn.bytedance.com/",target:"_blank",rel:"noopener noreferrer"},c=(0,a.Lk)("p",null,"emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。",-1),d=(0,a.Lk)("h3",{id:"npm-包",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#npm-包"},[(0,a.Lk)("span",null,"NPM 包")])],-1),p=(0,a.Lk)("strong",null,"有墙风险且不稳定",-1),u=(0,a.Lk)("code",null,"@latest",-1),m={href:"https://segmentfault.com/a/1190000023075167",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.npmjs.com/",target:"_blank",rel:"noopener noreferrer"},b=(0,a.Lk)("code",null,"https://unpkg.com/",-1),k={href:"https://npmmirror.com/",target:"_blank",rel:"noopener noreferrer"},h=(0,a.Lk)("code",null,"https://registry.npmmirror.com/项目名/版本号",-1),f=(0,a.Lk)("li",null,[(0,a.eW)("UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("s",null,[(0,a.eW)("饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 "),(0,a.Lk)("code",null,"https://npm.elemecdn.com/react@latest/"),(0,a.eW)(" 需要时间更新,具体频率未知,可固定大版本号来获取更新 "),(0,a.Lk)("code",null,"https://npm.elemecdn.com/react@^18/"),(0,a.eW)("。")])])])],-1),g={href:"https://statically.io/",target:"_blank",rel:"noopener noreferrer"},L=(0,a.Lk)("li",null,[(0,a.Lk)("s",null,[(0,a.eW)("jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 "),(0,a.Lk)("code",null,"curl https://purge.jsdelivr.net/gh/username/project/file"),(0,a.eW)("。")])],-1),W=(0,a.Lk)("p",null,"由于第三方托管过于不稳定,目前我使用自托管 oss.newzone.top。",-1),y=(0,a.Lk)("h3",{id:"部署平台",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#部署平台"},[(0,a.Lk)("span",null,"部署平台")])],-1),S=(0,a.Lk)("li",null,"Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。",-1),P=(0,a.Lk)("li",null,"Netlify:国内速度慢点,图片容易卡死,但还算稳定。",-1),w=(0,a.Lk)("li",null,"Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。",-1),F=(0,a.Lk)("li",null,"AWS: 邮箱注册,不过需要信用卡认证。",-1),D=(0,a.Lk)("li",null,"国内平台:Gitee、WuliHub、CODING,都需要实名认证。",-1),_=(0,a.Lk)("h3",{id:"ipfs",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#ipfs"},[(0,a.Lk)("span",null,"IPFS")])],-1),N=(0,a.Lk)("p",null,[(0,a.eW)("IPFS 无需服务器就可建立静态网站,号称永不失效,但"),(0,a.Lk)("strong",null,"国内稳定性成疑问,实用性一般"),(0,a.eW)("。IPFS 托管在一个网关上,并不会自动复制到所有网关。")],-1),C={href:"https://pinata.cloud/",target:"_blank",rel:"noopener noreferrer"},G=(0,a.Lk)("sup",{class:"footnote-ref"},[(0,a.Lk)("a",{href:"#footnote1"},"[1]"),(0,a.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),x=(0,a.Lk)("p",null,"上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。",-1),T=(0,a.Lk)("p",null,[(0,a.eW)("cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 "),(0,a.Lk)("code",null,"http://gateway.pinata.cloud"),(0,a.eW)(" 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。")],-1),H={href:"https://www.cloudflare.com/zh-cn/distributed-web-gateway/",target:"_blank",rel:"noopener noreferrer"},j=(0,a.Fv)('
    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),E={href:"https://github.com/SamKirkland/FTP-Deploy-Action",target:"_blank",rel:"noopener noreferrer"},I=(0,a.Fv)('
    on: push\nname: 🚀 Deploy website on push\njobs:\n  web-deploy:\n    name: 🎉 Deploy\n    runs-on: ubuntu-latest\n    steps:\n    - name: 🚚 Get latest code\n      uses: actions/checkout@v3\n\n    - name: 📂 Sync files\n      uses: SamKirkland/FTP-Deploy-Action@4.3.3\n      with:\n        server: ${{ secrets.ftp_host }}\n        username: ${{ secrets.ftp_username }}\n        password: ${{ secrets.ftp_password }}\n        port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口\n

    新建 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 服务器被拉黑了。

    SSH 同步

    ',5),K={href:"https://github.com/SamKirkland/web-deploy",target:"_blank",rel:"noopener noreferrer"},A=(0,a.Lk)("code",null,"Permission denied (publickey,password)",-1),$=(0,a.Fv)('
    on: push\nname: Publish Website\njobs:\n  web-deploy:\n    name: 🚀 Deploy Website Every Commit\n    runs-on: ubuntu-latest\n    steps:\n    - name: 🚚 Get Latest Code\n      uses: actions/checkout@v3\n\n    - name: 📂 Sync Files\n      uses: SamKirkland/web-deploy@v1\n      with:\n        source-path: docs/.vuepress/dist/\n        target-server: ${{ secrets.host }}\n        remote-user: ${{ secrets.ssh_username }}\n        private-ssh-key: ${{ secrets.SSH_KEY }}\n        destination-path: ${{ secrets.destination_folder }}\n        ssh-port: ${{ secrets.ssh_port }} # 建议更改默认的 22 端口\n

    如果出现报错 error in libcrypto,说明 SSH 密钥错误,需要登陆服务器终端,运行以下命令。

    ssh-keygen -m PEM -t rsa -b 4096\ncat id_rsa.pub >> authorized_keys\ncat id_rsa\n

    同步到 oss

    ',4),U={href:"https://github.com/marketplace/actions/aliyun-oss-website-action",target:"_blank",rel:"noopener noreferrer"},z=(0,a.Fv)('
    name: deploy md to oss\non:\n  push:\n    branches: [ "main" ]\n  pull_request:\n    branches: [ "main" ]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    # load repo to /github/workspace\n    - uses: actions/checkout@v3\n    - name: Use Node.js\n      uses: actions/setup-node@v3\n      with:\n        node-version: '14.x'\n    # 打包文档命令\n    # - run: npm install yarn@1.22.4 -g\n    # - run: yarn install\n    # - run: yarn docs:build #需要配合 yarn 的 package.json\n    - name: aliyun-oss-website-action\n      uses: fangbinwei/aliyun-oss-website-action@v1.3.0\n      with:\n          accessKeyId: ${{ secrets.ACCESS_KEY_ID }}\n          accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}\n          bucket: learndata-notes\n          # use your own endpoint\n          endpoint: oss-cn-shanghai.aliyuncs.com\n          # 全目录上传\n          folder: .\n          # 不上传的文件\n          exclude: |\n            .github/\n            .gitattributes\n

    ',2),M={class:"footnotes"},R={class:"footnotes-list"},q={id:"footnote1",class:"footnote-item"},O={href:"https://medium.com/pinata/how-to-easily-host-a-website-on-ipfs-9d842b5d6a01",target:"_blank",rel:"noopener noreferrer"},V=(0,a.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Y={},Z=(0,s(3671).A)(Y,[["render",function(e,n){const s=(0,a.g2)("ExternalLinkIcon"),Y=(0,a.g2)("RouteLink");return(0,a.uX)(),(0,a.CE)("div",null,[l,i,t,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("a",r,[(0,a.eW)("Staticfile CDN"),(0,a.bF)(s)]),(0,a.eW)(":国内维护最稳定的 CDN。")]),(0,a.Lk)("li",null,[(0,a.Lk)("a",o,[(0,a.eW)("字节 CDN"),(0,a.bF)(s)]),(0,a.eW)(":测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。")])]),c,d,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("UNPKG:"),p,(0,a.eW)(",默认为最新版本,无需 "),u,(0,a.eW)(" 标签。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("将静态文件发布为 npm 包,参考"),(0,a.Lk)("a",m,[(0,a.eW)("一分钟教你发布 npm 包"),(0,a.bF)(s)]),(0,a.eW)("。")]),(0,a.Lk)("li",null,[(0,a.eW)("加速:在 "),(0,a.Lk)("a",v,[(0,a.eW)("npm 官方源"),(0,a.bF)(s)]),(0,a.eW)("中搜索包位置,然后使用前缀 "),b,(0,a.eW)("。")])])]),(0,a.Lk)("li",null,[(0,a.Lk)("a",k,[(0,a.eW)("NPM MIRROR"),(0,a.bF)(s)]),(0,a.eW)(":NPM 项目的国内镜像镜像,不能做静态托管用途。"),h,(0,a.eW)(" 可以看见项目的各种信息,但看不了里面的文件。")]),f,(0,a.Lk)("li",null,[(0,a.eW)("GitHub:基于 GitHub 公共仓库的资源托管,资源不会失效,但有时需要根据 CDN 服务商而更换域名。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("s",null,[(0,a.Lk)("a",g,[(0,a.eW)("Statically"),(0,a.bF)(s)]),(0,a.eW)(":jsDeliver 的替代品,在中国大陆所有地区连接异常。")])]),L])])]),W,y,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("Cloudflare:Pages 和 Workers 两类部署方式。 "),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.bF)(Y,{to:"/deploy/Cloudflare.html#%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86"},{default:(0,a.k6)((()=>[(0,a.eW)("Workers")])),_:1}),(0,a.eW)(":复制镜像网站,可直接访问,但反向代理稳定性成疑。")]),S])]),P,w,F,D]),_,N,(0,a.Lk)("p",null,[(0,a.Lk)("a",C,[(0,a.eW)("pinata"),(0,a.bF)(s)]),(0,a.eW)(" 上传网站构建的目录文件夹,上传后,即可通过 IPFS Hash 访问。网站目录中必须有 index.html,否则网页中将显示网站目录。即使有 index.html,其他人在拥有 CID 后,可以通过 IPFS Desktop 来获取网站的完整目录。为确保私密性,建议只上传单文件。使用单文件 CID 视为单一网站,不可调用原目录中的文件。"),G]),x,T,(0,a.Lk)("p",null,[(0,a.eW)("对于文件较少且链接有效的域名,可按 "),(0,a.Lk)("a",H,[(0,a.eW)("Cloudflare IPFS"),(0,a.bF)(s)]),(0,a.eW)(" 页面说明来设置 DNS,提交 IPFS 域名 30 分钟后,即可获取 SSL 证书。")]),j,(0,a.Lk)("p",null,[(0,a.eW)("如果你有 FTP 服务器,可使用 "),(0,a.Lk)("a",E,[(0,a.eW)("FTP-Deploy-Action"),(0,a.bF)(s)]),(0,a.eW)(" 将 github 代码推送到服务器上。Actions 步骤参考 "),(0,a.bF)(Y,{to:"/deploy/GitHub.html"},{default:(0,a.k6)((()=>[(0,a.eW)("GitHub 说明")])),_:1}),(0,a.eW)("。")]),I,(0,a.Lk)("p",null,[(0,a.eW)("如果你有服务器的 SSH 权限,可以使用 "),(0,a.Lk)("a",K,[(0,a.eW)("web-deploy"),(0,a.bF)(s)]),(0,a.eW)(" 以 SSH 同步方式发布页面。但与 FTP 相比,不确定安全性、速度、时间是否会区别。我尝试连接一直报错 "),A,(0,a.eW)("。(有可能是服务器需要非 root 用户,adduser 一直加不上。)")]),$,(0,a.Lk)("p",null,[(0,a.eW)("如果没有服务器,可以把文件部署在云运营商的云存储上。比如用 "),(0,a.Lk)("a",U,[(0,a.eW)("aliyun-oss-website-action"),(0,a.bF)(s)]),(0,a.eW)(",将 repo 文件 build 成网站文件,然后同步到阿里云 oss 并运行网站。")]),z,(0,a.Lk)("section",M,[(0,a.Lk)("ol",R,[(0,a.Lk)("li",q,[(0,a.Lk)("p",null,[(0,a.Lk)("a",O,[(0,a.eW)("How to Easily Host a Website on IPFS"),(0,a.bF)(s)]),(0,a.eW)(),V])])])])])}]]),B=JSON.parse('{"path":"/deploy/Static.html","title":"静态部署","lang":"zh-CN","frontmatter":{"article":false,"title":"静态部署","icon":"generic","order":1,"description":"静态托管 如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 静态资源库: Staticfile CDN:国内维护最稳定的 CDN。 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 20...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/Static.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"静态部署"}],["meta",{"property":"og:description","content":"静态托管 如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 静态资源库: Staticfile CDN:国内维护最稳定的 CDN。 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 20..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-09T21:57:45.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-09T21:57:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"静态部署\\",\\"description\\":\\"静态托管 如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 静态资源库: Staticfile CDN:国内维护最稳定的 CDN。 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 20...\\"}"]]},"headers":[{"level":2,"title":"静态托管","slug":"静态托管","link":"#静态托管","children":[{"level":3,"title":"NPM 包","slug":"npm-包","link":"#npm-包","children":[]},{"level":3,"title":"部署平台","slug":"部署平台","link":"#部署平台","children":[]},{"level":3,"title":"IPFS","slug":"ipfs","link":"#ipfs","children":[]}]},{"level":2,"title":"GitHub 同步到 VPS","slug":"github-同步到-vps","link":"#github-同步到-vps","children":[{"level":3,"title":"同步到 FTP","slug":"同步到-ftp","link":"#同步到-ftp","children":[]},{"level":3,"title":"SSH 同步","slug":"ssh-同步","link":"#ssh-同步","children":[]},{"level":3,"title":"同步到 oss","slug":"同步到-oss","link":"#同步到-oss","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1691618265000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":21}]},"readingTime":{"minutes":6.56,"words":1968},"filePathRelative":"deploy/Static.md","localizedDate":"2022年7月22日","excerpt":"

    静态托管

    \\n

    如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。

    \\n

    静态资源库:

    \\n
      \\n
    • Staticfile CDN:国内维护最稳定的 CDN。
    • \\n
    • 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-d52aa9fc.b57cf673.js b/assets/js/TTRSS.html.bd9909f8.js similarity index 76% rename from assets/js/v-d52aa9fc.b57cf673.js rename to assets/js/TTRSS.html.bd9909f8.js index 9b2b2d40e..e601d7482 100644 --- a/assets/js/v-d52aa9fc.b57cf673.js +++ b/assets/js/TTRSS.html.bd9909f8.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7476],{9720:(e,n)=>{n.c=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},2336:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>b,data:()=>k});var a=s(3968);const t={href:"http://ttrss.henry.wang/zh/",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/levito/tt-rss-feedly-theme",target:"_blank",rel:"noopener noreferrer"},o={href:"https://tt-rss.org/wiki/FAQ",target:"_blank",rel:"noopener noreferrer"},l=(0,a.QD)("li",null,"定期备份:选择「偏好设置」>「订阅源」导出订阅源和 tt-rss 设置。",-1),i={href:"https://gitlab.tt-rss.org/tt-rss/tt-rss-android/-/releases",target:"_blank",rel:"noopener noreferrer"},p=(0,a.QD)("h2",{id:"手动部署",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#手动部署"},[(0,a.QD)("span",null,"手动部署")])],-1),c=(0,a.QD)("p",null,"虽然 Tiny Tiny RSS 官方建议使用 Docker 部署,但手动部署也很简单,选择适合自己的方式即可。",-1),d=(0,a.QD)("ol",null,[(0,a.QD)("li",null,[(0,a.mY)("进入指定目录 "),(0,a.QD)("code",null,"cd /www/wwwroot/"),(0,a.mY)("。")]),(0,a.QD)("li",null,[(0,a.mY)("新建 rss 目录,并下载最新 tt-rss "),(0,a.QD)("code",null,"git clone https://git.tt-rss.org/fox/tt-rss.git rss"),(0,a.mY)("。")]),(0,a.QD)("li",null,"打开 rss 链接,页面会出现指定要求,如:提升文件权限,删除禁用函数 passthru,安装 php 扩展-fileinfo。配置好后,重新加载 php 配置。")],-1),m={href:"https://tt-rss.org/wiki/UpdatingFeeds",target:"_blank",rel:"noopener noreferrer"},u=(0,a.QD)("code",null,"lock/update_daemon.lock",-1),S=(0,a.QD)("code",null,"update_daemon.stamp",-1),h={href:"https://www.cnblogs.com/imyalost/p/9801426.html",target:"_blank",rel:"noopener noreferrer"},w=(0,a.IL)('
    • 指定 PHP 版本来运行:/www/server/php/74/bin/php /www/wwwroot/rss/update.php --daemon
    • 不指定版本运行:php /www/wwwroot/rss/update.php --daemon

    服务器使用定时任务更新 TTRSS:

    crontab -e #进入 Cpanel 面板添加定时任务\n*/15 * * * * /usr/bin/php /www/wwwroot/rss/update.php --feeds --quiet #只安装了一个php\n*/15 * * * * /www/server/php/74/bin/php /www/wwwroot/rss/update.php --feeds --quiet #安装了多个php\n# 同时按下ctrl+c退出编辑模式,按下shift+: 输入wq 退出 crontab\n*/15 * * * *表示每隔15分钟更新一次,你可以自己改成其它的。\n

    服务器或 nginx 重启后,TTRss 会出现文件夹权限丢失,需重新设置权限。建议将此步骤设为定期任务自动执行。

    chmod -R 777 /www/wwwroot/rss/cache/images\nchmod -R 777 /www/wwwroot/rss/cache/upload\nchmod -R 777 /www/wwwroot/rss/cache/export\nchmod -R 777 /www/wwwroot/rss/feed-icons\nchmod -R 777 /www/wwwroot/rss/lock\n

    升级 Tiny Tiny RSS:进行 TTRSS 目录后执行升级命令 git pull origin master。无法升级时重命名 TTRSS 路径,全新下载后没问题再删除。数据库没变化就没事,主题重新安装。

    重置密码

    如果在 Docker 容器中忘记了 ttrss 的登录密码,可使用 SSH 终端并输入以下命令,将 admin 账户的密码重置为 password

    sudo docker exec -it ttrss_postgres psql -U postgres -d ttrss -c "UPDATE ttrss_users SET pwd_hash = 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', salt = '', otp_enabled = false WHERE login = 'admin';"\n

    请确保替换 ttrss_postgres 为 ttrss 数据库容器的实际名称,而 admin 则为欲重置密码的账户名称。

    ',10),T={},b=(0,s(9720).c)(T,[["render",function(e,n){const s=(0,a.E1)("ExternalLinkIcon"),T=(0,a.E1)("RouteLink");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.mY)("Tiny Tiny RSS 推荐用 "),(0,a.QD)("a",t,[(0,a.mY)("Awesome TTRSS"),(0,a.K2)(s)]),(0,a.mY)(" 的 Docker 镜像,搭建步骤参考 "),(0,a.K2)(T,{to:"/services/NAS.html#nas-docker"},{default:(0,a.Ql)((()=>[(0,a.mY)("NAS 上搭建 Docker")])),_:1}),(0,a.mY)("。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。")]),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("主题:"),(0,a.QD)("a",r,[(0,a.mY)("feedly-sepia.css"),(0,a.K2)(s)])]),(0,a.QD)("li",null,[(0,a.mY)("常见问题:"),(0,a.QD)("a",o,[(0,a.mY)("Tiny Tiny RSS – FAQ"),(0,a.K2)(s)])]),l,(0,a.QD)("li",null,[(0,a.mY)("移动端:"),(0,a.QD)("a",i,[(0,a.mY)("Tiny Tiny RSS for Android"),(0,a.K2)(s)]),(0,a.mY)("。由于 Google Play 的验证折腾,作者已经放弃在 Play 上更新本应用,改为通过 CI/CD 自动构建并取消了应用收费。")])]),p,c,d,(0,a.QD)("p",null,[(0,a.mY)("部署完成后,需要让 TTRSS 定期更新 RSS,步骤参考 "),(0,a.QD)("a",m,[(0,a.mY)("Tiny Tiny RSS – Updating Feeds"),(0,a.K2)(s)]),(0,a.mY)("。如果遇到提示 daemon 未启动,可删除 "),u,(0,a.mY)("和"),S,(0,a.mY)("。")]),(0,a.QD)("p",null,[(0,a.mY)("阿里云"),(0,a.QD)("a",h,[(0,a.mY)("用非 root 账户登录远程 vnc"),(0,a.K2)(s)]),(0,a.mY)(",然后启动 RSS 更新 (默认 2 分钟)。远程 vnc 黑屏时,点左上角「发送远程命令」,点击菜单栏或「关机后重新启动」后不再黑屏。不用直接重启,否则报错。")]),w])}]]),k=JSON.parse('{"path":"/services/TTRSS.html","title":"Tiny Tiny RSS","lang":"zh-CN","frontmatter":{"article":false,"title":"Tiny Tiny RSS","icon":"rss","order":4,"description":"Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。 主题:feedly-sepia.css 常见问题:Tiny Tiny RSS – FAQ 定期备份:选择「偏好设置」...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/TTRSS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Tiny Tiny RSS"}],["meta",{"property":"og:description","content":"Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。 主题:feedly-sepia.css 常见问题:Tiny Tiny RSS – FAQ 定期备份:选择「偏好设置」..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Tiny Tiny RSS\\",\\"description\\":\\"Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。 主题:feedly-sepia.css 常见问题:Tiny Tiny RSS – FAQ 定期备份:选择「偏好设置」...\\"}"]]},"headers":[{"level":2,"title":"手动部署","slug":"手动部署","link":"#手动部署","children":[]},{"level":2,"title":"重置密码","slug":"重置密码","link":"#重置密码","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":2.4,"words":721},"filePathRelative":"services/TTRSS.md","localizedDate":"2022年7月22日","excerpt":"

    Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 NAS 上搭建 Docker。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。

    \\n
      \\n
    • 主题:feedly-sepia.css
    • \\n
    • 常见问题:Tiny Tiny RSS – FAQ
    • \\n
    • 定期备份:选择「偏好设置」>「订阅源」导出订阅源和 tt-rss 设置。
    • \\n
    • 移动端:Tiny Tiny RSS for Android。由于 Google Play 的验证折腾,作者已经放弃在 Play 上更新本应用,改为通过 CI/CD 自动构建并取消了应用收费。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7758],{3671:(e,n)=>{n.A=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},1555:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>T,data:()=>b});var a=s(7847);const t={href:"http://ttrss.henry.wang/zh/",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/levito/tt-rss-feedly-theme",target:"_blank",rel:"noopener noreferrer"},o={href:"https://tt-rss.org/wiki/FAQ",target:"_blank",rel:"noopener noreferrer"},l=(0,a.Lk)("li",null,"定期备份:选择「偏好设置」>「订阅源」导出订阅源和 tt-rss 设置。",-1),i={href:"https://gitlab.tt-rss.org/tt-rss/tt-rss-android/-/releases",target:"_blank",rel:"noopener noreferrer"},p=(0,a.Lk)("h2",{id:"手动部署",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#手动部署"},[(0,a.Lk)("span",null,"手动部署")])],-1),c=(0,a.Lk)("p",null,"虽然 Tiny Tiny RSS 官方建议使用 Docker 部署,但手动部署也很简单,选择适合自己的方式即可。",-1),d=(0,a.Lk)("ol",null,[(0,a.Lk)("li",null,[(0,a.eW)("进入指定目录 "),(0,a.Lk)("code",null,"cd /www/wwwroot/"),(0,a.eW)("。")]),(0,a.Lk)("li",null,[(0,a.eW)("新建 rss 目录,并下载最新 tt-rss "),(0,a.Lk)("code",null,"git clone https://git.tt-rss.org/fox/tt-rss.git rss"),(0,a.eW)("。")]),(0,a.Lk)("li",null,"打开 rss 链接,页面会出现指定要求,如:提升文件权限,删除禁用函数 passthru,安装 php 扩展-fileinfo。配置好后,重新加载 php 配置。")],-1),m={href:"https://tt-rss.org/wiki/UpdatingFeeds",target:"_blank",rel:"noopener noreferrer"},u=(0,a.Lk)("code",null,"lock/update_daemon.lock",-1),S=(0,a.Lk)("code",null,"update_daemon.stamp",-1),h={href:"https://www.cnblogs.com/imyalost/p/9801426.html",target:"_blank",rel:"noopener noreferrer"},k=(0,a.Fv)('
    • 指定 PHP 版本来运行:/www/server/php/74/bin/php /www/wwwroot/rss/update.php --daemon
    • 不指定版本运行:php /www/wwwroot/rss/update.php --daemon

    服务器使用定时任务更新 TTRSS:

    crontab -e #进入 Cpanel 面板添加定时任务\n*/15 * * * * /usr/bin/php /www/wwwroot/rss/update.php --feeds --quiet #只安装了一个php\n*/15 * * * * /www/server/php/74/bin/php /www/wwwroot/rss/update.php --feeds --quiet #安装了多个php\n# 同时按下ctrl+c退出编辑模式,按下shift+: 输入wq 退出 crontab\n*/15 * * * *表示每隔15分钟更新一次,你可以自己改成其它的。\n

    服务器或 nginx 重启后,TTRss 会出现文件夹权限丢失,需重新设置权限。建议将此步骤设为定期任务自动执行。

    chmod -R 777 /www/wwwroot/rss/cache/images\nchmod -R 777 /www/wwwroot/rss/cache/upload\nchmod -R 777 /www/wwwroot/rss/cache/export\nchmod -R 777 /www/wwwroot/rss/feed-icons\nchmod -R 777 /www/wwwroot/rss/lock\n

    升级 Tiny Tiny RSS:进行 TTRSS 目录后执行升级命令 git pull origin master。无法升级时重命名 TTRSS 路径,全新下载后没问题再删除。数据库没变化就没事,主题重新安装。

    重置密码

    如果在 Docker 容器中忘记了 ttrss 的登录密码,可使用 SSH 终端并输入以下命令,将 admin 账户的密码重置为 password

    sudo docker exec -it ttrss_postgres psql -U postgres -d ttrss -c "UPDATE ttrss_users SET pwd_hash = 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', salt = '', otp_enabled = false WHERE login = 'admin';"\n

    请确保替换 ttrss_postgres 为 ttrss 数据库容器的实际名称,而 admin 则为欲重置密码的账户名称。

    ',10),w={},T=(0,s(3671).A)(w,[["render",function(e,n){const s=(0,a.g2)("ExternalLinkIcon"),w=(0,a.g2)("RouteLink");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.eW)("Tiny Tiny RSS 推荐用 "),(0,a.Lk)("a",t,[(0,a.eW)("Awesome TTRSS"),(0,a.bF)(s)]),(0,a.eW)(" 的 Docker 镜像,搭建步骤参考 "),(0,a.bF)(w,{to:"/services/NAS.html#nas-docker"},{default:(0,a.k6)((()=>[(0,a.eW)("NAS 上搭建 Docker")])),_:1}),(0,a.eW)("。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。")]),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("主题:"),(0,a.Lk)("a",r,[(0,a.eW)("feedly-sepia.css"),(0,a.bF)(s)])]),(0,a.Lk)("li",null,[(0,a.eW)("常见问题:"),(0,a.Lk)("a",o,[(0,a.eW)("Tiny Tiny RSS – FAQ"),(0,a.bF)(s)])]),l,(0,a.Lk)("li",null,[(0,a.eW)("移动端:"),(0,a.Lk)("a",i,[(0,a.eW)("Tiny Tiny RSS for Android"),(0,a.bF)(s)]),(0,a.eW)("。由于 Google Play 的验证折腾,作者已经放弃在 Play 上更新本应用,改为通过 CI/CD 自动构建并取消了应用收费。")])]),p,c,d,(0,a.Lk)("p",null,[(0,a.eW)("部署完成后,需要让 TTRSS 定期更新 RSS,步骤参考 "),(0,a.Lk)("a",m,[(0,a.eW)("Tiny Tiny RSS – Updating Feeds"),(0,a.bF)(s)]),(0,a.eW)("。如果遇到提示 daemon 未启动,可删除 "),u,(0,a.eW)("和"),S,(0,a.eW)("。")]),(0,a.Lk)("p",null,[(0,a.eW)("阿里云"),(0,a.Lk)("a",h,[(0,a.eW)("用非 root 账户登录远程 vnc"),(0,a.bF)(s)]),(0,a.eW)(",然后启动 RSS 更新 (默认 2 分钟)。远程 vnc 黑屏时,点左上角「发送远程命令」,点击菜单栏或「关机后重新启动」后不再黑屏。不用直接重启,否则报错。")]),k])}]]),b=JSON.parse('{"path":"/services/TTRSS.html","title":"Tiny Tiny RSS","lang":"zh-CN","frontmatter":{"article":false,"title":"Tiny Tiny RSS","icon":"rss","order":4,"description":"Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。 主题:feedly-sepia.css 常见问题:Tiny Tiny RSS – FAQ 定期备份:选择「偏好设置」...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/TTRSS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Tiny Tiny RSS"}],["meta",{"property":"og:description","content":"Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。 主题:feedly-sepia.css 常见问题:Tiny Tiny RSS – FAQ 定期备份:选择「偏好设置」..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Tiny Tiny RSS\\",\\"description\\":\\"Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。 主题:feedly-sepia.css 常见问题:Tiny Tiny RSS – FAQ 定期备份:选择「偏好设置」...\\"}"]]},"headers":[{"level":2,"title":"手动部署","slug":"手动部署","link":"#手动部署","children":[]},{"level":2,"title":"重置密码","slug":"重置密码","link":"#重置密码","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":2.4,"words":721},"filePathRelative":"services/TTRSS.md","localizedDate":"2022年7月22日","excerpt":"

    Tiny Tiny RSS 推荐用 Awesome TTRSS 的 Docker 镜像,搭建步骤参考 NAS 上搭建 Docker。Awesome TTRSS 镜像不含插件「no_title_counters」,这使 TTRSS 网页标题会显示未读 RSS 数量。

    \\n
      \\n
    • 主题:feedly-sepia.css
    • \\n
    • 常见问题:Tiny Tiny RSS – FAQ
    • \\n
    • 定期备份:选择「偏好设置」>「订阅源」导出订阅源和 tt-rss 设置。
    • \\n
    • 移动端:Tiny Tiny RSS for Android。由于 Google Play 的验证折腾,作者已经放弃在 Play 上更新本应用,改为通过 CI/CD 自动构建并取消了应用收费。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-77c93ddc.4d28556e.js b/assets/js/VPS.html.2371b596.js similarity index 78% rename from assets/js/v-77c93ddc.4d28556e.js rename to assets/js/VPS.html.2371b596.js index 1d1c45ed5..7c264dde3 100644 --- a/assets/js/v-77c93ddc.4d28556e.js +++ b/assets/js/VPS.html.2371b596.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6084],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},7444:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>W,data:()=>B});var s=a(3968);const l=(0,s.QD)("h2",{id:"环境部署",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#环境部署"},[(0,s.QD)("span",null,"环境部署")])],-1),t=(0,s.QD)("p",null,"部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。",-1),i=(0,s.QD)("h3",{id:"包管理安装",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#包管理安装"},[(0,s.QD)("span",null,"包管理安装")])],-1),o={href:"https://nodejs.org/en/download/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.IL)('

    全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g

    包管理源

    包管理源的修改命令类似,将下方的 npm 替换 yarn 或 pnpm 即可修改包管理源。

    #查看源\nnpm config get registry\n#更换国内源\nnpm config set registry https://registry.npmmirror.com/\n#换回默认源\nnpm config set registry https://registry.npmjs.org/\n

    部署包

    npm、yarn 和 pnpm 的包安装及管理命令。

    #全局安装\nnpm i 包 -g\nyarn global add 包\npnpm add-g\n\n#移除全局包\npnpm remove 包 --global\n#更新全局包\npnpm upgrade 包 --global\n\n#升级当前目录的依赖以确保你的项目只包含单个版本的相关包\n#本方法能解决大部分的部署报错\nnpm i && npm update\nyarn && yarn upgrade\npnpm i && pnpm up\n

    本地测试

    有些静态文件不支持直接打开,可以用 anywhere 架构本地服务器来进行测试。

    # 安装静态服务 anywhere\nnpm install anywhere -g\n# 进入静态页面存放目录,执行 anywhere\nanywhere -p 8081\n

    服务器 ECS

    服务器系统为 Debian 11,配置包管理器 nodejs 和 yarn。[1]

    apt-get update   # 从数据源更新软件包的列表,运行产生软件包数据库\napt-get install wget && apt-get install sudo # 安装 wget 和 sudo\n\n# 大版本升级必须先建立快照\napt-get upgrade  # 更新所有软件包(慎用,不要用!)之前 CentOS 系统错误就是使用了 upgrade 命令。\n\n# 新建用户,非 root 权限\nadduser xxx\n# 为新用户设置密码\npasswd xxx\n\n# 安装 Node.js 18 和 yarn\ncurl -fsSL https://deb.nodesource.com/setup_18.x | bash -\napt-get install -y nodejs\nsudo apt-get install yarn\n

    如果服务器的 Node.js 安装遇到问题,可以用宝塔面板的 Node.js 版本管理器来进行部署。

    网站重定向

    更改 nginx 配置后,nginx 重载配置后实现网站重定向。$1 表示第一个 () 内的正则匹配内容,$2 为第二个。[2]

    ',16),r={href:"https://www.jb51.net/article/146957.htm",target:"_blank",rel:"noopener noreferrer"},c=(0,s.IL)('
    #隐性链接跳转\nlocation /xx1 {proxy_pass <https://xxx.com/;>}\n\n#404 前,将旧文章链接格式转为新的,使用绝对路径\nlocation ^~ /p{\n    rewrite ^/p/(.*)$  https://newzone.top/posts/$1.html;\n}\n\n# huginn 设置中 location 添加 301 定向,兼容老路径链接\nif ( $request_uri = "/users/1/web_requests/21/guoke.xml" ) {\nrewrite ^ http://xxx.com/users/1/web_requests/19/guoke.xml permanent;\n}\n\n#只匹配主页,将主页跳转为其中一个子页面\nlocation = / {\n rewrite https://xxx.com/ permanent;\n}\n

    全新安装服务器

    ',2),d={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},m=(0,s.IL)('
  • 删除阿里云主机监控。

    service aegis stop  #停止服务\nchkconfig --del aegis  # 删除服务\n
  • ',1),u={href:"https://www.bt.cn/bbs/thread-2897-1-1.html",target:"_blank",rel:"noopener noreferrer"},h=(0,s.IL)("
  • 宝塔上修改默认账号密码,并修改登录 22 的默认 SSH 端口。如果开通了 FTP,修改 FTP 端口。

  • 选择「网站」>「添加站点」,将站点根目录放在 /www/wwwroot/xxx,同时新建数据库。

  • 上传全站文件并解压,然后按照安装提示重新安装一次,最后导入备份数据库。

  • 404.html 起效,宝塔网站配置文件中,删除 error_page 404 /404.html; 中的 #

  • SSL 证书设置,开启强制 HTTPS;PHP 版本;301 重定向;添加伪静态设置(metinfo 或其他网站后台有代码)。如果 301 设置失败,直接在「伪静态」配置中,放入跳转代码。

  • ",5),v={href:"https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN",target:"_blank",rel:"noopener noreferrer"},b={href:"https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=3117",target:"_blank",rel:"noopener noreferrer"},k=(0,s.QD)("ul",null,[(0,s.QD)("li",null,"添加计划任务,定期释放内存,建议设置每天释放一次,执行时机为半夜,如:04:00。"),(0,s.QD)("li",null,"打开 Linux 工具箱添加 Swap。Swap 推荐与物理内存相同。"),(0,s.QD)("li",null,"安装 PHP 缓存扩展,尽量使用更高的 PHP 版本,另外安装 opcache(脚本缓存)、redis(内容缓存)、imagemagick、fileinfo、exif。"),(0,s.QD)("li",null,[(0,s.mY)("Redis 优化,在/etc/sysctl.conf 中添加 "),(0,s.QD)("code",null,"net.core.somaxconn = 2048"),(0,s.mY)(",然后终端运行 "),(0,s.QD)("code",null,"sysctl -p"),(0,s.mY)("。")])],-1),g=(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("防火墙白名单(自定义),如:添加 url 规则 "),(0,s.QD)("code",null,"^/rss.php"),(0,s.mY)(" 到防火墙 URL 白名单,防止 rss 服务被屏蔽。")])],-1),f=(0,s.QD)("h3",{id:"服务器迁移",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#服务器迁移"},[(0,s.QD)("span",null,"服务器迁移")])],-1),w=(0,s.QD)("li",null,"购买按量付费服务器。",-1),D={href:"https://smc.console.aliyun.com/overview",target:"_blank",rel:"noopener noreferrer"},Q=(0,s.QD)("li",null,"将域名解析到临时系统,确定服务基本正常。",-1),x=(0,s.QD)("li",null,"对旧服务器先建立云盘快照,然后更换操作系统,进行全新部署。",-1),y=(0,s.QD)("li",null,"对比新旧服务器,确认配置正常。",-1),S=(0,s.QD)("h2",{id:"网站设计",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#网站设计"},[(0,s.QD)("span",null,"网站设计")])],-1),Y=(0,s.QD)("h3",{id:"网站字体",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#网站字体"},[(0,s.QD)("span",null,"网站字体")])],-1),_=(0,s.QD)("p",null,[(0,s.mY)("网站为了提高访问速度并保持设计的一致性,通常会选默认字体。这导致网站设计难以突出重点。针对这点,我通常会修改网站的导航栏字体,将其从默认字体改为 "),(0,s.QD)("code",null,"思源黑体 - 粗"),(0,s.mY)("。")],-1),C={href:"https://www.iconfont.cn/webfont",target:"_blank",rel:"noopener noreferrer"},P=(0,s.QD)("li",null,"点击「生成字体」后,在选中字体的下方,点击「本地下载」。",-1),j=(0,s.QD)("li",null,"将字体包上传到服务器,修改新字体的位置参数。",-1),N=(0,s.QD)("li",null,[(0,s.mY)("在导航栏的 "),(0,s.QD)("code",null,"class"),(0,s.mY)(" 属性中添加 "),(0,s.QD)("code",null,"web-font"),(0,s.mY)("。")],-1),q=(0,s.QD)("h3",{id:"米拓",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#米拓"},[(0,s.QD)("span",null,"米拓")])],-1),T=(0,s.QD)("p",null,"早期的动态网站通过米拓开发的,记录:",-1),L={href:"https://www.metinfo.cn/download/54.html",target:"_blank",rel:"noopener noreferrer"},A=(0,s.QD)("li",null,"metinfo 新版静态页会删除 index.html,后续都改用 index.php。",-1),I=(0,s.IL)('

    常见问题

    CPU 100%

    当服务器 CPU 或内存突然飙升 100% 时,依次排除当前运行进程,检查是否安装更新了插件、应用或服务。

    如果找不到原因,可以临时设置定期任务。每隔 3 小时重启一次 nginx/apache。有时重启不正常,因此重启命令后 10 秒,再启动一次 nginx/apache。

    /etc/init.d/nginx restart\nsleep 10s\n/etc/init.d/nginx start\n

    SSL 证书

    如果 SSL 证书部署报错,可以按自动生成来部署。

    #证书设置修改 /www/server/panel/vhost/nginx\nif ($server_port !~ 443){\n    rewrite ^(.*) <https://www.xxx.com$1> permanent;\n}\n#证书修改\n/www/server/panel/vhost/cert/\n#证书位置\n/www/server/panel/vhost/ssl\n

    如果同一网站部署了多个域名,并且都需要部署 SSL,则需要在 /www/server/panel/vhost/cert 目录下为每个域名创建独立的证书文件夹。同时,在网站的配置文件中创建两个独立的server配置,确保它们之间有换行。请注意,宝塔面板中的网站配置在重启 Nginx 后有时会被重置,所以请务必进行检查和确认配置的正确性。[3]

    CORS 跨域

    POST 表单等操作需要涉及第三方 API,需要添加扩域域名,避免 CORS 报错。

        add_header Access-Control-Allow-Origin "*";\n    add_header Access-Control-Allow-Credentials "true";\n    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";\n    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";\n    add_header Access-Control-Expose-Headers "Content-Length,Content-Range";\n

    piwik 手动升级

    Matomo/Piwik 是免费的统计服务。有时无法使用自动安装包,需要手动升级。

    1. 下载最新版应用,并解压到服务器。
    2. 将原目录中的 config/config.ini.php 粘贴到新版中,然后就可以更新数据库进行升级了。
    3. 选择「设置」>「系统」>「地理位置」,拖到页面底部,按页面要求下载 DBIP 包,并重命名保存为 /www/wwwroot/piwik/misc/DBIP-City.mmdb

    ',16),K={class:"footnotes"},O={class:"footnotes-list"},R={id:"footnote1",class:"footnote-item"},z={href:"https://nodejs.org/zh-cn/download/package-manager#debian-and-ubuntu-based-linux-distributions-enterprise-linux-fedora-and-snap-packages",target:"_blank",rel:"noopener noreferrer"},H=(0,s.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),V={id:"footnote2",class:"footnote-item"},E={href:"https://www.w3cschool.cn/nginxsysc/nginxsysc-rewrite.html",target:"_blank",rel:"noopener noreferrer"},$=(0,s.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),M={id:"footnote3",class:"footnote-item"},U={href:"https://cloud.tencent.com/developer/article/2220049?areaSource=102001.7&traceId=SwSyuKeYOHVCQ_bcIFnkh",target:"_blank",rel:"noopener noreferrer"},X=(0,s.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),F={},W=(0,a(9720).c)(F,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[l,t,i,(0,s.QD)("p",null,[(0,s.mY)("通过集成了 npm 的 "),(0,s.QD)("a",o,[(0,s.mY)("Node.js"),(0,s.K2)(a)]),(0,s.mY)(" 来安装 npm,然后执行 npm i 命令安装其他。")]),p,(0,s.QD)("p",null,[(0,s.QD)("a",r,[(0,s.mY)("网站重定向"),(0,s.K2)(a)])]),c,(0,s.QD)("ol",null,[(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("安装"),(0,s.QD)("a",d,[(0,s.mY)("宝塔面板"),(0,s.K2)(a)]),(0,s.mY)("。")])]),m,(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("配置"),(0,s.QD)("a",u,[(0,s.mY)("阿里云端口开放"),(0,s.K2)(a)]),(0,s.mY)(",导入安全规则。")])]),h,(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("服务器设置参考 "),(0,s.QD)("a",v,[(0,s.mY)("NginxConfig"),(0,s.K2)(a)]),(0,s.mY)(" 适合新手配置高性能、安全、稳定的 NGINX 服务器的最简单方法。")])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",b,[(0,s.mY)("ECS 宝塔设置优化"),(0,s.K2)(a)]),(0,s.mY)(":")]),k]),g]),f,(0,s.QD)("ol",null,[w,(0,s.QD)("li",null,[(0,s.mY)("用"),(0,s.QD)("a",D,[(0,s.mY)("服务器迁移中心 SMC"),(0,s.K2)(a)]),(0,s.mY)(" 将旧服务器同步到临时服务器。")]),Q,x,y]),S,Y,_,(0,s.QD)("ol",null,[(0,s.QD)("li",null,[(0,s.mY)("进入 "),(0,s.QD)("a",C,[(0,s.mY)("iconfont‑webfont"),(0,s.K2)(a)]),(0,s.mY)(",输入导航栏内所有文字,并设置所需字体。")]),P,j,N]),q,T,(0,s.QD)("ul",null,[(0,s.QD)("li",null,[(0,s.mY)("后台忘记密码,使用 "),(0,s.QD)("a",L,[(0,s.mY)("Metinfo 米拓重置工具"),(0,s.K2)(a)]),(0,s.mY)("。")]),A]),I,(0,s.QD)("section",K,[(0,s.QD)("ol",O,[(0,s.QD)("li",R,[(0,s.QD)("p",null,[(0,s.QD)("a",z,[(0,s.mY)("通过包管理器方式安装 Node.js"),(0,s.K2)(a)]),(0,s.mY)(),H])]),(0,s.QD)("li",V,[(0,s.QD)("p",null,[(0,s.QD)("a",E,[(0,s.mY)("Nginx rewrite 设置"),(0,s.K2)(a)]),(0,s.mY)(),$])]),(0,s.QD)("li",M,[(0,s.QD)("p",null,[(0,s.QD)("a",U,[(0,s.mY)("针对宝塔面板一个站点多个域名使用 SSL 证书的解决方案"),(0,s.K2)(a)]),(0,s.mY)(),X])])])])])}]]),B=JSON.parse('{"path":"/deploy/VPS.html","title":"服务器 VPS","lang":"zh-CN","frontmatter":{"article":false,"title":"服务器 VPS","icon":"IO","order":3,"description":"环境部署 部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 包管理安装 通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。 全局安装 yarn 是 npm i yarn -g...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/VPS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"服务器 VPS"}],["meta",{"property":"og:description","content":"环境部署 部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 包管理安装 通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。 全局安装 yarn 是 npm i yarn -g..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"服务器 VPS\\",\\"description\\":\\"环境部署 部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 包管理安装 通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。 全局安装 yarn 是 npm i yarn -g...\\"}"]]},"headers":[{"level":2,"title":"环境部署","slug":"环境部署","link":"#环境部署","children":[{"level":3,"title":"包管理安装","slug":"包管理安装","link":"#包管理安装","children":[]},{"level":3,"title":"包管理源","slug":"包管理源","link":"#包管理源","children":[]},{"level":3,"title":"部署包","slug":"部署包","link":"#部署包","children":[]},{"level":3,"title":"本地测试","slug":"本地测试","link":"#本地测试","children":[]}]},{"level":2,"title":"服务器 ECS","slug":"服务器-ecs","link":"#服务器-ecs","children":[{"level":3,"title":"网站重定向","slug":"网站重定向","link":"#网站重定向","children":[]},{"level":3,"title":"全新安装服务器","slug":"全新安装服务器","link":"#全新安装服务器","children":[]},{"level":3,"title":"服务器迁移","slug":"服务器迁移","link":"#服务器迁移","children":[]}]},{"level":2,"title":"网站设计","slug":"网站设计","link":"#网站设计","children":[{"level":3,"title":"网站字体","slug":"网站字体","link":"#网站字体","children":[]},{"level":3,"title":"米拓","slug":"米拓","link":"#米拓","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"CPU 100%","slug":"cpu-100","link":"#cpu-100","children":[]},{"level":3,"title":"SSL 证书","slug":"ssl-证书","link":"#ssl-证书","children":[]},{"level":3,"title":"CORS 跨域","slug":"cors-跨域","link":"#cors-跨域","children":[]},{"level":3,"title":"piwik 手动升级","slug":"piwik-手动升级","link":"#piwik-手动升级","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":24}]},"readingTime":{"minutes":6.49,"words":1946},"filePathRelative":"deploy/VPS.md","localizedDate":"2022年7月22日","excerpt":"

    环境部署

    \\n

    部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。

    \\n

    包管理安装

    \\n

    通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。

    \\n

    全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4925],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},1421:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>K,data:()=>Z});var s=a(7847);const l=(0,s.Lk)("h2",{id:"环境部署",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#环境部署"},[(0,s.Lk)("span",null,"环境部署")])],-1),t=(0,s.Lk)("p",null,"部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。",-1),i=(0,s.Lk)("h3",{id:"包管理安装",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#包管理安装"},[(0,s.Lk)("span",null,"包管理安装")])],-1),o={href:"https://nodejs.org/en/download/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Fv)('

    全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g

    包管理源

    包管理源的修改命令类似,将下方的 npm 替换 yarn 或 pnpm 即可修改包管理源。

    #查看源\nnpm config get registry\n#更换国内源\nnpm config set registry https://registry.npmmirror.com/\n#换回默认源\nnpm config set registry https://registry.npmjs.org/\n

    部署包

    npm、yarn 和 pnpm 的包安装及管理命令。

    #全局安装\nnpm i 包 -g\nyarn global add 包\npnpm add-g\n\n#移除全局包\npnpm remove 包 --global\n#更新全局包\npnpm upgrade 包 --global\n\n#升级当前目录的依赖以确保你的项目只包含单个版本的相关包\n#本方法能解决大部分的部署报错\nnpm i && npm update\nyarn && yarn upgrade\npnpm i && pnpm up\n

    本地测试

    有些静态文件不支持直接打开,可以用 anywhere 架构本地服务器来进行测试。

    # 安装静态服务 anywhere\nnpm install anywhere -g\n# 进入静态页面存放目录,执行 anywhere\nanywhere -p 8081\n

    服务器 ECS

    服务器系统为 Debian 11,配置包管理器 nodejs 和 yarn。[1]

    apt-get update   # 从数据源更新软件包的列表,运行产生软件包数据库\napt-get install wget && apt-get install sudo # 安装 wget 和 sudo\n\n# 大版本升级必须先建立快照\napt-get upgrade  # 更新所有软件包(慎用,不要用!)之前 CentOS 系统错误就是使用了 upgrade 命令。\n\n# 新建用户,非 root 权限\nadduser xxx\n# 为新用户设置密码\npasswd xxx\n\n# 安装 Node.js 18 和 yarn\ncurl -fsSL https://deb.nodesource.com/setup_18.x | bash -\napt-get install -y nodejs\nsudo apt-get install yarn\n

    如果服务器的 Node.js 安装遇到问题,可以用宝塔面板的 Node.js 版本管理器来进行部署。

    网站重定向

    更改 nginx 配置后,nginx 重载配置后实现网站重定向。$1 表示第一个 () 内的正则匹配内容,$2 为第二个。[2]

    ',16),r={href:"https://www.jb51.net/article/146957.htm",target:"_blank",rel:"noopener noreferrer"},c=(0,s.Fv)('
    #隐性链接跳转\nlocation /xx1 {proxy_pass <https://xxx.com/;>}\n\n#404 前,将旧文章链接格式转为新的,使用绝对路径\nlocation ^~ /p{\n    rewrite ^/p/(.*)$  https://newzone.top/posts/$1.html;\n}\n\n# huginn 设置中 location 添加 301 定向,兼容老路径链接\nif ( $request_uri = "/users/1/web_requests/21/guoke.xml" ) {\nrewrite ^ http://xxx.com/users/1/web_requests/19/guoke.xml permanent;\n}\n\n#只匹配主页,将主页跳转为其中一个子页面\nlocation = / {\n rewrite https://xxx.com/ permanent;\n}\n

    全新安装服务器

    ',2),d={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},u=(0,s.Fv)('
  • 删除阿里云主机监控。

    service aegis stop  #停止服务\nchkconfig --del aegis  # 删除服务\n
  • ',1),m={href:"https://www.bt.cn/bbs/thread-2897-1-1.html",target:"_blank",rel:"noopener noreferrer"},k=(0,s.Fv)("
  • 宝塔上修改默认账号密码,并修改登录 22 的默认 SSH 端口。如果开通了 FTP,修改 FTP 端口。

  • 选择「网站」>「添加站点」,将站点根目录放在 /www/wwwroot/xxx,同时新建数据库。

  • 上传全站文件并解压,然后按照安装提示重新安装一次,最后导入备份数据库。

  • 404.html 起效,宝塔网站配置文件中,删除 error_page 404 /404.html; 中的 #

  • SSL 证书设置,开启强制 HTTPS;PHP 版本;301 重定向;添加伪静态设置(metinfo 或其他网站后台有代码)。如果 301 设置失败,直接在「伪静态」配置中,放入跳转代码。

  • ",5),h={href:"https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=3117",target:"_blank",rel:"noopener noreferrer"},b=(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,"添加计划任务,定期释放内存,建议设置每天释放一次,执行时机为半夜,如:04:00。"),(0,s.Lk)("li",null,"打开 Linux 工具箱添加 Swap。Swap 推荐与物理内存相同。"),(0,s.Lk)("li",null,"安装 PHP 缓存扩展,尽量使用更高的 PHP 版本,另外安装 opcache(脚本缓存)、redis(内容缓存)、imagemagick、fileinfo、exif。"),(0,s.Lk)("li",null,[(0,s.eW)("Redis 优化,在/etc/sysctl.conf 中添加 "),(0,s.Lk)("code",null,"net.core.somaxconn = 2048"),(0,s.eW)(",然后终端运行 "),(0,s.Lk)("code",null,"sysctl -p"),(0,s.eW)("。")])],-1),g=(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("防火墙白名单(自定义),如:添加 url 规则 "),(0,s.Lk)("code",null,"^/rss.php"),(0,s.eW)(" 到防火墙 URL 白名单,防止 rss 服务被屏蔽。")])],-1),f=(0,s.Lk)("h3",{id:"服务器迁移",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#服务器迁移"},[(0,s.Lk)("span",null,"服务器迁移")])],-1),w=(0,s.Lk)("li",null,"购买按量付费服务器。",-1),L={href:"https://smc.console.aliyun.com/overview",target:"_blank",rel:"noopener noreferrer"},x=(0,s.Lk)("li",null,"将域名解析到临时系统,确定服务基本正常。",-1),y=(0,s.Lk)("li",null,"对旧服务器先建立云盘快照,然后更换操作系统,进行全新部署。",-1),W=(0,s.Lk)("li",null,"对比新旧服务器,确认配置正常。",-1),S=(0,s.Lk)("h2",{id:"网站设计",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#网站设计"},[(0,s.Lk)("span",null,"网站设计")])],-1),_=(0,s.Lk)("h3",{id:"网站字体",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#网站字体"},[(0,s.Lk)("span",null,"网站字体")])],-1),C=(0,s.Lk)("p",null,[(0,s.eW)("网站为了提高访问速度并保持设计的一致性,通常会选默认字体。这导致网站设计难以突出重点。针对这点,我通常会修改网站的导航栏字体,将其从默认字体改为 "),(0,s.Lk)("code",null,"思源黑体 - 粗"),(0,s.eW)("。")],-1),P={href:"https://www.iconfont.cn/webfont",target:"_blank",rel:"noopener noreferrer"},j=(0,s.Lk)("li",null,"点击「生成字体」后,在选中字体的下方,点击「本地下载」。",-1),F=(0,s.Lk)("li",null,"将字体包上传到服务器,修改新字体的位置参数。",-1),N=(0,s.Lk)("li",null,[(0,s.eW)("在导航栏的 "),(0,s.Lk)("code",null,"class"),(0,s.eW)(" 属性中添加 "),(0,s.Lk)("code",null,"web-font"),(0,s.eW)("。")],-1),q=(0,s.Lk)("h3",{id:"米拓",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#米拓"},[(0,s.Lk)("span",null,"米拓")])],-1),T=(0,s.Lk)("p",null,"早期的动态网站通过米拓开发的,记录:",-1),A={href:"https://www.metinfo.cn/download/54.html",target:"_blank",rel:"noopener noreferrer"},O=(0,s.Lk)("li",null,"metinfo 新版静态页会删除 index.html,后续都改用 index.php。",-1),I=(0,s.Fv)('

    常见问题

    CPU 100%

    当服务器 CPU 或内存突然飙升 100% 时,依次排除当前运行进程,检查是否安装更新了插件、应用或服务。

    如果找不到原因,可以临时设置定期任务。每隔 3 小时重启一次 nginx/apache。有时重启不正常,因此重启命令后 10 秒,再启动一次 nginx/apache。

    /etc/init.d/nginx restart\nsleep 10s\n/etc/init.d/nginx start\n

    SSL 证书

    如果 SSL 证书部署报错,可以按自动生成来部署。

    #证书设置修改 /www/server/panel/vhost/nginx\nif ($server_port !~ 443){\n    rewrite ^(.*) <https://www.xxx.com$1> permanent;\n}\n#证书修改\n/www/server/panel/vhost/cert/\n#证书位置\n/www/server/panel/vhost/ssl\n

    如果同一网站部署了多个域名,并且都需要部署 SSL,则需要在 /www/server/panel/vhost/cert 目录下为每个域名创建独立的证书文件夹。同时,在网站的配置文件中创建两个独立的server配置,确保它们之间有换行。请注意,宝塔面板中的网站配置在重启 Nginx 后有时会被重置,所以请务必进行检查和确认配置的正确性。[3]

    CORS 跨域

    POST 表单等操作需要涉及第三方 API,需要添加扩域域名,避免 CORS 报错。

        add_header Access-Control-Allow-Origin "*";\n    add_header Access-Control-Allow-Credentials "true";\n    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";\n    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";\n    add_header Access-Control-Expose-Headers "Content-Length,Content-Range";\n

    piwik 手动升级

    Matomo/Piwik 是免费的统计服务。有时无法使用自动安装包,需要手动升级。

    1. 下载最新版应用,并解压到服务器。
    2. 将原目录中的 config/config.ini.php 粘贴到新版中,然后就可以更新数据库进行升级了。
    3. 选择「设置」>「系统」>「地理位置」,拖到页面底部,按页面要求下载 DBIP 包,并重命名保存为 /www/wwwroot/piwik/misc/DBIP-City.mmdb

    ',16),R={class:"footnotes"},z={class:"footnotes-list"},D={id:"footnote1",class:"footnote-item"},H={href:"https://nodejs.org/zh-cn/download/package-manager#debian-and-ubuntu-based-linux-distributions-enterprise-linux-fedora-and-snap-packages",target:"_blank",rel:"noopener noreferrer"},V=(0,s.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),E={id:"footnote2",class:"footnote-item"},$={href:"https://www.w3cschool.cn/nginxsysc/nginxsysc-rewrite.html",target:"_blank",rel:"noopener noreferrer"},M=(0,s.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),X={id:"footnote3",class:"footnote-item"},U={href:"https://cloud.tencent.com/developer/article/2220049?areaSource=102001.7&traceId=SwSyuKeYOHVCQ_bcIFnkh",target:"_blank",rel:"noopener noreferrer"},B=(0,s.Lk)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),G={},K=(0,a(3671).A)(G,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[l,t,i,(0,s.Lk)("p",null,[(0,s.eW)("通过集成了 npm 的 "),(0,s.Lk)("a",o,[(0,s.eW)("Node.js"),(0,s.bF)(a)]),(0,s.eW)(" 来安装 npm,然后执行 npm i 命令安装其他。")]),p,(0,s.Lk)("p",null,[(0,s.Lk)("a",r,[(0,s.eW)("网站重定向"),(0,s.bF)(a)])]),c,(0,s.Lk)("ol",null,[(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("安装"),(0,s.Lk)("a",d,[(0,s.eW)("宝塔面板"),(0,s.bF)(a)]),(0,s.eW)("。")])]),u,(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("配置"),(0,s.Lk)("a",m,[(0,s.eW)("阿里云端口开放"),(0,s.bF)(a)]),(0,s.eW)(",导入安全规则。")])]),k,(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.eW)("服务器设置参考 "),(0,s.Lk)("a",h,[(0,s.eW)("NginxConfig"),(0,s.bF)(a)]),(0,s.eW)(" 适合新手配置高性能、安全、稳定的 NGINX 服务器的最简单方法。")])]),(0,s.Lk)("li",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",v,[(0,s.eW)("ECS 宝塔设置优化"),(0,s.bF)(a)]),(0,s.eW)(":")]),b]),g]),f,(0,s.Lk)("ol",null,[w,(0,s.Lk)("li",null,[(0,s.eW)("用"),(0,s.Lk)("a",L,[(0,s.eW)("服务器迁移中心 SMC"),(0,s.bF)(a)]),(0,s.eW)(" 将旧服务器同步到临时服务器。")]),x,y,W]),S,_,C,(0,s.Lk)("ol",null,[(0,s.Lk)("li",null,[(0,s.eW)("进入 "),(0,s.Lk)("a",P,[(0,s.eW)("iconfont‑webfont"),(0,s.bF)(a)]),(0,s.eW)(",输入导航栏内所有文字,并设置所需字体。")]),j,F,N]),q,T,(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.eW)("后台忘记密码,使用 "),(0,s.Lk)("a",A,[(0,s.eW)("Metinfo 米拓重置工具"),(0,s.bF)(a)]),(0,s.eW)("。")]),O]),I,(0,s.Lk)("section",R,[(0,s.Lk)("ol",z,[(0,s.Lk)("li",D,[(0,s.Lk)("p",null,[(0,s.Lk)("a",H,[(0,s.eW)("通过包管理器方式安装 Node.js"),(0,s.bF)(a)]),(0,s.eW)(),V])]),(0,s.Lk)("li",E,[(0,s.Lk)("p",null,[(0,s.Lk)("a",$,[(0,s.eW)("Nginx rewrite 设置"),(0,s.bF)(a)]),(0,s.eW)(),M])]),(0,s.Lk)("li",X,[(0,s.Lk)("p",null,[(0,s.Lk)("a",U,[(0,s.eW)("针对宝塔面板一个站点多个域名使用 SSL 证书的解决方案"),(0,s.bF)(a)]),(0,s.eW)(),B])])])])])}]]),Z=JSON.parse('{"path":"/deploy/VPS.html","title":"服务器 VPS","lang":"zh-CN","frontmatter":{"article":false,"title":"服务器 VPS","icon":"IO","order":3,"description":"环境部署 部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 包管理安装 通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。 全局安装 yarn 是 npm i yarn -g...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/VPS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"服务器 VPS"}],["meta",{"property":"og:description","content":"环境部署 部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 包管理安装 通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。 全局安装 yarn 是 npm i yarn -g..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-05T23:04:54.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-05T23:04:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"服务器 VPS\\",\\"description\\":\\"环境部署 部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。 包管理安装 通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。 全局安装 yarn 是 npm i yarn -g...\\"}"]]},"headers":[{"level":2,"title":"环境部署","slug":"环境部署","link":"#环境部署","children":[{"level":3,"title":"包管理安装","slug":"包管理安装","link":"#包管理安装","children":[]},{"level":3,"title":"包管理源","slug":"包管理源","link":"#包管理源","children":[]},{"level":3,"title":"部署包","slug":"部署包","link":"#部署包","children":[]},{"level":3,"title":"本地测试","slug":"本地测试","link":"#本地测试","children":[]}]},{"level":2,"title":"服务器 ECS","slug":"服务器-ecs","link":"#服务器-ecs","children":[{"level":3,"title":"网站重定向","slug":"网站重定向","link":"#网站重定向","children":[]},{"level":3,"title":"全新安装服务器","slug":"全新安装服务器","link":"#全新安装服务器","children":[]},{"level":3,"title":"服务器迁移","slug":"服务器迁移","link":"#服务器迁移","children":[]}]},{"level":2,"title":"网站设计","slug":"网站设计","link":"#网站设计","children":[{"level":3,"title":"网站字体","slug":"网站字体","link":"#网站字体","children":[]},{"level":3,"title":"米拓","slug":"米拓","link":"#米拓","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"CPU 100%","slug":"cpu-100","link":"#cpu-100","children":[]},{"level":3,"title":"SSL 证书","slug":"ssl-证书","link":"#ssl-证书","children":[]},{"level":3,"title":"CORS 跨域","slug":"cors-跨域","link":"#cors-跨域","children":[]},{"level":3,"title":"piwik 手动升级","slug":"piwik-手动升级","link":"#piwik-手动升级","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1691276694000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":24}]},"readingTime":{"minutes":6.49,"words":1946},"filePathRelative":"deploy/VPS.md","localizedDate":"2022年7月22日","excerpt":"

    环境部署

    \\n

    部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。

    \\n

    包管理安装

    \\n

    通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。

    \\n

    全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-713600df.d7c1db1b.js b/assets/js/Vue.html.ce52eec3.js similarity index 94% rename from assets/js/v-713600df.d7c1db1b.js rename to assets/js/Vue.html.ce52eec3.js index 411f243da..9aba5dc68 100644 --- a/assets/js/v-713600df.d7c1db1b.js +++ b/assets/js/Vue.html.ce52eec3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4512],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},3748:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>p,data:()=>u});var s=a(3968);const t=(0,s.QD)("h2",{id:"基础知识",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#基础知识"},[(0,s.QD)("span",null,"基础知识")])],-1),i=(0,s.QD)("p",null,"mounted 是生命周期函数,自动执行。",-1),l=(0,s.QD)("p",null,"props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。",-1),c={href:"https://cn.vuejs.org/guide/essentials/event-handling.html#event-modifiers",target:"_blank",rel:"noopener noreferrer"},d=(0,s.IL)('
    //从 Vue 对象中将 ref, reactive, readonly, toRefs 方法解构出来\nconst { ref, reactive} = Vue;\n\n// setup\nsetup(props, context) {\n  const { h } = Vue;\n  const { attrs, slots, emit } = context;\n  function handleClick() {\n    emit('change');\n  }\n  return { handleClick };\n},\n\n

    v-model

    v-model 双向绑定,可以让子组件向父组件传递参数。

    // 传递单个参数 count\n// template\n<counter v-model="count" />\n// component:传递参数必须为 `modelValue`,传递方法必须为 `update:modelValue`\napp.component('counter', {\n  props: ['modelValue'],\n  methods: {\n    handleClick() {\n      this.$emit('update:modelValue', this.modelValue + 3);\n    },\n  },\n  template: `\n  <div @click="handleClick">{{modelValue}}</div>\n`,\n});\n\n// v-model 传递多个参数 count 和 count1\n// template\n<counterx v-model:count="count" v-model:count1="count1" />\n// component\napp.component('counterx', {\n  props: ['count', 'count1'],\n  methods: {\n    handleClick2() {\n      this.$emit('update:count', this.count + 1);\n    },\n    handleClick3() {\n      this.$emit('update:count1', this.count1 + 10);\n    },\n  },\n  template: `\n  <div @click="handleClick2">{{count}}</div>\n  <div @click="handleClick3">{{count1}}</div>\n`,\n});\n

    组件命名

    全局组件,建议「小写字母单词,单次间用横线间隔」;局部组件,建议「每个单次都用大写字母开头(驼峰命名)」。按这个规则命名,Vue 才能自动转换。

    // Vue 会自动将 Counter(局部组件)转为 counter(全局组件),将 HelloWorld(局部组件)转为 hello-world(局部组件)。\nconst Counter = {\n  data() {\n    return {\n      count: 1,\n    };\n  },\n  template: `<div @click="count += 1">{{count}}</div>`,\n};\n\nconst HelloWorld = {\n  template: `<div>hello world</div>`,\n};\n\nconst app = Vue.createApp({\n  // 引入局部组件(需放在引入之前)\n  components: {\n    // 手动定位\n    // counter: Counter,\n    // 'hello-world': HelloWorld,\n    Counter,\n    HelloWorld,\n  },\n  template: `\n  <div>\n    <hello-world />11111111\n    <counter />222222\n  </div>\n`,\n});\n

    CDN 使用 vue

    <script\n  src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/3.2.31/vue.global.min.js"\n  type="application/javascript"\n></script>\n<div id="app">{{ message }}</div>\n\n<script>\n  const { createApp } = Vue;\n\n  createApp({\n    data() {\n      return {\n        message: "Hello Vue!",\n      };\n    },\n  }).mount("#app");\n</script>\n

    使用 <div v-html="html"></div> 来引入 html 元素,功能类似于 innerHTML,不能加载外部 HTML,实现 <?php echo file_get_contents("https://docs.manictime.com/win-client/faq"); ?> 类似的功能。

    ',10),o={},p=(0,a(9720).c)(o,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[t,i,l,(0,s.QD)("p",null,[(0,s.mY)("按键、事件都可以加入"),(0,s.QD)("a",c,[(0,s.mY)("修饰符"),(0,s.K2)(a)]),(0,s.mY)(",简化代码。")]),d])}]]),u=JSON.parse('{"path":"/code/Vue.html","title":"Vue","lang":"zh-CN","frontmatter":{"article":false,"title":"Vue","icon":"vue","order":2,"description":"基础知识 mounted 是生命周期函数,自动执行。 props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。 按键、事件都可以加入修饰符,简化代码。 v-model v-model 双向绑定,可以让子组件向父组件传递参数。 组件命名 全局组件,建议「小写字母单词,单次间用横线间隔」;局部组...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Vue.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Vue"}],["meta",{"property":"og:description","content":"基础知识 mounted 是生命周期函数,自动执行。 props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。 按键、事件都可以加入修饰符,简化代码。 v-model v-model 双向绑定,可以让子组件向父组件传递参数。 组件命名 全局组件,建议「小写字母单词,单次间用横线间隔」;局部组..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Vue\\",\\"description\\":\\"基础知识 mounted 是生命周期函数,自动执行。 props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。 按键、事件都可以加入修饰符,简化代码。 v-model v-model 双向绑定,可以让子组件向父组件传递参数。 组件命名 全局组件,建议「小写字母单词,单次间用横线间隔」;局部组...\\"}"]]},"headers":[{"level":2,"title":"基础知识","slug":"基础知识","link":"#基础知识","children":[]},{"level":2,"title":"v-model","slug":"v-model","link":"#v-model","children":[]},{"level":2,"title":"组件命名","slug":"组件命名","link":"#组件命名","children":[]},{"level":2,"title":"CDN 使用 vue","slug":"cdn-使用-vue","link":"#cdn-使用-vue","children":[]}],"git":{"createdTime":1666549346000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.62,"words":487},"filePathRelative":"code/Vue.md","localizedDate":"2022年10月23日","excerpt":"

    基础知识

    \\n

    mounted 是生命周期函数,自动执行。

    \\n

    props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。

    \\n

    按键、事件都可以加入修饰符,简化代码。

    \\n
    //从 Vue 对象中将 ref, reactive, readonly, toRefs 方法解构出来\\nconst { ref, reactive} = Vue;\\n\\n// setup\\nsetup(props, context) {\\n  const { h } = Vue;\\n  const { attrs, slots, emit } = context;\\n  function handleClick() {\\n    emit(\'change\');\\n  }\\n  return { handleClick };\\n},\\n\\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2302],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},3537:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>p,data:()=>u});var s=a(7847);const t=(0,s.Lk)("h2",{id:"基础知识",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#基础知识"},[(0,s.Lk)("span",null,"基础知识")])],-1),i=(0,s.Lk)("p",null,"mounted 是生命周期函数,自动执行。",-1),l=(0,s.Lk)("p",null,"props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。",-1),c={href:"https://cn.vuejs.org/guide/essentials/event-handling.html#event-modifiers",target:"_blank",rel:"noopener noreferrer"},d=(0,s.Fv)('
    //从 Vue 对象中将 ref, reactive, readonly, toRefs 方法解构出来\nconst { ref, reactive} = Vue;\n\n// setup\nsetup(props, context) {\n  const { h } = Vue;\n  const { attrs, slots, emit } = context;\n  function handleClick() {\n    emit('change');\n  }\n  return { handleClick };\n},\n\n

    v-model

    v-model 双向绑定,可以让子组件向父组件传递参数。

    // 传递单个参数 count\n// template\n<counter v-model="count" />\n// component:传递参数必须为 `modelValue`,传递方法必须为 `update:modelValue`\napp.component('counter', {\n  props: ['modelValue'],\n  methods: {\n    handleClick() {\n      this.$emit('update:modelValue', this.modelValue + 3);\n    },\n  },\n  template: `\n  <div @click="handleClick">{{modelValue}}</div>\n`,\n});\n\n// v-model 传递多个参数 count 和 count1\n// template\n<counterx v-model:count="count" v-model:count1="count1" />\n// component\napp.component('counterx', {\n  props: ['count', 'count1'],\n  methods: {\n    handleClick2() {\n      this.$emit('update:count', this.count + 1);\n    },\n    handleClick3() {\n      this.$emit('update:count1', this.count1 + 10);\n    },\n  },\n  template: `\n  <div @click="handleClick2">{{count}}</div>\n  <div @click="handleClick3">{{count1}}</div>\n`,\n});\n

    组件命名

    全局组件,建议「小写字母单词,单次间用横线间隔」;局部组件,建议「每个单次都用大写字母开头(驼峰命名)」。按这个规则命名,Vue 才能自动转换。

    // Vue 会自动将 Counter(局部组件)转为 counter(全局组件),将 HelloWorld(局部组件)转为 hello-world(局部组件)。\nconst Counter = {\n  data() {\n    return {\n      count: 1,\n    };\n  },\n  template: `<div @click="count += 1">{{count}}</div>`,\n};\n\nconst HelloWorld = {\n  template: `<div>hello world</div>`,\n};\n\nconst app = Vue.createApp({\n  // 引入局部组件(需放在引入之前)\n  components: {\n    // 手动定位\n    // counter: Counter,\n    // 'hello-world': HelloWorld,\n    Counter,\n    HelloWorld,\n  },\n  template: `\n  <div>\n    <hello-world />11111111\n    <counter />222222\n  </div>\n`,\n});\n

    CDN 使用 vue

    <script\n  src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/3.2.31/vue.global.min.js"\n  type="application/javascript"\n></script>\n<div id="app">{{ message }}</div>\n\n<script>\n  const { createApp } = Vue;\n\n  createApp({\n    data() {\n      return {\n        message: "Hello Vue!",\n      };\n    },\n  }).mount("#app");\n</script>\n

    使用 <div v-html="html"></div> 来引入 html 元素,功能类似于 innerHTML,不能加载外部 HTML,实现 <?php echo file_get_contents("https://docs.manictime.com/win-client/faq"); ?> 类似的功能。

    ',10),o={},p=(0,a(3671).A)(o,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,i,l,(0,s.Lk)("p",null,[(0,s.eW)("按键、事件都可以加入"),(0,s.Lk)("a",c,[(0,s.eW)("修饰符"),(0,s.bF)(a)]),(0,s.eW)(",简化代码。")]),d])}]]),u=JSON.parse('{"path":"/code/Vue.html","title":"Vue","lang":"zh-CN","frontmatter":{"article":false,"title":"Vue","icon":"vue","order":2,"description":"基础知识 mounted 是生命周期函数,自动执行。 props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。 按键、事件都可以加入修饰符,简化代码。 v-model v-model 双向绑定,可以让子组件向父组件传递参数。 组件命名 全局组件,建议「小写字母单词,单次间用横线间隔」;局部组...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Vue.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Vue"}],["meta",{"property":"og:description","content":"基础知识 mounted 是生命周期函数,自动执行。 props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。 按键、事件都可以加入修饰符,简化代码。 v-model v-model 双向绑定,可以让子组件向父组件传递参数。 组件命名 全局组件,建议「小写字母单词,单次间用横线间隔」;局部组..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Vue\\",\\"description\\":\\"基础知识 mounted 是生命周期函数,自动执行。 props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。 按键、事件都可以加入修饰符,简化代码。 v-model v-model 双向绑定,可以让子组件向父组件传递参数。 组件命名 全局组件,建议「小写字母单词,单次间用横线间隔」;局部组...\\"}"]]},"headers":[{"level":2,"title":"基础知识","slug":"基础知识","link":"#基础知识","children":[]},{"level":2,"title":"v-model","slug":"v-model","link":"#v-model","children":[]},{"level":2,"title":"组件命名","slug":"组件命名","link":"#组件命名","children":[]},{"level":2,"title":"CDN 使用 vue","slug":"cdn-使用-vue","link":"#cdn-使用-vue","children":[]}],"git":{"createdTime":1666549346000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.62,"words":487},"filePathRelative":"code/Vue.md","localizedDate":"2022年10月23日","excerpt":"

    基础知识

    \\n

    mounted 是生命周期函数,自动执行。

    \\n

    props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。

    \\n

    按键、事件都可以加入修饰符,简化代码。

    \\n
    //从 Vue 对象中将 ref, reactive, readonly, toRefs 方法解构出来\\nconst { ref, reactive} = Vue;\\n\\n// setup\\nsetup(props, context) {\\n  const { h } = Vue;\\n  const { attrs, slots, emit } = context;\\n  function handleClick() {\\n    emit(\'change\');\\n  }\\n  return { handleClick };\\n},\\n\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/VuePress.html.e1fe6e2a.js b/assets/js/VuePress.html.e1fe6e2a.js new file mode 100644 index 000000000..4aac96894 --- /dev/null +++ b/assets/js/VuePress.html.e1fe6e2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1211],{3671:(e,s)=>{s.A=(e,s)=>{const a=e.__vccOpts||e;for(const[e,n]of s)a[e]=n;return a}},276:(e,s,a)=>{a.r(s),a.d(s,{comp:()=>De,data:()=>Ce});var n=a(7847);const t={href:"https://v2.vuepress.vuejs.org/zh/guide/getting-started.html",target:"_blank",rel:"noopener noreferrer"},l={href:"https://stackblitz.com/",target:"_blank",rel:"noopener noreferrer"},i=(0,n.Lk)("code",null,"https://stackblitz.com/github/用户名/仓库名",-1),o={href:"https://theme-hope.vuejs.press/zh/guide/",target:"_blank",rel:"noopener noreferrer"},c={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"},p={href:"https://theme-hope.vuejs.press/zh/config/style.html",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/vuepress/awesome-vuepress/blob/main/v2.md",target:"_blank",rel:"noopener noreferrer"},u={href:"https://www.npmjs.com/package/vuepress-plugin-helper-live2d",target:"_blank",rel:"noopener noreferrer"},k=(0,n.Lk)("h2",{id:"初始配置",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#初始配置"},[(0,n.Lk)("span",null,"初始配置")])],-1),d=(0,n.Lk)("li",null,[(0,n.eW)("新建文件夹,然后在该路径下运行命令 "),(0,n.Lk)("code",null,"pnpm create vuepress-theme-hope docs"),(0,n.eW)("。vuepress-theme-hope 主题的样例文件会存储在该路径下。有时因版本问题,样例运行会报错,此时须用固定版本号来安装依赖环境,终端中输入 "),(0,n.Lk)("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"),(0,n.eW)("。")],-1),m=(0,n.Lk)("li",null,[(0,n.eW)("执行命令 "),(0,n.Lk)("code",null,"pnpm docs:dev"),(0,n.eW)(" 启动样例网站。")],-1),b=(0,n.Lk)("code",null,"docs\\.vuepress",-1),h={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress",target:"_blank",rel:"noopener noreferrer"},v=(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,"config.ts:配置网站环境依赖和网站属性。"),(0,n.Lk)("li",null,"sidebar.ts:侧边栏,集合所有文档的目录。"),(0,n.Lk)("li",null,"navbar.ts:导航栏,放最常用的文档链接。"),(0,n.Lk)("li",null,"theme.ts:对主题和插件进行设置。")],-1),f=(0,n.Lk)("li",null,[(0,n.eW)("如果遇到报错,执行命令 "),(0,n.Lk)("code",null,"pnpm add vuepress@next vuepress-theme-hope && pnpm i && pnpm up"),(0,n.eW)(" 修复并升级相关依赖包。如果依然有问题,则删除 node_modules 和 lock 文件,执行 "),(0,n.Lk)("code",null,"pnpm install && pnpm i && pnpm up"),(0,n.eW)(" 重置依赖包文件。")],-1),g=(0,n.Fv)('

    如果遇到错误 [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),L={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/search.html",target:"_blank",rel:"noopener noreferrer"},W={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/docsearch.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://crawler.algolia.com/admin/crawlers/bd9cfb06-0346-4a64-9a1a-8a513f0b7fce/overview",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.algolia.com/apps/M4EXXEZIEG/dashboard",target:"_blank",rel:"noopener noreferrer"},w=(0,n.Lk)("h2",{id:"webpack-打包",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#webpack-打包"},[(0,n.Lk)("span",null,"Webpack 打包")])],-1),q=(0,n.Lk)("p",null,"从 VuePress 2.0.0-rc.2 版本起,你可以自由选择 Vite 或 Webpack 作为打包工具。使用 Vite 进行打包时,系统会引入时间戳和 hash 值对文件进行重命名。这一机制虽然保证了文件的唯一性,但同时也带来了一个问题:即使没有更新内容,网站的大部分文件在每次生成时也会发生改变。例如,在我的 VuePress 默认配置的笔记网站中,每次服务器部署都需耗费 5 至 15 分钟的宝贵时间。新版的 LearnData 已经默认采用了 Webpack 作为打包工具,因此无需手动切换。",-1),E=(0,n.Lk)("p",null,"早期的 VuePress 只支持 Vite 打包。因此,我记录了手动添加 webpack 的方法,作为备用。",-1),_={href:"https://github.com/rockbenben/LearnData/tree/nohashname",target:"_blank",rel:"noopener noreferrer"},P={href:"https://v2.vuepress.vuejs.org/zh/guide/bundler.html",target:"_blank",rel:"noopener noreferrer"},F=(0,n.Fv)('
  • 修改 config.ts 的导入设置,将 import { defineUserConfig } from "vuepress" 替换为 import { defineUserConfig } from "@vuepress/cli",将 import { viteBundler } from "@vuepress/bundler-vite" 替换为 import { webpackBundler } from "@vuepress/bundler-webpack"

  • Webpack 环境依赖包安装,并运行服务。

    #组合命令,打包使用 Webpack\npnpm add vuepress@next vuepress-theme-hope && pnpm remove vuepress && pnpm add vuepress-webpack@next sass-loader && pnpm i && pnpm up\n\n#运行在本地服务器\nyarn docs:dev\n

    组合命令也能解决报错,升级相关依赖包。相关命令的分步解释见下方。

    #确保你正在使用最新的 vuepress 和 vuepress-theme-hope 版本\npnpm add vuepress@next vuepress-theme-hope\n\n#更换打包工具,Webpack 需手动下载 sass-loader\npnpm remove vuepress\npnpm add -D vuepress-webpack@next sass-loader\n\n#常用插件:google-analytics,search\npnpm add @vuepress/plugin-google-analytics@next @vuepress/plugin-search@next\n\n#升级当前目录的依赖以确保你的项目只包含单个版本的相关包\npnpm i && pnpm up\n
  • ',2),V={href:"https://github.com/neutrinojs/webpack-chain",target:"_blank",rel:"noopener noreferrer"},B=(0,n.Lk)("sup",{class:"footnote-ref"},[(0,n.Lk)("a",{href:"#footnote1"},"[1]"),(0,n.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),z=(0,n.Lk)("code",null,".filename",-1),j=(0,n.Fv)('
    export default defineUserConfig({\n  bundler: webpackBundler({\n    chainWebpack(config) {\n      // do not use chunk hash in js\n      //参照案例:https://github.com/vuepress/vuepress-plugin-named-chunks/blob/b9fb5a1d3475530b1d74b6616f92a6e3bf14a7ed/__tests__/docs/.vuepress/config.js\n      config.output\n        .filename(`[name].js`)\n        .chunkFilename("assets/chunks/[name].js");\n    },\n  }),\n});\n
    ',1),A={href:"https://cli.vuejs.org/config/#vue-config-js",target:"_blank",rel:"noopener noreferrer"},M=(0,n.Lk)("code",null,"filenameHashing: false",-1),D=(0,n.Lk)("h2",{id:"关闭-prefetch",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#关闭-prefetch"},[(0,n.Lk)("span",null,"关闭 prefetch")])],-1),C=(0,n.Lk)("p",null,"preload 是一种声明式的资源获取请求方式,用于提前加载一些需要的依赖,并且不会影响页面的 onload 事件。prefetch 是一种利用浏览器的空闲时间加载页面将来可能用到的资源的一种机制;通常可以用于加载非首页的其他页面所需要的资源,以便加快后续页面的首屏速度。preload 主要用于预加载当前页面需要的资源;而 prefetch 主要用于加载将来页面可能需要的资源。",-1),H={href:"https://vuepress.github.io/zh/reference/config.html#build-%E9%85%8D%E7%BD%AE%E9%A1%B9",target:"_blank",rel:"noopener noreferrer"},U=(0,n.Lk)("p",null,[(0,n.Lk)("code",null,"docs\\.vuepress"),(0,n.eW)(" 路径下的 config.ts 配置中插入 "),(0,n.Lk)("code",null,"shouldPrefetch: false,"),(0,n.eW)(",即可关闭 prefetch。")],-1),S=(0,n.Lk)("h2",{id:"页面模板",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#页面模板"},[(0,n.Lk)("span",null,"页面模板")])],-1),T=(0,n.Lk)("p",null,"VuePress 页面生成规则基于主题模板,如果修改全站 html 内容,最简单的方式就是修改模板。",-1),R={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/packages/theme/templates/index.build.html",target:"_blank",rel:"noopener noreferrer"},I=(0,n.Fv)('
    import { path } from "@vuepress/utils";\nexport default defineUserConfig({\n  ...\n  templateBuild: path.resolve(__dirname, "index.build.html"),\n});\n

    除修改页面模板外,也可以通过修改 config.ts 配置来添加自定义标签。插入下方代码后,网站所有页面都会在 header 前添入对应代码,其效用等同于 <meta name="keywords" content="关键词,内容标签,相关词"><img referrerpolicy="no-referrer-when-downgrade" src="https://tongji.newzone.top/matomo.php?idsite=7&amp;rec=1" style="border:0" alt="" />

    head: [\n  [\n    "meta",\n    {\n      name: "keywords",\n      content: "关键词,内容标签,相关词",\n    },\n  ],\n  [\n    "img",\n    {\n      referrerpolicy: "no-referrer-when-downgrade",\n      src: "https://tongji.newzone.top/matomo.php?idsite=7&amp;rec=1",\n      style: "border:0",\n      alt: "",\n    },\n  ],\n],\n

    时间参数

    ',4),N={href:"https://plugin-seo2.vuejs.press/zh/guide.html",target:"_blank",rel:"noopener noreferrer"},O=(0,n.Lk)("code",null,"og:updated_time",-1),G=(0,n.Lk)("code",null,"article:modified_time",-1),X=(0,n.Lk)("code",null,"page.git.updatedTime",-1),Z=(0,n.Lk)("code",null,"theme.ts",-1),J=(0,n.Fv)('
    import { seoPlugin } from "vuepress-plugin-seo2";\nexport default defineUserConfig({\n  ...\n  plugins: [\n    seoPlugin({\n      hostname: "https://vuepress-theme-hope.github.io",\n      ogp: (ogp, page) => ({\n        ...ogp,\n        "og:updated_time": "",\n        "og:modified_time": "",\n      }),\n  ],\n});\n

    另外,如果想停止向页面导入 lastUpdated 参数,在 theme.ts 中插入 lastUpdated: false 即可。

    export default hopeTheme({\n  lastUpdated: false,\n});\n

    自定义主题

    ',4),K={class:"task-list-container"},Q=(0,n.Lk)("li",{class:"task-list-item"},[(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-0",checked:"checked",disabled:"disabled"}),(0,n.Lk)("label",{class:"task-list-item-label",for:"task-item-0"},[(0,n.Lk)("s",null,"创建独立的笔记区,便于整理生活感悟与专题文章。尽管仍使用同一侧边栏,但可设定为仅展示个别领域,适应文章数量众多的场景。")])],-1),Y={class:"task-list-item"},$=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-1",checked:"checked",disabled:"disabled"},null,-1),ee={class:"task-list-item-label",for:"task-item-1"},se={href:"https://vuepress-theme-hope.github.io/v2/components/zh/guide/",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/demo/components/src/.vuepress/config.ts",target:"_blank",rel:"noopener noreferrer"},ne={class:"task-list-item"},te=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-2",checked:"checked",disabled:"disabled"},null,-1),le={class:"task-list-item-label",for:"task-item-2"},ie={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/docsearch.html",target:"_blank",rel:"noopener noreferrer"},oe={class:"task-list-item"},ce=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-3",checked:"checked",disabled:"disabled"},null,-1),pe={class:"task-list-item-label",for:"task-item-3"},re={href:"https://theme-hope.vuejs.press/zh/guide/layout/sidebar.html#%E9%80%9A%E8%BF%87%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90",target:"_blank",rel:"noopener noreferrer"},ue=(0,n.Lk)("li",{class:"task-list-item"},[(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-4",checked:"checked",disabled:"disabled"}),(0,n.Lk)("label",{class:"task-list-item-label",for:"task-item-4"},[(0,n.Lk)("s",null,"去 meta 标签,测试并未成功,不再尝试")])],-1),ke={class:"task-list-item"},de=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-5",checked:"checked",disabled:"disabled"},null,-1),me={class:"task-list-item-label",for:"task-item-5"},be={href:"https://theme-hope.vuejs.press/zh/guide/feature/comment.html#waline",target:"_blank",rel:"noopener noreferrer"},he=(0,n.Fv)('
  • ',9),ve={class:"task-list-item"},fe=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-15",checked:"checked",disabled:"disabled"},null,-1),ge={class:"task-list-item-label",for:"task-item-15"},Le={href:"https://theme-hope.vuejs.press/zh/cookbook/advanced/replace.html#%E6%8F%92%E6%A7%BD%E5%88%A9%E7%94%A8",target:"_blank",rel:"noopener noreferrer"},We={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/packages/theme/src/client/module/navbar/components/NavbarBrand.ts",target:"_blank",rel:"noopener noreferrer"},xe=(0,n.Fv)('
  • ',4),ye={class:"task-list-item"},we=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-20",checked:"checked",disabled:"disabled"},null,-1),qe={class:"task-list-item-label",for:"task-item-20"},Ee={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/docs/theme/src/.vuepress/config.ts",target:"_blank",rel:"noopener noreferrer"},_e={href:"https://vuepress-theme-hope.github.io/v2/seo/zh/guide.html#%E7%9B%B4%E6%8E%A5%E6%B7%BB%E5%8A%A0-head-%E6%A0%87%E7%AD%BE",target:"_blank",rel:"noopener noreferrer"},Pe=(0,n.Fv)('
  • ',6),Fe=(0,n.Lk)("hr",{class:"footnotes-sep"},null,-1),Ve={class:"footnotes"},Be={class:"footnotes-list"},ze={id:"footnote1",class:"footnote-item"},je={href:"https://blog.csdn.net/song854601134/article/details/121340077",target:"_blank",rel:"noopener noreferrer"},Ae=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Me={},De=(0,a(3671).A)(Me,[["render",function(e,s){const a=(0,n.g2)("ExternalLinkIcon"),Me=(0,n.g2)("RouteLink");return(0,n.uX)(),(0,n.CE)("div",null,[(0,n.Lk)("p",null,[(0,n.Lk)("a",t,[(0,n.eW)("VuePress"),(0,n.bF)(a)]),(0,n.eW)(" 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。")]),(0,n.Lk)("p",null,[(0,n.eW)("不过,VuePress 网站需要依赖包环境,生成的静态文件在本地运行会缺少组件,需要服务器或其他云服务上运行。如果本地部署中出现未知 bug,推荐使用 "),(0,n.Lk)("a",l,[(0,n.eW)("StackBlitz"),(0,n.bF)(a)]),(0,n.eW)(" 在线 IDE 工具测试,打开 "),i,(0,n.eW)(" 即可将对应 GitHub 仓库导入 StackBlitz。开发时,建议用 dev 命令测试,这样可以查看打包前的动态代码,发现组件间的内部链接。")]),(0,n.Lk)("p",null,[(0,n.eW)("LearnData 的主题为 "),(0,n.Lk)("a",o,[(0,n.eW)("vuepress-theme-hope"),(0,n.bF)(a)]),(0,n.eW)(",图标为 "),(0,n.Lk)("a",c,[(0,n.eW)("Iconfont 精选图标"),(0,n.bF)(a)]),(0,n.eW)(",页面修改查看 "),(0,n.Lk)("a",p,[(0,n.eW)("样式配置"),(0,n.bF)(a)]),(0,n.eW)(",其他主题和插件参考 "),(0,n.Lk)("a",r,[(0,n.eW)("Awesome VuePress V2"),(0,n.bF)(a)]),(0,n.eW)(" 和 "),(0,n.Lk)("a",u,[(0,n.eW)("看板娘"),(0,n.bF)(a)]),(0,n.eW)("。")]),k,(0,n.Lk)("ol",null,[(0,n.Lk)("li",null,[(0,n.eW)("环境配置:安装 pnpm,也支持 npm 和 yarn,可参考"),(0,n.bF)(Me,{to:"/deploy/VPS.html#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2"},{default:(0,n.k6)((()=>[(0,n.eW)("环境部署教程")])),_:1}),(0,n.eW)("。")]),d,m,(0,n.Lk)("li",null,[b,(0,n.eW)(" 路径下的 config.ts,navbar.ts,sidebar.ts,theme.ts 可以修改页面属性,设置方法参考 "),(0,n.Lk)("a",h,[(0,n.eW)("官方案例"),(0,n.bF)(a)]),(0,n.eW)("。 "),v]),f]),g,(0,n.Lk)("p",null,[(0,n.eW)("本地搜索插件:"),(0,n.Lk)("a",L,[(0,n.eW)("search"),(0,n.bF)(a)]),(0,n.eW)(" 根据你的页面,在本地生成搜索索引,然后在用户访问站点时加载搜索索引文件。默认情况下,该插件会将页面标题和小标题作为搜索索引。")]),(0,n.Lk)("p",null,[(0,n.eW)("在线搜索插件:"),(0,n.Lk)("a",W,[(0,n.eW)("algolia DocSearch"),(0,n.bF)(a)]),(0,n.eW)(" 使用在线爬虫抓取全站,并提供网站搜索索引,抓取周期为一周。开源文档可以申请官方爬虫支持,商业化内容需要自己设置爬虫。")]),(0,n.Lk)("p",null,[(0,n.eW)("在 "),(0,n.Lk)("a",x,[(0,n.eW)("algolia 爬虫管理页"),(0,n.bF)(a)]),(0,n.eW)(" 修改爬虫抓取规则,然后手动触发爬虫进行全站搜索。之后,"),(0,n.Lk)("a",y,[(0,n.eW)("algolia 搜索数据库"),(0,n.bF)(a)]),(0,n.eW)(" 可以查看搜索次数与数据。")]),w,q,E,(0,n.Lk)("p",null,[(0,n.eW)("如果不想每次架构都重命名文件,可以复制「"),(0,n.Lk)("a",_,[(0,n.eW)("nohashname"),(0,n.bF)(a)]),(0,n.eW)("」branch。我把 nohashname 分支的打包工具换成了 "),(0,n.Lk)("a",P,[(0,n.eW)("Webpack"),(0,n.bF)(a)]),(0,n.eW)(",并用 chainWebpack 设置文件命名规则,避免文件非必要重命名。")]),(0,n.Lk)("ol",null,[F,(0,n.Lk)("li",null,[(0,n.Lk)("p",null,[(0,n.eW)("修改文件命名规则:打开 config.ts,使用 "),(0,n.Lk)("a",V,[(0,n.eW)("webpack-chain"),(0,n.bF)(a)]),(0,n.eW)(" 修改 webpack 输出文件名规则,停止对 js 文件 hashname。"),B,(0,n.eW)(),z,(0,n.eW)(" 加路径容易报错,这里只把 chunk 文件放入子文件夹。")]),j,(0,n.Lk)("p",null,[(0,n.eW)("在查找 chainWebpack 配置前,我依照 "),(0,n.Lk)("a",A,[(0,n.eW)("vue.config.js"),(0,n.bF)(a)]),(0,n.eW)(" 的指引添加了 "),M,(0,n.eW)(",但是 VuePress 并未停止 hashname。事实上,我理解错了。根据 @Mister-Hope 的说明,「这里的 filenameHasing 是 vue-cli 自己加的一个属性。拿到这里当例子很奇怪。就好比你按照 iOS 使用手册去设置 Android 结果无效,本不应该有效。另外本身为了防止应用程序出错,你也从不应该移除 hash。」")])])]),D,C,(0,n.Lk)("p",null,[(0,n.eW)("VuePress "),(0,n.Lk)("a",H,[(0,n.eW)("Build 配置项"),(0,n.bF)(a)]),(0,n.eW)("默认开启了 preload 和 prefetch。但是,开启了 prefetch,所有其它页面所需的文件都会被预拉取。页面较多或服务器宽带后付费的话,建议关闭 prefetch。")]),U,S,T,(0,n.Lk)("p",null,[(0,n.eW)("我的主题模板文件是 "),(0,n.Lk)("a",R,[(0,n.eW)("@vuepress-theme-hope/templates/index.build.html"),(0,n.bF)(a)]),(0,n.eW)(",将其下载到本地后,修改为你想要的样式,放入 .vuepress 文件夹内。最后在 config.ts 中添加代码,即可启用修改模板。")]),I,(0,n.Lk)("p",null,[(0,n.Lk)("a",N,[(0,n.eW)("vuepress-plugin-seo2"),(0,n.bF)(a)]),(0,n.eW)(" 在网页中插入 "),O,(0,n.eW)(" 和 "),G,(0,n.eW)(",这两个参数都引用自 "),X,(0,n.eW)("。"),Z,(0,n.eW)(" 中无法设置 ogp。你需要打开 config.ts,使用 vuepress-plugin-seo2 的 ogp 参数重新设置 meta,并删除你不想要的参数。根据 @Mister-Hope 的说明:「API 的设计很容易理解,就是给你个自动生成的对象然后等你返回。所以你只需要在原对象上把属性删掉,返回这个对象就是了。」")]),J,(0,n.Lk)("ul",K,[Q,(0,n.Lk)("li",Y,[$,(0,n.Lk)("label",ee,[(0,n.Lk)("s",null,[(0,n.eW)("插入 Bilibili 或第三方视频,可使用专用 "),(0,n.Lk)("a",se,[(0,n.eW)("组件库"),(0,n.bF)(a)]),(0,n.eW)(",配置参考 "),(0,n.Lk)("a",ae,[(0,n.eW)("组件案例 config.ts"),(0,n.bF)(a)]),(0,n.eW)(".")])])]),(0,n.Lk)("li",ne,[te,(0,n.Lk)("label",le,[(0,n.Lk)("s",null,[(0,n.eW)("插件"),(0,n.Lk)("a",ie,[(0,n.eW)("docsearch"),(0,n.bF)(a)]),(0,n.eW)(":将 Algolia DocSearch 集成到 VuePress 中,为你的文档网站提供搜索功能。")])])]),(0,n.Lk)("li",oe,[ce,(0,n.Lk)("label",pe,[(0,n.Lk)("s",null,[(0,n.eW)("README 页面如何隐藏,使用 index: false,参考"),(0,n.Lk)("a",re,[(0,n.eW)("主题设置"),(0,n.bF)(a)])])])]),ue,(0,n.Lk)("li",ke,[de,(0,n.Lk)("label",me,[(0,n.Lk)("s",null,[(0,n.Lk)("a",be,[(0,n.eW)("waline"),(0,n.bF)(a)]),(0,n.eW)(" 评论插件,无需账户,更适合大众。")])])]),he,(0,n.Lk)("li",ve,[fe,(0,n.Lk)("label",ge,[(0,n.Lk)("a",Le,[(0,n.eW)("修改导航栏 brand 链接"),(0,n.bF)(a)]),(0,n.eW)(",需用本地文件替代 "),(0,n.Lk)("a",We,[(0,n.eW)("主题默认设置"),(0,n.bF)(a)]),(0,n.eW)("。设置的 ts 未生效,暂时放弃。")])]),xe,(0,n.Lk)("li",ye,[we,(0,n.Lk)("label",qe,[(0,n.Lk)("s",null,[(0,n.eW)("定制页面标签:config.ts 中添加全局 "),(0,n.Lk)("a",Ee,[(0,n.eW)("head 标签"),(0,n.bF)(a)]),(0,n.eW)(",或在页面中添加 "),(0,n.Lk)("a",_e,[(0,n.eW)("独立 head 标签"),(0,n.bF)(a)]),(0,n.eW)(",支持图片统计代码。")])])]),Pe]),Fe,(0,n.Lk)("section",Ve,[(0,n.Lk)("ol",Be,[(0,n.Lk)("li",ze,[(0,n.Lk)("p",null,[(0,n.Lk)("a",je,[(0,n.eW)("chainWebpack 常用配置方式"),(0,n.bF)(a)]),(0,n.eW)(),Ae])])])])])}]]),Ce=JSON.parse('{"path":"/web/VuePress.html","title":"VuePress","lang":"zh-CN","frontmatter":{"article":false,"title":"VuePress","icon":"vue","order":1,"description":"VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。 不过,VuePress 网站需要依赖包环境,生成的静态...","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/VuePress.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"VuePress"}],["meta",{"property":"og:description","content":"VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。 不过,VuePress 网站需要依赖包环境,生成的静态..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"VuePress\\",\\"description\\":\\"VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。 不过,VuePress 网站需要依赖包环境,生成的静态...\\"}"]]},"headers":[{"level":2,"title":"初始配置","slug":"初始配置","link":"#初始配置","children":[]},{"level":2,"title":"搜索插件","slug":"搜索插件","link":"#搜索插件","children":[]},{"level":2,"title":"Webpack 打包","slug":"webpack-打包","link":"#webpack-打包","children":[]},{"level":2,"title":"关闭 prefetch","slug":"关闭-prefetch","link":"#关闭-prefetch","children":[]},{"level":2,"title":"页面模板","slug":"页面模板","link":"#页面模板","children":[]},{"level":2,"title":"时间参数","slug":"时间参数","link":"#时间参数","children":[]},{"level":2,"title":"自定义主题","slug":"自定义主题","link":"#自定义主题","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":59}]},"readingTime":{"minutes":10.03,"words":3009},"filePathRelative":"web/VuePress.md","localizedDate":"2022年7月22日","excerpt":"

    VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。

    \\n

    不过,VuePress 网站需要依赖包环境,生成的静态文件在本地运行会缺少组件,需要服务器或其他云服务上运行。如果本地部署中出现未知 bug,推荐使用 StackBlitz 在线 IDE 工具测试,打开 https://stackblitz.com/github/用户名/仓库名 即可将对应 GitHub 仓库导入 StackBlitz。开发时,建议用 dev 命令测试,这样可以查看打包前的动态代码,发现组件间的内部链接。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b7912e7c.d7342706.js b/assets/js/alist.html.f7028c2e.js similarity index 94% rename from assets/js/v-b7912e7c.d7342706.js rename to assets/js/alist.html.f7028c2e.js index a99c34654..3ec525ffd 100644 --- a/assets/js/v-b7912e7c.d7342706.js +++ b/assets/js/alist.html.f7028c2e.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2212],{9720:(n,a)=>{a.c=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},6692:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>p,data:()=>o});var e=s(3968);const t={href:"https://alist.nn.ci/zh/guide/install/docker.html",target:"_blank",rel:"noopener noreferrer"},l=(0,e.IL)('

    原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。

    version: "3.3"\nservices:\n  alist:\n    image: xhofe/alist:latest\n    container_name: alist\n    volumes:\n      - /volume1/docker/alist/data:/opt/alist/data\n    ports:\n      - 9044:5244\n    environment:\n      - PUID=1026\n      - PGID=100\n      - UMASK=022\n      - TZ=Asia/Shanghai\n    restart: always\n

    重置密码

    Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。

    # 随机生成一个密码\nsudo docker exec -it alist ./alist admin random\n# 手动设置一个密码,`NEW_PASSWORD`是指你需要设置的密码\nsudo docker exec -it alist ./alist admin set NEW_PASSWORD\n

    添加存储

    登录后,点击左侧菜单的「存储」,添加网盘。下方提供了添加驱动所需的几个必备参数说明。

    • 「驱动」表示网盘的挂载方式,例如选择阿里云盘时,请选择「阿里云盘 Open」。
    • 「挂载路径」相当于文件夹名称,你可以自由设置。我分享的是应用,所以挂载路径是 /apps
    • 「缓存过期时间」是存储的有效时间,默认为 30 分钟。如果你希望存储长期有效,可以将其修改为 0。
    • 「根文件夹 ID」指的是在分享网盘中特定文件夹的标识。若要分享整个网盘,请使用 root。
    • 「刷新令牌」是网盘的登录密钥,请按照 Alist 说明文档进行添加。

    元信息

    元信息可以为指定文件夹添加密码,防止网盘恶意访问/分享致帐号被冻结。元信息内的配置仅对访客生效。

    • 密码:访问此路径需要密码。
    • 写入:允许访客新建目录、新文件和上传文件。
    • 隐藏:此路径要隐藏的对象,每行一个正则表达式。
    • 说明:进入该路径时渲染的自述文件,支持 Markdown 内容或 Markdown 链接。
    ',11),i={},p=(0,s(9720).c)(i,[["render",function(n,a){const s=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.QD)("a",t,[(0,e.mY)("Alist"),(0,e.K2)(s)]),(0,e.mY)(" 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。")]),l])}]]),o=JSON.parse('{"path":"/services/dockers-on-nas/alist.html","title":"Alist:聚合网盘","lang":"zh-CN","frontmatter":{"article":false,"title":"Alist:聚合网盘","order":23,"description":"Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。 原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。 重置密码 Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/alist.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Alist:聚合网盘"}],["meta",{"property":"og:description","content":"Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。 原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。 重置密码 Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Alist:聚合网盘\\",\\"description\\":\\"Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。 原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。 重置密码 Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。...\\"}"]]},"headers":[{"level":2,"title":"重置密码","slug":"重置密码","link":"#重置密码","children":[]},{"level":2,"title":"添加存储","slug":"添加存储","link":"#添加存储","children":[]},{"level":2,"title":"元信息","slug":"元信息","link":"#元信息","children":[]}],"git":{"createdTime":1701223097000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.76,"words":528},"filePathRelative":"services/dockers-on-nas/alist.md","localizedDate":"2023年11月29日","excerpt":"

    Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。

    \\n

    原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。

    \\n
    version: \\"3.3\\"\\nservices:\\n  alist:\\n    image: xhofe/alist:latest\\n    container_name: alist\\n    volumes:\\n      - /volume1/docker/alist/data:/opt/alist/data\\n    ports:\\n      - 9044:5244\\n    environment:\\n      - PUID=1026\\n      - PGID=100\\n      - UMASK=022\\n      - TZ=Asia/Shanghai\\n    restart: always\\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9785],{3671:(n,a)=>{a.A=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},9121:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>p,data:()=>o});var e=s(7847);const t={href:"https://alist.nn.ci/zh/guide/install/docker.html",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Fv)('

    原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。

    version: "3.3"\nservices:\n  alist:\n    image: xhofe/alist:latest\n    container_name: alist\n    volumes:\n      - /volume1/docker/alist/data:/opt/alist/data\n    ports:\n      - 9044:5244\n    environment:\n      - PUID=1026\n      - PGID=100\n      - UMASK=022\n      - TZ=Asia/Shanghai\n    restart: always\n

    重置密码

    Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。

    # 随机生成一个密码\nsudo docker exec -it alist ./alist admin random\n# 手动设置一个密码,`NEW_PASSWORD`是指你需要设置的密码\nsudo docker exec -it alist ./alist admin set NEW_PASSWORD\n

    添加存储

    登录后,点击左侧菜单的「存储」,添加网盘。下方提供了添加驱动所需的几个必备参数说明。

    • 「驱动」表示网盘的挂载方式,例如选择阿里云盘时,请选择「阿里云盘 Open」。
    • 「挂载路径」相当于文件夹名称,你可以自由设置。我分享的是应用,所以挂载路径是 /apps
    • 「缓存过期时间」是存储的有效时间,默认为 30 分钟。如果你希望存储长期有效,可以将其修改为 0。
    • 「根文件夹 ID」指的是在分享网盘中特定文件夹的标识。若要分享整个网盘,请使用 root。
    • 「刷新令牌」是网盘的登录密钥,请按照 Alist 说明文档进行添加。

    元信息

    元信息可以为指定文件夹添加密码,防止网盘恶意访问/分享致帐号被冻结。元信息内的配置仅对访客生效。

    • 密码:访问此路径需要密码。
    • 写入:允许访客新建目录、新文件和上传文件。
    • 隐藏:此路径要隐藏的对象,每行一个正则表达式。
    • 说明:进入该路径时渲染的自述文件,支持 Markdown 内容或 Markdown 链接。
    ',11),i={},p=(0,s(3671).A)(i,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",t,[(0,e.eW)("Alist"),(0,e.bF)(s)]),(0,e.eW)(" 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。")]),l])}]]),o=JSON.parse('{"path":"/services/dockers-on-nas/alist.html","title":"Alist:聚合网盘","lang":"zh-CN","frontmatter":{"article":false,"title":"Alist:聚合网盘","order":23,"description":"Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。 原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。 重置密码 Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/alist.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Alist:聚合网盘"}],["meta",{"property":"og:description","content":"Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。 原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。 重置密码 Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Alist:聚合网盘\\",\\"description\\":\\"Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。 原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。 重置密码 Alist 在启动时会随机生成密码。如果没有在后端看到密码,可以使用以下命令重新生成密码。...\\"}"]]},"headers":[{"level":2,"title":"重置密码","slug":"重置密码","link":"#重置密码","children":[]},{"level":2,"title":"添加存储","slug":"添加存储","link":"#添加存储","children":[]},{"level":2,"title":"元信息","slug":"元信息","link":"#元信息","children":[]}],"git":{"createdTime":1701223097000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.76,"words":528},"filePathRelative":"services/dockers-on-nas/alist.md","localizedDate":"2023年11月29日","excerpt":"

    Alist 是支持多种存储的文件列表程序,支持本地存储、阿里云盘、OneDrive、Google Drive 等。

    \\n

    原本我的文件保存在蓝奏云上,但免费用户有 100M 的限制,因此我将一些要分享的大文件放在 Alist,作为私人轻量网盘分享应用和文件。

    \\n
    version: \\"3.3\\"\\nservices:\\n  alist:\\n    image: xhofe/alist:latest\\n    container_name: alist\\n    volumes:\\n      - /volume1/docker/alist/data:/opt/alist/data\\n    ports:\\n      - 9044:5244\\n    environment:\\n      - PUID=1026\\n      - PGID=100\\n      - UMASK=022\\n      - TZ=Asia/Shanghai\\n    restart: always\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/app.0bdd4dd7.js b/assets/js/app.0bdd4dd7.js deleted file mode 100644 index 67dec4676..000000000 --- a/assets/js/app.0bdd4dd7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3524],{3472:(t,e,n)=>{n.d(e,{q:()=>o});const o={category:{"/":{path:"/category/",map:{工具:{path:"/category/工具/",indexes:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]},自动化:{path:"/category/自动化/",indexes:[25,26,27,28,29,30,31,32,33]},系统:{path:"/category/系统/",indexes:[34,35,36,37,38,39,40,41]},网络:{path:"/category/网络/",indexes:[42,43,44,45,46,47,48]},服务器:{path:"/category/服务器/",indexes:[49,50]},健康:{path:"/category/健康/",indexes:[51,52]},博客:{path:"/category/博客/",indexes:[53,54,55,56,57,58,59]},购物:{path:"/category/购物/",indexes:[60,61,62,63]},头脑驿站:{path:"/category/头脑驿站/",indexes:[64,54,65,66]},观察随笔:{path:"/category/观察随笔/",indexes:[67,68]}}}},tag:{"/":{path:"/tag/",map:{微信:{path:"/tag/微信/",indexes:[24]},rss:{path:"/tag/rss/",indexes:[26,27,28,29,31,32,33]},Feed43:{path:"/tag/feed43/",indexes:[33]},FeedEx:{path:"/tag/feedex/",indexes:[33]},office:{path:"/tag/office/",indexes:[41]},OneNote:{path:"/tag/onenote/",indexes:[40]},关机:{path:"/tag/关机/",indexes:[39]},smb:{path:"/tag/smb/",indexes:[38]},光猫:{path:"/tag/光猫/",indexes:[46,47,48]},CDN:{path:"/tag/cdn/",indexes:[50]},建站:{path:"/tag/建站/",indexes:[54,58,59,49,50]},Huginn:{path:"/tag/huginn/",indexes:[31,32]},减肥:{path:"/tag/减肥/",indexes:[51,52]},宝塔面板:{path:"/tag/宝塔面板/",indexes:[49]},Jekyll:{path:"/tag/jekyll/",indexes:[56,57,58,59]},Github:{path:"/tag/github/",indexes:[59]},"Travis CI":{path:"/tag/travis-ci/",indexes:[57]},Docker:{path:"/tag/docker/",indexes:[16,57]},Audition:{path:"/tag/audition/",indexes:[23]},音频:{path:"/tag/音频/",indexes:[23]},Aria2:{path:"/tag/aria2/",indexes:[22]},迅雷:{path:"/tag/迅雷/",indexes:[22]},Airtable:{path:"/tag/airtable/",indexes:[21]},GP1700:{path:"/tag/gp1700/",indexes:[46]},koolproxy:{path:"/tag/koolproxy/",indexes:[45]},IPTV:{path:"/tag/iptv/",indexes:[44]},语音输入:{path:"/tag/语音输入/",indexes:[30]},OpenVPN:{path:"/tag/openvpn/",indexes:[43]},内网穿透:{path:"/tag/内网穿透/",indexes:[43]},RSSHub:{path:"/tag/rsshub/",indexes:[28,29]},scrcpy:{path:"/tag/scrcpy/",indexes:[20]},投屏:{path:"/tag/投屏/",indexes:[20]},化妆品:{path:"/tag/化妆品/",indexes:[63]},WIFI:{path:"/tag/wifi/",indexes:[42]},主板:{path:"/tag/主板/",indexes:[37]},蓝屏:{path:"/tag/蓝屏/",indexes:[36]},断舍离:{path:"/tag/断舍离/",indexes:[62]},健身器材:{path:"/tag/健身器材/",indexes:[60,62]},小狼毫:{path:"/tag/小狼毫/",indexes:[19]},输入法:{path:"/tag/输入法/",indexes:[19]},KeePass:{path:"/tag/keepass/",indexes:[18]},WordPress:{path:"/tag/wordpress/",indexes:[55,56]},原则:{path:"/tag/原则/",indexes:[66]},批评与自我批评:{path:"/tag/批评与自我批评/",indexes:[66]},nas:{path:"/tag/nas/",indexes:[27]},微信红包:{path:"/tag/微信红包/",indexes:[17]},"Microsoft store":{path:"/tag/microsoft-store/",indexes:[35]},联想:{path:"/tag/联想/",indexes:[61]},winget:{path:"/tag/winget/",indexes:[34]},winstall:{path:"/tag/winstall/",indexes:[34]},幸存者偏差:{path:"/tag/幸存者偏差/",indexes:[68]},疫情:{path:"/tag/疫情/",indexes:[68]},浏览器插件:{path:"/tag/浏览器插件/",indexes:[25]},"UI.Vision":{path:"/tag/ui.vision/",indexes:[25]},RPA:{path:"/tag/rpa/",indexes:[25]},录屏:{path:"/tag/录屏/",indexes:[15,65]},自我管理:{path:"/tag/自我管理/",indexes:[65]},blog:{path:"/tag/blog/",indexes:[55]},github:{path:"/tag/github/",indexes:[55]},VuePress:{path:"/tag/vuepress/",indexes:[54]},AI:{path:"/tag/ai/",indexes:[3,5,14,16]},"Stable Diffusion":{path:"/tag/stable-diffusion/",indexes:[16]},媒体:{path:"/tag/媒体/",indexes:[67]},Whisper:{path:"/tag/whisper/",indexes:[14]},字幕:{path:"/tag/字幕/",indexes:[14]},白板:{path:"/tag/白板/",indexes:[6]},GTD:{path:"/tag/gtd/",indexes:[6]},ChatGPT:{path:"/tag/chatgpt/",indexes:[5]},时间:{path:"/tag/时间/",indexes:[64]},工作流:{path:"/tag/工作流/",indexes:[64]},虚拟定位:{path:"/tag/虚拟定位/",indexes:[4]},VITS:{path:"/tag/vits/",indexes:[3]},声音克隆:{path:"/tag/声音克隆/",indexes:[3]},games:{path:"/tag/games/",indexes:[2]},直播:{path:"/tag/直播/",indexes:[7,8,9,10,11,12,13]},OBS:{path:"/tag/obs/",indexes:[8,9,10]}}}}}},428:(t,e,n)=>{n.d(e,{i:()=>o});const o=["/apps/devdocs/json-translate.html","/apps/tutorials/feishu.html","/posts/2023-10-29-switch-firmware-updates.html","/posts/2023-10-07-clone-voice.html","/posts/2023-09-05-virtual_positioning.html","/posts/2023-02-27-chatgpt_shortcuts.html","/posts/2023-01-26-whiteboard_gtd.html","/apps/livestreaming/0_live_equipments.html","/apps/livestreaming/1_obs_basic.html","/apps/livestreaming/2_obs_streamfx.html","/apps/livestreaming/3_obs_plugins.html","/apps/livestreaming/4_live_effects.html","/apps/livestreaming/5_live_platforms.html","/apps/livestreaming/6_live_positioning.html","/posts/2022-11-18-whisper_ai_subtitles.html","/posts/2022-11-03-ffmpeg_screen_recording.html","/posts/2022-09-05-stable_diffusion_ai_painting.html","/posts/2022-01-23-wechat_lucky_money_cover.html","/posts/2021-01-02-keepass_the_real_lastpassword.html","/posts/2020-11-27-rime_input.html","/posts/2019-08-26-scrcpy_screen_projection.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/2017-04-18-wechat_multi_open.html","/posts/2022-04-21-uivision_rpa.html","/posts/2022-03-17-rss_persistent_link_collection.html","/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/posts/2020-03-25-rsshub_on_vps.html","/posts/2019-04-01-rsshub_noob.html","/posts/2018-12-28-voice_input_try.html","/posts/2018-10-07-huginn_scraping_any_website.html","/posts/2018-01-31-hire_a_robot.html","/posts/2017-04-22-rss_feed43_feedex.html","/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/posts/2022-02-19-microsoft_store_fixed.html","/posts/2020-10-25-dpc_watchdog_violation.html","/posts/2020-09-22-uefi_asus_board.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/2020-09-13-wifi_speed_up.html","/posts/2019-03-31-openvpn_back_to_home.html","/posts/2018-06-19-iptv_direckly.html","/posts/2018-06-10-koolproxy_https.html","/posts/2018-06-08-baizhuo_gp1700.html","/posts/2017-10-18-light_cat_port_forwarding.html","/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/posts/2018-04-30-baota_deploy_vps.html","/posts/2018-01-19-forget_the_cdn.html","/posts/2020-12-17-weight_log.html","/posts/2018-03-06-no_more_dinner.html","/posts/2024-01-28-learndata-advanced.html","/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/posts/2022-06-07-blog_md_to_wordpress.html","/posts/2021-01-27-blog_jekyll_to_wordpress.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/2022-08-10-new_stuff_shaping_machine.html","/posts/2022-03-09-lenovo_black_card_member.html","/posts/2020-11-01-gym_equipment_throw_away.html","/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","/posts/2023-03-31-efficient_morning_5am_club.html","/posts/2022-05-22-surveillance_video_for_myself.html","/posts/2021-05-31-principles_criticism_and_self-criticism.html","/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html"]},3016:(t,e,n)=>{n.d(e,{o:()=>o});const o={article:{"/":{path:"/article/",indexes:[53,0,1,2,3,4,64,5,6,7,8,9,10,11,12,13,14,15,67,16,54,60,55,65,25,68,34,26,61,35,17,27,66,56,18,51,19,62,36,37,42,28,63,20,29,43,30,31,44,45,46,21,22,23,57,58,59,49,52,32,50,47,48,38,39,40,41,33,24]}},star:{"/":{path:"/star/",indexes:[36,20,22]}},timeline:{"/":{path:"/timeline/",indexes:[53,0,1,2,3,4,64,5,6,7,8,9,10,11,12,13,14,15,67,16,54,60,55,65,25,68,34,26,61,35,17,27,66,56,18,51,19,62,36,37,42,28,63,20,29,43,30,31,44,45,46,21,22,23,57,58,59,49,52,32,50,47,48,38,39,40,41,33,24]}}}},3132:(t,e,n)=>{n.d(e,{o:()=>B});var o=n(1108),s=n(4976),i=n(1804),a=n(420),l=n(2088),p=n(7092),r=n(6528);const d=(0,o.Qt)({enhance:({app:t})=>{(0,s.SU)("FontIcon")||t.component("FontIcon",a.c),(0,s.SU)("Badge")||t.component("Badge",l.c),(0,s.SU)("BiliBili")||t.component("BiliBili",p.c),(0,s.SU)("VidStack")||t.component("VidStack",r.c)},setup:()=>{(0,i.eSL)(' @import url("https://at.alicdn.com/t/c/font_2410206_5vb9zlyghj.css");\n ')},rootComponents:[]});var h=n(2152),m=n(5272),g=n(5550),c=n(8784),_=n(6024),b=n(9120),u=n(8592),f=n(9168),y=n(1676);const w=(0,o.Qt)({enhance:({app:t})=>{},setup:()=>{(0,y.U)()}});var v=n(7992),k=n(5648),x=n(9108),S=n(920),O=n(3968),E=n(9176);(0,S.IX)((t=>{const e=t.t,n=!1!==t.I,o=t.i;return n?{title:e,content:o?()=>[(0,O.h)(x.oB,{icon:o}),e]:null,order:t.O,index:t.I}:null}));const A=(0,o.Qt)({enhance:({app:t,router:e})=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=async(...t)=>(await(0,x.Fb)().wait(),n(...t)),(0,x.yW)(t),t.component("HopeIcon",x.oB),t.component("BloggerInfo",E.ob)},setup:()=>{(0,x.m)(),(0,x.KY)(),(0,E.iG)()},layouts:{Layout:x._W,NotFound:x.EX,BlogCategory:E.s$,BlogHome:E.ox,BlogType:E.gT,Timeline:E.wh}});var I=n(2208);const z=(0,O._M)({name:"SocialLink",setup:()=>()=>(0,O.h)("div",{class:"nav-item vp-repo"},(0,O.h)("a",{class:"vp-repo-link",href:"https://discord.gg/PZTQfJ4GjX",target:"_blank",rel:"noopener noreferrer","aria-label":"discord",innerHTML:''}))}),P=(0,o.Qt)({enhance:({app:t})=>{t.component("SocialLink",z)}}),B=[{},d,h.c,m.c,g.c,c.c,_.c,b.c,u.c,f.c,w,v.c,k.c,A,I.c,P]},6148:(t,e,n)=>{n.d(e,{o:()=>o,q:()=>s});const o=JSON.parse('{"/_posts/2017-04-18-wechat_multi_open.html":"/posts/2017-04-18-wechat_multi_open.html","/_posts/2017-04-18-wechat_multi_open.md":"/posts/2017-04-18-wechat_multi_open.html","/_posts/2017-04-22-rss_feed43_feedex.html":"/posts/2017-04-22-rss_feed43_feedex.html","/_posts/2017-04-22-rss_feed43_feedex.md":"/posts/2017-04-22-rss_feed43_feedex.html","/_posts/2017-07-28-office_2016_installer_error.html":"/posts/2017-07-28-office_2016_installer_error.html","/_posts/2017-07-28-office_2016_installer_error.md":"/posts/2017-07-28-office_2016_installer_error.html","/_posts/2017-07-29-onenote_2016_cannot_be_logged_in.html":"/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","/_posts/2017-07-29-onenote_2016_cannot_be_logged_in.md":"/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","/_posts/2017-09-02-forced_shutdown.html":"/posts/2017-09-02-forced_shutdown.html","/_posts/2017-09-02-forced_shutdown.md":"/posts/2017-09-02-forced_shutdown.html","/_posts/2017-09-03-smb_lan_sharing.html":"/posts/2017-09-03-smb_lan_sharing.html","/_posts/2017-09-03-smb_lan_sharing.md":"/posts/2017-09-03-smb_lan_sharing.html","/_posts/2017-10-18-light_cat_e8-c-epon_admin.html":"/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/_posts/2017-10-18-light_cat_e8-c-epon_admin.md":"/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/_posts/2017-10-18-light_cat_port_forwarding.html":"/posts/2017-10-18-light_cat_port_forwarding.html","/_posts/2017-10-18-light_cat_port_forwarding.md":"/posts/2017-10-18-light_cat_port_forwarding.html","/_posts/2018-01-19-forget_the_cdn.html":"/posts/2018-01-19-forget_the_cdn.html","/_posts/2018-01-19-forget_the_cdn.md":"/posts/2018-01-19-forget_the_cdn.html","/_posts/2018-01-31-hire_a_robot.html":"/posts/2018-01-31-hire_a_robot.html","/_posts/2018-01-31-hire_a_robot.md":"/posts/2018-01-31-hire_a_robot.html","/_posts/2018-03-06-no_more_dinner.html":"/posts/2018-03-06-no_more_dinner.html","/_posts/2018-03-06-no_more_dinner.md":"/posts/2018-03-06-no_more_dinner.html","/_posts/2018-04-30-baota_deploy_vps.html":"/posts/2018-04-30-baota_deploy_vps.html","/_posts/2018-04-30-baota_deploy_vps.md":"/posts/2018-04-30-baota_deploy_vps.html","/_posts/2018-05-01-jekyll_blog_on_github_pages.html":"/posts/2018-05-01-jekyll_blog_on_github_pages.html","/_posts/2018-05-01-jekyll_blog_on_github_pages.md":"/posts/2018-05-01-jekyll_blog_on_github_pages.html","/_posts/2018-05-02-jekyll_blog_on_vps.html":"/posts/2018-05-02-jekyll_blog_on_vps.html","/_posts/2018-05-02-jekyll_blog_on_vps.md":"/posts/2018-05-02-jekyll_blog_on_vps.html","/_posts/2018-05-03-jekyll_blog_autodeploy.html":"/posts/2018-05-03-jekyll_blog_autodeploy.html","/_posts/2018-05-03-jekyll_blog_autodeploy.md":"/posts/2018-05-03-jekyll_blog_autodeploy.html","/_posts/2018-05-04-audition_cut_mp3.html":"/posts/2018-05-04-audition_cut_mp3.html","/_posts/2018-05-04-audition_cut_mp3.md":"/posts/2018-05-04-audition_cut_mp3.html","/_posts/2018-05-15-aria2_a_new_download_tool.html":"/posts/2018-05-15-aria2_a_new_download_tool.html","/_posts/2018-05-15-aria2_a_new_download_tool.md":"/posts/2018-05-15-aria2_a_new_download_tool.html","/_posts/2018-05-24-airtable_noob.html":"/posts/2018-05-24-airtable_noob.html","/_posts/2018-05-24-airtable_noob.md":"/posts/2018-05-24-airtable_noob.html","/_posts/2018-06-08-baizhuo_gp1700.html":"/posts/2018-06-08-baizhuo_gp1700.html","/_posts/2018-06-08-baizhuo_gp1700.md":"/posts/2018-06-08-baizhuo_gp1700.html","/_posts/2018-06-10-koolproxy_https.html":"/posts/2018-06-10-koolproxy_https.html","/_posts/2018-06-10-koolproxy_https.md":"/posts/2018-06-10-koolproxy_https.html","/_posts/2018-06-19-iptv_direckly.html":"/posts/2018-06-19-iptv_direckly.html","/_posts/2018-06-19-iptv_direckly.md":"/posts/2018-06-19-iptv_direckly.html","/_posts/2018-10-07-huginn_scraping_any_website.html":"/posts/2018-10-07-huginn_scraping_any_website.html","/_posts/2018-10-07-huginn_scraping_any_website.md":"/posts/2018-10-07-huginn_scraping_any_website.html","/_posts/2018-12-28-voice_input_try.html":"/posts/2018-12-28-voice_input_try.html","/_posts/2018-12-28-voice_input_try.md":"/posts/2018-12-28-voice_input_try.html","/_posts/2019-03-31-openvpn_back_to_home.html":"/posts/2019-03-31-openvpn_back_to_home.html","/_posts/2019-03-31-openvpn_back_to_home.md":"/posts/2019-03-31-openvpn_back_to_home.html","/_posts/2019-04-01-rsshub_noob.html":"/posts/2019-04-01-rsshub_noob.html","/_posts/2019-04-01-rsshub_noob.md":"/posts/2019-04-01-rsshub_noob.html","/_posts/2019-08-26-scrcpy_screen_projection.html":"/posts/2019-08-26-scrcpy_screen_projection.html","/_posts/2019-08-26-scrcpy_screen_projection.md":"/posts/2019-08-26-scrcpy_screen_projection.html","/_posts/2019-10-04-fake_aka_hospital_skin_care_products.html":"/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","/_posts/2019-10-04-fake_aka_hospital_skin_care_products.md":"/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","/_posts/2020-03-25-rsshub_on_vps.html":"/posts/2020-03-25-rsshub_on_vps.html","/_posts/2020-03-25-rsshub_on_vps.md":"/posts/2020-03-25-rsshub_on_vps.html","/_posts/2020-09-13-wifi_speed_up.html":"/posts/2020-09-13-wifi_speed_up.html","/_posts/2020-09-13-wifi_speed_up.md":"/posts/2020-09-13-wifi_speed_up.html","/_posts/2020-09-22-uefi_asus_board.html":"/posts/2020-09-22-uefi_asus_board.html","/_posts/2020-09-22-uefi_asus_board.md":"/posts/2020-09-22-uefi_asus_board.html","/_posts/2020-10-25-dpc_watchdog_violation.html":"/posts/2020-10-25-dpc_watchdog_violation.html","/_posts/2020-10-25-dpc_watchdog_violation.md":"/posts/2020-10-25-dpc_watchdog_violation.html","/_posts/2020-11-01-gym_equipment_throw_away.html":"/posts/2020-11-01-gym_equipment_throw_away.html","/_posts/2020-11-01-gym_equipment_throw_away.md":"/posts/2020-11-01-gym_equipment_throw_away.html","/_posts/2020-11-27-rime_input.html":"/posts/2020-11-27-rime_input.html","/_posts/2020-11-27-rime_input.md":"/posts/2020-11-27-rime_input.html","/_posts/2020-12-17-weight_log.html":"/posts/2020-12-17-weight_log.html","/_posts/2020-12-17-weight_log.md":"/posts/2020-12-17-weight_log.html","/_posts/2021-01-02-keepass_the_real_lastpassword.html":"/posts/2021-01-02-keepass_the_real_lastpassword.html","/_posts/2021-01-02-keepass_the_real_lastpassword.md":"/posts/2021-01-02-keepass_the_real_lastpassword.html","/_posts/2021-01-27-blog_jekyll_to_wordpress.html":"/posts/2021-01-27-blog_jekyll_to_wordpress.html","/_posts/2021-01-27-blog_jekyll_to_wordpress.md":"/posts/2021-01-27-blog_jekyll_to_wordpress.html","/_posts/2021-05-31-principles_criticism_and_self-criticism.html":"/posts/2021-05-31-principles_criticism_and_self-criticism.html","/_posts/2021-05-31-principles_criticism_and_self-criticism.md":"/posts/2021-05-31-principles_criticism_and_self-criticism.html","/_posts/2021-10-23-nas_with_rsshub_and_huginn.html":"/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/_posts/2021-10-23-nas_with_rsshub_and_huginn.md":"/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/_posts/2022-01-23-wechat_lucky_money_cover.html":"/posts/2022-01-23-wechat_lucky_money_cover.html","/_posts/2022-01-23-wechat_lucky_money_cover.md":"/posts/2022-01-23-wechat_lucky_money_cover.html","/_posts/2022-02-19-microsoft_store_fixed.html":"/posts/2022-02-19-microsoft_store_fixed.html","/_posts/2022-02-19-microsoft_store_fixed.md":"/posts/2022-02-19-microsoft_store_fixed.html","/_posts/2022-03-09-lenovo_black_card_member.html":"/posts/2022-03-09-lenovo_black_card_member.html","/_posts/2022-03-09-lenovo_black_card_member.md":"/posts/2022-03-09-lenovo_black_card_member.html","/_posts/2022-03-17-rss_persistent_link_collection.html":"/posts/2022-03-17-rss_persistent_link_collection.html","/_posts/2022-03-17-rss_persistent_link_collection.md":"/posts/2022-03-17-rss_persistent_link_collection.html","/_posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html":"/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/_posts/2022-03-21-winget_the_strongest_software_manager_for_windows.md":"/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/_posts/2022-04-20-survivorship_bias_in_shanghai_2022.html":"/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","/_posts/2022-04-20-survivorship_bias_in_shanghai_2022.md":"/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","/_posts/2022-04-21-uivision_rpa.html":"/posts/2022-04-21-uivision_rpa.html","/_posts/2022-04-21-uivision_rpa.md":"/posts/2022-04-21-uivision_rpa.html","/_posts/2022-05-22-surveillance_video_for_myself.html":"/posts/2022-05-22-surveillance_video_for_myself.html","/_posts/2022-05-22-surveillance_video_for_myself.md":"/posts/2022-05-22-surveillance_video_for_myself.html","/_posts/2022-06-07-blog_md_to_wordpress.html":"/posts/2022-06-07-blog_md_to_wordpress.html","/_posts/2022-06-07-blog_md_to_wordpress.md":"/posts/2022-06-07-blog_md_to_wordpress.html","/_posts/2022-08-10-new_stuff_shaping_machine.html":"/posts/2022-08-10-new_stuff_shaping_machine.html","/_posts/2022-08-10-new_stuff_shaping_machine.md":"/posts/2022-08-10-new_stuff_shaping_machine.html","/_posts/2022-08-22-learndata_blog_to_knowledge_management.html":"/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/_posts/2022-08-22-learndata_blog_to_knowledge_management.md":"/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/_posts/2022-09-05-stable_diffusion_ai_painting.html":"/posts/2022-09-05-stable_diffusion_ai_painting.html","/_posts/2022-09-05-stable_diffusion_ai_painting.md":"/posts/2022-09-05-stable_diffusion_ai_painting.html","/_posts/2022-09-07-extreme_branding_thinking_with_mate50.html":"/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/_posts/2022-09-07-extreme_branding_thinking_with_mate50.md":"/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/_posts/2022-11-03-ffmpeg_screen_recording.html":"/posts/2022-11-03-ffmpeg_screen_recording.html","/_posts/2022-11-03-ffmpeg_screen_recording.md":"/posts/2022-11-03-ffmpeg_screen_recording.html","/_posts/2022-11-18-whisper_ai_subtitles.html":"/posts/2022-11-18-whisper_ai_subtitles.html","/_posts/2022-11-18-whisper_ai_subtitles.md":"/posts/2022-11-18-whisper_ai_subtitles.html","/_posts/2023-01-26-whiteboard_gtd.html":"/posts/2023-01-26-whiteboard_gtd.html","/_posts/2023-01-26-whiteboard_gtd.md":"/posts/2023-01-26-whiteboard_gtd.html","/_posts/2023-02-27-chatgpt_shortcuts.html":"/posts/2023-02-27-chatgpt_shortcuts.html","/_posts/2023-02-27-chatgpt_shortcuts.md":"/posts/2023-02-27-chatgpt_shortcuts.html","/_posts/2023-03-31-efficient_morning_5am_club.html":"/posts/2023-03-31-efficient_morning_5am_club.html","/_posts/2023-03-31-efficient_morning_5am_club.md":"/posts/2023-03-31-efficient_morning_5am_club.html","/_posts/2023-09-05-virtual_positioning.html":"/posts/2023-09-05-virtual_positioning.html","/_posts/2023-09-05-virtual_positioning.md":"/posts/2023-09-05-virtual_positioning.html","/_posts/2023-10-07-clone-voice.html":"/posts/2023-10-07-clone-voice.html","/_posts/2023-10-07-clone-voice.md":"/posts/2023-10-07-clone-voice.html","/_posts/2023-10-29-switch-firmware-updates.html":"/posts/2023-10-29-switch-firmware-updates.html","/_posts/2023-10-29-switch-firmware-updates.md":"/posts/2023-10-29-switch-firmware-updates.html","/_posts/2024-01-28-learndata-advanced.html":"/posts/2024-01-28-learndata-advanced.html","/_posts/2024-01-28-learndata-advanced.md":"/posts/2024-01-28-learndata-advanced.html"}'),s=Object.fromEntries([["/DailyRoutine.html",{loader:()=>n.e(7952).then(n.bind(n,9708)),meta:{y:"p",t:"每日仪式",i:"check"}}],["/Fitness.html",{loader:()=>n.e(1272).then(n.bind(n,9392)),meta:{y:"p",t:"健身计划",i:"strong"}}],["/",{loader:()=>n.e(8914).then(n.bind(n,3416)),meta:{y:"p",t:"LearnData 开源笔记",i:"note"}}],["/blog.html",{loader:()=>n.e(5900).then(n.bind(n,8328)),meta:{y:"h",t:"互联网小白",i:"home"}}],["/intro.html",{loader:()=>n.e(2120).then(n.bind(n,6204)),meta:{y:"p",t:"个人介绍",i:"any"}}],["/posts/2017-04-18-wechat_multi_open.html",{loader:()=>n.e(7240).then(n.bind(n,4732)),meta:{d:14924736e5,l:"2017年4月18日",c:["工具"],g:["微信"],e:"

    由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。

    \n

    要在不使用第三方软件的情况下实现微信的多开,现在只能依赖微信自身的一个小漏洞。通过快速双击微信图标,可以实现多开。

    \n

    双击多开

    \n

    要开启多个微信,只需按住回车键,同时左键点击微信图标,点击次数决定了开启的微信数量。这个小技巧是@刘舒怡分享的:

    ",r:{minutes:2.59,words:778},y:"a",t:"跳过第三方软件,一步到位实现微信双开的秘密",O:-1}}],["/posts/2017-04-22-rss_feed43_feedex.html",{loader:()=>n.e(7924).then(n.bind(n,9240)),meta:{d:149286564e4,l:"2017年4月22日",c:["自动化"],g:["rss","Feed43","FeedEx"],e:'

    迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。

    \n

    ► 开始烧制属于自己的 feed

    \n

    1. 进入网页

    \n

    FEED43 不需要注册,点击「Create your own feed」即可使用。

    \n
    ',r:{minutes:2.75,words:825},y:"a",t:"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源",O:-2}}],["/posts/2017-07-28-office_2016_installer_error.html",{loader:()=>n.e(244).then(n.bind(n,4008)),meta:{d:150123972e4,l:"2017年7月28日",c:["系统"],g:["office"],e:'

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

    \n
    \n

    解决方法

    \n
      \n
    1. \n

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

      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

      在 C 盘建立安装组件:

      \n
        \n
      • 把安装包路径 \\groove.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • \n
      • 把安装包路径 \\proplus.ww\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0011-0000-1000-0000000FF1CE}-C
      • \n
      \n
    6. \n
    7. \n

      将需要的程序文件放入 MSOCache 路径\nMSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。\n如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      \n
        \n
      • Onenote 把安装包路径 \\onenote.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • \n
      • Access 把安装包路径 \\access.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0015-0804-1000-0000000FF1CE}-C
      • \n
      \n
    8. \n
    9. \n

      最后进入安装包运行 setup.exe 安装正常。

      \n
    10. \n
    ',r:{minutes:1.59,words:477},y:"a",t:"office 2016 安装程序报错解决办法",O:-3}}],["/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html",{loader:()=>n.e(4248).then(n.bind(n,1126)),meta:{d:150134154e4,l:"2017年7月29日",c:["系统"],g:["OneNote"],e:'

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    \n
    \n

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    \n
    ',r:{minutes:.51,words:153},y:"a",t:"OneNote 2016 无法登陆问题解决",O:-4}}],["/posts/2017-09-02-forced_shutdown.html",{loader:()=>n.e(1280).then(n.bind(n,8416)),meta:{d:150431268e4,l:"2017年9月2日",c:["系统"],g:["关机"],e:'

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

    \n

    手工操作

    \n
      \n
    1. \n

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

      \n
    2. \n
    3. \n

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

      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
    8. \n
    ',r:{minutes:2.65,words:794},y:"a",t:"电脑关机了,第二天一看确又开着的?让系统正常关机!",O:-5}}],["/posts/2017-09-03-smb_lan_sharing.html",{loader:()=>n.e(1760).then(n.bind(n,6404)),meta:{d:150447222e4,l:"2017年9月3日",c:["系统"],g:["smb"],e:'

    Windows 系统开启 SMB 协议:

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    ',r:{minutes:.89,words:268},y:"a",t:"加速 SMB 协议,让 PC 变身小型 NAS",O:-6}}],["/posts/2017-10-18-light_cat_e8-c-epon_admin.html",{loader:()=>n.e(2860).then(n.bind(n,7744)),meta:{d:150835128e4,l:"2017年10月18日",c:["网络"],g:["光猫"],e:'

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

    \n

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

    \n

    破解测试环境

    \n

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

    \n

    光猫超级密码破解

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    ',r:{minutes:1.09,words:326},y:"a",t:"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)",O:-7}}],["/posts/2017-10-18-light_cat_port_forwarding.html",{loader:()=>n.e(5102).then(n.bind(n,744)),meta:{d:1508364e6,l:"2017年10月18日",c:["网络"],g:["光猫"],e:'

    光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)

    \n

    光猫端口映射步骤:

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

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

      \n
      \n
      \n
    6. \n
    ',r:{minutes:.69,words:206},y:"a",t:"光猫改造 篇二:光猫 + 路由器,实现端口映射",O:-8}}],["/posts/2018-01-19-forget_the_cdn.html",{loader:()=>n.e(7208).then(n.bind(n,9736)),meta:{d:15163632e5,l:"2018年1月19日",c:["服务器"],g:["CDN","建站"],e:"
    \n

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

    \n
    \n

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

    ",r:{minutes:2.17,words:652},y:"a",t:"小型网站管理员,快放弃 CDN!",O:-9}}],["/posts/2018-01-31-hire_a_robot.html",{loader:()=>n.e(404).then(n.bind(n,9744)),meta:{d:151743906e4,l:"2018年1月31日",c:["自动化"],g:["Huginn","rss"],e:"
    \n

    机器人会取代你工作!\n计算云会取代你工作!\nAI 会取代你的工作!

    \n
    \n

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

    \n

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

    \n

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

    \n

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

    ",r:{minutes:1.65,words:494},y:"a",t:"雇个机器人帮你干活",O:-10}}],["/posts/2018-03-06-no_more_dinner.html",{loader:()=>n.e(3592).then(n.bind(n,2388)),meta:{d:152037396e4,l:"2018年3月6日",c:["健康"],g:["减肥"],e:"

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    \n

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    \n

    解决方案:

    \n
      \n
    1. \n

      增加运动:每天划船机 2 公里,后期再逐步加量

      \n
    2. \n
    3. \n

      调节饮食,多喝水不吃炸鸡

      \n
        \n
      • \n

        早餐:9 点,牛奶 + 麦片

        \n
      • \n
      • \n

        午餐:12 点,正常

        \n
      • \n
      • \n

        晚餐:4 点,晚餐后不再吃东西

        \n
      • \n
      \n
    4. \n
    ",r:{minutes:1.02,words:306},y:"a",t:"提早晚餐,饿死算逑",O:-11}}],["/posts/2018-04-30-baota_deploy_vps.html",{loader:()=>n.e(8533).then(n.bind(n,1016)),meta:{d:15250464e5,l:"2018年4月30日",c:["服务器"],g:["宝塔面板","建站"],e:'

    新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。

    \n

    国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。

    \n
    \n

    一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP

    \n
    \n
    宝塔面板界面图
    宝塔面板界面图
    ',r:{minutes:.78,words:234},y:"a",t:"新手建站神器 - 宝塔面板",O:-12}}],["/posts/2018-05-01-jekyll_blog_on_github_pages.html",{loader:()=>n.e(2752).then(n.bind(n,7384)),meta:{d:15251328e5,l:"2018年5月1日",c:["博客"],g:["Jekyll","Github","建站"],e:'

    一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。

    \n

    偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。

    \n

    搭建流程

    \n
      \n
    1. \n

      注册并登录 Github

      \n
    2. \n
    3. \n

      选择一个喜欢的 Jekyll 模板, 进入对应的 Github 主页。我选了黄玄的 Hux Blog

      \n
    4. \n
    5. \n

      点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    9. \n

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

      \n
      \n
    10. \n
    11. \n

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

      \n
      \n
    12. \n
    ',r:{minutes:.89,words:268},y:"a",t:"Jekyll 篇一:3 分钟搭建 Github Pages 博客",O:-13}}],["/posts/2018-05-02-jekyll_blog_on_vps.html",{loader:()=>n.e(6596).then(n.bind(n,1400)),meta:{d:15252192e5,l:"2018年5月2日",c:["博客"],g:["Jekyll","建站"],e:'

    Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。

    \n

    Jekyll 环境官方安装指南

    \n
      \n
    1. \n

      使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

      \n
    2. \n
    3. \n

      安装 jekyll:gem install jekyll

      \n
    4. \n
    5. \n

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

      \n
    6. \n
    7. \n

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

      \n
    8. \n
    ',r:{minutes:.65,words:196},y:"a",t:"Jekyll 扩展篇:服务器搭建 Jekyll 博客",O:-14}}],["/posts/2018-05-03-jekyll_blog_autodeploy.html",{loader:()=>n.e(7392).then(n.bind(n,3912)),meta:{d:15253056e5,l:"2018年5月3日",c:["博客"],g:["Jekyll","Travis CI","Docker"],e:"

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

    \n

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

    ",r:{minutes:7.68,words:2303},y:"a",t:"Jekyll 篇二:自动部署服务器博客",O:-15}}],["/posts/2018-05-04-audition_cut_mp3.html",{loader:()=>n.e(176).then(n.bind(n,1373)),meta:{d:1525392e6,l:"2018年5月4日",c:["工具"],g:["Audition","音频"],e:'

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

    \n

    简易剪切流程

    \n
      \n
    1. \n

      在 Audition 中打开音频文件。

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    9. \n

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

      \n
    10. \n
    ',r:{minutes:.85,words:256},y:"a",t:"怎么用 Adobe Audition 快速剪切音频?",O:-16}}],["/posts/2018-05-15-aria2_a_new_download_tool.html",{loader:()=>n.e(192).then(n.bind(n,808)),meta:{d:15263424e5,l:"2018年5月15日",c:["工具"],g:["Aria2","迅雷"],e:"

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

    \n

    但是,迅雷已经堕落

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

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

      \n
      \n
    • \n
    ",r:{minutes:7.06,words:2117},y:"a",t:"抛弃迅雷,Aria2 新手入门",O:-17}}],["/posts/2018-05-24-airtable_noob.html",{loader:()=>n.e(5344).then(n.bind(n,3006)),meta:{d:152712e7,l:"2018年5月24日",c:["工具"],g:["Airtable"],e:'

    Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库

    \n

    之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。

    \n

    这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。

    \n

    建立空白 Airtable

    \n
      \n
    1. \n

      注册并登录 Airtable

      \n
    2. \n
    3. \n

      点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。\n

      \n
    4. \n
    5. \n

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

      \n
    6. \n
    7. \n

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

      \n
    8. \n
    9. \n

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

      \n
    10. \n
    ',r:{minutes:3.31,words:993},y:"a",t:"真· Airtable 3 分钟菜鸟入门",O:-18}}],["/posts/2018-06-08-baizhuo_gp1700.html",{loader:()=>n.e(5576).then(n.bind(n,7140)),meta:{d:1528416e6,l:"2018年6月8日",c:["网络"],g:["GP1700","光猫"],e:'

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

    \n

    电信「网络管家」功能

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

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

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

      光猫内网穿透:当外网要访问局域网(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)。

      \n
      \n
    6. \n
    7. \n

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

      \n
    8. \n
    ',r:{minutes:1.3,words:391},y:"a",t:"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射",O:-19}}],["/posts/2018-06-10-koolproxy_https.html",{loader:()=>n.e(836).then(n.bind(n,3648)),meta:{d:15285888e5,l:"2018年6月10日",c:["网络"],g:["koolproxy"],e:'
    \n

    注意

    \n

    KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。

    \n
    \n

    koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)

    \n

    为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。

    ',r:{minutes:.98,words:294},y:"a",t:"koolproxy 无法下载 https 证书?",O:-20}}],["/posts/2018-06-19-iptv_direckly.html",{loader:()=>n.e(4194).then(n.bind(n,8368)),meta:{d:15293664e5,l:"2018年6月19日",c:["网络"],g:["IPTV"],e:'

    随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。

    \n

    如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒,对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:电信公网疑似已屏蔽回放源 IP · Issue #28

    ',r:{minutes:2.26,words:679},y:"a",t:"客厅、书房、卧室,任意收看 IPTV 直播!",O:-21}}],["/posts/2018-10-07-huginn_scraping_any_website.html",{loader:()=>n.e(3896).then(n.bind(n,9584)),meta:{d:15388704e5,l:"2018年10月7日",c:["自动化"],g:["Huginn","rss"],e:"

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

    \n
      \n
    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • \n
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。
    • \n
    \n",r:{minutes:3.95,words:1185},y:"a",t:"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)",O:-22}}],["/posts/2018-12-28-voice_input_try.html",{loader:()=>n.e(4916).then(n.bind(n,188)),meta:{d:15459552e5,l:"2018年12月28日",c:["自动化"],g:["语音输入"],e:"

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    \n

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    \n

    讯飞 + 小麦克风

    \n

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    \n

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    \n

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    ",r:{minutes:6.53,words:1959},y:"a",t:"等了十年,PC 端能用的语音输入方案来了",O:-23}}],["/posts/2019-03-31-openvpn_back_to_home.html",{loader:()=>n.e(7008).then(n.bind(n,88)),meta:{d:15539904e5,l:"2019年3月31日",c:["网络"],g:["OpenVPN","内网穿透"],e:'

    有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。

    \n

    内网穿透

    \n

    连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。

    \n

    梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。

    \n
    ',r:{minutes:1.39,words:416},y:"a",t:"OpenVPN 随时随地回家的路",O:-24}}],["/posts/2019-04-01-rsshub_noob.html",{loader:()=>n.e(7320).then(n.bind(n,1824)),meta:{d:15540768e5,l:"2019年4月1日",c:["自动化"],g:["rss","RSSHub"],e:'

    RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。

    \n

    RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。

    \n
    ',r:{minutes:1.4,words:419},y:"a",t:"RSS 速成篇:RSSHub 捡现成的轮子",O:-25}}],["/posts/2019-08-26-scrcpy_screen_projection.html",{loader:()=>n.e(7696).then(n.bind(n,3704)),meta:{d:15667776e5,l:"2019年8月26日",c:["工具"],g:["scrcpy","投屏"],e:'

    scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。

    \n

    市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。

    \n

    本文以 Windows 投屏为例,可以前往官方站点下载 scrcpy-win64-v2.3.zip,或者使用国内搬运链接

    ',r:{minutes:5.55,words:1666},y:"a",t:"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏",O:-26}}],["/posts/2019-10-04-fake_aka_hospital_skin_care_products.html",{loader:()=>n.e(5492).then(n.bind(n,6216)),meta:{d:15701472e5,l:"2019年10月4日",c:["购物"],g:["化妆品"],e:"

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    \n

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    \n

    协和

    \n

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    \n

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    ",r:{minutes:3.68,words:1103},y:"a",t:"这些「医院护肤品」你买了吗?",O:-27}}],["/posts/2020-03-25-rsshub_on_vps.html",{loader:()=>n.e(608).then(n.bind(n,1968)),meta:{d:15850944e5,l:"2020年3月25日",c:["自动化"],g:["rss","RSSHub"],e:'

    RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器

    \n

    新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。

    \n

    部署步骤

    \n
      \n
    1. \n

      将 RSSHub 代码下载到根目录 root,执行命令 git clone https://github.com/DIYgod/RSSHub.git

      \n
    2. \n
    3. \n

      安装宝塔面板,查看官方安装教程

      \n
    4. \n
    5. \n

      登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

      \n
      \n
    6. \n
    7. \n

      点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

      \n
      \n
    8. \n
    9. \n

      添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

      \n
      \n
    10. \n
    ',r:{minutes:2.3,words:689},y:"a",t:"RSS 速成篇 2:RSSHub 自部署",O:-28}}],["/posts/2020-09-13-wifi_speed_up.html",{loader:()=>n.e(3588).then(n.bind(n,9800)),meta:{d:15999552e5,l:"2020年9月13日",c:["网络"],g:["WIFI"],e:"

    拖慢 WIFI 速度的最大元凶是无线信号合并

    \n

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    \n

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    \n

    无线模式

    \n

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    ",r:{minutes:2.08,words:623},y:"a",t:"无线路由调整,加快 WIFI 速度",O:-29}}],["/posts/2020-09-22-uefi_asus_board.html",{loader:()=>n.e(5160).then(n.bind(n,7712)),meta:{d:16007328e5,l:"2020年9月22日",c:["系统"],g:["主板"],e:'

    电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。

    \n

    电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。

    \n
    华硕主板设置截图
    ',r:{minutes:.73,words:218},y:"a",t:"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案",O:-30}}],["/posts/2020-10-25-dpc_watchdog_violation.html",{loader:()=>n.e(7452).then(n.bind(n,4528)),meta:{d:1603584e6,l:"2020年10月25日",c:["系统"],g:["蓝屏"],e:'

    Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。

    \n

    导出蓝屏日志

    \n
      \n
    1. \n

      安装 WinDbg Preview,这是微软官方推出的系统调试工具。

      \n
    2. \n
    3. \n

      启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\\Windows\\Minidump,导出日志 *.dmp

      \n
    4. \n
    5. \n

      载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

      \n
      \n
    6. \n
    7. \n

      分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

      \n
      \n
    8. \n
    ',r:{minutes:5.48,words:1643},y:"a",t:"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例",O:-30}}],["/posts/2020-11-01-gym_equipment_throw_away.html",{loader:()=>n.e(5815).then(n.bind(n,8544)),meta:{d:16041888e5,l:"2020年11月1日",c:["购物"],g:["断舍离","健身器材"],e:'

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    \n

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    \n

    划船机

    \n

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    \n
    ',r:{minutes:5.27,words:1580},y:"a",t:"这些全网卖爆的“必备”品,我劝你别买……",O:-31}}],["/posts/2020-11-27-rime_input.html",{loader:()=>n.e(3792).then(n.bind(n,6244)),meta:{d:16064352e5,l:"2020年11月27日",c:["工具"],g:["小狼毫","输入法"],e:'

    常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器

    \n

    之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。

    \n

    Rime 小狼毫输入法下载:官方渠道国内搬运

    ',r:{minutes:7.87,words:2361},y:"a",t:"小狼毫 3 分钟入门及进阶指南",O:-32}}],["/posts/2020-12-17-weight_log.html",{loader:()=>n.e(5844).then(n.bind(n,5980)),meta:{d:16081632e5,l:"2020年12月17日",c:["健康"],g:["减肥"],e:"

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    \n

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    \n

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    \n

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    ",r:{minutes:11.46,words:3439},y:"a",t:"减肥日志:4 周 15 斤",O:-33}}],["/posts/2021-01-02-keepass_the_real_lastpassword.html",{loader:()=>n.e(6808).then(n.bind(n,8688)),meta:{d:16095456e5,l:"2021年1月2日",c:["工具"],g:["KeePass"],e:"

    用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。

    \n

    之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。

    \n

    KeePass 的密码保存在本地的 .kdbx 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。

    ",r:{minutes:6.18,words:1855},y:"a",t:"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件",O:-34}}],["/posts/2021-01-27-blog_jekyll_to_wordpress.html",{loader:()=>n.e(492).then(n.bind(n,6228)),meta:{d:16117056e5,l:"2021年1月27日",c:["博客"],g:["Jekyll","WordPress"],e:"

    2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。

    \n

    2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。

    \n

    Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。

    ",r:{minutes:1.79,words:537},y:"a",t:"Jekyll 博客迁移-从 Markdown 到 WordPress",O:-35}}],["/posts/2021-05-31-principles_criticism_and_self-criticism.html",{loader:()=>n.e(6372).then(n.bind(n,9812)),meta:{d:16224192e5,l:"2021年5月31日",c:["头脑驿站"],g:["原则","批评与自我批评"],e:'

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    \n

    理论支撑

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评
    ',r:{minutes:6.6,words:1981},y:"a",t:"普通人的生活原则-批评与自我批评",O:-37}}],["/posts/2021-10-23-nas_with_rsshub_and_huginn.html",{loader:()=>n.e(1460).then(n.bind(n,172)),meta:{d:16349472e5,l:"2021年10月23日",c:["自动化"],g:["nas","rss"],e:"

    作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时

    \n

    这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然而,由于配置过低,服务器频繁重启,维护成本不断上升。后来,我尝试了一些配置较高的国外服务器,例如 2 核 4G 低端服务器,但遇到了严重的超售和性能不稳定的问题。总的来说,购买国外的低端服务器(特别是俄罗斯服务器)就是把钱扔进水里。

    ",r:{minutes:6.74,words:2022},y:"a",t:"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS",O:-38}}],["/posts/2022-01-23-wechat_lucky_money_cover.html",{loader:()=>n.e(1736).then(n.bind(n,8848)),meta:{d:1642896e6,l:"2022年1月23日",c:["工具"],g:["微信红包"],e:'

    上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。

    \n

    春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。

    \n
    ',r:{minutes:2.48,words:744},y:"a",t:"想要独一无二的微信红包,你也可以自己做",O:-39}}],["/posts/2022-02-19-microsoft_store_fixed.html",{loader:()=>n.e(2536).then(n.bind(n,2960)),meta:{d:16452288e5,l:"2022年2月19日",c:["系统"],g:["Microsoft store"],e:'

    Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

    \n
    \n

    特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

    ',r:{minutes:1.27,words:380},y:"a",t:"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11",O:-40}}],["/posts/2022-03-09-lenovo_black_card_member.html",{loader:()=>n.e(9672).then(n.bind(n,5e3)),meta:{d:1646784e6,l:"2022年3月9日",c:["购物"],g:["联想"],e:"

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    \n

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    \n

    幻想着花了钱,就可以选自己理想的电脑。

    \n

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    \n
    \n

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    \n
    ",r:{minutes:1.53,words:458},y:"a",t:"联想黑金超核会员情报分享",O:-41}}],["/posts/2022-03-17-rss_persistent_link_collection.html",{loader:()=>n.e(3200).then(n.bind(n,9996)),meta:{d:16474752e5,l:"2022年3月17日",c:["自动化"],g:["rss"],e:'

    越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。

    \n

    如果有兴趣自己制作 RSS,可查看文章底部教程。

    \n

    每日热点

    \n

    整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。

    \n
      \n
    • \n

      百度实时热点https://rss.aishort.top/?type=baidu\n实时收录百度热搜内容,并显示热搜指数和简介。

      \n
      \n
    • \n
    • \n

      国内应急新闻https://rss.aishort.top/?type=cneb\n采集自国家应急广播,配合 rss 阅读器过滤,及时获取当地应急通知。

      \n
      \n
    • \n
    • \n

      瓦斯阅读https://rss.aishort.top/?type=wasi\n通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。

      \n
      \n
    • \n
    ',r:{minutes:1.93,words:580},y:"a",t:"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效",O:-42}}],["/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html",{loader:()=>n.e(3488).then(n.bind(n,1349)),meta:{d:16478208e5,l:"2022年3月21日",c:["系统"],g:["winget","winstall"],e:"

    矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。

    \n

    我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍需逐个进行。此外,把软件系统的管理交给 360、金山或腾讯,你真的放心?相比之下,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,它们直接从官方来源下载应用,并支持一键批量静默安装,是快速部署程序的理想选择

    ",r:{minutes:5.21,words:1563},y:"a",t:"一键安装 99 个程序,Windows 最强软件管理器",O:-43}}],["/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html",{loader:()=>n.e(5640).then(n.bind(n,2988)),meta:{d:16504128e5,l:"2022年4月20日",c:["观察随笔"],g:["幸存者偏差","疫情"],e:"

    够吃吗?还能买到东西吗?

    \n

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    \n

    但真是这样吗?我真的生活在「上海」吗?

    \n

    亲身体验 VS 网上「上海」

    \n

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    \n

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    ",r:{minutes:4.82,words:1447},y:"a",t:"上海没吃的?割裂的城市,我真的生活在上海吗?",O:-44}}],["/posts/2022-04-21-uivision_rpa.html",{loader:()=>n.e(2712).then(n.bind(n,2284)),meta:{d:16504992e5,l:"2022年4月21日",c:["自动化"],g:["浏览器插件","UI.Vision","RPA"],e:"
    \n

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    \n
    \n

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    \n

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    \n

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    \n

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    ",r:{minutes:5.59,words:1676},y:"a",t:"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA",O:-45}}],["/posts/2022-05-22-surveillance_video_for_myself.html",{loader:()=>n.e(5974).then(n.bind(n,3028)),meta:{d:16531776e5,l:"2022年5月22日",c:["头脑驿站"],g:["录屏","自我管理"],e:"

    疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。

    \n

    自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。

    \n

    寻找监控工具

    \n
      \n
    • 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。
    • \n
    • 录屏软件:带移动侦测功能,检测到人则开启录像,无人则自动暂停,无需联网就能使用。
    • \n
    • 播放软件:自动跳过超过 10s 的静止画面。
    • \n
    • 直连电脑的摄像机:不联网,不用 SD 卡将视频直接存储在电脑上。虽然萤石、小米有移动侦测功能,但视频需上传云端,风险过大。
    • \n
    ",r:{minutes:8.9,words:2669},y:"a",t:"疫情封控两个月后,我对自己开始 24 小时的自我监控录像",O:-46}}],["/posts/2022-06-07-blog_md_to_wordpress.html",{loader:()=>n.e(8154).then(n.bind(n,7800)),meta:{d:165456e7,l:"2022年6月7日",c:["博客"],g:["blog","github","WordPress"],e:'

    博客探索

    \n

    2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​

    \n

    2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录转变到知识整理输出。Jekyll 方案需要首先在本地用 Markdown 编辑排版,然后同步到 github 发布,最后以 Markdown 格式手动分发到各个渠道。当文章较少时,这套方案的体验感特别好。​

    ',r:{minutes:9.37,words:2812},y:"a",t:"集自动发布、本地管理于一身:WordPress 博客管理方案分享",O:-47}}],["/posts/2022-08-10-new_stuff_shaping_machine.html",{loader:()=>n.e(1424).then(n.bind(n,3756)),meta:{d:16600896e5,l:"2022年8月10日",c:["购物"],g:["健身器材"],e:'

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    \n
    已闲置于墙角
    ',r:{minutes:2.83,words:848},y:"a",t:"新玩意|智能可折叠综合塑形机",O:-.01}}],["/posts/2022-08-22-learndata_blog_to_knowledge_management.html",{loader:()=>n.e(7204).then(n.bind(n,5594)),meta:{d:16611264e5,l:"2022年8月22日",c:["博客","头脑驿站"],g:["VuePress","建站"],e:"

    知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。

    \n

    这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。

    ",r:{minutes:10.14,words:3043},y:"a",t:"抛弃 Notion 知识管理软件的尝试:把博客变为知识库",O:-48}}],["/posts/2022-09-05-stable_diffusion_ai_painting.html",{loader:()=>n.e(776).then(n.bind(n,3120)),meta:{d:1662336e6,l:"2022年9月5日",c:["工具"],g:["AI","Docker","Stable Diffusion"],e:'

    我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。

    \n
    丁老头进化旅程
    \n

    Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用 Stable Diffusion,你可以在拥有 6GB 显存显卡,16GB 内存或只依赖 CPU 的电脑上生成图像,并且仅需几秒钟的时间,无需进行预处理或后处理。

    ',r:{minutes:16.76,words:5027},y:"a",t:"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑",O:-49}}],["/posts/2022-09-07-extreme_branding_thinking_with_mate50.html",{loader:()=>n.e(6764).then(n.bind(n,604)),meta:{d:16625088e5,l:"2022年9月7日",c:["观察随笔"],g:["媒体"],e:'

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    \n
    \n

    个人观察

    ',r:{minutes:4.4,words:1319},y:"a",t:"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?",O:-.02}}],["/posts/2022-11-03-ffmpeg_screen_recording.html",{loader:()=>n.e(7172).then(n.bind(n,196)),meta:{d:16674336e5,l:"2022年11月3日",c:["工具"],g:["录屏"],e:'
    \n

    当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。

    \n
    \n

    开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。

    ',r:{minutes:10.37,words:3111},y:"a",t:"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg",O:-50}}],["/posts/2022-11-18-whisper_ai_subtitles.html",{loader:()=>n.e(7698).then(n.bind(n,3512)),meta:{d:16687296e5,l:"2022年11月18日",c:["工具"],g:["AI","Whisper","字幕"],e:"

    从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。

    \n

    Whisper 是今年 9 月被 OpenAI 开源的自动语音识别系统,除了可以用于语音识别,Whisper 还能实现多种语言的转录,并将这些语言翻译成英语。「语言识别」「转录」听起来很高级,但 transcribe(转录)指的是将语音转为文字,Whisper 会为音视频生成带时间轴的字幕文件,是支持 99 种语言 AI 字幕工具

    ",r:{minutes:12.12,words:3636},y:"a",t:"找不到字幕?Whisper 让不懂外语的你也能看懂日剧",O:-51}}],["/posts/2023-01-26-whiteboard_gtd.html",{loader:()=>n.e(2264).then(n.bind(n,1667)),meta:{d:16743456e5,l:"2023年1月22日",c:["工具"],g:["白板","GTD"],e:'
    \n

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

    \n
    \n

    在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

    \n
    Website Creator Cartoon
    源图:Storyset
    ',r:{minutes:4.86,words:1458},y:"a",t:"为什么我把日常任务放回墙上,而不是手机里?",O:-52}}],["/posts/2023-02-27-chatgpt_shortcuts.html",{loader:()=>n.e(6224).then(n.bind(n,8812)),meta:{d:1677456e6,l:"2023年2月27日",c:["工具"],g:["AI","ChatGPT"],e:'

    最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。

    \n

    ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 ChatGPT Prompt ExamplesAwesome ChatGPT PromptsLearn Prompting 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。

    ',r:{minutes:8.59,words:2577},y:"a",t:"为了帮你用好 ChatGPT,我做了一个「咒语库]",O:-53}}],["/posts/2023-03-31-efficient_morning_5am_club.html",{loader:()=>n.e(9480).then(n.bind(n,4200)),meta:{d:16802208e5,l:"2023年3月31日",c:["头脑驿站"],g:["时间","工作流"],e:"

    失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何况早上 5 点起床呢?即使成功在 5 点起床,我又如何保证自己的状态?如何保证可以高效地学习和工作呢?但当时我正处于效率低谷,总是被其他事情干扰,作息时间完全被打乱。迷信理论的我,只能去相信它。因此,我结合心流理论制定了自己的「5AM Club」计划。

    ",r:{minutes:12.24,words:3671},y:"a",t:"从失眠到高效早晨:我的 5AM Club 计划分享",O:-54}}],["/posts/2023-09-05-virtual_positioning.html",{loader:()=>n.e(6772).then(n.bind(n,4800)),meta:{d:1693872e6,l:"2023年9月5日",c:["工具"],g:["虚拟定位"],e:'
    \n

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    \n
    \n

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    \n

    虚拟定位

    \n
      \n
    1. \n

      首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

      \n
      \n
    2. \n
    3. \n

      在模拟器中打开要修改定位的应用,点击应用的定位图标。

      \n
      \n
    4. \n
    5. \n

      选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

      \n
      \n
    6. \n
    7. \n

      更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

      \n
    8. \n
    ',r:{minutes:2.26,words:677},y:"a",t:"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT",O:-55}}],["/posts/2023-10-07-clone-voice.html",{loader:()=>n.e(8688).then(n.bind(n,4168)),meta:{d:16966368e5,l:"2023年10月7日",c:["工具"],g:["AI","VITS","声音克隆"],e:"

    每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。

    \n

    你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。

    \n

    艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。

    ",r:{minutes:7.93,words:2379},y:"a",t:"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!",O:-56}}],["/posts/2023-10-29-switch-firmware-updates.html",{loader:()=>n.e(5476).then(n.bind(n,7432)),meta:{d:16985376e5,l:"2023年10月29日",c:["工具"],g:["games"],e:"

    家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。

    \n

    注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。

    \n

    以下是我进行升级的步骤:

    \n

    更新注入器

    \n

    首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。

    ",r:{minutes:6.18,words:1854},y:"a",t:"Switch 升级记录与资源汇编",O:-.03}}],["/posts/2024-01-28-learndata-advanced.html",{loader:()=>n.e(152).then(n.bind(n,5540)),meta:{d:17064e8,l:"2024年1月28日",c:["博客"],e:'
    \n

    本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。

    \n
    \n

    自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。

    ',r:{minutes:6.18,words:1855},y:"a",t:"LearnData 博客:高效知识管理和进阶应用技巧",O:-57}}],["/code/AutoHotkey.html",{loader:()=>n.e(3736).then(n.bind(n,8636)),meta:{y:"p",t:"AutoHotkey",i:"linter",O:4}}],["/code/Electron.html",{loader:()=>n.e(4080).then(n.bind(n,8492)),meta:{y:"p",t:"Electron",i:"layout",O:7}}],["/code/HTML.html",{loader:()=>n.e(1292).then(n.bind(n,5756)),meta:{y:"p",t:"HTML",i:"html",O:1}}],["/code/Javascript.html",{loader:()=>n.e(9320).then(n.bind(n,1472)),meta:{y:"p",t:"JavaScript",i:"javascript",O:2}}],["/code/Markdown.html",{loader:()=>n.e(6292).then(n.bind(n,7208)),meta:{y:"p",t:"Markdown",i:"markdown",O:5}}],["/code/Python.html",{loader:()=>n.e(6393).then(n.bind(n,2632)),meta:{y:"p",t:"Python",i:"python",O:3}}],["/code/",{loader:()=>n.e(6704).then(n.bind(n,8540)),meta:{y:"p",t:"Coding",i:"code"}}],["/code/Regex.html",{loader:()=>n.e(9852).then(n.bind(n,4832)),meta:{y:"p",t:"正则表达式",i:"regexp",O:6}}],["/code/Vue.html",{loader:()=>n.e(4512).then(n.bind(n,3748)),meta:{y:"p",t:"Vue",i:"vue",O:2}}],["/apps/Applist.html",{loader:()=>n.e(7520).then(n.bind(n,80)),meta:{y:"p",t:"必备应用",i:"list",O:1}}],["/apps/ChatGPT.html",{loader:()=>n.e(7768).then(n.bind(n,3904)),meta:{y:"p",t:"ChatGPT",i:"creative",O:91}}],["/apps/Chrome.html",{loader:()=>n.e(1795).then(n.bind(n,7096)),meta:{y:"p",t:"Chrome 扩展",i:"chrome",O:3}}],["/apps/design.html",{loader:()=>n.e(5804).then(n.bind(n,3628)),meta:{y:"p",t:"平面设计",i:"pic",O:90}}],["/apps/toolbox.html",{loader:()=>n.e(9064).then(n.bind(n,7496)),meta:{y:"p",t:"开源工具",i:"float",O:2}}],["/deploy/CloudServices.html",{loader:()=>n.e(4108).then(n.bind(n,3268)),meta:{y:"p",t:"云计算服务",i:"class",O:2}}],["/deploy/Cloudflare.html",{loader:()=>n.e(9452).then(n.bind(n,3392)),meta:{y:"p",t:"Cloudflare",i:"proxy",O:5}}],["/deploy/DNS.html",{loader:()=>n.e(2112).then(n.bind(n,5996)),meta:{y:"p",t:"域名 DNS 托管",i:"sitemap",O:6}}],["/deploy/GitHub.html",{loader:()=>n.e(6048).then(n.bind(n,7908)),meta:{y:"p",t:"GitHub",i:"github",O:4}}],["/deploy/MySQL.html",{loader:()=>n.e(4484).then(n.bind(n,6696)),meta:{y:"p",t:"数据库管理",i:"mysql",O:3}}],["/deploy/Static.html",{loader:()=>n.e(9620).then(n.bind(n,164)),meta:{y:"p",t:"静态部署",i:"generic",O:1}}],["/deploy/VPS.html",{loader:()=>n.e(6084).then(n.bind(n,7444)),meta:{y:"p",t:"服务器 VPS",i:"IO",O:3}}],["/family/Coupon.html",{loader:()=>n.e(403).then(n.bind(n,1133)),meta:{y:"p",t:"网购攻略",i:"free",O:3}}],["/family/Diet.html",{loader:()=>n.e(3832).then(n.bind(n,1396)),meta:{y:"p",t:"健康饮食",i:"enum",O:1}}],["/family/HomeAutomation.html",{loader:()=>n.e(8792).then(n.bind(n,9680)),meta:{y:"p",t:"智能家居",i:"home",O:3.1}}],["/family/Life.html",{loader:()=>n.e(1196).then(n.bind(n,6952)),meta:{y:"p",t:"生活窍门",i:"creative",O:6}}],["/family/Maintenance.html",{loader:()=>n.e(7800).then(n.bind(n,6964)),meta:{y:"p",t:"维修/保养",i:"repair",O:5}}],["/family/Medical.html",{loader:()=>n.e(8288).then(n.bind(n,8944)),meta:{y:"p",t:"医疗药品",i:"like",O:4}}],["/family/Shoppinglist.html",{loader:()=>n.e(6164).then(n.bind(n,8656)),meta:{y:"p",t:"购物评价",i:"info",O:2}}],["/services/Docker.html",{loader:()=>n.e(7456).then(n.bind(n,7700)),meta:{y:"p",t:"Docker",i:"any",O:2}}],["/services/Huginn.html",{loader:()=>n.e(1176).then(n.bind(n,4236)),meta:{y:"p",t:"Huginn",i:"customize",O:3}}],["/services/NAS.html",{loader:()=>n.e(328).then(n.bind(n,8870)),meta:{y:"p",t:"NAS",i:"process",O:1}}],["/services/TTRSS.html",{loader:()=>n.e(7476).then(n.bind(n,2336)),meta:{y:"p",t:"Tiny Tiny RSS",i:"rss",O:4}}],["/web/Comments.html",{loader:()=>n.e(8648).then(n.bind(n,1324)),meta:{y:"p",t:"评论插件",i:"comment",O:3}}],["/web/VuePress.html",{loader:()=>n.e(7408).then(n.bind(n,6876)),meta:{y:"p",t:"VuePress",i:"vue",O:1}}],["/web/docsify.html",{loader:()=>n.e(5684).then(n.bind(n,356)),meta:{y:"p",t:"docsify",i:"edit",O:2}}],["/windows/NewSystem.html",{loader:()=>n.e(1792).then(n.bind(n,60)),meta:{y:"p",t:"系统重装",i:"update",O:2}}],["/windows/faq.html",{loader:()=>n.e(5448).then(n.bind(n,6756)),meta:{y:"p",t:"Windows",i:"windows",O:1}}],["/windows/screen.html",{loader:()=>n.e(6072).then(n.bind(n,8304)),meta:{y:"p",t:"显示屏",i:"compare",O:3}}],["/apps/devdocs/json-translate.html",{loader:()=>n.e(4230).then(n.bind(n,8080)),meta:{d:1702944e6,l:"2023年12月19日",c:["工具"],e:'

    JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。

    \n
    ',r:{minutes:6.04,words:1813},y:"a",t:"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?",O:1}}],["/apps/livestreaming/0_live_equipments.html",{loader:()=>n.e(7364).then(n.bind(n,8320)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:"

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

    \n

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

    \n

    电脑

    \n

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

    \n

    补光灯

    \n

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

    ",r:{minutes:5.37,words:1611},y:"a",t:"直播入门攻略零 | 硬件篇:直播设备",O:.1}}],["/apps/livestreaming/1_obs_basic.html",{loader:()=>n.e(9200).then(n.bind(n,4384)),meta:{d:1673542527e3,c:["工具"],g:["OBS","直播"],e:'

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

    \n

    主界面

    \n

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

    ',r:{minutes:9.13,words:2739},y:"a",t:"直播入门攻略一 | OBS 篇:OBS 30 新手指南",O:1}}],["/apps/livestreaming/2_obs_streamfx.html",{loader:()=>n.e(6216).then(n.bind(n,4812)),meta:{d:1673542527e3,c:["工具"],g:["OBS","直播"],e:'

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

    \n

    安装 StreamFX

    \n

    访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 MonoLogueChi/obs-StreamFX-build

    ',r:{minutes:5.13,words:1540},y:"a",t:"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件",O:2}}],["/apps/livestreaming/3_obs_plugins.html",{loader:()=>n.e(3504).then(n.bind(n,5772)),meta:{d:1673542527e3,c:["工具"],g:["OBS","直播"],e:"

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

    \n

    插件安装与卸载

    \n

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

    \n

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

    ",r:{minutes:5.49,words:1646},y:"a",t:"直播入门攻略三 | 插件篇:OBS 进阶插件",O:3}}],["/apps/livestreaming/4_live_effects.html",{loader:()=>n.e(5018).then(n.bind(n,2918)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:'

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

    \n

    美颜

    \n

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

    \n

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

    ',r:{minutes:4.8,words:1439},y:"a",t:"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播",O:4}}],["/apps/livestreaming/5_live_platforms.html",{loader:()=>n.e(1360).then(n.bind(n,2016)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:'

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

    \n

    淘宝直播

    \n
      \n
    1. \n

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

      \n
      淘宝直播设置
      \n
    2. \n
    3. \n

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

      \n
    4. \n
    ',r:{minutes:3.65,words:1094},y:"a",t:"直播入门攻略五 | 平台篇:主流直播平台介绍",O:5}}],["/apps/livestreaming/6_live_positioning.html",{loader:()=>n.e(6004).then(n.bind(n,7320)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:"

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

    \n

    直播定位

    \n

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

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

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

    ",r:{minutes:4.69,words:1406},y:"a",t:"直播入门攻略六 | 技巧篇:直播定位与策划",O:6}}],["/apps/tutorials/QTTabBar.html",{loader:()=>n.e(1776).then(n.bind(n,9332)),meta:{y:"p",t:"QTTabBar",O:101}}],["/apps/tutorials/feishu.html",{loader:()=>n.e(3744).then(n.bind(n,6320)),meta:{d:17022528e5,l:"2023年12月11日",c:["工具"],e:'

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    \n

    飞书文档

    \n

    知识库

    \n

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    \n
    ',r:{minutes:5.68,words:1704},y:"a",t:"飞书迁移记录",O:201}}],["/apps/tutorials/logseq.html",{loader:()=>n.e(1144).then(n.bind(n,1292)),meta:{y:"p",t:"Logseq",O:1}}],["/apps/tutorials/obsidian.html",{loader:()=>n.e(448).then(n.bind(n,4984)),meta:{y:"p",t:"Obsidian",O:2}}],["/apps/tutorials/power-automate.html",{loader:()=>n.e(344).then(n.bind(n,9960)),meta:{y:"p",t:"Power Automate",O:10}}],["/apps/tutorials/vscode.html",{loader:()=>n.e(556).then(n.bind(n,1064)),meta:{y:"p",t:"VS Code",O:3}}],["/family/baby/",{loader:()=>n.e(7658).then(n.bind(n,6104)),meta:{y:"p",t:"育儿记录",i:"emoji"}}],["/family/baby/birthing.html",{loader:()=>n.e(9196).then(n.bind(n,9372)),meta:{y:"p",t:"生产前的准备",O:1}}],["/family/baby/newborn.html",{loader:()=>n.e(1440).then(n.bind(n,6764)),meta:{y:"p",t:"新生儿期(0-6 月)",O:2}}],["/family/baby/take-kids-out.html",{loader:()=>n.e(2332).then(n.bind(n,2340)),meta:{y:"p",t:"溜娃",O:5}}],["/services/dockers-on-nas/",{loader:()=>n.e(2360).then(n.bind(n,7544)),meta:{y:"p",t:"NAS 应用集合",i:"process"}}],["/services/dockers-on-nas/alist.html",{loader:()=>n.e(2212).then(n.bind(n,6692)),meta:{y:"p",t:"Alist:聚合网盘",O:23}}],["/services/dockers-on-nas/cors-anywhere.html",{loader:()=>n.e(3032).then(n.bind(n,6208)),meta:{y:"p",t:"CORS Anywhere:解锁跨域限制",O:201}}],["/services/dockers-on-nas/deeplx.html",{loader:()=>n.e(8392).then(n.bind(n,1984)),meta:{y:"p",t:"DeepLX - 免费翻译接口",O:102}}],["/services/dockers-on-nas/docsify.html",{loader:()=>n.e(5768).then(n.bind(n,5208)),meta:{y:"p",t:"Docsify:私密文件服务器",O:103}}],["/services/dockers-on-nas/emby.html",{loader:()=>n.e(36).then(n.bind(n,3044)),meta:{y:"p",t:"Emby:家庭媒体中心",O:1}}],["/services/dockers-on-nas/flare.html",{loader:()=>n.e(2656).then(n.bind(n,1360)),meta:{y:"p",t:"Flare:快速导航页",O:93}}],["/services/dockers-on-nas/gitlab.html",{loader:()=>n.e(568).then(n.bind(n,7152)),meta:{y:"p",t:"GitLab:私有化版本控制",O:103}}],["/services/dockers-on-nas/grampsjs.html",{loader:()=>n.e(5092).then(n.bind(n,1432)),meta:{y:"p",t:"Gramps.js:在线家谱",O:35}}],["/services/dockers-on-nas/grocy.html",{loader:()=>n.e(2954).then(n.bind(n,5164)),meta:{y:"p",t:"Grocy:家庭杂货管理",O:33}}],["/services/dockers-on-nas/homarr.html",{loader:()=>n.e(1804).then(n.bind(n,1132)),meta:{y:"p",t:"Homarr:本地导航",O:91}}],["/services/dockers-on-nas/memos.html",{loader:()=>n.e(8238).then(n.bind(n,1196)),meta:{y:"p",t:"Memos:碎片化记录",O:34}}],["/services/dockers-on-nas/mt-photos.html",{loader:()=>n.e(460).then(n.bind(n,2435)),meta:{y:"p",t:"MT Photos:分享家庭照片",O:4}}],["/services/dockers-on-nas/n8n.html",{loader:()=>n.e(826).then(n.bind(n,2092)),meta:{y:"p",t:"n8n:工作流自动化",O:81}}],["/services/dockers-on-nas/navidrome.html",{loader:()=>n.e(1068).then(n.bind(n,5144)),meta:{y:"p",t:"Navidrome:开源音乐服务器",O:3}}],["/services/dockers-on-nas/nextcloud.html",{loader:()=>n.e(644).then(n.bind(n,1872)),meta:{y:"p",t:"Nextcloud:私有云盘",O:22}}],["/services/dockers-on-nas/paperless-ngx.html",{loader:()=>n.e(2440).then(n.bind(n,5912)),meta:{y:"p",t:"Paperless-ngx:全文管理文档",O:32}}],["/services/dockers-on-nas/qbittorrent.html",{loader:()=>n.e(5840).then(n.bind(n,5773)),meta:{y:"p",t:"qBittorrent:种子&磁力下载",O:5}}],["/services/dockers-on-nas/qinglong.html",{loader:()=>n.e(4692).then(n.bind(n,7e3)),meta:{y:"p",t:"青龙面板:定时任务管理",O:84}}],["/services/dockers-on-nas/reader.html",{loader:()=>n.e(7532).then(n.bind(n,9696)),meta:{y:"p",t:"Reader:小说/书籍阅读",O:11}}],["/services/dockers-on-nas/reverse-proxy.html",{loader:()=>n.e(136).then(n.bind(n,4220)),meta:{y:"p",t:"反向代理:Nginx Proxy Manager",O:101}}],["/services/dockers-on-nas/srs-stack.html",{loader:()=>n.e(5032).then(n.bind(n,7880)),meta:{y:"p",t:"SRS Stack:直播推流",O:83}}],["/services/dockers-on-nas/stirling-pdf.html",{loader:()=>n.e(812).then(n.bind(n,7580)),meta:{y:"p",t:"Stirling-PDF:开源 PDF 处理工具",O:31}}],["/services/dockers-on-nas/sun-panel.html",{loader:()=>n.e(5648).then(n.bind(n,1496)),meta:{y:"p",t:"Sun-Panel:简化导航页",O:92}}],["/services/dockers-on-nas/syncthing.html",{loader:()=>n.e(3416).then(n.bind(n,6780)),meta:{y:"p",t:"Syncthing:私人同步盘",O:21}}],["/services/dockers-on-nas/tachidesk.html",{loader:()=>n.e(5056).then(n.bind(n,6220)),meta:{y:"p",t:"Tachidesk:漫画聚合阅读器",O:12}}],["/services/dockers-on-nas/uptime-kuma.html",{loader:()=>n.e(7024).then(n.bind(n,6260)),meta:{y:"p",t:"Uptime Kuma:轻量运维监控",O:82}}],["/services/dockers-on-nas/xiaoya.html",{loader:()=>n.e(4952).then(n.bind(n,280)),meta:{y:"p",t:"小雅 alist:影视资源合集",O:2}}],["/404.html",{loader:()=>n.e(9088).then(n.bind(n,2004)),meta:{y:"p",t:""}}],["/posts/",{loader:()=>n.e(8956).then(n.bind(n,1868)),meta:{y:"p",t:"Posts"}}],["/apps/",{loader:()=>n.e(4408).then(n.bind(n,92)),meta:{y:"p",t:"Apps"}}],["/deploy/",{loader:()=>n.e(4976).then(n.bind(n,1787)),meta:{y:"p",t:"Deploy"}}],["/family/",{loader:()=>n.e(184).then(n.bind(n,6712)),meta:{y:"p",t:"Family"}}],["/services/",{loader:()=>n.e(6520).then(n.bind(n,5588)),meta:{y:"p",t:"Services"}}],["/web/",{loader:()=>n.e(744).then(n.bind(n,3188)),meta:{y:"p",t:"Web"}}],["/windows/",{loader:()=>n.e(3480).then(n.bind(n,2044)),meta:{y:"p",t:"Windows"}}],["/apps/devdocs/",{loader:()=>n.e(1896).then(n.bind(n,5094)),meta:{y:"p",t:"Devdocs"}}],["/apps/livestreaming/",{loader:()=>n.e(6480).then(n.bind(n,94)),meta:{y:"p",t:"Livestreaming"}}],["/apps/tutorials/",{loader:()=>n.e(7864).then(n.bind(n,7248)),meta:{y:"p",t:"Tutorials"}}],["/category/",{loader:()=>n.e(5356).then(n.bind(n,4505)),meta:{y:"p",t:"分类",I:!1}}],["/category/%E5%B7%A5%E5%85%B7/",{loader:()=>n.e(6952).then(n.bind(n,336)),meta:{y:"p",t:"工具 分类",I:!1}}],["/category/%E8%87%AA%E5%8A%A8%E5%8C%96/",{loader:()=>n.e(1645).then(n.bind(n,824)),meta:{y:"p",t:"自动化 分类",I:!1}}],["/category/%E7%B3%BB%E7%BB%9F/",{loader:()=>n.e(1020).then(n.bind(n,6644)),meta:{y:"p",t:"系统 分类",I:!1}}],["/category/%E7%BD%91%E7%BB%9C/",{loader:()=>n.e(8704).then(n.bind(n,7380)),meta:{y:"p",t:"网络 分类",I:!1}}],["/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/",{loader:()=>n.e(664).then(n.bind(n,3576)),meta:{y:"p",t:"服务器 分类",I:!1}}],["/category/%E5%81%A5%E5%BA%B7/",{loader:()=>n.e(7916).then(n.bind(n,3092)),meta:{y:"p",t:"健康 分类",I:!1}}],["/category/%E5%8D%9A%E5%AE%A2/",{loader:()=>n.e(2024).then(n.bind(n,8744)),meta:{y:"p",t:"博客 分类",I:!1}}],["/category/%E8%B4%AD%E7%89%A9/",{loader:()=>n.e(4720).then(n.bind(n,2488)),meta:{y:"p",t:"购物 分类",I:!1}}],["/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/",{loader:()=>n.e(4812).then(n.bind(n,7062)),meta:{y:"p",t:"头脑驿站 分类",I:!1}}],["/category/%E8%A7%82%E5%AF%9F%E9%9A%8F%E7%AC%94/",{loader:()=>n.e(1413).then(n.bind(n,3224)),meta:{y:"p",t:"观察随笔 分类",I:!1}}],["/tag/",{loader:()=>n.e(8544).then(n.bind(n,9560)),meta:{y:"p",t:"标签",I:!1}}],["/tag/%E5%BE%AE%E4%BF%A1/",{loader:()=>n.e(4488).then(n.bind(n,5012)),meta:{y:"p",t:"标签: 微信",I:!1}}],["/tag/rss/",{loader:()=>n.e(5568).then(n.bind(n,3728)),meta:{y:"p",t:"标签: rss",I:!1}}],["/tag/feed43/",{loader:()=>n.e(5912).then(n.bind(n,6448)),meta:{y:"p",t:"标签: Feed43",I:!1}}],["/tag/feedex/",{loader:()=>n.e(2228).then(n.bind(n,9464)),meta:{y:"p",t:"标签: FeedEx",I:!1}}],["/tag/office/",{loader:()=>n.e(166).then(n.bind(n,9452)),meta:{y:"p",t:"标签: office",I:!1}}],["/tag/onenote/",{loader:()=>n.e(3837).then(n.bind(n,9904)),meta:{y:"p",t:"标签: OneNote",I:!1}}],["/tag/%E5%85%B3%E6%9C%BA/",{loader:()=>n.e(4892).then(n.bind(n,4460)),meta:{y:"p",t:"标签: 关机",I:!1}}],["/tag/smb/",{loader:()=>n.e(9104).then(n.bind(n,8480)),meta:{y:"p",t:"标签: smb",I:!1}}],["/tag/%E5%85%89%E7%8C%AB/",{loader:()=>n.e(7681).then(n.bind(n,4576)),meta:{y:"p",t:"标签: 光猫",I:!1}}],["/tag/cdn/",{loader:()=>n.e(2088).then(n.bind(n,5964)),meta:{y:"p",t:"标签: CDN",I:!1}}],["/tag/%E5%BB%BA%E7%AB%99/",{loader:()=>n.e(560).then(n.bind(n,8616)),meta:{y:"p",t:"标签: 建站",I:!1}}],["/tag/huginn/",{loader:()=>n.e(3160).then(n.bind(n,6608)),meta:{y:"p",t:"标签: Huginn",I:!1}}],["/tag/%E5%87%8F%E8%82%A5/",{loader:()=>n.e(1552).then(n.bind(n,612)),meta:{y:"p",t:"标签: 减肥",I:!1}}],["/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/",{loader:()=>n.e(2960).then(n.bind(n,5256)),meta:{y:"p",t:"标签: 宝塔面板",I:!1}}],["/tag/jekyll/",{loader:()=>n.e(6776).then(n.bind(n,3248)),meta:{y:"p",t:"标签: Jekyll",I:!1}}],["/tag/github/",{loader:()=>n.e(4424).then(n.bind(n,540)),meta:{y:"p",t:"标签: Github",I:!1}}],["/tag/travis-ci/",{loader:()=>n.e(1990).then(n.bind(n,3160)),meta:{y:"p",t:"标签: Travis CI",I:!1}}],["/tag/docker/",{loader:()=>n.e(7873).then(n.bind(n,3456)),meta:{y:"p",t:"标签: Docker",I:!1}}],["/tag/audition/",{loader:()=>n.e(3196).then(n.bind(n,1640)),meta:{y:"p",t:"标签: Audition",I:!1}}],["/tag/%E9%9F%B3%E9%A2%91/",{loader:()=>n.e(3532).then(n.bind(n,4896)),meta:{y:"p",t:"标签: 音频",I:!1}}],["/tag/aria2/",{loader:()=>n.e(7076).then(n.bind(n,1784)),meta:{y:"p",t:"标签: Aria2",I:!1}}],["/tag/%E8%BF%85%E9%9B%B7/",{loader:()=>n.e(9368).then(n.bind(n,768)),meta:{y:"p",t:"标签: 迅雷",I:!1}}],["/tag/airtable/",{loader:()=>n.e(5780).then(n.bind(n,9894)),meta:{y:"p",t:"标签: Airtable",I:!1}}],["/tag/gp1700/",{loader:()=>n.e(3844).then(n.bind(n,1528)),meta:{y:"p",t:"标签: GP1700",I:!1}}],["/tag/koolproxy/",{loader:()=>n.e(7012).then(n.bind(n,3824)),meta:{y:"p",t:"标签: koolproxy",I:!1}}],["/tag/iptv/",{loader:()=>n.e(1864).then(n.bind(n,3852)),meta:{y:"p",t:"标签: IPTV",I:!1}}],["/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/",{loader:()=>n.e(1596).then(n.bind(n,7694)),meta:{y:"p",t:"标签: 语音输入",I:!1}}],["/tag/openvpn/",{loader:()=>n.e(6928).then(n.bind(n,4e3)),meta:{y:"p",t:"标签: OpenVPN",I:!1}}],["/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/",{loader:()=>n.e(1376).then(n.bind(n,6360)),meta:{y:"p",t:"标签: 内网穿透",I:!1}}],["/tag/rsshub/",{loader:()=>n.e(6132).then(n.bind(n,940)),meta:{y:"p",t:"标签: RSSHub",I:!1}}],["/tag/scrcpy/",{loader:()=>n.e(7428).then(n.bind(n,7072)),meta:{y:"p",t:"标签: scrcpy",I:!1}}],["/tag/%E6%8A%95%E5%B1%8F/",{loader:()=>n.e(872).then(n.bind(n,9004)),meta:{y:"p",t:"标签: 投屏",I:!1}}],["/tag/%E5%8C%96%E5%A6%86%E5%93%81/",{loader:()=>n.e(6228).then(n.bind(n,1692)),meta:{y:"p",t:"标签: 化妆品",I:!1}}],["/tag/wifi/",{loader:()=>n.e(5200).then(n.bind(n,5244)),meta:{y:"p",t:"标签: WIFI",I:!1}}],["/tag/%E4%B8%BB%E6%9D%BF/",{loader:()=>n.e(9514).then(n.bind(n,1160)),meta:{y:"p",t:"标签: 主板",I:!1}}],["/tag/%E8%93%9D%E5%B1%8F/",{loader:()=>n.e(6980).then(n.bind(n,9956)),meta:{y:"p",t:"标签: 蓝屏",I:!1}}],["/tag/%E6%96%AD%E8%88%8D%E7%A6%BB/",{loader:()=>n.e(8192).then(n.bind(n,6980)),meta:{y:"p",t:"标签: 断舍离",I:!1}}],["/tag/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%9D%90/",{loader:()=>n.e(3616).then(n.bind(n,6e3)),meta:{y:"p",t:"标签: 健身器材",I:!1}}],["/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/",{loader:()=>n.e(7796).then(n.bind(n,8372)),meta:{y:"p",t:"标签: 小狼毫",I:!1}}],["/tag/%E8%BE%93%E5%85%A5%E6%B3%95/",{loader:()=>n.e(8168).then(n.bind(n,4208)),meta:{y:"p",t:"标签: 输入法",I:!1}}],["/tag/keepass/",{loader:()=>n.e(9376).then(n.bind(n,1672)),meta:{y:"p",t:"标签: KeePass",I:!1}}],["/tag/wordpress/",{loader:()=>n.e(9e3).then(n.bind(n,9552)),meta:{y:"p",t:"标签: WordPress",I:!1}}],["/tag/%E5%8E%9F%E5%88%99/",{loader:()=>n.e(4904).then(n.bind(n,5168)),meta:{y:"p",t:"标签: 原则",I:!1}}],["/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/",{loader:()=>n.e(4852).then(n.bind(n,1244)),meta:{y:"p",t:"标签: 批评与自我批评",I:!1}}],["/tag/nas/",{loader:()=>n.e(2844).then(n.bind(n,5464)),meta:{y:"p",t:"标签: nas",I:!1}}],["/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/",{loader:()=>n.e(5134).then(n.bind(n,5180)),meta:{y:"p",t:"标签: 微信红包",I:!1}}],["/tag/microsoft-store/",{loader:()=>n.e(1536).then(n.bind(n,9548)),meta:{y:"p",t:"标签: Microsoft store",I:!1}}],["/tag/%E8%81%94%E6%83%B3/",{loader:()=>n.e(232).then(n.bind(n,4828)),meta:{y:"p",t:"标签: 联想",I:!1}}],["/tag/winget/",{loader:()=>n.e(8140).then(n.bind(n,8864)),meta:{y:"p",t:"标签: winget",I:!1}}],["/tag/winstall/",{loader:()=>n.e(2116).then(n.bind(n,8800)),meta:{y:"p",t:"标签: winstall",I:!1}}],["/tag/%E5%B9%B8%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE/",{loader:()=>n.e(7760).then(n.bind(n,1352)),meta:{y:"p",t:"标签: 幸存者偏差",I:!1}}],["/tag/%E7%96%AB%E6%83%85/",{loader:()=>n.e(6660).then(n.bind(n,3180)),meta:{y:"p",t:"标签: 疫情",I:!1}}],["/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/",{loader:()=>n.e(1364).then(n.bind(n,4784)),meta:{y:"p",t:"标签: 浏览器插件",I:!1}}],["/tag/ui.vision/",{loader:()=>n.e(2824).then(n.bind(n,309)),meta:{y:"p",t:"标签: UI.Vision",I:!1}}],["/tag/rpa/",{loader:()=>n.e(5420).then(n.bind(n,1648)),meta:{y:"p",t:"标签: RPA",I:!1}}],["/tag/%E5%BD%95%E5%B1%8F/",{loader:()=>n.e(7164).then(n.bind(n,4456)),meta:{y:"p",t:"标签: 录屏",I:!1}}],["/tag/%E8%87%AA%E6%88%91%E7%AE%A1%E7%90%86/",{loader:()=>n.e(6992).then(n.bind(n,7628)),meta:{y:"p",t:"标签: 自我管理",I:!1}}],["/tag/blog/",{loader:()=>n.e(1728).then(n.bind(n,4716)),meta:{y:"p",t:"标签: blog",I:!1}}],["/tag/github/",{loader:()=>n.e(4424).then(n.bind(n,540)),meta:{y:"p",t:"标签: github",I:!1}}],["/tag/vuepress/",{loader:()=>n.e(3732).then(n.bind(n,6880)),meta:{y:"p",t:"标签: VuePress",I:!1}}],["/tag/ai/",{loader:()=>n.e(124).then(n.bind(n,3048)),meta:{y:"p",t:"标签: AI",I:!1}}],["/tag/stable-diffusion/",{loader:()=>n.e(1064).then(n.bind(n,1384)),meta:{y:"p",t:"标签: Stable Diffusion",I:!1}}],["/tag/%E5%AA%92%E4%BD%93/",{loader:()=>n.e(4308).then(n.bind(n,7500)),meta:{y:"p",t:"标签: 媒体",I:!1}}],["/tag/whisper/",{loader:()=>n.e(5790).then(n.bind(n,2748)),meta:{y:"p",t:"标签: Whisper",I:!1}}],["/tag/%E5%AD%97%E5%B9%95/",{loader:()=>n.e(6440).then(n.bind(n,9916)),meta:{y:"p",t:"标签: 字幕",I:!1}}],["/tag/%E7%99%BD%E6%9D%BF/",{loader:()=>n.e(2784).then(n.bind(n,980)),meta:{y:"p",t:"标签: 白板",I:!1}}],["/tag/gtd/",{loader:()=>n.e(4608).then(n.bind(n,2380)),meta:{y:"p",t:"标签: GTD",I:!1}}],["/tag/chatgpt/",{loader:()=>n.e(3812).then(n.bind(n,1756)),meta:{y:"p",t:"标签: ChatGPT",I:!1}}],["/tag/%E6%97%B6%E9%97%B4/",{loader:()=>n.e(5652).then(n.bind(n,1992)),meta:{y:"p",t:"标签: 时间",I:!1}}],["/tag/%E5%B7%A5%E4%BD%9C%E6%B5%81/",{loader:()=>n.e(8748).then(n.bind(n,3080)),meta:{y:"p",t:"标签: 工作流",I:!1}}],["/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/",{loader:()=>n.e(9764).then(n.bind(n,8224)),meta:{y:"p",t:"标签: 虚拟定位",I:!1}}],["/tag/vits/",{loader:()=>n.e(2128).then(n.bind(n,9058)),meta:{y:"p",t:"标签: VITS",I:!1}}],["/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/",{loader:()=>n.e(7020).then(n.bind(n,2936)),meta:{y:"p",t:"标签: 声音克隆",I:!1}}],["/tag/games/",{loader:()=>n.e(2616).then(n.bind(n,4240)),meta:{y:"p",t:"标签: games",I:!1}}],["/tag/%E7%9B%B4%E6%92%AD/",{loader:()=>n.e(4336).then(n.bind(n,4860)),meta:{y:"p",t:"标签: 直播",I:!1}}],["/tag/obs/",{loader:()=>n.e(9832).then(n.bind(n,4628)),meta:{y:"p",t:"标签: OBS",I:!1}}],["/article/",{loader:()=>n.e(7072).then(n.bind(n,908)),meta:{y:"p",t:"文章",I:!1}}],["/star/",{loader:()=>n.e(6636).then(n.bind(n,2364)),meta:{y:"p",t:"星标",I:!1}}],["/timeline/",{loader:()=>n.e(9584).then(n.bind(n,9116)),meta:{y:"p",t:"时间轴",I:!1}}]])},2524:(t,e,n)=>{n.d(e,{O:()=>o});const o=JSON.parse('{"base":"/","lang":"zh-CN","title":"LearnData-开源笔记","description":"开源工具、效率方法、心理学探索的自我提升笔记,记录并输出一切能让自己提升的知识。","head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://newzone.top/rss.xml","title":"LearnData-开源笔记 RSS Feed"}]],"locales":{}}')},7524:(t,e,n)=>{n.d(e,{Q:()=>o});const o=JSON.parse('{"encrypt":{},"author":{"name":"清顺","url":"https://newzone.top"},"logo":"/logo.svg","breadcrumb":false,"contributors":false,"lastUpdated":true,"editLink":true,"darkmode":"switch","fullscreen":true,"repo":"rockbenben/LearnData","repoLabel":"GitHub","repoDisplay":true,"docsDir":"docs","navbarLayout":{"start":["Brand"],"center":["Links"],"end":["SocialLink","Repo","Outlook","Search"]},"copyright":"Copyright © 2023-present LearnData 开源笔记","displayFooter":true,"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/rockbenben","Zhihu":"https://www.zhihu.com/people/qingwhat","少数派":"https://sspai.com/u/zqj05i4v/posts","Wechat":"https://img.newzone.top/wechat.svg","Email":"mailto:learndata@newzone.top","Discord":"https://discord.gg/PZTQfJ4GjX","RSS":"/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":"星标","empty":"$text 为空"},"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":"emmet","prefix":"/family/","children":["Diet","Shoppinglist","Coupon","baby/"]},{"text":"工具","icon":"tool","children":[{"text":"ChatGPT SC","icon":"creative","link":"https://www.aishort.top/"},{"text":"IMGPrompt","icon":"pic","link":"https://prompt.newzone.top/"},{"text":"文字处理","icon":"others","link":"https://tools.newzone.top/json-translate"},{"text":"工具收藏","icon":"categoryselected","link":"https://nav.newzone.top/"}]}],"sidebar":{"":["/DailyRoutine","/Fitness",{"text":"读书笔记","icon":"read","link":"https://newzone.top/reading/"},{"text":"🧰 应用手册","icon":"","prefix":"/apps/","link":"","collapsible":true,"children":["Applist.md","toolbox.md","Chrome.md",{"text":"工具笔记","icon":"plugin","prefix":"tutorials/","link":"","collapsible":true,"children":"structure"},{"text":"直播手册","icon":"load","prefix":"livestreaming/","link":"","collapsible":true,"children":"structure"},{"text":"其他","icon":"emmet","collapsible":true,"children":["design.md","ChatGPT.md"]}]},{"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":"","prefix":"/family/","link":"","collapsible":true,"children":"structure"},{"text":"博客文章","icon":"blog","prefix":"/_posts/","link":"/blog","collapsible":true,"children":"structure"}],"/services/dockers-on-nas/":"structure","/family/baby/":"structure"}}}}')},5160:(t,e,n)=>{n.d(e,{o:()=>o});const o={"/apps/tutorials/":["logseq","obsidian","vscode","power-automate","QTTabBar","feishu"],"/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:["emby","xiaoya","navidrome","mt-photos","qbittorrent","reader","tachidesk","syncthing","nextcloud","alist","stirling-pdf","paperless-ngx","grocy","memos","grampsjs","n8n","uptime-kuma","srs-stack","qinglong","homarr","sun-panel","flare","reverse-proxy","deeplx","docsify","gitlab","cors-anywhere"]}],"/windows/":["faq","NewSystem","screen"],"/web/":["VuePress","docsify","Comments"],"/family/":["Diet","Shoppinglist","Coupon","HomeAutomation","Medical","Maintenance","Life",{text:"育儿记录",prefix:"baby/",collapsible:!0,icon:"emoji",children:["birthing","newborn","take-kids-out"]}],"/_posts/":["/posts/2024-01-28-learndata-advanced.html","/posts/2023-10-07-clone-voice.html","/posts/2023-09-05-virtual_positioning.html","/posts/2023-03-31-efficient_morning_5am_club.html","/posts/2023-02-27-chatgpt_shortcuts.html","/posts/2023-01-26-whiteboard_gtd.html","/posts/2022-11-18-whisper_ai_subtitles.html","/posts/2022-11-03-ffmpeg_screen_recording.html","/posts/2022-09-05-stable_diffusion_ai_painting.html","/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/posts/2022-06-07-blog_md_to_wordpress.html","/posts/2022-05-22-surveillance_video_for_myself.html","/posts/2022-04-21-uivision_rpa.html","/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/posts/2022-03-17-rss_persistent_link_collection.html","/posts/2022-03-09-lenovo_black_card_member.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-12-17-weight_log.html","/posts/2020-11-27-rime_input.html","/posts/2020-11-01-gym_equipment_throw_away.html","/posts/2020-09-22-uefi_asus_board.html","/posts/2020-10-25-dpc_watchdog_violation.html","/posts/2020-09-13-wifi_speed_up.html","/posts/2020-03-25-rsshub_on_vps.html","/posts/2019-10-04-fake_aka_hospital_skin_care_products.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-03-06-no_more_dinner.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","/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/posts/2022-08-10-new_stuff_shaping_machine.html"],"/services/dockers-on-nas/":["emby","xiaoya","navidrome","mt-photos","qbittorrent","reader","tachidesk","syncthing","nextcloud","alist","stirling-pdf","paperless-ngx","grocy","memos","grampsjs","n8n","uptime-kuma","srs-stack","qinglong","homarr","sun-panel","flare","reverse-proxy","deeplx","docsify","gitlab","cors-anywhere"],"/family/baby/":["birthing","newborn","take-kids-out"]}},7192:(t,e,n)=>{n.d(e,{P:()=>o});const o={GitHub:'',Zhihu:'',少数派:'\n\n\n\n\t\n\t\n\n\n',Wechat:'',Email:'',Discord:'',RSS:''}}},t=>{t.O(0,[7328,3256],(()=>(5388,t(t.s=5388)))),t.O()}]); \ No newline at end of file diff --git a/assets/js/app.47f59864.js b/assets/js/app.47f59864.js new file mode 100644 index 000000000..5d71d930f --- /dev/null +++ b/assets/js/app.47f59864.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3524],{2798:(t,e,n)=>{n.d(e,{l:()=>o});const o={category:{"/":{path:"/category/",map:{工具:{path:"/category/工具/",indexes:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]},自动化:{path:"/category/自动化/",indexes:[25,26,27,28,29,30,31,32,33]},系统:{path:"/category/系统/",indexes:[34,35,36,37,38,39,40,41]},网络:{path:"/category/网络/",indexes:[42,43,44,45,46,47,48]},服务器:{path:"/category/服务器/",indexes:[49,50]},健康:{path:"/category/健康/",indexes:[51,52]},博客:{path:"/category/博客/",indexes:[53,54,55,56,57,58,59]},购物:{path:"/category/购物/",indexes:[60,61,62,63]},头脑驿站:{path:"/category/头脑驿站/",indexes:[64,54,65,66]},观察随笔:{path:"/category/观察随笔/",indexes:[67,68]}}}},tag:{"/":{path:"/tag/",map:{微信:{path:"/tag/微信/",indexes:[24]},rss:{path:"/tag/rss/",indexes:[26,27,28,29,31,32,33]},Feed43:{path:"/tag/feed43/",indexes:[33]},FeedEx:{path:"/tag/feedex/",indexes:[33]},office:{path:"/tag/office/",indexes:[41]},OneNote:{path:"/tag/onenote/",indexes:[40]},关机:{path:"/tag/关机/",indexes:[39]},smb:{path:"/tag/smb/",indexes:[38]},光猫:{path:"/tag/光猫/",indexes:[46,47,48]},CDN:{path:"/tag/cdn/",indexes:[50]},建站:{path:"/tag/建站/",indexes:[54,58,59,49,50]},Huginn:{path:"/tag/huginn/",indexes:[31,32]},减肥:{path:"/tag/减肥/",indexes:[51,52]},宝塔面板:{path:"/tag/宝塔面板/",indexes:[49]},Jekyll:{path:"/tag/jekyll/",indexes:[56,57,58,59]},Github:{path:"/tag/github/",indexes:[59]},"Travis CI":{path:"/tag/travis-ci/",indexes:[57]},Docker:{path:"/tag/docker/",indexes:[16,57]},Audition:{path:"/tag/audition/",indexes:[23]},音频:{path:"/tag/音频/",indexes:[23]},Aria2:{path:"/tag/aria2/",indexes:[22]},迅雷:{path:"/tag/迅雷/",indexes:[22]},Airtable:{path:"/tag/airtable/",indexes:[21]},GP1700:{path:"/tag/gp1700/",indexes:[46]},koolproxy:{path:"/tag/koolproxy/",indexes:[45]},IPTV:{path:"/tag/iptv/",indexes:[44]},语音输入:{path:"/tag/语音输入/",indexes:[30]},OpenVPN:{path:"/tag/openvpn/",indexes:[43]},内网穿透:{path:"/tag/内网穿透/",indexes:[43]},RSSHub:{path:"/tag/rsshub/",indexes:[28,29]},scrcpy:{path:"/tag/scrcpy/",indexes:[20]},投屏:{path:"/tag/投屏/",indexes:[20]},化妆品:{path:"/tag/化妆品/",indexes:[63]},WIFI:{path:"/tag/wifi/",indexes:[42]},主板:{path:"/tag/主板/",indexes:[37]},蓝屏:{path:"/tag/蓝屏/",indexes:[36]},断舍离:{path:"/tag/断舍离/",indexes:[62]},健身器材:{path:"/tag/健身器材/",indexes:[60,62]},小狼毫:{path:"/tag/小狼毫/",indexes:[19]},输入法:{path:"/tag/输入法/",indexes:[19]},KeePass:{path:"/tag/keepass/",indexes:[18]},WordPress:{path:"/tag/wordpress/",indexes:[55,56]},原则:{path:"/tag/原则/",indexes:[66]},批评与自我批评:{path:"/tag/批评与自我批评/",indexes:[66]},nas:{path:"/tag/nas/",indexes:[27]},微信红包:{path:"/tag/微信红包/",indexes:[17]},"Microsoft store":{path:"/tag/microsoft-store/",indexes:[35]},联想:{path:"/tag/联想/",indexes:[61]},winget:{path:"/tag/winget/",indexes:[34]},winstall:{path:"/tag/winstall/",indexes:[34]},幸存者偏差:{path:"/tag/幸存者偏差/",indexes:[68]},疫情:{path:"/tag/疫情/",indexes:[68]},浏览器插件:{path:"/tag/浏览器插件/",indexes:[25]},"UI.Vision":{path:"/tag/ui.vision/",indexes:[25]},RPA:{path:"/tag/rpa/",indexes:[25]},录屏:{path:"/tag/录屏/",indexes:[15,65]},自我管理:{path:"/tag/自我管理/",indexes:[65]},blog:{path:"/tag/blog/",indexes:[55]},github:{path:"/tag/github/",indexes:[55]},VuePress:{path:"/tag/vuepress/",indexes:[54]},AI:{path:"/tag/ai/",indexes:[3,5,14,16]},"Stable Diffusion":{path:"/tag/stable-diffusion/",indexes:[16]},媒体:{path:"/tag/媒体/",indexes:[67]},Whisper:{path:"/tag/whisper/",indexes:[14]},字幕:{path:"/tag/字幕/",indexes:[14]},白板:{path:"/tag/白板/",indexes:[6]},GTD:{path:"/tag/gtd/",indexes:[6]},ChatGPT:{path:"/tag/chatgpt/",indexes:[5]},时间:{path:"/tag/时间/",indexes:[64]},工作流:{path:"/tag/工作流/",indexes:[64]},虚拟定位:{path:"/tag/虚拟定位/",indexes:[4]},VITS:{path:"/tag/vits/",indexes:[3]},声音克隆:{path:"/tag/声音克隆/",indexes:[3]},games:{path:"/tag/games/",indexes:[2]},直播:{path:"/tag/直播/",indexes:[7,8,9,10,11,12,13]},OBS:{path:"/tag/obs/",indexes:[8,9,10]}}}}}},8589:(t,e,n)=>{n.d(e,{M:()=>o});const o=["/apps/devdocs/json-translate.html","/apps/tutorials/feishu.html","/posts/2023-10-29-switch-firmware-updates.html","/posts/2023-10-07-clone-voice.html","/posts/2023-09-05-virtual_positioning.html","/posts/2023-02-27-chatgpt_shortcuts.html","/posts/2023-01-26-whiteboard_gtd.html","/apps/livestreaming/0_live_equipments.html","/apps/livestreaming/1_obs_basic.html","/apps/livestreaming/2_obs_streamfx.html","/apps/livestreaming/3_obs_plugins.html","/apps/livestreaming/4_live_effects.html","/apps/livestreaming/5_live_platforms.html","/apps/livestreaming/6_live_positioning.html","/posts/2022-11-18-whisper_ai_subtitles.html","/posts/2022-11-03-ffmpeg_screen_recording.html","/posts/2022-09-05-stable_diffusion_ai_painting.html","/posts/2022-01-23-wechat_lucky_money_cover.html","/posts/2021-01-02-keepass_the_real_lastpassword.html","/posts/2020-11-27-rime_input.html","/posts/2019-08-26-scrcpy_screen_projection.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/2017-04-18-wechat_multi_open.html","/posts/2022-04-21-uivision_rpa.html","/posts/2022-03-17-rss_persistent_link_collection.html","/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/posts/2020-03-25-rsshub_on_vps.html","/posts/2019-04-01-rsshub_noob.html","/posts/2018-12-28-voice_input_try.html","/posts/2018-10-07-huginn_scraping_any_website.html","/posts/2018-01-31-hire_a_robot.html","/posts/2017-04-22-rss_feed43_feedex.html","/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/posts/2022-02-19-microsoft_store_fixed.html","/posts/2020-10-25-dpc_watchdog_violation.html","/posts/2020-09-22-uefi_asus_board.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/2020-09-13-wifi_speed_up.html","/posts/2019-03-31-openvpn_back_to_home.html","/posts/2018-06-19-iptv_direckly.html","/posts/2018-06-10-koolproxy_https.html","/posts/2018-06-08-baizhuo_gp1700.html","/posts/2017-10-18-light_cat_port_forwarding.html","/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/posts/2018-04-30-baota_deploy_vps.html","/posts/2018-01-19-forget_the_cdn.html","/posts/2020-12-17-weight_log.html","/posts/2018-03-06-no_more_dinner.html","/posts/2024-01-28-learndata-advanced.html","/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/posts/2022-06-07-blog_md_to_wordpress.html","/posts/2021-01-27-blog_jekyll_to_wordpress.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/2022-08-10-new_stuff_shaping_machine.html","/posts/2022-03-09-lenovo_black_card_member.html","/posts/2020-11-01-gym_equipment_throw_away.html","/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","/posts/2023-03-31-efficient_morning_5am_club.html","/posts/2022-05-22-surveillance_video_for_myself.html","/posts/2021-05-31-principles_criticism_and_self-criticism.html","/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html"]},594:(t,e,n)=>{n.d(e,{U:()=>o});const o={article:{"/":{path:"/article/",indexes:[53,0,1,2,3,4,64,5,6,7,8,9,10,11,12,13,14,15,67,16,54,60,55,65,25,68,34,26,61,35,17,27,66,56,18,51,19,62,36,37,42,28,63,20,29,43,30,31,44,45,46,21,22,23,57,58,59,49,52,32,50,47,48,38,39,40,41,33,24]}},star:{"/":{path:"/star/",indexes:[36,20,22]}},timeline:{"/":{path:"/timeline/",indexes:[53,0,1,2,3,4,64,5,6,7,8,9,10,11,12,13,14,15,67,16,54,60,55,65,25,68,34,26,61,35,17,27,66,56,18,51,19,62,36,37,42,28,63,20,29,43,30,31,44,45,46,21,22,23,57,58,59,49,52,32,50,47,48,38,39,40,41,33,24]}}}},6805:(t,e,n)=>{n.d(e,{B:()=>B});var o=n(3151),s=n(8981),i=n(5670),a=n(3095),l=n(1136),p=n(5420),r=n(4322);const d=(0,o.re)({enhance:({app:t})=>{(0,s.L4)("FontIcon")||t.component("FontIcon",a.A),(0,s.L4)("Badge")||t.component("Badge",l.A),(0,s.L4)("BiliBili")||t.component("BiliBili",p.A),(0,s.L4)("VidStack")||t.component("VidStack",r.A)},setup:()=>{(0,i.vCw)(' @import url("https://at.alicdn.com/t/c/font_2410206_5vb9zlyghj.css");\n ')},rootComponents:[]});var h=n(4102),m=n(337),g=n(5212),c=n(9090),_=n(4654),b=n(9350),u=n(6254),f=n(7994),y=n(6210);const w=(0,o.re)({enhance:({app:t})=>{},setup:()=>{(0,y.n)()}});var v=n(2457),k=n(1557),x=n(6908),S=n(4232),O=n(7847),A=n(5183);(0,S.M_)((t=>{const e=t.t,n=!1!==t.I,o=t.i;return n?{title:e,content:o?()=>[(0,O.h)(x.GB,{icon:o}),e]:null,order:t.O,index:t.I}:null}));const E=(0,o.re)({enhance:({app:t,router:e})=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=async(...t)=>(await(0,x.MK)().wait(),n(...t)),(0,x.fk)(t),t.component("HopeIcon",x.GB),t.component("BloggerInfo",A.tI)},setup:()=>{(0,x.PV)(),(0,x.i$)(),(0,A.su)()},layouts:{Layout:x.PE,NotFound:x.Mk,BlogCategory:A.Pn,BlogHome:A.qX,BlogType:A.z7,Timeline:A.Kf}});var I=n(2443);const P=(0,O.pM)({name:"SocialLink",setup:()=>()=>(0,O.h)("div",{class:"nav-item vp-repo"},(0,O.h)("a",{class:"vp-repo-link",href:"https://discord.gg/PZTQfJ4GjX",target:"_blank",rel:"noopener noreferrer","aria-label":"discord",innerHTML:''}))}),z=(0,o.re)({enhance:({app:t})=>{t.component("SocialLink",P)}}),B=[{},d,h.A,m.A,g.A,c.A,_.A,b.A,u.A,f.A,w,v.A,k.A,E,I.A,z]},6159:(t,e,n)=>{n.d(e,{J:()=>s,c:()=>o});const o=JSON.parse('{"/_posts/2017-04-18-wechat_multi_open.html":"/posts/2017-04-18-wechat_multi_open.html","/_posts/2017-04-18-wechat_multi_open.md":"/posts/2017-04-18-wechat_multi_open.html","/_posts/2017-04-22-rss_feed43_feedex.html":"/posts/2017-04-22-rss_feed43_feedex.html","/_posts/2017-04-22-rss_feed43_feedex.md":"/posts/2017-04-22-rss_feed43_feedex.html","/_posts/2017-07-28-office_2016_installer_error.html":"/posts/2017-07-28-office_2016_installer_error.html","/_posts/2017-07-28-office_2016_installer_error.md":"/posts/2017-07-28-office_2016_installer_error.html","/_posts/2017-07-29-onenote_2016_cannot_be_logged_in.html":"/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","/_posts/2017-07-29-onenote_2016_cannot_be_logged_in.md":"/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","/_posts/2017-09-02-forced_shutdown.html":"/posts/2017-09-02-forced_shutdown.html","/_posts/2017-09-02-forced_shutdown.md":"/posts/2017-09-02-forced_shutdown.html","/_posts/2017-09-03-smb_lan_sharing.html":"/posts/2017-09-03-smb_lan_sharing.html","/_posts/2017-09-03-smb_lan_sharing.md":"/posts/2017-09-03-smb_lan_sharing.html","/_posts/2017-10-18-light_cat_e8-c-epon_admin.html":"/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/_posts/2017-10-18-light_cat_e8-c-epon_admin.md":"/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/_posts/2017-10-18-light_cat_port_forwarding.html":"/posts/2017-10-18-light_cat_port_forwarding.html","/_posts/2017-10-18-light_cat_port_forwarding.md":"/posts/2017-10-18-light_cat_port_forwarding.html","/_posts/2018-01-19-forget_the_cdn.html":"/posts/2018-01-19-forget_the_cdn.html","/_posts/2018-01-19-forget_the_cdn.md":"/posts/2018-01-19-forget_the_cdn.html","/_posts/2018-01-31-hire_a_robot.html":"/posts/2018-01-31-hire_a_robot.html","/_posts/2018-01-31-hire_a_robot.md":"/posts/2018-01-31-hire_a_robot.html","/_posts/2018-03-06-no_more_dinner.html":"/posts/2018-03-06-no_more_dinner.html","/_posts/2018-03-06-no_more_dinner.md":"/posts/2018-03-06-no_more_dinner.html","/_posts/2018-04-30-baota_deploy_vps.html":"/posts/2018-04-30-baota_deploy_vps.html","/_posts/2018-04-30-baota_deploy_vps.md":"/posts/2018-04-30-baota_deploy_vps.html","/_posts/2018-05-01-jekyll_blog_on_github_pages.html":"/posts/2018-05-01-jekyll_blog_on_github_pages.html","/_posts/2018-05-01-jekyll_blog_on_github_pages.md":"/posts/2018-05-01-jekyll_blog_on_github_pages.html","/_posts/2018-05-02-jekyll_blog_on_vps.html":"/posts/2018-05-02-jekyll_blog_on_vps.html","/_posts/2018-05-02-jekyll_blog_on_vps.md":"/posts/2018-05-02-jekyll_blog_on_vps.html","/_posts/2018-05-03-jekyll_blog_autodeploy.html":"/posts/2018-05-03-jekyll_blog_autodeploy.html","/_posts/2018-05-03-jekyll_blog_autodeploy.md":"/posts/2018-05-03-jekyll_blog_autodeploy.html","/_posts/2018-05-04-audition_cut_mp3.html":"/posts/2018-05-04-audition_cut_mp3.html","/_posts/2018-05-04-audition_cut_mp3.md":"/posts/2018-05-04-audition_cut_mp3.html","/_posts/2018-05-15-aria2_a_new_download_tool.html":"/posts/2018-05-15-aria2_a_new_download_tool.html","/_posts/2018-05-15-aria2_a_new_download_tool.md":"/posts/2018-05-15-aria2_a_new_download_tool.html","/_posts/2018-05-24-airtable_noob.html":"/posts/2018-05-24-airtable_noob.html","/_posts/2018-05-24-airtable_noob.md":"/posts/2018-05-24-airtable_noob.html","/_posts/2018-06-08-baizhuo_gp1700.html":"/posts/2018-06-08-baizhuo_gp1700.html","/_posts/2018-06-08-baizhuo_gp1700.md":"/posts/2018-06-08-baizhuo_gp1700.html","/_posts/2018-06-10-koolproxy_https.html":"/posts/2018-06-10-koolproxy_https.html","/_posts/2018-06-10-koolproxy_https.md":"/posts/2018-06-10-koolproxy_https.html","/_posts/2018-06-19-iptv_direckly.html":"/posts/2018-06-19-iptv_direckly.html","/_posts/2018-06-19-iptv_direckly.md":"/posts/2018-06-19-iptv_direckly.html","/_posts/2018-10-07-huginn_scraping_any_website.html":"/posts/2018-10-07-huginn_scraping_any_website.html","/_posts/2018-10-07-huginn_scraping_any_website.md":"/posts/2018-10-07-huginn_scraping_any_website.html","/_posts/2018-12-28-voice_input_try.html":"/posts/2018-12-28-voice_input_try.html","/_posts/2018-12-28-voice_input_try.md":"/posts/2018-12-28-voice_input_try.html","/_posts/2019-03-31-openvpn_back_to_home.html":"/posts/2019-03-31-openvpn_back_to_home.html","/_posts/2019-03-31-openvpn_back_to_home.md":"/posts/2019-03-31-openvpn_back_to_home.html","/_posts/2019-04-01-rsshub_noob.html":"/posts/2019-04-01-rsshub_noob.html","/_posts/2019-04-01-rsshub_noob.md":"/posts/2019-04-01-rsshub_noob.html","/_posts/2019-08-26-scrcpy_screen_projection.html":"/posts/2019-08-26-scrcpy_screen_projection.html","/_posts/2019-08-26-scrcpy_screen_projection.md":"/posts/2019-08-26-scrcpy_screen_projection.html","/_posts/2019-10-04-fake_aka_hospital_skin_care_products.html":"/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","/_posts/2019-10-04-fake_aka_hospital_skin_care_products.md":"/posts/2019-10-04-fake_aka_hospital_skin_care_products.html","/_posts/2020-03-25-rsshub_on_vps.html":"/posts/2020-03-25-rsshub_on_vps.html","/_posts/2020-03-25-rsshub_on_vps.md":"/posts/2020-03-25-rsshub_on_vps.html","/_posts/2020-09-13-wifi_speed_up.html":"/posts/2020-09-13-wifi_speed_up.html","/_posts/2020-09-13-wifi_speed_up.md":"/posts/2020-09-13-wifi_speed_up.html","/_posts/2020-09-22-uefi_asus_board.html":"/posts/2020-09-22-uefi_asus_board.html","/_posts/2020-09-22-uefi_asus_board.md":"/posts/2020-09-22-uefi_asus_board.html","/_posts/2020-10-25-dpc_watchdog_violation.html":"/posts/2020-10-25-dpc_watchdog_violation.html","/_posts/2020-10-25-dpc_watchdog_violation.md":"/posts/2020-10-25-dpc_watchdog_violation.html","/_posts/2020-11-01-gym_equipment_throw_away.html":"/posts/2020-11-01-gym_equipment_throw_away.html","/_posts/2020-11-01-gym_equipment_throw_away.md":"/posts/2020-11-01-gym_equipment_throw_away.html","/_posts/2020-11-27-rime_input.html":"/posts/2020-11-27-rime_input.html","/_posts/2020-11-27-rime_input.md":"/posts/2020-11-27-rime_input.html","/_posts/2020-12-17-weight_log.html":"/posts/2020-12-17-weight_log.html","/_posts/2020-12-17-weight_log.md":"/posts/2020-12-17-weight_log.html","/_posts/2021-01-02-keepass_the_real_lastpassword.html":"/posts/2021-01-02-keepass_the_real_lastpassword.html","/_posts/2021-01-02-keepass_the_real_lastpassword.md":"/posts/2021-01-02-keepass_the_real_lastpassword.html","/_posts/2021-01-27-blog_jekyll_to_wordpress.html":"/posts/2021-01-27-blog_jekyll_to_wordpress.html","/_posts/2021-01-27-blog_jekyll_to_wordpress.md":"/posts/2021-01-27-blog_jekyll_to_wordpress.html","/_posts/2021-05-31-principles_criticism_and_self-criticism.html":"/posts/2021-05-31-principles_criticism_and_self-criticism.html","/_posts/2021-05-31-principles_criticism_and_self-criticism.md":"/posts/2021-05-31-principles_criticism_and_self-criticism.html","/_posts/2021-10-23-nas_with_rsshub_and_huginn.html":"/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/_posts/2021-10-23-nas_with_rsshub_and_huginn.md":"/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/_posts/2022-01-23-wechat_lucky_money_cover.html":"/posts/2022-01-23-wechat_lucky_money_cover.html","/_posts/2022-01-23-wechat_lucky_money_cover.md":"/posts/2022-01-23-wechat_lucky_money_cover.html","/_posts/2022-02-19-microsoft_store_fixed.html":"/posts/2022-02-19-microsoft_store_fixed.html","/_posts/2022-02-19-microsoft_store_fixed.md":"/posts/2022-02-19-microsoft_store_fixed.html","/_posts/2022-03-09-lenovo_black_card_member.html":"/posts/2022-03-09-lenovo_black_card_member.html","/_posts/2022-03-09-lenovo_black_card_member.md":"/posts/2022-03-09-lenovo_black_card_member.html","/_posts/2022-03-17-rss_persistent_link_collection.html":"/posts/2022-03-17-rss_persistent_link_collection.html","/_posts/2022-03-17-rss_persistent_link_collection.md":"/posts/2022-03-17-rss_persistent_link_collection.html","/_posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html":"/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/_posts/2022-03-21-winget_the_strongest_software_manager_for_windows.md":"/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/_posts/2022-04-20-survivorship_bias_in_shanghai_2022.html":"/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","/_posts/2022-04-20-survivorship_bias_in_shanghai_2022.md":"/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","/_posts/2022-04-21-uivision_rpa.html":"/posts/2022-04-21-uivision_rpa.html","/_posts/2022-04-21-uivision_rpa.md":"/posts/2022-04-21-uivision_rpa.html","/_posts/2022-05-22-surveillance_video_for_myself.html":"/posts/2022-05-22-surveillance_video_for_myself.html","/_posts/2022-05-22-surveillance_video_for_myself.md":"/posts/2022-05-22-surveillance_video_for_myself.html","/_posts/2022-06-07-blog_md_to_wordpress.html":"/posts/2022-06-07-blog_md_to_wordpress.html","/_posts/2022-06-07-blog_md_to_wordpress.md":"/posts/2022-06-07-blog_md_to_wordpress.html","/_posts/2022-08-10-new_stuff_shaping_machine.html":"/posts/2022-08-10-new_stuff_shaping_machine.html","/_posts/2022-08-10-new_stuff_shaping_machine.md":"/posts/2022-08-10-new_stuff_shaping_machine.html","/_posts/2022-08-22-learndata_blog_to_knowledge_management.html":"/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/_posts/2022-08-22-learndata_blog_to_knowledge_management.md":"/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/_posts/2022-09-05-stable_diffusion_ai_painting.html":"/posts/2022-09-05-stable_diffusion_ai_painting.html","/_posts/2022-09-05-stable_diffusion_ai_painting.md":"/posts/2022-09-05-stable_diffusion_ai_painting.html","/_posts/2022-09-07-extreme_branding_thinking_with_mate50.html":"/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/_posts/2022-09-07-extreme_branding_thinking_with_mate50.md":"/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/_posts/2022-11-03-ffmpeg_screen_recording.html":"/posts/2022-11-03-ffmpeg_screen_recording.html","/_posts/2022-11-03-ffmpeg_screen_recording.md":"/posts/2022-11-03-ffmpeg_screen_recording.html","/_posts/2022-11-18-whisper_ai_subtitles.html":"/posts/2022-11-18-whisper_ai_subtitles.html","/_posts/2022-11-18-whisper_ai_subtitles.md":"/posts/2022-11-18-whisper_ai_subtitles.html","/_posts/2023-01-26-whiteboard_gtd.html":"/posts/2023-01-26-whiteboard_gtd.html","/_posts/2023-01-26-whiteboard_gtd.md":"/posts/2023-01-26-whiteboard_gtd.html","/_posts/2023-02-27-chatgpt_shortcuts.html":"/posts/2023-02-27-chatgpt_shortcuts.html","/_posts/2023-02-27-chatgpt_shortcuts.md":"/posts/2023-02-27-chatgpt_shortcuts.html","/_posts/2023-03-31-efficient_morning_5am_club.html":"/posts/2023-03-31-efficient_morning_5am_club.html","/_posts/2023-03-31-efficient_morning_5am_club.md":"/posts/2023-03-31-efficient_morning_5am_club.html","/_posts/2023-09-05-virtual_positioning.html":"/posts/2023-09-05-virtual_positioning.html","/_posts/2023-09-05-virtual_positioning.md":"/posts/2023-09-05-virtual_positioning.html","/_posts/2023-10-07-clone-voice.html":"/posts/2023-10-07-clone-voice.html","/_posts/2023-10-07-clone-voice.md":"/posts/2023-10-07-clone-voice.html","/_posts/2023-10-29-switch-firmware-updates.html":"/posts/2023-10-29-switch-firmware-updates.html","/_posts/2023-10-29-switch-firmware-updates.md":"/posts/2023-10-29-switch-firmware-updates.html","/_posts/2024-01-28-learndata-advanced.html":"/posts/2024-01-28-learndata-advanced.html","/_posts/2024-01-28-learndata-advanced.md":"/posts/2024-01-28-learndata-advanced.html"}'),s=Object.fromEntries([["/DailyRoutine.html",{loader:()=>n.e(535).then(n.bind(n,6740)),meta:{y:"p",t:"每日仪式",i:"check"}}],["/Fitness.html",{loader:()=>n.e(98).then(n.bind(n,9639)),meta:{y:"p",t:"健身计划",i:"strong"}}],["/",{loader:()=>n.e(4470).then(n.bind(n,5777)),meta:{y:"p",t:"LearnData 开源笔记",i:"note"}}],["/blog.html",{loader:()=>n.e(6632).then(n.bind(n,4254)),meta:{y:"h",t:"互联网小白",i:"home"}}],["/intro.html",{loader:()=>n.e(3912).then(n.bind(n,2484)),meta:{y:"p",t:"个人介绍",i:"any"}}],["/apps/Applist.html",{loader:()=>n.e(7481).then(n.bind(n,3702)),meta:{y:"p",t:"必备应用",i:"list",O:1}}],["/apps/ChatGPT.html",{loader:()=>n.e(7949).then(n.bind(n,2521)),meta:{y:"p",t:"ChatGPT",i:"creative",O:91}}],["/apps/Chrome.html",{loader:()=>n.e(2542).then(n.bind(n,4852)),meta:{y:"p",t:"Chrome 扩展",i:"chrome",O:3}}],["/apps/design.html",{loader:()=>n.e(4938).then(n.bind(n,2268)),meta:{y:"p",t:"平面设计",i:"pic",O:90}}],["/apps/toolbox.html",{loader:()=>n.e(3309).then(n.bind(n,8288)),meta:{y:"p",t:"开源工具",i:"float",O:2}}],["/code/AutoHotkey.html",{loader:()=>n.e(4541).then(n.bind(n,2379)),meta:{y:"p",t:"AutoHotkey",i:"linter",O:4}}],["/code/Electron.html",{loader:()=>n.e(3518).then(n.bind(n,790)),meta:{y:"p",t:"Electron",i:"layout",O:7}}],["/code/HTML.html",{loader:()=>n.e(7541).then(n.bind(n,5490)),meta:{y:"p",t:"HTML",i:"html",O:1}}],["/code/Javascript.html",{loader:()=>n.e(7480).then(n.bind(n,3121)),meta:{y:"p",t:"JavaScript",i:"javascript",O:2}}],["/code/Markdown.html",{loader:()=>n.e(3569).then(n.bind(n,8016)),meta:{y:"p",t:"Markdown",i:"markdown",O:5}}],["/code/Python.html",{loader:()=>n.e(3058).then(n.bind(n,7389)),meta:{y:"p",t:"Python",i:"python",O:3}}],["/code/",{loader:()=>n.e(4470).then(n.bind(n,3704)),meta:{y:"p",t:"Coding",i:"code"}}],["/code/Regex.html",{loader:()=>n.e(4429).then(n.bind(n,7460)),meta:{y:"p",t:"正则表达式",i:"regexp",O:6}}],["/code/Vue.html",{loader:()=>n.e(2302).then(n.bind(n,3537)),meta:{y:"p",t:"Vue",i:"vue",O:2}}],["/posts/2017-04-18-wechat_multi_open.html",{loader:()=>n.e(1989).then(n.bind(n,3993)),meta:{d:14924736e5,l:"2017年4月18日",c:["工具"],g:["微信"],e:"

    由于工作需要,我经常在电脑上同时登录多个微信账号。然而,微信规定一个客户端仅能登录一个账号,这导致我不得不同时使用 PC 端和网页版,显著降低了操作效率。随着「微信 For Windows」和「微信 UWP」版本的停用,我们曾依赖的多客户端策略变得几乎无效了。如果你之前安装了旧版的微信 UWP,好好珍惜吧。

    \n

    要在不使用第三方软件的情况下实现微信的多开,现在只能依赖微信自身的一个小漏洞。通过快速双击微信图标,可以实现多开。

    \n

    双击多开

    \n

    要开启多个微信,只需按住回车键,同时左键点击微信图标,点击次数决定了开启的微信数量。这个小技巧是@刘舒怡分享的:

    ",r:{minutes:2.59,words:778},y:"a",t:"跳过第三方软件,一步到位实现微信双开的秘密",O:-1}}],["/posts/2017-04-22-rss_feed43_feedex.html",{loader:()=>n.e(665).then(n.bind(n,5257)),meta:{d:149286564e4,l:"2017年4月22日",c:["自动化"],g:["rss","Feed43","FeedEx"],e:'

    迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。

    \n

    ► 开始烧制属于自己的 feed

    \n

    1. 进入网页

    \n

    FEED43 不需要注册,点击「Create your own feed」即可使用。

    \n
    ',r:{minutes:2.75,words:825},y:"a",t:"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源",O:-2}}],["/posts/2017-07-28-office_2016_installer_error.html",{loader:()=>n.e(4166).then(n.bind(n,4575)),meta:{d:150123972e4,l:"2017年7月28日",c:["系统"],g:["office"],e:'

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

    \n
    \n

    解决方法

    \n
      \n
    1. \n

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

      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

      在 C 盘建立安装组件:

      \n
        \n
      • 把安装包路径 \\groove.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • \n
      • 把安装包路径 \\proplus.ww\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0011-0000-1000-0000000FF1CE}-C
      • \n
      \n
    6. \n
    7. \n

      将需要的程序文件放入 MSOCache 路径\nMSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。\n如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      \n
        \n
      • Onenote 把安装包路径 \\onenote.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • \n
      • Access 把安装包路径 \\access.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0015-0804-1000-0000000FF1CE}-C
      • \n
      \n
    8. \n
    9. \n

      最后进入安装包运行 setup.exe 安装正常。

      \n
    10. \n
    ',r:{minutes:1.59,words:477},y:"a",t:"office 2016 安装程序报错解决办法",O:-3}}],["/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html",{loader:()=>n.e(4534).then(n.bind(n,5559)),meta:{d:150134154e4,l:"2017年7月29日",c:["系统"],g:["OneNote"],e:'

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    \n
    \n

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    \n
    ',r:{minutes:.51,words:153},y:"a",t:"OneNote 2016 无法登陆问题解决",O:-4}}],["/posts/2017-09-02-forced_shutdown.html",{loader:()=>n.e(5478).then(n.bind(n,5472)),meta:{d:150431268e4,l:"2017年9月2日",c:["系统"],g:["关机"],e:'

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

    \n

    手工操作

    \n
      \n
    1. \n

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

      \n
    2. \n
    3. \n

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

      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
    8. \n
    ',r:{minutes:2.65,words:794},y:"a",t:"电脑关机了,第二天一看确又开着的?让系统正常关机!",O:-5}}],["/posts/2017-09-03-smb_lan_sharing.html",{loader:()=>n.e(6968).then(n.bind(n,4959)),meta:{d:150447222e4,l:"2017年9月3日",c:["系统"],g:["smb"],e:'

    Windows 系统开启 SMB 协议:

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    ',r:{minutes:.89,words:268},y:"a",t:"加速 SMB 协议,让 PC 变身小型 NAS",O:-6}}],["/posts/2017-10-18-light_cat_e8-c-epon_admin.html",{loader:()=>n.e(955).then(n.bind(n,7905)),meta:{d:150835128e4,l:"2017年10月18日",c:["网络"],g:["光猫"],e:'

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

    \n

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

    \n

    破解测试环境

    \n

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

    \n

    光猫超级密码破解

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    ',r:{minutes:1.09,words:326},y:"a",t:"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)",O:-7}}],["/posts/2017-10-18-light_cat_port_forwarding.html",{loader:()=>n.e(4732).then(n.bind(n,9104)),meta:{d:1508364e6,l:"2017年10月18日",c:["网络"],g:["光猫"],e:'

    光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)

    \n

    光猫端口映射步骤:

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

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

      \n
      \n
      \n
    6. \n
    ',r:{minutes:.69,words:206},y:"a",t:"光猫改造 篇二:光猫 + 路由器,实现端口映射",O:-8}}],["/posts/2018-01-19-forget_the_cdn.html",{loader:()=>n.e(1582).then(n.bind(n,6504)),meta:{d:15163632e5,l:"2018年1月19日",c:["服务器"],g:["CDN","建站"],e:"
    \n

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

    \n
    \n

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

    ",r:{minutes:2.17,words:652},y:"a",t:"小型网站管理员,快放弃 CDN!",O:-9}}],["/posts/2018-01-31-hire_a_robot.html",{loader:()=>n.e(5900).then(n.bind(n,4865)),meta:{d:151743906e4,l:"2018年1月31日",c:["自动化"],g:["Huginn","rss"],e:"
    \n

    机器人会取代你工作!\n计算云会取代你工作!\nAI 会取代你的工作!

    \n
    \n

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

    \n

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

    \n

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

    \n

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

    ",r:{minutes:1.65,words:494},y:"a",t:"雇个机器人帮你干活",O:-10}}],["/posts/2018-03-06-no_more_dinner.html",{loader:()=>n.e(3759).then(n.bind(n,567)),meta:{d:152037396e4,l:"2018年3月6日",c:["健康"],g:["减肥"],e:"

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    \n

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    \n

    解决方案:

    \n
      \n
    1. \n

      增加运动:每天划船机 2 公里,后期再逐步加量

      \n
    2. \n
    3. \n

      调节饮食,多喝水不吃炸鸡

      \n
        \n
      • \n

        早餐:9 点,牛奶 + 麦片

        \n
      • \n
      • \n

        午餐:12 点,正常

        \n
      • \n
      • \n

        晚餐:4 点,晚餐后不再吃东西

        \n
      • \n
      \n
    4. \n
    ",r:{minutes:1.02,words:306},y:"a",t:"提早晚餐,饿死算逑",O:-11}}],["/posts/2018-04-30-baota_deploy_vps.html",{loader:()=>n.e(7722).then(n.bind(n,4328)),meta:{d:15250464e5,l:"2018年4月30日",c:["服务器"],g:["宝塔面板","建站"],e:'

    新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。

    \n

    国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。

    \n
    \n

    一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP

    \n
    \n
    宝塔面板界面图
    宝塔面板界面图
    ',r:{minutes:.78,words:234},y:"a",t:"新手建站神器 - 宝塔面板",O:-12}}],["/posts/2018-05-01-jekyll_blog_on_github_pages.html",{loader:()=>n.e(201).then(n.bind(n,4411)),meta:{d:15251328e5,l:"2018年5月1日",c:["博客"],g:["Jekyll","Github","建站"],e:'

    一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。

    \n

    偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。

    \n

    搭建流程

    \n
      \n
    1. \n

      注册并登录 Github

      \n
    2. \n
    3. \n

      选择一个喜欢的 Jekyll 模板, 进入对应的 Github 主页。我选了黄玄的 Hux Blog

      \n
    4. \n
    5. \n

      点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    9. \n

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

      \n
      \n
    10. \n
    11. \n

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

      \n
      \n
    12. \n
    ',r:{minutes:.89,words:268},y:"a",t:"Jekyll 篇一:3 分钟搭建 Github Pages 博客",O:-13}}],["/posts/2018-05-02-jekyll_blog_on_vps.html",{loader:()=>n.e(2213).then(n.bind(n,6764)),meta:{d:15252192e5,l:"2018年5月2日",c:["博客"],g:["Jekyll","建站"],e:'

    Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。

    \n

    Jekyll 环境官方安装指南

    \n
      \n
    1. \n

      使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

      \n
    2. \n
    3. \n

      安装 jekyll:gem install jekyll

      \n
    4. \n
    5. \n

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

      \n
    6. \n
    7. \n

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

      \n
    8. \n
    ',r:{minutes:.65,words:196},y:"a",t:"Jekyll 扩展篇:服务器搭建 Jekyll 博客",O:-14}}],["/posts/2018-05-03-jekyll_blog_autodeploy.html",{loader:()=>n.e(8365).then(n.bind(n,9402)),meta:{d:15253056e5,l:"2018年5月3日",c:["博客"],g:["Jekyll","Travis CI","Docker"],e:"

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

    \n

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

    ",r:{minutes:7.68,words:2303},y:"a",t:"Jekyll 篇二:自动部署服务器博客",O:-15}}],["/posts/2018-05-04-audition_cut_mp3.html",{loader:()=>n.e(1984).then(n.bind(n,808)),meta:{d:1525392e6,l:"2018年5月4日",c:["工具"],g:["Audition","音频"],e:'

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

    \n

    简易剪切流程

    \n
      \n
    1. \n

      在 Audition 中打开音频文件。

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

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

      \n
      \n
    6. \n
    7. \n

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

      \n
      \n
    8. \n
    9. \n

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

      \n
    10. \n
    ',r:{minutes:.85,words:256},y:"a",t:"怎么用 Adobe Audition 快速剪切音频?",O:-16}}],["/posts/2018-05-15-aria2_a_new_download_tool.html",{loader:()=>n.e(2707).then(n.bind(n,7899)),meta:{d:15263424e5,l:"2018年5月15日",c:["工具"],g:["Aria2","迅雷"],e:"

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

    \n

    但是,迅雷已经堕落

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

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

      \n
      \n
    • \n
    ",r:{minutes:7.06,words:2117},y:"a",t:"抛弃迅雷,Aria2 新手入门",O:-17}}],["/posts/2018-05-24-airtable_noob.html",{loader:()=>n.e(960).then(n.bind(n,6109)),meta:{d:152712e7,l:"2018年5月24日",c:["工具"],g:["Airtable"],e:'

    Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库

    \n

    之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。

    \n

    这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。

    \n

    建立空白 Airtable

    \n
      \n
    1. \n

      注册并登录 Airtable

      \n
    2. \n
    3. \n

      点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。\n

      \n
    4. \n
    5. \n

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

      \n
    6. \n
    7. \n

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

      \n
    8. \n
    9. \n

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

      \n
    10. \n
    ',r:{minutes:3.31,words:993},y:"a",t:"真· Airtable 3 分钟菜鸟入门",O:-18}}],["/posts/2018-06-08-baizhuo_gp1700.html",{loader:()=>n.e(88).then(n.bind(n,6835)),meta:{d:1528416e6,l:"2018年6月8日",c:["网络"],g:["GP1700","光猫"],e:'

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

    \n

    电信「网络管家」功能

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

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

    \n
      \n
    1. \n

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

      \n
      \n
    2. \n
    3. \n

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

      \n
      \n
    4. \n
    5. \n

      光猫内网穿透:当外网要访问局域网(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)。

      \n
      \n
    6. \n
    7. \n

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

      \n
    8. \n
    ',r:{minutes:1.3,words:391},y:"a",t:"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射",O:-19}}],["/posts/2018-06-10-koolproxy_https.html",{loader:()=>n.e(3834).then(n.bind(n,8918)),meta:{d:15285888e5,l:"2018年6月10日",c:["网络"],g:["koolproxy"],e:'
    \n

    注意

    \n

    KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。

    \n
    \n

    koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)

    \n

    为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。

    ',r:{minutes:.98,words:294},y:"a",t:"koolproxy 无法下载 https 证书?",O:-20}}],["/posts/2018-06-19-iptv_direckly.html",{loader:()=>n.e(2823).then(n.bind(n,8374)),meta:{d:15293664e5,l:"2018年6月19日",c:["网络"],g:["IPTV"],e:'

    随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。

    \n

    如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒,对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:电信公网疑似已屏蔽回放源 IP · Issue #28

    ',r:{minutes:2.26,words:679},y:"a",t:"客厅、书房、卧室,任意收看 IPTV 直播!",O:-21}}],["/posts/2018-10-07-huginn_scraping_any_website.html",{loader:()=>n.e(9022).then(n.bind(n,1309)),meta:{d:15388704e5,l:"2018年10月7日",c:["自动化"],g:["Huginn","rss"],e:"

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

    \n
      \n
    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • \n
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。
    • \n
    \n",r:{minutes:3.95,words:1185},y:"a",t:"RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)",O:-22}}],["/posts/2018-12-28-voice_input_try.html",{loader:()=>n.e(1088).then(n.bind(n,7486)),meta:{d:15459552e5,l:"2018年12月28日",c:["自动化"],g:["语音输入"],e:"

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    \n

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    \n

    讯飞 + 小麦克风

    \n

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    \n

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    \n

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    ",r:{minutes:6.53,words:1959},y:"a",t:"等了十年,PC 端能用的语音输入方案来了",O:-23}}],["/posts/2019-03-31-openvpn_back_to_home.html",{loader:()=>n.e(4026).then(n.bind(n,5912)),meta:{d:15539904e5,l:"2019年3月31日",c:["网络"],g:["OpenVPN","内网穿透"],e:'

    有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。

    \n

    内网穿透

    \n

    连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。

    \n

    梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。

    \n
    ',r:{minutes:1.39,words:416},y:"a",t:"OpenVPN 随时随地回家的路",O:-24}}],["/posts/2019-04-01-rsshub_noob.html",{loader:()=>n.e(3146).then(n.bind(n,3130)),meta:{d:15540768e5,l:"2019年4月1日",c:["自动化"],g:["rss","RSSHub"],e:'

    RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。

    \n

    RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网,便可定期获取主流媒体的 RSS 项目更新。

    \n
    ',r:{minutes:1.4,words:419},y:"a",t:"RSS 速成篇:RSSHub 捡现成的轮子",O:-25}}],["/posts/2019-08-26-scrcpy_screen_projection.html",{loader:()=>n.e(6762).then(n.bind(n,2955)),meta:{d:15667776e5,l:"2019年8月26日",c:["工具"],g:["scrcpy","投屏"],e:'

    scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。

    \n

    市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。

    \n

    本文以 Windows 投屏为例,可以前往官方站点下载 scrcpy-win64-v2.3.zip,或者使用国内搬运链接

    ',r:{minutes:5.55,words:1666},y:"a",t:"投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏",O:-26}}],["/posts/2019-10-04-fake_aka_hospital_skin_care_products.html",{loader:()=>n.e(1471).then(n.bind(n,7967)),meta:{d:15701472e5,l:"2019年10月4日",c:["购物"],g:["化妆品"],e:"

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    \n

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    \n

    协和

    \n

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    \n

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    ",r:{minutes:3.68,words:1103},y:"a",t:"这些「医院护肤品」你买了吗?",O:-27}}],["/posts/2020-03-25-rsshub_on_vps.html",{loader:()=>n.e(4552).then(n.bind(n,993)),meta:{d:15850944e5,l:"2020年3月25日",c:["自动化"],g:["rss","RSSHub"],e:'

    RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器

    \n

    新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。

    \n

    部署步骤

    \n
      \n
    1. \n

      将 RSSHub 代码下载到根目录 root,执行命令 git clone https://github.com/DIYgod/RSSHub.git

      \n
    2. \n
    3. \n

      安装宝塔面板,查看官方安装教程

      \n
    4. \n
    5. \n

      登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

      \n
      \n
    6. \n
    7. \n

      点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

      \n
      \n
    8. \n
    9. \n

      添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

      \n
      \n
    10. \n
    ',r:{minutes:2.3,words:689},y:"a",t:"RSS 速成篇 2:RSSHub 自部署",O:-28}}],["/posts/2020-09-13-wifi_speed_up.html",{loader:()=>n.e(7681).then(n.bind(n,554)),meta:{d:15999552e5,l:"2020年9月13日",c:["网络"],g:["WIFI"],e:"

    拖慢 WIFI 速度的最大元凶是无线信号合并

    \n

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    \n

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    \n

    无线模式

    \n

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    ",r:{minutes:2.08,words:623},y:"a",t:"无线路由调整,加快 WIFI 速度",O:-29}}],["/posts/2020-09-22-uefi_asus_board.html",{loader:()=>n.e(3121).then(n.bind(n,3189)),meta:{d:16007328e5,l:"2020年9月22日",c:["系统"],g:["主板"],e:'

    电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。

    \n

    电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。

    \n
    华硕主板设置截图
    ',r:{minutes:.73,words:218},y:"a",t:"「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案",O:-30}}],["/posts/2020-10-25-dpc_watchdog_violation.html",{loader:()=>n.e(8184).then(n.bind(n,7268)),meta:{d:1603584e6,l:"2020年10月25日",c:["系统"],g:["蓝屏"],e:'

    Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。

    \n

    导出蓝屏日志

    \n
      \n
    1. \n

      安装 WinDbg Preview,这是微软官方推出的系统调试工具。

      \n
    2. \n
    3. \n

      启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\\Windows\\Minidump,导出日志 *.dmp

      \n
    4. \n
    5. \n

      载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

      \n
      \n
    6. \n
    7. \n

      分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

      \n
      \n
    8. \n
    ',r:{minutes:5.48,words:1643},y:"a",t:"100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例",O:-30}}],["/posts/2020-11-01-gym_equipment_throw_away.html",{loader:()=>n.e(3986).then(n.bind(n,2884)),meta:{d:16041888e5,l:"2020年11月1日",c:["购物"],g:["断舍离","健身器材"],e:'

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    \n

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    \n

    划船机

    \n

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    \n
    ',r:{minutes:5.27,words:1580},y:"a",t:"这些全网卖爆的“必备”品,我劝你别买……",O:-31}}],["/posts/2020-11-27-rime_input.html",{loader:()=>n.e(5260).then(n.bind(n,7786)),meta:{d:16064352e5,l:"2020年11月27日",c:["工具"],g:["小狼毫","输入法"],e:'

    常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个键盘记录器

    \n

    之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。

    \n

    Rime 小狼毫输入法下载:官方渠道国内搬运

    ',r:{minutes:7.87,words:2361},y:"a",t:"小狼毫 3 分钟入门及进阶指南",O:-32}}],["/posts/2020-12-17-weight_log.html",{loader:()=>n.e(2013).then(n.bind(n,3215)),meta:{d:16081632e5,l:"2020年12月17日",c:["健康"],g:["减肥"],e:"

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    \n

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    \n

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    \n

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    ",r:{minutes:11.46,words:3439},y:"a",t:"减肥日志:4 周 15 斤",O:-33}}],["/posts/2021-01-02-keepass_the_real_lastpassword.html",{loader:()=>n.e(2658).then(n.bind(n,6975)),meta:{d:16095456e5,l:"2021年1月2日",c:["工具"],g:["KeePass"],e:"

    用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。

    \n

    之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。

    \n

    KeePass 的密码保存在本地的 .kdbx 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。

    ",r:{minutes:6.18,words:1855},y:"a",t:"抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件",O:-34}}],["/posts/2021-01-27-blog_jekyll_to_wordpress.html",{loader:()=>n.e(9544).then(n.bind(n,3822)),meta:{d:16117056e5,l:"2021年1月27日",c:["博客"],g:["Jekyll","WordPress"],e:"

    2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。

    \n

    2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。

    \n

    Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。

    ",r:{minutes:1.79,words:537},y:"a",t:"Jekyll 博客迁移-从 Markdown 到 WordPress",O:-35}}],["/posts/2021-05-31-principles_criticism_and_self-criticism.html",{loader:()=>n.e(8245).then(n.bind(n,6281)),meta:{d:16224192e5,l:"2021年5月31日",c:["头脑驿站"],g:["原则","批评与自我批评"],e:'

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    \n

    理论支撑

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评
    ',r:{minutes:6.6,words:1981},y:"a",t:"普通人的生活原则-批评与自我批评",O:-37}}],["/posts/2021-10-23-nas_with_rsshub_and_huginn.html",{loader:()=>n.e(3363).then(n.bind(n,5530)),meta:{d:16349472e5,l:"2021年10月23日",c:["自动化"],g:["nas","rss"],e:"

    作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时

    \n

    这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然而,由于配置过低,服务器频繁重启,维护成本不断上升。后来,我尝试了一些配置较高的国外服务器,例如 2 核 4G 低端服务器,但遇到了严重的超售和性能不稳定的问题。总的来说,购买国外的低端服务器(特别是俄罗斯服务器)就是把钱扔进水里。

    ",r:{minutes:6.74,words:2022},y:"a",t:"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS",O:-38}}],["/posts/2022-01-23-wechat_lucky_money_cover.html",{loader:()=>n.e(6077).then(n.bind(n,4376)),meta:{d:1642896e6,l:"2022年1月23日",c:["工具"],g:["微信红包"],e:'

    上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。

    \n

    春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。

    \n
    ',r:{minutes:2.48,words:744},y:"a",t:"想要独一无二的微信红包,你也可以自己做",O:-39}}],["/posts/2022-02-19-microsoft_store_fixed.html",{loader:()=>n.e(4130).then(n.bind(n,7640)),meta:{d:16452288e5,l:"2022年2月19日",c:["系统"],g:["Microsoft store"],e:'

    Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

    \n
    \n

    特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

    ',r:{minutes:1.27,words:380},y:"a",t:"Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11",O:-40}}],["/posts/2022-03-09-lenovo_black_card_member.html",{loader:()=>n.e(9740).then(n.bind(n,7074)),meta:{d:1646784e6,l:"2022年3月9日",c:["购物"],g:["联想"],e:"

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    \n

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    \n

    幻想着花了钱,就可以选自己理想的电脑。

    \n

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    \n
    \n

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    \n
    ",r:{minutes:1.53,words:458},y:"a",t:"联想黑金超核会员情报分享",O:-41}}],["/posts/2022-03-17-rss_persistent_link_collection.html",{loader:()=>n.e(4138).then(n.bind(n,8522)),meta:{d:16474752e5,l:"2022年3月17日",c:["自动化"],g:["rss"],e:'

    越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。

    \n

    如果有兴趣自己制作 RSS,可查看文章底部教程。

    \n

    每日热点

    \n

    整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。

    \n
      \n
    • \n

      百度实时热点https://rss.aishort.top/?type=baidu\n实时收录百度热搜内容,并显示热搜指数和简介。

      \n
      \n
    • \n
    • \n

      国内应急新闻https://rss.aishort.top/?type=cneb\n采集自国家应急广播,配合 rss 阅读器过滤,及时获取当地应急通知。

      \n
      \n
    • \n
    • \n

      瓦斯阅读https://rss.aishort.top/?type=wasi\n通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。

      \n
      \n
    • \n
    ',r:{minutes:1.93,words:580},y:"a",t:"RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效",O:-42}}],["/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html",{loader:()=>n.e(8458).then(n.bind(n,2528)),meta:{d:16478208e5,l:"2022年3月21日",c:["系统"],g:["winget","winstall"],e:"

    矿难、Win11、DDR5、40 显卡接踵而至,电脑更换的高峰期即将来临。可惜我的生产力工具等不了了,不得不 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配置完毕后,软件安装成为新的挑战。我常用的软件超过 60 个,以往需要逐一访问官网下载最新版本并单独安装,这既耗时又费力。

    \n

    我尝试过国内的软件管理器,它们支持批量下载,但安装和设置仍需逐个进行。此外,把软件系统的管理交给 360、金山或腾讯,你真的放心?相比之下,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,它们直接从官方来源下载应用,并支持一键批量静默安装,是快速部署程序的理想选择

    ",r:{minutes:5.21,words:1563},y:"a",t:"一键安装 99 个程序,Windows 最强软件管理器",O:-43}}],["/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html",{loader:()=>n.e(982).then(n.bind(n,6092)),meta:{d:16504128e5,l:"2022年4月20日",c:["观察随笔"],g:["幸存者偏差","疫情"],e:"

    够吃吗?还能买到东西吗?

    \n

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    \n

    但真是这样吗?我真的生活在「上海」吗?

    \n

    亲身体验 VS 网上「上海」

    \n

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    \n

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    ",r:{minutes:4.82,words:1447},y:"a",t:"上海没吃的?割裂的城市,我真的生活在上海吗?",O:-44}}],["/posts/2022-04-21-uivision_rpa.html",{loader:()=>n.e(2530).then(n.bind(n,9200)),meta:{d:16504992e5,l:"2022年4月21日",c:["自动化"],g:["浏览器插件","UI.Vision","RPA"],e:"
    \n

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    \n
    \n

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    \n

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    \n

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    \n

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    ",r:{minutes:5.59,words:1676},y:"a",t:"不想学 Python,零基础也能用的自动化工具-UI.Vision RPA",O:-45}}],["/posts/2022-05-22-surveillance_video_for_myself.html",{loader:()=>n.e(1946).then(n.bind(n,4986)),meta:{d:16531776e5,l:"2022年5月22日",c:["头脑驿站"],g:["录屏","自我管理"],e:"

    疫情封控两个月后,人变得愈发懒散,每天的成果只有吃饭睡觉。为了摆脱这种状态,我决定在书房对自己进行 24 小时的监控录像,督促自己提升效率。

    \n

    自我监控方案有两点需求:首先,软硬件必须在本地操作、储存,绝对不能联网;其次工作中途经常离开书房,回放时能跳过无人片段。

    \n

    寻找监控工具

    \n
      \n
    • 视频剪辑软件:自动识别长时间静止的画面,删除或加速相关视频帧。
    • \n
    • 录屏软件:带移动侦测功能,检测到人则开启录像,无人则自动暂停,无需联网就能使用。
    • \n
    • 播放软件:自动跳过超过 10s 的静止画面。
    • \n
    • 直连电脑的摄像机:不联网,不用 SD 卡将视频直接存储在电脑上。虽然萤石、小米有移动侦测功能,但视频需上传云端,风险过大。
    • \n
    ",r:{minutes:8.9,words:2669},y:"a",t:"疫情封控两个月后,我对自己开始 24 小时的自我监控录像",O:-46}}],["/posts/2022-06-07-blog_md_to_wordpress.html",{loader:()=>n.e(616).then(n.bind(n,1381)),meta:{d:165456e7,l:"2022年6月7日",c:["博客"],g:["blog","github","WordPress"],e:'

    博客探索

    \n

    2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​

    \n

    2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录转变到知识整理输出。Jekyll 方案需要首先在本地用 Markdown 编辑排版,然后同步到 github 发布,最后以 Markdown 格式手动分发到各个渠道。当文章较少时,这套方案的体验感特别好。​

    ',r:{minutes:9.37,words:2812},y:"a",t:"集自动发布、本地管理于一身:WordPress 博客管理方案分享",O:-47}}],["/posts/2022-08-10-new_stuff_shaping_machine.html",{loader:()=>n.e(5496).then(n.bind(n,9431)),meta:{d:16600896e5,l:"2022年8月10日",c:["购物"],g:["健身器材"],e:'

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    \n
    已闲置于墙角
    ',r:{minutes:2.83,words:848},y:"a",t:"新玩意|智能可折叠综合塑形机",O:-.01}}],["/posts/2022-08-22-learndata_blog_to_knowledge_management.html",{loader:()=>n.e(5845).then(n.bind(n,2091)),meta:{d:16611264e5,l:"2022年8月22日",c:["博客","头脑驿站"],g:["VuePress","建站"],e:"

    知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。

    \n

    这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。

    ",r:{minutes:10.14,words:3043},y:"a",t:"抛弃 Notion 知识管理软件的尝试:把博客变为知识库",O:-48}}],["/posts/2022-09-05-stable_diffusion_ai_painting.html",{loader:()=>n.e(9836).then(n.bind(n,9893)),meta:{d:1662336e6,l:"2022年9月5日",c:["工具"],g:["AI","Docker","Stable Diffusion"],e:'

    我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。

    \n
    丁老头进化旅程
    \n

    Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用 Stable Diffusion,你可以在拥有 6GB 显存显卡,16GB 内存或只依赖 CPU 的电脑上生成图像,并且仅需几秒钟的时间,无需进行预处理或后处理。

    ',r:{minutes:16.76,words:5027},y:"a",t:"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑",O:-49}}],["/posts/2022-09-07-extreme_branding_thinking_with_mate50.html",{loader:()=>n.e(5048).then(n.bind(n,2293)),meta:{d:16625088e5,l:"2022年9月7日",c:["观察随笔"],g:["媒体"],e:'

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    \n
    \n

    个人观察

    ',r:{minutes:4.4,words:1319},y:"a",t:"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?",O:-.02}}],["/posts/2022-11-03-ffmpeg_screen_recording.html",{loader:()=>n.e(8356).then(n.bind(n,1629)),meta:{d:16674336e5,l:"2022年11月3日",c:["工具"],g:["录屏"],e:'
    \n

    当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。

    \n
    \n

    开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。

    ',r:{minutes:10.37,words:3111},y:"a",t:"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg",O:-50}}],["/posts/2022-11-18-whisper_ai_subtitles.html",{loader:()=>n.e(4971).then(n.bind(n,9549)),meta:{d:16687296e5,l:"2022年11月18日",c:["工具"],g:["AI","Whisper","字幕"],e:"

    从大学开始,我看日剧十几年了,但是日语毫无进步,只能听懂几句耳熟能详的句子,看国外电影必须靠字幕组。我曾经想过学日语,报了暑期班,但成绩被七岁的小妹妹同学吊打。这让我被自己的语言能力说服了,认为这辈子都离不开字幕组。这种情况一直持续着,直到我测试视频剪辑工具 AutoCut 时遇到了 Whisper。

    \n

    Whisper 是今年 9 月被 OpenAI 开源的自动语音识别系统,除了可以用于语音识别,Whisper 还能实现多种语言的转录,并将这些语言翻译成英语。「语言识别」「转录」听起来很高级,但 transcribe(转录)指的是将语音转为文字,Whisper 会为音视频生成带时间轴的字幕文件,是支持 99 种语言 AI 字幕工具

    ",r:{minutes:12.12,words:3636},y:"a",t:"找不到字幕?Whisper 让不懂外语的你也能看懂日剧",O:-51}}],["/posts/2023-01-26-whiteboard_gtd.html",{loader:()=>n.e(9366).then(n.bind(n,8290)),meta:{d:16743456e5,l:"2023年1月22日",c:["工具"],g:["白板","GTD"],e:'
    \n

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

    \n
    \n

    在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

    \n
    Website Creator Cartoon
    源图:Storyset
    ',r:{minutes:4.86,words:1458},y:"a",t:"为什么我把日常任务放回墙上,而不是手机里?",O:-52}}],["/posts/2023-02-27-chatgpt_shortcuts.html",{loader:()=>n.e(3652).then(n.bind(n,2683)),meta:{d:1677456e6,l:"2023年2月27日",c:["工具"],g:["AI","ChatGPT"],e:'

    最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。

    \n

    ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 ChatGPT Prompt ExamplesAwesome ChatGPT PromptsLearn Prompting 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。

    ',r:{minutes:8.59,words:2577},y:"a",t:"为了帮你用好 ChatGPT,我做了一个「咒语库]",O:-53}}],["/posts/2023-03-31-efficient_morning_5am_club.html",{loader:()=>n.e(5974).then(n.bind(n,3791)),meta:{d:16802208e5,l:"2023年3月31日",c:["头脑驿站"],g:["时间","工作流"],e:"

    失眠问题已经困扰了我十年,尝试过各种方案,包括固定睡眠时间、冥想、食疗等,但均以失败告终。睡眠时间越来越晚,甚至到了凌晨 1-2 点才有睡意。偶然看到 Robin Sharma 的《The 5 AM Club》,提倡每天早上 5 点起床开始一天的工作。开始时我的第一感觉是「疯了」,因为对于我这样严重失眠的人来说,晚上 10 点睡觉已经是很难实现了,更何况早上 5 点起床呢?即使成功在 5 点起床,我又如何保证自己的状态?如何保证可以高效地学习和工作呢?但当时我正处于效率低谷,总是被其他事情干扰,作息时间完全被打乱。迷信理论的我,只能去相信它。因此,我结合心流理论制定了自己的「5AM Club」计划。

    ",r:{minutes:12.24,words:3671},y:"a",t:"从失眠到高效早晨:我的 5AM Club 计划分享",O:-54}}],["/posts/2023-09-05-virtual_positioning.html",{loader:()=>n.e(3753).then(n.bind(n,152)),meta:{d:1693872e6,l:"2023年9月5日",c:["工具"],g:["虚拟定位"],e:'
    \n

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    \n
    \n

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    \n

    虚拟定位

    \n
      \n
    1. \n

      首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

      \n
      \n
    2. \n
    3. \n

      在模拟器中打开要修改定位的应用,点击应用的定位图标。

      \n
      \n
    4. \n
    5. \n

      选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

      \n
      \n
    6. \n
    7. \n

      更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

      \n
    8. \n
    ',r:{minutes:2.26,words:677},y:"a",t:"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT",O:-55}}],["/posts/2023-10-07-clone-voice.html",{loader:()=>n.e(8106).then(n.bind(n,5922)),meta:{d:16966368e5,l:"2023年10月7日",c:["工具"],g:["AI","VITS","声音克隆"],e:"

    每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。

    \n

    你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。

    \n

    艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。

    ",r:{minutes:7.93,words:2379},y:"a",t:"别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌!",O:-56}}],["/posts/2023-10-29-switch-firmware-updates.html",{loader:()=>n.e(7085).then(n.bind(n,1567)),meta:{d:16985376e5,l:"2023年10月29日",c:["工具"],g:["games"],e:"

    家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。

    \n

    注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。

    \n

    以下是我进行升级的步骤:

    \n

    更新注入器

    \n

    首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。

    ",r:{minutes:6.18,words:1854},y:"a",t:"Switch 升级记录与资源汇编",O:-.03}}],["/posts/2024-01-28-learndata-advanced.html",{loader:()=>n.e(2705).then(n.bind(n,9939)),meta:{d:17064e8,l:"2024年1月28日",c:["博客"],e:'
    \n

    本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。

    \n
    \n

    自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。

    ',r:{minutes:6.18,words:1855},y:"a",t:"LearnData 博客:高效知识管理和进阶应用技巧",O:-57}}],["/deploy/CloudServices.html",{loader:()=>n.e(5219).then(n.bind(n,2301)),meta:{y:"p",t:"云计算服务",i:"class",O:2}}],["/deploy/Cloudflare.html",{loader:()=>n.e(6831).then(n.bind(n,3645)),meta:{y:"p",t:"Cloudflare",i:"proxy",O:5}}],["/deploy/DNS.html",{loader:()=>n.e(5377).then(n.bind(n,3016)),meta:{y:"p",t:"域名 DNS 托管",i:"sitemap",O:6}}],["/deploy/GitHub.html",{loader:()=>n.e(5744).then(n.bind(n,9258)),meta:{y:"p",t:"GitHub",i:"github",O:4}}],["/deploy/MySQL.html",{loader:()=>n.e(7204).then(n.bind(n,1720)),meta:{y:"p",t:"数据库管理",i:"mysql",O:3}}],["/deploy/Static.html",{loader:()=>n.e(7270).then(n.bind(n,4692)),meta:{y:"p",t:"静态部署",i:"generic",O:1}}],["/deploy/VPS.html",{loader:()=>n.e(4925).then(n.bind(n,1421)),meta:{y:"p",t:"服务器 VPS",i:"IO",O:3}}],["/family/Coupon.html",{loader:()=>n.e(486).then(n.bind(n,9605)),meta:{y:"p",t:"网购攻略",i:"free",O:3}}],["/family/Diet.html",{loader:()=>n.e(7930).then(n.bind(n,6962)),meta:{y:"p",t:"健康饮食",i:"enum",O:1}}],["/family/HomeAutomation.html",{loader:()=>n.e(1672).then(n.bind(n,681)),meta:{y:"p",t:"智能家居",i:"home",O:3.1}}],["/family/Life.html",{loader:()=>n.e(4474).then(n.bind(n,3587)),meta:{y:"p",t:"生活窍门",i:"creative",O:6}}],["/family/Maintenance.html",{loader:()=>n.e(1397).then(n.bind(n,5205)),meta:{y:"p",t:"维修/保养",i:"repair",O:5}}],["/family/Medical.html",{loader:()=>n.e(7217).then(n.bind(n,5268)),meta:{y:"p",t:"医疗药品",i:"like",O:4}}],["/family/Shoppinglist.html",{loader:()=>n.e(6640).then(n.bind(n,4498)),meta:{y:"p",t:"购物评价",i:"info",O:2}}],["/services/Docker.html",{loader:()=>n.e(20).then(n.bind(n,5482)),meta:{y:"p",t:"Docker",i:"any",O:2}}],["/services/Huginn.html",{loader:()=>n.e(5099).then(n.bind(n,4867)),meta:{y:"p",t:"Huginn",i:"customize",O:3}}],["/services/NAS.html",{loader:()=>n.e(5152).then(n.bind(n,6869)),meta:{y:"p",t:"NAS",i:"process",O:1}}],["/services/TTRSS.html",{loader:()=>n.e(7758).then(n.bind(n,1555)),meta:{y:"p",t:"Tiny Tiny RSS",i:"rss",O:4}}],["/web/Comments.html",{loader:()=>n.e(5218).then(n.bind(n,1850)),meta:{y:"p",t:"评论插件",i:"comment",O:3}}],["/web/VuePress.html",{loader:()=>n.e(1211).then(n.bind(n,276)),meta:{y:"p",t:"VuePress",i:"vue",O:1}}],["/web/docsify.html",{loader:()=>n.e(3689).then(n.bind(n,5470)),meta:{y:"p",t:"docsify",i:"edit",O:2}}],["/windows/NewSystem.html",{loader:()=>n.e(9973).then(n.bind(n,5355)),meta:{y:"p",t:"系统重装",i:"update",O:2}}],["/windows/faq.html",{loader:()=>n.e(6262).then(n.bind(n,1986)),meta:{y:"p",t:"Windows",i:"windows",O:1}}],["/windows/screen.html",{loader:()=>n.e(1944).then(n.bind(n,5933)),meta:{y:"p",t:"显示屏",i:"compare",O:3}}],["/apps/devdocs/json-translate.html",{loader:()=>n.e(5581).then(n.bind(n,3727)),meta:{d:1702944e6,l:"2023年12月19日",c:["工具"],e:'

    JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。

    \n
    ',r:{minutes:6.04,words:1813},y:"a",t:"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?",O:1}}],["/apps/livestreaming/0_live_equipments.html",{loader:()=>n.e(1871).then(n.bind(n,8528)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:"

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

    \n

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

    \n

    电脑

    \n

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

    \n

    补光灯

    \n

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

    ",r:{minutes:5.37,words:1611},y:"a",t:"直播入门攻略零 | 硬件篇:直播设备",O:.1}}],["/apps/livestreaming/1_obs_basic.html",{loader:()=>n.e(6029).then(n.bind(n,4222)),meta:{d:1673542527e3,c:["工具"],g:["OBS","直播"],e:'

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

    \n

    主界面

    \n

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

    ',r:{minutes:9.13,words:2739},y:"a",t:"直播入门攻略一 | OBS 篇:OBS 30 新手指南",O:1}}],["/apps/livestreaming/2_obs_streamfx.html",{loader:()=>n.e(1398).then(n.bind(n,1329)),meta:{d:1673542527e3,c:["工具"],g:["OBS","直播"],e:'

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

    \n

    安装 StreamFX

    \n

    访问 StreamFX 发布页,选择相应平台的安装包进行下载。如果你的 OBS 版本大于 28,则需按照 obs-StreamFX/BUILDING.md 中的说明手动构建测试版 StreamFX 插件,或者使用第三方构建包 MonoLogueChi/obs-StreamFX-build

    ',r:{minutes:5.13,words:1540},y:"a",t:"直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件",O:2}}],["/apps/livestreaming/3_obs_plugins.html",{loader:()=>n.e(6749).then(n.bind(n,2142)),meta:{d:1673542527e3,c:["工具"],g:["OBS","直播"],e:"

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

    \n

    插件安装与卸载

    \n

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

    \n

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

    ",r:{minutes:5.49,words:1646},y:"a",t:"直播入门攻略三 | 插件篇:OBS 进阶插件",O:3}}],["/apps/livestreaming/4_live_effects.html",{loader:()=>n.e(6586).then(n.bind(n,5325)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:'

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

    \n

    美颜

    \n

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

    \n

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

    ',r:{minutes:4.8,words:1439},y:"a",t:"直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播",O:4}}],["/apps/livestreaming/5_live_platforms.html",{loader:()=>n.e(5781).then(n.bind(n,6614)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:'

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

    \n

    淘宝直播

    \n
      \n
    1. \n

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

      \n
      淘宝直播设置
      \n
    2. \n
    3. \n

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

      \n
    4. \n
    ',r:{minutes:3.65,words:1094},y:"a",t:"直播入门攻略五 | 平台篇:主流直播平台介绍",O:5}}],["/apps/livestreaming/6_live_positioning.html",{loader:()=>n.e(3015).then(n.bind(n,6852)),meta:{d:1673542527e3,c:["工具"],g:["直播"],e:"

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

    \n

    直播定位

    \n

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

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

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

    ",r:{minutes:4.69,words:1406},y:"a",t:"直播入门攻略六 | 技巧篇:直播定位与策划",O:6}}],["/apps/tutorials/QTTabBar.html",{loader:()=>n.e(8685).then(n.bind(n,2373)),meta:{y:"p",t:"QTTabBar",O:101}}],["/apps/tutorials/feishu.html",{loader:()=>n.e(1734).then(n.bind(n,2232)),meta:{d:17022528e5,l:"2023年12月11日",c:["工具"],e:'

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    \n

    飞书文档

    \n

    知识库

    \n

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    \n
    ',r:{minutes:5.68,words:1704},y:"a",t:"飞书迁移记录",O:201}}],["/apps/tutorials/logseq.html",{loader:()=>n.e(1597).then(n.bind(n,847)),meta:{y:"p",t:"Logseq",O:1}}],["/apps/tutorials/obsidian.html",{loader:()=>n.e(9125).then(n.bind(n,3272)),meta:{y:"p",t:"Obsidian",O:2}}],["/apps/tutorials/power-automate.html",{loader:()=>n.e(9522).then(n.bind(n,1355)),meta:{y:"p",t:"Power Automate",O:10}}],["/apps/tutorials/vscode.html",{loader:()=>n.e(7230).then(n.bind(n,8545)),meta:{y:"p",t:"VS Code",O:3}}],["/family/baby/",{loader:()=>n.e(4470).then(n.bind(n,7783)),meta:{y:"p",t:"育儿记录",i:"emoji"}}],["/family/baby/birthing.html",{loader:()=>n.e(9811).then(n.bind(n,6187)),meta:{y:"p",t:"生产前的准备",O:1}}],["/family/baby/hospital.html",{loader:()=>n.e(7838).then(n.bind(n,3392)),meta:{y:"p",t:"生病记录",O:4}}],["/family/baby/newborn.html",{loader:()=>n.e(4523).then(n.bind(n,6644)),meta:{y:"p",t:"新生儿期(0-6 月)",O:2}}],["/family/baby/take-kids-out.html",{loader:()=>n.e(8304).then(n.bind(n,1399)),meta:{y:"p",t:"溜娃",O:5}}],["/services/dockers-on-nas/",{loader:()=>n.e(4470).then(n.bind(n,3293)),meta:{y:"p",t:"NAS 应用集合",i:"process"}}],["/services/dockers-on-nas/alist.html",{loader:()=>n.e(9785).then(n.bind(n,9121)),meta:{y:"p",t:"Alist:聚合网盘",O:23}}],["/services/dockers-on-nas/cors-anywhere.html",{loader:()=>n.e(9011).then(n.bind(n,4412)),meta:{y:"p",t:"CORS Anywhere:解锁跨域限制",O:201}}],["/services/dockers-on-nas/deeplx.html",{loader:()=>n.e(654).then(n.bind(n,7405)),meta:{y:"p",t:"DeepLX - 免费翻译接口",O:102}}],["/services/dockers-on-nas/docsify.html",{loader:()=>n.e(3689).then(n.bind(n,6916)),meta:{y:"p",t:"Docsify:私密文件服务器",O:103}}],["/services/dockers-on-nas/emby.html",{loader:()=>n.e(2499).then(n.bind(n,5167)),meta:{y:"p",t:"Emby:家庭媒体中心",O:1}}],["/services/dockers-on-nas/flare.html",{loader:()=>n.e(1074).then(n.bind(n,8721)),meta:{y:"p",t:"Flare:快速导航页",O:93}}],["/services/dockers-on-nas/gitlab.html",{loader:()=>n.e(1371).then(n.bind(n,6812)),meta:{y:"p",t:"GitLab:私有化版本控制",O:103}}],["/services/dockers-on-nas/grampsjs.html",{loader:()=>n.e(6405).then(n.bind(n,2387)),meta:{y:"p",t:"Gramps.js:在线家谱",O:35}}],["/services/dockers-on-nas/grocy.html",{loader:()=>n.e(924).then(n.bind(n,1918)),meta:{y:"p",t:"Grocy:家庭杂货管理",O:33}}],["/services/dockers-on-nas/homarr.html",{loader:()=>n.e(9503).then(n.bind(n,1290)),meta:{y:"p",t:"Homarr:本地导航",O:91}}],["/services/dockers-on-nas/memos.html",{loader:()=>n.e(7573).then(n.bind(n,1546)),meta:{y:"p",t:"Memos:碎片化记录",O:34}}],["/services/dockers-on-nas/mt-photos.html",{loader:()=>n.e(9187).then(n.bind(n,1821)),meta:{y:"p",t:"MT Photos:分享家庭照片",O:4}}],["/services/dockers-on-nas/n8n.html",{loader:()=>n.e(7418).then(n.bind(n,7791)),meta:{y:"p",t:"n8n:工作流自动化",O:81}}],["/services/dockers-on-nas/navidrome.html",{loader:()=>n.e(4447).then(n.bind(n,4671)),meta:{y:"p",t:"Navidrome:开源音乐服务器",O:3}}],["/services/dockers-on-nas/nextcloud.html",{loader:()=>n.e(3984).then(n.bind(n,331)),meta:{y:"p",t:"Nextcloud:私有云盘",O:22}}],["/services/dockers-on-nas/paperless-ngx.html",{loader:()=>n.e(349).then(n.bind(n,8746)),meta:{y:"p",t:"Paperless-ngx:全文管理文档",O:32}}],["/services/dockers-on-nas/qbittorrent.html",{loader:()=>n.e(3054).then(n.bind(n,3173)),meta:{y:"p",t:"qBittorrent:种子&磁力下载",O:5}}],["/services/dockers-on-nas/qinglong.html",{loader:()=>n.e(5707).then(n.bind(n,2482)),meta:{y:"p",t:"青龙面板:定时任务管理",O:84}}],["/services/dockers-on-nas/reader.html",{loader:()=>n.e(359).then(n.bind(n,6352)),meta:{y:"p",t:"Reader:小说/书籍阅读",O:11}}],["/services/dockers-on-nas/reverse-proxy.html",{loader:()=>n.e(9981).then(n.bind(n,2165)),meta:{y:"p",t:"反向代理:Nginx Proxy Manager",O:101}}],["/services/dockers-on-nas/srs-stack.html",{loader:()=>n.e(2873).then(n.bind(n,8155)),meta:{y:"p",t:"SRS Stack:直播推流",O:83}}],["/services/dockers-on-nas/stirling-pdf.html",{loader:()=>n.e(6819).then(n.bind(n,9999)),meta:{y:"p",t:"Stirling-PDF:开源 PDF 处理工具",O:31}}],["/services/dockers-on-nas/sun-panel.html",{loader:()=>n.e(7619).then(n.bind(n,468)),meta:{y:"p",t:"Sun-Panel:简化导航页",O:92}}],["/services/dockers-on-nas/syncthing.html",{loader:()=>n.e(139).then(n.bind(n,5266)),meta:{y:"p",t:"Syncthing:私人同步盘",O:21}}],["/services/dockers-on-nas/tachidesk.html",{loader:()=>n.e(4756).then(n.bind(n,9068)),meta:{y:"p",t:"Tachidesk:漫画聚合阅读器",O:12}}],["/services/dockers-on-nas/uptime-kuma.html",{loader:()=>n.e(1571).then(n.bind(n,4700)),meta:{y:"p",t:"Uptime Kuma:轻量运维监控",O:82}}],["/services/dockers-on-nas/xiaoya.html",{loader:()=>n.e(9789).then(n.bind(n,7912)),meta:{y:"p",t:"小雅 alist:影视资源合集",O:2}}],["/404.html",{loader:()=>n.e(7490).then(n.bind(n,2095)),meta:{y:"p",t:""}}],["/apps/",{loader:()=>n.e(4470).then(n.bind(n,6956)),meta:{y:"p",t:"Apps"}}],["/posts/",{loader:()=>n.e(4470).then(n.bind(n,2203)),meta:{y:"p",t:"Posts"}}],["/deploy/",{loader:()=>n.e(4470).then(n.bind(n,3816)),meta:{y:"p",t:"Deploy"}}],["/family/",{loader:()=>n.e(4470).then(n.bind(n,8678)),meta:{y:"p",t:"Family"}}],["/services/",{loader:()=>n.e(4470).then(n.bind(n,6324)),meta:{y:"p",t:"Services"}}],["/web/",{loader:()=>n.e(4470).then(n.bind(n,7380)),meta:{y:"p",t:"Web"}}],["/windows/",{loader:()=>n.e(4470).then(n.bind(n,9231)),meta:{y:"p",t:"Windows"}}],["/apps/devdocs/",{loader:()=>n.e(4470).then(n.bind(n,1603)),meta:{y:"p",t:"Devdocs"}}],["/apps/livestreaming/",{loader:()=>n.e(4470).then(n.bind(n,7199)),meta:{y:"p",t:"Livestreaming"}}],["/apps/tutorials/",{loader:()=>n.e(4470).then(n.bind(n,294)),meta:{y:"p",t:"Tutorials"}}],["/category/",{loader:()=>n.e(4470).then(n.bind(n,9947)),meta:{y:"p",t:"分类",I:!1}}],["/category/%E5%B7%A5%E5%85%B7/",{loader:()=>n.e(4470).then(n.bind(n,9870)),meta:{y:"p",t:"工具 分类",I:!1}}],["/category/%E8%87%AA%E5%8A%A8%E5%8C%96/",{loader:()=>n.e(4470).then(n.bind(n,1507)),meta:{y:"p",t:"自动化 分类",I:!1}}],["/category/%E7%B3%BB%E7%BB%9F/",{loader:()=>n.e(4470).then(n.bind(n,2804)),meta:{y:"p",t:"系统 分类",I:!1}}],["/category/%E7%BD%91%E7%BB%9C/",{loader:()=>n.e(4470).then(n.bind(n,8143)),meta:{y:"p",t:"网络 分类",I:!1}}],["/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/",{loader:()=>n.e(4470).then(n.bind(n,2903)),meta:{y:"p",t:"服务器 分类",I:!1}}],["/category/%E5%81%A5%E5%BA%B7/",{loader:()=>n.e(4470).then(n.bind(n,3810)),meta:{y:"p",t:"健康 分类",I:!1}}],["/category/%E5%8D%9A%E5%AE%A2/",{loader:()=>n.e(4470).then(n.bind(n,5886)),meta:{y:"p",t:"博客 分类",I:!1}}],["/category/%E8%B4%AD%E7%89%A9/",{loader:()=>n.e(4470).then(n.bind(n,2819)),meta:{y:"p",t:"购物 分类",I:!1}}],["/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/",{loader:()=>n.e(4470).then(n.bind(n,4931)),meta:{y:"p",t:"头脑驿站 分类",I:!1}}],["/category/%E8%A7%82%E5%AF%9F%E9%9A%8F%E7%AC%94/",{loader:()=>n.e(4470).then(n.bind(n,2708)),meta:{y:"p",t:"观察随笔 分类",I:!1}}],["/tag/",{loader:()=>n.e(4470).then(n.bind(n,7479)),meta:{y:"p",t:"标签",I:!1}}],["/tag/%E5%BE%AE%E4%BF%A1/",{loader:()=>n.e(4470).then(n.bind(n,6924)),meta:{y:"p",t:"标签: 微信",I:!1}}],["/tag/rss/",{loader:()=>n.e(4470).then(n.bind(n,7402)),meta:{y:"p",t:"标签: rss",I:!1}}],["/tag/feed43/",{loader:()=>n.e(4470).then(n.bind(n,9891)),meta:{y:"p",t:"标签: Feed43",I:!1}}],["/tag/feedex/",{loader:()=>n.e(4470).then(n.bind(n,7853)),meta:{y:"p",t:"标签: FeedEx",I:!1}}],["/tag/office/",{loader:()=>n.e(4470).then(n.bind(n,1865)),meta:{y:"p",t:"标签: office",I:!1}}],["/tag/onenote/",{loader:()=>n.e(4470).then(n.bind(n,4722)),meta:{y:"p",t:"标签: OneNote",I:!1}}],["/tag/%E5%85%B3%E6%9C%BA/",{loader:()=>n.e(4470).then(n.bind(n,2994)),meta:{y:"p",t:"标签: 关机",I:!1}}],["/tag/smb/",{loader:()=>n.e(4470).then(n.bind(n,9513)),meta:{y:"p",t:"标签: smb",I:!1}}],["/tag/%E5%85%89%E7%8C%AB/",{loader:()=>n.e(4470).then(n.bind(n,9470)),meta:{y:"p",t:"标签: 光猫",I:!1}}],["/tag/cdn/",{loader:()=>n.e(4470).then(n.bind(n,7474)),meta:{y:"p",t:"标签: CDN",I:!1}}],["/tag/%E5%BB%BA%E7%AB%99/",{loader:()=>n.e(4470).then(n.bind(n,2710)),meta:{y:"p",t:"标签: 建站",I:!1}}],["/tag/huginn/",{loader:()=>n.e(4470).then(n.bind(n,3199)),meta:{y:"p",t:"标签: Huginn",I:!1}}],["/tag/%E5%87%8F%E8%82%A5/",{loader:()=>n.e(4470).then(n.bind(n,4904)),meta:{y:"p",t:"标签: 减肥",I:!1}}],["/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/",{loader:()=>n.e(4470).then(n.bind(n,9732)),meta:{y:"p",t:"标签: 宝塔面板",I:!1}}],["/tag/jekyll/",{loader:()=>n.e(4470).then(n.bind(n,9152)),meta:{y:"p",t:"标签: Jekyll",I:!1}}],["/tag/github/",{loader:()=>n.e(4470).then(n.bind(n,1396)),meta:{y:"p",t:"标签: Github",I:!1}}],["/tag/travis-ci/",{loader:()=>n.e(4470).then(n.bind(n,5635)),meta:{y:"p",t:"标签: Travis CI",I:!1}}],["/tag/docker/",{loader:()=>n.e(4470).then(n.bind(n,7360)),meta:{y:"p",t:"标签: Docker",I:!1}}],["/tag/audition/",{loader:()=>n.e(4470).then(n.bind(n,376)),meta:{y:"p",t:"标签: Audition",I:!1}}],["/tag/%E9%9F%B3%E9%A2%91/",{loader:()=>n.e(4470).then(n.bind(n,9441)),meta:{y:"p",t:"标签: 音频",I:!1}}],["/tag/aria2/",{loader:()=>n.e(4470).then(n.bind(n,680)),meta:{y:"p",t:"标签: Aria2",I:!1}}],["/tag/%E8%BF%85%E9%9B%B7/",{loader:()=>n.e(4470).then(n.bind(n,8702)),meta:{y:"p",t:"标签: 迅雷",I:!1}}],["/tag/airtable/",{loader:()=>n.e(4470).then(n.bind(n,9684)),meta:{y:"p",t:"标签: Airtable",I:!1}}],["/tag/gp1700/",{loader:()=>n.e(4470).then(n.bind(n,5658)),meta:{y:"p",t:"标签: GP1700",I:!1}}],["/tag/koolproxy/",{loader:()=>n.e(4470).then(n.bind(n,7915)),meta:{y:"p",t:"标签: koolproxy",I:!1}}],["/tag/iptv/",{loader:()=>n.e(4470).then(n.bind(n,5172)),meta:{y:"p",t:"标签: IPTV",I:!1}}],["/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/",{loader:()=>n.e(4470).then(n.bind(n,5256)),meta:{y:"p",t:"标签: 语音输入",I:!1}}],["/tag/openvpn/",{loader:()=>n.e(4470).then(n.bind(n,8759)),meta:{y:"p",t:"标签: OpenVPN",I:!1}}],["/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/",{loader:()=>n.e(4470).then(n.bind(n,8741)),meta:{y:"p",t:"标签: 内网穿透",I:!1}}],["/tag/rsshub/",{loader:()=>n.e(4470).then(n.bind(n,6905)),meta:{y:"p",t:"标签: RSSHub",I:!1}}],["/tag/scrcpy/",{loader:()=>n.e(4470).then(n.bind(n,8189)),meta:{y:"p",t:"标签: scrcpy",I:!1}}],["/tag/%E6%8A%95%E5%B1%8F/",{loader:()=>n.e(4470).then(n.bind(n,3168)),meta:{y:"p",t:"标签: 投屏",I:!1}}],["/tag/%E5%8C%96%E5%A6%86%E5%93%81/",{loader:()=>n.e(4470).then(n.bind(n,324)),meta:{y:"p",t:"标签: 化妆品",I:!1}}],["/tag/wifi/",{loader:()=>n.e(4470).then(n.bind(n,3155)),meta:{y:"p",t:"标签: WIFI",I:!1}}],["/tag/%E4%B8%BB%E6%9D%BF/",{loader:()=>n.e(4470).then(n.bind(n,6794)),meta:{y:"p",t:"标签: 主板",I:!1}}],["/tag/%E8%93%9D%E5%B1%8F/",{loader:()=>n.e(4470).then(n.bind(n,2226)),meta:{y:"p",t:"标签: 蓝屏",I:!1}}],["/tag/%E6%96%AD%E8%88%8D%E7%A6%BB/",{loader:()=>n.e(4470).then(n.bind(n,2837)),meta:{y:"p",t:"标签: 断舍离",I:!1}}],["/tag/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%9D%90/",{loader:()=>n.e(4470).then(n.bind(n,4427)),meta:{y:"p",t:"标签: 健身器材",I:!1}}],["/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/",{loader:()=>n.e(4470).then(n.bind(n,1413)),meta:{y:"p",t:"标签: 小狼毫",I:!1}}],["/tag/%E8%BE%93%E5%85%A5%E6%B3%95/",{loader:()=>n.e(4470).then(n.bind(n,6500)),meta:{y:"p",t:"标签: 输入法",I:!1}}],["/tag/keepass/",{loader:()=>n.e(4470).then(n.bind(n,8744)),meta:{y:"p",t:"标签: KeePass",I:!1}}],["/tag/wordpress/",{loader:()=>n.e(4470).then(n.bind(n,5589)),meta:{y:"p",t:"标签: WordPress",I:!1}}],["/tag/%E5%8E%9F%E5%88%99/",{loader:()=>n.e(4470).then(n.bind(n,6200)),meta:{y:"p",t:"标签: 原则",I:!1}}],["/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/",{loader:()=>n.e(4470).then(n.bind(n,2563)),meta:{y:"p",t:"标签: 批评与自我批评",I:!1}}],["/tag/nas/",{loader:()=>n.e(4470).then(n.bind(n,2604)),meta:{y:"p",t:"标签: nas",I:!1}}],["/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/",{loader:()=>n.e(4470).then(n.bind(n,6711)),meta:{y:"p",t:"标签: 微信红包",I:!1}}],["/tag/microsoft-store/",{loader:()=>n.e(4470).then(n.bind(n,5762)),meta:{y:"p",t:"标签: Microsoft store",I:!1}}],["/tag/%E8%81%94%E6%83%B3/",{loader:()=>n.e(4470).then(n.bind(n,3498)),meta:{y:"p",t:"标签: 联想",I:!1}}],["/tag/winget/",{loader:()=>n.e(4470).then(n.bind(n,1514)),meta:{y:"p",t:"标签: winget",I:!1}}],["/tag/winstall/",{loader:()=>n.e(4470).then(n.bind(n,6691)),meta:{y:"p",t:"标签: winstall",I:!1}}],["/tag/%E5%B9%B8%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE/",{loader:()=>n.e(4470).then(n.bind(n,1432)),meta:{y:"p",t:"标签: 幸存者偏差",I:!1}}],["/tag/%E7%96%AB%E6%83%85/",{loader:()=>n.e(4470).then(n.bind(n,2697)),meta:{y:"p",t:"标签: 疫情",I:!1}}],["/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/",{loader:()=>n.e(4470).then(n.bind(n,7769)),meta:{y:"p",t:"标签: 浏览器插件",I:!1}}],["/tag/ui.vision/",{loader:()=>n.e(4470).then(n.bind(n,4766)),meta:{y:"p",t:"标签: UI.Vision",I:!1}}],["/tag/rpa/",{loader:()=>n.e(4470).then(n.bind(n,9059)),meta:{y:"p",t:"标签: RPA",I:!1}}],["/tag/%E5%BD%95%E5%B1%8F/",{loader:()=>n.e(4470).then(n.bind(n,4022)),meta:{y:"p",t:"标签: 录屏",I:!1}}],["/tag/%E8%87%AA%E6%88%91%E7%AE%A1%E7%90%86/",{loader:()=>n.e(4470).then(n.bind(n,5982)),meta:{y:"p",t:"标签: 自我管理",I:!1}}],["/tag/blog/",{loader:()=>n.e(4470).then(n.bind(n,2592)),meta:{y:"p",t:"标签: blog",I:!1}}],["/tag/github/",{loader:()=>n.e(4470).then(n.bind(n,1396)),meta:{y:"p",t:"标签: github",I:!1}}],["/tag/vuepress/",{loader:()=>n.e(4470).then(n.bind(n,4808)),meta:{y:"p",t:"标签: VuePress",I:!1}}],["/tag/ai/",{loader:()=>n.e(4470).then(n.bind(n,6425)),meta:{y:"p",t:"标签: AI",I:!1}}],["/tag/stable-diffusion/",{loader:()=>n.e(4470).then(n.bind(n,6073)),meta:{y:"p",t:"标签: Stable Diffusion",I:!1}}],["/tag/%E5%AA%92%E4%BD%93/",{loader:()=>n.e(4470).then(n.bind(n,8256)),meta:{y:"p",t:"标签: 媒体",I:!1}}],["/tag/whisper/",{loader:()=>n.e(4470).then(n.bind(n,7362)),meta:{y:"p",t:"标签: Whisper",I:!1}}],["/tag/%E5%AD%97%E5%B9%95/",{loader:()=>n.e(4470).then(n.bind(n,5684)),meta:{y:"p",t:"标签: 字幕",I:!1}}],["/tag/%E7%99%BD%E6%9D%BF/",{loader:()=>n.e(4470).then(n.bind(n,7313)),meta:{y:"p",t:"标签: 白板",I:!1}}],["/tag/gtd/",{loader:()=>n.e(4470).then(n.bind(n,9838)),meta:{y:"p",t:"标签: GTD",I:!1}}],["/tag/chatgpt/",{loader:()=>n.e(4470).then(n.bind(n,204)),meta:{y:"p",t:"标签: ChatGPT",I:!1}}],["/tag/%E6%97%B6%E9%97%B4/",{loader:()=>n.e(4470).then(n.bind(n,3805)),meta:{y:"p",t:"标签: 时间",I:!1}}],["/tag/%E5%B7%A5%E4%BD%9C%E6%B5%81/",{loader:()=>n.e(4470).then(n.bind(n,9615)),meta:{y:"p",t:"标签: 工作流",I:!1}}],["/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/",{loader:()=>n.e(4470).then(n.bind(n,5450)),meta:{y:"p",t:"标签: 虚拟定位",I:!1}}],["/tag/vits/",{loader:()=>n.e(4470).then(n.bind(n,7541)),meta:{y:"p",t:"标签: VITS",I:!1}}],["/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/",{loader:()=>n.e(4470).then(n.bind(n,4010)),meta:{y:"p",t:"标签: 声音克隆",I:!1}}],["/tag/games/",{loader:()=>n.e(4470).then(n.bind(n,4540)),meta:{y:"p",t:"标签: games",I:!1}}],["/tag/%E7%9B%B4%E6%92%AD/",{loader:()=>n.e(4470).then(n.bind(n,5843)),meta:{y:"p",t:"标签: 直播",I:!1}}],["/tag/obs/",{loader:()=>n.e(4470).then(n.bind(n,7322)),meta:{y:"p",t:"标签: OBS",I:!1}}],["/article/",{loader:()=>n.e(4470).then(n.bind(n,662)),meta:{y:"p",t:"文章",I:!1}}],["/star/",{loader:()=>n.e(4470).then(n.bind(n,4405)),meta:{y:"p",t:"星标",I:!1}}],["/timeline/",{loader:()=>n.e(4470).then(n.bind(n,4124)),meta:{y:"p",t:"时间轴",I:!1}}]])},9354:(t,e,n)=>{n.d(e,{U:()=>o});const o=JSON.parse('{"base":"/","lang":"zh-CN","title":"LearnData-开源笔记","description":"开源工具、效率方法、心理学探索的自我提升笔记,记录并输出一切能让自己提升的知识。","head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://newzone.top/rss.xml","title":"LearnData-开源笔记 RSS Feed"}]],"locales":{}}')},8120:(t,e,n)=>{n.d(e,{K:()=>o});const o=JSON.parse('{"encrypt":{},"author":{"name":"清顺","url":"https://newzone.top"},"logo":"/logo.svg","breadcrumb":false,"contributors":false,"lastUpdated":true,"editLink":true,"darkmode":"switch","fullscreen":true,"repo":"rockbenben/LearnData","repoLabel":"GitHub","repoDisplay":true,"docsDir":"docs","navbarLayout":{"start":["Brand"],"center":["Links"],"end":["SocialLink","Repo","Outlook","Search"]},"copyright":"Copyright © 2023-present LearnData 开源笔记","displayFooter":true,"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/rockbenben","Zhihu":"https://www.zhihu.com/people/qingwhat","少数派":"https://sspai.com/u/zqj05i4v/posts","Wechat":"https://img.newzone.top/wechat.svg","Email":"mailto:learndata@newzone.top","Discord":"https://discord.gg/PZTQfJ4GjX","RSS":"/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":"星标","empty":"$text 为空"},"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":"emmet","prefix":"/family/","children":["Diet","Shoppinglist","Coupon","baby/"]},{"text":"工具","icon":"tool","children":[{"text":"ChatGPT SC","icon":"creative","link":"https://www.aishort.top/"},{"text":"IMGPrompt","icon":"pic","link":"https://prompt.newzone.top/"},{"text":"文字处理","icon":"others","link":"https://tools.newzone.top/json-translate"},{"text":"工具收藏","icon":"categoryselected","link":"https://nav.newzone.top/"}]}],"sidebar":{"":["/DailyRoutine","/Fitness",{"text":"读书笔记","icon":"read","link":"https://newzone.top/reading/"},{"text":"🧰 应用手册","icon":"","prefix":"/apps/","link":"","collapsible":true,"children":["Applist.md","toolbox.md","Chrome.md",{"text":"工具笔记","icon":"plugin","prefix":"tutorials/","link":"","collapsible":true,"children":"structure"},{"text":"直播手册","icon":"load","prefix":"livestreaming/","link":"","collapsible":true,"children":"structure"},{"text":"其他","icon":"emmet","collapsible":true,"children":["design.md","ChatGPT.md"]}]},{"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":"","prefix":"/family/","link":"","collapsible":true,"children":"structure"},{"text":"博客文章","icon":"blog","prefix":"/_posts/","link":"/blog","collapsible":true,"children":"structure"}],"/services/dockers-on-nas/":"structure","/family/baby/":"structure"}}}}')},1878:(t,e,n)=>{n.d(e,{v:()=>o});const o={"/apps/tutorials/":["logseq","obsidian","vscode","power-automate","QTTabBar","feishu"],"/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:["emby","xiaoya","navidrome","mt-photos","qbittorrent","reader","tachidesk","syncthing","nextcloud","alist","stirling-pdf","paperless-ngx","grocy","memos","grampsjs","n8n","uptime-kuma","srs-stack","qinglong","homarr","sun-panel","flare","reverse-proxy","deeplx","docsify","gitlab","cors-anywhere"]}],"/windows/":["faq","NewSystem","screen"],"/web/":["VuePress","docsify","Comments"],"/family/":["Diet","Shoppinglist","Coupon","HomeAutomation","Medical","Maintenance","Life",{text:"育儿记录",prefix:"baby/",collapsible:!0,icon:"emoji",children:["birthing","newborn","hospital","take-kids-out"]}],"/_posts/":["/posts/2024-01-28-learndata-advanced.html","/posts/2023-10-07-clone-voice.html","/posts/2023-09-05-virtual_positioning.html","/posts/2023-03-31-efficient_morning_5am_club.html","/posts/2023-02-27-chatgpt_shortcuts.html","/posts/2023-01-26-whiteboard_gtd.html","/posts/2022-11-18-whisper_ai_subtitles.html","/posts/2022-11-03-ffmpeg_screen_recording.html","/posts/2022-09-05-stable_diffusion_ai_painting.html","/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/posts/2022-06-07-blog_md_to_wordpress.html","/posts/2022-05-22-surveillance_video_for_myself.html","/posts/2022-04-21-uivision_rpa.html","/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/posts/2022-03-17-rss_persistent_link_collection.html","/posts/2022-03-09-lenovo_black_card_member.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-12-17-weight_log.html","/posts/2020-11-27-rime_input.html","/posts/2020-11-01-gym_equipment_throw_away.html","/posts/2020-09-22-uefi_asus_board.html","/posts/2020-10-25-dpc_watchdog_violation.html","/posts/2020-09-13-wifi_speed_up.html","/posts/2020-03-25-rsshub_on_vps.html","/posts/2019-10-04-fake_aka_hospital_skin_care_products.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-03-06-no_more_dinner.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","/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","/posts/2022-08-10-new_stuff_shaping_machine.html"],"/services/dockers-on-nas/":["emby","xiaoya","navidrome","mt-photos","qbittorrent","reader","tachidesk","syncthing","nextcloud","alist","stirling-pdf","paperless-ngx","grocy","memos","grampsjs","n8n","uptime-kuma","srs-stack","qinglong","homarr","sun-panel","flare","reverse-proxy","deeplx","docsify","gitlab","cors-anywhere"],"/family/baby/":["birthing","newborn","hospital","take-kids-out"]}},8047:(t,e,n)=>{n.d(e,{P:()=>o});const o={GitHub:'',Zhihu:'',少数派:'\n\n\n\n\t\n\t\n\n\n',Wechat:'',Email:'',Discord:'',RSS:''}}},t=>{t.O(0,[1276,7251],(()=>(1392,t(t.s=1392)))),t.O()}]); \ No newline at end of file diff --git a/assets/js/v-bf44e05c.cf1bd7a3.js b/assets/js/birthing.html.ca2afc3e.js similarity index 93% rename from assets/js/v-bf44e05c.cf1bd7a3.js rename to assets/js/birthing.html.ca2afc3e.js index b905bfa21..e9f74a46a 100644 --- a/assets/js/v-bf44e05c.cf1bd7a3.js +++ b/assets/js/birthing.html.ca2afc3e.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9196],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9372:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>l,data:()=>p});var n=a(3968);const r=[(0,n.IL)('

    不要囤货

    不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

    LDR 的选择

    LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

    陪护的重要性

    对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。

    送花:一个小小的惊喜

    若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。

    ',8)],i={},l=(0,a(9720).c)(i,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div",null,r)}]]),p=JSON.parse('{"path":"/family/baby/birthing.html","title":"生产前的准备","lang":"zh-CN","frontmatter":{"article":false,"title":"生产前的准备","order":1,"description":"不要囤货 不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 LDR 的选择 LDR...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/birthing.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"生产前的准备"}],["meta",{"property":"og:description","content":"不要囤货 不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 LDR 的选择 LDR..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-16T01:30:53.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-09-16T01:30:53.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"生产前的准备\\",\\"description\\":\\"不要囤货 不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 LDR 的选择 LDR...\\"}"]]},"headers":[{"level":2,"title":"不要囤货","slug":"不要囤货","link":"#不要囤货","children":[]},{"level":2,"title":"LDR 的选择","slug":"ldr-的选择","link":"#ldr-的选择","children":[]},{"level":2,"title":"陪护的重要性","slug":"陪护的重要性","link":"#陪护的重要性","children":[]},{"level":2,"title":"送花:一个小小的惊喜","slug":"送花-一个小小的惊喜","link":"#送花-一个小小的惊喜","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1694827853000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.47,"words":440},"filePathRelative":"family/baby/birthing.md","localizedDate":"2023年9月16日","excerpt":"

    不要囤货

    \\n

    不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

    \\n

    LDR 的选择

    \\n

    LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

    \\n

    陪护的重要性

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9811],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6187:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>l,data:()=>p});var n=a(7847);const r=[(0,n.Fv)('

    不要囤货

    不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

    LDR 的选择

    LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

    陪护的重要性

    对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。

    送花:一个小小的惊喜

    若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。

    ',8)],i={},l=(0,a(3671).A)(i,[["render",function(e,t){return(0,n.uX)(),(0,n.CE)("div",null,r)}]]),p=JSON.parse('{"path":"/family/baby/birthing.html","title":"生产前的准备","lang":"zh-CN","frontmatter":{"article":false,"title":"生产前的准备","order":1,"description":"不要囤货 不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 LDR 的选择 LDR...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/birthing.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"生产前的准备"}],["meta",{"property":"og:description","content":"不要囤货 不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 LDR 的选择 LDR..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-16T01:30:53.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-09-16T01:30:53.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"生产前的准备\\",\\"description\\":\\"不要囤货 不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。 LDR 的选择 LDR...\\"}"]]},"headers":[{"level":2,"title":"不要囤货","slug":"不要囤货","link":"#不要囤货","children":[]},{"level":2,"title":"LDR 的选择","slug":"ldr-的选择","link":"#ldr-的选择","children":[]},{"level":2,"title":"陪护的重要性","slug":"陪护的重要性","link":"#陪护的重要性","children":[]},{"level":2,"title":"送花:一个小小的惊喜","slug":"送花-一个小小的惊喜","link":"#送花-一个小小的惊喜","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1694827853000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.47,"words":440},"filePathRelative":"family/baby/birthing.md","localizedDate":"2023年9月16日","excerpt":"

    不要囤货

    \\n

    不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

    \\n

    LDR 的选择

    \\n

    LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

    \\n

    陪护的重要性

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-54cbe17e.8286b5c0.js b/assets/js/blog.html.9796c6d2.js similarity index 84% rename from assets/js/v-54cbe17e.8286b5c0.js rename to assets/js/blog.html.9796c6d2.js index 678ed12c1..f6cf568b8 100644 --- a/assets/js/v-54cbe17e.8286b5c0.js +++ b/assets/js/blog.html.9796c6d2.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5900],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,a]of t)o[e]=a;return o}},8328:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>r,data:()=>p});var a=o(3968);const n={},r=(0,o(9720).c)(n,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div")}]]),p=JSON.parse('{"path":"/blog.html","title":"互联网小白","lang":"zh-CN","frontmatter":{"home":true,"layout":"BlogHome","icon":"home","title":"互联网小白","heroText":"互联网小白","tagline":"盛年不重来,一日难再晨","bgImage":"https://img.newzone.top/home-bg-1.jpg","heroFullScreen":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/blog.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"互联网小白"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"互联网小白\\"}"]]},"headers":[],"git":{"createdTime":1658668240000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":0.66,"words":197},"filePathRelative":"blog.md","localizedDate":"2022年7月24日","excerpt":"","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6632],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,a]of t)o[e]=a;return o}},4254:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>n,data:()=>p});var a=o(7847);const r={},n=(0,o(3671).A)(r,[["render",function(e,t){return(0,a.uX)(),(0,a.CE)("div")}]]),p=JSON.parse('{"path":"/blog.html","title":"互联网小白","lang":"zh-CN","frontmatter":{"home":true,"layout":"BlogHome","icon":"home","title":"互联网小白","heroText":"互联网小白","tagline":"盛年不重来,一日难再晨","bgImage":"https://img.newzone.top/home-bg-1.jpg","heroFullScreen":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/blog.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"互联网小白"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"互联网小白\\"}"]]},"headers":[],"git":{"createdTime":1658668240000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":0.66,"words":197},"filePathRelative":"blog.md","localizedDate":"2022年7月24日","excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-78e2ee26.a972a301.js b/assets/js/cors-anywhere.html.b7c4123e.js similarity index 94% rename from assets/js/v-78e2ee26.a972a301.js rename to assets/js/cors-anywhere.html.b7c4123e.js index 7e5d47879..dc707bb73 100644 --- a/assets/js/v-78e2ee26.a972a301.js +++ b/assets/js/cors-anywhere.html.b7c4123e.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3032],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},6208:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>c,data:()=>i});var e=a(3968);const t={href:"https://github.com/Rob--W/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},p={href:"https://hub.docker.com/r/rockben/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},o=(0,e.IL)('

    以下是使用 Docker 部署 CORS Anywhere 的示例配置:

    version: "3"\n\nservices:\n  cors-anywhere:\n    image: rockben/cors-anywhere\n    container_name: cors-anywhere\n    ports:\n      - "49152:8080"\n    restart: unless-stopped\n

    使用示例

    在 JavaScript 中利用 CORS Anywhere 的过程非常直接。以下是一个简单的调用示例:

    var corsAnywhereUrl = "http://192.168.2.3:49152/";\nvar targetUrl = "http://example.com/";\n$.ajax({\n  type: "get",\n  // 使用 CORS Anywhere URL 前缀和目标 URL\n  url: corsAnywhereUrl + targetUrl,\n  success: function (data) {\n    // 展示从资源获取的数据\n    $("#rawid").val(data);\n  },\n});\n

    构建自定义 Docker 镜像

    你还可以通过提供的 Dockerfile 根据自己的需求构建一个专属的 CORS Anywhere 镜像。

    # 使用 Alpine 为基础镜像,该镜像体积较小\nFROM node:lts-alpine as builder\n\nWORKDIR /app\n\n# 克隆 CORS Anywhere 的代码,并清理 git 以及其它不必要的文件\nRUN apk add --no-cache git && \\\n    git clone https://github.com/Rob--W/cors-anywhere.git . && \\\n    npm install && \\\n    apk del git && \\\n    npm cache clean --force && \\\n    rm -rf /var/cache/apk/* /tmp/* /var/tmp/*\n\n# 使用多阶段构建\nFROM node:lts-alpine\n\nWORKDIR /app\n\n# 从上一个阶段拷贝构建好的 node_modules 目录和必要的文件\nCOPY --from=builder /app/node_modules ./node_modules/\nCOPY --from=builder /app/lib/ ./lib/\nCOPY --from=builder /app/server.js ./server.js\n\n# 设置服务运行的端口\nEXPOSE 8080\n\n# 启动服务\nCMD ["node", "server.js"]\n

    在 Dockerfile 所在的目录下,执行以下命令即可构建并运行 cors-anywhere:

    # 构建 Docker 镜像\nsudo docker build -t cors-anywhere .\n\n# 运行 Docker 容器\nsudo docker run -d --name cors-anywhere -p 49152:8080 cors-anywhere\n

    通过上述步骤,你可以快速部署并开始使用 CORS Anywhere,轻松解锁跨域访问的限制,使前端开发更加灵活和便捷。如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',11),r={},c=(0,a(9720).c)(r,[["render",function(n,s){const a=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.QD)("a",t,[(0,e.mY)("CORS Anywhere"),(0,e.K2)(a)]),(0,e.mY)(" 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限制就可以被轻松绕过。")]),(0,e.QD)("p",null,[(0,e.mY)("若你想要自行部署 CORS Anywhere,可以自建镜像,或者使用我提供的预先配置好的 Docker 镜像 "),(0,e.QD)("a",p,[(0,e.mY)("rockben/cors-anywhere"),(0,e.K2)(a)]),(0,e.mY)("。")]),o])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/cors-anywhere.html","title":"CORS Anywhere:解锁跨域限制","lang":"zh-CN","frontmatter":{"article":false,"title":"CORS Anywhere:解锁跨域限制","order":201,"description":"CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/cors-anywhere.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"CORS Anywhere:解锁跨域限制"}],["meta",{"property":"og:description","content":"CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"CORS Anywhere:解锁跨域限制\\",\\"description\\":\\"CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限...\\"}"]]},"headers":[{"level":2,"title":"使用示例","slug":"使用示例","link":"#使用示例","children":[]},{"level":2,"title":"构建自定义 Docker 镜像","slug":"构建自定义-docker-镜像","link":"#构建自定义-docker-镜像","children":[]}],"git":{"createdTime":1694915357000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":2,"words":599},"filePathRelative":"services/dockers-on-nas/cors-anywhere.md","localizedDate":"2023年9月17日","excerpt":"

    CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限制就可以被轻松绕过。

    \\n

    若你想要自行部署 CORS Anywhere,可以自建镜像,或者使用我提供的预先配置好的 Docker 镜像 rockben/cors-anywhere

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9011],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},4412:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>c,data:()=>i});var e=a(7847);const t={href:"https://github.com/Rob--W/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},p={href:"https://hub.docker.com/r/rockben/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Fv)('

    以下是使用 Docker 部署 CORS Anywhere 的示例配置:

    version: "3"\n\nservices:\n  cors-anywhere:\n    image: rockben/cors-anywhere\n    container_name: cors-anywhere\n    ports:\n      - "49152:8080"\n    restart: unless-stopped\n

    使用示例

    在 JavaScript 中利用 CORS Anywhere 的过程非常直接。以下是一个简单的调用示例:

    var corsAnywhereUrl = "http://192.168.2.3:49152/";\nvar targetUrl = "http://example.com/";\n$.ajax({\n  type: "get",\n  // 使用 CORS Anywhere URL 前缀和目标 URL\n  url: corsAnywhereUrl + targetUrl,\n  success: function (data) {\n    // 展示从资源获取的数据\n    $("#rawid").val(data);\n  },\n});\n

    构建自定义 Docker 镜像

    你还可以通过提供的 Dockerfile 根据自己的需求构建一个专属的 CORS Anywhere 镜像。

    # 使用 Alpine 为基础镜像,该镜像体积较小\nFROM node:lts-alpine as builder\n\nWORKDIR /app\n\n# 克隆 CORS Anywhere 的代码,并清理 git 以及其它不必要的文件\nRUN apk add --no-cache git && \\\n    git clone https://github.com/Rob--W/cors-anywhere.git . && \\\n    npm install && \\\n    apk del git && \\\n    npm cache clean --force && \\\n    rm -rf /var/cache/apk/* /tmp/* /var/tmp/*\n\n# 使用多阶段构建\nFROM node:lts-alpine\n\nWORKDIR /app\n\n# 从上一个阶段拷贝构建好的 node_modules 目录和必要的文件\nCOPY --from=builder /app/node_modules ./node_modules/\nCOPY --from=builder /app/lib/ ./lib/\nCOPY --from=builder /app/server.js ./server.js\n\n# 设置服务运行的端口\nEXPOSE 8080\n\n# 启动服务\nCMD ["node", "server.js"]\n

    在 Dockerfile 所在的目录下,执行以下命令即可构建并运行 cors-anywhere:

    # 构建 Docker 镜像\nsudo docker build -t cors-anywhere .\n\n# 运行 Docker 容器\nsudo docker run -d --name cors-anywhere -p 49152:8080 cors-anywhere\n

    通过上述步骤,你可以快速部署并开始使用 CORS Anywhere,轻松解锁跨域访问的限制,使前端开发更加灵活和便捷。如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',11),r={},c=(0,a(3671).A)(r,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",t,[(0,e.eW)("CORS Anywhere"),(0,e.bF)(a)]),(0,e.eW)(" 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限制就可以被轻松绕过。")]),(0,e.Lk)("p",null,[(0,e.eW)("若你想要自行部署 CORS Anywhere,可以自建镜像,或者使用我提供的预先配置好的 Docker 镜像 "),(0,e.Lk)("a",p,[(0,e.eW)("rockben/cors-anywhere"),(0,e.bF)(a)]),(0,e.eW)("。")]),o])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/cors-anywhere.html","title":"CORS Anywhere:解锁跨域限制","lang":"zh-CN","frontmatter":{"article":false,"title":"CORS Anywhere:解锁跨域限制","order":201,"description":"CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/cors-anywhere.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"CORS Anywhere:解锁跨域限制"}],["meta",{"property":"og:description","content":"CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"CORS Anywhere:解锁跨域限制\\",\\"description\\":\\"CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限...\\"}"]]},"headers":[{"level":2,"title":"使用示例","slug":"使用示例","link":"#使用示例","children":[]},{"level":2,"title":"构建自定义 Docker 镜像","slug":"构建自定义-docker-镜像","link":"#构建自定义-docker-镜像","children":[]}],"git":{"createdTime":1694915357000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":2,"words":599},"filePathRelative":"services/dockers-on-nas/cors-anywhere.md","localizedDate":"2023年9月17日","excerpt":"

    CORS Anywhere 是一个基于 NodeJS 的代理服务,它通过向跨源请求中注入 CORS(跨源资源共享)头部,实现了跨域访问的功能。这个服务的存在是基于浏览器的同源策略:通常,浏览器会阻止前端 JavaScript 代码从一个域访问另一个域的内容,除非被访问的域设置了合适的 CORS 头部。借助 CORS Anywhere,这些浏览器的安全限制就可以被轻松绕过。

    \\n

    若你想要自行部署 CORS Anywhere,可以自建镜像,或者使用我提供的预先配置好的 Docker 镜像 rockben/cors-anywhere

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/deeplx.html.54c9f5b7.js b/assets/js/deeplx.html.54c9f5b7.js new file mode 100644 index 000000000..eca3795f0 --- /dev/null +++ b/assets/js/deeplx.html.54c9f5b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[654],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},7405:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>l,data:()=>c});var s=a(7847);const t={href:"https://github.com/OwO-Network/DeepLX/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Fv)('

    以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务:

    version: "3"\n\nservices:\n  deeplx:\n    image: ghcr.io/owo-network/deeplx:latest\n    container_name: deeplx\n    restart: always\n    ports:\n      - "32770:1188"\n    # environment:\n    # 如果设置了 TOKEN,则每个请求都需要包含 Authorization 标头。\n    # - TOKEN=helloworld\n    # 如果设置了 AUTHKEY,在 429 响应(请求过多/过快)后,会使用官方的 AuthKey 进行请求。如果同时使用多个 authKey,需要用逗号分隔。\n    # - AUTHKEY=xxxxxxx:fx\n

    如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦遇到请求频率过快的情况,DeepLX 会自动使用官方的 AuthKey 进行请求,从而加快翻译速度,提高效率。

    ',3),o={},l=(0,a(3671).A)(o,[["render",function(e,n){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("DeepLX"),(0,s.bF)(a)]),(0,s.eW)(" 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。")]),p])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/deeplx.html","title":"DeepLX - 免费翻译接口","lang":"zh-CN","frontmatter":{"article":false,"title":"DeepLX - 免费翻译接口","order":102,"description":"DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。 以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务: 如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/deeplx.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"DeepLX - 免费翻译接口"}],["meta",{"property":"og:description","content":"DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。 以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务: 如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"DeepLX - 免费翻译接口\\",\\"description\\":\\"DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。 以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务: 如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦...\\"}"]]},"headers":[],"git":{"createdTime":1701779050000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.81,"words":243},"filePathRelative":"services/dockers-on-nas/deeplx.md","localizedDate":"2023年12月5日","excerpt":"

    DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。

    \\n

    以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务:

    \\n
    version: \\"3\\"\\n\\nservices:\\n  deeplx:\\n    image: ghcr.io/owo-network/deeplx:latest\\n    container_name: deeplx\\n    restart: always\\n    ports:\\n      - \\"32770:1188\\"\\n    # environment:\\n    # 如果设置了 TOKEN,则每个请求都需要包含 Authorization 标头。\\n    # - TOKEN=helloworld\\n    # 如果设置了 AUTHKEY,在 429 响应(请求过多/过快)后,会使用官方的 AuthKey 进行请求。如果同时使用多个 authKey,需要用逗号分隔。\\n    # - AUTHKEY=xxxxxxx:fx\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5da9d1b4.b34e193c.js b/assets/js/design.html.32f86e3b.js similarity index 68% rename from assets/js/v-5da9d1b4.b34e193c.js rename to assets/js/design.html.32f86e3b.js index 279e13eba..7ad0182a7 100644 --- a/assets/js/v-5da9d1b4.b34e193c.js +++ b/assets/js/design.html.32f86e3b.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5804],{9720:(e,a)=>{a.c=(e,a)=>{const r=e.__vccOpts||e;for(const[e,n]of a)r[e]=n;return r}},3628:(e,a,r)=>{r.r(a),r.d(a,{comp:()=>O,data:()=>P});var n=r(3968);const t=(0,n.QD)("h2",{id:"电子白板",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#电子白板"},[(0,n.QD)("span",null,"电子白板")])],-1),l=(0,n.QD)("p",null,"在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。",-1),i=(0,n.QD)("h3",{id:"excalidraw",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#excalidraw"},[(0,n.QD)("span",null,"Excalidraw")])],-1),o={href:"https://github.com/excalidraw/excalidraw",target:"_blank",rel:"noopener noreferrer"},s={href:"https://blog.csdn.net/qq_34802028/article/details/127927960",target:"_blank",rel:"noopener noreferrer"},p={href:"https://blog.csdn.net/qq_26176515/article/details/126005295",target:"_blank",rel:"noopener noreferrer"},c={href:"https://zhuanlan.zhihu.com/p/577420136",target:"_blank",rel:"noopener noreferrer"},m=(0,n.IL)('
    手绘样例

    Canvas

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

    • Logseq Canvas:操作最接近为原版 Excalidraw,将 Logseq 功能内嵌入 Excalidraw。唯一的缺点是没有分组功能。

    • Obsidian Canvas:可以将图片、视频、文本、网页、文件和 Excalidraw 聚合在一起,并建立连接线和分组,类似于简化版 FigJam。(个人使用足够了)

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

    • Figma:FigJam 与其他白板类似,图样多很多,但功能差异不大,用得越来越少了。

    ',5),h={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},d={href:"http://waifu2x.udp.jp/index.zh-CN.html",target:"_blank",rel:"noopener noreferrer"},g={href:"https://svgedit.netlify.app/editor/index.html",target:"_blank",rel:"noopener noreferrer"},f=(0,n.QD)("h2",{id:"eagle",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#eagle"},[(0,n.QD)("span",null,"Eagle")])],-1),u=(0,n.QD)("p",null,"Eagle 非常适合管理图片素材。其优势之一是去重,我的素材库有几十万个文件,无法一个个清理,但导入 Eagle 就可以去除重复素材。",-1),w=(0,n.QD)("p",null,"Eagle 导入流程:搜索文件夹中的 ZIP/RAR 文件,确认全部解压。",-1),D=(0,n.QD)("h2",{id:"字体",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#字体"},[(0,n.QD)("span",null,"字体")])],-1),b=(0,n.QD)("p",null,[(0,n.mY)("字体是海报的灵魂,直接影响传播效果。商务性海报中,推荐使用阿里妈妈数黑体。另外,主标题不要使用纯黑色,建议使用 "),(0,n.QD)("code",null,"#1F2937"),(0,n.mY)("。")],-1),Q=(0,n.QD)("p",null,"以下是我常用的几种字体:",-1),x={href:"https://www.alibabafonts.com/#/font",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://fonts.alibabagroup.com/#/more",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/adobe-fonts/source-han-sans/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.mianfeiziti.com/fonts-fotmatisseprom",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.fonts.net.cn/font-38213257557.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://www.fonts.net.cn/font-38877223362.html",target:"_blank",rel:"noopener noreferrer"},T={href:"https://www.100font.com/thread-114.htm",target:"_blank",rel:"noopener noreferrer"},F={href:"https://www.100font.com/thread-69.htm",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.fonts.net.cn/font-35850420097.html",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/atelier-anchor/smiley-sans/releases",target:"_blank",rel:"noopener noreferrer"},K={href:"https://www.fonts.net.cn/font-35961736892.html",target:"_blank",rel:"noopener noreferrer"},z=(0,n.QD)("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),S={},O=(0,r(9720).c)(S,[["render",function(e,a){const r=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[t,l,i,(0,n.QD)("p",null,[(0,n.QD)("a",o,[(0,n.mY)("Excalidraw"),(0,n.K2)(r)]),(0,n.mY)(" 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构图等常用图片,也支持插入图片,是一款自由便捷的电子白板应用。Excalidraw 已被集成到各类白板应用中。")]),(0,n.QD)("p",null,[(0,n.mY)("不过,Excalidraw 没有中文手写字体,需手动修改,比如 "),(0,n.QD)("a",s,[(0,n.mY)("Excalidraw 官方版添加中文手写字体"),(0,n.K2)(r)]),(0,n.mY)(","),(0,n.QD)("a",p,[(0,n.mY)("Obsidian 中文手写体设置"),(0,n.K2)(r)]),(0,n.mY)(","),(0,n.QD)("a",c,[(0,n.mY)("网页端中文手写字体配置"),(0,n.K2)(r)]),(0,n.mY)("。")]),m,(0,n.QD)("p",null,[(0,n.mY)("一些页面图标路径是隐藏的,无法在前端获取,可以使用 "),(0,n.QD)("a",h,[(0,n.mY)("ImageAssistant"),(0,n.K2)(r)]),(0,n.mY)(" 扩展提取页面所有图片,或者通过搜索引擎搜索,获取网站提交给搜索引擎的 logo 图片。")]),(0,n.QD)("p",null,[(0,n.mY)("如果获取的图标较小,可以使用 "),(0,n.QD)("a",d,[(0,n.mY)("waifu2x"),(0,n.K2)(r)]),(0,n.mY)(" 进行最大降噪,然后多次放大 logo。其他放大算法会令 logo 变化,而 waifu2x 不会改变原图。")]),(0,n.QD)("p",null,[(0,n.mY)("如果图标 svg 不符合要求,可以使用 "),(0,n.QD)("a",g,[(0,n.mY)("SVG-edit"),(0,n.K2)(r)]),(0,n.mY)(" 进行简单编辑。")]),f,u,w,D,b,Q,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("a",x,[(0,n.mY)("阿里巴巴普惠体"),(0,n.K2)(r)]),(0,n.mY)(":简称「Alibaba PuHuiTi 3.0」,免费可商用,覆盖包括中英文等 178 个语种。")]),(0,n.QD)("li",null,[(0,n.QD)("a",Y,[(0,n.mY)("阿里妈妈数黑体"),(0,n.K2)(r)]),(0,n.mY)(":简称「Alimama ShuHeiTi」,数黑体为中文简体字库,适用于电商、广告、品牌形象、推广物料等场景。另外,阿里妈妈东方大楷的字体非常漂亮,适合 PPT 标题。")]),(0,n.QD)("li",null,[(0,n.QD)("a",E,[(0,n.mY)("思源字体"),(0,n.K2)(r)]),(0,n.mY)(":简称「Source Han Sans」,这是比较规规矩矩的一款字体,谷歌出品。用在商务风 PPT,或者是用在正文中,阅读效果都很赞。")]),(0,n.QD)("li",null,[(0,n.QD)("a",v,[(0,n.mY)("FOT-MatissePro"),(0,n.K2)(r)]),(0,n.mY)(":原本为 EVA 的常用日语字体,也支持大部分的繁体。")]),(0,n.QD)("li",null,[(0,n.QD)("a",k,[(0,n.mY)("优设标题黑"),(0,n.K2)(r)]),(0,n.mY)(":简称「YouSheBiaoTiHei-2」,以黑体字型为基础,整体字形沉稳,同时采用较大字面和粗壮的笔画来强化力量感。每个字体水平倾斜 8° 的设计,赋予了字体极强的速度感,为了让字体倾斜后也能保持稳固,设计师将整体字身设定宽扁。而起笔和弯钩上独具匠心的尖角设计,不仅突显了设计的几何感,而且方便后期修改。")]),(0,n.QD)("li",null,[(0,n.QD)("a",_,[(0,n.mY)("优设好身体"),(0,n.K2)(r)]),(0,n.mY)(":简称「YSHaoShenTi-2」,一款亲和力、现代感极强的专业美术标题字体。它以圆体字型为基础,通过瘦高的字面、偏向几何的曲线,让整宽字体富有亲和力和时尚感。在同样的面积里,更窄的字面就意味着能容纳更多的信息,所以这款字体非常适用在需要体现亲和力与时尚感的各类品牌宣传广告和产品包装设计的标题上。")]),(0,n.QD)("li",null,[(0,n.QD)("a",T,[(0,n.mY)("851 手书体"),(0,n.K2)(r)]),(0,n.mY)(":851 手書き雑フォント,虽为日系字体但覆盖了大部分的中英文,是以硬笔为主的手写字型,我喜欢用在 Excalidraw。")]),(0,n.QD)("li",null,[(0,n.QD)("a",F,[(0,n.mY)("濑户体"),(0,n.K2)(r)]),(0,n.mY)(":简称「SetoFont」,是一款偏可爱风的字体,支持简体中文、繁体中文、日文。")]),(0,n.QD)("li",null,[(0,n.QD)("a",y,[(0,n.mY)("杨任东竹石体"),(0,n.K2)(r)]),(0,n.mY)(":手写字体,简称为「YRDZST」。")]),(0,n.QD)("li",null,[(0,n.QD)("a",C,[(0,n.mY)("得意黑字体"),(0,n.K2)(r)]),(0,n.mY)(":非手写字体,但用在 Excalidraw 也不错。")]),(0,n.QD)("li",null,[(0,n.QD)("a",K,[(0,n.mY)("锐字真言体"),(0,n.K2)(r)]),(0,n.mY)(":简称「Zhenyan」,真言体笔触浑厚有力,笔画曲折有度,字形个性鲜明,刚柔并济,落笔简洁有序,给人以遒劲有力、端正凝练的感受。直角与圆角的错落搭配使得字体婉转有度,落落大方,具有自己独到的风格!这款字体特别适用于文字标题、竞技视觉、广告设计、个性品牌设计推广、企业宣传及时尚品牌的设计应用。")])]),z])}]]),P=JSON.parse('{"path":"/apps/design.html","title":"平面设计","lang":"zh-CN","frontmatter":{"article":false,"title":"平面设计","icon":"pic","order":90,"description":"电子白板 在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。 Excalidraw Excalidraw 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/design.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"平面设计"}],["meta",{"property":"og:description","content":"电子白板 在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。 Excalidraw Excalidraw 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-23-20-53-36.png \\"手绘样例\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"平面设计"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"平面设计\\",\\"description\\":\\"电子白板 在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。 Excalidraw Excalidraw 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构...\\"}"]]},"headers":[{"level":2,"title":"电子白板","slug":"电子白板","link":"#电子白板","children":[{"level":3,"title":"Excalidraw","slug":"excalidraw","link":"#excalidraw","children":[]},{"level":3,"title":"Canvas","slug":"canvas","link":"#canvas","children":[]}]},{"level":2,"title":"获取页面 logo","slug":"获取页面-logo","link":"#获取页面-logo","children":[]},{"level":2,"title":"Eagle","slug":"eagle","link":"#eagle","children":[]},{"level":2,"title":"字体","slug":"字体","link":"#字体","children":[]}],"git":{"createdTime":1673912664000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":5.43,"words":1629},"filePathRelative":"apps/design.md","localizedDate":"2023年1月16日","excerpt":"

    电子白板

    \\n

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

    \\n

    Excalidraw

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4938],{3671:(e,a)=>{a.A=(e,a)=>{const r=e.__vccOpts||e;for(const[e,n]of a)r[e]=n;return r}},2268:(e,a,r)=>{r.r(a),r.d(a,{comp:()=>A,data:()=>q});var n=r(7847);const t=(0,n.Lk)("h2",{id:"电子白板",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#电子白板"},[(0,n.Lk)("span",null,"电子白板")])],-1),l=(0,n.Lk)("p",null,"在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。",-1),i=(0,n.Lk)("h3",{id:"excalidraw",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#excalidraw"},[(0,n.Lk)("span",null,"Excalidraw")])],-1),o={href:"https://github.com/excalidraw/excalidraw",target:"_blank",rel:"noopener noreferrer"},s={href:"https://blog.csdn.net/qq_34802028/article/details/127927960",target:"_blank",rel:"noopener noreferrer"},p={href:"https://blog.csdn.net/qq_26176515/article/details/126005295",target:"_blank",rel:"noopener noreferrer"},c={href:"https://zhuanlan.zhihu.com/p/577420136",target:"_blank",rel:"noopener noreferrer"},h=(0,n.Fv)('
    手绘样例

    Canvas

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

    • Logseq Canvas:操作最接近为原版 Excalidraw,将 Logseq 功能内嵌入 Excalidraw。唯一的缺点是没有分组功能。

    • Obsidian Canvas:可以将图片、视频、文本、网页、文件和 Excalidraw 聚合在一起,并建立连接线和分组,类似于简化版 FigJam。(个人使用足够了)

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

    • Figma:FigJam 与其他白板类似,图样多很多,但功能差异不大,用得越来越少了。

    ',5),d={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},g={href:"http://waifu2x.udp.jp/index.zh-CN.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://svgedit.netlify.app/editor/index.html",target:"_blank",rel:"noopener noreferrer"},f=(0,n.Lk)("h2",{id:"eagle",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#eagle"},[(0,n.Lk)("span",null,"Eagle")])],-1),k=(0,n.Lk)("p",null,"Eagle 非常适合管理图片素材。其优势之一是去重,我的素材库有几十万个文件,无法一个个清理,但导入 Eagle 就可以去除重复素材。",-1),b=(0,n.Lk)("p",null,"Eagle 导入流程:搜索文件夹中的 ZIP/RAR 文件,确认全部解压。",-1),u=(0,n.Lk)("h2",{id:"字体",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#字体"},[(0,n.Lk)("span",null,"字体")])],-1),w=(0,n.Lk)("p",null,[(0,n.eW)("字体是海报的灵魂,直接影响传播效果。商务性海报中,推荐使用阿里妈妈数黑体。另外,主标题不要使用纯黑色,建议使用 "),(0,n.Lk)("code",null,"#1F2937"),(0,n.eW)("。")],-1),L=(0,n.Lk)("p",null,"以下是我常用的几种字体:",-1),x={href:"https://www.alibabafonts.com/#/font",target:"_blank",rel:"noopener noreferrer"},W={href:"https://fonts.alibabagroup.com/#/more",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/adobe-fonts/source-han-sans/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.mianfeiziti.com/fonts-fotmatisseprom",target:"_blank",rel:"noopener noreferrer"},E={href:"https://www.fonts.net.cn/font-38213257557.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://www.fonts.net.cn/font-38877223362.html",target:"_blank",rel:"noopener noreferrer"},T={href:"https://www.100font.com/thread-114.htm",target:"_blank",rel:"noopener noreferrer"},C={href:"https://www.100font.com/thread-69.htm",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.fonts.net.cn/font-35850420097.html",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/atelier-anchor/smiley-sans/releases",target:"_blank",rel:"noopener noreferrer"},z={href:"https://www.fonts.net.cn/font-35961736892.html",target:"_blank",rel:"noopener noreferrer"},O=(0,n.Lk)("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),P={},A=(0,r(3671).A)(P,[["render",function(e,a){const r=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[t,l,i,(0,n.Lk)("p",null,[(0,n.Lk)("a",o,[(0,n.eW)("Excalidraw"),(0,n.bF)(r)]),(0,n.eW)(" 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构图等常用图片,也支持插入图片,是一款自由便捷的电子白板应用。Excalidraw 已被集成到各类白板应用中。")]),(0,n.Lk)("p",null,[(0,n.eW)("不过,Excalidraw 没有中文手写字体,需手动修改,比如 "),(0,n.Lk)("a",s,[(0,n.eW)("Excalidraw 官方版添加中文手写字体"),(0,n.bF)(r)]),(0,n.eW)(","),(0,n.Lk)("a",p,[(0,n.eW)("Obsidian 中文手写体设置"),(0,n.bF)(r)]),(0,n.eW)(","),(0,n.Lk)("a",c,[(0,n.eW)("网页端中文手写字体配置"),(0,n.bF)(r)]),(0,n.eW)("。")]),h,(0,n.Lk)("p",null,[(0,n.eW)("一些页面图标路径是隐藏的,无法在前端获取,可以使用 "),(0,n.Lk)("a",d,[(0,n.eW)("ImageAssistant"),(0,n.bF)(r)]),(0,n.eW)(" 扩展提取页面所有图片,或者通过搜索引擎搜索,获取网站提交给搜索引擎的 logo 图片。")]),(0,n.Lk)("p",null,[(0,n.eW)("如果获取的图标较小,可以使用 "),(0,n.Lk)("a",g,[(0,n.eW)("waifu2x"),(0,n.bF)(r)]),(0,n.eW)(" 进行最大降噪,然后多次放大 logo。其他放大算法会令 logo 变化,而 waifu2x 不会改变原图。")]),(0,n.Lk)("p",null,[(0,n.eW)("如果图标 svg 不符合要求,可以使用 "),(0,n.Lk)("a",m,[(0,n.eW)("SVG-edit"),(0,n.bF)(r)]),(0,n.eW)(" 进行简单编辑。")]),f,k,b,u,w,L,(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("a",x,[(0,n.eW)("阿里巴巴普惠体"),(0,n.bF)(r)]),(0,n.eW)(":简称「Alibaba PuHuiTi 3.0」,免费可商用,覆盖包括中英文等 178 个语种。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",W,[(0,n.eW)("阿里妈妈数黑体"),(0,n.bF)(r)]),(0,n.eW)(":简称「Alimama ShuHeiTi」,数黑体为中文简体字库,适用于电商、广告、品牌形象、推广物料等场景。另外,阿里妈妈东方大楷的字体非常漂亮,适合 PPT 标题。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",F,[(0,n.eW)("思源字体"),(0,n.bF)(r)]),(0,n.eW)(":简称「Source Han Sans」,这是比较规规矩矩的一款字体,谷歌出品。用在商务风 PPT,或者是用在正文中,阅读效果都很赞。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",v,[(0,n.eW)("FOT-MatissePro"),(0,n.bF)(r)]),(0,n.eW)(":原本为 EVA 的常用日语字体,也支持大部分的繁体。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",E,[(0,n.eW)("优设标题黑"),(0,n.bF)(r)]),(0,n.eW)(":简称「YouSheBiaoTiHei-2」,以黑体字型为基础,整体字形沉稳,同时采用较大字面和粗壮的笔画来强化力量感。每个字体水平倾斜 8° 的设计,赋予了字体极强的速度感,为了让字体倾斜后也能保持稳固,设计师将整体字身设定宽扁。而起笔和弯钩上独具匠心的尖角设计,不仅突显了设计的几何感,而且方便后期修改。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",_,[(0,n.eW)("优设好身体"),(0,n.bF)(r)]),(0,n.eW)(":简称「YSHaoShenTi-2」,一款亲和力、现代感极强的专业美术标题字体。它以圆体字型为基础,通过瘦高的字面、偏向几何的曲线,让整宽字体富有亲和力和时尚感。在同样的面积里,更窄的字面就意味着能容纳更多的信息,所以这款字体非常适用在需要体现亲和力与时尚感的各类品牌宣传广告和产品包装设计的标题上。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",T,[(0,n.eW)("851 手书体"),(0,n.bF)(r)]),(0,n.eW)(":851 手書き雑フォント,虽为日系字体但覆盖了大部分的中英文,是以硬笔为主的手写字型,我喜欢用在 Excalidraw。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",C,[(0,n.eW)("濑户体"),(0,n.bF)(r)]),(0,n.eW)(":简称「SetoFont」,是一款偏可爱风的字体,支持简体中文、繁体中文、日文。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",y,[(0,n.eW)("杨任东竹石体"),(0,n.bF)(r)]),(0,n.eW)(":手写字体,简称为「YRDZST」。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",S,[(0,n.eW)("得意黑字体"),(0,n.bF)(r)]),(0,n.eW)(":非手写字体,但用在 Excalidraw 也不错。")]),(0,n.Lk)("li",null,[(0,n.Lk)("a",z,[(0,n.eW)("锐字真言体"),(0,n.bF)(r)]),(0,n.eW)(":简称「Zhenyan」,真言体笔触浑厚有力,笔画曲折有度,字形个性鲜明,刚柔并济,落笔简洁有序,给人以遒劲有力、端正凝练的感受。直角与圆角的错落搭配使得字体婉转有度,落落大方,具有自己独到的风格!这款字体特别适用于文字标题、竞技视觉、广告设计、个性品牌设计推广、企业宣传及时尚品牌的设计应用。")])]),O])}]]),q=JSON.parse('{"path":"/apps/design.html","title":"平面设计","lang":"zh-CN","frontmatter":{"article":false,"title":"平面设计","icon":"pic","order":90,"description":"电子白板 在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。 Excalidraw Excalidraw 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/design.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"平面设计"}],["meta",{"property":"og:description","content":"电子白板 在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。 Excalidraw Excalidraw 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-01-23-20-53-36.png \\"手绘样例\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"平面设计"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"平面设计\\",\\"description\\":\\"电子白板 在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。 Excalidraw Excalidraw 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构...\\"}"]]},"headers":[{"level":2,"title":"电子白板","slug":"电子白板","link":"#电子白板","children":[{"level":3,"title":"Excalidraw","slug":"excalidraw","link":"#excalidraw","children":[]},{"level":3,"title":"Canvas","slug":"canvas","link":"#canvas","children":[]}]},{"level":2,"title":"获取页面 logo","slug":"获取页面-logo","link":"#获取页面-logo","children":[]},{"level":2,"title":"Eagle","slug":"eagle","link":"#eagle","children":[]},{"level":2,"title":"字体","slug":"字体","link":"#字体","children":[]}],"git":{"createdTime":1673912664000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":5.43,"words":1629},"filePathRelative":"apps/design.md","localizedDate":"2023年1月16日","excerpt":"

    电子白板

    \\n

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

    \\n

    Excalidraw

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/docsify.html.892a6884.js b/assets/js/docsify.html.892a6884.js new file mode 100644 index 000000000..3d96eee6c --- /dev/null +++ b/assets/js/docsify.html.892a6884.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3689],{3671:(e,s)=>{s.A=(e,s)=>{const a=e.__vccOpts||e;for(const[e,n]of s)a[e]=n;return a}},6916:(e,s,a)=>{a.r(s),a.d(s,{comp:()=>l,data:()=>d});var n=a(7847);const t=(0,n.Lk)("p",null,"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。",-1),o=(0,n.Lk)("code",null,"Run, PowerShell.exe -NoExit -Command &{docsify serve --port 3030}, D:\\web\\marketing",-1),i={href:"https://github.com/rockbenben/docsify-docker",target:"_blank",rel:"noopener noreferrer"},c=(0,n.Fv)('

    以下是通过 Docker 部署 Docsify 的命令,这可以让你轻松地在任何支持 Docker 的环境中部署自己的私密文件服务器:

    version: "3.8"\n\nservices:\n  docsify:\n    container_name: docsify-server\n    image: rockben/docsify-server\n    volumes:\n      - /volume1/docker/docsify/docs:/docs\n    ports:\n      - "3310:3000"\n    restart: unless-stopped\n

    这个 Docker 配置文件定义了一个服务 docsify

    • volumes 映射了本地的文档目录到容器内,使得容器可以访问并展示这些 Markdown 文件。
    • ports 将容器的 3000 端口映射到本地的 3310 端口,你可以通过访问本地的 3310 端口来查看文档。

    通过以上步骤,我们可以轻松地利用 Docsify 和 Docker 构建一个私密且高效的文件服务器。这不仅简化了我们的工作流程,还提高了文档管理的安全性和便捷性。无论是个人笔记、团队协作文件还是企业内部资料,利用这种方法,你都能享受到快速、安全且易于管理的文档服务。现在,尝试动手实践,为你的文档管理带来一场革新吧!

    如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',6),r={},l=(0,a(3671).A)(r,[["render",function(e,s){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[t,(0,n.Lk)("p",null,[(0,n.eW)("起初,我通过一个 ahk 脚本在开机时执行 "),o,(0,n.eW)(" 命令来启动 Docsify 服务。虽然这种方法能够工作,但启动和维护过程相对繁琐。为了提高效率并实现更好的部署方式,我转向了 Docker 技术,并构建了一个名为 "),(0,n.Lk)("a",i,[(0,n.eW)("docsify-docker"),(0,n.bF)(a)]),(0,n.eW)(" 的项目。这个项目不仅简化了部署流程,还能自动检测 docsify-cli 的更新,确保文档服务器始终保持最新状态。")]),c])}]]),d=JSON.parse('{"path":"/services/dockers-on-nas/docsify.html","title":"Docsify:私密文件服务器","lang":"zh-CN","frontmatter":{"article":false,"title":"Docsify:私密文件服务器","order":103,"description":"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。 起初,我通过一个 ahk 脚本在开机时执行 Run, ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/docsify.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Docsify:私密文件服务器"}],["meta",{"property":"og:description","content":"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。 起初,我通过一个 ahk 脚本在开机时执行 Run, ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Docsify:私密文件服务器\\",\\"description\\":\\"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。 起初,我通过一个 ahk 脚本在开机时执行 Run, ...\\"}"]]},"headers":[],"git":{"createdTime":1706617187000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.93,"words":578},"filePathRelative":"services/dockers-on-nas/docsify.md","localizedDate":"2024年1月30日","excerpt":"

    在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。

    \\n

    起初,我通过一个 ahk 脚本在开机时执行 Run, PowerShell.exe -NoExit -Command &{docsify serve --port 3030}, D:\\\\web\\\\marketing 命令来启动 Docsify 服务。虽然这种方法能够工作,但启动和维护过程相对繁琐。为了提高效率并实现更好的部署方式,我转向了 Docker 技术,并构建了一个名为 docsify-docker 的项目。这个项目不仅简化了部署流程,还能自动检测 docsify-cli 的更新,确保文档服务器始终保持最新状态。

    ","autoDesc":true}')},5470:(e,s,a)=>{a.r(s),a.d(s,{comp:()=>I,data:()=>J});var n=a(7847);const t={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},o={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},i=(0,n.Lk)("h2",{id:"插件",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#插件"},[(0,n.Lk)("span",null,"插件")])],-1),c={href:"https://github.com/docsifyjs/awesome-docsify#plugins",target:"_blank",rel:"noopener noreferrer"},r={class:"task-list-container"},l={class:"task-list-item"},d=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-0",checked:"checked",disabled:"disabled"},null,-1),p={class:"task-list-item-label",for:"task-item-0"},k={href:"https://notebook.js.org/#/README",target:"_blank",rel:"noopener noreferrer"},u={class:"task-list-item"},h=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-1",checked:"checked",disabled:"disabled"},null,-1),f={class:"task-list-item-label",for:"task-item-1"},m={href:"https://github.com/827652549/docsify-count",target:"_blank",rel:"noopener noreferrer"},b={class:"task-list-item"},y=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-2",checked:"checked",disabled:"disabled"},null,-1),g={class:"task-list-item-label",for:"task-item-2"},v={href:"https://github.com/cxcn/docsify-waline/blob/main/README.zh-CN.md",target:"_blank",rel:"noopener noreferrer"},L={class:"task-list-item"},W=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-3",checked:"checked",disabled:"disabled"},null,-1),w={class:"task-list-item-label",for:"task-item-3"},x={href:"https://github.com/mrpotatoes/docsify-toc",target:"_blank",rel:"noopener noreferrer"},_={href:"https://tainacan.github.io/tainacan-wiki/#/general-concepts",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/dromara/sureness/blob/master/docs/index.html",target:"_blank",rel:"noopener noreferrer"},j={href:"https://wiki.lifeupapp.fun/zh-cn/#/features/174",target:"_blank",rel:"noopener noreferrer"},F={class:"task-list-item"},M=(0,n.Lk)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-4",checked:"checked",disabled:"disabled"},null,-1),z={class:"task-list-item-label",for:"task-item-4"},C={href:"https://github.com/meff34/docsify-to-pdf-converter",target:"_blank",rel:"noopener noreferrer"},E=(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.Lk)("code",null,"illegal operation on a directory"),(0,n.eW)(" 报错:sidebar 中不要使用简写地址,将 "),(0,n.Lk)("code",null,"main/"),(0,n.eW)(" 改为 "),(0,n.Lk)("code",null,"main/README.md"),(0,n.eW)(",否则将读取到目录而报错。")]),(0,n.Lk)("li",null,[(0,n.Lk)("code",null,"'node_modules' 不是内部或外部命令"),(0,n.eW)(" 报错:将 package.json 的设置修改为 "),(0,n.Lk)("code",null,'"convert": "node_modules\\\\.bin\\\\docsify-pdf-converter"'),(0,n.eW)("。这问题多发生在 Windows,是由 Windows 与 Linux 路径规则不同而引起的。")])],-1),N=(0,n.Lk)("h2",{id:"配置",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#配置"},[(0,n.Lk)("span",null,"配置")])],-1),T=(0,n.Lk)("h3",{id:"docsify-emoji",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#docsify-emoji"},[(0,n.Lk)("span",null,"docsify emoji")])],-1),P={href:"https://docsify.js.org/#/zh-cn/plugins?id=emoji",target:"_blank",rel:"noopener noreferrer"},R=(0,n.Lk)("code",null,":",-1),S=(0,n.Lk)("code",null,":100:",-1),q=(0,n.Lk)("code",null,":100:",-1),A=(0,n.Lk)("p",null,"实际使用中,我直接复制 emoji,都能正常显示。",-1),Z=(0,n.Lk)("h2",{id:"本地命令",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#本地命令"},[(0,n.Lk)("span",null,"本地命令")])],-1),G={href:"https://github.com/docsifyjs/docsify-cli",target:"_blank",rel:"noopener noreferrer"},H=(0,n.Fv)('

    <path> 默认为当前路径,可使用子文件夹指定路径,如 ./docsdocs

    [] 为可省略命令区,无实际作用,输出时需要去除。

    Serve 启动

    若要在电脑上查看 docsify 页面,可执行 serve 架构命令,在本地主机上运行服务。默认本地端口为 3000,可以指定端口。

    docsify serve <path> [--open false] [--port 3000]\n

    使用时不要关闭命令终端,否则 serve 也会停止。

    生成侧边栏

    docsify generate <path> [--sidebar _sidebar.md]\n

    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),O={},I=(0,a(3671).A)(O,[["render",function(e,s){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[(0,n.Lk)("p",null,[(0,n.Lk)("a",t,[(0,n.eW)("docsify"),(0,n.bF)(a)]),(0,n.eW)(" 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。")]),(0,n.Lk)("p",null,[(0,n.eW)("本页集中了我使用 docsify 中遇到的问题,新手先看 "),(0,n.Lk)("a",o,[(0,n.eW)("docsify 入门文档"),(0,n.bF)(a)]),(0,n.eW)("。")]),i,(0,n.Lk)("p",null,[(0,n.Lk)("a",c,[(0,n.eW)("docsify 插件列表"),(0,n.bF)(a)]),(0,n.eW)(":")]),(0,n.Lk)("ul",r,[(0,n.Lk)("li",l,[d,(0,n.Lk)("label",p,[(0,n.Lk)("a",k,[(0,n.eW)("docsify 笔记类参考"),(0,n.bF)(a)]),(0,n.eW)(":看板娘,多级页面,页面点击效果,网站运行时间。")])]),(0,n.Lk)("li",u,[h,(0,n.Lk)("label",f,[(0,n.Lk)("a",m,[(0,n.eW)("docsify-count"),(0,n.bF)(a)]),(0,n.eW)(":docsify 的字数和阅读时长插件。")])]),(0,n.Lk)("li",b,[y,(0,n.Lk)("label",g,[(0,n.Lk)("a",v,[(0,n.eW)("docsify-waline"),(0,n.bF)(a)]),(0,n.eW)(":提供评论功能的同时,借用 docsify-count 接口展示阅读量。暂时停止 1300 宽度的 waline 显示,避免页面显示异常。")])]),(0,n.Lk)("li",L,[W,(0,n.Lk)("label",w,[(0,n.Lk)("a",x,[(0,n.eW)("docsify-toc"),(0,n.bF)(a)]),(0,n.eW)(":给笔记页内部添加目录。不过本插件与 gitalk、waline 冲突,页面宽于 1300px 时出现 toc 目录,评论区位置也跟着挤到页面顶部,需手动修改。参考链接:"),(0,n.Lk)("a",_,[(0,n.eW)("Tainacan Wiki"),(0,n.bF)(a)]),(0,n.eW)(","),(0,n.Lk)("a",D,[(0,n.eW)("Sureness"),(0,n.bF)(a)]),(0,n.eW)(","),(0,n.Lk)("a",j,[(0,n.eW)("lifeupapp"),(0,n.bF)(a)]),(0,n.eW)("。")])]),(0,n.Lk)("li",F,[M,(0,n.Lk)("label",z,[(0,n.Lk)("a",C,[(0,n.eW)("docsify-pdf-converter"),(0,n.bF)(a)]),(0,n.eW)(":将 docsify 转为 pdf,不带书签目录。")]),E])]),N,T,(0,n.Lk)("p",null,[(0,n.Lk)("a",P,[(0,n.eW)("emoji 插件"),(0,n.bF)(a)]),(0,n.eW)("在标题中使用容易出错,建议使用 "),R,(0,n.eW)("。例如,原本是 "),S,(0,n.eW)(",替换为 "),q,(0,n.eW)("。")]),A,Z,(0,n.Lk)("p",null,[(0,n.Lk)("a",G,[(0,n.eW)("docsify 本地命令"),(0,n.bF)(a)]),(0,n.eW)(":")]),H])}]]),J=JSON.parse('{"path":"/web/docsify.html","title":"docsify","lang":"zh-CN","frontmatter":{"article":false,"title":"docsify","icon":"edit","order":2,"description":"docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。 本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档。 插件 docsify 插件列表: docsify 笔记类参考:看板娘,多级页面,页面点击效果,网站运行时间。 d...","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/docsify.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"docsify"}],["meta",{"property":"og:description","content":"docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。 本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档。 插件 docsify 插件列表: docsify 笔记类参考:看板娘,多级页面,页面点击效果,网站运行时间。 d..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"docsify\\",\\"description\\":\\"docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。 本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档。 插件 docsify 插件列表: docsify 笔记类参考:看板娘,多级页面,页面点击效果,网站运行时间。 d...\\"}"]]},"headers":[{"level":2,"title":"插件","slug":"插件","link":"#插件","children":[]},{"level":2,"title":"配置","slug":"配置","link":"#配置","children":[{"level":3,"title":"docsify emoji","slug":"docsify-emoji","link":"#docsify-emoji","children":[]}]},{"level":2,"title":"本地命令","slug":"本地命令","link":"#本地命令","children":[{"level":3,"title":"Serve 启动","slug":"serve-启动","link":"#serve-启动","children":[]},{"level":3,"title":"生成侧边栏","slug":"生成侧边栏","link":"#生成侧边栏","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"引用路径","slug":"引用路径","link":"#引用路径","children":[]},{"level":3,"title":"页面未同步更新","slug":"页面未同步更新","link":"#页面未同步更新","children":[]},{"level":3,"title":"GitHub Pages 报错","slug":"github-pages-报错","link":"#github-pages-报错","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":16}]},"readingTime":{"minutes":2.7,"words":811},"filePathRelative":"web/docsify.md","localizedDate":"2022年7月22日","excerpt":"

    docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。

    \\n

    本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/emby.html.b5faa1db.js b/assets/js/emby.html.b5faa1db.js new file mode 100644 index 000000000..ae1657983 --- /dev/null +++ b/assets/js/emby.html.b5faa1db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2499],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},5167:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>d,data:()=>b});var s=a(7847);const t=(0,s.Fv)('

    Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。

    使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 99 美元的折扣价格获得。此外,Emby 对蓝光格式如 ISO 支持有限。

    使用 tips

    添加媒体库

    设置媒体库时,中国按简称“PRC”排列,在字母 P 下寻找。

    刮取元数据

    ',6),i={href:"https://xiaoyaliu.notion.site/dc28a32c807d418691b83519fa523306",target:"_blank",rel:"noopener noreferrer"},l=(0,s.Lk)("h3",{id:"移除合集",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#移除合集"},[(0,s.Lk)("span",null,"移除合集")])],-1),p=(0,s.Lk)("p",null,"如果你为家人设置了独立账户并设定了不同的媒体库权限,你会发现「合集」会自动显示在所有账户上。",-1),o=(0,s.Lk)("p",null,"登录相应的用户,在 Emby 设置界面选择「主屏幕」>「合集」,取消勾选「在主屏幕显示」。这样当前的账户就不会再显示合集信息了。然后在其他账户中也进行同样的操作,这样其他账户也不会再显示合集信息。尽管页面上会保留合集的菜单,但如果不想让敏感内容显示在合集中,可以在各自的账户中设置媒体文件夹权限。",-1),c=(0,s.Lk)("h3",{id:"安全地从外部访问",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#安全地从外部访问"},[(0,s.Lk)("span",null,"安全地从外部访问")])],-1),r={href:"https://www.bilibili.com/read/cv14814465/",target:"_blank",rel:"noopener noreferrer"},u=(0,s.Fv)('
    1. 确保你的家庭网络已设置了 DDNS(通常通过路由器完成)。
    2. 下载与你的域名匹配的 Tomcat 证书版本。
    3. 解压后,你会看到一个 pfx 文件和一个包含密码的 txt 文件。
    4. 将它们都放置在 config 目录的特定路径中。
    5. 接下来,在 Emby 的 服务器 > 网络 设置中,输入你的公共端口和 DDNS 域名。
    6. 建议开启安全连接模式,这样可以更好地保护你的数据安全。

    部署代码

    # https://hub.docker.com/r/linuxserver/emby\nversion: "2.1"\nservices:\n  emby:\n    image: lscr.io/linuxserver/emby:latest\n    container_name: emby\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n    volumes:\n      - /volume1/docker/emby/config:/config\n      # 媒体库映射\n      - /volume1/tvshows:/data/tvshows\n      - /volume4/movies:/data/movies\n      - /volume3/Anime:/data/anime\n      - /volume4/Documentary:/data/documentary\n      - /volume4/Music/MV:/data/MV\n      - /volume4/Music/Audio:/data/Audio\n      #- /opt/vc/lib:/opt/vc/lib #optional\n    ports:\n      - 8096:8096\n      - 8920:8920\n    restart: unless-stopped\n
    ',4),m={},d=(0,a(3671).A)(m,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,(0,s.Lk)("p",null,[(0,s.eW)("建议用 tinyMediaManager 刮取影视元数据,具体设置参考小雅的"),(0,s.Lk)("a",i,[(0,s.eW)("教程"),(0,s.bF)(a)]),(0,s.eW)("。统一刮取规则,便于将来更换管理器时无需重设。")]),l,p,o,c,(0,s.Lk)("p",null,[(0,s.eW)("如果你计划从外部访问 Emby,请务必启用 HTTPS。具体步骤可以参考"),(0,s.Lk)("a",r,[(0,s.eW)("这里"),(0,s.bF)(a)]),(0,s.eW)("。简单来说:")]),u])}]]),b=JSON.parse('{"path":"/services/dockers-on-nas/emby.html","title":"Emby:家庭媒体中心","lang":"zh-CN","frontmatter":{"article":false,"title":"Emby:家庭媒体中心","order":1,"description":"Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。 使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/emby.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Emby:家庭媒体中心"}],["meta",{"property":"og:description","content":"Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。 使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-09-15-05-32-43.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Emby:家庭媒体中心"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Emby:家庭媒体中心\\",\\"description\\":\\"Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。 使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 ...\\"}"]]},"headers":[{"level":2,"title":"使用 tips","slug":"使用-tips","link":"#使用-tips","children":[{"level":3,"title":"添加媒体库","slug":"添加媒体库","link":"#添加媒体库","children":[]},{"level":3,"title":"刮取元数据","slug":"刮取元数据","link":"#刮取元数据","children":[]},{"level":3,"title":"移除合集","slug":"移除合集","link":"#移除合集","children":[]},{"level":3,"title":"安全地从外部访问","slug":"安全地从外部访问","link":"#安全地从外部访问","children":[]}]},{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":2.16,"words":648},"filePathRelative":"services/dockers-on-nas/emby.md","localizedDate":"2023年9月16日","excerpt":"

    Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。

    \\n

    使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 99 美元的折扣价格获得。此外,Emby 对蓝光格式如 ISO 支持有限。

    \\n

    使用 tips

    \\n

    添加媒体库

    \\n

    设置媒体库时,中国按简称“PRC”排列,在字母 P 下寻找。

    \\n

    刮取元数据

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1118f585.a438a386.js b/assets/js/faq.html.fd19c1f8.js similarity index 85% rename from assets/js/v-1118f585.a438a386.js rename to assets/js/faq.html.fd19c1f8.js index 3c27fcf8a..7fea22110 100644 --- a/assets/js/v-1118f585.a438a386.js +++ b/assets/js/faq.html.fd19c1f8.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5448],{9720:(t,n)=>{n.c=(t,n)=>{const e=t.__vccOpts||t;for(const[t,a]of n)e[t]=a;return e}},6756:(t,n,e)=>{e.r(n),e.d(n,{comp:()=>C,data:()=>y});var a=e(3968);const o={href:"https://answers.microsoft.com/zh-hans/",target:"_blank",rel:"noopener noreferrer"},s=(0,a.IL)('

    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关闭当前程序窗口
    Ctrl + Shift + C复制文件路径

    %AppData% 为 C:\\Users\\用户名\\AppData\\Roaming 的变量路径。[1]

    网址快捷方式

    右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" https://newzone.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),r={href:"https://github.com/tw93/Pake",target:"_blank",rel:"noopener noreferrer"},i=(0,a.QD)("h3",{id:"web2desk",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#web2desk"},[(0,a.QD)("span",null,"Web2Desk")])],-1),l={href:"https://desktop.appmaker.xyz/",target:"_blank",rel:"noopener noreferrer"},d={href:"https://convertico.com/",target:"_blank",rel:"noopener noreferrer"},p=(0,a.IL)('

    常见问题

    无法切换中英文

    突然出现中英文无法切换,大部分情况是因为硬件出了问题,与输入法无关。

    • 检查方法:安装并启动 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),c={href:"https://www.jyrd.com/media/6490.html",target:"_blank",rel:"noopener noreferrer"},h=(0,a.QD)("li",null,"开启聚光灯效果:「视图」>「阅读模式」,每个文件需要单独开启,文件保存后自动开启。",-1),u=(0,a.IL)('

    Microsoft Store 应用快捷方式

    Microsoft Store 安装的应用没有固定位置,一更新就会换位置,无法建立快捷方式。虽然这些应用能被设为开机启动,但经常启动不成功。

    解决方法是:右键 Microsoft Store 应用,将其固定在任务栏。之后可使用 Win+数字键 来启动应用。例如,若应用在任务栏的第 7 位,则使用热键 Win+7

    无法安装应用

    安装应用却被提示「您的安全设置不允许将此应用程序安装到您的计算机上」时,新建记事本并输入下方代码,修改记事本的后缀名为.reg,然后右键以管理员身份运行,合并到注册表就可以了。[2]

    Windows Registry Editor Version 5.00\n[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\.NETFramework\\\\Security\\\\TrustManager\\\\PromptingLevel]\n"MyComputer"="Enabled"\n"LocalIntranet"="Enabled"\n"Internet"="Enabled"\n"TrustedSites"="Enabled"\n"UntrustedSites"="Disabled"\n

    ',7),m={class:"footnotes"},f={class:"footnotes-list"},k={id:"footnote1",class:"footnote-item"},b={href:"https://blog.csdn.net/lijianbiao0/article/details/85118775",target:"_blank",rel:"noopener noreferrer"},g=(0,a.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),W={id:"footnote2",class:"footnote-item"},w={href:"https://superuser.com/questions/1252575/unable-to-install-clickonce-application-due-to-security-settings-windows-10",target:"_blank",rel:"noopener noreferrer"},D=(0,a.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),v={},C=(0,e(9720).c)(v,[["render",function(t,n){const e=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.mY)("Windows 遇到不懂的问题,可以在 "),(0,a.QD)("a",o,[(0,a.mY)("Microsoft 支持社区"),(0,a.K2)(e)]),(0,a.mY)("中提问,回复比较快。")]),s,(0,a.QD)("p",null,[(0,a.QD)("a",r,[(0,a.mY)("Pake"),(0,a.K2)(e)]),(0,a.mY)(" 是一个使用 Rust 编写的工具,用于轻松构建跨平台的轻量级桌面应用,支持 Mac、Windows 和 Linux 操作系统,并提供了 YouTube、flomo、小红书等热门网页的打包文件。")]),i,(0,a.QD)("p",null,[(0,a.QD)("a",l,[(0,a.mY)("Web2Desk"),(0,a.K2)(e)]),(0,a.mY)(" 允许我们输入网页链接、应用名称和应用图标,然后通过其服务器构建,直接提供 Windows、macOS 和 Linux 的本机安装程序下载。然而,在测试中,使用 Web2Desk 将滴答清单 Web 转换为应用时,未能保存登录状态,因此实用性有限。")]),(0,a.QD)("p",null,[(0,a.mY)("图标转换:"),(0,a.QD)("a",d,[(0,a.mY)("ConvertICO"),(0,a.K2)(e)]),(0,a.mY)(" 可将 PNG 图像转换为 ICO 文件,以自定义图标。")]),p,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("让 wps 支持 vba 宏,安排 "),(0,a.QD)("a",c,[(0,a.mY)("WPS VBA 模块 V7.1 版本"),(0,a.K2)(e)]),(0,a.mY)(";点击「选项」>「信任中心」>「启用宏」,添加为受信任的文档,或添加主要文件夹为信任位置。")]),h]),u,(0,a.QD)("section",m,[(0,a.QD)("ol",f,[(0,a.QD)("li",k,[(0,a.QD)("p",null,[(0,a.QD)("a",b,[(0,a.mY)("Windows 变量路径"),(0,a.K2)(e)]),(0,a.mY)(),g])]),(0,a.QD)("li",W,[(0,a.QD)("p",null,[(0,a.QD)("a",w,[(0,a.mY)("Unable to Install ClickOnce Application due to Security Settings"),(0,a.K2)(e)]),(0,a.mY)(),D])])])])])}]]),y=JSON.parse('{"path":"/windows/faq.html","title":"Windows","lang":"zh-CN","frontmatter":{"article":false,"title":"Windows","icon":"windows","order":1,"description":"Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。 Windows 快捷键 %AppData% 为 C:\\\\Users\\\\用户名\\\\AppData\\\\Roaming 的变量路径。[1] 网址快捷方式 右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:\\"C:\\\\\\\\Program Fil...","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/faq.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Windows"}],["meta",{"property":"og:description","content":"Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。 Windows 快捷键 %AppData% 为 C:\\\\Users\\\\用户名\\\\AppData\\\\Roaming 的变量路径。[1] 网址快捷方式 右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:\\"C:\\\\\\\\Program Fil..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Windows\\",\\"description\\":\\"Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。 Windows 快捷键 %AppData% 为 C:\\\\\\\\Users\\\\\\\\用户名\\\\\\\\AppData\\\\\\\\Roaming 的变量路径。[1] 网址快捷方式 右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:\\\\\\"C:\\\\\\\\\\\\\\\\Program Fil...\\"}"]]},"headers":[{"level":2,"title":"Windows 快捷键","slug":"windows-快捷键","link":"#windows-快捷键","children":[]},{"level":2,"title":"网址快捷方式","slug":"网址快捷方式","link":"#网址快捷方式","children":[]},{"level":2,"title":"Chrome 开发工具","slug":"chrome-开发工具","link":"#chrome-开发工具","children":[]},{"level":2,"title":"网页转桌面应用","slug":"网页转桌面应用","link":"#网页转桌面应用","children":[{"level":3,"title":"Chrome App","slug":"chrome-app","link":"#chrome-app","children":[]},{"level":3,"title":"Pake","slug":"pake","link":"#pake","children":[]},{"level":3,"title":"Web2Desk","slug":"web2desk","link":"#web2desk","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"无法切换中英文","slug":"无法切换中英文","link":"#无法切换中英文","children":[]},{"level":3,"title":"禁止系统自动更新重启","slug":"禁止系统自动更新重启","link":"#禁止系统自动更新重启","children":[]},{"level":3,"title":"WPS 没有宏","slug":"wps-没有宏","link":"#wps-没有宏","children":[]},{"level":3,"title":"Microsoft Store 应用快捷方式","slug":"microsoft-store-应用快捷方式","link":"#microsoft-store-应用快捷方式","children":[]},{"level":3,"title":"无法安装应用","slug":"无法安装应用","link":"#无法安装应用","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":17}]},"readingTime":{"minutes":4.46,"words":1339},"filePathRelative":"windows/faq.md","localizedDate":"2022年7月22日","excerpt":"

    Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。

    \\n

    Windows 快捷键

    \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
    快捷键功能
    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关闭当前程序窗口
    Ctrl + Shift + C复制文件路径
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6262],{3671:(t,n)=>{n.A=(t,n)=>{const e=t.__vccOpts||t;for(const[t,a]of n)e[t]=a;return e}},1986:(t,n,e)=>{e.r(n),e.d(n,{comp:()=>L,data:()=>y});var a=e(7847);const o={href:"https://answers.microsoft.com/zh-hans/",target:"_blank",rel:"noopener noreferrer"},s=(0,a.Fv)('

    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关闭当前程序窗口
    Ctrl + Shift + C复制文件路径

    %AppData% 为 C:\\Users\\用户名\\AppData\\Roaming 的变量路径。[1]

    网址快捷方式

    右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" https://newzone.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),r={href:"https://github.com/tw93/Pake",target:"_blank",rel:"noopener noreferrer"},i=(0,a.Lk)("h3",{id:"web2desk",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#web2desk"},[(0,a.Lk)("span",null,"Web2Desk")])],-1),l={href:"https://desktop.appmaker.xyz/",target:"_blank",rel:"noopener noreferrer"},d={href:"https://convertico.com/",target:"_blank",rel:"noopener noreferrer"},p=(0,a.Fv)('

    常见问题

    无法切换中英文

    突然出现中英文无法切换,大部分情况是因为硬件出了问题,与输入法无关。

    • 检查方法:安装并启动 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),c={href:"https://www.jyrd.com/media/6490.html",target:"_blank",rel:"noopener noreferrer"},h=(0,a.Lk)("li",null,"开启聚光灯效果:「视图」>「阅读模式」,每个文件需要单独开启,文件保存后自动开启。",-1),u=(0,a.Fv)('

    Microsoft Store 应用快捷方式

    Microsoft Store 安装的应用没有固定位置,一更新就会换位置,无法建立快捷方式。虽然这些应用能被设为开机启动,但经常启动不成功。

    解决方法是:右键 Microsoft Store 应用,将其固定在任务栏。之后可使用 Win+数字键 来启动应用。例如,若应用在任务栏的第 7 位,则使用热键 Win+7

    无法安装应用

    安装应用却被提示「您的安全设置不允许将此应用程序安装到您的计算机上」时,新建记事本并输入下方代码,修改记事本的后缀名为.reg,然后右键以管理员身份运行,合并到注册表就可以了。[2]

    Windows Registry Editor Version 5.00\n[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\.NETFramework\\\\Security\\\\TrustManager\\\\PromptingLevel]\n"MyComputer"="Enabled"\n"LocalIntranet"="Enabled"\n"Internet"="Enabled"\n"TrustedSites"="Enabled"\n"UntrustedSites"="Disabled"\n

    ',7),k={class:"footnotes"},f={class:"footnotes-list"},m={id:"footnote1",class:"footnote-item"},W={href:"https://blog.csdn.net/lijianbiao0/article/details/85118775",target:"_blank",rel:"noopener noreferrer"},b=(0,a.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),g={id:"footnote2",class:"footnote-item"},w={href:"https://superuser.com/questions/1252575/unable-to-install-clickonce-application-due-to-security-settings-windows-10",target:"_blank",rel:"noopener noreferrer"},v=(0,a.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),C={},L=(0,e(3671).A)(C,[["render",function(t,n){const e=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.eW)("Windows 遇到不懂的问题,可以在 "),(0,a.Lk)("a",o,[(0,a.eW)("Microsoft 支持社区"),(0,a.bF)(e)]),(0,a.eW)("中提问,回复比较快。")]),s,(0,a.Lk)("p",null,[(0,a.Lk)("a",r,[(0,a.eW)("Pake"),(0,a.bF)(e)]),(0,a.eW)(" 是一个使用 Rust 编写的工具,用于轻松构建跨平台的轻量级桌面应用,支持 Mac、Windows 和 Linux 操作系统,并提供了 YouTube、flomo、小红书等热门网页的打包文件。")]),i,(0,a.Lk)("p",null,[(0,a.Lk)("a",l,[(0,a.eW)("Web2Desk"),(0,a.bF)(e)]),(0,a.eW)(" 允许我们输入网页链接、应用名称和应用图标,然后通过其服务器构建,直接提供 Windows、macOS 和 Linux 的本机安装程序下载。然而,在测试中,使用 Web2Desk 将滴答清单 Web 转换为应用时,未能保存登录状态,因此实用性有限。")]),(0,a.Lk)("p",null,[(0,a.eW)("图标转换:"),(0,a.Lk)("a",d,[(0,a.eW)("ConvertICO"),(0,a.bF)(e)]),(0,a.eW)(" 可将 PNG 图像转换为 ICO 文件,以自定义图标。")]),p,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.eW)("让 wps 支持 vba 宏,安排 "),(0,a.Lk)("a",c,[(0,a.eW)("WPS VBA 模块 V7.1 版本"),(0,a.bF)(e)]),(0,a.eW)(";点击「选项」>「信任中心」>「启用宏」,添加为受信任的文档,或添加主要文件夹为信任位置。")]),h]),u,(0,a.Lk)("section",k,[(0,a.Lk)("ol",f,[(0,a.Lk)("li",m,[(0,a.Lk)("p",null,[(0,a.Lk)("a",W,[(0,a.eW)("Windows 变量路径"),(0,a.bF)(e)]),(0,a.eW)(),b])]),(0,a.Lk)("li",g,[(0,a.Lk)("p",null,[(0,a.Lk)("a",w,[(0,a.eW)("Unable to Install ClickOnce Application due to Security Settings"),(0,a.bF)(e)]),(0,a.eW)(),v])])])])])}]]),y=JSON.parse('{"path":"/windows/faq.html","title":"Windows","lang":"zh-CN","frontmatter":{"article":false,"title":"Windows","icon":"windows","order":1,"description":"Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。 Windows 快捷键 %AppData% 为 C:\\\\Users\\\\用户名\\\\AppData\\\\Roaming 的变量路径。[1] 网址快捷方式 右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:\\"C:\\\\\\\\Program Fil...","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/faq.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Windows"}],["meta",{"property":"og:description","content":"Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。 Windows 快捷键 %AppData% 为 C:\\\\Users\\\\用户名\\\\AppData\\\\Roaming 的变量路径。[1] 网址快捷方式 右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:\\"C:\\\\\\\\Program Fil..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Windows\\",\\"description\\":\\"Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。 Windows 快捷键 %AppData% 为 C:\\\\\\\\Users\\\\\\\\用户名\\\\\\\\AppData\\\\\\\\Roaming 的变量路径。[1] 网址快捷方式 右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:\\\\\\"C:\\\\\\\\\\\\\\\\Program Fil...\\"}"]]},"headers":[{"level":2,"title":"Windows 快捷键","slug":"windows-快捷键","link":"#windows-快捷键","children":[]},{"level":2,"title":"网址快捷方式","slug":"网址快捷方式","link":"#网址快捷方式","children":[]},{"level":2,"title":"Chrome 开发工具","slug":"chrome-开发工具","link":"#chrome-开发工具","children":[]},{"level":2,"title":"网页转桌面应用","slug":"网页转桌面应用","link":"#网页转桌面应用","children":[{"level":3,"title":"Chrome App","slug":"chrome-app","link":"#chrome-app","children":[]},{"level":3,"title":"Pake","slug":"pake","link":"#pake","children":[]},{"level":3,"title":"Web2Desk","slug":"web2desk","link":"#web2desk","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"无法切换中英文","slug":"无法切换中英文","link":"#无法切换中英文","children":[]},{"level":3,"title":"禁止系统自动更新重启","slug":"禁止系统自动更新重启","link":"#禁止系统自动更新重启","children":[]},{"level":3,"title":"WPS 没有宏","slug":"wps-没有宏","link":"#wps-没有宏","children":[]},{"level":3,"title":"Microsoft Store 应用快捷方式","slug":"microsoft-store-应用快捷方式","link":"#microsoft-store-应用快捷方式","children":[]},{"level":3,"title":"无法安装应用","slug":"无法安装应用","link":"#无法安装应用","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":17}]},"readingTime":{"minutes":4.46,"words":1339},"filePathRelative":"windows/faq.md","localizedDate":"2022年7月22日","excerpt":"

    Windows 遇到不懂的问题,可以在 Microsoft 支持社区中提问,回复比较快。

    \\n

    Windows 快捷键

    \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
    快捷键功能
    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关闭当前程序窗口
    Ctrl + Shift + C复制文件路径
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-ec82d7fc.806bb4e5.js b/assets/js/feishu.html.329f2283.js similarity index 96% rename from assets/js/v-ec82d7fc.806bb4e5.js rename to assets/js/feishu.html.329f2283.js index c323bc25c..5f203ed6d 100644 --- a/assets/js/v-ec82d7fc.806bb4e5.js +++ b/assets/js/feishu.html.329f2283.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3744],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6320:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>g,data:()=>l});var n=a(3968);const i=(0,n.IL)('

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    飞书文档

    知识库

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    表格

    相较于 Excel,飞书表格更加方便实用,同时在线文档编辑也更为便捷。例如,我的作息时间表就采用了飞书表格,并不时地进行更新。

    收集表

    在数据收集方面,飞书多维表格非常方便,而且支持嵌入网页,每月还提供 200 次的自定义推送通知。我打算继续在飞书上使用这一功能,不过机器人通知会转移到 Discord 客户端。

    飞书邮箱

    飞书邮箱简单易用且功能强大,支持设置多个别名邮箱,还能为第三方邮箱客户端生成专用密码,并统计创建和最后使用的时间。

    飞书邮箱设置
    飞书邮箱设置

    目前,我的飞书邮箱是博客和自托管服务的联系邮箱。因为这部分的使用频率较低,我设置了邮件自动转发到主力邮箱,避免需要登录查看。需要注意的是,自动转发功能需要在管理后台进行设置开启,否则该选项将不可见。

    如果你的域名邮箱不需要大量发送邮件,我仍然推荐使用飞书邮箱。毕竟,大多数国外域名邮箱需要付费,而国内其他邮箱的体验也相当一般。比如阿里邮箱,它连免费额度限制也不公开,客服回复「阿里邮箱对发件人所发邮件有一定的频率和数量上的限制,包括每分钟、每小时、每日,若超过相应的发信量限制,系统会拒发并报错。其中,以上频率或数量的限制数值属于阿里云阿里邮箱保密数据,因为安全原因无法对外提供。」

    飞书捷径

    打开飞书捷径,却发现名称显示「飞书机器人助手」,不清楚两者到底是什么关系。改版后,飞书捷径不再支持海外链接,同时对第三方服务的支持也减少了。

    不过,飞书捷径仍然支持个人免费使用。与之前的流程不同的是,你需要先建立机器人应用并发布,然后才能创建机器人指令。务必确保应用已发布,否则相关指令将无法触发。

    原计划中,我打算通过飞书捷径将国内服务的通知转发到 Discord,以实现统一的通知管理。然而,在测试中发现,飞书捷径机器人无法将群消息作为触发节点。虽然飞书群组机器人能接收通知,但捷径机器人却无法读取这些通知,从而无法继续转发。

    目前,我只能将飞书捷径用于轻量表格记录,例如,在接收通知消息后,通过触发飞书捷径的 webhook,将消息添加到飞书表格中。然而,添加这个功能时发现,只有企业版才能修改表格内容,并需要企业版管理员开通“飞书机器人助手”应用。但飞书捷径的名称不是显示为“飞书机器人助手”吗?对于个人用户来说,这个逻辑相当奇怪。

    未开通机器人助手会提示错误

    Webhook 通知

    我之前的 Webhook 通知是通过飞书群组机器人实现的。替代方法非常简单,只需将飞书的 webhook 替换为其他服务的链接即可。大多数通知机器人都支持 webhook,如 Telegram、Slack、Discord 等。

    以 Discord 通知为例,只需将链接 https://open.feishu.cn/open-apis/bot/v2/hook/******* 替换为 https://discord.com/api/webhooks/***/******

    ',26),o={href:"https://newzone.top/services/dockers-on-nas/n8n.html",target:"_blank",rel:"noopener noreferrer"},p=(0,n.IL)('
    n8n 转接 webhook 消息
    n8n 转接 webhook 消息

    其他

    • 飞书 OKR:由于我之前使用较少,直接放弃。
    • 飞书妙记:妙计用于音视频转文字,而妙记在桌面端已经被 Whisper 替代,我偶尔还会在手机端使用它进行语音转文字。

    更多

    飞书在产品设计和体验方面表现相当不错。然而,飞书的改版使其产品逻辑全面向企业用户,要求所有接口均需企业管理员授权,导致免费和轻度企业用户流失严重。

    飞书最初依靠免费和轻度企业用户的口碑打响了名声,很难说改版会大幅改良它的营收状况。我最初完全投入飞书是从少数派社群开始的。然而,社群停止后,我对飞书的使用频率也在下降。当然,个人认为少数派飞书社群的关闭是一个双输。虽然飞书节省了免费用户的开销,但流失了大量早期用户和口碑。而自从少数派迁移到内部社群后,少数派的会员对我来说变得不那么重要,会员社区的访问也大大减少了。少数派会员的价值只剩每周一次的会员社区通讯。

    Hummer 评论称,「浪费这么多时间,还不如省下来时间多赚钱,继续用飞书提高效率」。这一观点方向上无疑没错的。然而,飞书的问题不仅在于其收费方案,而在于功能限制和不合理的功能削减。在我实际使用中,从未超出免费额度,但现在一些实用功能已被移除。想通过飞书提高效率、节约时间并增加收入,前提是这些功能需要存在。

    ',7),r={},g=(0,a(9720).c)(r,[["render",function(e,t){const a=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[i,(0,n.QD)("p",null,[(0,n.mY)("如果你的服务器或容器不支持发送海外链接,可以使用部署在海外服务器上的 "),(0,n.QD)("a",o,[(0,n.mY)("n8n"),(0,n.K2)(a)]),(0,n.mY)(" 来转接 webhook 消息。")]),p])}]]),l=JSON.parse('{"path":"/apps/tutorials/feishu.html","title":"飞书迁移记录","lang":"zh-CN","frontmatter":{"article":true,"title":"飞书迁移记录","date":"2023-12-11T00:00:00.000Z","category":["工具"],"order":201,"description":"飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。 飞书文档 知识库 我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/feishu.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"飞书迁移记录"}],["meta",{"property":"og:description","content":"飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。 飞书文档 知识库 我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-11-10-56-52.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:49:14.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"飞书迁移记录"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:published_time","content":"2023-12-11T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:49:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"飞书迁移记录\\",\\"image\\":[\\"https://img.newzone.top/2023-12-11-10-56-52.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-10-52-56.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-10-55-18.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-10-15-45-44.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-14-10-37.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-14-03-25.png?imageMogr2/format/webp \\\\\\"未开通机器人助手会提示错误\\\\\\"\\",\\"https://img.newzone.top/2023-12-10-15-11-15.png?imageMogr2/format/webp?imageMogr2/format/webp/thumbnail/400x\\"],\\"datePublished\\":\\"2023-12-11T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-15T19:49:14.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"飞书文档","slug":"飞书文档","link":"#飞书文档","children":[{"level":3,"title":"知识库","slug":"知识库","link":"#知识库","children":[]},{"level":3,"title":"表格","slug":"表格","link":"#表格","children":[]},{"level":3,"title":"收集表","slug":"收集表","link":"#收集表","children":[]}]},{"level":2,"title":"飞书邮箱","slug":"飞书邮箱","link":"#飞书邮箱","children":[]},{"level":2,"title":"飞书捷径","slug":"飞书捷径","link":"#飞书捷径","children":[]},{"level":2,"title":"Webhook 通知","slug":"webhook-通知","link":"#webhook-通知","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]}],"git":{"createdTime":1702279579000,"updatedTime":1705348154000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":5.68,"words":1704},"filePathRelative":"apps/tutorials/feishu.md","localizedDate":"2023年12月11日","excerpt":"

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    \\n

    飞书文档

    \\n

    知识库

    \\n

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1734],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},2232:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>g,data:()=>l});var n=a(7847);const i=(0,n.Fv)('

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    飞书文档

    知识库

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    表格

    相较于 Excel,飞书表格更加方便实用,同时在线文档编辑也更为便捷。例如,我的作息时间表就采用了飞书表格,并不时地进行更新。

    收集表

    在数据收集方面,飞书多维表格非常方便,而且支持嵌入网页,每月还提供 200 次的自定义推送通知。我打算继续在飞书上使用这一功能,不过机器人通知会转移到 Discord 客户端。

    飞书邮箱

    飞书邮箱简单易用且功能强大,支持设置多个别名邮箱,还能为第三方邮箱客户端生成专用密码,并统计创建和最后使用的时间。

    飞书邮箱设置
    飞书邮箱设置

    目前,我的飞书邮箱是博客和自托管服务的联系邮箱。因为这部分的使用频率较低,我设置了邮件自动转发到主力邮箱,避免需要登录查看。需要注意的是,自动转发功能需要在管理后台进行设置开启,否则该选项将不可见。

    如果你的域名邮箱不需要大量发送邮件,我仍然推荐使用飞书邮箱。毕竟,大多数国外域名邮箱需要付费,而国内其他邮箱的体验也相当一般。比如阿里邮箱,它连免费额度限制也不公开,客服回复「阿里邮箱对发件人所发邮件有一定的频率和数量上的限制,包括每分钟、每小时、每日,若超过相应的发信量限制,系统会拒发并报错。其中,以上频率或数量的限制数值属于阿里云阿里邮箱保密数据,因为安全原因无法对外提供。」

    飞书捷径

    打开飞书捷径,却发现名称显示「飞书机器人助手」,不清楚两者到底是什么关系。改版后,飞书捷径不再支持海外链接,同时对第三方服务的支持也减少了。

    不过,飞书捷径仍然支持个人免费使用。与之前的流程不同的是,你需要先建立机器人应用并发布,然后才能创建机器人指令。务必确保应用已发布,否则相关指令将无法触发。

    原计划中,我打算通过飞书捷径将国内服务的通知转发到 Discord,以实现统一的通知管理。然而,在测试中发现,飞书捷径机器人无法将群消息作为触发节点。虽然飞书群组机器人能接收通知,但捷径机器人却无法读取这些通知,从而无法继续转发。

    目前,我只能将飞书捷径用于轻量表格记录,例如,在接收通知消息后,通过触发飞书捷径的 webhook,将消息添加到飞书表格中。然而,添加这个功能时发现,只有企业版才能修改表格内容,并需要企业版管理员开通“飞书机器人助手”应用。但飞书捷径的名称不是显示为“飞书机器人助手”吗?对于个人用户来说,这个逻辑相当奇怪。

    未开通机器人助手会提示错误

    Webhook 通知

    我之前的 Webhook 通知是通过飞书群组机器人实现的。替代方法非常简单,只需将飞书的 webhook 替换为其他服务的链接即可。大多数通知机器人都支持 webhook,如 Telegram、Slack、Discord 等。

    以 Discord 通知为例,只需将链接 https://open.feishu.cn/open-apis/bot/v2/hook/******* 替换为 https://discord.com/api/webhooks/***/******

    ',26),o={href:"https://newzone.top/services/dockers-on-nas/n8n.html",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Fv)('
    n8n 转接 webhook 消息
    n8n 转接 webhook 消息

    其他

    • 飞书 OKR:由于我之前使用较少,直接放弃。
    • 飞书妙记:妙计用于音视频转文字,而妙记在桌面端已经被 Whisper 替代,我偶尔还会在手机端使用它进行语音转文字。

    更多

    飞书在产品设计和体验方面表现相当不错。然而,飞书的改版使其产品逻辑全面向企业用户,要求所有接口均需企业管理员授权,导致免费和轻度企业用户流失严重。

    飞书最初依靠免费和轻度企业用户的口碑打响了名声,很难说改版会大幅改良它的营收状况。我最初完全投入飞书是从少数派社群开始的。然而,社群停止后,我对飞书的使用频率也在下降。当然,个人认为少数派飞书社群的关闭是一个双输。虽然飞书节省了免费用户的开销,但流失了大量早期用户和口碑。而自从少数派迁移到内部社群后,少数派的会员对我来说变得不那么重要,会员社区的访问也大大减少了。少数派会员的价值只剩每周一次的会员社区通讯。

    Hummer 评论称,「浪费这么多时间,还不如省下来时间多赚钱,继续用飞书提高效率」。这一观点方向上无疑没错的。然而,飞书的问题不仅在于其收费方案,而在于功能限制和不合理的功能削减。在我实际使用中,从未超出免费额度,但现在一些实用功能已被移除。想通过飞书提高效率、节约时间并增加收入,前提是这些功能需要存在。

    ',7),r={},g=(0,a(3671).A)(r,[["render",function(e,t){const a=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[i,(0,n.Lk)("p",null,[(0,n.eW)("如果你的服务器或容器不支持发送海外链接,可以使用部署在海外服务器上的 "),(0,n.Lk)("a",o,[(0,n.eW)("n8n"),(0,n.bF)(a)]),(0,n.eW)(" 来转接 webhook 消息。")]),p])}]]),l=JSON.parse('{"path":"/apps/tutorials/feishu.html","title":"飞书迁移记录","lang":"zh-CN","frontmatter":{"article":true,"title":"飞书迁移记录","date":"2023-12-11T00:00:00.000Z","category":["工具"],"order":201,"description":"飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。 飞书文档 知识库 我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/feishu.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"飞书迁移记录"}],["meta",{"property":"og:description","content":"飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。 飞书文档 知识库 我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-11-10-56-52.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:49:14.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"飞书迁移记录"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:published_time","content":"2023-12-11T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:49:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"飞书迁移记录\\",\\"image\\":[\\"https://img.newzone.top/2023-12-11-10-56-52.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-10-52-56.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-10-55-18.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-10-15-45-44.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-14-10-37.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-11-14-03-25.png?imageMogr2/format/webp \\\\\\"未开通机器人助手会提示错误\\\\\\"\\",\\"https://img.newzone.top/2023-12-10-15-11-15.png?imageMogr2/format/webp?imageMogr2/format/webp/thumbnail/400x\\"],\\"datePublished\\":\\"2023-12-11T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-15T19:49:14.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"飞书文档","slug":"飞书文档","link":"#飞书文档","children":[{"level":3,"title":"知识库","slug":"知识库","link":"#知识库","children":[]},{"level":3,"title":"表格","slug":"表格","link":"#表格","children":[]},{"level":3,"title":"收集表","slug":"收集表","link":"#收集表","children":[]}]},{"level":2,"title":"飞书邮箱","slug":"飞书邮箱","link":"#飞书邮箱","children":[]},{"level":2,"title":"飞书捷径","slug":"飞书捷径","link":"#飞书捷径","children":[]},{"level":2,"title":"Webhook 通知","slug":"webhook-通知","link":"#webhook-通知","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"更多","slug":"更多","link":"#更多","children":[]}],"git":{"createdTime":1702279579000,"updatedTime":1705348154000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":5.68,"words":1704},"filePathRelative":"apps/tutorials/feishu.md","localizedDate":"2023年12月11日","excerpt":"

    飞书曾经展现出极大的开放性,然而在一次改版后,它取消了对免费用户的支持,限制越来越多,促使我将各项内容从飞书迁移出来。以下是我的飞书迁移记录和替代方案。

    \\n

    飞书文档

    \\n

    知识库

    \\n

    我的早期笔记都保存在为知笔记,而随着飞书的出现,我将大多数存档性资料迁移到飞书知识库。尽管我原本计划完全弃用飞书,但由于时间和精力的有限,我并没有再次进行一次全面的迁移。幸运的是,我并没有将重要知识点笔记存放在飞书上,所以剩余的说明书等次要文档将继续保留在这个平台上。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-47c36a5a.8349e1f0.js b/assets/js/flare.html.b0d84ef3.js similarity index 87% rename from assets/js/v-47c36a5a.8349e1f0.js rename to assets/js/flare.html.b0d84ef3.js index 6ecc13997..e098bb53e 100644 --- a/assets/js/v-47c36a5a.8349e1f0.js +++ b/assets/js/flare.html.b0d84ef3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2656],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},1360:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>m,data:()=>d});var s=a(3968);const t={href:"https://github.com/soulteary/docker-flare",target:"_blank",rel:"noopener noreferrer"},l=(0,s.QD)("p",null,[(0,s.QD)("strong",null,"优势"),(0,s.mY)(":")],-1),r=(0,s.QD)("li",null,[(0,s.QD)("strong",null,"本地搜索书签"),(0,s.mY)(":Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。")],-1),o=(0,s.QD)("strong",null,"批量导入书签",-1),i={href:"https://tools.newzone.top/data-parser/flare",target:"_blank",rel:"noopener noreferrer"},p=(0,s.IL)('

    存在的问题:Flare 无法打开 chrome://extensions/ 等非标准格式的链接。

    部署代码

    使用以下的 Docker 配置文件,你可以轻松部署 Flare,享受快速而强大的本地导航体验。

    version: '3.6'\n\nservices:\n  flare:\n    container_name: flare\n    image: soulteary/flare\n    restart: always\n    # 默认无需添加任何参数,如有特殊需求\n    # 可阅读文档 https://github.com/soulteary/docker-flare/blob/main/docs/advanced-startup.md\n    command: flare\n    # 启用账号登陆模式\n    # command: flare --nologin=0\n    # environment:\n      # 如需开启用户登陆模式,需要先设置 `nologin` 启动参数为 `0`\n      # 如开启 `nologin`,未设置 FLARE_USER,则默认用户为 `flare`\n      # - FLARE_USER=flare\n      # 指定你自己的账号密码,如未设置 `FLARE_USER`,则会默认生成密码并展示在应用启动日志中\n      # - FLARE_PASS=your_password\n      # 是否开启“使用向导”,访问 `/guide`\n      # - FLARE_GUIDE=1\n    ports:\n      - 7570:5005\n    volumes:\n      - /volume1/docker/flare/app:/app\n
    ',4),c={},m=(0,a(9720).c)(c,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.mY)("在众多本地导航工具中,"),(0,s.QD)("a",t,[(0,s.mY)("Flare"),(0,s.K2)(a)]),(0,s.mY)(" 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。")]),l,(0,s.QD)("ul",null,[r,(0,s.QD)("li",null,[o,(0,s.mY)(":这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使用我写的 "),(0,s.QD)("a",i,[(0,s.mY)("Flare 书签解析工具"),(0,s.K2)(a)]),(0,s.mY)("。")])]),p])}]]),d=JSON.parse('{"path":"/services/dockers-on-nas/flare.html","title":"Flare:快速导航页","lang":"zh-CN","frontmatter":{"article":false,"title":"Flare:快速导航页","order":93,"description":"在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。 优势: 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/flare.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Flare:快速导航页"}],["meta",{"property":"og:description","content":"在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。 优势: 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Flare:快速导航页\\",\\"description\\":\\"在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。 优势: 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使...\\"}"]]},"headers":[{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1706004554000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.23,"words":370},"filePathRelative":"services/dockers-on-nas/flare.md","localizedDate":"2024年1月23日","excerpt":"

    在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。

    \\n

    优势

    \\n
      \\n
    • 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。
    • \\n
    • 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使用我写的 Flare 书签解析工具
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1074],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},8721:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>d,data:()=>u});var s=a(7847);const t={href:"https://github.com/soulteary/docker-flare",target:"_blank",rel:"noopener noreferrer"},l=(0,s.Lk)("p",null,[(0,s.Lk)("strong",null,"优势"),(0,s.eW)(":")],-1),r=(0,s.Lk)("li",null,[(0,s.Lk)("strong",null,"本地搜索书签"),(0,s.eW)(":Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。")],-1),o=(0,s.Lk)("strong",null,"批量导入书签",-1),i={href:"https://tools.newzone.top/data-parser/flare",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Fv)('

    存在的问题:Flare 无法打开 chrome://extensions/ 等非标准格式的链接。

    部署代码

    使用以下的 Docker 配置文件,你可以轻松部署 Flare,享受快速而强大的本地导航体验。

    version: '3.6'\n\nservices:\n  flare:\n    container_name: flare\n    image: soulteary/flare\n    restart: always\n    # 默认无需添加任何参数,如有特殊需求\n    # 可阅读文档 https://github.com/soulteary/docker-flare/blob/main/docs/advanced-startup.md\n    command: flare\n    # 启用账号登陆模式\n    # command: flare --nologin=0\n    # environment:\n      # 如需开启用户登陆模式,需要先设置 `nologin` 启动参数为 `0`\n      # 如开启 `nologin`,未设置 FLARE_USER,则默认用户为 `flare`\n      # - FLARE_USER=flare\n      # 指定你自己的账号密码,如未设置 `FLARE_USER`,则会默认生成密码并展示在应用启动日志中\n      # - FLARE_PASS=your_password\n      # 是否开启“使用向导”,访问 `/guide`\n      # - FLARE_GUIDE=1\n    ports:\n      - 7570:5005\n    volumes:\n      - /volume1/docker/flare/app:/app\n
    ',4),c={},d=(0,a(3671).A)(c,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.eW)("在众多本地导航工具中,"),(0,s.Lk)("a",t,[(0,s.eW)("Flare"),(0,s.bF)(a)]),(0,s.eW)(" 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。")]),l,(0,s.Lk)("ul",null,[r,(0,s.Lk)("li",null,[o,(0,s.eW)(":这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使用我写的 "),(0,s.Lk)("a",i,[(0,s.eW)("Flare 书签解析工具"),(0,s.bF)(a)]),(0,s.eW)("。")])]),p])}]]),u=JSON.parse('{"path":"/services/dockers-on-nas/flare.html","title":"Flare:快速导航页","lang":"zh-CN","frontmatter":{"article":false,"title":"Flare:快速导航页","order":93,"description":"在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。 优势: 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/flare.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Flare:快速导航页"}],["meta",{"property":"og:description","content":"在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。 优势: 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Flare:快速导航页\\",\\"description\\":\\"在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。 优势: 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使...\\"}"]]},"headers":[{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1706004554000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.23,"words":370},"filePathRelative":"services/dockers-on-nas/flare.md","localizedDate":"2024年1月23日","excerpt":"

    在众多本地导航工具中,Flare 以其极速的加载时间和强大的功能脱颖而出。相较于其他需要 2-3 秒的加载时间,Flare 只需短短 0.2 秒即可完成加载,大幅提升了效率。

    \\n

    优势

    \\n
      \\n
    • 本地搜索书签:Flare 支持高效的本地书签搜索功能,帮助用户迅速找到所需的信息。
    • \\n
    • 批量导入书签:这一功能使得链接的编辑和管理变得异常简便。如果你需要进行批量导入,可以使用我写的 Flare 书签解析工具
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/gitlab.html.0142fe81.js b/assets/js/gitlab.html.0142fe81.js new file mode 100644 index 000000000..f734fe900 --- /dev/null +++ b/assets/js/gitlab.html.0142fe81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1371],{3671:(n,a)=>{a.A=(n,a)=>{const t=n.__vccOpts||n;for(const[n,e]of a)t[n]=e;return t}},6812:(n,a,t)=>{t.r(a),t.d(a,{comp:()=>c,data:()=>p});var e=t(7847);const s=(0,e.Lk)("p",null,"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。",-1),i={href:"https://docs.gitlab.com/ee/install/docker.html",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Fv)('

    部署命令

    GitLab 会占用 4G 内存,初始化部署时间较长,最好等半小时在连接。你可以在服务器上使用 sudo docker logs -f gitlab 来跟踪部署进度。

    部署好后,在服务器上运行 sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password 获取 root 用户的初始随机密码。如果无法用获得的密码登录,可能是因为你的初始化部署有问题,需清空配置文件夹,然后重新部署。

    version: '3.6'\nservices:\n  web:\n    image: 'gitlab/gitlab-ce:latest'\n    container_name: 'gitlab'\n    restart: always\n    hostname: 'gitlab'\n    environment:\n      TZ: 'Asia/Shanghai'\n      GITLAB_OMNIBUS_CONFIG: |\n        external_url 'http://192.168.2.3:49140'\n        gitlab_rails['gitlab_shell_ssh_port'] = 49142\n    ports:\n      - '49140:49140'\n      - '49142:22'\n    volumes:\n      - /volume1/docker/GitLab/config:/etc/gitlab\n      - /volume1/docker/GitLab/logs:/var/log/gitlab\n      - /volume1/docker/GitLab/data:/var/opt/gitlab\n    shm_size: '256m'\n

    初始配置

    SourceTree、GitHub Desktop 均支持管理 GitLab 项目,操作类似。注意,如果本地已经建好了项目,先不要在 GitLab 网页上建立任何数据,直接上传就好,否则容易报错。

    以下是命令行的初始配置步骤:

    1. 在 GitLab 上创建新仓库

      • 登录到您的 GitLab 实例。
      • 创建一个新的仓库(Project)。在仓库创建页面上,填写必要的信息,例如仓库名称、描述等。
    2. 在本地初始化 Git 仓库

      • 打开终端或命令提示符。
      • 导航到您的项目文件夹:cd 路径到您的项目文件夹
      • 初始化 Git 仓库:git init
      • 添加文件到仓库:git add . (这会添加所有文件,如果只想添加特定文件,可以用git add 文件名
    3. 配置 Git 仓库

      • 设置您的用户信息(如果之前没有设置的话):
        • git config --global user.name "您的名字"
        • git config --global user.email "您的邮箱"
      • 提交您的更改:git commit -m "首次提交"
    4. 将本地仓库关联到 GitLab

      • 获取您在 GitLab 上创建的仓库的 URL。这通常是http://您的NAS地址/用户名/仓库名.git
      • 在终端中关联 GitLab 仓库:git remote add origin 仓库URL
    5. 上传代码到 GitLab

      • 推送代码到 GitLab:git push -u origin master(或者如果您使用的是 main 分支,就是git push -u origin main
      • 初始推送会提示你输入账户密码。
    6. 后续更新

      • 以后当您进行了更多的更改并想要上传这些更改时,您只需要运行git add .git commit -m "更新信息"git push

    常用功能

    比较提交:先进入项目并选择“提交”。接着选择需要比较的提交版本,并点击右侧的“浏览文件”。然后点击顶部的“比较”按钮,接着点击中间的“交换”按钮,再点击“比较”。这样便可将所选提交版本与当前版本进行比较,查看整体修改内容。此功能适用于同一文件多次修改的情况,方便直接查看经过多次修改后,版本的整体变更情况。

    ',10),o={},c=(0,t(3671).A)(o,[["render",function(n,a){const t=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[s,(0,e.Lk)("p",null,[(0,e.Lk)("a",i,[(0,e.eW)("GitLab"),(0,e.bF)(t)]),(0,e.eW)(" 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。")]),l])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/gitlab.html","title":"GitLab:私有化版本控制","lang":"zh-CN","frontmatter":{"article":false,"title":"GitLab:私有化版本控制","order":103,"description":"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。 GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。 部署命令 GitLab 会占用 4G 内存,初始化部署时间较长...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/gitlab.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"GitLab:私有化版本控制"}],["meta",{"property":"og:description","content":"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。 GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。 部署命令 GitLab 会占用 4G 内存,初始化部署时间较长..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"GitLab:私有化版本控制\\",\\"description\\":\\"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。 GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。 部署命令 GitLab 会占用 4G 内存,初始化部署时间较长...\\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]},{"level":2,"title":"初始配置","slug":"初始配置","link":"#初始配置","children":[]},{"level":2,"title":"常用功能","slug":"常用功能","link":"#常用功能","children":[]}],"git":{"createdTime":1706004554000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.76,"words":829},"filePathRelative":"services/dockers-on-nas/gitlab.md","localizedDate":"2024年1月23日","excerpt":"

    Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。

    \\n

    GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。

    \\n

    部署命令

    \\n

    GitLab 会占用 4G 内存,初始化部署时间较长,最好等半小时在连接。你可以在服务器上使用 sudo docker logs -f gitlab 来跟踪部署进度。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-f8b69964.3d1c3d0f.js b/assets/js/grampsjs.html.21c150fa.js similarity index 94% rename from assets/js/v-f8b69964.3d1c3d0f.js rename to assets/js/grampsjs.html.21c150fa.js index 6e66b7f70..f012f2d0a 100644 --- a/assets/js/v-f8b69964.3d1c3d0f.js +++ b/assets/js/grampsjs.html.21c150fa.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5092],{9720:(s,n)=>{n.c=(s,n)=>{const a=s.__vccOpts||s;for(const[s,e]of n)a[s]=e;return a}},1432:(s,n,a)=>{a.r(n),a.d(n,{comp:()=>c,data:()=>i});var e=a(3968);const t={href:"https://github.com/gramps-project/Gramps.js",target:"_blank",rel:"noopener noreferrer"},p={href:"https://www.grampsweb.org/user-guide/",target:"_blank",rel:"noopener noreferrer"},r=(0,e.IL)('

    我打算将家里的族谱电子化,并迁移到 Gramps 上。

    # https://www.grampsweb.org/Deployment/\n# https://github.com/gramps-project/web/blob/main/examples/docker-compose-base/docker-compose.yml\n\nversion: "3.7"\n\nservices:\n  grampsweb: &grampsweb\n    image: ghcr.io/gramps-project/grampsweb:latest\n    container_name: grampsweb\n    restart: always\n    ports:\n      - "23300:5000" # host:docker\n    environment:\n      GRAMPSWEB_TREE: "Gramps Web" # will create a new tree if not exists\n      GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"\n      GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"\n      GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1\n    depends_on:\n      - grampsweb_redis\n    volumes:\n      - /volume1/docker/grampsjs/users:/app/users # persist user database\n      - /volume1/docker/grampsjs/index:/app/indexdir # persist search index\n      - /volume1/docker/grampsjs/thumb_cache:/app/thumbnail_cache # persist thumbnails\n      - /volume1/docker/grampsjs/cache:/app/cache # persist export and report caches\n      - /volume1/docker/grampsjs/secret:/app/secret # persist flask secret\n      - /volume1/docker/grampsjs/db:/root/.gramps/grampsdb # persist Gramps database\n      - /volume1/docker/grampsjs/media:/app/media # persist media files\n      - /volume1/docker/grampsjs/tmp:/tmp\n\n  grampsweb_celery:\n    <<: *grampsweb # YAML merge key copying the entire grampsweb service config\n    ports: []\n    container_name: grampsweb_celery\n    depends_on:\n      - grampsweb_redis\n    command: celery -A gramps_webapi.celery worker --loglevel=INFO\n\n  grampsweb_redis:\n    image: redis:alpine\n    container_name: grampsweb_redis\n    restart: always\n
    ',2),o={},c=(0,a(9720).c)(o,[["render",function(s,n){const a=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.QD)("a",t,[(0,e.mY)("Gramps.js"),(0,e.K2)(a)]),(0,e.mY)(" 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 "),(0,e.QD)("a",p,[(0,e.mY)("Gramps Web User guide"),(0,e.K2)(a)]),(0,e.mY)("。")]),r])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/grampsjs.html","title":"Gramps.js:在线家谱","lang":"zh-CN","frontmatter":{"article":false,"title":"Gramps.js:在线家谱","order":35,"description":"Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide。 我打算将...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/grampsjs.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Gramps.js:在线家谱"}],["meta",{"property":"og:description","content":"Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide。 我打算将..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Gramps.js:在线家谱\\",\\"description\\":\\"Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide。 我打算将...\\"}"]]},"headers":[],"git":{"createdTime":1701779050000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.88,"words":264},"filePathRelative":"services/dockers-on-nas/grampsjs.md","localizedDate":"2023年12月5日","excerpt":"

    Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6405],{3671:(s,n)=>{n.A=(s,n)=>{const a=s.__vccOpts||s;for(const[s,e]of n)a[s]=e;return a}},2387:(s,n,a)=>{a.r(n),a.d(n,{comp:()=>c,data:()=>i});var e=a(7847);const t={href:"https://github.com/gramps-project/Gramps.js",target:"_blank",rel:"noopener noreferrer"},p={href:"https://www.grampsweb.org/user-guide/",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Fv)('

    我打算将家里的族谱电子化,并迁移到 Gramps 上。

    # https://www.grampsweb.org/Deployment/\n# https://github.com/gramps-project/web/blob/main/examples/docker-compose-base/docker-compose.yml\n\nversion: "3.7"\n\nservices:\n  grampsweb: &grampsweb\n    image: ghcr.io/gramps-project/grampsweb:latest\n    container_name: grampsweb\n    restart: always\n    ports:\n      - "23300:5000" # host:docker\n    environment:\n      GRAMPSWEB_TREE: "Gramps Web" # will create a new tree if not exists\n      GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0"\n      GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0"\n      GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1\n    depends_on:\n      - grampsweb_redis\n    volumes:\n      - /volume1/docker/grampsjs/users:/app/users # persist user database\n      - /volume1/docker/grampsjs/index:/app/indexdir # persist search index\n      - /volume1/docker/grampsjs/thumb_cache:/app/thumbnail_cache # persist thumbnails\n      - /volume1/docker/grampsjs/cache:/app/cache # persist export and report caches\n      - /volume1/docker/grampsjs/secret:/app/secret # persist flask secret\n      - /volume1/docker/grampsjs/db:/root/.gramps/grampsdb # persist Gramps database\n      - /volume1/docker/grampsjs/media:/app/media # persist media files\n      - /volume1/docker/grampsjs/tmp:/tmp\n\n  grampsweb_celery:\n    <<: *grampsweb # YAML merge key copying the entire grampsweb service config\n    ports: []\n    container_name: grampsweb_celery\n    depends_on:\n      - grampsweb_redis\n    command: celery -A gramps_webapi.celery worker --loglevel=INFO\n\n  grampsweb_redis:\n    image: redis:alpine\n    container_name: grampsweb_redis\n    restart: always\n
    ',2),o={},c=(0,a(3671).A)(o,[["render",function(s,n){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",t,[(0,e.eW)("Gramps.js"),(0,e.bF)(a)]),(0,e.eW)(" 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 "),(0,e.Lk)("a",p,[(0,e.eW)("Gramps Web User guide"),(0,e.bF)(a)]),(0,e.eW)("。")]),r])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/grampsjs.html","title":"Gramps.js:在线家谱","lang":"zh-CN","frontmatter":{"article":false,"title":"Gramps.js:在线家谱","order":35,"description":"Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide。 我打算将...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/grampsjs.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Gramps.js:在线家谱"}],["meta",{"property":"og:description","content":"Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide。 我打算将..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Gramps.js:在线家谱\\",\\"description\\":\\"Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide。 我打算将...\\"}"]]},"headers":[],"git":{"createdTime":1701779050000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.88,"words":264},"filePathRelative":"services/dockers-on-nas/grampsjs.md","localizedDate":"2023年12月5日","excerpt":"

    Gramps.js 是一款用于协作族谱编辑与展示的 Web 开源应用。它基于领开源家谱桌面应用程序 Gramps,并可与 Gramps 交互操作。不过,Gramps.js 的输入过程相对复杂,需要分别添加成员、家庭、事件、地点等元素,然后将它们组合在一起。第一次配置可能会花费一些时间,使用教程参考 Gramps Web User guide

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/grocy.html.37762071.js b/assets/js/grocy.html.37762071.js new file mode 100644 index 000000000..338e9f001 --- /dev/null +++ b/assets/js/grocy.html.37762071.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[924],{3671:(n,e)=>{e.A=(n,e)=>{const s=n.__vccOpts||n;for(const[n,a]of e)s[n]=a;return s}},1918:(n,e,s)=>{s.r(e),s.d(e,{comp:()=>c,data:()=>i});var a=s(7847);const t={href:"https://grocy.info/",target:"_blank",rel:"noopener noreferrer"},o=(0,a.Fv)('

    Grocy Docker 端默认的账户密码是 admin。要将界面语言设置为中文,只需点击右上角的菜单,然后选择「User settings」,接着在语言选项中选择中文。

    如果你想在移动设备上扫描物品的条形码,可以按照以下步骤操作:点击右上角的菜单,选择「管理 API 秘钥」,然后点击「添加」和「生成 API 秘钥」。接下来,点击生成的秘钥旁边的第二个按钮,使用移动客户端扫描显示在页面上的二维码。然而,个人认为在家庭使用中,扫码功能可能并不是必需的。

    # https://hub.docker.com/r/linuxserver/grocy\nversion: "2.1"\nservices:\n  grocy:\n    image: lscr.io/linuxserver/grocy:latest\n    container_name: grocy\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n    volumes:\n      - /volume1/docker/grocy/config:/config\n    ports:\n      - 9020:80\n    restart: unless-stopped\n
    ',3),r={},c=(0,s(3671).A)(r,[["render",function(n,e){const s=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",t,[(0,a.eW)("Grocy"),(0,a.bF)(s)]),(0,a.eW)(" 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。")]),o])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/grocy.html","title":"Grocy:家庭杂货管理","lang":"zh-CN","frontmatter":{"article":false,"title":"Grocy:家庭杂货管理","order":33,"description":"Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。 Grocy Docker 端默认的账户密码是 admin。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/grocy.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Grocy:家庭杂货管理"}],["meta",{"property":"og:description","content":"Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。 Grocy Docker 端默认的账户密码是 admin。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Grocy:家庭杂货管理\\",\\"description\\":\\"Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。 Grocy Docker 端默认的账户密码是 admin。...\\"}"]]},"headers":[],"git":{"createdTime":1698433931000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.02,"words":306},"filePathRelative":"services/dockers-on-nas/grocy.md","localizedDate":"2023年10月27日","excerpt":"

    Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。

    \\n

    Grocy Docker 端默认的账户密码是 admin。要将界面语言设置为中文,只需点击右上角的菜单,然后选择「User settings」,接着在语言选项中选择中文。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-47d43d54.8017aeff.js b/assets/js/homarr.html.8f88149b.js similarity index 91% rename from assets/js/v-47d43d54.8017aeff.js rename to assets/js/homarr.html.8f88149b.js index 23c411341..192a1bc53 100644 --- a/assets/js/v-47d43d54.8017aeff.js +++ b/assets/js/homarr.html.8f88149b.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1804],{9720:(n,a)=>{a.c=(n,a)=>{const e=n.__vccOpts||n;for(const[n,s]of a)e[n]=s;return e}},1132:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>i,data:()=>p});var s=e(3968);const t={href:"https://github.com/ajnart/homarr",target:"_blank",rel:"noopener noreferrer"},o=(0,s.IL)('

    比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。

    问题:

    • 无法直接添加 chrome://extensions/ 等非标准链接。
    • 图标会远程调用 Github 图库,速度会慢些。

    部署代码

    version: '3'\nservices:\n  homarr:\n    container_name: homarr\n    image: ghcr.io/ajnart/homarr:latest\n    restart: unless-stopped\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration\n      - /volume1/docker/homarr/configs:/app/data/configs\n      - /volume1/docker/homarr/icons:/app/public/icons\n      - /volume1/docker/homarr/data:/data\n    ports:\n      - '7575:7575'\n
    ',5),r={},i=(0,e(9720).c)(r,[["render",function(n,a){const e=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("Homarr"),(0,s.K2)(e)]),(0,s.mY)(" 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。")]),o])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/homarr.html","title":"Homarr:本地导航","lang":"zh-CN","frontmatter":{"article":false,"title":"Homarr:本地导航","order":91,"description":"Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。 比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。 问题: 无法直接添加 chrome://extensions/ 等非标准链接。 图标会远程调用 Github 图库,速度会慢些。 部署代码 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/homarr.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Homarr:本地导航"}],["meta",{"property":"og:description","content":"Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。 比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。 问题: 无法直接添加 chrome://extensions/ 等非标准链接。 图标会远程调用 Github 图库,速度会慢些。 部署代码 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Homarr:本地导航\\",\\"description\\":\\"Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。 比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。 问题: 无法直接添加 chrome://extensions/ 等非标准链接。 图标会远程调用 Github 图库,速度会慢些。 部署代码 \\"}"]]},"headers":[{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1703937466000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.49,"words":148},"filePathRelative":"services/dockers-on-nas/homarr.md","localizedDate":"2023年12月30日","excerpt":"

    Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。

    \\n

    比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。

    \\n

    问题:

    \\n
      \\n
    • 无法直接添加 chrome://extensions/ 等非标准链接。
    • \\n
    • 图标会远程调用 Github 图库,速度会慢些。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9503],{3671:(n,a)=>{a.A=(n,a)=>{const e=n.__vccOpts||n;for(const[n,s]of a)e[n]=s;return e}},1290:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>i,data:()=>p});var s=e(7847);const t={href:"https://github.com/ajnart/homarr",target:"_blank",rel:"noopener noreferrer"},o=(0,s.Fv)('

    比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。

    问题:

    • 无法直接添加 chrome://extensions/ 等非标准链接。
    • 图标会远程调用 Github 图库,速度会慢些。

    部署代码

    version: '3'\nservices:\n  homarr:\n    container_name: homarr\n    image: ghcr.io/ajnart/homarr:latest\n    restart: unless-stopped\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration\n      - /volume1/docker/homarr/configs:/app/data/configs\n      - /volume1/docker/homarr/icons:/app/public/icons\n      - /volume1/docker/homarr/data:/data\n    ports:\n      - '7575:7575'\n
    ',5),r={},i=(0,e(3671).A)(r,[["render",function(n,a){const e=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("Homarr"),(0,s.bF)(e)]),(0,s.eW)(" 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。")]),o])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/homarr.html","title":"Homarr:本地导航","lang":"zh-CN","frontmatter":{"article":false,"title":"Homarr:本地导航","order":91,"description":"Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。 比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。 问题: 无法直接添加 chrome://extensions/ 等非标准链接。 图标会远程调用 Github 图库,速度会慢些。 部署代码 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/homarr.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Homarr:本地导航"}],["meta",{"property":"og:description","content":"Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。 比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。 问题: 无法直接添加 chrome://extensions/ 等非标准链接。 图标会远程调用 Github 图库,速度会慢些。 部署代码 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Homarr:本地导航\\",\\"description\\":\\"Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。 比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。 问题: 无法直接添加 chrome://extensions/ 等非标准链接。 图标会远程调用 Github 图库,速度会慢些。 部署代码 \\"}"]]},"headers":[{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1703937466000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.49,"words":148},"filePathRelative":"services/dockers-on-nas/homarr.md","localizedDate":"2023年12月30日","excerpt":"

    Homarr 可以作为网站书签导航页工具,也可以集成各类状态仪表板,让你可以在一个方便的位置访问和控制一切。

    \\n

    比如 NAS 中内网和外网地址链接不同,你可以设置两套系统。

    \\n

    问题:

    \\n
      \\n
    • 无法直接添加 chrome://extensions/ 等非标准链接。
    • \\n
    • 图标会远程调用 Github 图库,速度会慢些。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/hospital.html.52acd5f2.js b/assets/js/hospital.html.52acd5f2.js new file mode 100644 index 000000000..dd2bb6dde --- /dev/null +++ b/assets/js/hospital.html.52acd5f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7838],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3392:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>p,data:()=>i});var n=a(7847);const r=[(0,n.Fv)('

    宝宝在小时候很容易生病,这经常导致我们不得不带他去医院住院和接受各种检查。本文会记录下我在这个过程中积累的一些心得体会。

    必备物品

    集尿袋

    在尿检过程中,医院往往会为婴儿提供与成人相同的塑料集尿杯以收集尿样。在上海新华医院的儿科,医护人员建议我尝试将塑料集尿杯放置于尿布内部进行使用。不过,这种方法并未如预期那样有效——塑料杯在尿布中被压扁,导致尿液无法正确收集。即便我尝试了多种不同的方法并三次更换尿布,结果仍旧是尿液泄露。最后,我在美团买了集尿袋才成功进行了尿检。

    使用集尿袋时,最好不要让宝宝穿尿不湿,因为一旦集尿袋被放置在尿不湿里面,很容易因为褶皱而导致尿液泄露。如果宝宝不愿意尿尿,多喂一些奶通常会有帮助,因为宝宝在喂奶后通常会尿尿。

    症状处理

    发烧

    只有在宝宝的体温超过 38.5 度时才适宜服用美林,其他时候应优先考虑物理降温方法。通常是每隔半小时用温水清洁腋下、颈部和大腿根部。但这种方法既繁琐又效果有限。

    我在前额和左右颈动脉处贴上退烧贴,这样做宝宝晚上睡觉安稳多了。

    就医准备

    医疗记录

    我将宝宝的所有检查结果和病例记录电子化,这样做是为了为宝宝准备一份完整的医疗记录,避免由于沟通不畅导致诊断错误。

    医疗保险

    家人为宝宝投保了一份高端医疗险。起初,我对其必要性表示怀疑,认为处于母乳喂养阶段的宝宝自身的免疫力应该足够高,不太需要去医院。实际情况也确实如此。

    但是,当我们某次注意到宝宝在吃奶后出现了一些惊厥症状,并且在医院进行的血常规检查中发现宝宝的白细胞异常偏高时,医生警告我们宝宝可能面临脑膜炎的风险。这要求我们进行更多的检查,如血检、尿检、心脏彩超、核磁共振和长程脑电波检查,其中一些检查需要住院才能完成。当时正值春节临近,住院部门本不愿接收新的病人。这时,家人想到了为宝宝购买的医疗保险,并询问了特需病房的情况。由于特需病房的接收政策与普通病房不同,我们得以顺利入院,并且所有费用均通过医疗保险获得了报销。幸运的是,最终的诊断结果证明是一场虚惊。

    基于这次经历,我决定在宝宝 5 岁之前,每年为她购买这种单年医疗保险。

    ',16)],l={},p=(0,a(3671).A)(l,[["render",function(e,t){return(0,n.uX)(),(0,n.CE)("div",null,r)}]]),i=JSON.parse('{"path":"/family/baby/hospital.html","title":"生病记录","lang":"zh-CN","frontmatter":{"article":false,"title":"生病记录","order":4,"description":"宝宝在小时候很容易生病,这经常导致我们不得不带他去医院住院和接受各种检查。本文会记录下我在这个过程中积累的一些心得体会。 必备物品 集尿袋 在尿检过程中,医院往往会为婴儿提供与成人相同的塑料集尿杯以收集尿样。在上海新华医院的儿科,医护人员建议我尝试将塑料集尿杯放置于尿布内部进行使用。不过,这种方法并未如预期那样有效——塑料杯在尿布中被压扁,导致尿液无法...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/hospital.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"生病记录"}],["meta",{"property":"og:description","content":"宝宝在小时候很容易生病,这经常导致我们不得不带他去医院住院和接受各种检查。本文会记录下我在这个过程中积累的一些心得体会。 必备物品 集尿袋 在尿检过程中,医院往往会为婴儿提供与成人相同的塑料集尿杯以收集尿样。在上海新华医院的儿科,医护人员建议我尝试将塑料集尿杯放置于尿布内部进行使用。不过,这种方法并未如预期那样有效——塑料杯在尿布中被压扁,导致尿液无法..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-22T21:57:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-22T21:57:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"生病记录\\",\\"description\\":\\"宝宝在小时候很容易生病,这经常导致我们不得不带他去医院住院和接受各种检查。本文会记录下我在这个过程中积累的一些心得体会。 必备物品 集尿袋 在尿检过程中,医院往往会为婴儿提供与成人相同的塑料集尿杯以收集尿样。在上海新华医院的儿科,医护人员建议我尝试将塑料集尿杯放置于尿布内部进行使用。不过,这种方法并未如预期那样有效——塑料杯在尿布中被压扁,导致尿液无法...\\"}"]]},"headers":[{"level":2,"title":"必备物品","slug":"必备物品","link":"#必备物品","children":[{"level":3,"title":"集尿袋","slug":"集尿袋","link":"#集尿袋","children":[]}]},{"level":2,"title":"症状处理","slug":"症状处理","link":"#症状处理","children":[{"level":3,"title":"发烧","slug":"发烧","link":"#发烧","children":[]}]},{"level":2,"title":"就医准备","slug":"就医准备","link":"#就医准备","children":[{"level":3,"title":"医疗记录","slug":"医疗记录","link":"#医疗记录","children":[]},{"level":3,"title":"医疗保险","slug":"医疗保险","link":"#医疗保险","children":[]}]}],"git":{"createdTime":1708639067000,"updatedTime":1708639067000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.66,"words":799},"filePathRelative":"family/baby/hospital.md","localizedDate":"2024年2月22日","excerpt":"

    宝宝在小时候很容易生病,这经常导致我们不得不带他去医院住院和接受各种检查。本文会记录下我在这个过程中积累的一些心得体会。

    \\n

    必备物品

    \\n

    集尿袋

    \\n

    在尿检过程中,医院往往会为婴儿提供与成人相同的塑料集尿杯以收集尿样。在上海新华医院的儿科,医护人员建议我尝试将塑料集尿杯放置于尿布内部进行使用。不过,这种方法并未如预期那样有效——塑料杯在尿布中被压扁,导致尿液无法正确收集。即便我尝试了多种不同的方法并三次更换尿布,结果仍旧是尿液泄露。最后,我在美团买了集尿袋才成功进行了尿检。

    \\n

    使用集尿袋时,最好不要让宝宝穿尿不湿,因为一旦集尿袋被放置在尿不湿里面,很容易因为褶皱而导致尿液泄露。如果宝宝不愿意尿尿,多喂一些奶通常会有帮助,因为宝宝在喂奶后通常会尿尿。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/index.html.b42ea893.js b/assets/js/index.html.b42ea893.js new file mode 100644 index 000000000..0e6b597df --- /dev/null +++ b/assets/js/index.html.b42ea893.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4470],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},1603:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/apps/devdocs/","title":"Devdocs","lang":"zh-CN","frontmatter":{"title":"Devdocs","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/devdocs/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Devdocs"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Devdocs\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6956:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/apps/","title":"Apps","lang":"zh-CN","frontmatter":{"title":"Apps","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Apps"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Apps\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7199:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/apps/livestreaming/","title":"Livestreaming","lang":"zh-CN","frontmatter":{"title":"Livestreaming","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Livestreaming"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Livestreaming\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},294:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/apps/tutorials/","title":"Tutorials","lang":"zh-CN","frontmatter":{"title":"Tutorials","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Tutorials"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Tutorials\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},662:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/article/","title":"文章","lang":"zh-CN","frontmatter":{"title":"文章","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"type","key":"article"},"layout":"BlogType","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/article/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"文章"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"文章\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9947:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/","title":"分类","lang":"zh-CN","frontmatter":{"title":"分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3810:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E5%81%A5%E5%BA%B7/","title":"健康 分类","lang":"zh-CN","frontmatter":{"title":"健康 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"健康","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%81%A5%E5%BA%B7/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"健康 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"健康 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5886:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E5%8D%9A%E5%AE%A2/","title":"博客 分类","lang":"zh-CN","frontmatter":{"title":"博客 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"博客","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%8D%9A%E5%AE%A2/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"博客 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"博客 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4931:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/","title":"头脑驿站 分类","lang":"zh-CN","frontmatter":{"title":"头脑驿站 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"头脑驿站","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"头脑驿站 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"头脑驿站 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9870:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E5%B7%A5%E5%85%B7/","title":"工具 分类","lang":"zh-CN","frontmatter":{"title":"工具 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"工具","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%B7%A5%E5%85%B7/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"工具 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"工具 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2903:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/","title":"服务器 分类","lang":"zh-CN","frontmatter":{"title":"服务器 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"服务器","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"服务器 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"服务器 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2804:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E7%B3%BB%E7%BB%9F/","title":"系统 分类","lang":"zh-CN","frontmatter":{"title":"系统 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"系统","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E7%B3%BB%E7%BB%9F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"系统 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"系统 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8143:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E7%BD%91%E7%BB%9C/","title":"网络 分类","lang":"zh-CN","frontmatter":{"title":"网络 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"网络","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E7%BD%91%E7%BB%9C/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"网络 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"网络 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},1507:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E8%87%AA%E5%8A%A8%E5%8C%96/","title":"自动化 分类","lang":"zh-CN","frontmatter":{"title":"自动化 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"自动化","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E8%87%AA%E5%8A%A8%E5%8C%96/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"自动化 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"自动化 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2708:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E8%A7%82%E5%AF%9F%E9%9A%8F%E7%AC%94/","title":"观察随笔 分类","lang":"zh-CN","frontmatter":{"title":"观察随笔 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"观察随笔","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E8%A7%82%E5%AF%9F%E9%9A%8F%E7%AC%94/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"观察随笔 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"观察随笔 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2819:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/category/%E8%B4%AD%E7%89%A9/","title":"购物 分类","lang":"zh-CN","frontmatter":{"title":"购物 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"购物","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E8%B4%AD%E7%89%A9/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"购物 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"购物 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3704:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>q,data:()=>U});var o=a(7847);const n=(0,o.Lk)("p",null,"代码编程的学习路径:",-1),r={href:"https://www.typescriptlang.org/zh/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript",target:"_blank",rel:"noopener noreferrer"},i=(0,o.Lk)("li",null,[(0,o.Lk)("p",null,"相关基础知识:HTML,Markdown,MySQL,正则表达式")],-1),l=(0,o.Lk)("li",null,[(0,o.Lk)("p",null,"脚本/开发工具:AutoHotkey,Electron")],-1),s={href:"https://cn.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://zh-hans.react.dev/",target:"_blank",rel:"noopener noreferrer"},d={href:"https://ant-design.antgroup.com/index-cn",target:"_blank",rel:"noopener noreferrer"},g={href:"https://element-plus.gitee.io/zh-CN/guide/quickstart.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://stylus-lang.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://sass.bootcss.com/documentation",target:"_blank",rel:"noopener noreferrer"},y={href:"http://lesscss.cn/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://www.tailwindcss.cn/docs",target:"_blank",rel:"noopener noreferrer"},f={href:"https://v2.vuepress.vuejs.org/zh/guide/getting-started.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://docusaurus.io/zh-CN/docs",target:"_blank",rel:"noopener noreferrer"},v={href:"https://nextjs.org/docs",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.midwayjs.org/docs/intro",target:"_blank",rel:"noopener noreferrer"},C={href:"https://axios-http.com/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://typicode.github.io/husky/#/",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/okonet/lint-staged",target:"_blank",rel:"noopener noreferrer"},E={href:"http://editorconfig.org",target:"_blank",rel:"noopener noreferrer"},D={href:"https://prettier.io/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://eslint.org/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/airbnb/javascript#translation",target:"_blank",rel:"noopener noreferrer"},A={href:"http://commitizen.github.io/cz-cli/",target:"_blank",rel:"noopener noreferrer"},L={href:"https://commitlint.js.org/#/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://next.vue-test-utils.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},B={href:"https://jestjs.io/",target:"_blank",rel:"noopener noreferrer"},W={href:"https://github.com/vuejs/vue-jest",target:"_blank",rel:"noopener noreferrer"},S={href:"https://kulshekhar.github.io/ts-jest/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://docs.github.com/cn/actions/learn-github-actions",target:"_blank",rel:"noopener noreferrer"},T=(0,o.Fv)('

    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": {\n  "**/blog": true, //隐藏指定文件夹\n  "**/[Pp]lugins": true, //使用中括号时表示不区分大小写\n  "**/*.pyc": true, //隐藏所有 pyc 文件\n  "**/*.d.ts": true, //隐藏所有 d.ts 文件\n}\n

    在线 IDE

    在线 IDE 最大的优势是开箱即用,无需搭建环境,避免本地环境错误导致的各类 bug。

    ',13),F={href:"https://stackblitz.com/",target:"_blank",rel:"noopener noreferrer"},j=(0,o.Lk)("sup",{class:"footnote-ref"},[(0,o.Lk)("a",{href:"#footnote1"},"[1]"),(0,o.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),R={href:"https://codepen.io/pen/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://codesandbox.io/s/",target:"_blank",rel:"noopener noreferrer"},J=(0,o.Lk)("hr",{class:"footnotes-sep"},null,-1),X={class:"footnotes"},G={class:"footnotes-list"},V={id:"footnote1",class:"footnote-item"},H={href:"https://www.51cto.com/article/718302.html",target:"_blank",rel:"noopener noreferrer"},I=(0,o.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),M={},q=(0,a(3671).A)(M,[["render",function(e,t){const a=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[n,(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("编程语言:"),(0,o.Lk)("a",r,[(0,o.eW)("TypeScript"),(0,o.bF)(a)]),(0,o.eW)(","),(0,o.Lk)("a",p,[(0,o.eW)("JavaScript"),(0,o.bF)(a)])])]),i,l,(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("前端框架:"),(0,o.Lk)("a",s,[(0,o.eW)("Vue.js"),(0,o.bF)(a)]),(0,o.eW)(","),(0,o.Lk)("a",c,[(0,o.eW)("React"),(0,o.bF)(a)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("UI 框架:"),(0,o.Lk)("a",d,[(0,o.eW)("Ant Design"),(0,o.bF)(a)]),(0,o.eW)(","),(0,o.Lk)("a",g,[(0,o.eW)("Element Plus"),(0,o.bF)(a)])]),(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.eW)("CSS 预编译:"),(0,o.Lk)("a",m,[(0,o.eW)("Stylus"),(0,o.bF)(a)]),(0,o.eW)(" / "),(0,o.Lk)("a",u,[(0,o.eW)("Sass"),(0,o.bF)(a)]),(0,o.eW)(" / "),(0,o.Lk)("a",y,[(0,o.eW)("Less"),(0,o.bF)(a)])]),(0,o.Lk)("li",null,[(0,o.eW)("CSS 后处理器:PostCSS,"),(0,o.Lk)("a",h,[(0,o.eW)("tailwindcss"),(0,o.bF)(a)])])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("网站生成工具:"),(0,o.Lk)("a",f,[(0,o.eW)("VuePress"),(0,o.bF)(a)]),(0,o.eW)(","),(0,o.Lk)("a",b,[(0,o.eW)("Docusaurus"),(0,o.bF)(a)]),(0,o.eW)(","),(0,o.Lk)("a",v,[(0,o.eW)("Next.js"),(0,o.bF)(a)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("Node.js 框架:"),(0,o.Lk)("a",k,[(0,o.eW)("Midway"),(0,o.bF)(a)])])]),(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("HTTP 工具:"),(0,o.Lk)("a",C,[(0,o.eW)("Axios"),(0,o.bF)(a)])]),(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.eW)("Git Hook 工具:"),(0,o.Lk)("a",x,[(0,o.eW)("husky"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",w,[(0,o.eW)("lint-staged"),(0,o.bF)(a)])]),(0,o.Lk)("li",null,[(0,o.eW)("代码规范:"),(0,o.Lk)("a",E,[(0,o.eW)("EditorConfig"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",D,[(0,o.eW)("Prettier"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",z,[(0,o.eW)("ESLint"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",N,[(0,o.eW)("Airbnb JavaScript Style Guide"),(0,o.bF)(a)])]),(0,o.Lk)("li",null,[(0,o.eW)("提交规范:"),(0,o.Lk)("a",A,[(0,o.eW)("Commitizen"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",L,[(0,o.eW)("Commitlint"),(0,o.bF)(a)])]),(0,o.Lk)("li",null,[(0,o.eW)("单元测试:"),(0,o.Lk)("a",P,[(0,o.eW)("vue-test-utils"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",B,[(0,o.eW)("jest"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",W,[(0,o.eW)("vue-jest"),(0,o.bF)(a)]),(0,o.eW)(" + "),(0,o.Lk)("a",S,[(0,o.eW)("ts-jest"),(0,o.bF)(a)])]),(0,o.Lk)("li",null,[(0,o.eW)("自动部署:"),(0,o.Lk)("a",_,[(0,o.eW)("GitHub Actions"),(0,o.bF)(a)])])])])]),T,(0,o.Lk)("p",null,[(0,o.Lk)("a",F,[(0,o.eW)("StackBlitz"),(0,o.bF)(a)]),(0,o.eW)(":StackBlitz 界面类似 Visual Studio Code,可以直接 push 和拉取 GitHub 仓库的代码进行查看和编辑,项目支持离线开发,同时所有应用程序会自动部署在其服务器上。"),j]),(0,o.Lk)("p",null,[(0,o.Lk)("a",R,[(0,o.eW)("CodePen"),(0,o.bF)(a)]),(0,o.eW)(":CodePen 是一个在线的 HTML、CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果,便于项目分享预览。CodePen 也一个庞大的前端社区,上面有来自全球开发者分享的各种各样炫酷的效果,并且这些代码都是开源和共享的。")]),(0,o.Lk)("p",null,[(0,o.Lk)("a",O,[(0,o.eW)("CodeSandbox"),(0,o.bF)(a)]),(0,o.eW)(":CodeSandbox 编辑体验与 VSCode 类似,并支持 GitHub 导出、静态文件托管、本地项目导入等。缺点:不能直接导入 GitHub 项目。")]),J,(0,o.Lk)("section",X,[(0,o.Lk)("ol",G,[(0,o.Lk)("li",V,[(0,o.Lk)("p",null,[(0,o.Lk)("a",H,[(0,o.eW)("六个好用的在线代码编辑器,你选哪个?"),(0,o.bF)(a)]),(0,o.eW)(),I])])])])])}]]),U=JSON.parse('{"path":"/code/","title":"Coding","lang":"zh-CN","frontmatter":{"article":false,"title":"Coding","icon":"code","description":"代码编程的学习路径: 编程语言:TypeScript,JavaScript 相关基础知识:HTML,Markdown,MySQL,正则表达式 脚本/开发工具:AutoHotkey,Electron 前端框架:Vue.js,React UI 框架:Ant Design,Element Plus CSS 预编译:Stylus / Sass / Less C...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Coding"}],["meta",{"property":"og:description","content":"代码编程的学习路径: 编程语言:TypeScript,JavaScript 相关基础知识:HTML,Markdown,MySQL,正则表达式 脚本/开发工具:AutoHotkey,Electron 前端框架:Vue.js,React UI 框架:Ant Design,Element Plus CSS 预编译:Stylus / Sass / Less C..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-30T11:57:46.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-30T11:57:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Coding\\",\\"description\\":\\"代码编程的学习路径: 编程语言:TypeScript,JavaScript 相关基础知识:HTML,Markdown,MySQL,正则表达式 脚本/开发工具:AutoHotkey,Electron 前端框架:Vue.js,React UI 框架:Ant Design,Element Plus CSS 预编译:Stylus / Sass / Less C...\\"}"]]},"headers":[{"level":2,"title":"Visual Studio Code","slug":"visual-studio-code","link":"#visual-studio-code","children":[{"level":3,"title":"修改快捷键","slug":"修改快捷键","link":"#修改快捷键","children":[]},{"level":3,"title":"排除文件夹","slug":"排除文件夹","link":"#排除文件夹","children":[]}]},{"level":2,"title":"在线 IDE","slug":"在线-ide","link":"#在线-ide","children":[]}],"git":{"createdTime":1666549346000,"updatedTime":1703937466000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":2.52,"words":756},"filePathRelative":"code/README.md","localizedDate":"2022年10月23日","excerpt":"

    代码编程的学习路径:

    \\n","autoDesc":true}')},3816:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/deploy/","title":"Deploy","lang":"zh-CN","frontmatter":{"title":"Deploy","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Deploy"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Deploy\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7783:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>i,data:()=>l});var o=a(7847);const n=(0,o.Lk)("p",null,"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。",-1),r={class:"catalog-display-container"},p={},i=(0,a(3671).A)(p,[["render",function(e,t){const a=(0,o.g2)("AutoCatalog");return(0,o.uX)(),(0,o.CE)("div",null,[n,(0,o.Q3)(" markdownlint-disable MD033 "),(0,o.Lk)("div",r,[(0,o.bF)(a,{base:"/family/baby/"})]),(0,o.Q3)(" markdownlint-enable MD033 ")])}]]),l=JSON.parse('{"path":"/family/baby/","title":"育儿记录","lang":"zh-CN","frontmatter":{"article":false,"index":false,"title":"育儿记录","icon":"emoji","description":"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"育儿记录"}],["meta",{"property":"og:description","content":"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"育儿记录\\",\\"description\\":\\"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 \\"}"]]},"headers":[],"git":{"createdTime":1694827853000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.62,"words":186},"filePathRelative":"family/baby/README.md","localizedDate":"2023年9月16日","excerpt":"

    面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。

    \\n\x3c!-- markdownlint-disable MD033 --\x3e\\n
    \\n
    \\n\x3c!-- markdownlint-enable MD033 --\x3e","autoDesc":true}')},8678:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/family/","title":"Family","lang":"zh-CN","frontmatter":{"title":"Family","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Family"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Family\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5777:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>Y,data:()=>ee});var o=a(7847);const n=(0,o.Lk)("blockquote",null,[(0,o.Lk)("p",null,"开源工具、效率方法、心理学探索的自我提升笔记")],-1),r={href:"https://discord.gg/PZTQfJ4GjX",target:"_blank",rel:"noopener noreferrer"},p=(0,o.Lk)("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),i=(0,o.Lk)("figcaption",null,null,-1),l=(0,o.Fv)('

    ✨ 初衷

    曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。

    更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。

    为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnData 开源笔记,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。

    笔记 + 文章 = LearnData 知识库
    笔记/博客自动化发布

    🧱 笔记结构

    • 置顶:日常习惯、健身、阅读;
    • 软件应用:常用应用、Chrome 扩展和相关教程;
    • Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
    • 系统问题:Windows 系统优化和相关问题;
    • 代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集;
    • 生活角落:说明书、生活记录和小技巧;
    • 博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

    🍥 搭建 LearnData

    ',9),s={href:"https://github.com/rockbenben/LearnData",target:"_blank",rel:"noopener noreferrer"},c=(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/2022-08-10-19-32-05.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")],-1),d=(0,o.Lk)("figure",null,[(0,o.Lk)("img",{src:"https://img.newzone.top/2022-08-10-19-34-13.png?imageMogr2/thumbnail/500x",alt:"",tabindex:"0",loading:"lazy"}),(0,o.Lk)("figcaption")],-1),g=(0,o.Fv)('
  • 接着,进入项目仓库的「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 分支页面。

  • 然后点击「Settings」, 修改 Repository name用户名.github.io。假设你的仓库链接是 https://github.com/xxx/LearnData,那么中间的 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 有时会对旧文章里的代码报错。

  • ',5),m=(0,o.Lk)("h2",{id:"🔣-配置-learndata",tabindex:"-1"},[(0,o.Lk)("a",{class:"header-anchor",href:"#🔣-配置-learndata"},[(0,o.Lk)("span",null,"🔣 配置 LearnData")])],-1),u=(0,o.Lk)("h3",{id:"文档结构",tabindex:"-1"},[(0,o.Lk)("a",{class:"header-anchor",href:"#文档结构"},[(0,o.Lk)("span",null,"文档结构")])],-1),y=(0,o.Lk)("code",null,"docs",-1),h={href:"https://github.com/rockbenben/LearnData/blob/main/samplepage.md?plain=1",target:"_blank",rel:"noopener noreferrer"},f=(0,o.Lk)("code",null,"order",-1),b=(0,o.Fv)('

    docs 目录结构如下:

    docs\n|── .vuepress               # 网站配置\n│   ├── config.ts           # 网站环境依赖和网站属性\n│   ├── sidebar.ts          # 侧边栏\n│   ├── navbar.ts           # 导航栏\n│   ├── theme.ts            # 主题和插件\n│   └── templateBuild.html  # 网页模板,网站关键词和统计\n|── _posts                  # 博客文章目录\n├── _temp                   # 草稿箱\n├── reading                 # 读书笔记\n├── anyname                 # 自定义笔记\n├── blog.md                 # 博客页面\n└── intro.md                # 博主个人介绍\n
    ',2),v=(0,o.Lk)("code",null,"docs/.vuepress",-1),k={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress",target:"_blank",rel:"noopener noreferrer"},C=(0,o.Lk)("code",null,"docs/.vuepress/sidebar.ts",-1),x=(0,o.Lk)("code",null,"docs/.vuepress/theme.ts",-1),w={href:"https://newzone.top/web/Comments.html",target:"_blank",rel:"noopener noreferrer"},E=(0,o.Fv)('

    注意:

    • LearnData 默认采用 algolia 进行全文检索。如果你没用 algolia,可在 docs/.vuepress/theme.ts 文件的 plugins 部分删除 docsearch 区块,并激活 searchPro。这样,网站将转用本地全文索引来进行搜索。
    • docs/_temp 文件夹默认不同步到 GitHub 上。你可以手动在本地建立 _temp 文件夹,用来存放草稿。
    • 自 VuePress2 的 beta.54 版本开始,文件夹名前缀为 _ 在生成链接时将被省略,例如文章路径为 /_posts/,但网页链接路径会是 /posts/

    看板娘

    ',3),D={href:"https://github.com/stevenjoezhang/live2d-widget",target:"_blank",rel:"noopener noreferrer"},z=(0,o.Lk)("code",null,"docs\\.vuepress\\public",-1),N=(0,o.Fv)("

    如果网站部署在子页面 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 文件中看板娘区块代码 <script src="/live2d-widget/autoload.js"> 修改为 <script src="/yyy/live2d-widget/autoload.js">
    ",2),A=(0,o.Lk)("code",null,"docs\\.vuepress\\public\\live2d-widget",-1),L={href:"https://github.com/fghrsh/live2d_api",target:"_blank",rel:"noopener noreferrer"},P=(0,o.Fv)('

    读书笔记

    读书笔记中可能会有大量的原文引用,这与 LearnData 精简化知识点的初衷并不相符。因此,我们使用 docsify 来构建读书笔记,并将其放置于 docs/reading 目录下。在生成静态页面后,该路径下的文件不会被转换为 HTML 文件,而是将被自动复制到静态网站下,完成 docsify 页面构建和独立的读书笔记搜索索引。

    由于读书笔记架构更换到 docsify,不能使用相对链接。请调整 docs\\.vuepress\\sidebar.ts{ text: "读书笔记", icon: "read", link: "https://newzone.top/reading/" },将 newzone.top 替换为你的博客域名。

    如果你没有部署 Waline,或不需统计阅读量和评论功能,可移除 docs\\reading\\index.html 中的 Waline 代码块。

    waline: {\n   serverURL: "https://waline.newzone.top",\n   ...\n}\n

    本地图片引用

    为了避免在生成静态页面时出现 Rollup failed to resolve import 错误,本地图片必须保存在 docs/.vuepress/public 路径下。如果图片名称为 1.png,保存在 docs/.vuepress/public/imgs 路径下,则可以使用以下链接来引用该图片:/imgs/1.png 或使用 Markdown 图片链接:![](/imgs/1.png)。本方法也适用于将附件部署到网站上。

    🖥️ 网站部署

    在将 LearnData 推送到 GitHub 后,会自动生成可访问的网页。但由于国内访问 GitHub Pages 的速度不稳定,为了确保网站能够正常访问,建议增加国内的访问节点。

    很多人选择使用 Gitee Pages 作为国内节点,通过 GitHub Actions 将新文档同步到 Gitee 上,从而生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 有很多限制,例如必须实名认证、免费版无法自定义域名,近期也发生过下架风波。因此,我没有选择 Gitee,而是将文档同步到国内服务器(域名需要备案)或 Vercel(国外服务可能会出现断网)。

    同步到服务器

    如果你的项目已经搭建好,但出现了红色的叉叉提示,这可能是 GitHub Actions 同步到服务器时发生了错误。你需要进入项目仓库的「Setting」>「Secrets」>「Action」,并添加 FTP_HOSTFTP_PORTFTP_USERNAMEFTP_PASSWORD 的密钥。之后,每当文件发生变化时,GitHub Actions 就会将修改推送到服务器的 FTP 上。

    ',12),B={href:"https://newzone.top/deploy/Static.html#%E5%90%8C%E6%AD%A5%E5%88%B0-oss",target:"_blank",rel:"noopener noreferrer"},W=(0,o.Lk)("h3",{id:"部署到-vercel",tabindex:"-1"},[(0,o.Lk)("a",{class:"header-anchor",href:"#部署到-vercel"},[(0,o.Lk)("span",null,"部署到 Vercel")])],-1),S=(0,o.Lk)("p",null,[(0,o.eW)("Vercel 的速度相对 GitHub Pages 更快,但 "),(0,o.Lk)("code",null,"*.vercel.app"),(0,o.eW)(" 域名已受 DNS 污染影响。为保证国内用户访问稳定,需绑定自定义域名。")],-1),_=(0,o.Lk)("p",null,"Vercel 部署步骤如下:",-1),T={href:"https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Frockbenben%2FLearnData%2Ftree%2Fgh-pages",target:"_blank",rel:"noopener noreferrer"},F=(0,o.Lk)("img",{src:"https://vercel.com/button",alt:"Vercel",loading:"lazy"},null,-1),j=(0,o.Lk)("code",null,"https://vercel.com/new/clone?repository-url=https://github.com/rockbenben/LearnData/tree/gh-pages",-1),R=(0,o.Lk)("code",null,"rockbenben/LearnData",-1),O=(0,o.Lk)("code",null,"你的用户名/仓库名",-1),J=(0,o.Fv)('
  • 输入一个你喜欢的 Vercel 项目名称,默认 private 即可,然后点击 Create

    创建 Vercel 项目
  • 接着,Vercel 会基于 LearnData 模板帮助你新建并初始化仓库,仓库名为你之前输入的项目名。几十秒后,满屏的烟花会庆祝你部署成功。此时,点击 Go to Dashboard 跳转到应用的控制台。

    Vercel 部署成功提示
  • ',2),X=(0,o.Lk)("p",null,[(0,o.eW)("为了让 Vercel 页面与 GitHub Pages 自动保持同步更新,你需要配置 "),(0,o.Lk)("code",null,"PERSONAL_TOKEN"),(0,o.eW)(" 和 GitHub Actions。")],-1),G={href:"https://github.com/settings/tokens",target:"_blank",rel:"noopener noreferrer"},V=(0,o.Lk)("li",null,"在项目仓库中选择「setting」>「Secrets」>「Action」,新建密钥 PERSONAL_TOKEN,并填入刚复制的 token 值。",-1),H=(0,o.Lk)("li",null,[(0,o.eW)("将下方代码编辑到 "),(0,o.Lk)("code",null,".github/workflows/main.yml"),(0,o.eW)(" 文件末尾,注意修改 "),(0,o.Lk)("code",null,"dst_owner"),(0,o.eW)(" 和 "),(0,o.Lk)("code",null,"dst_repo_name"),(0,o.eW)("。")],-1),I=(0,o.Fv)('
    # 将页面更新到 Vercel\n- name: Copy file to Vercel\n  if: always()\n  uses: andstor/copycat-action@v3\n  with:\n    personal_token: ${{ secrets.PERSONAL_TOKEN }}\n    src_path: /.\n    dst_path: /\n    # 你的用户名\n    dst_owner: rockbenben\n    # 与 Vercel 链接的仓库名,也就是 Vercel 部署时新建的仓库\n    dst_repo_name: LearnData-Vercel\n    dst_branch: main\n    src_branch: gh-pages\n    clean: true\n
    ',1),M=(0,o.Fv)('

    🤔 常见问题

    网页显示异常

    如果你的网站只显示文字而不能正常显示网页,可能是因为网站路径不正确导致的页面样式错误。比如,GitHub Page 提示访问链接 https://xxx.github.io/yyy,则需要将 docs/.vuepress/config.ts 中的 base 改为 /yyy,其默认值为 /。请按照此路径将网站的 base 设置正确,以确保你的网站能够正常显示。

    同步服务器报错

    • Error: Input required and not supplied: server 表示服务器配置错误,请按照上方的网站部署步骤检查配置。如果你不需要将网页部署同步到服务器,可以删除 .github/workflows/main.yml 中 Sync files 区块的代码。

    • FTPError: 530 Login authentication failed 指 FTP 密码错误或账号不存在,可使用 FileZilla 来测试 FTP 的有效性。

    • Error: Timeout (control socket) 指同步服务器出现超时报错。如果出现该错误,可以进入 Actions 页面,点击右侧按钮「Re-run all jobs」,重新进行部署。如果错误连续出现,可以尝试关闭服务器防火墙,检查 GitHub 服务器 IP 是否屏蔽了。

    ERR_MODULE

    如果出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find module 的报错,可能是第三方插件或 pacakge.json 环境依赖未正确配置。此报错出现的几率极低,如果遇到,可以使用最新版本的 package.jsonpnpm-lock.yaml 来覆盖本地设置,或者删除主目录下的 .npmrc 文件。

    本地运行 LearnData

    ',9),q={href:"https://newzone.top/deploy/VPS.html#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2",target:"_blank",rel:"noopener noreferrer"},U=(0,o.Lk)("li",null,[(0,o.eW)("将 LearnData 项目下载到本地后,在项目目录下打开终端,输入命令 "),(0,o.Lk)("code",null,"pnpm i"),(0,o.eW)(" 安装依赖。")],-1),Q=(0,o.Lk)("li",null,[(0,o.eW)("在终端中输入命令 "),(0,o.Lk)("code",null,"pnpm docs:dev"),(0,o.eW)(",若成功则会提示访问链接,默认为 "),(0,o.Lk)("code",null,"http://localhost:8080/"),(0,o.eW)("。")],-1),Z=(0,o.Lk)("p",null,[(0,o.eW)("本地服务运行后,修改文件时页面会同步更新预览。若需停止本地服务器,可在终端中按下 "),(0,o.Lk)("code",null,"Ctrl + C"),(0,o.eW)("。")],-1),K={href:"https://newzone.top/posts/2024-01-28-learndata-advanced.html",target:"_blank",rel:"noopener noreferrer"},$={},Y=(0,a(3671).A)($,[["render",function(e,t){const a=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[n,(0,o.Lk)("figure",null,[(0,o.Lk)("a",r,[p,(0,o.bF)(a)]),i]),l,(0,o.Lk)("ol",null,[(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("首先,进入 "),(0,o.Lk)("a",s,[(0,o.eW)("LearnData"),(0,o.bF)(a)]),(0,o.eW)(" 项目页,点击右上角「Use this template」后选择「Create a new repository」。")]),c,d]),g]),m,u,(0,o.Lk)("p",null,[(0,o.eW)("LearnData 网站的配置和文本都存放在 "),y,(0,o.eW)(" 文件夹中。文章和页面的配置可参考主目录下的 "),(0,o.Lk)("a",h,[(0,o.eW)("samplepage.md"),(0,o.bF)(a)]),(0,o.eW)("。其中,"),f,(0,o.eW)(" 参数表示侧边栏的顺序,数字越小越靠前,支持非整数和负数。我个人的偏好是将非干货或随想短文的 order 设置在 -0.01 到 -0.99,将干货类长文的 order 设置在 -1 到负无穷。每次新增文章都会在上一篇的基础上递减 order 值。这种设置使我能随时记录低于 1000 字的短文,同时不会影响那些寻求干货文章的用户体验,因为干货文章的排序始终保持在最上方。")]),b,(0,o.Lk)("p",null,[v,(0,o.eW)(" 路径下是网站的配置文件,我已添加了详细的注释。你可以参考注释和 "),(0,o.Lk)("a",k,[(0,o.eW)("vuepress-theme-hope 配置案例"),(0,o.bF)(a)]),(0,o.eW)("来调整配置。请在 "),C,(0,o.eW)(" 文件中修改文件夹路径,后台会自动抓取路径下的 md 文件来生成侧边栏。"),x,(0,o.eW)(" 有"),(0,o.Lk)("a",w,[(0,o.eW)("评论插件"),(0,o.bF)(a)]),(0,o.eW)("的相关配置。")]),E,(0,o.Lk)("p",null,[(0,o.eW)("LearnData 集成了看板娘 "),(0,o.Lk)("a",D,[(0,o.eW)("Live2D Widget"),(0,o.bF)(a)]),(0,o.eW)(",支持随机对话、切换人物服饰和玩打飞机游戏,能提升网站美观度和趣味性。如果不需要看板娘,可以删除 "),z,(0,o.eW)(" 下的 live2d-widget 文件夹。")]),N,(0,o.Lk)("p",null,[(0,o.eW)("如果你想要修改看板娘模型,请参考 "),A,(0,o.eW)(" 路径下的 README 和修改说明。如果你想在服务器上自建 "),(0,o.Lk)("a",L,[(0,o.eW)("live2d api"),(0,o.bF)(a)]),(0,o.eW)(",请注意添加跨域配置,否则可能会出现只显示文字而不显示看板娘图片的情况。")]),P,(0,o.Lk)("p",null,[(0,o.eW)("你也可以参考文章 "),(0,o.Lk)("a",B,[(0,o.eW)("GitHub 同步到 OSS"),(0,o.bF)(a)]),(0,o.eW)(",将网页部署到云存储上。")]),W,S,_,(0,o.Lk)("ol",null,[(0,o.Lk)("li",null,[(0,o.Lk)("p",null,[(0,o.eW)("点击 "),(0,o.Lk)("a",T,[F,(0,o.bF)(a)]),(0,o.eW)(" 或将 "),j,(0,o.eW)(" 中的 "),R,(0,o.eW)(" 改为 "),O,(0,o.eW)(",然后会跳转至 Vercel 进行网页部署。如果你未登录,Vercel 提示你注册或登录,请使用 GitHub 账户进行快捷登录。")])]),J,(0,o.Lk)("li",null,[X,(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.eW)("新建 "),(0,o.Lk)("a",G,[(0,o.eW)("Personal access tokens"),(0,o.bF)(a)]),(0,o.eW)(",勾选权限「repo (Full control of private repositories)」,生成后复制 token 值。")]),V,H]),I])]),M,(0,o.Lk)("ol",null,[(0,o.Lk)("li",null,[(0,o.eW)("为了本地运行,你需要安装 npm 和 pnpm 环境,可参考"),(0,o.Lk)("a",q,[(0,o.eW)("环境部署教程"),(0,o.bF)(a)]),(0,o.eW)("。")]),U,Q]),Z,(0,o.Lk)("p",null,[(0,o.eW)("如果你想深入了解 LearnData 的高级技巧,请浏览 "),(0,o.Lk)("a",K,[(0,o.eW)("LearnData 博客:高效知识管理和进阶应用技巧"),(0,o.bF)(a)]),(0,o.eW)("。")])])}]]),ee=JSON.parse('{"path":"/","title":"LearnData 开源笔记","lang":"zh-CN","frontmatter":{"article":false,"title":"LearnData 开源笔记","icon":"note","description":" 开源工具、效率方法、心理学探索的自我提升笔记 ✨ 初衷 曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。 为此,我基于 VuePress 和 vuepress-theme-ho...","head":[["meta",{"property":"og:url","content":"https://newzone.top/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"LearnData 开源笔记"}],["meta",{"property":"og:description","content":" 开源工具、效率方法、心理学探索的自我提升笔记 ✨ 初衷 曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。 为此,我基于 VuePress 和 vuepress-theme-ho..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.shields.io/discord/1048780149899939881?color=%2385c8c8&label=Discord&logo=discord&style=for-the-badge"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"LearnData 开源笔记"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"LearnData 开源笔记\\",\\"description\\":\\" 开源工具、效率方法、心理学探索的自我提升笔记 ✨ 初衷 曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。 为此,我基于 VuePress 和 vuepress-theme-ho...\\"}"]]},"headers":[{"level":2,"title":"✨ 初衷","slug":"✨-初衷","link":"#✨-初衷","children":[]},{"level":2,"title":"🧱 笔记结构","slug":"🧱-笔记结构","link":"#🧱-笔记结构","children":[]},{"level":2,"title":"🍥 搭建 LearnData","slug":"🍥-搭建-learndata","link":"#🍥-搭建-learndata","children":[]},{"level":2,"title":"🔣 配置 LearnData","slug":"🔣-配置-learndata","link":"#🔣-配置-learndata","children":[{"level":3,"title":"文档结构","slug":"文档结构","link":"#文档结构","children":[]},{"level":3,"title":"看板娘","slug":"看板娘","link":"#看板娘","children":[]},{"level":3,"title":"读书笔记","slug":"读书笔记","link":"#读书笔记","children":[]},{"level":3,"title":"本地图片引用","slug":"本地图片引用","link":"#本地图片引用","children":[]}]},{"level":2,"title":"🖥️ 网站部署","slug":"🖥️-网站部署","link":"#🖥️-网站部署","children":[{"level":3,"title":"同步到服务器","slug":"同步到服务器","link":"#同步到服务器","children":[]},{"level":3,"title":"部署到 Vercel","slug":"部署到-vercel","link":"#部署到-vercel","children":[]}]},{"level":2,"title":"🤔 常见问题","slug":"🤔-常见问题","link":"#🤔-常见问题","children":[{"level":3,"title":"网页显示异常","slug":"网页显示异常","link":"#网页显示异常","children":[]},{"level":3,"title":"同步服务器报错","slug":"同步服务器报错","link":"#同步服务器报错","children":[]},{"level":3,"title":"ERR_MODULE","slug":"err-module","link":"#err-module","children":[]},{"level":3,"title":"本地运行 LearnData","slug":"本地运行-learndata","link":"#本地运行-learndata","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":79},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":10.3,"words":3090},"filePathRelative":"README.md","localizedDate":"2022年7月22日","excerpt":"
    \\n

    开源工具、效率方法、心理学探索的自我提升笔记

    \\n
    \\n
    \\"\\"
    ","autoDesc":true}')},2203:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/posts/","title":"Posts","lang":"zh-CN","frontmatter":{"title":"Posts","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Posts"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Posts\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3293:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>c,data:()=>d});var o=a(7847);const n={href:"https://github.com/awesome-selfhosted/awesome-selfhosted",target:"_blank",rel:"noopener noreferrer"},r=(0,o.Lk)("code",null,"docker-compose.yml",-1),p={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"},i=(0,o.Fv)('

    操作步骤如下:

    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 为实例,为了确保正常运行,我们可以临时为该文件夹授权“所有人”权限,但建议后续寻求更安全的权限管理策略。

    编号规则

    • 1-10:影视音乐类
    • 11-20:娱乐阅读类
    • 21-30:同步网盘
    • 31-40:文档管理
    • 41-70:空位
    • 71-80:未分类(默认)
    • 81-90: 自动化
    • 91-100:导航
    • 101+:后端
    ',16),l={class:"catalog-display-container"},s={},c=(0,a(3671).A)(s,[["render",function(e,t){const a=(0,o.g2)("ExternalLinkIcon"),s=(0,o.g2)("AutoCatalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.Lk)("p",null,[(0,o.eW)("网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。"),(0,o.Lk)("a",n,[(0,o.eW)("awesome-selfhosted"),(0,o.bF)(a)]),(0,o.eW)("可查看多种自部署服务。而使用 "),r,(0,o.eW)(" 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 "),(0,o.Lk)("a",p,[(0,o.eW)("TTRSS docker-compose 的教程"),(0,o.bF)(a)]),(0,o.eW)("。")]),i,(0,o.Q3)(" markdownlint-disable MD033 "),(0,o.Lk)("div",l,[(0,o.bF)(s,{base:"/services/dockers-on-nas/"})]),(0,o.Q3)(" markdownlint-enable MD033 ")])}]]),d=JSON.parse('{"path":"/services/dockers-on-nas/","title":"NAS 应用集合","lang":"zh-CN","frontmatter":{"article":false,"index":false,"title":"NAS 应用集合","icon":"process","description":"网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-c...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"NAS 应用集合"}],["meta",{"property":"og:description","content":"网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-c..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-09-16-08-42-22.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"NAS 应用集合"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"NAS 应用集合\\",\\"description\\":\\"网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-c...\\"}"]]},"headers":[{"level":2,"title":"部署问题","slug":"部署问题","link":"#部署问题","children":[{"level":3,"title":"路径对照","slug":"路径对照","link":"#路径对照","children":[]},{"level":3,"title":"用户与组身份","slug":"用户与组身份","link":"#用户与组身份","children":[]},{"level":3,"title":"文件夹访问权限","slug":"文件夹访问权限","link":"#文件夹访问权限","children":[]}]},{"level":2,"title":"编号规则","slug":"编号规则","link":"#编号规则","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":2.79,"words":838},"filePathRelative":"services/dockers-on-nas/README.md","localizedDate":"2023年9月16日","excerpt":"

    网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-compose 的教程

    ","autoDesc":true}')},6324:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/services/","title":"Services","lang":"zh-CN","frontmatter":{"title":"Services","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Services"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Services\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4405:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/star/","title":"星标","lang":"zh-CN","frontmatter":{"title":"星标","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"type","key":"star"},"layout":"BlogType","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/star/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"星标"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"星标\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6425:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/ai/","title":"标签: AI","lang":"zh-CN","frontmatter":{"title":"标签: AI","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"AI","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/ai/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: AI"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: AI\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9684:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/airtable/","title":"标签: Airtable","lang":"zh-CN","frontmatter":{"title":"标签: Airtable","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Airtable","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/airtable/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Airtable"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Airtable\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},680:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/aria2/","title":"标签: Aria2","lang":"zh-CN","frontmatter":{"title":"标签: Aria2","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Aria2","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/aria2/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Aria2"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Aria2\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},376:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/audition/","title":"标签: Audition","lang":"zh-CN","frontmatter":{"title":"标签: Audition","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Audition","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/audition/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Audition"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Audition\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2592:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/blog/","title":"标签: blog","lang":"zh-CN","frontmatter":{"title":"标签: blog","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"blog","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/blog/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: blog"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: blog\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7474:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/cdn/","title":"标签: CDN","lang":"zh-CN","frontmatter":{"title":"标签: CDN","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"CDN","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/cdn/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: CDN"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: CDN\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},204:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/chatgpt/","title":"标签: ChatGPT","lang":"zh-CN","frontmatter":{"title":"标签: ChatGPT","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"ChatGPT","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/chatgpt/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: ChatGPT"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: ChatGPT\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7360:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/docker/","title":"标签: Docker","lang":"zh-CN","frontmatter":{"title":"标签: Docker","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Docker","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/docker/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Docker"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Docker\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9891:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/feed43/","title":"标签: Feed43","lang":"zh-CN","frontmatter":{"title":"标签: Feed43","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Feed43","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/feed43/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Feed43"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Feed43\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7853:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/feedex/","title":"标签: FeedEx","lang":"zh-CN","frontmatter":{"title":"标签: FeedEx","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"FeedEx","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/feedex/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: FeedEx"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: FeedEx\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4540:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/games/","title":"标签: games","lang":"zh-CN","frontmatter":{"title":"标签: games","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"games","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/games/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: games"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: games\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},1396:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/github/","title":"标签: github","lang":"zh-CN","frontmatter":{"title":"标签: github","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"github","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/github/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: github"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: github\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5658:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/gp1700/","title":"标签: GP1700","lang":"zh-CN","frontmatter":{"title":"标签: GP1700","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"GP1700","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/gp1700/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: GP1700"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: GP1700\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9838:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/gtd/","title":"标签: GTD","lang":"zh-CN","frontmatter":{"title":"标签: GTD","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"GTD","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/gtd/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: GTD"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: GTD\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3199:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/huginn/","title":"标签: Huginn","lang":"zh-CN","frontmatter":{"title":"标签: Huginn","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Huginn","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/huginn/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Huginn"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Huginn\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7479:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/","title":"标签","lang":"zh-CN","frontmatter":{"title":"标签","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5172:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/iptv/","title":"标签: IPTV","lang":"zh-CN","frontmatter":{"title":"标签: IPTV","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"IPTV","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/iptv/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: IPTV"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: IPTV\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9152:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/jekyll/","title":"标签: Jekyll","lang":"zh-CN","frontmatter":{"title":"标签: Jekyll","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Jekyll","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/jekyll/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Jekyll"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Jekyll\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8744:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/keepass/","title":"标签: KeePass","lang":"zh-CN","frontmatter":{"title":"标签: KeePass","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"KeePass","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/keepass/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: KeePass"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: KeePass\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7915:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/koolproxy/","title":"标签: koolproxy","lang":"zh-CN","frontmatter":{"title":"标签: koolproxy","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"koolproxy","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/koolproxy/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: koolproxy"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: koolproxy\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5762:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/microsoft-store/","title":"标签: Microsoft store","lang":"zh-CN","frontmatter":{"title":"标签: Microsoft store","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Microsoft store","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/microsoft-store/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Microsoft store"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Microsoft store\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2604:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/nas/","title":"标签: nas","lang":"zh-CN","frontmatter":{"title":"标签: nas","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"nas","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/nas/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: nas"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: nas\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7322:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/obs/","title":"标签: OBS","lang":"zh-CN","frontmatter":{"title":"标签: OBS","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"OBS","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/obs/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: OBS"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: OBS\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},1865:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/office/","title":"标签: office","lang":"zh-CN","frontmatter":{"title":"标签: office","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"office","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/office/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: office"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: office\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4722:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/onenote/","title":"标签: OneNote","lang":"zh-CN","frontmatter":{"title":"标签: OneNote","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"OneNote","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/onenote/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: OneNote"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: OneNote\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8759:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/openvpn/","title":"标签: OpenVPN","lang":"zh-CN","frontmatter":{"title":"标签: OpenVPN","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"OpenVPN","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/openvpn/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: OpenVPN"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: OpenVPN\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9059:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/rpa/","title":"标签: RPA","lang":"zh-CN","frontmatter":{"title":"标签: RPA","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"RPA","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/rpa/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: RPA"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: RPA\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7402:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/rss/","title":"标签: rss","lang":"zh-CN","frontmatter":{"title":"标签: rss","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"rss","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/rss/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: rss"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: rss\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6905:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/rsshub/","title":"标签: RSSHub","lang":"zh-CN","frontmatter":{"title":"标签: RSSHub","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"RSSHub","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/rsshub/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: RSSHub"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: RSSHub\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8189:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/scrcpy/","title":"标签: scrcpy","lang":"zh-CN","frontmatter":{"title":"标签: scrcpy","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"scrcpy","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/scrcpy/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: scrcpy"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: scrcpy\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9513:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/smb/","title":"标签: smb","lang":"zh-CN","frontmatter":{"title":"标签: smb","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"smb","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/smb/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: smb"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: smb\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6073:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/stable-diffusion/","title":"标签: Stable Diffusion","lang":"zh-CN","frontmatter":{"title":"标签: Stable Diffusion","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Stable Diffusion","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/stable-diffusion/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Stable Diffusion"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Stable Diffusion\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5635:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/travis-ci/","title":"标签: Travis CI","lang":"zh-CN","frontmatter":{"title":"标签: Travis CI","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Travis CI","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/travis-ci/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Travis CI"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Travis CI\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4766:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/ui.vision/","title":"标签: UI.Vision","lang":"zh-CN","frontmatter":{"title":"标签: UI.Vision","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"UI.Vision","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/ui.vision/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: UI.Vision"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: UI.Vision\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7541:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/vits/","title":"标签: VITS","lang":"zh-CN","frontmatter":{"title":"标签: VITS","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"VITS","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/vits/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: VITS"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: VITS\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4808:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/vuepress/","title":"标签: VuePress","lang":"zh-CN","frontmatter":{"title":"标签: VuePress","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"VuePress","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/vuepress/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: VuePress"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: VuePress\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7362:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/whisper/","title":"标签: Whisper","lang":"zh-CN","frontmatter":{"title":"标签: Whisper","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Whisper","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/whisper/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Whisper"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Whisper\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3155:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/wifi/","title":"标签: WIFI","lang":"zh-CN","frontmatter":{"title":"标签: WIFI","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"WIFI","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/wifi/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: WIFI"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: WIFI\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},1514:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/winget/","title":"标签: winget","lang":"zh-CN","frontmatter":{"title":"标签: winget","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"winget","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/winget/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: winget"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: winget\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6691:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/winstall/","title":"标签: winstall","lang":"zh-CN","frontmatter":{"title":"标签: winstall","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"winstall","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/winstall/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: winstall"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: winstall\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5589:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/wordpress/","title":"标签: WordPress","lang":"zh-CN","frontmatter":{"title":"标签: WordPress","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"WordPress","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/wordpress/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: WordPress"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: WordPress\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6794:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E4%B8%BB%E6%9D%BF/","title":"标签: 主板","lang":"zh-CN","frontmatter":{"title":"标签: 主板","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"主板","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E4%B8%BB%E6%9D%BF/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 主板"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 主板\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4427:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%9D%90/","title":"标签: 健身器材","lang":"zh-CN","frontmatter":{"title":"标签: 健身器材","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"健身器材","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%9D%90/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 健身器材"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 健身器材\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9470:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%85%89%E7%8C%AB/","title":"标签: 光猫","lang":"zh-CN","frontmatter":{"title":"标签: 光猫","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"光猫","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%85%89%E7%8C%AB/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 光猫"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 光猫\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2994:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%85%B3%E6%9C%BA/","title":"标签: 关机","lang":"zh-CN","frontmatter":{"title":"标签: 关机","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"关机","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%85%B3%E6%9C%BA/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 关机"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 关机\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8741:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/","title":"标签: 内网穿透","lang":"zh-CN","frontmatter":{"title":"标签: 内网穿透","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"内网穿透","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 内网穿透"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 内网穿透\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4904:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%87%8F%E8%82%A5/","title":"标签: 减肥","lang":"zh-CN","frontmatter":{"title":"标签: 减肥","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"减肥","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%87%8F%E8%82%A5/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 减肥"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 减肥\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},324:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%8C%96%E5%A6%86%E5%93%81/","title":"标签: 化妆品","lang":"zh-CN","frontmatter":{"title":"标签: 化妆品","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"化妆品","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%8C%96%E5%A6%86%E5%93%81/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 化妆品"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 化妆品\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6200:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%8E%9F%E5%88%99/","title":"标签: 原则","lang":"zh-CN","frontmatter":{"title":"标签: 原则","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"原则","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%8E%9F%E5%88%99/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 原则"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 原则\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4010:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/","title":"标签: 声音克隆","lang":"zh-CN","frontmatter":{"title":"标签: 声音克隆","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"声音克隆","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 声音克隆"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 声音克隆\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8256:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%AA%92%E4%BD%93/","title":"标签: 媒体","lang":"zh-CN","frontmatter":{"title":"标签: 媒体","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"媒体","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%AA%92%E4%BD%93/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 媒体"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 媒体\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5684:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%AD%97%E5%B9%95/","title":"标签: 字幕","lang":"zh-CN","frontmatter":{"title":"标签: 字幕","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"字幕","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%AD%97%E5%B9%95/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 字幕"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 字幕\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9732:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/","title":"标签: 宝塔面板","lang":"zh-CN","frontmatter":{"title":"标签: 宝塔面板","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"宝塔面板","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 宝塔面板"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 宝塔面板\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},1413:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/","title":"标签: 小狼毫","lang":"zh-CN","frontmatter":{"title":"标签: 小狼毫","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"小狼毫","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 小狼毫"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 小狼毫\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9615:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%B7%A5%E4%BD%9C%E6%B5%81/","title":"标签: 工作流","lang":"zh-CN","frontmatter":{"title":"标签: 工作流","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"工作流","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%B7%A5%E4%BD%9C%E6%B5%81/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 工作流"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 工作流\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},1432:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%B9%B8%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE/","title":"标签: 幸存者偏差","lang":"zh-CN","frontmatter":{"title":"标签: 幸存者偏差","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"幸存者偏差","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%B9%B8%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 幸存者偏差"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 幸存者偏差\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2710:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BB%BA%E7%AB%99/","title":"标签: 建站","lang":"zh-CN","frontmatter":{"title":"标签: 建站","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"建站","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BB%BA%E7%AB%99/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 建站"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 建站\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4022:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BD%95%E5%B1%8F/","title":"标签: 录屏","lang":"zh-CN","frontmatter":{"title":"标签: 录屏","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"录屏","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BD%95%E5%B1%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 录屏"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 录屏\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6924:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BE%AE%E4%BF%A1/","title":"标签: 微信","lang":"zh-CN","frontmatter":{"title":"标签: 微信","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"微信","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BE%AE%E4%BF%A1/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 微信"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 微信\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6711:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/","title":"标签: 微信红包","lang":"zh-CN","frontmatter":{"title":"标签: 微信红包","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"微信红包","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 微信红包"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 微信红包\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2563:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/","title":"标签: 批评与自我批评","lang":"zh-CN","frontmatter":{"title":"标签: 批评与自我批评","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"批评与自我批评","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 批评与自我批评"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 批评与自我批评\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3168:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%8A%95%E5%B1%8F/","title":"标签: 投屏","lang":"zh-CN","frontmatter":{"title":"标签: 投屏","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"投屏","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%8A%95%E5%B1%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 投屏"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 投屏\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2837:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%96%AD%E8%88%8D%E7%A6%BB/","title":"标签: 断舍离","lang":"zh-CN","frontmatter":{"title":"标签: 断舍离","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"断舍离","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%96%AD%E8%88%8D%E7%A6%BB/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 断舍离"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 断舍离\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3805:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%97%B6%E9%97%B4/","title":"标签: 时间","lang":"zh-CN","frontmatter":{"title":"标签: 时间","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"时间","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%97%B6%E9%97%B4/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 时间"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 时间\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7769:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/","title":"标签: 浏览器插件","lang":"zh-CN","frontmatter":{"title":"标签: 浏览器插件","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"浏览器插件","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 浏览器插件"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 浏览器插件\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2697:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E7%96%AB%E6%83%85/","title":"标签: 疫情","lang":"zh-CN","frontmatter":{"title":"标签: 疫情","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"疫情","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E7%96%AB%E6%83%85/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 疫情"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 疫情\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7313:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E7%99%BD%E6%9D%BF/","title":"标签: 白板","lang":"zh-CN","frontmatter":{"title":"标签: 白板","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"白板","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E7%99%BD%E6%9D%BF/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 白板"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 白板\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5843:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E7%9B%B4%E6%92%AD/","title":"标签: 直播","lang":"zh-CN","frontmatter":{"title":"标签: 直播","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"直播","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E7%9B%B4%E6%92%AD/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 直播"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 直播\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},3498:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%81%94%E6%83%B3/","title":"标签: 联想","lang":"zh-CN","frontmatter":{"title":"标签: 联想","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"联想","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%81%94%E6%83%B3/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 联想"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 联想\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5982:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%87%AA%E6%88%91%E7%AE%A1%E7%90%86/","title":"标签: 自我管理","lang":"zh-CN","frontmatter":{"title":"标签: 自我管理","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"自我管理","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%87%AA%E6%88%91%E7%AE%A1%E7%90%86/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 自我管理"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 自我管理\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},2226:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%93%9D%E5%B1%8F/","title":"标签: 蓝屏","lang":"zh-CN","frontmatter":{"title":"标签: 蓝屏","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"蓝屏","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%93%9D%E5%B1%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 蓝屏"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 蓝屏\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5450:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/","title":"标签: 虚拟定位","lang":"zh-CN","frontmatter":{"title":"标签: 虚拟定位","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"虚拟定位","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 虚拟定位"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 虚拟定位\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},5256:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/","title":"标签: 语音输入","lang":"zh-CN","frontmatter":{"title":"标签: 语音输入","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"语音输入","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 语音输入"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 语音输入\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},6500:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%BE%93%E5%85%A5%E6%B3%95/","title":"标签: 输入法","lang":"zh-CN","frontmatter":{"title":"标签: 输入法","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"输入法","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%BE%93%E5%85%A5%E6%B3%95/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 输入法"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 输入法\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},8702:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%BF%85%E9%9B%B7/","title":"标签: 迅雷","lang":"zh-CN","frontmatter":{"title":"标签: 迅雷","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"迅雷","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%BF%85%E9%9B%B7/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 迅雷"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 迅雷\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9441:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/tag/%E9%9F%B3%E9%A2%91/","title":"标签: 音频","lang":"zh-CN","frontmatter":{"title":"标签: 音频","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"音频","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E9%9F%B3%E9%A2%91/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 音频"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 音频\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},4124:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){return(0,o.uX)(),(0,o.CE)("div")}]]),p=JSON.parse('{"path":"/timeline/","title":"时间轴","lang":"zh-CN","frontmatter":{"title":"时间轴","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"type","key":"timeline"},"layout":"Timeline","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/timeline/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"时间轴"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"时间轴\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')},7380:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/web/","title":"Web","lang":"zh-CN","frontmatter":{"title":"Web","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Web"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Web\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')},9231:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(7847);const n={},r=(0,a(3671).A)(n,[["render",function(e,t){const a=(0,o.g2)("Catalog");return(0,o.uX)(),(0,o.CE)("div",null,[(0,o.bF)(a)])}]]),p=JSON.parse('{"path":"/windows/","title":"Windows","lang":"zh-CN","frontmatter":{"title":"Windows","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Windows"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Windows\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6d318e63.4000f912.js b/assets/js/intro.html.145c2549.js similarity index 81% rename from assets/js/v-6d318e63.4000f912.js rename to assets/js/intro.html.145c2549.js index 1c4571e79..37bdbe137 100644 --- a/assets/js/v-6d318e63.4000f912.js +++ b/assets/js/intro.html.145c2549.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2120],{9720:(t,e)=>{e.c=(t,e)=>{const n=t.__vccOpts||t;for(const[t,o]of e)n[t]=o;return n}},6204:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>p,data:()=>i});var o=n(3968);const r=[(0,o.QD)("p",null,"互联网广告人,",-1),(0,o.QD)("p",null,"迷信新工具、新方法,",-1),(0,o.QD)("p",null,"坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,",-1),(0,o.QD)("p",null,"热衷于研究开源软件和心理学理论,定期分享探索成果。",-1)],a={},p=(0,n(9720).c)(a,[["render",function(t,e){return(0,o.Wz)(),(0,o.An)("div",null,r)}]]),i=JSON.parse('{"path":"/intro.html","title":"个人介绍","lang":"zh-CN","frontmatter":{"article":false,"title":"个人介绍","icon":"any","description":"互联网广告人, 迷信新工具、新方法, 坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, 热衷于研究开源软件和心理学理论,定期分享探索成果。 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/intro.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"个人介绍"}],["meta",{"property":"og:description","content":"互联网广告人, 迷信新工具、新方法, 坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, 热衷于研究开源软件和心理学理论,定期分享探索成果。 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"个人介绍\\",\\"description\\":\\"互联网广告人, 迷信新工具、新方法, 坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, 热衷于研究开源软件和心理学理论,定期分享探索成果。 \\"}"]]},"headers":[],"git":{"createdTime":1658668240000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.25,"words":76},"filePathRelative":"intro.md","localizedDate":"2022年7月24日","excerpt":"

    互联网广告人,

    \\n

    迷信新工具、新方法,

    \\n

    坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,

    \\n

    热衷于研究开源软件和心理学理论,定期分享探索成果。

    \\n","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3912],{3671:(t,e)=>{e.A=(t,e)=>{const n=t.__vccOpts||t;for(const[t,o]of e)n[t]=o;return n}},2484:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>p,data:()=>i});var o=n(7847);const r=[(0,o.Lk)("p",null,"互联网广告人,",-1),(0,o.Lk)("p",null,"迷信新工具、新方法,",-1),(0,o.Lk)("p",null,"坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,",-1),(0,o.Lk)("p",null,"热衷于研究开源软件和心理学理论,定期分享探索成果。",-1)],a={},p=(0,n(3671).A)(a,[["render",function(t,e){return(0,o.uX)(),(0,o.CE)("div",null,r)}]]),i=JSON.parse('{"path":"/intro.html","title":"个人介绍","lang":"zh-CN","frontmatter":{"article":false,"title":"个人介绍","icon":"any","description":"互联网广告人, 迷信新工具、新方法, 坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, 热衷于研究开源软件和心理学理论,定期分享探索成果。 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/intro.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"个人介绍"}],["meta",{"property":"og:description","content":"互联网广告人, 迷信新工具、新方法, 坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, 热衷于研究开源软件和心理学理论,定期分享探索成果。 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"个人介绍\\",\\"description\\":\\"互联网广告人, 迷信新工具、新方法, 坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物, 热衷于研究开源软件和心理学理论,定期分享探索成果。 \\"}"]]},"headers":[],"git":{"createdTime":1658668240000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.25,"words":76},"filePathRelative":"intro.md","localizedDate":"2022年7月24日","excerpt":"

    互联网广告人,

    \\n

    迷信新工具、新方法,

    \\n

    坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,

    \\n

    热衷于研究开源软件和心理学理论,定期分享探索成果。

    \\n","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4be144ea.2f4deed8.js b/assets/js/json-translate.html.91b211f3.js similarity index 93% rename from assets/js/v-4be144ea.2f4deed8.js rename to assets/js/json-translate.html.91b211f3.js index b9b4f7ecc..d47ad206d 100644 --- a/assets/js/v-4be144ea.2f4deed8.js +++ b/assets/js/json-translate.html.91b211f3.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4230],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},8080:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>g,data:()=>m});var s=a(3968);const t={href:"https://tools.newzone.top/json-translate",target:"_blank",rel:"noopener noreferrer"},o=(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://img.newzone.top/2023-12-18-19-18-41.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption")],-1),p=(0,s.QD)("p",null,"该工具的设计理念与市面上其他多语言翻译器不同。常见的翻译器虽然追求一键自动化,但通常配置繁琐,且往往需要付费订阅。JsonTranslate 的设计初衷是为了解决 ChatGPT Shortcut 和 IMGPrompt 等个人或开源项目中的英汉互译问题而设计,特别适合那些翻译文件不多的项目。",-1),l=(0,s.QD)("p",null,"与传统的全站自动化翻译工具相比,JsonTranslate 更加注重根据用户需求进行精确翻译。用户可以方便地粘贴需要翻译的文本,甚至指定单个新增节点,从而简化多语言翻译流程,使得翻译工作更为高效和精确。",-1),r=(0,s.IL)('

    使用说明

    JsonTranslate 使用示例

    1. 选择翻译 API

    ',3),i={href:"https://docs.easyuseai.com/platform/translate/google_fanyi.html",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/OwO-Network/DeepLX/",target:"_blank",rel:"noopener noreferrer"},d=(0,s.IL)('

    需要注意的是,使用 Google Translate 时,你的翻译数据会从客户端直接发送到 Google 服务器。而 DeepL API 则不支持在网页上使用。因此,JsonTranslate 在服务器端提供了一个专门的 DeepL 翻译转发接口,该接口仅用于数据转发,不会收集任何用户数据。用户可以选择在本地环境中部署并使用这一接口。

    2. 语言设置

    你可以灵活地选择源语言和目标语言,以实现不同语言之间的相互翻译。目前,JsonTranslate 支持 13 种语言的互译,包括英语、中文、日语、韩语、西班牙语、法语、德语、意大利语、俄语、葡萄牙语、印地语、阿拉伯语和孟加拉语。这些语言涵盖了全球大部分主要语言区域,能满足多样化的用户需求。需要注意的是,印地语、阿拉伯语和孟加拉语目前仅能通过 Google Translate 进行翻译,因为 DeepL 尚未支持这三种语言。

    3. 翻译键名

    键名(key)是访问 JSON 结构中特定信息的关键,可以由数字、英文字母、中文等非符号字符组成。在命名时需注意大小写的区别。对于包含数组[]的 JSON 数据,建议避免使用数字作为键名,因为这会被认为是数组索引,从而可能引起混淆或错误。

    为了同时指定多个键名的翻译,你可以通过逗号进行分隔,不论是使用中文还是英文逗号均可。

    如果你刚开始接触 JSON 的键名,不妨参考以下的示例说明。这些示例将帮助你更好地理解键名的格式和使用方式。

    4. 翻译内容

    JsonTranslate 专为 JSON 内容翻译而设计,仅支持 JSON 格式输入。

    输入内容变更时,应用会实时格式化 JSON 并验证格式正确性。请避免在输入框内进行大量修改,因为频繁的修改可能增加出错的风险。如果需要对 JSON 文件做大量的编辑或修改,建议先在其他专用的 JSON 编辑工具中完成编辑,确保格式无误后再将内容导入 JsonTranslate 进行翻译。

    5. 翻译结果

    点击「开始翻译」按钮后,翻译完成可以选择「复制结果」。

    映射翻译示例

    结果界面右侧还设有灰色按钮,用于切换翻译节点模式,包括单一键名模式和映射翻译模式。单一键名模式下,翻译的输入输出使用相同节点,而映射翻译模式则涉及不同节点的翻译。例如,节点 A 的值将翻译至节点 B,节点 C 的值翻译至节点 D。

    使用问题

    返回 null

    使用 DeepLX 免费接口时,可能会返回 null。请等一会再使用,或使用自己的 API KEY。

    JSON 键名及其局限性

    JSON 数据是以键值对的形式存储的,其中“键”(也称为“名称”)是一个字符串,用于唯一标识数据记录中的特定项目或元素,是数据检索和操作的基础。JsonTranslate 正是利用了 JSON 键名的标识作用来实现精准化识别翻译。

    以下是对示例中的几个键名的解释:

    • downvote.message:这是一个嵌套的键名。downvote 是外层对象的键名,而 messagedownvote 对象内部的一个键名。
    • 提示词.message:这里 提示词 是一个键名,它本身包含一个对象,该对象有一个键 message
    • share.owner:这个键名包含了一个点(.),它是一个单独的键名而不是指示嵌套关系。在这种情况下,如果你想访问 share.owner 对象中的 name,你不能使用 share.owner.name,因为这会被错误解释为查找一个名为 owner 的对象内的 name 键,而实际上 share.owner 是一个完整的键名。
    {\n  "downvote": {\n    "message": "Downvote"\n  },\n  "提示词": {\n    "message": "prompt"\n  },\n  "share.owner": {\n    "name": "rabbit"\n  },\n  "data": {\n    "title": {\n      "id": "001",\n      "name": "cabbages"\n    }\n  },\n  "content": [\n    {\n      "id": "001",\n      "value": "Hello, cabbage."\n    },\n    {\n      "id": "002",\n      "value": "Hello, Radish."\n    }\n  ]\n}\n

    目前,JsonTranslate 无法处理包含点(.)的 JSON 键名。这是因为点号在 JSONPath 中用于区分嵌套对象的键名,使得含点的键名可能被误解为多层嵌套对象。为避免这一问题,建议使用不含点的键名。

    结语

    JsonTranslate 是一款适合小型项目和个人开发者的多语言 JSON 翻译工具。它以简单直观的操作和对多种翻译 API 的支持,帮助用户高效处理多语言翻译任务。虽然不能与专业的全站自动化翻译工具如 Crowdin 相媲美,但对于那些追求便利性、面临有限资源或只需处理少量翻译任务的用户来说,JsonTranslate 提供了一种实用且易于上手的解决方案。

    ',27),u={},g=(0,a(9720).c)(u,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon"),u=(0,s.E1)("BiliBili");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("JsonTranslate"),(0,s.K2)(a)]),(0,s.mY)(",一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。")]),o,p,l,(0,s.K2)(u,{bvid:"BV11c411b7Np"}),r,(0,s.QD)("p",null,[(0,s.mY)("在使用 JsonTranslate 时,你有多种翻译 API 的选择。首先是 Google Translate 和 DeepL Translate,这两者都需要用户自行获取 API 密钥。Google Translate 在常见句子的翻译上较为普遍,特别适合翻译用户界面 UI;而 DeepL 在长文本翻译方面表现更优,能提供更流畅的翻译结果。若想申请这些 API,可参考相关的"),(0,s.QD)("a",i,[(0,s.mY)("接口申请教程"),(0,s.K2)(a)]),(0,s.mY)("。")]),(0,s.QD)("p",null,[(0,s.mY)("此外,JsonTranslate 还提供了 DeepLX 作为一个免费选项。DeepLX 通过将 DeepL Free API 转换为本地 API 接口,允许第三方应用进行调用。它无需 API 密钥,适合少量或偶尔的翻译需求。想了解更多关于 DeepLX 的信息,可以访问其 "),(0,s.QD)("a",c,[(0,s.mY)("GitHub 页面"),(0,s.K2)(a)]),(0,s.mY)("。")]),d])}]]),m=JSON.parse('{"path":"/apps/devdocs/json-translate.html","title":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?","lang":"zh-CN","frontmatter":{"article":true,"title":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?","date":"2023-12-19T00:00:00.000Z","category":["工具"],"order":1,"description":"JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/devdocs/json-translate.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?"}],["meta",{"property":"og:description","content":"JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-18-19-18-41.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-02T14:41:20.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:published_time","content":"2023-12-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-02T14:41:20.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?\\",\\"image\\":[\\"https://img.newzone.top/2023-12-18-19-18-41.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-18-16-09-04.gif?imageMogr2/format/webp \\\\\\"JsonTranslate 使用示例\\\\\\"\\",\\"https://img.newzone.top/2023-12-18-19-27-32.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-19-10-23-41.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-19-11-42-37.png?imageMogr2/format/webp \\\\\\"映射翻译示例\\\\\\"\\"],\\"datePublished\\":\\"2023-12-19T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-02T14:41:20.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"使用说明","slug":"使用说明","link":"#使用说明","children":[{"level":3,"title":"1. 选择翻译 API","slug":"_1-选择翻译-api","link":"#_1-选择翻译-api","children":[]},{"level":3,"title":"2. 语言设置","slug":"_2-语言设置","link":"#_2-语言设置","children":[]},{"level":3,"title":"3. 翻译键名","slug":"_3-翻译键名","link":"#_3-翻译键名","children":[]},{"level":3,"title":"4. 翻译内容","slug":"_4-翻译内容","link":"#_4-翻译内容","children":[]},{"level":3,"title":"5. 翻译结果","slug":"_5-翻译结果","link":"#_5-翻译结果","children":[]}]},{"level":2,"title":"使用问题","slug":"使用问题","link":"#使用问题","children":[{"level":3,"title":"返回 null","slug":"返回-null","link":"#返回-null","children":[]},{"level":3,"title":"JSON 键名及其局限性","slug":"json-键名及其局限性","link":"#json-键名及其局限性","children":[]}]},{"level":2,"title":"结语","slug":"结语","link":"#结语","children":[]}],"git":{"createdTime":1702969080000,"updatedTime":1704206480000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":6.04,"words":1813},"filePathRelative":"apps/devdocs/json-translate.md","localizedDate":"2023年12月19日","excerpt":"

    JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5581],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},3727:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>g,data:()=>m});var s=a(7847);const t={href:"https://tools.newzone.top/json-translate",target:"_blank",rel:"noopener noreferrer"},o=(0,s.Lk)("figure",null,[(0,s.Lk)("img",{src:"https://img.newzone.top/2023-12-18-19-18-41.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,s.Lk)("figcaption")],-1),p=(0,s.Lk)("p",null,"该工具的设计理念与市面上其他多语言翻译器不同。常见的翻译器虽然追求一键自动化,但通常配置繁琐,且往往需要付费订阅。JsonTranslate 的设计初衷是为了解决 ChatGPT Shortcut 和 IMGPrompt 等个人或开源项目中的英汉互译问题而设计,特别适合那些翻译文件不多的项目。",-1),l=(0,s.Lk)("p",null,"与传统的全站自动化翻译工具相比,JsonTranslate 更加注重根据用户需求进行精确翻译。用户可以方便地粘贴需要翻译的文本,甚至指定单个新增节点,从而简化多语言翻译流程,使得翻译工作更为高效和精确。",-1),r=(0,s.Fv)('

    使用说明

    JsonTranslate 使用示例

    1. 选择翻译 API

    ',3),i={href:"https://docs.easyuseai.com/platform/translate/google_fanyi.html",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/OwO-Network/DeepLX/",target:"_blank",rel:"noopener noreferrer"},d=(0,s.Fv)('

    需要注意的是,使用 Google Translate 时,你的翻译数据会从客户端直接发送到 Google 服务器。而 DeepL API 则不支持在网页上使用。因此,JsonTranslate 在服务器端提供了一个专门的 DeepL 翻译转发接口,该接口仅用于数据转发,不会收集任何用户数据。用户可以选择在本地环境中部署并使用这一接口。

    2. 语言设置

    你可以灵活地选择源语言和目标语言,以实现不同语言之间的相互翻译。目前,JsonTranslate 支持 13 种语言的互译,包括英语、中文、日语、韩语、西班牙语、法语、德语、意大利语、俄语、葡萄牙语、印地语、阿拉伯语和孟加拉语。这些语言涵盖了全球大部分主要语言区域,能满足多样化的用户需求。需要注意的是,印地语、阿拉伯语和孟加拉语目前仅能通过 Google Translate 进行翻译,因为 DeepL 尚未支持这三种语言。

    3. 翻译键名

    键名(key)是访问 JSON 结构中特定信息的关键,可以由数字、英文字母、中文等非符号字符组成。在命名时需注意大小写的区别。对于包含数组[]的 JSON 数据,建议避免使用数字作为键名,因为这会被认为是数组索引,从而可能引起混淆或错误。

    为了同时指定多个键名的翻译,你可以通过逗号进行分隔,不论是使用中文还是英文逗号均可。

    如果你刚开始接触 JSON 的键名,不妨参考以下的示例说明。这些示例将帮助你更好地理解键名的格式和使用方式。

    4. 翻译内容

    JsonTranslate 专为 JSON 内容翻译而设计,仅支持 JSON 格式输入。

    输入内容变更时,应用会实时格式化 JSON 并验证格式正确性。请避免在输入框内进行大量修改,因为频繁的修改可能增加出错的风险。如果需要对 JSON 文件做大量的编辑或修改,建议先在其他专用的 JSON 编辑工具中完成编辑,确保格式无误后再将内容导入 JsonTranslate 进行翻译。

    5. 翻译结果

    点击「开始翻译」按钮后,翻译完成可以选择「复制结果」。

    映射翻译示例

    结果界面右侧还设有灰色按钮,用于切换翻译节点模式,包括单一键名模式和映射翻译模式。单一键名模式下,翻译的输入输出使用相同节点,而映射翻译模式则涉及不同节点的翻译。例如,节点 A 的值将翻译至节点 B,节点 C 的值翻译至节点 D。

    使用问题

    返回 null

    使用 DeepLX 免费接口时,可能会返回 null。请等一会再使用,或使用自己的 API KEY。

    JSON 键名及其局限性

    JSON 数据是以键值对的形式存储的,其中“键”(也称为“名称”)是一个字符串,用于唯一标识数据记录中的特定项目或元素,是数据检索和操作的基础。JsonTranslate 正是利用了 JSON 键名的标识作用来实现精准化识别翻译。

    以下是对示例中的几个键名的解释:

    • downvote.message:这是一个嵌套的键名。downvote 是外层对象的键名,而 messagedownvote 对象内部的一个键名。
    • 提示词.message:这里 提示词 是一个键名,它本身包含一个对象,该对象有一个键 message
    • share.owner:这个键名包含了一个点(.),它是一个单独的键名而不是指示嵌套关系。在这种情况下,如果你想访问 share.owner 对象中的 name,你不能使用 share.owner.name,因为这会被错误解释为查找一个名为 owner 的对象内的 name 键,而实际上 share.owner 是一个完整的键名。
    {\n  "downvote": {\n    "message": "Downvote"\n  },\n  "提示词": {\n    "message": "prompt"\n  },\n  "share.owner": {\n    "name": "rabbit"\n  },\n  "data": {\n    "title": {\n      "id": "001",\n      "name": "cabbages"\n    }\n  },\n  "content": [\n    {\n      "id": "001",\n      "value": "Hello, cabbage."\n    },\n    {\n      "id": "002",\n      "value": "Hello, Radish."\n    }\n  ]\n}\n

    目前,JsonTranslate 无法处理包含点(.)的 JSON 键名。这是因为点号在 JSONPath 中用于区分嵌套对象的键名,使得含点的键名可能被误解为多层嵌套对象。为避免这一问题,建议使用不含点的键名。

    结语

    JsonTranslate 是一款适合小型项目和个人开发者的多语言 JSON 翻译工具。它以简单直观的操作和对多种翻译 API 的支持,帮助用户高效处理多语言翻译任务。虽然不能与专业的全站自动化翻译工具如 Crowdin 相媲美,但对于那些追求便利性、面临有限资源或只需处理少量翻译任务的用户来说,JsonTranslate 提供了一种实用且易于上手的解决方案。

    ',27),u={},g=(0,a(3671).A)(u,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon"),u=(0,s.g2)("BiliBili");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("JsonTranslate"),(0,s.bF)(a)]),(0,s.eW)(",一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。")]),o,p,l,(0,s.bF)(u,{bvid:"BV11c411b7Np"}),r,(0,s.Lk)("p",null,[(0,s.eW)("在使用 JsonTranslate 时,你有多种翻译 API 的选择。首先是 Google Translate 和 DeepL Translate,这两者都需要用户自行获取 API 密钥。Google Translate 在常见句子的翻译上较为普遍,特别适合翻译用户界面 UI;而 DeepL 在长文本翻译方面表现更优,能提供更流畅的翻译结果。若想申请这些 API,可参考相关的"),(0,s.Lk)("a",i,[(0,s.eW)("接口申请教程"),(0,s.bF)(a)]),(0,s.eW)("。")]),(0,s.Lk)("p",null,[(0,s.eW)("此外,JsonTranslate 还提供了 DeepLX 作为一个免费选项。DeepLX 通过将 DeepL Free API 转换为本地 API 接口,允许第三方应用进行调用。它无需 API 密钥,适合少量或偶尔的翻译需求。想了解更多关于 DeepLX 的信息,可以访问其 "),(0,s.Lk)("a",c,[(0,s.eW)("GitHub 页面"),(0,s.bF)(a)]),(0,s.eW)("。")]),d])}]]),m=JSON.parse('{"path":"/apps/devdocs/json-translate.html","title":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?","lang":"zh-CN","frontmatter":{"article":true,"title":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?","date":"2023-12-19T00:00:00.000Z","category":["工具"],"order":1,"description":"JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/devdocs/json-translate.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?"}],["meta",{"property":"og:description","content":"JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-18-19-18-41.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-02T14:41:20.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:published_time","content":"2023-12-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-02T14:41:20.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"JsonTranslate 实用指南:怎样让你的项目说上 13 种语言?\\",\\"image\\":[\\"https://img.newzone.top/2023-12-18-19-18-41.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-18-16-09-04.gif?imageMogr2/format/webp \\\\\\"JsonTranslate 使用示例\\\\\\"\\",\\"https://img.newzone.top/2023-12-18-19-27-32.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-19-10-23-41.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-19-11-42-37.png?imageMogr2/format/webp \\\\\\"映射翻译示例\\\\\\"\\"],\\"datePublished\\":\\"2023-12-19T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-02T14:41:20.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"使用说明","slug":"使用说明","link":"#使用说明","children":[{"level":3,"title":"1. 选择翻译 API","slug":"_1-选择翻译-api","link":"#_1-选择翻译-api","children":[]},{"level":3,"title":"2. 语言设置","slug":"_2-语言设置","link":"#_2-语言设置","children":[]},{"level":3,"title":"3. 翻译键名","slug":"_3-翻译键名","link":"#_3-翻译键名","children":[]},{"level":3,"title":"4. 翻译内容","slug":"_4-翻译内容","link":"#_4-翻译内容","children":[]},{"level":3,"title":"5. 翻译结果","slug":"_5-翻译结果","link":"#_5-翻译结果","children":[]}]},{"level":2,"title":"使用问题","slug":"使用问题","link":"#使用问题","children":[{"level":3,"title":"返回 null","slug":"返回-null","link":"#返回-null","children":[]},{"level":3,"title":"JSON 键名及其局限性","slug":"json-键名及其局限性","link":"#json-键名及其局限性","children":[]}]},{"level":2,"title":"结语","slug":"结语","link":"#结语","children":[]}],"git":{"createdTime":1702969080000,"updatedTime":1704206480000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":6.04,"words":1813},"filePathRelative":"apps/devdocs/json-translate.md","localizedDate":"2023年12月19日","excerpt":"

    JsonTranslate,一款专为开发者和内容创作者设计的多语言 JSON 翻译工具,支持 Google Translate、DeepL 和 DeepLX 翻译 API,助力项目国际化和本地化。无论你是在开发多语言网站、应用程序还是处理多语言数据集,JsonTranslate 都能提供简便的解决方案,轻松将 JSON 文件中的内容翻译为多种目标语言。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/logseq.html.cd8791ac.js b/assets/js/logseq.html.cd8791ac.js new file mode 100644 index 000000000..4544ac0d7 --- /dev/null +++ b/assets/js/logseq.html.cd8791ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1597],{3671:(n,a)=>{a.A=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},847:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>m,data:()=>f});var e=s(7847);const t={href:"https://logseq.com/",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Fv)('

    另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week "journals"} 被报错。继续尝试设计周记、月报的模板。

    Logseq 劣势,所有页面建立在 pages 下,但可以手动修改位置。双链笔记有个特点,只要名称不变,文档位置更改也不会影响引用。

    我会把远期不安排的任务,往 later 清单中放,随时可以查看提醒,但又不需要每天重复调整时间。

    标签使用

    在之前,我习惯按笔记领域中使用各种标签,例如 #tool#docker,但这反而使管理变得繁琐。

    现在,除了常见的标签外,我开始使用工具或项目的名称作为标记,例如 #learndata#logseq。这样能更直观地找到相关的笔记。

    快速使用

    • [[]] 可快速新建页面,All pages 中可删除空页面
    • 打开右上角的「侧边栏」,使用目录管理主页面
    • 将页面中内容汇总起来,比如「心理学」标签页面显示所有心理学
    • 任务时,使用 later 或 now,切换后改变状态,会记录任务持续时间。
      • 如果使用 doing 或者 now 命令,它会更显眼地出现在每天日志的下方(如红框所示),以防当天记录的东西过多,或者到了第二天生成了新的日志后被忽略。直到你将它完成为止,它才会消失,算是一种强提醒。
    • PDF 文档的标注管理一直是个大难题,而用 Logseq 后方便许多,能将注释与标签、笔记、截图统合在一起。
    • TOC Generator 插件生成目录:{{renderer :tocgen}}
    • shift+左键 将新页面打开在右侧边栏中。
    • 忽略指定文件夹?

    query

    ',10),p={href:"https://www.bilibili.com/video/BV1eq4y1N7Su",target:"_blank",rel:"noopener noreferrer"},c={href:"https://docs.logseq.com/#/page/queries",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Fv)('

    首先,在文本后方添加 tag,比如

    idea 1 #idea\nfind #research\n

    接着,使用 query 命令寻找对应结果

    * and 命令\n{{query (and [[research]] [[idea]])}}\n{{query (and (task now later done) [[page]])}}\n\n* or 命令\n{{query (or [[page 1]] [[page 2]])}}\n\n* not 命令\n{{query (not [[page 1]] [[page 2]])}}\n\n* 罗列为 Later 的 task\n{{query (task later)}}\n\n* 一周内的日记,且包含关键词或标签\n{{query(and (between -6d today)  "#幸福")}}\n

    ',5),l={class:"footnotes"},u={class:"footnotes-list"},r={id:"footnote1",class:"footnote-item"},d={href:"https://thinkstack.club/how-to-set-up-an-automated-daily-template-in-logseq/",target:"_blank",rel:"noopener noreferrer"},k=(0,e.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),g={},m=(0,s(3671).A)(g,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.eW)("与 Obsidian 相比,"),(0,e.Lk)("a",t,[(0,e.eW)("Logseq"),(0,e.bF)(s)]),(0,e.eW)(" 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。")]),o,(0,e.Lk)("p",null,[(0,e.Lk)("a",p,[(0,e.eW)("query"),(0,e.bF)(s)]),(0,e.eW)(" 能按条件精准地找到结果,并动态更新在页面中,公式参考"),(0,e.Lk)("a",c,[(0,e.eW)("官方文档"),(0,e.bF)(s)]),(0,e.eW)("。")]),i,(0,e.Lk)("section",l,[(0,e.Lk)("ol",u,[(0,e.Lk)("li",r,[(0,e.Lk)("p",null,[(0,e.Lk)("a",d,[(0,e.eW)("How to Set Up an Automated Daily Template in Logseq"),(0,e.bF)(s)]),(0,e.eW)(),k])])])])])}]]),f=JSON.parse('{"path":"/apps/tutorials/logseq.html","title":"Logseq","lang":"zh-CN","frontmatter":{"article":false,"title":"Logseq","order":1,"description":"与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。 另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\"journal...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/logseq.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Logseq"}],["meta",{"property":"og:description","content":"与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。 另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\"journal..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-11-15-22-31.png?imageMogr2/format/webp?imageMogr2/format/webp/thumbnail/600x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-11T07:26:19.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Logseq"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-11T07:26:19.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Logseq\\",\\"description\\":\\"与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。 另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\\\\\"journal...\\"}"]]},"headers":[{"level":2,"title":"标签使用","slug":"标签使用","link":"#标签使用","children":[]},{"level":2,"title":"快速使用","slug":"快速使用","link":"#快速使用","children":[]},{"level":2,"title":"query","slug":"query","link":"#query","children":[]}],"git":{"createdTime":1701223097000,"updatedTime":1702279579000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.34,"words":701},"filePathRelative":"apps/tutorials/logseq.md","localizedDate":"2023年11月29日","excerpt":"

    与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。

    \\n

    另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\"journals\\"} 被报错。继续尝试设计周记、月报的模板。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-57fec9f0.4e84ffef.js b/assets/js/memos.html.c5098f0a.js similarity index 91% rename from assets/js/v-57fec9f0.4e84ffef.js rename to assets/js/memos.html.c5098f0a.js index 0da025568..9dbe8aade 100644 --- a/assets/js/v-57fec9f0.4e84ffef.js +++ b/assets/js/memos.html.c5098f0a.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8238],{9720:(e,n)=>{n.c=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},1196:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>r,data:()=>c});var a=s(3968);const t={href:"https://github.com/usememos/memos",target:"_blank",rel:"noopener noreferrer"},o=(0,a.IL)('
    version: "3.0"\nservices:\n  memos:\n    image: neosmemo/memos:latest\n    container_name: memos\n    volumes:\n      - /volume1/docker/memos:/var/opt/memos\n    ports:\n      - 5230:5230\n
    ',1),l={href:"https://github.com/Quorafind/Obsidian-Memos",target:"_blank",rel:"noopener noreferrer"},p=(0,a.IL)('

    flomo 支持将所有笔记导出,并允许通过微信输入内容。flomo Pro 每日会随机选取 12 条符合条件的内容,让你过往的记录发挥更大的价值。

    然而,对于我个人而言,flomo 和 Memos 更适合碎片化记录,无需频繁回顾。除了记录心情类日记之外,有价值的信息可以以知识点的形式保存在思源笔记中,然后通过思源笔记的间隔重复闪卡功能来加强记忆。

    领域标签

    • Inbox(收件箱):我会将所有临时性的,还未消化的内容放置于此,定期来进行归档、整理或者删除。可以当做大脑的缓存,避免记录的时候纠结放在哪里。
    • Area(领域):日常你需要精进的「领域」,比如健康就是一个领域,而跑步则是项目;写作是一个领域,而写一篇公众号文章则是一个项目。
    • Project(项目):是指一个将要发生的独立事件,并且这个事件不是一次性就能完成的,至少需要多个动作才能完成。比如要写一本书,需要整理资料,罗列提纲,撰写内容,联系出版社。类似生活中还有组织一次旅游,录制一期播客等。在执行项目的相关资料
    • Resource(资源):永久笔记,一般来说是兴趣、主题、资产等内容。注意是自己消化过的内容,而非机械的收藏。
    • Marketplace 是最重要研究的领域
    • Sheep、Books 是最重要的资源(Sheep 是指人物,即羔羊)
    • 三醒吾身:日记
    ',4),i={},r=(0,s(9720).c)(i,[["render",function(e,n){const s=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.QD)("a",t,[(0,a.mY)("Memos"),(0,a.K2)(s)]),(0,a.mY)(" 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。")]),o,(0,a.QD)("p",null,[(0,a.mY)("如果你使用 Obsidian,还可以考虑使用其插件 "),(0,a.QD)("a",l,[(0,a.mY)("Obsidian-Memos"),(0,a.K2)(s)]),(0,a.mY)(",它与 Memos 功能类似,但笔记将保存在 Obsidian 中。你还可以使用 Memos Sync 插件将 memos 记录同步至 Obsidian。")]),p])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/memos.html","title":"Memos:碎片化记录","lang":"zh-CN","frontmatter":{"article":false,"title":"Memos:碎片化记录","order":34,"description":"Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。 如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memo...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/memos.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Memos:碎片化记录"}],["meta",{"property":"og:description","content":"Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。 如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memo..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Memos:碎片化记录\\",\\"description\\":\\"Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。 如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memo...\\"}"]]},"headers":[{"level":2,"title":"领域标签","slug":"领域标签","link":"#领域标签","children":[]}],"git":{"createdTime":1697975314000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.03,"words":610},"filePathRelative":"services/dockers-on-nas/memos.md","localizedDate":"2023年10月22日","excerpt":"

    Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。

    \\n
    version: \\"3.0\\"\\nservices:\\n  memos:\\n    image: neosmemo/memos:latest\\n    container_name: memos\\n    volumes:\\n      - /volume1/docker/memos:/var/opt/memos\\n    ports:\\n      - 5230:5230\\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7573],{3671:(e,n)=>{n.A=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},1546:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>r,data:()=>c});var a=s(7847);const t={href:"https://github.com/usememos/memos",target:"_blank",rel:"noopener noreferrer"},o=(0,a.Fv)('
    version: "3.0"\nservices:\n  memos:\n    image: neosmemo/memos:latest\n    container_name: memos\n    volumes:\n      - /volume1/docker/memos:/var/opt/memos\n    ports:\n      - 5230:5230\n
    ',1),l={href:"https://github.com/Quorafind/Obsidian-Memos",target:"_blank",rel:"noopener noreferrer"},p=(0,a.Fv)('

    flomo 支持将所有笔记导出,并允许通过微信输入内容。flomo Pro 每日会随机选取 12 条符合条件的内容,让你过往的记录发挥更大的价值。

    然而,对于我个人而言,flomo 和 Memos 更适合碎片化记录,无需频繁回顾。除了记录心情类日记之外,有价值的信息可以以知识点的形式保存在思源笔记中,然后通过思源笔记的间隔重复闪卡功能来加强记忆。

    领域标签

    • Inbox(收件箱):我会将所有临时性的,还未消化的内容放置于此,定期来进行归档、整理或者删除。可以当做大脑的缓存,避免记录的时候纠结放在哪里。
    • Area(领域):日常你需要精进的「领域」,比如健康就是一个领域,而跑步则是项目;写作是一个领域,而写一篇公众号文章则是一个项目。
    • Project(项目):是指一个将要发生的独立事件,并且这个事件不是一次性就能完成的,至少需要多个动作才能完成。比如要写一本书,需要整理资料,罗列提纲,撰写内容,联系出版社。类似生活中还有组织一次旅游,录制一期播客等。在执行项目的相关资料
    • Resource(资源):永久笔记,一般来说是兴趣、主题、资产等内容。注意是自己消化过的内容,而非机械的收藏。
    • Marketplace 是最重要研究的领域
    • Sheep、Books 是最重要的资源(Sheep 是指人物,即羔羊)
    • 三醒吾身:日记
    ',4),i={},r=(0,s(3671).A)(i,[["render",function(e,n){const s=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",t,[(0,a.eW)("Memos"),(0,a.bF)(s)]),(0,a.eW)(" 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。")]),o,(0,a.Lk)("p",null,[(0,a.eW)("如果你使用 Obsidian,还可以考虑使用其插件 "),(0,a.Lk)("a",l,[(0,a.eW)("Obsidian-Memos"),(0,a.bF)(s)]),(0,a.eW)(",它与 Memos 功能类似,但笔记将保存在 Obsidian 中。你还可以使用 Memos Sync 插件将 memos 记录同步至 Obsidian。")]),p])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/memos.html","title":"Memos:碎片化记录","lang":"zh-CN","frontmatter":{"article":false,"title":"Memos:碎片化记录","order":34,"description":"Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。 如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memo...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/memos.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Memos:碎片化记录"}],["meta",{"property":"og:description","content":"Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。 如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memo..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Memos:碎片化记录\\",\\"description\\":\\"Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。 如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memo...\\"}"]]},"headers":[{"level":2,"title":"领域标签","slug":"领域标签","link":"#领域标签","children":[]}],"git":{"createdTime":1697975314000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.03,"words":610},"filePathRelative":"services/dockers-on-nas/memos.md","localizedDate":"2023年10月22日","excerpt":"

    Memos 可视为开源版的 flomo,其界面及功能非常相似,适用于碎片化记录和灵感捕捉,同时支持小范围的分享,适用于个人微博记录。Memos 能以时间线形式回顾你选择的日期的记录,并允许通过 Telegram 机器人输入内容。此外,你还可以选择将数据保存在第三方云存储中。

    \\n
    version: \\"3.0\\"\\nservices:\\n  memos:\\n    image: neosmemo/memos:latest\\n    container_name: memos\\n    volumes:\\n      - /volume1/docker/memos:/var/opt/memos\\n    ports:\\n      - 5230:5230\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/mt-photos.html.17edb869.js b/assets/js/mt-photos.html.17edb869.js new file mode 100644 index 000000000..b2def1e68 --- /dev/null +++ b/assets/js/mt-photos.html.17edb869.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9187],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},1821:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>i,data:()=>c});var t=a(7847);const e={href:"https://mtmt.tech/",target:"_blank",rel:"noopener noreferrer"},o=(0,t.Fv)('

    我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,在使用 MT Photos 时,我发现网页端的视频播放经常出现问题,有些视频可以通过切换至全屏模式来播放,而有些视频只显示 1 秒然后无法继续播放。我向开发者反馈了这个问题,对方表示将在后续解决,但没有给出具体的时间表。目前,我只能让家人安装应用来解决视频播放的问题。

    version: "3"\n\nservices:\n  mtphotos:\n    image: mtphotos/mt-photos:latest\n    container_name: mtphotos\n    restart: always\n    ports:\n      - 8162:8063\n      - 8163:8163\n    volumes:\n      - /volume1/docker/MTphotos/config:/config\n      - /volume3/Pictures/upload:/upload\n      - /volume3/Pictures/photos:/photos\n    environment:\n      - TZ=Asia/Shanghai\n      # 是否启用内部 SSL\n      #- SSL_NAME=xxx.newzone.top\n      #- MT_SERVER_SSL_PORT=8163\n      #- RAW_SUPPORT=open\n  # 智能识别 API 容器,用于文本识别、以文搜图、场景识别。不需要的话,可删除本部分。\n  mtphotosai:\n    image: mtphotos/mt-photos-ai:latest\n    container_name: mtphotosai\n    restart: always\n    ports:\n      - 8164:8000\n    environment:\n      #在 MT Photos 后台添加 API 时需要填入 API_AUTH_KEY(字符串),请自行修改。\n      - API_AUTH_KEY=apikey1\n
    ',2),p={},i=(0,a(3671).A)(p,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",e,[(0,t.eW)("MT Photos"),(0,t.bF)(a)]),(0,t.eW)(" 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。")]),o])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/mt-photos.html","title":"MT Photos:分享家庭照片","lang":"zh-CN","frontmatter":{"article":false,"title":"MT Photos:分享家庭照片","order":4,"description":"MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。 我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/mt-photos.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"MT Photos:分享家庭照片"}],["meta",{"property":"og:description","content":"MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。 我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"MT Photos:分享家庭照片\\",\\"description\\":\\"MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。 我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,...\\"}"]]},"headers":[],"git":{"createdTime":1696991517000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":1.27,"words":382},"filePathRelative":"services/dockers-on-nas/mt-photos.md","localizedDate":"2023年10月11日","excerpt":"

    MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。

    \\n

    我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,在使用 MT Photos 时,我发现网页端的视频播放经常出现问题,有些视频可以通过切换至全屏模式来播放,而有些视频只显示 1 秒然后无法继续播放。我向开发者反馈了这个问题,对方表示将在后续解决,但没有给出具体的时间表。目前,我只能让家人安装应用来解决视频播放的问题。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/n8n.html.c5fcfa18.js b/assets/js/n8n.html.c5fcfa18.js new file mode 100644 index 000000000..179927a48 --- /dev/null +++ b/assets/js/n8n.html.c5fcfa18.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7418],{3671:(n,e)=>{e.A=(n,e)=>{const s=n.__vccOpts||n;for(const[n,a]of e)s[n]=a;return s}},7791:(n,e,s)=>{s.r(e),s.d(e,{comp:()=>_,data:()=>S});var a=s(7847);const t={href:"https://github.com/n8n-io/n8n",target:"_blank",rel:"noopener noreferrer"},i={href:"https://sspai.com/prime/story/automation-n8n",target:"_blank",rel:"noopener noreferrer"},o={href:"https://reorx.com/blog/sharing-my-footprints-automation/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.Fv)('

    部署 n8n

    1. 在桌面终端运行 git clone https://github.com/n8n-io/n8n.git 命令,下载 n8n 的仓库文件,并将其复制到 NAS。
    2. 切换路径 cd /volume3/storage/n8n/docker/compose/withPostgres
    3. 运行 sudo docker-compose up -d 命令进行部署。

    在初次部署时,你可能会遇到 for n8n Container "5a6edd16e779" is unhealthy. 的提示,这时只需忽略该提示,再次运行 sudo docker-compose up -d 命令即可解决问题。如果在更新 git 仓库文件后重新部署时遇到提示无需更新的情况,你可以先删除容器,然后重新部署。

    下面是部署 n8n 的 Docker 配置文件:

    # https://github.com/n8n-io/n8n/tree/master/docker/compose/withPostgres\n# https://docs.n8n.io/hosting/installation/server-setups/docker-compose/#5-create-docker-compose-file\nversion: "3.8"\n\nservices:\n  n8n-postgres:\n    image: postgres:11\n    container_name: n8n-postgres\n    restart: always\n    environment:\n      - POSTGRES_USER\n      - POSTGRES_PASSWORD\n      - POSTGRES_DB\n      - POSTGRES_NON_ROOT_USER\n      - POSTGRES_NON_ROOT_PASSWORD\n    volumes:\n      - /volume1/docker/n8n/db:/var/lib/postgresql/data\n      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh\n    healthcheck:\n      test:\n        [\n          "CMD-SHELL",\n          "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}",\n        ]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n\n  n8n:\n    image: docker.n8n.io/n8nio/n8n\n    container_name: n8n\n    restart: always\n    environment:\n      - N8N_HOST=${N8N_HOST}\n      - NODE_ENV=production\n      - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL}\n      - VUE_APP_URL_BASE_API=${N8N_EDITOR_BASE_URL}\n      - WEBHOOK_URL=${N8N_EDITOR_BASE_URL}\n      - DB_TYPE=postgresdb\n      - DB_POSTGRESDB_HOST=n8n-postgres\n      - DB_POSTGRESDB_PORT=5432\n      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}\n      - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}\n      - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}\n      - TZ=Asia/Shanghai\n    ports:\n      - 5720:5678\n    links:\n      - n8n-postgres\n    volumes:\n      - /volume1/docker/n8n/storage:/home/node/.n8n\n    depends_on:\n      n8n-postgres:\n        condition: service_healthy\n

    在上述文件中,/volume1/docker/n8n 被指定为 n8n 的配置目录,你需要确保 n8n 有该路径的读写权限,否则项目可能会在启动时报错。

    环境变量

    在当前目录的 .env 文件中,可以更改 PostgreSQL 的默认数据库名称、用户和密码。

    N8N_HOST=localnas.com\nN8N_EDITOR_BASE_URL=http://localnas.com:5720/\n\nPOSTGRES_USER=changeUser\nPOSTGRES_PASSWORD=changePassword\nPOSTGRES_DB=n8n\n\nPOSTGRES_NON_ROOT_USER=changeUser\nPOSTGRES_NON_ROOT_PASSWORD=changePassword\n

    N8N_HOSTN8N_EDITOR_BASE_URL 用于第三方 API 的回调访问。如果你启用了外网调用 n8n 的访问权限,建议开启 Two-factor authentication (2FA),以防止 API 信息泄露。不建议将 N8N_HOST 设为内部域名,否则在后续设置中可能会出现 Bad Request: bad webhook: An HTTPS URL must be provided for webhook 错误。

    节点介绍

    HTTP Request

    ',12),p={href:"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/",target:"_blank",rel:"noopener noreferrer"},c=(0,a.Lk)("p",null,"在使用过程中,如果遇到网页端连接不稳定的问题,可以在节点设置中的 On Error 选项选择 Continue,并在 Options 中添加超时选项,例如 Timeout 10000 ms。",-1),r=(0,a.Lk)("h3",{id:"if",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#if"},[(0,a.Lk)("span",null,"IF")])],-1),u={href:"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/",target:"_blank",rel:"noopener noreferrer"},d=(0,a.Lk)("code",null,"{{}}",-1),k=(0,a.Fv)('

    Github Trigger

    Github Trigger 节点可以通过在 Github 上设置 Webhook 来获得推送通知。

    如果遇到 Workflow could not be activated: A webhook with the identical URL probably exists already. Please delete it manually on Github! 的错误提示,通常是因为在仓库中存在多个相同的 Webhook 地址。你可以进入 repo 仓库,选择 Settings > Code and automation > Webhooks,手动删除重复的 Webhook 地址来解决这个问题。

    使用 Tips

    变量路径

    对于一些复杂的输入变量,你可以直接使用 n8n 自带的工具来复制路径。在 INPUT 区域选择 JSON,点击要选择的参数,然后点击 INPUT 右上角的复制按钮,选择 Copy Parameter Path

    其他操作记录

    Discord OAuth2

    ',10),m={href:"https://discord.com/developers/applications",target:"_blank",rel:"noopener noreferrer"},v=(0,a.Lk)("p",null,"接着,将 CLIENT ID 和 CLIENT SECRET 添加到 n8n 中即可。",-1),h={href:"https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-",target:"_blank",rel:"noopener noreferrer"},b=(0,a.Lk)("p",null,"通过上述步骤,你可以灵活地使用 n8n 来构建自动化工作流,实现数据的聚合、管理和分析。希望这些信息能够帮助你高效地使用 n8n,使你的工作和生活更加自动化和便捷。如果你在使用过程中遇到任何问题或有更多的经验分享,请在评论区留言,我们可以一起讨论和解决。",-1),g={},_=(0,s(3671).A)(g,[["render",function(n,e){const s=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",t,[(0,a.eW)("n8n"),(0,a.bF)(s)]),(0,a.eW)(" 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。")]),(0,a.Lk)("p",null,[(0,a.eW)("对于初学者,建议先跟随教程 "),(0,a.Lk)("a",i,[(0,a.eW)("基于 n8n 的开源自动化:以滴答清单同步 Notion 为例"),(0,a.bF)(s)]),(0,a.eW)(" 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可以参考 "),(0,a.Lk)("a",o,[(0,a.eW)("使用自动化工作流聚合信息摄入和输出"),(0,a.bF)(s)]),(0,a.eW)("。")]),l,(0,a.Lk)("p",null,[(0,a.Lk)("a",p,[(0,a.eW)("HTTP Request"),(0,a.bF)(s)]),(0,a.eW)(" 节点允许你使用 REST API 发出 HTTP 请求,从任何应用程序或服务中查询数据。")]),c,r,(0,a.Lk)("p",null,[(0,a.Lk)("a",u,[(0,a.eW)("IF"),(0,a.bF)(s)]),(0,a.eW)(" 节点允许你根据比较操作有条件地分割工作流。注意,布尔值的 true 和 false 需要使用双重花括号 "),d,(0,a.eW)(" 包围。")]),k,(0,a.Lk)("p",null,[(0,a.eW)("在 "),(0,a.Lk)("a",m,[(0,a.eW)("Discord Applications"),(0,a.bF)(s)]),(0,a.eW)(" 中新建应用,然后在 OAuth2 > General > Redirects 中添加回调地址。")]),v,(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.Lk)("a",h,[(0,a.eW)("Where can I find my User/Server/Message ID?"),(0,a.bF)(s)])])]),b])}]]),S=JSON.parse('{"path":"/services/dockers-on-nas/n8n.html","title":"n8n:工作流自动化","lang":"zh-CN","frontmatter":{"article":false,"title":"n8n:工作流自动化","order":81,"description":"n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。 对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/n8n.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"n8n:工作流自动化"}],["meta",{"property":"og:description","content":"n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。 对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-12-22-43-08.png?imageMogr2/format/webp?imageMogr2/format/webp/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"n8n:工作流自动化"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"n8n:工作流自动化\\",\\"description\\":\\"n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。 对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可...\\"}"]]},"headers":[{"level":2,"title":"部署 n8n","slug":"部署-n8n","link":"#部署-n8n","children":[]},{"level":2,"title":"环境变量","slug":"环境变量","link":"#环境变量","children":[]},{"level":2,"title":"节点介绍","slug":"节点介绍","link":"#节点介绍","children":[{"level":3,"title":"HTTP Request","slug":"http-request","link":"#http-request","children":[]},{"level":3,"title":"IF","slug":"if","link":"#if","children":[]},{"level":3,"title":"Github Trigger","slug":"github-trigger","link":"#github-trigger","children":[]}]},{"level":2,"title":"使用 Tips","slug":"使用-tips","link":"#使用-tips","children":[{"level":3,"title":"变量路径","slug":"变量路径","link":"#变量路径","children":[]}]},{"level":2,"title":"其他操作记录","slug":"其他操作记录","link":"#其他操作记录","children":[{"level":3,"title":"Discord OAuth2","slug":"discord-oauth2","link":"#discord-oauth2","children":[]}]}],"git":{"createdTime":1701852517000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.74,"words":1121},"filePathRelative":"services/dockers-on-nas/n8n.md","localizedDate":"2023年12月6日","excerpt":"

    n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。

    \\n

    对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可以参考 使用自动化工作流聚合信息摄入和输出

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-9b85a2a4.0e4c6390.js b/assets/js/navidrome.html.1f340343.js similarity index 86% rename from assets/js/v-9b85a2a4.0e4c6390.js rename to assets/js/navidrome.html.1f340343.js index aea0ce794..77c4f94bc 100644 --- a/assets/js/v-9b85a2a4.0e4c6390.js +++ b/assets/js/navidrome.html.1f340343.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1068],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},5144:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>u,data:()=>m});var s=a(3968);const t=(0,s.QD)("p",null,"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。",-1),o=(0,s.QD)("p",null,"鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。",-1),r={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},i=(0,s.IL)('
    version: "3"\nservices:\n  navidrome:\n    image: deluan/navidrome:latest\n    container_name: navidrome\n    #user: 1000:1000 # should be owner of volumes #群晖应该是 1026:100 # 使用 `id 用户名` 可以查看代码\n    ports:\n      - "4533:4533"\n    restart: unless-stopped\n    environment:\n      # Optional: put your config options customization here. Examples:\n      ND_SCANSCHEDULE: 1h\n      ND_LOGLEVEL: info\n      ND_SESSIONTIMEOUT: 24h\n      ND_BASEURL: ""\n    volumes:\n      - "/volume1/docker/navidrome/data:/data"\n      - "/volume4/Music/Audio:/music:ro"\n
    ',1),l={href:"https://www.cnblogs.com/vinlxc/p/11347744.html",target:"_blank",rel:"noopener noreferrer"},p={href:"https://aqzscn.cn/archives/stream-music-versions",target:"_blank",rel:"noopener noreferrer"},c=(0,s.QD)("p",null,"然而,Navidrome 也有其局限性:它不支持显示多行歌词,搜索功能以专辑为单位,这使得直接搜索特定歌曲可能不会总是准确。另外,Windows 客户端不支持显示歌词功能。因此,我转向使用 Emby 来管理 PC 端音乐。然而,Emby 流媒体播放时偶尔会断播,与之对比,Navidrome 在音乐流播放方面更稳定,并且更适合用于移动端 API。",-1),d={},u=(0,a(9720).c)(d,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[t,o,(0,s.QD)("p",null,[(0,s.mY)("想要了解其他安装方法,你可以查看 "),(0,s.QD)("a",r,[(0,s.mY)("Navidrome 的官方教程"),(0,s.K2)(a)]),(0,s.mY)("。")]),i,(0,s.QD)("p",null,[(0,s.mY)("不过,Navidrome 并不提供歌词下载功能。如果你需要下载内置的歌词,可以通过 "),(0,s.QD)("a",l,[(0,s.mY)("MusicTag"),(0,s.K2)(a)]),(0,s.mY)(" 实现。")]),(0,s.QD)("p",null,[(0,s.mY)("对于播放器的选择,推荐使用国产的 "),(0,s.QD)("a",p,[(0,s.mY)("音流"),(0,s.K2)(a)]),(0,s.mY)(" 播放器。它当前正处于内测阶段,支持 iOS 和 Android 平台,能够显示下载的内置歌词。")]),c])}]]),m=JSON.parse('{"path":"/services/dockers-on-nas/navidrome.html","title":"Navidrome:开源音乐服务器","lang":"zh-CN","frontmatter":{"article":false,"title":"Navidrome:开源音乐服务器","order":3,"description":"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。 鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。 想要了解其他安装方法,你可以查看 Navidr...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/navidrome.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Navidrome:开源音乐服务器"}],["meta",{"property":"og:description","content":"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。 鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。 想要了解其他安装方法,你可以查看 Navidr..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Navidrome:开源音乐服务器\\",\\"description\\":\\"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。 鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。 想要了解其他安装方法,你可以查看 Navidr...\\"}"]]},"headers":[],"git":{"createdTime":1694827853000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":1.34,"words":402},"filePathRelative":"services/dockers-on-nas/navidrome.md","localizedDate":"2023年9月16日","excerpt":"

    Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。

    \\n

    鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。

    \\n

    想要了解其他安装方法,你可以查看 Navidrome 的官方教程

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4447],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},4671:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>d,data:()=>m});var s=a(7847);const t=(0,s.Lk)("p",null,"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。",-1),o=(0,s.Lk)("p",null,"鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。",-1),r={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},i=(0,s.Fv)('
    version: "3"\nservices:\n  navidrome:\n    image: deluan/navidrome:latest\n    container_name: navidrome\n    #user: 1000:1000 # should be owner of volumes #群晖应该是 1026:100 # 使用 `id 用户名` 可以查看代码\n    ports:\n      - "4533:4533"\n    restart: unless-stopped\n    environment:\n      # Optional: put your config options customization here. Examples:\n      ND_SCANSCHEDULE: 1h\n      ND_LOGLEVEL: info\n      ND_SESSIONTIMEOUT: 24h\n      ND_BASEURL: ""\n    volumes:\n      - "/volume1/docker/navidrome/data:/data"\n      - "/volume4/Music/Audio:/music:ro"\n
    ',1),l={href:"https://www.cnblogs.com/vinlxc/p/11347744.html",target:"_blank",rel:"noopener noreferrer"},p={href:"https://aqzscn.cn/archives/stream-music-versions",target:"_blank",rel:"noopener noreferrer"},c=(0,s.Lk)("p",null,"然而,Navidrome 也有其局限性:它不支持显示多行歌词,搜索功能以专辑为单位,这使得直接搜索特定歌曲可能不会总是准确。另外,Windows 客户端不支持显示歌词功能。因此,我转向使用 Emby 来管理 PC 端音乐。然而,Emby 流媒体播放时偶尔会断播,与之对比,Navidrome 在音乐流播放方面更稳定,并且更适合用于移动端 API。",-1),u={},d=(0,a(3671).A)(u,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,o,(0,s.Lk)("p",null,[(0,s.eW)("想要了解其他安装方法,你可以查看 "),(0,s.Lk)("a",r,[(0,s.eW)("Navidrome 的官方教程"),(0,s.bF)(a)]),(0,s.eW)("。")]),i,(0,s.Lk)("p",null,[(0,s.eW)("不过,Navidrome 并不提供歌词下载功能。如果你需要下载内置的歌词,可以通过 "),(0,s.Lk)("a",l,[(0,s.eW)("MusicTag"),(0,s.bF)(a)]),(0,s.eW)(" 实现。")]),(0,s.Lk)("p",null,[(0,s.eW)("对于播放器的选择,推荐使用国产的 "),(0,s.Lk)("a",p,[(0,s.eW)("音流"),(0,s.bF)(a)]),(0,s.eW)(" 播放器。它当前正处于内测阶段,支持 iOS 和 Android 平台,能够显示下载的内置歌词。")]),c])}]]),m=JSON.parse('{"path":"/services/dockers-on-nas/navidrome.html","title":"Navidrome:开源音乐服务器","lang":"zh-CN","frontmatter":{"article":false,"title":"Navidrome:开源音乐服务器","order":3,"description":"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。 鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。 想要了解其他安装方法,你可以查看 Navidr...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/navidrome.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Navidrome:开源音乐服务器"}],["meta",{"property":"og:description","content":"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。 鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。 想要了解其他安装方法,你可以查看 Navidr..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Navidrome:开源音乐服务器\\",\\"description\\":\\"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。 鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。 想要了解其他安装方法,你可以查看 Navidr...\\"}"]]},"headers":[],"git":{"createdTime":1694827853000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":1.34,"words":402},"filePathRelative":"services/dockers-on-nas/navidrome.md","localizedDate":"2023年9月16日","excerpt":"

    Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。

    \\n

    鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。

    \\n

    想要了解其他安装方法,你可以查看 Navidrome 的官方教程

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-35903398.d85cf15e.js b/assets/js/newborn.html.524a974d.js similarity index 95% rename from assets/js/v-35903398.d85cf15e.js rename to assets/js/newborn.html.524a974d.js index 681004ae5..cd836a047 100644 --- a/assets/js/v-35903398.d85cf15e.js +++ b/assets/js/newborn.html.524a974d.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1440],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},6764:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>h,data:()=>d});var o=n(3968);const a=(0,o.IL)('

    坚持母乳喂养

    为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

    • 母乳喂养是婴儿出生后最佳喂养方式。
    • 婴儿出生后不要喂任何母乳以外的食物。
    • 应坚持纯母乳喂养至婴儿满 6 月龄。
    • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
    • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
    • 婴儿哭泣诱导母亲释放催产素。

    宝宝醒了吗

    初为人父时,我会因宝宝的任何小动静而紧张,不断跑过去查看。但其实,即使宝宝有些身体动作,也不代表她真的醒来。因此,无需因宝宝的轻微动静就去打扰她。[1]

    宝宝哭闹的原因

    宝宝刚出生时,月嫂和家里老人都有个说法是不能惯着她,让宝宝哭一会。但是,哭闹是婴儿表达饥饿信号的最晚表现

    在因饥饿而哭闹之前,婴儿可能已经出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿的后续表现才是哭闹。所以,根本不存在惯不惯着的问题,人家哭的时候,已经是饿惨了,请立即喂奶。

    喂养的时长和频次由婴儿进食意愿和需求决定。不要因为所谓的惯着而让婴幼儿哭闹。通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

    新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。

    除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。应考虑非饥饿原因,比如大小便、体温等。

    婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

    婴幼儿哭闹是有具体需求的,先满足她的需求让她心情平静下来,哭闹时不要做排气操等行为。

    月嫂:助手还是潜在风险?

    月嫂为新父母提供宝贵的育儿知识,但务必确认其是否携带药物。若有,应要求其将药物存放于宝妈房中。

    我们第一个月嫂是从老家来的,做事利索,宝宝在她手上也特别乖。但是来了一周后,宝宝突然有两天睡得很沉,家人虽然奇怪,但都不清楚原因。然而,在随后一天的夜里,我丈母娘查监控时,突然看到月嫂为宝宝喂了药物。监控视频显示,月嫂确实有疑似给宝宝喂食的举动,且宝宝展现出吞咽的反应。当晚我们匆忙前往儿童医院,医生诊断宝宝的黄疸值为 12,并告知这一指数高可能导致嗜睡。考虑到为宝宝抽血的风险,我们没有进行进一步的检验。但当晚,宝宝整夜都未醒来,考虑到新生儿的胃容量只有 100-200ml,超过 3 小时便会感到饥饿。这更加加深了我们的怀疑,随后就辞退了这位月嫂。

    在随后的红房子医院复查中,我得知黄疸值需超过 20 才会导致嗜睡,婴儿的安眠用药非常具有时效性,很快就无法检测到。当时,监控于 22:40 捕捉到疑似喂药动作,但第一次去的医院没有新生儿门诊,直到凌晨 1 点才抵达能够进行此检测的医院。但儿童医院可能因为深夜不愿意为宝宝抽血,故意诊断为黄疸高嗜睡。

    第二个月嫂也带了药,而且相当懒惰。宝妈还在喂奶,月嫂 9 点就睡了。当晚我就打电话让中介换人,按一天工资给她结了。

    第三个月嫂的态度非常积极,她明确表示不会携带药物,并允许我们检查她的物品。她还精心准备了美味的月子餐,让宝妈可以分享照片,从而提振心情。好的心情对坐月子的母亲来说极为重要。

    为确保婴儿安全,建议在婴儿区域安装至少两个监控摄像头:一个针对婴儿床,另一个涵盖婴儿活动区。我最初只装了一个,发生疑似喂药事件后,才又增设了一个。与月嫂初次见面时,建议明确告知她家里有摄像头,一般她们都能接受。


    ',21),l={class:"footnotes"},i={class:"footnotes-list"},r={id:"footnote1",class:"footnote-item"},p={href:"https://www.bilibili.com/bangumi/play/ep272469",target:"_blank",rel:"noopener noreferrer"},s=(0,o.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),c={},h=(0,n(9720).c)(c,[["render",function(e,t){const n=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[a,(0,o.QD)("section",l,[(0,o.QD)("ol",i,[(0,o.QD)("li",r,[(0,o.QD)("p",null,[(0,o.QD)("a",p,[(0,o.mY)("母性科学"),(0,o.K2)(n)]),(0,o.mY)(),s])])])])])}]]),d=JSON.parse('{"path":"/family/baby/newborn.html","title":"新生儿期(0-6 月)","lang":"zh-CN","frontmatter":{"article":false,"title":"新生儿期(0-6 月)","order":2,"description":"坚持母乳喂养 为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) 母乳喂养是婴儿出生后最佳喂养方式。 婴儿出生后不要喂任何母乳以外的食物。 应坚持纯...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/newborn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"新生儿期(0-6 月)"}],["meta",{"property":"og:description","content":"坚持母乳喂养 为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) 母乳喂养是婴儿出生后最佳喂养方式。 婴儿出生后不要喂任何母乳以外的食物。 应坚持纯..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-06T19:17:35.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-10-06T19:17:35.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"新生儿期(0-6 月)\\",\\"description\\":\\"坚持母乳喂养 为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) 母乳喂养是婴儿出生后最佳喂养方式。 婴儿出生后不要喂任何母乳以外的食物。 应坚持纯...\\"}"]]},"headers":[{"level":2,"title":"坚持母乳喂养","slug":"坚持母乳喂养","link":"#坚持母乳喂养","children":[]},{"level":2,"title":"宝宝醒了吗","slug":"宝宝醒了吗","link":"#宝宝醒了吗","children":[]},{"level":2,"title":"宝宝哭闹的原因","slug":"宝宝哭闹的原因","link":"#宝宝哭闹的原因","children":[]},{"level":2,"title":"月嫂:助手还是潜在风险?","slug":"月嫂-助手还是潜在风险","link":"#月嫂-助手还是潜在风险","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1696619855000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":5.72,"words":1715},"filePathRelative":"family/baby/newborn.md","localizedDate":"2023年9月16日","excerpt":"

    坚持母乳喂养

    \\n

    为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

    \\n
    \\n
      \\n
    • 母乳喂养是婴儿出生后最佳喂养方式。
    • \\n
    • 婴儿出生后不要喂任何母乳以外的食物。
    • \\n
    • 应坚持纯母乳喂养至婴儿满 6 月龄。
    • \\n
    • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
    • \\n
    • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
    • \\n
    • 婴儿哭泣诱导母亲释放催产素。
    • \\n
    \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4523],{3671:(e,t)=>{t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},6644:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>h,data:()=>d});var o=n(7847);const a=(0,o.Fv)('

    坚持母乳喂养

    为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

    • 母乳喂养是婴儿出生后最佳喂养方式。
    • 婴儿出生后不要喂任何母乳以外的食物。
    • 应坚持纯母乳喂养至婴儿满 6 月龄。
    • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
    • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
    • 婴儿哭泣诱导母亲释放催产素。

    宝宝醒了吗

    初为人父时,我会因宝宝的任何小动静而紧张,不断跑过去查看。但其实,即使宝宝有些身体动作,也不代表她真的醒来。因此,无需因宝宝的轻微动静就去打扰她。[1]

    宝宝哭闹的原因

    宝宝刚出生时,月嫂和家里老人都有个说法是不能惯着她,让宝宝哭一会。但是,哭闹是婴儿表达饥饿信号的最晚表现

    在因饥饿而哭闹之前,婴儿可能已经出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿的后续表现才是哭闹。所以,根本不存在惯不惯着的问题,人家哭的时候,已经是饿惨了,请立即喂奶。

    喂养的时长和频次由婴儿进食意愿和需求决定。不要因为所谓的惯着而让婴幼儿哭闹。通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

    新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。

    除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。应考虑非饥饿原因,比如大小便、体温等。

    婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

    婴幼儿哭闹是有具体需求的,先满足她的需求让她心情平静下来,哭闹时不要做排气操等行为。

    月嫂:助手还是潜在风险?

    月嫂为新父母提供宝贵的育儿知识,但务必确认其是否携带药物。若有,应要求其将药物存放于宝妈房中。

    我们第一个月嫂是从老家来的,做事利索,宝宝在她手上也特别乖。但是来了一周后,宝宝突然有两天睡得很沉,家人虽然奇怪,但都不清楚原因。然而,在随后一天的夜里,我丈母娘查监控时,突然看到月嫂为宝宝喂了药物。监控视频显示,月嫂确实有疑似给宝宝喂食的举动,且宝宝展现出吞咽的反应。当晚我们匆忙前往儿童医院,医生诊断宝宝的黄疸值为 12,并告知这一指数高可能导致嗜睡。考虑到为宝宝抽血的风险,我们没有进行进一步的检验。但当晚,宝宝整夜都未醒来,考虑到新生儿的胃容量只有 100-200ml,超过 3 小时便会感到饥饿。这更加加深了我们的怀疑,随后就辞退了这位月嫂。

    在随后的红房子医院复查中,我得知黄疸值需超过 20 才会导致嗜睡,婴儿的安眠用药非常具有时效性,很快就无法检测到。当时,监控于 22:40 捕捉到疑似喂药动作,但第一次去的医院没有新生儿门诊,直到凌晨 1 点才抵达能够进行此检测的医院。但儿童医院可能因为深夜不愿意为宝宝抽血,故意诊断为黄疸高嗜睡。

    第二个月嫂也带了药,而且相当懒惰。宝妈还在喂奶,月嫂 9 点就睡了。当晚我就打电话让中介换人,按一天工资给她结了。

    第三个月嫂的态度非常积极,她明确表示不会携带药物,并允许我们检查她的物品。她还精心准备了美味的月子餐,让宝妈可以分享照片,从而提振心情。好的心情对坐月子的母亲来说极为重要。

    为确保婴儿安全,建议在婴儿区域安装至少两个监控摄像头:一个针对婴儿床,另一个涵盖婴儿活动区。我最初只装了一个,发生疑似喂药事件后,才又增设了一个。与月嫂初次见面时,建议明确告知她家里有摄像头,一般她们都能接受。


    ',21),l={class:"footnotes"},i={class:"footnotes-list"},r={id:"footnote1",class:"footnote-item"},p={href:"https://www.bilibili.com/bangumi/play/ep272469",target:"_blank",rel:"noopener noreferrer"},s=(0,o.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),c={},h=(0,n(3671).A)(c,[["render",function(e,t){const n=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[a,(0,o.Lk)("section",l,[(0,o.Lk)("ol",i,[(0,o.Lk)("li",r,[(0,o.Lk)("p",null,[(0,o.Lk)("a",p,[(0,o.eW)("母性科学"),(0,o.bF)(n)]),(0,o.eW)(),s])])])])])}]]),d=JSON.parse('{"path":"/family/baby/newborn.html","title":"新生儿期(0-6 月)","lang":"zh-CN","frontmatter":{"article":false,"title":"新生儿期(0-6 月)","order":2,"description":"坚持母乳喂养 为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) 母乳喂养是婴儿出生后最佳喂养方式。 婴儿出生后不要喂任何母乳以外的食物。 应坚持纯...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/newborn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"新生儿期(0-6 月)"}],["meta",{"property":"og:description","content":"坚持母乳喂养 为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) 母乳喂养是婴儿出生后最佳喂养方式。 婴儿出生后不要喂任何母乳以外的食物。 应坚持纯..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-06T19:17:35.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-10-06T19:17:35.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"新生儿期(0-6 月)\\",\\"description\\":\\"坚持母乳喂养 为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》) 母乳喂养是婴儿出生后最佳喂养方式。 婴儿出生后不要喂任何母乳以外的食物。 应坚持纯...\\"}"]]},"headers":[{"level":2,"title":"坚持母乳喂养","slug":"坚持母乳喂养","link":"#坚持母乳喂养","children":[]},{"level":2,"title":"宝宝醒了吗","slug":"宝宝醒了吗","link":"#宝宝醒了吗","children":[]},{"level":2,"title":"宝宝哭闹的原因","slug":"宝宝哭闹的原因","link":"#宝宝哭闹的原因","children":[]},{"level":2,"title":"月嫂:助手还是潜在风险?","slug":"月嫂-助手还是潜在风险","link":"#月嫂-助手还是潜在风险","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1696619855000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":5.72,"words":1715},"filePathRelative":"family/baby/newborn.md","localizedDate":"2023年9月16日","excerpt":"

    坚持母乳喂养

    \\n

    为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

    \\n
    \\n
      \\n
    • 母乳喂养是婴儿出生后最佳喂养方式。
    • \\n
    • 婴儿出生后不要喂任何母乳以外的食物。
    • \\n
    • 应坚持纯母乳喂养至婴儿满 6 月龄。
    • \\n
    • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
    • \\n
    • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
    • \\n
    • 婴儿哭泣诱导母亲释放催产素。
    • \\n
    \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-191937ff.d09b6d7d.js b/assets/js/nextcloud.html.83cb8676.js similarity index 91% rename from assets/js/v-191937ff.d09b6d7d.js rename to assets/js/nextcloud.html.83cb8676.js index 445cc111a..b38423a8d 100644 --- a/assets/js/v-191937ff.d09b6d7d.js +++ b/assets/js/nextcloud.html.83cb8676.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[644],{9720:(n,a)=>{a.c=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},1872:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>m,data:()=>v});var e=s(3968);const t={href:"https://github.com/nextcloud/docker",target:"_blank",rel:"noopener noreferrer"},o=(0,e.IL)('

    虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoffice 是一个基于 Web 的办公套件,可以帮助你创建和编辑文字、电子表格和幻灯片等文档,实现文档的在线协作、版本控制和在线编辑等功能。这种集成方式将大大提高你的工作效率和协作能力。

    公网访问 Nextcloud

    若在公网中使用 Nextcloud,需在 docker/nextcloud/data/config/config.php 文件中的 trusted_domains 部分添加你的公网域名,例如 1 => 'xxx.newzone.top'

    即使你的反向代理域名带有端口,也请勿在 trusted_domains 中包含端口信息,否则可能会出现「通过不被信任的域名访问」的提示。在使用带有端口的公网域名时,站点在未登录和成功登录时可能会在跳转时省略端口信息。这时,手动添加端口信息即可正常使用。

    ONLYOFFICE

    ',5),l={href:"https://helpcenter.onlyoffice.com/installation/docs-community-install-docker.aspx",target:"_blank",rel:"noopener noreferrer"},c=(0,e.QD)("p",null,"完成部署后,ONLYOFFICE 会生成一段代码,将其输入到服务器即可获取秘钥。将秘钥填写到「管理设置」>「ONLYOFFICE」中。请注意,重新启动 NAS 和 Docker 容器可能会导致秘钥更换。",-1),p=(0,e.QD)("figure",null,[(0,e.QD)("img",{src:"https://img.newzone.top/2023-11-11-13-51-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,e.QD)("figcaption")],-1),i=(0,e.QD)("h2",{id:"nextcloud-office-中文乱码",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#nextcloud-office-中文乱码"},[(0,e.QD)("span",null,"Nextcloud Office 中文乱码")])],-1),u={href:"https://blog.csdn.net/skydust1979/article/details/106280811",target:"_blank",rel:"noopener noreferrer"},r=(0,e.QD)("code",null,"/volume1/docker/nextcloud/data/lib/public/AppFramework/Http/FileDisplayResponse.php",-1),d=(0,e.IL)('
    //$output->setOutput($this->file->getContent());\n$fileContents=$this->file->getContent();\n$encoding = mb_detect_encoding($fileContents . "a", "UTF-8,GB2312, GBK, WINDOWS-1252, ISO-8859-15, ISO-8859-1, ASCII", true);\nif ($encoding === "") {\n    $encoding = "ISO-8859-15";\n}\n$fileContents = iconv($encoding, "UTF-8", $fileContents);\n$output->setOutput($fileContents);\n

    部署命令

    以下是集成了 ONLYOFFICE 的 Nextcloud 部署命令:

    version: "2"\n\nservices:\n  nextcloud_db:\n    image: mariadb:10.6\n    container_name: nextcloud_db\n    restart: always\n    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW\n    volumes:\n      - /volume1/docker/nextcloud/mysql:/var/lib/mysql\n    environment:\n      - MYSQL_ROOT_PASSWORD=nextcloud\n      - MYSQL_PASSWORD=nextcloud\n      - MYSQL_DATABASE=nextcloud\n      - MYSQL_USER=nextcloud\n\n  nextcloud_app:\n    image: nextcloud\n    container_name: nextcloud\n    restart: always\n    ports:\n      - 9030:80\n    links:\n      - nextcloud_db\n    volumes:\n      - /volume1/docker/nextcloud/data:/var/www/html\n      - /volume1/sync:/sync #外部存储目录\n    environment:\n      - MYSQL_PASSWORD=nextcloud\n      - MYSQL_DATABASE=nextcloud\n      - MYSQL_USER=nextcloud\n      - MYSQL_HOST=nextcloud_db\n\n  onlyoffice:\n    image: onlyoffice/documentserver\n    container_name: onlyoffice\n    restart: always\n    ports:\n      - 9031:80\n    volumes:\n      - /volume1/docker/nextcloud/onlyoffice/data:/var/www/onlyoffice/Data\n      - /volume1/docker/nextcloud/onlyoffice/logs:/var/log/onlyoffice\n

    外部存储

    有时你的文档在其他位置,可以在应用中添加插件 External storage support,这样可以直接编辑 FTP、WebDAV、Nextcloud、SFTP、Amazone S3 或其他对象存储等外部文件。

    安装插件后,进入「管理」>「外部存储」设置目录。

    ',7),k={},m=(0,s(9720).c)(k,[["render",function(n,a){const s=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.QD)("a",t,[(0,e.mY)("Nextcloud"),(0,e.K2)(s)]),(0,e.mY)(" 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。")]),o,(0,e.QD)("p",null,[(0,e.QD)("a",l,[(0,e.mY)("ONLYOFFICE"),(0,e.K2)(s)]),(0,e.mY)(" Document Server 是一套提供在线编辑 Office 文档服务的套件。通过使用该套件及相应的 Nextcloud 插件,你可以在 Nextcloud 上进行在线编辑 Office 文档的操作,并正确识别中文内容。")]),c,p,i,(0,e.QD)("p",null,[(0,e.mY)("Nextcloud Office 无法正常显示文档中的中文,而只显示方格子。关于此问题的解决方案可在"),(0,e.QD)("a",u,[(0,e.mY)("这篇教程"),(0,e.K2)(s)]),(0,e.mY)("中找到。教程建议修改 "),r,(0,e.mY)(" 文件,注释掉第 67 行,并添加以下内容。然而,我测试后发现此方法并不起作用。")]),d])}]]),v=JSON.parse('{"path":"/services/dockers-on-nas/nextcloud.html","title":"Nextcloud:私有云盘","lang":"zh-CN","frontmatter":{"article":false,"title":"Nextcloud:私有云盘","order":22,"description":"Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。 虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoff...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/nextcloud.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Nextcloud:私有云盘"}],["meta",{"property":"og:description","content":"Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。 虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoff..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-11-11-13-51-31.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Nextcloud:私有云盘"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Nextcloud:私有云盘\\",\\"description\\":\\"Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。 虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoff...\\"}"]]},"headers":[{"level":2,"title":"公网访问 Nextcloud","slug":"公网访问-nextcloud","link":"#公网访问-nextcloud","children":[]},{"level":2,"title":"ONLYOFFICE","slug":"onlyoffice","link":"#onlyoffice","children":[]},{"level":2,"title":"Nextcloud Office 中文乱码","slug":"nextcloud-office-中文乱码","link":"#nextcloud-office-中文乱码","children":[]},{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]},{"level":2,"title":"外部存储","slug":"外部存储","link":"#外部存储","children":[]}],"git":{"createdTime":1701779050000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.52,"words":756},"filePathRelative":"services/dockers-on-nas/nextcloud.md","localizedDate":"2023年12月5日","excerpt":"

    Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。

    \\n

    虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoffice 是一个基于 Web 的办公套件,可以帮助你创建和编辑文字、电子表格和幻灯片等文档,实现文档的在线协作、版本控制和在线编辑等功能。这种集成方式将大大提高你的工作效率和协作能力。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3984],{3671:(n,a)=>{a.A=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},331:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>v,data:()=>m});var e=s(7847);const t={href:"https://github.com/nextcloud/docker",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Fv)('

    虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoffice 是一个基于 Web 的办公套件,可以帮助你创建和编辑文字、电子表格和幻灯片等文档,实现文档的在线协作、版本控制和在线编辑等功能。这种集成方式将大大提高你的工作效率和协作能力。

    公网访问 Nextcloud

    若在公网中使用 Nextcloud,需在 docker/nextcloud/data/config/config.php 文件中的 trusted_domains 部分添加你的公网域名,例如 1 => 'xxx.newzone.top'

    即使你的反向代理域名带有端口,也请勿在 trusted_domains 中包含端口信息,否则可能会出现「通过不被信任的域名访问」的提示。在使用带有端口的公网域名时,站点在未登录和成功登录时可能会在跳转时省略端口信息。这时,手动添加端口信息即可正常使用。

    ONLYOFFICE

    ',5),l={href:"https://helpcenter.onlyoffice.com/installation/docs-community-install-docker.aspx",target:"_blank",rel:"noopener noreferrer"},p=(0,e.Lk)("p",null,"完成部署后,ONLYOFFICE 会生成一段代码,将其输入到服务器即可获取秘钥。将秘钥填写到「管理设置」>「ONLYOFFICE」中。请注意,重新启动 NAS 和 Docker 容器可能会导致秘钥更换。",-1),c=(0,e.Lk)("figure",null,[(0,e.Lk)("img",{src:"https://img.newzone.top/2023-11-11-13-51-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,e.Lk)("figcaption")],-1),i=(0,e.Lk)("h2",{id:"nextcloud-office-中文乱码",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#nextcloud-office-中文乱码"},[(0,e.Lk)("span",null,"Nextcloud Office 中文乱码")])],-1),u={href:"https://blog.csdn.net/skydust1979/article/details/106280811",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"/volume1/docker/nextcloud/data/lib/public/AppFramework/Http/FileDisplayResponse.php",-1),d=(0,e.Fv)('
    //$output->setOutput($this->file->getContent());\n$fileContents=$this->file->getContent();\n$encoding = mb_detect_encoding($fileContents . "a", "UTF-8,GB2312, GBK, WINDOWS-1252, ISO-8859-15, ISO-8859-1, ASCII", true);\nif ($encoding === "") {\n    $encoding = "ISO-8859-15";\n}\n$fileContents = iconv($encoding, "UTF-8", $fileContents);\n$output->setOutput($fileContents);\n

    部署命令

    以下是集成了 ONLYOFFICE 的 Nextcloud 部署命令:

    version: "2"\n\nservices:\n  nextcloud_db:\n    image: mariadb:10.6\n    container_name: nextcloud_db\n    restart: always\n    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW\n    volumes:\n      - /volume1/docker/nextcloud/mysql:/var/lib/mysql\n    environment:\n      - MYSQL_ROOT_PASSWORD=nextcloud\n      - MYSQL_PASSWORD=nextcloud\n      - MYSQL_DATABASE=nextcloud\n      - MYSQL_USER=nextcloud\n\n  nextcloud_app:\n    image: nextcloud\n    container_name: nextcloud\n    restart: always\n    ports:\n      - 9030:80\n    links:\n      - nextcloud_db\n    volumes:\n      - /volume1/docker/nextcloud/data:/var/www/html\n      - /volume1/sync:/sync #外部存储目录\n    environment:\n      - MYSQL_PASSWORD=nextcloud\n      - MYSQL_DATABASE=nextcloud\n      - MYSQL_USER=nextcloud\n      - MYSQL_HOST=nextcloud_db\n\n  onlyoffice:\n    image: onlyoffice/documentserver\n    container_name: onlyoffice\n    restart: always\n    ports:\n      - 9031:80\n    volumes:\n      - /volume1/docker/nextcloud/onlyoffice/data:/var/www/onlyoffice/Data\n      - /volume1/docker/nextcloud/onlyoffice/logs:/var/log/onlyoffice\n

    外部存储

    有时你的文档在其他位置,可以在应用中添加插件 External storage support,这样可以直接编辑 FTP、WebDAV、Nextcloud、SFTP、Amazone S3 或其他对象存储等外部文件。

    安装插件后,进入「管理」>「外部存储」设置目录。

    ',7),k={},v=(0,s(3671).A)(k,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",t,[(0,e.eW)("Nextcloud"),(0,e.bF)(s)]),(0,e.eW)(" 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。")]),o,(0,e.Lk)("p",null,[(0,e.Lk)("a",l,[(0,e.eW)("ONLYOFFICE"),(0,e.bF)(s)]),(0,e.eW)(" Document Server 是一套提供在线编辑 Office 文档服务的套件。通过使用该套件及相应的 Nextcloud 插件,你可以在 Nextcloud 上进行在线编辑 Office 文档的操作,并正确识别中文内容。")]),p,c,i,(0,e.Lk)("p",null,[(0,e.eW)("Nextcloud Office 无法正常显示文档中的中文,而只显示方格子。关于此问题的解决方案可在"),(0,e.Lk)("a",u,[(0,e.eW)("这篇教程"),(0,e.bF)(s)]),(0,e.eW)("中找到。教程建议修改 "),r,(0,e.eW)(" 文件,注释掉第 67 行,并添加以下内容。然而,我测试后发现此方法并不起作用。")]),d])}]]),m=JSON.parse('{"path":"/services/dockers-on-nas/nextcloud.html","title":"Nextcloud:私有云盘","lang":"zh-CN","frontmatter":{"article":false,"title":"Nextcloud:私有云盘","order":22,"description":"Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。 虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoff...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/nextcloud.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Nextcloud:私有云盘"}],["meta",{"property":"og:description","content":"Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。 虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoff..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-11-11-13-51-31.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Nextcloud:私有云盘"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Nextcloud:私有云盘\\",\\"description\\":\\"Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。 虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoff...\\"}"]]},"headers":[{"level":2,"title":"公网访问 Nextcloud","slug":"公网访问-nextcloud","link":"#公网访问-nextcloud","children":[]},{"level":2,"title":"ONLYOFFICE","slug":"onlyoffice","link":"#onlyoffice","children":[]},{"level":2,"title":"Nextcloud Office 中文乱码","slug":"nextcloud-office-中文乱码","link":"#nextcloud-office-中文乱码","children":[]},{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]},{"level":2,"title":"外部存储","slug":"外部存储","link":"#外部存储","children":[]}],"git":{"createdTime":1701779050000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.52,"words":756},"filePathRelative":"services/dockers-on-nas/nextcloud.md","localizedDate":"2023年12月5日","excerpt":"

    Nextcloud 是一款开源的云存储和协作平台。Nextcloud 不仅可以让你创建文件共享、在线编辑和备份等功能,还支持多用户协作、通讯录、日历等功能,可以完全替代你的 Google Drive 或 Dropbox 等云存储服务。

    \\n

    虽然 Nextcloud 内置了 Office 功能,但对中文支持有限,建议使用 Onlyoffice。Onlyoffice 是一个基于 Web 的办公套件,可以帮助你创建和编辑文字、电子表格和幻灯片等文档,实现文档的在线协作、版本控制和在线编辑等功能。这种集成方式将大大提高你的工作效率和协作能力。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/obsidian.html.0c68f245.js b/assets/js/obsidian.html.0c68f245.js new file mode 100644 index 000000000..547a520a6 --- /dev/null +++ b/assets/js/obsidian.html.0c68f245.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9125],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},3272:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>g,data:()=>h});var t=a(7847);const s=(0,t.Lk)("h2",{id:"双链笔记",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#双链笔记"},[(0,t.Lk)("span",null,"双链笔记")])],-1),i=(0,t.Lk)("p",null,"@KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,最近同时跟 4 个项目,深有体会;Obsidian 的 MD 语法支持很美观的待办清单,很舒服。 二、书籍之间的联系 很多书中,作者会推荐其他的书,那么就可以在记录读书笔记的时候,直接创建对这些推荐书的引用(得益于 obsidian 的基于引用自动创建文件,而不是只能引用现有文档),又或者一个作者有很多著作、有博客、有公众号,那么就可以给这个作者建一个单独的文档作为主页,其他著作的笔记、博客的摘录都是单独的文档,形成完整体系。 三、跨软件,非 URL 的场景 我的大量 PDF 文档管理在 DEVONThink,obsidian 的链接语法支持直接引用到 DEVONThink 中的文档,需要是可直接通过 OB 激活 DT 快速打开目标文档",-1),o={href:"https://sspai.com/post/67619",target:"_blank",rel:"noopener noreferrer"},l={href:"https://sspai.com/post/72385",target:"_blank",rel:"noopener noreferrer"},r=(0,t.Fv)('

    暂时放弃 Obisidian,虽然能按条件罗列页面,但没有 Logseq 方便。如果后续要继续用,则尝试将日记分为 3 份,然后用 Dataview 整合在一起,在上面进行修改

    Obsidian 更习惯记录,日常 Task 由滴答管理,中期且不急的任务则由 Trello 管理。自带的看板功能需要建立笔记,不如 Trello 方便。

    Day Planer 有 sm18 的 Plan 功能。

    插件

    部分插件不能自动更新,需要手动下载插件文件,然后粘贴到 .obsidian/plugins 对应文件夹内。

    Dataview

    ',6),p={href:"https://blacksmithgu.github.io/obsidian-dataview/query/queries/",target:"_blank",rel:"noopener noreferrer"},u=(0,t.Fv)('
    # journals 文本下所有\ndv.list(dv.pages('"journals"').file.lists.text)\n\n\n# 指定区域不为空\n.where(t => t!="")\n\n# 包含指定文字\n.where(t => t.includes("Logseq"))\n

    Obsidian Query Language

    ',2),d={href:"https://github.com/jplattel/obsidian-query-language",target:"_blank",rel:"noopener noreferrer"},c=(0,t.Fv)('

    但整合出的是链接,并非如 Logseq 一样显示文件内容。想想有没办法,显示文件内容。

    下列代码会抓取,journals 文件夹中包含「今日工作」或「xxxxxxx」的文件。

    name: 'OR combination list of results'\nquery: { $and: [{ "path": "'journals/"}, { $or: [{ "content": "'今日工作" }, { "content": "'xxxxxxx" }] }]}\ntemplate: "list"\nbadge: true\ndebug: true\nsort: "title"\n

    Easy Typing

    Easy Typing 是一个 Obsidian 的书写体验增强插件,自动格式化书写,比如自动在中英文之间添加空格,英文首字母大写,标点与文本间智能空格。

    不过双拼容易出错,需要开启「行模式」。

    ',6),b={},g=(0,a(3671).A)(b,[["render",function(e,n){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[s,i,(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",o,[(0,t.eW)("Obsidian 新手系列之你不可不知的插件"),(0,t.bF)(a)])])]),(0,t.Lk)("li",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",l,[(0,t.eW)("每日笔记、日程管理、工作复盘——这是我钻研出的 Obsidian 八般武艺"),(0,t.bF)(a)])])])]),r,(0,t.Lk)("p",null,[(0,t.Lk)("a",p,[(0,t.eW)("Dataview"),(0,t.bF)(a)]),(0,t.eW)(" 功能更强大,不过用法也复杂许多。")]),u,(0,t.Lk)("p",null,[(0,t.Lk)("a",d,[(0,t.eW)("Obsidian Query Language"),(0,t.bF)(a)]),(0,t.eW)(" 能使用 Query 语言,将符合条件的文件整合到一页。")]),c])}]]),h=JSON.parse('{"path":"/apps/tutorials/obsidian.html","title":"Obsidian","lang":"zh-CN","frontmatter":{"article":false,"title":"Obsidian","order":2,"description":"双链笔记 @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/obsidian.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Obsidian"}],["meta",{"property":"og:description","content":"双链笔记 @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Obsidian\\",\\"description\\":\\"双链笔记 @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,...\\"}"]]},"headers":[{"level":2,"title":"双链笔记","slug":"双链笔记","link":"#双链笔记","children":[]},{"level":2,"title":"插件","slug":"插件","link":"#插件","children":[{"level":3,"title":"Dataview","slug":"dataview","link":"#dataview","children":[]},{"level":3,"title":"Obsidian Query Language","slug":"obsidian-query-language","link":"#obsidian-query-language","children":[]},{"level":3,"title":"Easy Typing","slug":"easy-typing","link":"#easy-typing","children":[]}]}],"git":{"createdTime":1701223097000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.66,"words":798},"filePathRelative":"apps/tutorials/obsidian.md","localizedDate":"2023年11月29日","excerpt":"

    双链笔记

    \\n

    @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景:\\n一、待办清单和随笔记\\n待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,最近同时跟 4 个项目,深有体会;Obsidian 的 MD 语法支持很美观的待办清单,很舒服。\\n二、书籍之间的联系\\n很多书中,作者会推荐其他的书,那么就可以在记录读书笔记的时候,直接创建对这些推荐书的引用(得益于 obsidian 的基于引用自动创建文件,而不是只能引用现有文档),又或者一个作者有很多著作、有博客、有公众号,那么就可以给这个作者建一个单独的文档作为主页,其他著作的笔记、博客的摘录都是单独的文档,形成完整体系。\\n三、跨软件,非 URL 的场景\\n我的大量 PDF 文档管理在 DEVONThink,obsidian 的链接语法支持直接引用到 DEVONThink 中的文档,需要是可直接通过 OB 激活 DT 快速打开目标文档

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/paperless-ngx.html.3f824b18.js b/assets/js/paperless-ngx.html.3f824b18.js new file mode 100644 index 000000000..be06c9439 --- /dev/null +++ b/assets/js/paperless-ngx.html.3f824b18.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[349],{3671:(n,s)=>{s.A=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},8746:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>l,data:()=>c});var e=a(7847);const p={href:"https://docs.paperless-ngx.com/",target:"_blank",rel:"noopener noreferrer"},t=(0,e.Fv)('

    Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。

    部署命令

    # https://github.com/paperless-ngx/paperless-ngx/blob/main/docker/compose/docker-compose.portainer.yml\nversion: "3.4"\nservices:\n  paperlessbroker:\n    image: docker.io/library/redis:7\n    container_name: paperlessbroker\n    restart: unless-stopped\n    volumes:\n      - /volume1/docker/paperless-ngx/redisdata:/data\n\n  paperlessdb:\n    image: docker.io/library/postgres:15\n    container_name: paperlessdb\n    restart: unless-stopped\n    volumes:\n      - /volume1/docker/paperless-ngx/pgdata:/var/lib/postgresql/data\n    environment:\n      POSTGRES_DB: paperless\n      POSTGRES_USER: paperless\n      POSTGRES_PASSWORD: paperless\n\n  paperlesswebserver:\n    image: ghcr.io/paperless-ngx/paperless-ngx:latest\n    container_name: paperlesswebserver\n    restart: unless-stopped\n    depends_on:\n      - paperlessdb\n      - paperlessbroker\n    ports:\n      - "9035:8000"\n    healthcheck:\n      test:\n        ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]\n      interval: 30s\n      timeout: 10s\n      retries: 5\n    volumes:\n      - /volume1/docker/paperless-ngx/data:/usr/src/paperless/data\n      - /volume1/docker/paperless-ngx/media:/usr/src/paperless/media\n      - /volume1/docker/paperless-ngx/export:/usr/src/paperless/export\n      - /volume1/docker/paperless-ngx/consume:/usr/src/paperless/consume\n    environment:\n      PAPERLESS_REDIS: redis://paperlessbroker:6379\n      PAPERLESS_DBHOST: paperlessdb\n      USERMAP_UID: 1026\n      USERMAP_GID: 100\n      # paperless 支持的语言(已内置英语、德语、意大利语、法语)\n      # See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster\n      # for available languages.\n      PAPERLESS_OCR_LANGUAGES: chi-sim chi-tra\n      # OCR 语言\n      PAPERLESS_OCR_LANGUAGE: eng+chi_sim\n      PAPERLESS_SECRET_KEY: change-me\n      PAPERLESS_TIME_ZONE: Asia/Shanghai\n

    部署完成后,需用 ssh 终端执行命令。

    sudo docker exec -it paperlesswebserver bash\npython3 manage.py createsuperuser\n

    依次输入 username、email、password。如果出现提示密码较弱,输入 y 继续。之后这些都可以在后台再修改。

    ',6),o={},l=(0,a(3671).A)(o,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("p",null,[(0,e.Lk)("a",p,[(0,e.eW)("Paperless-ngx"),(0,e.bF)(a)]),(0,e.eW)(" 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。")]),t])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/paperless-ngx.html","title":"Paperless-ngx:全文管理文档","lang":"zh-CN","frontmatter":{"article":false,"title":"Paperless-ngx:全文管理文档","order":32,"description":"Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。 Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。 部署命令...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/paperless-ngx.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Paperless-ngx:全文管理文档"}],["meta",{"property":"og:description","content":"Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。 Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。 部署命令..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Paperless-ngx:全文管理文档\\",\\"description\\":\\"Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。 Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。 部署命令...\\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.07,"words":321},"filePathRelative":"services/dockers-on-nas/paperless-ngx.md","localizedDate":"2023年12月19日","excerpt":"

    Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。

    \\n

    Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。

    \\n

    部署命令

    \\n
    # https://github.com/paperless-ngx/paperless-ngx/blob/main/docker/compose/docker-compose.portainer.yml\\nversion: \\"3.4\\"\\nservices:\\n  paperlessbroker:\\n    image: docker.io/library/redis:7\\n    container_name: paperlessbroker\\n    restart: unless-stopped\\n    volumes:\\n      - /volume1/docker/paperless-ngx/redisdata:/data\\n\\n  paperlessdb:\\n    image: docker.io/library/postgres:15\\n    container_name: paperlessdb\\n    restart: unless-stopped\\n    volumes:\\n      - /volume1/docker/paperless-ngx/pgdata:/var/lib/postgresql/data\\n    environment:\\n      POSTGRES_DB: paperless\\n      POSTGRES_USER: paperless\\n      POSTGRES_PASSWORD: paperless\\n\\n  paperlesswebserver:\\n    image: ghcr.io/paperless-ngx/paperless-ngx:latest\\n    container_name: paperlesswebserver\\n    restart: unless-stopped\\n    depends_on:\\n      - paperlessdb\\n      - paperlessbroker\\n    ports:\\n      - \\"9035:8000\\"\\n    healthcheck:\\n      test:\\n        [\\"CMD\\", \\"curl\\", \\"-fs\\", \\"-S\\", \\"--max-time\\", \\"2\\", \\"http://localhost:8000\\"]\\n      interval: 30s\\n      timeout: 10s\\n      retries: 5\\n    volumes:\\n      - /volume1/docker/paperless-ngx/data:/usr/src/paperless/data\\n      - /volume1/docker/paperless-ngx/media:/usr/src/paperless/media\\n      - /volume1/docker/paperless-ngx/export:/usr/src/paperless/export\\n      - /volume1/docker/paperless-ngx/consume:/usr/src/paperless/consume\\n    environment:\\n      PAPERLESS_REDIS: redis://paperlessbroker:6379\\n      PAPERLESS_DBHOST: paperlessdb\\n      USERMAP_UID: 1026\\n      USERMAP_GID: 100\\n      # paperless 支持的语言(已内置英语、德语、意大利语、法语)\\n      # See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster\\n      # for available languages.\\n      PAPERLESS_OCR_LANGUAGES: chi-sim chi-tra\\n      # OCR 语言\\n      PAPERLESS_OCR_LANGUAGE: eng+chi_sim\\n      PAPERLESS_SECRET_KEY: change-me\\n      PAPERLESS_TIME_ZONE: Asia/Shanghai\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/photo-swipe.2a81417f.js b/assets/js/photo-swipe.2a81417f.js new file mode 100644 index 000000000..a93cf0f47 --- /dev/null +++ b/assets/js/photo-swipe.2a81417f.js @@ -0,0 +1,2 @@ +/*! For license information please see photo-swipe.2a81417f.js.LICENSE.txt */ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9600],{800:(t,i,e)=>{function s(t,i,e){const s=document.createElement(i);return t&&(s.className=t),e&&e.appendChild(s),s}function n(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function o(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function a(t,i){const e=Math.abs(t.x-i.x),s=Math.abs(t.y-i.y);return Math.sqrt(e*e+s*s)}function h(t,i){return t.x===i.x&&t.y===i.y}function r(t,i,e){return Math.min(Math.max(t,i),e)}function l(t,i,e){let s=`translate3d(${t}px,${i||0}px,0)`;return void 0!==e&&(s+=` scale3d(${e},${e},1)`),s}function p(t,i,e,s){t.style.transform=l(i,e,s)}e.r(i),e.d(i,{default:()=>ht});function d(t,i,e,s){t.style.transition=i?`${i} ${e}ms ${s||"cubic-bezier(.4,0,.22,1)"}`:"none"}function c(t,i,e){t.style.width="number"==typeof i?`${i}px`:i,t.style.height="number"==typeof e?`${e}px`:e}const m="loading",u="loaded",v="error";function _(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let g=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>{g=!0}}))}catch(t){}class y{constructor(){this._pool=[]}add(t,i,e,s){this._toggleListener(t,i,e,s)}remove(t,i,e,s){this._toggleListener(t,i,e,s,!0)}removeAll(){this._pool.forEach((t=>{this._toggleListener(t.target,t.type,t.listener,t.passive,!0,!0)})),this._pool=[]}_toggleListener(t,i,e,s,n,o){if(!t)return;const a=n?"removeEventListener":"addEventListener";i.split(" ").forEach((i=>{if(i){o||(n?this._pool=this._pool.filter((s=>s.type!==i||s.listener!==e||s.target!==t)):this._pool.push({target:t,type:i,listener:e,passive:s}));const h=!!g&&{passive:s||!1};t[a](i,e,h)}}))}}function w(t,i){if(t.getViewportSizeFn){const e=t.getViewportSizeFn(t,i);if(e)return e}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function f(t,i,e,s,n){let o=0;if(i.paddingFn)o=i.paddingFn(e,s,n)[t];else if(i.padding)o=i.padding[t];else{const e="padding"+t[0].toUpperCase()+t.slice(1);i[e]&&(o=i[e])}return Number(o)||0}function x(t,i,e,s){return{x:i.x-f("left",t,i,e,s)-f("right",t,i,e,s),y:i.y-f("top",t,i,e,s)-f("bottom",t,i,e,s)}}class P{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this._updateAxis("x"),this._updateAxis("y"),this.slide.pswp.dispatch("calcBounds",{slide:this.slide})):this.reset()}_updateAxis(t){const{pswp:i}=this.slide,e=this.slide["x"===t?"width":"height"]*this.currZoomLevel,s=f("x"===t?"left":"top",i.options,i.viewportSize,this.slide.data,this.slide.index),n=this.slide.panAreaSize[t];this.center[t]=Math.round((n-e)/2)+s,this.max[t]=e>n?Math.round(n-e)+s:this.center[t],this.min[t]=e>n?s:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return r(i,this.max[t],this.min[t])}}class S{constructor(t,i,e,s){this.pswp=s,this.options=t,this.itemData=i,this.index=e,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,e){const s={x:t,y:i};this.elementSize=s,this.panAreaSize=e;const n=e.x/s.x,o=e.y/s.y;this.fit=Math.min(1,no?n:o),this.vFill=Math.min(1,o),this.initial=this._getInitial(),this.secondary=this._getSecondary(),this.max=Math.max(this.initial,this.secondary,this._getMax()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch("zoomLevelsUpdate",{zoomLevels:this,slideData:this.itemData})}_parseZoomLevelOption(t){const i=t+"ZoomLevel",e=this.options[i];if(e)return"function"==typeof e?e(this):"fill"===e?this.fill:"fit"===e?this.fit:Number(e)}_getSecondary(){let t=this._parseZoomLevelOption("secondary");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}_getInitial(){return this._parseZoomLevelOption("initial")||this.fit}_getMax(){return this._parseZoomLevelOption("max")||Math.max(1,4*this.fit)}}class b{constructor(t,i,e){this.data=t,this.index=i,this.pswp=e,this.isActive=i===e.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!e.opener.isOpen,this.zoomLevels=new S(e.options,t,i,e),this.pswp.dispatch("gettingData",{slide:this,data:this.data,index:i}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=s("pswp__zoom-wrap","div"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new P(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch("slideInit",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin="0 0",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch("firstZoomPan",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch("afterSetContent",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch("slideLoad",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch("appendHeavy",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch("appendHeavyContent",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch("slideActivate",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch("slideDeactivate",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch("slideDestroy",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const e=Math.round(this.width*i)||this.pswp.viewportSize.x,s=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(e,s)||t)&&this.content.setDisplayedSize(e,s)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){var t;return null===(t=this.content.placeholder)||void 0===t?void 0:t.element}zoomTo(t,i,e,s){const{pswp:n}=this;if(!this.isZoomable()||n.mainScroll.isShifted())return;n.dispatch("beforeZoomTo",{destZoomLevel:t,centerPoint:i,transitionDuration:e}),n.animations.stopAllPan();const a=this.currZoomLevel;s||(t=r(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset("x",i,a),this.pan.y=this.calculateZoomToPanOffset("y",i,a),o(this.pan);const h=()=>{this._setResolution(t),this.applyCurrentZoomPan()};e?n.animations.startTransition({isPan:!0,name:"zoomTo",target:this.container,transform:this.getCurrentTransform(),onComplete:h,duration:e,easing:n.options.easing}):h()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,e){if(0==this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),e||(e=this.zoomLevels.initial);const s=this.currZoomLevel/e;return this.bounds.correctPan(t,(this.pan[t]-i[t])*s+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan("x",t),this.pan.y=this.bounds.correctPan("y",i),this.applyCurrentZoomPan()}isPannable(){return Boolean(this.width)&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return Boolean(this.width)&&this.content.isZoomable()}applyCurrentZoomPan(){this._applyZoomTransform(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch("zoomPanUpdate",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),n(this.pan,this.bounds.center),this.pswp.dispatch("initialZoomPan",{slide:this})}_applyZoomTransform(t,i,e){e/=this.currentResolution||this.zoomLevels.initial,p(this.container,t,i,e)}calculateSize(){const{pswp:t}=this;n(this.panAreaSize,x(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch("calcSlideSize",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return l(this.pan.x,this.pan.y,t)}_setResolution(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch("resolutionChanged"))}}class z{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&n(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:e}=this.gestures,{currSlide:s}=this.pswp;if("y"===e&&this.pswp.options.closeOnVerticalDrag&&s&&s.currZoomLevel<=s.zoomLevels.fit&&!this.gestures.isMultitouch){const e=s.pan.y+(t.y-i.y);if(!this.pswp.dispatch("verticalDrag",{panY:e}).defaultPrevented){this._setPanWithFriction("y",e,.6);const t=1-Math.abs(this._getVerticalDragRatio(s.pan.y));this.pswp.applyBgOpacity(t),s.applyCurrentZoomPan()}}else this._panOrMoveMainScroll("x")||(this._panOrMoveMainScroll("y"),s&&(o(s.pan),s.applyCurrentZoomPan()))}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:e}=this.pswp;let s=0;if(this.pswp.animations.stopAll(),i.isShifted()){const e=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-.5&&e<0||t.x<.1&&e<-.5?(s=1,t.x=Math.min(t.x,0)):(t.x>.5&&e>0||t.x>-.1&&e>.5)&&(s=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(s,!0,t.x)}e&&e.currZoomLevel>e.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this._finishPanGestureForAxis("x"),this._finishPanGestureForAxis("y"))}_finishPanGestureForAxis(t){const{velocity:i}=this.gestures,{currSlide:e}=this.pswp;if(!e)return;const{pan:s,bounds:n}=e,o=s[t],a=this.pswp.bgOpacity<1&&"y"===t,h=o+.995*i[t]/(1-.995);if(a){const t=this._getVerticalDragRatio(o),i=this._getVerticalDragRatio(h);if(t<0&&i<-.4||t>0&&i>.4)return void this.pswp.close()}const l=n.correctPan(t,h);if(o===l)return;const p=l===h?1:.82,d=this.pswp.bgOpacity,c=l-o;this.pswp.animations.startSpring({name:"panGesture"+t,isPan:!0,start:o,end:l,velocity:i[t],dampingRatio:p,onUpdate:i=>{if(a&&this.pswp.bgOpacity<1){const t=1-(l-i)/c;this.pswp.applyBgOpacity(r(d+(1-d)*t,0,1))}s[t]=Math.floor(i),e.applyCurrentZoomPan()}})}_panOrMoveMainScroll(t){const{p1:i,dragAxis:e,prevP1:s,isMultitouch:n}=this.gestures,{currSlide:o,mainScroll:a}=this.pswp,h=i[t]-s[t],r=a.x+h;if(!h||!o)return!1;if("x"===t&&!o.isPannable()&&!n)return a.moveTo(r,!0),!0;const{bounds:l}=o,p=o.pan[t]+h;if(this.pswp.options.allowPanToNext&&"x"===e&&"x"===t&&!n){const i=a.getCurrSlideX(),e=a.x-i,s=h>0,n=!s;if(p>l.min[t]&&s){if(l.min[t]<=this.startPan[t])return a.moveTo(r,!0),!0;this._setPanWithFriction(t,p)}else if(p0)return a.moveTo(Math.max(r,i),!0),!0;if(e<0)return a.moveTo(Math.min(r,i),!0),!0}else this._setPanWithFriction(t,p)}else"y"===t&&(a.isShifted()||l.min.y===l.max.y)||this._setPanWithFriction(t,p);return!1}_getVerticalDragRatio(t){var i,e;return(t-(null!==(i=null===(e=this.pswp.currSlide)||void 0===e?void 0:e.bounds.center.y)&&void 0!==i?i:0))/(this.pswp.viewportSize.y/3)}_setPanWithFriction(t,i,e){const{currSlide:s}=this.pswp;if(!s)return;const{pan:n,bounds:o}=s;if(o.correctPan(t,i)!==i||e){const s=Math.round(i-n[t]);n[t]+=s*(e||.35)}else n[t]=i}}function C(t,i,e){return t.x=(i.x+e.x)/2,t.y=(i.y+e.y)/2,t}class I{constructor(t){this.gestures=t,this._startPan={x:0,y:0},this._startZoomPoint={x:0,y:0},this._zoomPoint={x:0,y:0},this._wasOverFitZoomLevel=!1,this._startZoomLevel=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this._startZoomLevel=t.currZoomLevel,n(this._startPan,t.pan)),this.gestures.pswp.animations.stopAllPan(),this._wasOverFitZoomLevel=!1}change(){const{p1:t,startP1:i,p2:e,startP2:s,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const h=o.zoomLevels.min,r=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;C(this._startZoomPoint,i,s),C(this._zoomPoint,t,e);let l=1/a(i,s)*a(t,e)*this._startZoomLevel;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this._wasOverFitZoomLevel=!0),lr&&(l=r+.05*(l-r));o.pan.x=this._calculatePanForZoomLevel("x",l),o.pan.y=this._calculatePanForZoomLevel("y",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevele.zoomLevels.max?o=e.zoomLevels.max:(a=!1,o=s);const l=i.bgOpacity,p=i.bgOpacity<1,d=n({x:0,y:0},e.pan);let c=n({x:0,y:0},d);t&&(this._zoomPoint.x=0,this._zoomPoint.y=0,this._startZoomPoint.x=0,this._startZoomPoint.y=0,this._startZoomLevel=s,n(this._startPan,d)),a&&(c={x:this._calculatePanForZoomLevel("x",o),y:this._calculatePanForZoomLevel("y",o)}),e.setZoomLevel(o),c={x:e.bounds.correctPan("x",c.x),y:e.bounds.correctPan("y",c.y)},e.setZoomLevel(s);const m=!h(c,d);if(!m&&!a&&!p)return e._setResolution(o),void e.applyCurrentZoomPan();i.animations.stopAllPan(),i.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,m||a){if(m&&(e.pan.x=d.x+(c.x-d.x)*t,e.pan.y=d.y+(c.y-d.y)*t),a){const i=s+(o-s)*t;e.setZoomLevel(i)}e.applyCurrentZoomPan()}p&&i.bgOpacity<1&&i.applyBgOpacity(r(l+(1-l)*t,0,1))},onComplete:()=>{e._setResolution(o),e.applyCurrentZoomPan()}})}}function L(t){return!!t.target.closest(".pswp__container")}class A{constructor(t){this.gestures=t}click(t,i){const e=i.target.classList,s=e.contains("pswp__img"),n=e.contains("pswp__item")||e.contains("pswp__zoom-wrap");s?this._doClickOrTapAction("imageClick",t,i):n&&this._doClickOrTapAction("bgClick",t,i)}tap(t,i){L(i)&&this._doClickOrTapAction("tap",t,i)}doubleTap(t,i){L(i)&&this._doClickOrTapAction("doubleTap",t,i)}_doClickOrTapAction(t,i,e){var s;const{pswp:n}=this.gestures,{currSlide:o}=n,a=t+"Action",h=n.options[a];if(!n.dispatch(a,{point:i,originalEvent:e}).defaultPrevented)if("function"!=typeof h)switch(h){case"close":case"next":n[h]();break;case"zoom":null==o||o.toggleZoom(i);break;case"zoom-or-close":null!=o&&o.isZoomable()&&o.zoomLevels.secondary!==o.zoomLevels.initial?o.toggleZoom(i):n.options.clickToCloseNonZoomable&&n.close();break;case"toggle-controls":null===(s=this.gestures.pswp.element)||void 0===s||s.classList.toggle("pswp--ui-visible")}else h.call(n,i,e)}}class T{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this._lastStartP1={x:0,y:0},this._intervalP1={x:0,y:0},this._numActivePoints=0,this._ongoingPointers=[],this._touchEventEnabled="ontouchstart"in window,this._pointerEventEnabled=!!window.PointerEvent,this.supportsTouch=this._touchEventEnabled||this._pointerEventEnabled&&navigator.maxTouchPoints>1,this._numActivePoints=0,this._intervalTime=0,this._velocityCalculated=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this._tapTimer=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new z(this),this.zoomLevels=new I(this),this.tapHandler=new A(this),t.on("bindEvents",(()=>{t.events.add(t.scrollWrap,"click",this._onClick.bind(this)),this._pointerEventEnabled?this._bindEvents("pointer","down","up","cancel"):this._touchEventEnabled?(this._bindEvents("touch","start","end","cancel"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this._bindEvents("mouse","down","up")}))}_bindEvents(t,i,e,s){const{pswp:n}=this,{events:o}=n,a=s?t+s:"";o.add(n.scrollWrap,t+i,this.onPointerDown.bind(this)),o.add(window,t+"move",this.onPointerMove.bind(this)),o.add(window,t+e,this.onPointerUp.bind(this)),a&&o.add(n.scrollWrap,a,this.onPointerUp.bind(this))}onPointerDown(t){const i="mousedown"===t.type||"mouse"===t.pointerType;if(i&&t.button>0)return;const{pswp:e}=this;e.opener.isOpen?e.dispatch("pointerDown",{originalEvent:t}).defaultPrevented||(i&&(e.mouseDetected(),this._preventPointerEventBehaviour(t,"down")),e.animations.stopAll(),this._updatePoints(t,"down"),1===this._numActivePoints&&(this.dragAxis=null,n(this.startP1,this.p1)),this._numActivePoints>1?(this._clearTapTimer(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){this._preventPointerEventBehaviour(t,"move"),this._numActivePoints&&(this._updatePoints(t,"move"),this.pswp.dispatch("pointerMove",{originalEvent:t}).defaultPrevented||(1!==this._numActivePoints||this.isDragging?this._numActivePoints>1&&!this.isZooming&&(this._finishDrag(),this.isZooming=!0,this._updateStartPoints(),this.zoomLevels.start(),this._rafStopLoop(),this._rafRenderLoop()):(this.dragAxis||this._calculateDragDirection(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this._clearTapTimer(),this._updateStartPoints(),this._intervalTime=Date.now(),this._velocityCalculated=!1,n(this._intervalP1,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this._rafStopLoop(),this._rafRenderLoop()))))}_finishDrag(){this.isDragging&&(this.isDragging=!1,this._velocityCalculated||this._updateVelocity(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this._numActivePoints&&(this._updatePoints(t,"up"),this.pswp.dispatch("pointerUp",{originalEvent:t}).defaultPrevented||(0===this._numActivePoints&&(this._rafStopLoop(),this.isDragging?this._finishDrag():this.isZooming||this.isMultitouch||this._finishTap(t)),this._numActivePoints<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this._numActivePoints&&(this.dragAxis=null,this._updateStartPoints()))))}_rafRenderLoop(){(this.isDragging||this.isZooming)&&(this._updateVelocity(),this.isDragging?h(this.p1,this.prevP1)||this.drag.change():h(this.p1,this.prevP1)&&h(this.p2,this.prevP2)||this.zoomLevels.change(),this._updatePrevPoints(),this.raf=requestAnimationFrame(this._rafRenderLoop.bind(this)))}_updateVelocity(t){const i=Date.now(),e=i-this._intervalTime;e<50&&!t||(this.velocity.x=this._getVelocity("x",e),this.velocity.y=this._getVelocity("y",e),this._intervalTime=i,n(this._intervalP1,this.p1),this._velocityCalculated=!0)}_finishTap(t){const{mainScroll:i}=this.pswp;if(i.isShifted())return void i.moveIndexBy(0,!0);if(t.type.indexOf("cancel")>0)return;if("mouseup"===t.type||"mouse"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this._tapTimer?(this._clearTapTimer(),a(this._lastStartP1,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(n(this._lastStartP1,this.startP1),this._tapTimer=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this._clearTapTimer()}),e))}_clearTapTimer(){this._tapTimer&&(clearTimeout(this._tapTimer),this._tapTimer=null)}_getVelocity(t,i){const e=this.p1[t]-this._intervalP1[t];return Math.abs(e)>1&&i>5?e/i:0}_rafStopLoop(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}_preventPointerEventBehaviour(t,i){this.pswp.applyFilters("preventPointerEvent",!0,t,i)&&t.preventDefault()}_updatePoints(t,i){if(this._pointerEventEnabled){const e=t,s=this._ongoingPointers.findIndex((t=>t.id===e.pointerId));"up"===i&&s>-1?this._ongoingPointers.splice(s,1):"down"===i&&-1===s?this._ongoingPointers.push(this._convertEventPosToPoint(e,{x:0,y:0})):s>-1&&this._convertEventPosToPoint(e,this._ongoingPointers[s]),this._numActivePoints=this._ongoingPointers.length,this._numActivePoints>0&&n(this.p1,this._ongoingPointers[0]),this._numActivePoints>1&&n(this.p2,this._ongoingPointers[1])}else{const e=t;this._numActivePoints=0,e.type.indexOf("touch")>-1?e.touches&&e.touches.length>0&&(this._convertEventPosToPoint(e.touches[0],this.p1),this._numActivePoints++,e.touches.length>1&&(this._convertEventPosToPoint(e.touches[1],this.p2),this._numActivePoints++)):(this._convertEventPosToPoint(t,this.p1),"up"===i?this._numActivePoints=0:this._numActivePoints++)}}_updatePrevPoints(){n(this.prevP1,this.p1),n(this.prevP2,this.p2)}_updateStartPoints(){n(this.startP1,this.p1),n(this.startP2,this.p2),this._updatePrevPoints()}_calculateDragDirection(){if(this.pswp.mainScroll.isShifted())this.dragAxis="x";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?"x":"y";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}_convertEventPosToPoint(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,"pointerId"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}_onClick(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class Z{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this._currPositionIndex=0,this._prevPositionIndex=0,this._containerShiftIndex=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,e=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),s=e!==this.slideWidth;s&&(this.slideWidth=e,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,e)=>{s&&p(i.el,(e+this._containerShiftIndex)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this._currPositionIndex=0,this._prevPositionIndex=0,this.slideWidth=0,this._containerShiftIndex=-1}appendHolders(){this.itemHolders=[];for(let t=0;t<3;t++){const i=s("pswp__item","div",this.pswp.container);i.setAttribute("role","group"),i.setAttribute("aria-roledescription","slide"),i.setAttribute("aria-hidden","true"),i.style.display=1===t?"block":"none",this.itemHolders.push({el:i})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,e){const{pswp:s}=this;let n=s.potentialIndex+t;const o=s.getNumItems();if(s.canLoop()){n=s.getLoopedIndex(n);const i=(t+o)%o;t=i<=o/2?i:i-o}else n<0?n=0:n>=o&&(n=o-1),t=n-s.potentialIndex;s.potentialIndex=n,this._currPositionIndex-=t,s.animations.stopMainScroll();const a=this.getCurrSlideX();if(i){s.animations.startSpring({isMainScroll:!0,start:this.x,end:a,velocity:e||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),s.appendHeavy()}});let t=s.potentialIndex-s.currIndex;if(s.canLoop()){const i=(t+o)%o;t=i<=o/2?i:i-o}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(a),this.updateCurrItem();return Boolean(t)}getCurrSlideX(){return this.slideWidth*this._currPositionIndex}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,e=this._prevPositionIndex-this._currPositionIndex;if(!e)return;this._prevPositionIndex=this._currPositionIndex,i.currIndex=i.potentialIndex;let s,n=Math.abs(e);n>=3&&(this._containerShiftIndex+=e+(e>0?-3:3),n=3);for(let t=0;t0?(s=this.itemHolders.shift(),s&&(this.itemHolders[2]=s,this._containerShiftIndex++,p(s.el,(this._containerShiftIndex+2)*this.slideWidth),i.setContent(s,i.currIndex-n+t+2))):(s=this.itemHolders.pop(),s&&(this.itemHolders.unshift(s),this._containerShiftIndex--,p(s.el,this._containerShiftIndex*this.slideWidth),i.setContent(s,i.currIndex+n-t-2)));Math.abs(this._containerShiftIndex)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),i.currSlide=null===(t=this.itemHolders[1])||void 0===t?void 0:t.slide,i.contentLoader.updateLazy(e),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch("change")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let i=(this.slideWidth*this._currPositionIndex-t)/this.slideWidth;i+=this.pswp.currIndex;const e=Math.round(t-this.x);(i<0&&e>0||i>=this.pswp.getNumItems()-1&&e<0)&&(t=this.x+.35*e)}this.x=t,this.pswp.container&&p(this.pswp.container,t),this.pswp.dispatch("moveMainScroll",{x:t,dragging:null!=i&&i})}}const O={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},D=(t,i)=>i?t:O[t];class E{constructor(t){this.pswp=t,this._wasFocused=!1,t.on("bindEvents",(()=>{t.options.trapFocus&&(t.options.initialPointerPos||this._focusRoot(),t.events.add(document,"focusin",this._onFocusIn.bind(this))),t.events.add(document,"keydown",this._onKeyDown.bind(this))}));const i=document.activeElement;t.on("destroy",(()=>{t.options.returnFocus&&i&&this._wasFocused&&i.focus()}))}_focusRoot(){!this._wasFocused&&this.pswp.element&&(this.pswp.element.focus(),this._wasFocused=!0)}_onKeyDown(t){const{pswp:i}=this;if(i.dispatch("keydown",{originalEvent:t}).defaultPrevented)return;if(function(t){return"button"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t))return;let e,s,n=!1;const o="key"in t;switch(o?t.key:t.keyCode){case D("Escape",o):i.options.escKey&&(e="close");break;case D("z",o):e="toggleZoom";break;case D("ArrowLeft",o):s="x";break;case D("ArrowUp",o):s="y";break;case D("ArrowRight",o):s="x",n=!0;break;case D("ArrowDown",o):n=!0,s="y";break;case D("Tab",o):this._focusRoot()}if(s){t.preventDefault();const{currSlide:o}=i;i.options.arrowKeys&&"x"===s&&i.getNumItems()>1?e=n?"next":"prev":o&&o.currZoomLevel>o.zoomLevels.fit&&(o.pan[s]+=n?-80:80,o.panTo(o.pan.x,o.pan.y))}e&&(t.preventDefault(),i[e]())}_onFocusIn(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const M="cubic-bezier(.4,0,.22,1)";class F{constructor(t){var i;this.props=t;const{target:e,onComplete:s,transform:n,onFinish:o=(()=>{}),duration:a=333,easing:h=M}=t;this.onFinish=o;const r=n?"transform":"opacity",l=null!==(i=t[r])&&void 0!==i?i:"";this._target=e,this._onComplete=s,this._finished=!1,this._onTransitionEnd=this._onTransitionEnd.bind(this),this._helperTimeout=setTimeout((()=>{d(e,r,a,h),this._helperTimeout=setTimeout((()=>{e.addEventListener("transitionend",this._onTransitionEnd,!1),e.addEventListener("transitioncancel",this._onTransitionEnd,!1),this._helperTimeout=setTimeout((()=>{this._finalizeAnimation()}),a+500),e.style[r]=l}),30)}),0)}_onTransitionEnd(t){t.target===this._target&&this._finalizeAnimation()}_finalizeAnimation(){this._finished||(this._finished=!0,this.onFinish(),this._onComplete&&this._onComplete())}destroy(){this._helperTimeout&&clearTimeout(this._helperTimeout),d(this._target),this._target.removeEventListener("transitionend",this._onTransitionEnd,!1),this._target.removeEventListener("transitioncancel",this._onTransitionEnd,!1),this._finished||this._finalizeAnimation()}}class B{constructor(t,i,e){this.velocity=1e3*t,this._dampingRatio=i||.75,this._naturalFrequency=e||12,this._dampedFrequency=this._naturalFrequency,this._dampingRatio<1&&(this._dampedFrequency*=Math.sqrt(1-this._dampingRatio*this._dampingRatio))}easeFrame(t,i){let e,s=0;i/=1e3;const n=Math.E**(-this._dampingRatio*this._naturalFrequency*i);if(1===this._dampingRatio)e=this.velocity+this._naturalFrequency*t,s=(t+e*i)*n,this.velocity=s*-this._naturalFrequency+e*n;else if(this._dampingRatio<1){e=1/this._dampedFrequency*(this._dampingRatio*this._naturalFrequency*t+this.velocity);const o=Math.cos(this._dampedFrequency*i),a=Math.sin(this._dampedFrequency*i);s=n*(t*o+e*a),this.velocity=s*-this._naturalFrequency*this._dampingRatio+n*(-this._dampedFrequency*t*a+this._dampedFrequency*e*o)}return s}}class R{constructor(t){this.props=t,this._raf=0;const{start:i,end:e,velocity:s,onUpdate:n,onComplete:o,onFinish:a=(()=>{}),dampingRatio:h,naturalFrequency:r}=t;this.onFinish=a;const l=new B(s,h,r);let p=Date.now(),d=i-e;const c=()=>{this._raf&&(d=l.easeFrame(d,Date.now()-p),Math.abs(d)<1&&Math.abs(l.velocity)<50?(n(e),o&&o(),this.onFinish()):(p=Date.now(),n(d+e),this._raf=requestAnimationFrame(c)))};this._raf=requestAnimationFrame(c)}destroy(){this._raf>=0&&cancelAnimationFrame(this._raf),this._raf=0}}class k{constructor(){this.activeAnimations=[]}startSpring(t){this._start(t,!0)}startTransition(t){this._start(t)}_start(t,i){const e=i?new R(t):new F(t);return this.activeAnimations.push(e),e.onFinish=()=>this.stop(e),e}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class H{constructor(t){this.pswp=t,t.events.add(t.element,"wheel",this._onWheel.bind(this))}_onWheel(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:e,deltaY:s}=t;if(i&&!this.pswp.dispatch("wheel",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let e=-s;1===t.deltaMode?e*=.05:e*=t.deltaMode?1:.002,e=2**e;const n=i.currZoomLevel*e;i.zoomTo(n,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(e*=18,s*=18),i.panTo(i.pan.x-e,i.pan.y-s))}}class W{constructor(t,i){var e;const n=i.name||i.className;let o=i.html;if(!1===t.options[n])return;"string"==typeof t.options[n+"SVG"]&&(o=t.options[n+"SVG"]),t.dispatch("uiElementCreate",{data:i});let a="";i.isButton?(a+="pswp__button ",a+=i.className||`pswp__button--${i.name}`):a+=i.className||`pswp__${i.name}`;let h=i.isButton?i.tagName||"button":i.tagName||"div";h=h.toLowerCase();const r=s(a,h);if(i.isButton){"button"===h&&(r.type="button");let{title:e}=i;const{ariaLabel:s}=i;"string"==typeof t.options[n+"Title"]&&(e=t.options[n+"Title"]),e&&(r.title=e);const o=s||e;o&&r.setAttribute("aria-label",o)}r.innerHTML=function(t){if("string"==typeof t)return t;if(!t||!t.isCustomSVG)return"";const i=t;let e='",e}(o),i.onInit&&i.onInit(r,t),i.onClick&&(r.onclick=e=>{"string"==typeof i.onClick?t[i.onClick]():"function"==typeof i.onClick&&i.onClick(e,r,t)});const l=i.appendTo||"bar";let p=t.element;"bar"===l?(t.topBar||(t.topBar=s("pswp__top-bar pswp__hide-on-close","div",t.scrollWrap)),p=t.topBar):(r.classList.add("pswp__hide-on-close"),"wrapper"===l&&(p=t.scrollWrap)),null===(e=p)||void 0===e||e.appendChild(t.applyFilters("uiElement",r,i))}}function N(t,i,e){t.classList.add("pswp__button--arrow"),t.setAttribute("aria-controls","pswp__items"),i.on("change",(()=>{i.options.loop||(t.disabled=e?!(i.currIndex0))}))}const V={name:"arrowPrev",className:"pswp__button--arrow--prev",title:"Previous",order:10,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'',outlineID:"pswp__icn-arrow"},onClick:"prev",onInit:N},q={name:"arrowNext",className:"pswp__button--arrow--next",title:"Next",order:11,isButton:!0,appendTo:"wrapper",html:{isCustomSVG:!0,size:60,inner:'',outlineID:"pswp__icn-arrow"},onClick:"next",onInit:(t,i)=>{N(t,i,!0)}},U={name:"close",title:"Close",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-close"},onClick:"close"},G={name:"zoom",title:"Zoom",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-zoom"},onClick:"toggleZoom"},K={name:"preloader",appendTo:"bar",order:7,html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-loading"},onInit:(t,i)=>{let e,s=null;const n=i=>{var s;e!==i&&(e=i,"active",s=i,t.classList.toggle("pswp__preloader--active",s))},o=()=>{var t;if(null===(t=i.currSlide)||void 0===t||!t.content.isLoading())return n(!1),void(s&&(clearTimeout(s),s=null));s||(s=setTimeout((()=>{var t;n(Boolean(null===(t=i.currSlide)||void 0===t?void 0:t.content.isLoading())),s=null}),i.options.preloaderDelay))};i.on("change",o),i.on("loadComplete",(t=>{i.currSlide===t.slide&&o()})),i.ui&&(i.ui.updatePreloaderVisibility=o)}},$={name:"counter",order:5,onInit:(t,i)=>{i.on("change",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function X(t,i){t.classList.toggle("pswp--zoomed-in",i)}class Y{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this._lastUpdatedZoomLevel=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[U,V,q,G,K,$],t.dispatch("uiRegister"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on("change",(()=>{var i;null===(i=t.element)||void 0===i||i.classList.toggle("pswp--one-slide",1===t.getNumItems())})),t.on("zoomPanUpdate",(()=>this._onZoomPanUpdate()))}registerElement(t){this.isRegistered?this.items.push(new W(this.pswp,t)):this.uiElementsData.push(t)}_onZoomPanUpdate(){const{template:t,currSlide:i,options:e}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:s}=i;if(this.pswp.opener.isOpen||(s=i.zoomLevels.initial),s===this._lastUpdatedZoomLevel)return;this._lastUpdatedZoomLevel=s;const n=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(n)<.01||!i.isZoomable())return X(t,!1),void t.classList.remove("pswp--zoom-allowed");t.classList.add("pswp--zoom-allowed"),X(t,(s===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=s),"zoom"!==e.imageClickAction&&"zoom-or-close"!==e.imageClickAction||t.classList.add("pswp--click-to-zoom")}}class j{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class J{constructor(){this._listeners={},this._filters={},this.pswp=void 0,this.options=void 0}addFilter(t,i,e=100){var s,n,o;this._filters[t]||(this._filters[t]=[]),null===(s=this._filters[t])||void 0===s||s.push({fn:i,priority:e}),null===(n=this._filters[t])||void 0===n||n.sort(((t,i)=>t.priority-i.priority)),null===(o=this.pswp)||void 0===o||o.addFilter(t,i,e)}removeFilter(t,i){this._filters[t]&&(this._filters[t]=this._filters[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var e;return null===(e=this._filters[t])||void 0===e||e.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var e,s;this._listeners[t]||(this._listeners[t]=[]),null===(e=this._listeners[t])||void 0===e||e.push(i),null===(s=this.pswp)||void 0===s||s.on(t,i)}off(t,i){var e;this._listeners[t]&&(this._listeners[t]=this._listeners[t].filter((t=>i!==t))),null===(e=this.pswp)||void 0===e||e.off(t,i)}dispatch(t,i){var e;if(this.pswp)return this.pswp.dispatch(t,i);const s=new j(t,i);return null===(e=this._listeners[t])||void 0===e||e.forEach((t=>{t.call(this,s)})),s}}class Q{constructor(t,i){if(this.element=s("pswp__img pswp__img--placeholder",t?"img":"div",i),t){const i=this.element;i.decoding="async",i.alt="",i.src=t,i.setAttribute("role","presentation")}this.element.setAttribute("aria-hidden","true")}setDisplayedSize(t,i){this.element&&("IMG"===this.element.tagName?(c(this.element,250,"auto"),this.element.style.transformOrigin="0 0",this.element.style.transform=l(0,0,t/250)):c(this.element,t,i))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class tt{constructor(t,i,e){this.instance=i,this.data=t,this.index=e,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state="idle",this.data.type?this.type=this.data.type:this.data.src?this.type="image":this.type="html",this.instance.dispatch("contentInit",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(t,i){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters("placeholderSrc",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new Q(t,this.slide.container)}this.element&&!i||this.instance.dispatch("contentLoad",{content:this,isLazy:t}).defaultPrevented||(this.isImageContent()?(this.element=s("pswp__img","img"),this.displayedImageWidth&&this.loadImage(t)):(this.element=s("pswp__content","div"),this.element.innerHTML=this.data.html||""),i&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,e;if(!this.isImageContent()||!this.element||this.instance.dispatch("contentLoadImage",{content:this,isLazy:t}).defaultPrevented)return;const s=this.element;this.updateSrcsetSizes(),this.data.srcset&&(s.srcset=this.data.srcset),s.src=null!==(i=this.data.src)&&void 0!==i?i:"",s.alt=null!==(e=this.data.alt)&&void 0!==e?e:"",this.state=m,s.complete?this.onLoaded():(s.onload=()=>{this.onLoaded()},s.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&this.element&&(this.instance.dispatch("loadComplete",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==v||this.removePlaceholder())}onError(){this.state=v,this.slide&&(this.displayError(),this.instance.dispatch("loadComplete",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch("loadError",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters("isContentLoading",this.state===m,this)}isError(){return this.state===v}isImageContent(){return"image"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch("contentResize",{content:this,width:t,height:i}).defaultPrevented&&(c(this.element,t,i),this.isImageContent()&&!this.isError()))){const e=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,e?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch("imageSizeChange",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters("isContentZoomable",this.isImageContent()&&this.state!==v,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters("srcsetSizesWidth",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+"px",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters("useContentPlaceholder",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch("contentLazyLoad",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters("isKeepingPlaceholder",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch("contentDestroy",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var t,i;let e=s("pswp__error-msg","div");e.innerText=null!==(t=null===(i=this.instance.options)||void 0===i?void 0:i.errorMsg)&&void 0!==t?t:"",e=this.instance.applyFilters("contentErrorElement",e,this),this.element=s("pswp__content pswp__error-msg-container","div"),this.element.appendChild(e),this.slide.container.innerText="",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===v)return void this.displayError();if(this.instance.dispatch("contentAppend",{content:this}).defaultPrevented)return;const t="decode"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||_())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch("contentActivate",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!_()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute("aria-hidden","false"))}deactivate(){this.instance.dispatch("contentDeactivate",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute("aria-hidden","true")}remove(){this.isAttached=!1,this.instance.dispatch("contentRemove",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch("contentAppendImage",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==v||this.removePlaceholder()))}}function it(t,i,e){const s=i.createContentFromData(t,e);let n;const{options:o}=i;if(o){let a;n=new S(o,t,-1),a=i.pswp?i.pswp.viewportSize:w(o,i);const h=x(o,a,t,e);n.update(s.width,s.height,h)}return s.lazyLoad(),n&&s.setDisplayedSize(Math.ceil(s.width*n.initial),Math.ceil(s.height*n.initial)),s}class et{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this._cachedItems=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch("lazyLoad").defaultPrevented)return;const{preload:e}=i.options,s=void 0===t||t>=0;let n;for(n=0;n<=e[1];n++)this.loadSlideByIndex(i.currIndex+(s?n:-n));for(n=1;n<=e[0];n++)this.loadSlideByIndex(i.currIndex+(s?-n:n))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let e=this.getContentByIndex(i);e||(e=function(t,i){const e=i.getItemData(t);if(!i.dispatch("lazyLoadSlide",{index:t,itemData:e}).defaultPrevented)return it(e,i,t)}(i,this.pswp),e&&this.addToCache(e))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this._cachedItems.push(t),this._cachedItems.length>this.limit){const t=this._cachedItems.findIndex((t=>!t.isAttached&&!t.hasSlide));-1!==t&&this._cachedItems.splice(t,1)[0].destroy()}}removeByIndex(t){const i=this._cachedItems.findIndex((i=>i.index===t));-1!==i&&this._cachedItems.splice(i,1)}getContentByIndex(t){return this._cachedItems.find((i=>i.index===t))}destroy(){this._cachedItems.forEach((t=>t.destroy())),this._cachedItems=[]}}class st extends J{getNumItems(){var t;let i=0;const e=null===(t=this.options)||void 0===t?void 0:t.dataSource;e&&"length"in e?i=e.length:e&&"gallery"in e&&(e.items||(e.items=this._getGalleryDOMElements(e.gallery)),e.items&&(i=e.items.length));const s=this.dispatch("numItems",{dataSource:e,numItems:i});return this.applyFilters("numItems",s.numItems,e)}createContentFromData(t,i){return new tt(t,this,i)}getItemData(t){var i;const e=null===(i=this.options)||void 0===i?void 0:i.dataSource;let s={};Array.isArray(e)?s=e[t]:e&&"gallery"in e&&(e.items||(e.items=this._getGalleryDOMElements(e.gallery)),s=e.items[t]);let n=s;n instanceof Element&&(n=this._domElementToItemData(n));const o=this.dispatch("itemData",{itemData:n||{},index:t});return this.applyFilters("itemData",o.itemData,t)}_getGalleryDOMElements(t){var i,e;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(e=this.options)&&void 0!==e&&e.childSelector?function(t,i,e=document){let s=[];if(t instanceof Element)s=[t];else if(t instanceof NodeList||Array.isArray(t))s=Array.from(t);else{const n="string"==typeof t?t:i;n&&(s=Array.from(e.querySelectorAll(n)))}return s}(this.options.children,this.options.childSelector,t)||[]:[t]}_domElementToItemData(t){const i={element:t},e="A"===t.tagName?t:t.querySelector("a");if(e){i.src=e.dataset.pswpSrc||e.href,e.dataset.pswpSrcset&&(i.srcset=e.dataset.pswpSrcset),i.width=e.dataset.pswpWidth?parseInt(e.dataset.pswpWidth,10):0,i.height=e.dataset.pswpHeight?parseInt(e.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,e.dataset.pswpType&&(i.type=e.dataset.pswpType);const n=t.querySelector("img");var s;n&&(i.msrc=n.currentSrc||n.src,i.alt=null!==(s=n.getAttribute("alt"))&&void 0!==s?s:""),(e.dataset.pswpCropped||e.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters("domItemData",i,t,e)}lazyLoadData(t,i){return it(t,this,i)}}const nt=.003;class ot{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this._duration=void 0,this._useAnimation=!1,this._croppedZoom=!1,this._animateRootOpacity=!1,this._animateBgOpacity=!1,this._placeholder=void 0,this._opacityElement=void 0,this._cropContainer1=void 0,this._cropContainer2=void 0,this._thumbBounds=void 0,this._prepareOpen=this._prepareOpen.bind(this),t.on("firstZoomPan",this._prepareOpen)}open(){this._prepareOpen(),this._start()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this._duration=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this._duration=0),this._applyStartProps(),setTimeout((()=>{this._start()}),this._croppedZoom?30:0)}_prepareOpen(){if(this.pswp.off("firstZoomPan",this._prepareOpen),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this._duration=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this._duration=0),this._applyStartProps()}}_applyStartProps(){const{pswp:t}=this,i=this.pswp.currSlide,{options:e}=t;var s,n;if("fade"===e.showHideAnimationType?(e.showHideOpacity=!0,this._thumbBounds=void 0):"none"===e.showHideAnimationType?(e.showHideOpacity=!1,this._duration=0,this._thumbBounds=void 0):this.isOpening&&t._initialThumbBounds?this._thumbBounds=t._initialThumbBounds:this._thumbBounds=this.pswp.getThumbBounds(),this._placeholder=null==i?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this._useAnimation=Boolean(this._duration&&this._duration>50),this._animateZoom=Boolean(this._thumbBounds)&&(null==i?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),this._animateZoom?this._animateRootOpacity=null!==(s=e.showHideOpacity)&&void 0!==s&&s:(this._animateRootOpacity=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan())),this._animateBgOpacity=!this._animateRootOpacity&&this.pswp.options.bgOpacity>nt,this._opacityElement=this._animateRootOpacity?t.element:t.bg,!this._useAnimation)return this._duration=0,this._animateZoom=!1,this._animateBgOpacity=!1,this._animateRootOpacity=!0,void(this.isOpening&&(t.element&&(t.element.style.opacity=String(nt)),t.applyBgOpacity(1)));this._animateZoom&&this._thumbBounds&&this._thumbBounds.innerRect?(this._croppedZoom=!0,this._cropContainer1=this.pswp.container,this._cropContainer2=null===(n=this.pswp.currSlide)||void 0===n?void 0:n.holderElement,t.container&&(t.container.style.overflow="hidden",t.container.style.width=t.viewportSize.x+"px")):this._croppedZoom=!1,this.isOpening?(this._animateRootOpacity?(t.element&&(t.element.style.opacity=String(nt)),t.applyBgOpacity(1)):(this._animateBgOpacity&&t.bg&&(t.bg.style.opacity=String(nt)),t.element&&(t.element.style.opacity="1")),this._animateZoom&&(this._setClosedStateZoomPan(),this._placeholder&&(this._placeholder.style.willChange="transform",this._placeholder.style.opacity=String(nt)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display="none"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display="none"),this._croppedZoom&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}_start(){this.isOpening&&this._useAnimation&&this._placeholder&&"IMG"===this._placeholder.tagName?new Promise((t=>{let i=!1,e=!0;var s;(s=this._placeholder,"decode"in s?s.decode().catch((()=>{})):s.complete?Promise.resolve(s):new Promise(((t,i)=>{s.onload=()=>t(s),s.onerror=i}))).finally((()=>{i=!0,e||t(!0)})),setTimeout((()=>{e=!1,i&&t(!0)}),50),setTimeout(t,250)})).finally((()=>this._initiate())):this._initiate()}_initiate(){var t,i;null===(t=this.pswp.element)||void 0===t||t.style.setProperty("--pswp-transition-duration",this._duration+"ms"),this.pswp.dispatch(this.isOpening?"openingAnimationStart":"closingAnimationStart"),this.pswp.dispatch("initialZoom"+(this.isOpening?"In":"Out")),null===(i=this.pswp.element)||void 0===i||i.classList.toggle("pswp--ui-visible",this.isOpening),this.isOpening?(this._placeholder&&(this._placeholder.style.opacity="1"),this._animateToOpenState()):this.isClosing&&this._animateToClosedState(),this._useAnimation||this._onAnimationComplete()}_onAnimationComplete(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?"openingAnimationEnd":"closingAnimationEnd"),t.dispatch("initialZoom"+(this.isOpen?"InEnd":"OutEnd")),this.isClosed)t.destroy();else if(this.isOpen){var i;this._animateZoom&&t.container&&(t.container.style.overflow="visible",t.container.style.width="100%"),null===(i=t.currSlide)||void 0===i||i.applyCurrentZoomPan()}}_animateToOpenState(){const{pswp:t}=this;this._animateZoom&&(this._croppedZoom&&this._cropContainer1&&this._cropContainer2&&(this._animateTo(this._cropContainer1,"transform","translate3d(0,0,0)"),this._animateTo(this._cropContainer2,"transform","none")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this._animateTo(t.currSlide.container,"transform",t.currSlide.getCurrentTransform()))),this._animateBgOpacity&&t.bg&&this._animateTo(t.bg,"opacity",String(t.options.bgOpacity)),this._animateRootOpacity&&t.element&&this._animateTo(t.element,"opacity","1")}_animateToClosedState(){const{pswp:t}=this;this._animateZoom&&this._setClosedStateZoomPan(!0),this._animateBgOpacity&&t.bgOpacity>.01&&t.bg&&this._animateTo(t.bg,"opacity","0"),this._animateRootOpacity&&t.element&&this._animateTo(t.element,"opacity","0")}_setClosedStateZoomPan(t){if(!this._thumbBounds)return;const{pswp:i}=this,{innerRect:e}=this._thumbBounds,{currSlide:s,viewportSize:o}=i;if(this._croppedZoom&&e&&this._cropContainer1&&this._cropContainer2){const i=-o.x+(this._thumbBounds.x-e.x)+e.w,s=-o.y+(this._thumbBounds.y-e.y)+e.h,n=o.x-e.w,a=o.y-e.h;t?(this._animateTo(this._cropContainer1,"transform",l(i,s)),this._animateTo(this._cropContainer2,"transform",l(n,a))):(p(this._cropContainer1,i,s),p(this._cropContainer2,n,a))}s&&(n(s.pan,e||this._thumbBounds),s.currZoomLevel=this._thumbBounds.w/s.width,t?this._animateTo(s.container,"transform",s.getCurrentTransform()):s.applyCurrentZoomPan())}_animateTo(t,i,e){if(!this._duration)return void(t.style[i]=e);const{animations:s}=this.pswp,n={duration:this._duration,easing:this.pswp.options.easing,onComplete:()=>{s.activeAnimations.length||this._onAnimationComplete()},target:t};n[i]=e,s.startTransition(n)}}const at={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:"zoom-or-close",bgClickAction:"close",tapAction:"toggle-controls",doubleTapAction:"zoom",indexIndicatorSep:" / ",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:"The image cannot be loaded",preload:[1,2],easing:"cubic-bezier(.4,0,.22,1)"};class ht extends st{constructor(t){super(),this.options=this._prepareOptions(t||{}),this.offset={x:0,y:0},this._prevViewportSize={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this._initialItemData={},this._initialThumbBounds=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new y,this.animations=new k,this.mainScroll=new Z(this),this.gestures=new T(this),this.opener=new ot(this),this.keyboard=new E(this),this.contentLoader=new et(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch("init"),this.dispatch("beforeOpen"),this._createMainStructure();let t="pswp--open";return this.gestures.supportsTouch&&(t+=" pswp--touch"),this.options.mainClass&&(t+=" "+this.options.mainClass),this.element&&(this.element.className+=" "+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch("firstUpdate"),this.scrollWheel=new H(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this._initialItemData=this.getItemData(this.currIndex),this.dispatch("gettingData",{index:this.currIndex,data:this._initialItemData,slide:void 0}),this._initialThumbBounds=this.getThumbBounds(),this.dispatch("initialLayout"),this.on("openingAnimationEnd",(()=>{const{itemHolders:t}=this.mainScroll;t[0]&&(t[0].el.style.display="block",this.setContent(t[0],this.currIndex-1)),t[2]&&(t[2].el.style.display="block",this.setContent(t[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,"resize",this._handlePageResize.bind(this)),this.events.add(window,"scroll",this._updatePageScrollOffset.bind(this)),this.dispatch("bindEvents")})),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch("change"),this.opener.open(),this.dispatch("afterInit"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),r(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;null===(i=this.currSlide)||void 0===i||i.zoomTo(...t)}toggleZoom(){var t;null===(t=this.currSlide)||void 0===t||t.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch("close"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying)return this.options.showHideAnimationType="none",void this.close();this.dispatch("destroy"),this._listeners={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),null===(t=this.element)||void 0===t||t.remove(),this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,e)=>{var s,n;let o=(null!==(s=null===(n=this.currSlide)||void 0===n?void 0:n.index)&&void 0!==s?s:0)-1+e;var a;this.canLoop()&&(o=this.getLoopedIndex(o)),o===t&&(this.setContent(i,t,!0),1===e&&(this.currSlide=i.slide,null===(a=i.slide)||void 0===a||a.setIsActive(!0)))})),this.dispatch("change")}setContent(t,i,e){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!e)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const s=this.getItemData(i);t.slide=new b(s,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const i=w(this.options,this);!t&&h(i,this._prevViewportSize)||(n(this._prevViewportSize,i),this.dispatch("beforeResize"),n(this.viewportSize,this._prevViewportSize),this._updatePageScrollOffset(),this.dispatch("viewportSize"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia("(any-hover: hover)").matches&&this.mouseDetected(),this.dispatch("resize"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){var t;this.hasMouse||(this.hasMouse=!0,null===(t=this.element)||void 0===t||t.classList.add("pswp--has_mouse"))}_handlePageResize(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}_updatePageScrollOffset(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch("updateScrollOffset")}_createMainStructure(){this.element=s("pswp","div"),this.element.setAttribute("tabindex","-1"),this.element.setAttribute("role","dialog"),this.template=this.element,this.bg=s("pswp__bg","div",this.element),this.scrollWrap=s("pswp__scroll-wrap","section",this.element),this.container=s("pswp__container","div",this.scrollWrap),this.scrollWrap.setAttribute("aria-roledescription","carousel"),this.container.setAttribute("aria-live","off"),this.container.setAttribute("id","pswp__items"),this.mainScroll.appendHolders(),this.ui=new Y(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,e){const s=e.dispatch("thumbBounds",{index:t,itemData:i,instance:e});if(s.thumbBounds)return s.thumbBounds;const{element:n}=i;let o,a;if(n&&!1!==e.options.thumbSelector){const t=e.options.thumbSelector||"img";a=n.matches(t)?n:n.querySelector(t)}return a=e.applyFilters("thumbEl",a,i,t),a&&(o=i.thumbCropped?function(t,i,e){const s=t.getBoundingClientRect(),n=s.width/i,o=s.height/e,a=n>o?n:o,h=(s.width-i*a)/2,r=(s.height-e*a)/2,l={x:s.left+h,y:s.top+r,w:i*a};return l.innerRect={w:s.width,h:s.height,x:h,y:r},l}(a,i.width||i.w||0,i.height||i.h||0):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(a)),e.applyFilters("thumbBounds",o,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this._initialItemData,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}_prepareOptions(t){return window.matchMedia("(prefers-reduced-motion), (update: slow)").matches&&(t.showHideAnimationType="none",t.zoomAnimationDuration=0),{...at,...t}}}}}]); \ No newline at end of file diff --git a/assets/js/4637.562129d2.js.LICENSE.txt b/assets/js/photo-swipe.2a81417f.js.LICENSE.txt similarity index 100% rename from assets/js/4637.562129d2.js.LICENSE.txt rename to assets/js/photo-swipe.2a81417f.js.LICENSE.txt diff --git a/assets/js/power-automate.html.7640a0c4.js b/assets/js/power-automate.html.7640a0c4.js new file mode 100644 index 000000000..49d3653a6 --- /dev/null +++ b/assets/js/power-automate.html.7640a0c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9522],{3671:(e,t)=>{t.A=(e,t)=>{const o=e.__vccOpts||e;for(const[e,r]of t)o[e]=r;return o}},1355:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>D,data:()=>O});var r=o(7847);const a={href:"https://sspai.com/series/273/list",target:"_blank",rel:"noopener noreferrer"},n={href:"https://make.powerautomate.com/",target:"_blank",rel:"noopener noreferrer"},s=(0,r.Lk)("strong",null,"对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。",-1),l=(0,r.Lk)("p",null,"Automa 因为有可视化界面,所以最近很多,但在我看来它的功能太弱。",-1),i=(0,r.Lk)("strong",null,"桌面流",-1),c={href:"https://docs.microsoft.com/zh-cn/power-automate/desktop-flows/run-pad-flow#run-desktop-flows-via-url",target:"_blank",rel:"noopener noreferrer"},p={href:"https://learn.microsoft.com/en-us/power-automate/desktop-flows/install",target:"_blank",rel:"noopener noreferrer"},f=(0,r.Lk)("strong",null,"云端流",-1),m={href:"https://www.microsoft.com/en-us/microsoft-teams/group-chat-software",target:"_blank",rel:"noopener noreferrer"},u=(0,r.Lk)("sup",{class:"footnote-ref"},[(0,r.Lk)("a",{href:"#footnote1"},"[1]"),(0,r.Lk)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),h=(0,r.Fv)('

    与个人账户相比,组织账户仅仅多了一些按钮和试用提示,并没有明显区别。简单来说,组织账户有付费的权利,其他功能都相同。

    使用技巧

    • 遇到捕获了元素但执行时却报错的情况,可以尝试自带的记录器。它比手动选择元素要死板,钉死了要点击的元素,但能确保执行成功率。

    • 使用「循环」和「等待」实现半自动执行工作流。如果某些条件并不清晰,可通过第三方网页来设置条件,如特殊网页设置的特殊文本。[2]

    报错重置

    如果遇到程序自身的报错,点击「设置」>「应用」>「应用和功能」中找到 Power Automate Desktop 应用,并点击「重置」后试试看。

    创建 Microsoft 组织账户

    ',6),k={href:"https://partner.microsoft.com/zh-cn/",target:"_blank",rel:"noopener noreferrer"},d={href:"https://partner.microsoft.com/zh-cn/membership",target:"_blank",rel:"noopener noreferrer"},L=(0,r.Lk)("li",null,"进入后会问「你希望如何与 Microsoft 合作」,安全起见我选择「合作伙伴」,进入下一页后点「创作工作账户」。",-1),b=(0,r.Lk)("li",null,"账户信息除手机和备用邮件外可以随便填,通过手机验证码后,点「继续」,然后等几分钟,就会收到注册成功通知,你也成为有组织的人了。",-1),w={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"},g=(0,r.Lk)("h3",{id:"管理组织用户",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#管理组织用户"},[(0,r.Lk)("span",null,"管理组织用户")])],-1),A={href:"https://portal.azure.com/",target:"_blank",rel:"noopener noreferrer"},W=(0,r.Lk)("p",null,"进入「管理 Azure Active Directory」>「用户」,添加和管理组织用户。",-1),P=(0,r.Lk)("hr",{class:"footnotes-sep"},null,-1),_={class:"footnotes"},y={class:"footnotes-list"},z={id:"footnote1",class:"footnote-item"},v={href:"https://support.microsoft.com/zh-cn/office/%E6%B3%A8%E5%86%8C%E5%85%8D%E8%B4%B9teams%E7%BB%8F%E5%85%B8-70aaf044-b872-4c32-ac47-362ab29ebbb1",target:"_blank",rel:"noopener noreferrer"},F=(0,r.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),x={id:"footnote2",class:"footnote-item"},B={href:"https://www.bilibili.com/video/BV1ki4y1S7AZ/?vd_source=9ab57d83a938c90a4fc9691b299cb2af",target:"_blank",rel:"noopener noreferrer"},E=(0,r.Lk)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),R={},D=(0,o(3671).A)(R,[["render",function(e,t){const o=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[(0,r.Lk)("p",null,[(0,r.Lk)("a",a,[(0,r.eW)("Power Automate"),(0,r.bF)(o)]),(0,r.eW)(" 自动化应用,分为桌面流和"),(0,r.Lk)("a",n,[(0,r.eW)("云端流"),(0,r.bF)(o)]),(0,r.eW)(",上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。"),s,(0,r.eW)(" 自动化操作也可以使用 Logi Options+ 的 Smart Actions。")]),l,(0,r.Lk)("p",null,[i,(0,r.eW)("本身并没有触发器,因此只能手动执行。付费的组织账户可以自动执行桌面流,比如:云端流调用桌面流,"),(0,r.Lk)("a",c,[(0,r.eW)("通过 URL 运行桌面流"),(0,r.bF)(o)]),(0,r.eW)("。Power Automate 安装有商店版和 "),(0,r.Lk)("a",p,[(0,r.eW)("exe 应用"),(0,r.bF)(o)]),(0,r.eW)("两种方式,各自有些 Bug。")]),(0,r.Lk)("p",null,[f,(0,r.eW)("可以自动、即时或通过计划触发自动化。登录云端流时,一开始要求用工作账户登录,但后来我开通了 "),(0,r.Lk)("a",m,[(0,r.eW)("Microsoft Teams"),(0,r.bF)(o)]),(0,r.eW)(",就可以用个人账户,暂不清楚是否有因果关系。"),u]),h,(0,r.Lk)("p",null,[(0,r.eW)("微软的众多服务都需要组织账户,个人账号经常被拒绝登录。而创建微软组织账户最简单的方法是注册为"),(0,r.Lk)("a",k,[(0,r.eW)("微软合作伙伴"),(0,r.bF)(o)]),(0,r.eW)("。")]),(0,r.Lk)("ol",null,[(0,r.Lk)("li",null,[(0,r.Lk)("a",d,[(0,r.eW)("加入 Microsoft 合作伙伴网络"),(0,r.bF)(o)]),(0,r.eW)("。")]),L,b]),(0,r.Lk)("p",null,[(0,r.eW)("如果你有 Azure 账户,可以直接在 Azure 中"),(0,r.Lk)("a",w,[(0,r.eW)("为组织创建新的租户"),(0,r.bF)(o)]),(0,r.eW)("。")]),g,(0,r.Lk)("p",null,[(0,r.eW)("若要给其他人多添加几个账号,则可以通过 "),(0,r.Lk)("a",A,[(0,r.eW)("Azure"),(0,r.bF)(o)]),(0,r.eW)(" 来管理。")]),W,P,(0,r.Lk)("section",_,[(0,r.Lk)("ol",y,[(0,r.Lk)("li",z,[(0,r.Lk)("p",null,[(0,r.Lk)("a",v,[(0,r.eW)("注册免费 Teams 经典"),(0,r.bF)(o)]),(0,r.eW)(),F])]),(0,r.Lk)("li",x,[(0,r.Lk)("p",null,[(0,r.Lk)("a",B,[(0,r.eW)("Power Automate Desktop 免费 RPA 实现定时启动或按照频率运行自动化流的三种办法"),(0,r.bF)(o)]),(0,r.eW)(),E])])])])])}]]),O=JSON.parse('{"path":"/apps/tutorials/power-automate.html","title":"Power Automate","lang":"zh-CN","frontmatter":{"article":false,"title":"Power Automate","order":10,"description":"Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Act...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/power-automate.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Power Automate"}],["meta",{"property":"og:description","content":"Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Act..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:49:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:49:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Power Automate\\",\\"description\\":\\"Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Act...\\"}"]]},"headers":[{"level":3,"title":"使用技巧","slug":"使用技巧","link":"#使用技巧","children":[]},{"level":3,"title":"报错重置","slug":"报错重置","link":"#报错重置","children":[]},{"level":3,"title":"创建 Microsoft 组织账户","slug":"创建-microsoft-组织账户","link":"#创建-microsoft-组织账户","children":[]},{"level":3,"title":"管理组织用户","slug":"管理组织用户","link":"#管理组织用户","children":[]}],"git":{"createdTime":1701223097000,"updatedTime":1705348154000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.73,"words":820},"filePathRelative":"apps/tutorials/power-automate.md","localizedDate":"2023年11月29日","excerpt":"

    Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Actions。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b3331466.ed5d5ae6.js b/assets/js/qbittorrent.html.23e6421e.js similarity index 90% rename from assets/js/v-b3331466.ed5d5ae6.js rename to assets/js/qbittorrent.html.23e6421e.js index ec47e78ab..fb62d4732 100644 --- a/assets/js/v-b3331466.ed5d5ae6.js +++ b/assets/js/qbittorrent.html.23e6421e.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5840],{9720:(n,e)=>{e.c=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},5773:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>c,data:()=>p});var a=t(3968);const s={href:"https://registry.hub.docker.com/r/linuxserver/qbittorrent/",target:"_blank",rel:"noopener noreferrer"},r=(0,a.IL)('

    使用问题

    无法登录

    为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。

    PT 下载

    对于 PT 下载,请关闭 BitTorrent - DHT 和其他隐私选项。

    为什么下载没速度?

    • NAS 中的下载路径须添加 Everyone 权限。
    • 检查监听端口是否有修改。
    • 配置是否使用了默认的 6881 端口。请修改所有默认端口,以避免可能的错误。

    部署代码

    ',8),i={href:"https://blog.csdn.net/weixin_45120915/article/details/114691473",target:"_blank",rel:"noopener noreferrer"},o=(0,a.IL)('
    # https://hub.docker.com/r/linuxserver/qbittorrent  注意将下载目录授权到 Everyone\nversion: "2.1"\nservices:\n  qbittorrent:\n    image: lscr.io/linuxserver/qbittorrent:latest\n    container_name: qbittorrent\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n      - WEBUI_PORT=49155\n    volumes:\n      - /volume1/docker/qbittorrent/config:/config\n      - /volume2/Backup/downloads:/downloads\n    ports:\n      - 49155:49155\n      - 49156:49156\n      - 49156:49156/udp\n    restart: unless-stopped\n
    ',1),l={},c=(0,t(9720).c)(l,[["render",function(n,e){const t=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.QD)("a",s,[(0,a.mY)("qBittorrent"),(0,a.K2)(t)]),(0,a.mY)(" 是一款开源免费的种子和磁力链接下载工具。")]),r,(0,a.QD)("p",null,[(0,a.mY)("部署后,进入「选项」>「连接」,将监听端口改为 49156。有关其他设置,请参考"),(0,a.QD)("a",i,[(0,a.mY)("群晖使用 qbittorrent"),(0,a.K2)(t)]),(0,a.mY)("。")]),o])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/qbittorrent.html","title":"qBittorrent:种子&磁力下载","lang":"zh-CN","frontmatter":{"article":false,"title":"qBittorrent:种子&磁力下载","order":5,"description":"qBittorrent 是一款开源免费的种子和磁力链接下载工具。 使用问题 无法登录 为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。 P...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/qbittorrent.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"qBittorrent:种子&磁力下载"}],["meta",{"property":"og:description","content":"qBittorrent 是一款开源免费的种子和磁力链接下载工具。 使用问题 无法登录 为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。 P..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"qBittorrent:种子&磁力下载\\",\\"description\\":\\"qBittorrent 是一款开源免费的种子和磁力链接下载工具。 使用问题 无法登录 为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。 P...\\"}"]]},"headers":[{"level":2,"title":"使用问题","slug":"使用问题","link":"#使用问题","children":[{"level":3,"title":"无法登录","slug":"无法登录","link":"#无法登录","children":[]},{"level":3,"title":"PT 下载","slug":"pt-下载","link":"#pt-下载","children":[]},{"level":3,"title":"为什么下载没速度?","slug":"为什么下载没速度","link":"#为什么下载没速度","children":[]}]},{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.83,"words":250},"filePathRelative":"services/dockers-on-nas/qbittorrent.md","localizedDate":"2023年12月19日","excerpt":"

    qBittorrent 是一款开源免费的种子和磁力链接下载工具。

    \\n

    使用问题

    \\n

    无法登录

    \\n

    为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3054],{3671:(n,e)=>{e.A=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},3173:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>c,data:()=>p});var a=t(7847);const s={href:"https://registry.hub.docker.com/r/linuxserver/qbittorrent/",target:"_blank",rel:"noopener noreferrer"},r=(0,a.Fv)('

    使用问题

    无法登录

    为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。

    PT 下载

    对于 PT 下载,请关闭 BitTorrent - DHT 和其他隐私选项。

    为什么下载没速度?

    • NAS 中的下载路径须添加 Everyone 权限。
    • 检查监听端口是否有修改。
    • 配置是否使用了默认的 6881 端口。请修改所有默认端口,以避免可能的错误。

    部署代码

    ',8),i={href:"https://blog.csdn.net/weixin_45120915/article/details/114691473",target:"_blank",rel:"noopener noreferrer"},o=(0,a.Fv)('
    # https://hub.docker.com/r/linuxserver/qbittorrent  注意将下载目录授权到 Everyone\nversion: "2.1"\nservices:\n  qbittorrent:\n    image: lscr.io/linuxserver/qbittorrent:latest\n    container_name: qbittorrent\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n      - WEBUI_PORT=49155\n    volumes:\n      - /volume1/docker/qbittorrent/config:/config\n      - /volume2/Backup/downloads:/downloads\n    ports:\n      - 49155:49155\n      - 49156:49156\n      - 49156:49156/udp\n    restart: unless-stopped\n
    ',1),l={},c=(0,t(3671).A)(l,[["render",function(n,e){const t=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",s,[(0,a.eW)("qBittorrent"),(0,a.bF)(t)]),(0,a.eW)(" 是一款开源免费的种子和磁力链接下载工具。")]),r,(0,a.Lk)("p",null,[(0,a.eW)("部署后,进入「选项」>「连接」,将监听端口改为 49156。有关其他设置,请参考"),(0,a.Lk)("a",i,[(0,a.eW)("群晖使用 qbittorrent"),(0,a.bF)(t)]),(0,a.eW)("。")]),o])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/qbittorrent.html","title":"qBittorrent:种子&磁力下载","lang":"zh-CN","frontmatter":{"article":false,"title":"qBittorrent:种子&磁力下载","order":5,"description":"qBittorrent 是一款开源免费的种子和磁力链接下载工具。 使用问题 无法登录 为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。 P...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/qbittorrent.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"qBittorrent:种子&磁力下载"}],["meta",{"property":"og:description","content":"qBittorrent 是一款开源免费的种子和磁力链接下载工具。 使用问题 无法登录 为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。 P..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"qBittorrent:种子&磁力下载\\",\\"description\\":\\"qBittorrent 是一款开源免费的种子和磁力链接下载工具。 使用问题 无法登录 为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。 P...\\"}"]]},"headers":[{"level":2,"title":"使用问题","slug":"使用问题","link":"#使用问题","children":[{"level":3,"title":"无法登录","slug":"无法登录","link":"#无法登录","children":[]},{"level":3,"title":"PT 下载","slug":"pt-下载","link":"#pt-下载","children":[]},{"level":3,"title":"为什么下载没速度?","slug":"为什么下载没速度","link":"#为什么下载没速度","children":[]}]},{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.83,"words":250},"filePathRelative":"services/dockers-on-nas/qbittorrent.md","localizedDate":"2023年12月19日","excerpt":"

    qBittorrent 是一款开源免费的种子和磁力链接下载工具。

    \\n

    使用问题

    \\n

    无法登录

    \\n

    为了解决登录和密码问题,请先停止容器,并将 config/qBittorrent/qBittorrent.conf 文件中的 WebUI\\\\AuthSubnetWhitelist 设置为 0.0.0.0/0,这样即可无需密码登录 qBittorrent WebUI。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/qinglong.html.d38918d6.js b/assets/js/qinglong.html.d38918d6.js new file mode 100644 index 000000000..2749c8c5d --- /dev/null +++ b/assets/js/qinglong.html.d38918d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5707],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},2482:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>m,data:()=>k});var t=a(7847);const s={href:"https://github.com/whyour/qinglong",target:"_blank",rel:"noopener noreferrer"},o={href:"https://blog.csdn.net/u011027547/article/details/130703685",target:"_blank",rel:"noopener noreferrer"},l=(0,t.Fv)('
    # https://github.com/whyour/qinglong/blob/develop/docker/docker-compose.yml\nversion: "2"\nservices:\n  web:\n    # alpine 基础镜像版本\n    image: whyour/qinglong:latest\n    container_name: qinglong\n    # debian-slim 基础镜像版本\n    # image: whyour/qinglong:debian\n    volumes:\n      - /volume1/docker/qinglong/data:/ql/data\n    ports:\n      - "5700:5700"\n    environment:\n      # 部署路径非必须,以斜杠开头和结尾,比如 /test/\n      QlBaseUrl: "/"\n    restart: unless-stopped\n

    配置注意:

    • 在运行脚本之前,请确保已安装所有必要的依赖。
    • 定期运行:0 0 7 * * ? 表示每天 7 点触发。其中第一个数字代表秒,第二个数字代表分钟,第三个数字代表小时,第四个数字代表每月的日期,第五个数字代表月份,第六个数字代表每周的星期几。这些数字之间使用空格分隔。要表示不限制的时间段,可以使用 * 号,要表示定期运行的时间段,可以使用 ? 替代,要表示间隔运行的时间段,可以使用 */数字 替代。如果需要在同一个时间位上设置多个选项,可以使用逗号 , 连接,如果需要设置一个时间段,可以使用短划线 - 连接。对于每天的运行,可以在日期位或星期位使用 ?

    京东 COOKIES

    ',4),i={href:"https://m.jd.com/",target:"_blank",rel:"noopener noreferrer"},r=(0,t.Lk)("li",null,'使用浏览器的开发者工具(F12)进入调试模式,选择 "network"(网络)。',-1),c=(0,t.Lk)("li",null,"点击页面右上方的「直接访问」,开发者工具中出现 log.gif 开头的记录。点击它,选择「Headers」>「Request headers」,复制出其中的 Cookie 内容。",-1),p=(0,t.Lk)("li",null,[(0,t.eW)("在复制出的 Cookies 中查找 "),(0,t.Lk)("code",null,"pt_key=XXX;pt_pin=xxx;"),(0,t.eW)(" 字段,并将其保存为变量 "),(0,t.Lk)("code",null,"JD_COOKIE"),(0,t.eW)("。如果找不到 log.gif 或 getinfo 的记录,则可尝试随意添加一个商品到购物车。")],-1),u=(0,t.Lk)("figure",null,[(0,t.Lk)("img",{src:"https://img.newzone.top/2023-11-26-06-31-20.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.Lk)("figcaption")],-1),d={},m=(0,a(3671).A)(d,[["render",function(e,n){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",s,[(0,t.eW)("青龙面板"),(0,t.bF)(a)]),(0,t.eW)(" 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 "),(0,t.Lk)("a",o,[(0,t.eW)("青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)"),(0,t.bF)(a)]),(0,t.eW)("。")]),l,(0,t.Lk)("ol",null,[(0,t.Lk)("li",null,[(0,t.eW)("在无痕模式下打开 "),(0,t.Lk)("a",i,[(0,t.eW)("https://m.jd.com/"),(0,t.bF)(a)]),(0,t.eW)(" 网站,并登录账户。")]),r,c,p]),u])}]]),k=JSON.parse('{"path":"/services/dockers-on-nas/qinglong.html","title":"青龙面板:定时任务管理","lang":"zh-CN","frontmatter":{"article":false,"title":"青龙面板:定时任务管理","order":84,"description":"青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)。 配置注意: 在运行脚本之前,请确保已安装所有必要的依赖。 定期运行:0 0 7 * * ? 表示每...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/qinglong.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"青龙面板:定时任务管理"}],["meta",{"property":"og:description","content":"青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)。 配置注意: 在运行脚本之前,请确保已安装所有必要的依赖。 定期运行:0 0 7 * * ? 表示每..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-11-26-06-31-20.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"青龙面板:定时任务管理"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"青龙面板:定时任务管理\\",\\"description\\":\\"青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)。 配置注意: 在运行脚本之前,请确保已安装所有必要的依赖。 定期运行:0 0 7 * * ? 表示每...\\"}"]]},"headers":[{"level":2,"title":"京东 COOKIES","slug":"京东-cookies","link":"#京东-cookies","children":[]}],"git":{"createdTime":1699238582000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.79,"words":537},"filePathRelative":"services/dockers-on-nas/qinglong.md","localizedDate":"2023年11月6日","excerpt":"

    青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/reader.html.f2337dc7.js b/assets/js/reader.html.f2337dc7.js new file mode 100644 index 000000000..be6a7749a --- /dev/null +++ b/assets/js/reader.html.f2337dc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[359],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},6352:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>i,data:()=>c});var s=a(7847);const t={href:"https://github.com/hectorqin/reader",target:"_blank",rel:"noopener noreferrer"},o=(0,s.Fv)('

    reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、EPUB、UMD 和 PDF 格式,以及 RSS 订阅。reader 还提供定时书架更新、并发搜书功能,以及本地书仓,同时支持 Kindle 阅读,满足多样化的阅读需求。

    异常监测

    我设置了数千条书源,导致容器经常报错,几乎每隔几天就会出现提示「点击设置后端接口前缀」。这不仅使 reader 无法正常使用,还会导致 NAS 的 CPU 被疯狂占用,必须重启容器才能恢复正常。

    因此,我使用 Uptime Kuma 监测 reader 后端 http://localhost:8080/reader3/getUserInfo 的运行状态,当异常时就触发 Docker API 执行指定容器的重启命令。值得注意的是,Uptime Kuma 在恢复时也会触发通知,意味着可能会两次重启 reader 容器。如果不希望发生多次重启,可以考虑使用 n8n 来判断状态。

    部署命令

    # https://github.com/hectorqin/reader/blob/master/docker-compose.yml\nversion: "3.1"\nservices:\n  # reader 在线阅读\n  # 公开服务器(服务器位于日本):[https://reader.nxnow.top](https://reader.nxnow.top) 测试账号/密码分别为 guest/guest123,也可自行创建账号添加书源,不定期删除长期未登录账号 (2 周)\n  # 书源集合 : [https://legado.aoaostar.com/](https://legado.aoaostar.com/) 点击打开连接,添加远程书源即可\n  # 公众号汇总 : [https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect)\n  # 手动更新方式 : docker-compose pull && docker-compose up -d\n  reader:\n    image: hectorqin/reader\n    #image: hectorqin/reader:openj9-latest #docker 镜像,arm64 架构或小内存机器优先使用此镜像。启用需删除上一行\n    container_name: reader #容器名 可自行修改\n    restart: always\n    ports:\n      - 4396:8080 #4396 端口映射可自行修改\n    volumes:\n      - /volume1/docker/reader/logs:/logs #log 映射目录 /home/reader/logs 映射目录可自行修改\n      - /volume1/docker/reader/storage:/storage #数据映射目录 /home/reader/storage 映射目录可自行修改\n    environment:\n      - SPRING_PROFILES_ACTIVE=prod\n      - READER_APP_USERLIMIT=10 #用户上限,默认 50\n      - READER_APP_USERBOOKLIMIT=200 #用户书籍上限,默认 200\n      - READER_APP_CACHECHAPTERCONTENT=true #开启缓存章节内容 V2.0\n      # READER_APP_REMOTEWEBVIEWAPI=http://readerwebview:8050 #启用 webview(若下方 readerwebview 容器不开启需注释此行\n      # ↓多用户模式配置↓\n      #- READER_APP_SECURE=true #开启登录鉴权,开启后将支持多用户模式\n      #- READER_APP_SECUREKEY=adminpwd  #管理员密码  建议修改\n      #- READER_APP_INVITECODE=registercode #注册邀请码 建议修改,如不需要可注释或删除\n    # 如需支持 webview 书源,打开 (占用较大,不需要可加 # 注释)\n    #  readerwebview:\n    #    image: hectorqin/remote-webview\n    #    container_name: readerwebview\n    #    restart: always\n    #    environment:\n    #      - TZ=Asia/Shanghai\n    # volumes:\n    #  reader:\n    #  readerwebview:\n

    原本我在 compose 命令中添加 healthcheck,希望当容器 unhealth 时自动重启。但实现起来更加复杂,需要另外使用容器,因此改用 Uptime Kuma 方案。

    # ↓健康检查:当书源较多时,可能隔几天就会出现后端崩溃,会提示「点击设置后端接口前缀」↓\n# ↓此时可通过健康检查重启后端,以解决此问题,如不需要可注释或删除↓\nhealthcheck:\n  test: [\n      "CMD",\n      "wget",\n      "--spider",\n      "-S",\n      "http://localhost:8080/reader3/getUserInfo",\n    ] # 需要检查的健康状态的 URL\n  interval: 10m # 健康检查的间隔时间\n  timeout: 30s # 健康检查的超时时间\n  retries: 3 # 健康检查失败后的重试次数\n
    ',8),p={},i=(0,a(3671).A)(p,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("reader"),(0,s.bF)(a)]),(0,s.eW)(" 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。")]),o])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/reader.html","title":"Reader:小说/书籍阅读","lang":"zh-CN","frontmatter":{"article":false,"title":"Reader:小说/书籍阅读","order":11,"description":"reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。 reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/reader.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Reader:小说/书籍阅读"}],["meta",{"property":"og:description","content":"reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。 reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Reader:小说/书籍阅读\\",\\"description\\":\\"reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。 reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、...\\"}"]]},"headers":[{"level":2,"title":"异常监测","slug":"异常监测","link":"#异常监测","children":[]},{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1697975314000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":3.03,"words":908},"filePathRelative":"services/dockers-on-nas/reader.md","localizedDate":"2023年10月22日","excerpt":"

    reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。

    \\n

    reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、EPUB、UMD 和 PDF 格式,以及 RSS 订阅。reader 还提供定时书架更新、并发搜书功能,以及本地书仓,同时支持 Kindle 阅读,满足多样化的阅读需求。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/reverse-proxy.html.e268685b.js b/assets/js/reverse-proxy.html.e268685b.js new file mode 100644 index 000000000..d49b2ef4b --- /dev/null +++ b/assets/js/reverse-proxy.html.e268685b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9981],{3671:(n,a)=>{a.A=(n,a)=>{const e=n.__vccOpts||n;for(const[n,s]of a)e[n]=s;return e}},2165:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>m,data:()=>v});var s=e(7847);const t=(0,s.Lk)("p",null,"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。",-1),o=(0,s.Lk)("p",null,"更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备地暴露,极易受到窥探和劫持。通过配置反向代理,所有的传入流量都将被加密处理,有效防止数据被识别和篡改的风险。",-1),p=(0,s.Lk)("p",null,"市面上常见的反向代理工具有多种,包括 Nginx Proxy Manager、nginxWebUI、Caddy 和 Lucky 等。",-1),c=(0,s.Lk)("h2",{id:"nginx-proxy-manager",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#nginx-proxy-manager"},[(0,s.Lk)("span",null,"Nginx Proxy Manager")])],-1),i={href:"https://github.com/jlesage/docker-nginx-proxy-manager",target:"_blank",rel:"noopener noreferrer"},l={href:"https://www.nginxwebui.cn/product.html",target:"_blank",rel:"noopener noreferrer"},r=(0,s.Fv)('

    下面是通过 Docker 部署 Nginx Proxy Manager 的配置文件:

    version: "3.8"\nservices:\n  app:\n    image: "jlesage/nginx-proxy-manager:latest"\n    container_name: nginx-proxy-manager\n    restart: unless-stopped\n    ports:\n      - "9001:8080"\n      - "9002:8181"\n      - "9003:4443"\n    volumes:\n      - /volume1/docker/nginx-proxy-manager/config:/config\n

    要访问管理后台,请前往 localhost:9002。默认的登录账户是 admin@example.com,密码是 changeme。系统会在你首次登录时提示你更改这些凭证。

    部署了反向代理后,只需要在路由器上开放 9003 端口(或你自定义的其他端口),就可以实现流量的转发,无需在公网上开放其他端口。你可以通过 CNAME 记录,将自定义域名 xxx.newzone.top 解析到你的家庭 DDNS 域名 yyy.newzone.top。这样,通过访问 xxx.newzone.top:9003,你就能直接访问指定的服务,并享受到自动部署的 SSL 加密带来的安全保护。若需要切换至其他服务,只需更改域名 xxx.newzone.top 中的 xxx 部分即可。

    Caddy

    ',5),d={href:"https://caddyserver.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,s.Fv)('

    以下是通过 Docker 部署 Caddy 的配置文件:

    version: "3.9"\n\nservices:\n  caddy:\n    image: caddy:latest\n    container_name: caddy\n    restart: unless-stopped\n    ports:\n      - "9080:80"\n      - "9443:443"\n      - "9443:443/udp"\n    volumes:\n      - /volume1/docker/caddy/Caddyfile:/etc/caddy/Caddyfile\n      - /volume1/docker/caddy/site:/srv\n      - /volume1/docker/caddy/caddy_data:/data\n      - /volume1/docker/caddy/caddy_config:/config\n\nvolumes:\n  caddy_data:\n  caddy_config:\n

    通过上述配置,无论是 Nginx Proxy Manager 还是 Caddy,你都可以轻松地部署和管理你的反向代理服务。这将为你的网络环境提供更高的数据安全性和便捷的访问管理。希望这些信息能帮助你更好地利用反向代理技术,为你的网络环境带来显著的改善。如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',3),k={},m=(0,e(3671).A)(k,[["render",function(n,a){const e=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,o,p,c,(0,s.Lk)("p",null,[(0,s.Lk)("a",i,[(0,s.eW)("Nginx Proxy Manager"),(0,s.bF)(e)]),(0,s.eW)(" 提供了一个的图形界面,方便用户管理反向代理和 SSL 证书。它的 SSL 证书有效期长达三个月,并支持自动续期。由于国内家用宽带常常不支持开放 80 和 443 端口,所以这里推荐使用一个修改版的 Nginx Proxy Manager 而非官方容器,同时也不建议使用 Caddy。如果你对 Nginx Proxy Manager 还不够熟悉,也可以尝试使用国内开发的 "),(0,s.Lk)("a",l,[(0,s.eW)("nginxWebUI"),(0,s.bF)(e)]),(0,s.eW)(",它也提供了图形化配置、SSL 证书申请和自动续签等功能。")]),r,(0,s.Lk)("p",null,[(0,s.Lk)("a",d,[(0,s.eW)("Caddy"),(0,s.bF)(e)]),(0,s.eW)(" 提供了更为简便的配置方法。但要注意,Caddy v2 默认使用 http-01 方式申请 HTTPS 证书,这要求你的域名能够通过公网的 80/443 端口进行所有权验证。在国内环境下,你可能需要手动配置证书。可以选择通过 Certbot 免费申请证书,或在阿里云、腾讯云等平台申请有效期为一年的免费证书。")]),u])}]]),v=JSON.parse('{"path":"/services/dockers-on-nas/reverse-proxy.html","title":"反向代理:Nginx Proxy Manager","lang":"zh-CN","frontmatter":{"article":false,"title":"反向代理:Nginx Proxy Manager","order":101,"description":"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。 更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/reverse-proxy.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"反向代理:Nginx Proxy Manager"}],["meta",{"property":"og:description","content":"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。 更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"反向代理:Nginx Proxy Manager\\",\\"description\\":\\"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。 更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备...\\"}"]]},"headers":[{"level":2,"title":"Nginx Proxy Manager","slug":"nginx-proxy-manager","link":"#nginx-proxy-manager","children":[]},{"level":2,"title":"Caddy","slug":"caddy","link":"#caddy","children":[]}],"git":{"createdTime":1697975314000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.06,"words":919},"filePathRelative":"services/dockers-on-nas/reverse-proxy.md","localizedDate":"2023年10月22日","excerpt":"

    反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。

    \\n

    更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备地暴露,极易受到窥探和劫持。通过配置反向代理,所有的传入流量都将被加密处理,有效防止数据被识别和篡改的风险。

    \\n

    市面上常见的反向代理工具有多种,包括 Nginx Proxy Manager、nginxWebUI、Caddy 和 Lucky 等。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/runtime~app.2fa689a9.js b/assets/js/runtime~app.2fa689a9.js deleted file mode 100644 index 5a0316f56..000000000 --- a/assets/js/runtime~app.2fa689a9.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,d,c={},f={};function v(e){var a=f[e];if(void 0!==a)return a.exports;var d=f[e]={exports:{}};return c[e].call(d.exports,d,d.exports,v),d.exports}v.m=c,e=[],v.O=(a,d,c,f)=>{if(!d){var b=1/0;for(o=0;o=f)&&Object.keys(v.O).every((e=>v.O[e](d[t])))?d.splice(t--,1):(r=!1,f0&&e[o-1][2]>f;o--)e[o]=e[o-1];e[o]=[d,c,f]},v.d=(e,a)=>{for(var d in a)v.o(a,d)&&!v.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},v.f={},v.e=e=>Promise.all(Object.keys(v.f).reduce(((a,d)=>(v.f[d](e,a),a)),[])),v.u=e=>"assets/js/"+({36:"v-4258a19c",124:"v-0a9d74a3",136:"v-2aea63fe",152:"v-a50cf67c",166:"v-69a00b0f",176:"v-0be839fe",184:"v-b919ccc8",192:"v-108ba214",232:"v-34fd654c",244:"v-c26a570e",328:"v-3efda598",344:"v-5a03be88",403:"v-fb3296c4",404:"v-bfeb58c2",448:"v-069ef9fd",460:"v-022042da",492:"v-30af3c5e",556:"v-2c082b4e",560:"v-8c515568",568:"v-736d0536",608:"v-5913597a",644:"v-191937ff",664:"v-4bc21cfd",744:"v-66489a58",776:"v-7c2d465b",812:"v-4bf743e8",826:"v-28270386",836:"v-e6c5c1c6",872:"v-95c8fd9e",1020:"v-628a0517",1064:"v-4a7cb778",1068:"v-9b85a2a4",1144:"v-782b8506",1176:"v-a02ecba2",1196:"v-34dac248",1272:"v-3b40a9f2",1280:"v-557db29b",1292:"v-702a67e2",1360:"v-81f8b0bc",1364:"v-503218ce",1376:"v-b77903a2",1413:"v-6a6120d9",1424:"v-10f55743",1440:"v-35903398",1460:"v-11e5a304",1536:"v-092b293f",1552:"v-c7695956",1596:"v-570bb59a",1645:"v-6f1d2d4e",1728:"v-18c54fa9",1736:"v-66abecb4",1760:"v-d1668f52",1776:"v-088cabd7",1792:"v-8fd5da28",1795:"v-12177e58",1804:"v-47d43d54",1864:"v-31342f02",1896:"v-b5797626",1990:"v-56c14fab",2024:"v-4727e053",2088:"v-8f0b7818",2112:"v-0c79c2e2",2116:"v-c5c8db72",2120:"v-6d318e63",2128:"v-7d3320d9",2212:"v-b7912e7c",2228:"v-5e1a57da",2264:"v-32ad112a",2332:"v-bda74eee",2360:"v-ec3bd762",2440:"v-40321b0a",2536:"v-dbd4392a",2616:"v-6543b620",2656:"v-47c36a5a",2712:"v-31293c92",2752:"v-b6cc9e1c",2784:"v-ae81e02e",2824:"v-1eed743f",2844:"v-701dd5be",2860:"v-7e077b9c",2954:"v-00f63dc7",2960:"v-3bff2517",3032:"v-78e2ee26",3160:"v-4b427b3c",3196:"v-1ad3199e",3200:"v-f30ed612",3416:"v-00360ae4",3480:"v-7cffd66e",3488:"v-54b35494",3504:"v-32b64024",3532:"v-081f800d",3588:"v-66d50f02",3592:"v-39312d08",3616:"v-cbb79706",3732:"v-1aca676e",3736:"v-340bdea8",3744:"v-ec82d7fc",3792:"v-156dc265",3812:"v-1a1c96e4",3832:"v-7769c050",3837:"v-630f9b2e",3844:"v-3f384648",3896:"v-1134afdd",4080:"v-67b721eb",4108:"v-720c23d0",4194:"v-03ef6dea",4230:"v-4be144ea",4248:"v-5c90ee55",4308:"v-2a81afac",4336:"v-56baa01c",4408:"v-3752ff64",4424:"v-3f4a3f88",4484:"v-5afe12a9",4488:"v-5683c410",4512:"v-713600df",4608:"v-499d466c",4692:"v-33f0e724",4720:"v-48e6ac7f",4812:"v-0fa44838",4852:"v-bc9bd7e8",4892:"v-54ce9744",4904:"v-6e2cc99e",4916:"v-6be6ab1e",4952:"v-fde639ec",4976:"v-071b8439",5018:"v-ae1e0282",5032:"v-8d48f45c",5056:"v-8e386c9e",5092:"v-f8b69964",5102:"v-4f25ad9f",5134:"v-f4530e16",5160:"v-5aa07284",5200:"v-7ef3ba56",5344:"v-cb07523a",5356:"v-4a79ed7c",5420:"v-82d00704",5448:"v-1118f585",5476:"v-1ee1827c",5492:"v-bb40c934",5568:"v-149eb0af",5576:"v-61ea73e9",5640:"v-7434cae5",5648:"v-326c647e",5652:"v-2126384d",5684:"v-21bdad69",5768:"v-763ef4c0",5780:"v-1569e2c7",5790:"v-ba5b3002",5804:"v-5da9d1b4",5815:"v-7cea757f",5840:"v-b3331466",5844:"v-40853dbc",5900:"v-54cbe17e",5912:"v-b7b6f2e4",5974:"v-9b12b53a",6004:"v-5d30aaec",6048:"v-f1c4e7b8",6072:"v-58f0caab",6084:"v-77c93ddc",6132:"v-2c6e0a08",6164:"v-1f3d0304",6216:"v-7996f07b",6224:"v-a5f2e3de",6228:"v-96aea7e0",6292:"v-37458a04",6372:"v-6e29d810",6393:"v-6cd65031",6440:"v-24b1f5a6",6480:"v-67fc9a72",6520:"v-18e64c3c",6596:"v-a636a840",6636:"v-8847cf24",6660:"v-40515911",6704:"v-1c5431f3",6764:"v-06e94a1d",6772:"v-0953b598",6776:"v-6c594482",6808:"v-5b5cc116",6928:"v-280f2817",6952:"v-a97e152e",6980:"v-30d27779",6992:"v-218f58df",7008:"v-2c130d02",7012:"v-7a92d314",7020:"v-3aed4aed",7024:"v-7040d304",7072:"v-7be5f476",7076:"v-446758d0",7164:"v-e973441e",7172:"v-0bd4084a",7204:"v-a797e950",7208:"v-c1ec9846",7240:"v-45706264",7320:"v-243182fe",7364:"v-68effba0",7392:"v-635f6dc4",7408:"v-005f7fcb",7428:"v-ad9f2a7e",7452:"v-4da7cd3a",7456:"v-4c09135e",7476:"v-d52aa9fc",7520:"v-46ecfd3e",7532:"v-92387c24",7658:"v-529fb4eb",7681:"v-13a74989",7696:"v-69734bd3",7698:"v-7311b4a2",7760:"v-d339fac6",7768:"v-589fe9ed",7796:"v-48b702c3",7800:"v-1afc005b",7864:"v-53bc4d08",7873:"v-50add5aa",7916:"v-978f5aae",7924:"v-8a3959e4",7952:"v-04f0edf8",8140:"v-2199ddde",8154:"v-47d9dcc6",8168:"v-637f577e",8192:"v-458137a6",8238:"v-57fec9f0",8288:"v-4fef0bc6",8392:"v-3e8a8459",8533:"v-42cba8ce",8544:"v-2d1b5e52",8648:"v-736a92d8",8688:"v-302172cb",8704:"v-71864650",8748:"v-417265f7",8792:"v-05d1146e",8914:"v-4ec95bbd",8956:"v-da09220e",9e3:"v-752cb4e8",9064:"v-37d18acd",9088:"v-8fe89ed2",9104:"v-46c3500e",9196:"v-bf44e05c",9200:"v-b934e150",9320:"v-a2943f80",9368:"v-7c451a8e",9376:"v-85fca336",9452:"v-4803b024",9480:"v-0b82596b",9514:"v-9c198ab2",9584:"v-d5b24bc2",9620:"v-61875459",9672:"v-25ec7945",9764:"v-2ea7ec13",9832:"v-cf5c357e",9852:"v-2af6a7be"}[e]||e)+"."+{36:"f2943b0c",100:"f1830dd1",124:"0edcbed1",136:"30a11314",152:"ad90dae1",166:"2f2baab2",176:"dc2c07bc",184:"a98f4652",192:"a69d6052",232:"5c854000",244:"f013f6b6",328:"125c1ea8",344:"ae2b8aa2",403:"351af5d7",404:"5043a35e",448:"4ae7ce47",460:"dffe1767",492:"ef122d74",512:"a9650ac0",552:"7a8b81db",556:"f965d118",560:"27d676d8",568:"36c75e18",608:"602547b0",644:"d09b6d7d",664:"014e3244",744:"05a6e0aa",776:"7e0d2817",812:"5a8f2964",826:"6da96475",836:"2909187f",872:"07665c10",940:"57769f50",1020:"cfb3094d",1064:"5bd1704c",1068:"0e4c6390",1144:"7a6d98d7",1176:"de416146",1196:"f158ae28",1256:"89e06b30",1264:"428a569a",1272:"b422a816",1280:"c95a9f8d",1292:"1de7d4dd",1360:"58c26b91",1364:"630bf91c",1376:"feba3eb8",1413:"3a8d7cec",1424:"8a6f98d4",1440:"d85cf15e",1460:"6339dcd8",1500:"1355ae91",1536:"fed4985e",1552:"58a551cc",1596:"5712d533",1600:"2a9b61d9",1645:"1ffadfaf",1728:"c2899cec",1736:"554701e7",1760:"ba363409",1776:"69e9c899",1792:"a4d16856",1795:"ee5f1868",1804:"8017aeff",1864:"3e145544",1868:"3fc0bfe7",1896:"ae5b3cb3",1984:"d1e17a87",1990:"fcada24c",2024:"76a8374f",2088:"5bf4acfb",2112:"a5cbbe30",2116:"32ac8e11",2120:"4000f912",2128:"2e65b5f3",2212:"d7342706",2228:"7f5a7a16",2264:"8db221da",2332:"e7a6b607",2360:"0571e3e2",2388:"29bc0632",2440:"15afef34",2536:"34137317",2616:"51f4a449",2656:"8349e1f0",2712:"b07bc0ff",2736:"76105c4f",2752:"40d1c176",2784:"685cf5f5",2824:"9b1dbaef",2844:"cbb450f3",2860:"19de7d6f",2954:"ae483280",2960:"98f0d50b",3032:"a972a301",3160:"da8bc820",3196:"443fefdd",3200:"ed77da29",3416:"4b2bc452",3480:"99771375",3488:"26479434",3504:"2aacaf55",3532:"5cee2e27",3588:"0bb85d52",3592:"75d8a812",3616:"378b9e22",3732:"5630c089",3736:"df8d140b",3744:"806bb4e5",3792:"87f4c38a",3812:"7fb4e637",3832:"11edb1e8",3837:"6ed181ee",3844:"6a7d5cb5",3896:"35ba9547",4080:"e512fa34",4108:"2e502248",4194:"b941c581",4220:"f43ec42c",4230:"2f4deed8",4248:"1bdb3d4a",4251:"f57b3bf6",4308:"b82922d6",4336:"65427114",4408:"d4e2237a",4424:"7f73008f",4484:"1941852b",4488:"d3b8ba41",4512:"d7c1db1b",4608:"8d40a16c",4637:"562129d2",4680:"97fc384f",4692:"61a19b32",4720:"bf9247c2",4812:"f55c6c57",4852:"a43fed4a",4892:"48805eb8",4904:"82dbdafc",4916:"8adf4cbc",4952:"fbe74b9a",4976:"d4947828",5018:"ef80a344",5032:"6e76dcf8",5056:"6f711922",5092:"3d1c3d0f",5102:"8a90fca3",5134:"57a3c7c4",5160:"397cadeb",5200:"ddee2432",5344:"43397bab",5356:"4300174a",5420:"b759929e",5448:"a438a386",5476:"b90db4fc",5492:"de206c05",5568:"5a69bbf7",5576:"cbc0434a",5640:"288cc8db",5648:"dc9426a4",5652:"9eb18062",5684:"77551573",5768:"77369798",5780:"794607c2",5790:"91ac2d18",5804:"b34e193c",5815:"8c28289b",5840:"ed5d5ae6",5844:"1c284d04",5900:"8286b5c0",5912:"bc828fd7",5974:"15ad3774",6004:"422017a7",6048:"2a98765a",6072:"40c8029b",6084:"4d28556e",6128:"2aff4cb1",6132:"563a4c40",6164:"88097300",6180:"a1af7ebc",6216:"071b57b2",6224:"012f6165",6228:"3d76c0ab",6292:"f2db189c",6336:"823afb19",6372:"a6ce0b2d",6393:"71f19374",6440:"23c9b1dc",6480:"c2c6b6c4",6520:"ccc7ece8",6548:"cb5f8ea6",6596:"b6949704",6636:"3bcac68d",6660:"0377e552",6704:"cd48f769",6764:"9228d79a",6772:"06ca3b98",6776:"6def9096",6808:"a2f40de8",6928:"8c5f7970",6952:"0e56f063",6980:"91096c54",6992:"29a3be1f",7008:"f613758b",7012:"eea44351",7020:"26759791",7024:"3073f626",7072:"28986857",7076:"f3db9df6",7164:"dd6a3a1c",7172:"eea0473f",7204:"31feb1f6",7208:"2ad1118c",7240:"45fc9719",7260:"4f6c839d",7320:"b4972189",7364:"67be698e",7392:"6568f5ee",7408:"ed8658d4",7428:"c7914595",7452:"72fb90f5",7456:"c2927fa6",7476:"b57cf673",7520:"bd03bfee",7532:"02860b45",7658:"2537cc96",7681:"8c5e22ae",7696:"c21386d8",7698:"715c5ab4",7760:"df68050f",7768:"231dbd02",7796:"6a4b6d6e",7800:"0d33790c",7864:"58fc28f8",7873:"ac6fe45a",7916:"9af5667f",7924:"2c9828ab",7952:"c8106776",8140:"8974230b",8154:"5bd8ff26",8168:"68d53df4",8192:"05a8003f",8238:"4e84ffef",8288:"9bf89421",8392:"9e78232f",8533:"8f68a6ed",8544:"85439d5b",8648:"d99e5b22",8688:"5507aed2",8704:"35abe4e2",8748:"53edb51a",8792:"afc727b5",8914:"94784f4e",8956:"975cc90d",9e3:"d82fc291",9060:"96108a11",9064:"094e06bf",9088:"d3850422",9104:"97783b5c",9196:"cf1bd7a3",9200:"496c0c93",9320:"49cee825",9356:"c73f84d0",9368:"825eb7df",9376:"6992a881",9452:"e0dc3918",9480:"3e5b3c71",9514:"42ebbed5",9556:"716cbfad",9584:"280d8912",9620:"c049d599",9672:"59a67f5e",9764:"c8539799",9832:"43ff19ca",9852:"3f69cd3f"}[e]+".js",v.miniCssF=e=>"assets/css/"+e+".styles."+{100:"f1830dd1",6336:"823afb19",9556:"716cbfad"}[e]+".css",v.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),a={},d="learn-data:",v.l=(e,c,f,b)=>{if(a[e])a[e].push(c);else{var r,t;if(void 0!==f)for(var n=document.getElementsByTagName("script"),o=0;o{r.onerror=r.onload=null,clearTimeout(s);var f=a[e];if(delete a[e],r.parentNode&&r.parentNode.removeChild(r),f&&f.forEach((e=>e(c))),d)return d(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),t&&document.head.appendChild(r)}},v.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},v.p="/",(()=>{if("undefined"!=typeof document){var e={4176:0};v.f.miniCss=(a,d)=>{e[a]?d.push(e[a]):0!==e[a]&&{100:1,6336:1,9556:1}[a]&&d.push(e[a]=(e=>new Promise(((a,d)=>{var c=v.miniCssF(e),f=v.p+c;if(((e,a)=>{for(var d=document.getElementsByTagName("link"),c=0;c{var v=document.createElement("link");v.rel="stylesheet",v.type="text/css",v.onerror=v.onload=d=>{if(v.onerror=v.onload=null,"load"===d.type)c();else{var b=d&&d.type,r=d&&d.target&&d.target.href||a,t=new Error("Loading CSS chunk "+e+" failed.\n("+b+": "+r+")");t.name="ChunkLoadError",t.code="CSS_CHUNK_LOAD_FAILED",t.type=b,t.request=r,v.parentNode&&v.parentNode.removeChild(v),f(t)}},v.href=a,document.head.appendChild(v)})(e,f,0,a,d)})))(a).then((()=>{e[a]=0}),(d=>{throw delete e[a],d})))}}})(),(()=>{var e={4176:0,7328:0};v.f.j=(a,d)=>{var c=v.o(e,a)?e[a]:void 0;if(0!==c)if(c)d.push(c[2]);else if(/^((417|633|955)6|100|7328)$/.test(a))e[a]=0;else{var f=new Promise(((d,f)=>c=e[a]=[d,f]));d.push(c[2]=f);var b=v.p+v.u(a),r=new Error;v.l(b,(d=>{if(v.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var f=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;r.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",r.name="ChunkLoadError",r.type=f,r.request=b,c[1](r)}}),"chunk-"+a,a)}},v.O.j=a=>0===e[a];var a=(a,d)=>{var c,f,[b,r,t]=d,n=0;if(b.some((a=>0!==e[a]))){for(c in r)v.o(r,c)&&(v.m[c]=r[c]);if(t)var o=t(v)}for(a&&a(d);n{"use strict";var e,t,l,a={},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var l=r[e]={exports:{}};return a[e].call(l.exports,l,l.exports,o),l.exports}o.m=a,e=[],o.O=(t,l,a,r)=>{if(!l){var h=1/0;for(d=0;d=r)&&Object.keys(o.O).every((e=>o.O[e](l[n])))?l.splice(n--,1):(m=!1,r0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[l,a,r]},o.d=(e,t)=>{for(var l in t)o.o(t,l)&&!o.o(e,l)&&Object.defineProperty(e,l,{enumerable:!0,get:t[l]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,l)=>(o.f[l](e,t),t)),[])),o.u=e=>"assets/js/"+({20:"Docker.html",88:"2018-06-08-baizhuo_gp1700.html",98:"Fitness.html",139:"syncthing.html",201:"2018-05-01-jekyll_blog_on_github_pages.html",349:"paperless-ngx.html",359:"reader.html",486:"Coupon.html",535:"DailyRoutine.html",616:"2022-06-07-blog_md_to_wordpress.html",654:"deeplx.html",665:"2017-04-22-rss_feed43_feedex.html",924:"grocy.html",955:"2017-10-18-light_cat_e8-c-epon_admin.html",960:"2018-05-24-airtable_noob.html",982:"2022-04-20-survivorship_bias_in_shanghai_2022.html",1074:"flare.html",1088:"2018-12-28-voice_input_try.html",1211:"VuePress.html",1371:"gitlab.html",1397:"Maintenance.html",1398:"2_obs_streamfx.html",1471:"2019-10-04-fake_aka_hospital_skin_care_products.html",1571:"uptime-kuma.html",1582:"2018-01-19-forget_the_cdn.html",1597:"logseq.html",1672:"HomeAutomation.html",1734:"feishu.html",1871:"0_live_equipments.html",1944:"screen.html",1946:"2022-05-22-surveillance_video_for_myself.html",1984:"2018-05-04-audition_cut_mp3.html",1989:"2017-04-18-wechat_multi_open.html",2013:"2020-12-17-weight_log.html",2213:"2018-05-02-jekyll_blog_on_vps.html",2302:"Vue.html",2499:"emby.html",2530:"2022-04-21-uivision_rpa.html",2542:"Chrome.html",2658:"2021-01-02-keepass_the_real_lastpassword.html",2705:"2024-01-28-learndata-advanced.html",2707:"2018-05-15-aria2_a_new_download_tool.html",2823:"2018-06-19-iptv_direckly.html",2873:"srs-stack.html",3015:"6_live_positioning.html",3054:"qbittorrent.html",3058:"Python.html",3121:"2020-09-22-uefi_asus_board.html",3146:"2019-04-01-rsshub_noob.html",3309:"toolbox.html",3363:"2021-10-23-nas_with_rsshub_and_huginn.html",3518:"Electron.html",3569:"Markdown.html",3652:"2023-02-27-chatgpt_shortcuts.html",3689:"docsify.html",3753:"2023-09-05-virtual_positioning.html",3759:"2018-03-06-no_more_dinner.html",3834:"2018-06-10-koolproxy_https.html",3912:"intro.html",3984:"nextcloud.html",3986:"2020-11-01-gym_equipment_throw_away.html",4026:"2019-03-31-openvpn_back_to_home.html",4130:"2022-02-19-microsoft_store_fixed.html",4138:"2022-03-17-rss_persistent_link_collection.html",4166:"2017-07-28-office_2016_installer_error.html",4429:"Regex.html",4447:"navidrome.html",4470:"index.html",4474:"Life.html",4523:"newborn.html",4534:"2017-07-29-onenote_2016_cannot_be_logged_in.html",4541:"AutoHotkey.html",4552:"2020-03-25-rsshub_on_vps.html",4732:"2017-10-18-light_cat_port_forwarding.html",4756:"tachidesk.html",4925:"VPS.html",4938:"design.html",4971:"2022-11-18-whisper_ai_subtitles.html",5048:"2022-09-07-extreme_branding_thinking_with_mate50.html",5099:"Huginn.html",5152:"NAS.html",5218:"Comments.html",5219:"CloudServices.html",5260:"2020-11-27-rime_input.html",5377:"DNS.html",5478:"2017-09-02-forced_shutdown.html",5496:"2022-08-10-new_stuff_shaping_machine.html",5581:"json-translate.html",5707:"qinglong.html",5744:"GitHub.html",5781:"5_live_platforms.html",5845:"2022-08-22-learndata_blog_to_knowledge_management.html",5900:"2018-01-31-hire_a_robot.html",5974:"2023-03-31-efficient_morning_5am_club.html",6029:"1_obs_basic.html",6077:"2022-01-23-wechat_lucky_money_cover.html",6262:"faq.html",6405:"grampsjs.html",6586:"4_live_effects.html",6632:"blog.html",6640:"Shoppinglist.html",6749:"3_obs_plugins.html",6762:"2019-08-26-scrcpy_screen_projection.html",6819:"stirling-pdf.html",6831:"Cloudflare.html",6968:"2017-09-03-smb_lan_sharing.html",7085:"2023-10-29-switch-firmware-updates.html",7204:"MySQL.html",7217:"Medical.html",7230:"vscode.html",7270:"Static.html",7418:"n8n.html",7480:"Javascript.html",7481:"Applist.html",7490:"404.html",7541:"HTML.html",7573:"memos.html",7619:"sun-panel.html",7681:"2020-09-13-wifi_speed_up.html",7722:"2018-04-30-baota_deploy_vps.html",7758:"TTRSS.html",7838:"hospital.html",7930:"Diet.html",7949:"ChatGPT.html",8106:"2023-10-07-clone-voice.html",8184:"2020-10-25-dpc_watchdog_violation.html",8245:"2021-05-31-principles_criticism_and_self-criticism.html",8304:"take-kids-out.html",8356:"2022-11-03-ffmpeg_screen_recording.html",8365:"2018-05-03-jekyll_blog_autodeploy.html",8458:"2022-03-21-winget_the_strongest_software_manager_for_windows.html",8685:"QTTabBar.html",9011:"cors-anywhere.html",9022:"2018-10-07-huginn_scraping_any_website.html",9125:"obsidian.html",9187:"mt-photos.html",9366:"2023-01-26-whiteboard_gtd.html",9503:"homarr.html",9522:"power-automate.html",9544:"2021-01-27-blog_jekyll_to_wordpress.html",9600:"photo-swipe",9740:"2022-03-09-lenovo_black_card_member.html",9785:"alist.html",9789:"xiaoya.html",9811:"birthing.html",9836:"2022-09-05-stable_diffusion_ai_painting.html",9973:"NewSystem.html",9981:"reverse-proxy.html"}[e]||e)+"."+{20:"ab3c12d6",88:"391936e7",98:"d7071adb",139:"6e116ccf",201:"eb1491cf",216:"e132ea28",349:"3f824b18",359:"f2337dc7",486:"05f28dae",535:"cf42a51a",616:"16015845",654:"54c9f5b7",665:"ba18839c",924:"37762071",955:"61c954a8",960:"47e55f34",982:"f49a6233",1074:"b0d84ef3",1088:"02451ffb",1211:"e1fe6e2a",1371:"0142fe81",1397:"291d1e9e",1398:"8102d1cf",1471:"87bd501b",1571:"563840f6",1582:"409768d8",1597:"cd8791ac",1672:"c9cf4d80",1734:"329f2283",1798:"85d3b845",1871:"2a489b00",1944:"4ff9f234",1946:"f294b38f",1984:"f7fb941c",1989:"2035deb2",2013:"fe0f7168",2213:"39942719",2302:"ce52eec3",2470:"0dad2d67",2499:"b5faa1db",2530:"0ad3d3fc",2542:"23081631",2626:"28851fe3",2658:"ac1757e2",2705:"56a78250",2707:"a96f6483",2823:"da62fedd",2873:"fa5dea1b",2969:"ee3e32bd",3015:"d0589164",3054:"23e6421e",3058:"1193c5b3",3121:"ca385c07",3146:"41f193c9",3309:"3f9d605a",3363:"938bb0ad",3374:"49ef18b2",3497:"8db8a15e",3518:"1b521f44",3569:"9aa5e8a2",3652:"a3f7f80f",3689:"892a6884",3753:"90007db2",3759:"eadaa685",3834:"240cb93f",3912:"145c2549",3984:"83cb8676",3986:"82a2382a",4026:"23993a69",4130:"68b12af6",4138:"eaa390b4",4166:"a6e09f9d",4221:"c6f56c65",4429:"088e5b67",4447:"1f340343",4470:"b42ea893",4474:"65228ea2",4483:"a777bbcc",4523:"524a974d",4534:"afda6ec4",4541:"e439cc41",4552:"84b3635e",4699:"68e32c06",4732:"baf0948a",4756:"d97b9eb7",4797:"f91b52f2",4925:"2371b596",4938:"32f86e3b",4971:"cbcbd292",5032:"c634363a",5048:"ddc4bf18",5099:"41ddd369",5152:"57bdca8b",5218:"14b4bcb6",5219:"f4d3e963",5260:"67b1f8c3",5377:"e82ab2d3",5478:"3159840b",5496:"7f87fb83",5581:"91b211f3",5699:"b498a9f9",5707:"d38918d6",5744:"6b04544d",5781:"a4598f92",5845:"15f2d2b8",5900:"a00b0658",5974:"5571bb36",6029:"2d92a40d",6077:"7d693f27",6262:"fd19c1f8",6392:"d715ebea",6405:"21c150fa",6459:"c38b1b98",6586:"e04894c9",6632:"9796c6d2",6640:"34df3994",6749:"ef0298a1",6762:"a5e956ae",6819:"c8dbd93c",6831:"37ad33b5",6860:"3e16039e",6968:"6847b5b9",7085:"5bc0da67",7204:"74054250",7217:"8b30b0ad",7230:"44a30585",7270:"d33389c2",7418:"c5fcfa18",7480:"839e60fb",7481:"6b1f9273",7490:"4d6b8dc3",7541:"6b967c87",7573:"c5098f0a",7619:"8cc89385",7637:"bc3d91db",7681:"4160e09c",7722:"547b2f8f",7758:"bd9909f8",7838:"52acd5f2",7930:"3e0aec05",7949:"9133179a",8073:"770c79f3",8106:"cf9a4d51",8184:"429ef16d",8245:"bc1e867f",8304:"13efc275",8356:"4fbc2c48",8365:"d9214630",8458:"0b8a7f7c",8685:"72a288b7",8766:"7a276eed",9011:"b7c4123e",9022:"2cf1b212",9125:"0c68f245",9155:"4f288999",9187:"17edb869",9366:"18799b75",9437:"9bd3b8b3",9503:"8f88149b",9522:"7640a0c4",9544:"0697638c",9600:"2a81417f",9701:"b24d9e9c",9713:"b0d82988",9740:"d4d39c02",9785:"f7028c2e",9789:"92295452",9811:"ca2afc3e",9836:"25652bff",9973:"a5bbda73",9981:"e268685b"}[e]+".js",o.miniCssF=e=>"assets/css/"+e+".styles."+{3374:"49ef18b2",4483:"a777bbcc",6392:"d715ebea"}[e]+".css",o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),t={},l="learn-data:",o.l=(e,a,r,h)=>{if(t[e])t[e].push(a);else{var m,n;if(void 0!==r)for(var i=document.getElementsByTagName("script"),d=0;d{m.onerror=m.onload=null,clearTimeout(f);var r=t[e];if(delete t[e],m.parentNode&&m.parentNode.removeChild(m),r&&r.forEach((e=>e(a))),l)return l(a)},f=setTimeout(c.bind(null,void 0,{type:"timeout",target:m}),12e4);m.onerror=c.bind(null,m.onerror),m.onload=c.bind(null,m.onload),n&&document.head.appendChild(m)}},o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.p="/",(()=>{if("undefined"!=typeof document){var e={2750:0};o.f.miniCss=(t,l)=>{e[t]?l.push(e[t]):0!==e[t]&&{3374:1,4483:1,6392:1}[t]&&l.push(e[t]=(e=>new Promise(((t,l)=>{var a=o.miniCssF(e),r=o.p+a;if(((e,t)=>{for(var l=document.getElementsByTagName("link"),a=0;a{var o=document.createElement("link");o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=l=>{if(o.onerror=o.onload=null,"load"===l.type)a();else{var h=l&&l.type,m=l&&l.target&&l.target.href||t,n=new Error("Loading CSS chunk "+e+" failed.\n("+h+": "+m+")");n.name="ChunkLoadError",n.code="CSS_CHUNK_LOAD_FAILED",n.type=h,n.request=m,o.parentNode&&o.parentNode.removeChild(o),r(n)}},o.href=t,document.head.appendChild(o)})(e,r,0,t,l)})))(t).then((()=>{e[t]=0}),(l=>{throw delete e[t],l})))}}})(),(()=>{var e={2750:0,1276:0};o.f.j=(t,l)=>{var a=o.o(e,t)?e[t]:void 0;if(0!==a)if(a)l.push(a[2]);else if(/^(1276|2750|3374|4483|6392)$/.test(t))e[t]=0;else{var r=new Promise(((l,r)=>a=e[t]=[l,r]));l.push(a[2]=r);var h=o.p+o.u(t),m=new Error;o.l(h,(l=>{if(o.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var r=l&&("load"===l.type?"missing":l.type),h=l&&l.target&&l.target.src;m.message="Loading chunk "+t+" failed.\n("+r+": "+h+")",m.name="ChunkLoadError",m.type=r,m.request=h,a[1](m)}}),"chunk-"+t,t)}},o.O.j=t=>0===e[t];var t=(t,l)=>{var a,r,[h,m,n]=l,i=0;if(h.some((t=>0!==e[t]))){for(a in m)o.o(m,a)&&(o.m[a]=m[a]);if(n)var d=n(o)}for(t&&t(l);i{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},8304:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var n=a(3968);const i=[(0,n.IL)('

    如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。

    此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。

    HDR

    标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。

    HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。启用 HDR 通常会导致对比度、亮度和颜色范围的调整。这可能导致不同屏幕之间的视觉差异,因为每个屏幕可能具有不同的硬件和校准设置。

    低蓝光模式

    低蓝光模式会降低蓝光,通常会导致显示器呈现较暖的颜色。这可能使一些颜色看起来稍微发黄或偏红。

    校色仪器

    校色仪器的唯一功能是校色,不同仪器的主要差异在于校色的精准度,主要品牌有红蜘蛛和爱色丽。校色仪器的使用频率较低,建议租赁使用。以下说明来自租赁卖家,真实性尚未确定。

    • 目前一般选用主流的红蜘蛛 X,支持当下主流屏幕技术,对色彩要求高的用的较多。如果屏幕支持 HDR(HDR1000 以上),建议选择红蜘蛛 X2 Ultra 或爱色丽 Plus。多屏幕颜色统一使用红蜘蛛。
    • 红蜘蛛具有全面的屏幕分析能力,可以测量色域等,而爱色丽没有这些功能。红蜘蛛 X 旗舰版大幅提高了校色精准度,X 系列支持 P3 色域。红蜘蛛 X2 Ultra 增加了对 HDR 的支持。多屏幕颜色统一使用红蜘蛛。红 X2 系列是 2023 年,红 X 是 2019 年,红 5+ 红 5 是 2015 年。
    • 如果是在开启低蓝光模式下进行校色,色彩无法被正确校准。

    校色配置

    在校正之后,请确保备份 ICC 校色配置文件。在 Windows 系统下,校色文件位于 C:\\Windows\\System32\\spool\\drivers\\color。可以通过系统自带的「颜色管理」设置进行操作。

    1. 下拉选择要设置的显示器,勾选「使用我对此设备的设置」,添加校色文件并将其设为默认配置文件。

      图示
      图示
    2. 点击上方的「高级」选项卡,勾选「使用 Windows 显示器校准」。

      图示
      图示
    3. 如果已经勾选了「使用 Windows 显示器校准」,则无需进行操作。如果无法勾选,处于灰色状态,可以进入左下角的「更改系统默认值」,进入后在同一位置打上勾(无需更改其他设置)。

    完成以上操作后,即可卸载 Spyder 等校色软件。即使系统重装,也只需导入校色配置即可获得标准颜色。

    ',14)],o={},r=(0,a(9720).c)(o,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div",null,i)}]]),p=JSON.parse('{"path":"/windows/screen.html","title":"显示屏","lang":"zh-CN","frontmatter":{"article":false,"title":"显示屏","icon":"compare","order":3,"description":"如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。 此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。 HDR 标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。 HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/screen.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"显示屏"}],["meta",{"property":"og:description","content":"如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。 此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。 HDR 标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。 HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-07-14-34-37.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"显示屏"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"显示屏\\",\\"description\\":\\"如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。 此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。 HDR 标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。 HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。...\\"}"]]},"headers":[{"level":2,"title":"HDR","slug":"hdr","link":"#hdr","children":[]},{"level":2,"title":"低蓝光模式","slug":"低蓝光模式","link":"#低蓝光模式","children":[]},{"level":2,"title":"校色仪器","slug":"校色仪器","link":"#校色仪器","children":[]},{"level":2,"title":"校色配置","slug":"校色配置","link":"#校色配置","children":[]}],"git":{"createdTime":1704206480000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.59,"words":776},"filePathRelative":"windows/screen.md","localizedDate":"2024年1月2日","excerpt":"

    如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。

    \\n

    此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。

    \\n

    HDR

    \\n
    \\n

    标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。

    \\n
    \\n

    HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。启用 HDR 通常会导致对比度、亮度和颜色范围的调整。这可能导致不同屏幕之间的视觉差异,因为每个屏幕可能具有不同的硬件和校准设置。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1944],{3671:(e,t)=>{t.A=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5933:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var n=a(7847);const i=[(0,n.Fv)('

    如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。

    此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。

    HDR

    标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。

    HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。启用 HDR 通常会导致对比度、亮度和颜色范围的调整。这可能导致不同屏幕之间的视觉差异,因为每个屏幕可能具有不同的硬件和校准设置。

    低蓝光模式

    低蓝光模式会降低蓝光,通常会导致显示器呈现较暖的颜色。这可能使一些颜色看起来稍微发黄或偏红。

    校色仪器

    校色仪器的唯一功能是校色,不同仪器的主要差异在于校色的精准度,主要品牌有红蜘蛛和爱色丽。校色仪器的使用频率较低,建议租赁使用。以下说明来自租赁卖家,真实性尚未确定。

    • 目前一般选用主流的红蜘蛛 X,支持当下主流屏幕技术,对色彩要求高的用的较多。如果屏幕支持 HDR(HDR1000 以上),建议选择红蜘蛛 X2 Ultra 或爱色丽 Plus。多屏幕颜色统一使用红蜘蛛。
    • 红蜘蛛具有全面的屏幕分析能力,可以测量色域等,而爱色丽没有这些功能。红蜘蛛 X 旗舰版大幅提高了校色精准度,X 系列支持 P3 色域。红蜘蛛 X2 Ultra 增加了对 HDR 的支持。多屏幕颜色统一使用红蜘蛛。红 X2 系列是 2023 年,红 X 是 2019 年,红 5+ 红 5 是 2015 年。
    • 如果是在开启低蓝光模式下进行校色,色彩无法被正确校准。

    校色配置

    在校正之后,请确保备份 ICC 校色配置文件。在 Windows 系统下,校色文件位于 C:\\Windows\\System32\\spool\\drivers\\color。可以通过系统自带的「颜色管理」设置进行操作。

    1. 下拉选择要设置的显示器,勾选「使用我对此设备的设置」,添加校色文件并将其设为默认配置文件。

      图示
      图示
    2. 点击上方的「高级」选项卡,勾选「使用 Windows 显示器校准」。

      图示
      图示
    3. 如果已经勾选了「使用 Windows 显示器校准」,则无需进行操作。如果无法勾选,处于灰色状态,可以进入左下角的「更改系统默认值」,进入后在同一位置打上勾(无需更改其他设置)。

    完成以上操作后,即可卸载 Spyder 等校色软件。即使系统重装,也只需导入校色配置即可获得标准颜色。

    ',14)],o={},r=(0,a(3671).A)(o,[["render",function(e,t){return(0,n.uX)(),(0,n.CE)("div",null,i)}]]),p=JSON.parse('{"path":"/windows/screen.html","title":"显示屏","lang":"zh-CN","frontmatter":{"article":false,"title":"显示屏","icon":"compare","order":3,"description":"如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。 此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。 HDR 标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。 HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/screen.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"显示屏"}],["meta",{"property":"og:description","content":"如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。 此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。 HDR 标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。 HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-07-14-34-37.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"显示屏"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"显示屏\\",\\"description\\":\\"如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。 此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。 HDR 标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。 HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。...\\"}"]]},"headers":[{"level":2,"title":"HDR","slug":"hdr","link":"#hdr","children":[]},{"level":2,"title":"低蓝光模式","slug":"低蓝光模式","link":"#低蓝光模式","children":[]},{"level":2,"title":"校色仪器","slug":"校色仪器","link":"#校色仪器","children":[]},{"level":2,"title":"校色配置","slug":"校色配置","link":"#校色配置","children":[]}],"git":{"createdTime":1704206480000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.59,"words":776},"filePathRelative":"windows/screen.md","localizedDate":"2024年1月2日","excerpt":"

    如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。

    \\n

    此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。

    \\n

    HDR

    \\n
    \\n

    标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。

    \\n
    \\n

    HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。启用 HDR 通常会导致对比度、亮度和颜色范围的调整。这可能导致不同屏幕之间的视觉差异,因为每个屏幕可能具有不同的硬件和校准设置。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8d48f45c.6e76dcf8.js b/assets/js/srs-stack.html.fa5dea1b.js similarity index 91% rename from assets/js/v-8d48f45c.6e76dcf8.js rename to assets/js/srs-stack.html.fa5dea1b.js index b629ae2fc..3415da4b2 100644 --- a/assets/js/v-8d48f45c.6e76dcf8.js +++ b/assets/js/srs-stack.html.fa5dea1b.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5032],{9720:(n,a)=>{a.c=(n,a)=>{const s=n.__vccOpts||n;for(const[n,t]of a)s[n]=t;return s}},7880:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>o,data:()=>r});var t=s(3968);const e={href:"https://github.com/ossrs/srs-stack",target:"_blank",rel:"noopener noreferrer"},c=(0,t.IL)('

    在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。

    目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多平台统一转播。这样一来,我能够节省上行带宽,同时避免客户端推送多路流。然而,需要注意的是,SRS Stack 目前仅支持最多同时进行三个平台的转播。如果你需要更多平台,可以运行多个实例。

    version: "3"\nservices:\n  srs-stack:\n    image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs-stack:5\n    container_name: srs-stack\n    volumes:\n      - /volume1/docker/srs-stack/data:/data\n    ports:\n      - 23322:2022\n      - 23323:2443\n      - 1935:1935\n      - 8000:8000/udp\n      - 10080:10080/udp\n    restart: always\n
    ',3),p={},o=(0,s(9720).c)(p,[["render",function(n,a){const s=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[(0,t.QD)("p",null,[(0,t.mY)("SRS 是一个免费开源的实时视频服务器应用,通过 "),(0,t.QD)("a",e,[(0,t.mY)("SRS Stack"),(0,t.K2)(s)]),(0,t.mY)(" 能够轻松在多平台上进行简单高效的直播同步推流部署。")]),c])}]]),r=JSON.parse('{"path":"/services/dockers-on-nas/srs-stack.html","title":"SRS Stack:直播推流","lang":"zh-CN","frontmatter":{"article":false,"title":"SRS Stack:直播推流","order":83,"description":"SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。 在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。 目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/srs-stack.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"SRS Stack:直播推流"}],["meta",{"property":"og:description","content":"SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。 在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。 目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"SRS Stack:直播推流\\",\\"description\\":\\"SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。 在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。 目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多...\\"}"]]},"headers":[],"git":{"createdTime":1701779050000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.82,"words":246},"filePathRelative":"services/dockers-on-nas/srs-stack.md","localizedDate":"2023年12月5日","excerpt":"

    SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。

    \\n

    在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。

    \\n

    目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多平台统一转播。这样一来,我能够节省上行带宽,同时避免客户端推送多路流。然而,需要注意的是,SRS Stack 目前仅支持最多同时进行三个平台的转播。如果你需要更多平台,可以运行多个实例。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2873],{3671:(n,a)=>{a.A=(n,a)=>{const s=n.__vccOpts||n;for(const[n,t]of a)s[n]=t;return s}},8155:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>o,data:()=>r});var t=s(7847);const e={href:"https://github.com/ossrs/srs-stack",target:"_blank",rel:"noopener noreferrer"},c=(0,t.Fv)('

    在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。

    目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多平台统一转播。这样一来,我能够节省上行带宽,同时避免客户端推送多路流。然而,需要注意的是,SRS Stack 目前仅支持最多同时进行三个平台的转播。如果你需要更多平台,可以运行多个实例。

    version: "3"\nservices:\n  srs-stack:\n    image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs-stack:5\n    container_name: srs-stack\n    volumes:\n      - /volume1/docker/srs-stack/data:/data\n    ports:\n      - 23322:2022\n      - 23323:2443\n      - 1935:1935\n      - 8000:8000/udp\n      - 10080:10080/udp\n    restart: always\n
    ',3),p={},o=(0,s(3671).A)(p,[["render",function(n,a){const s=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("p",null,[(0,t.eW)("SRS 是一个免费开源的实时视频服务器应用,通过 "),(0,t.Lk)("a",e,[(0,t.eW)("SRS Stack"),(0,t.bF)(s)]),(0,t.eW)(" 能够轻松在多平台上进行简单高效的直播同步推流部署。")]),c])}]]),r=JSON.parse('{"path":"/services/dockers-on-nas/srs-stack.html","title":"SRS Stack:直播推流","lang":"zh-CN","frontmatter":{"article":false,"title":"SRS Stack:直播推流","order":83,"description":"SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。 在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。 目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/srs-stack.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"SRS Stack:直播推流"}],["meta",{"property":"og:description","content":"SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。 在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。 目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"SRS Stack:直播推流\\",\\"description\\":\\"SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。 在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。 目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多...\\"}"]]},"headers":[],"git":{"createdTime":1701779050000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.82,"words":246},"filePathRelative":"services/dockers-on-nas/srs-stack.md","localizedDate":"2023年12月5日","excerpt":"

    SRS 是一个免费开源的实时视频服务器应用,通过 SRS Stack 能够轻松在多平台上进行简单高效的直播同步推流部署。

    \\n

    在我的日常工作和学习中,我通常会开启直播,但如果推送多路流,会对上传带宽造成较大压力。通过使用 SRS Stack,这个问题得到了解决。

    \\n

    目前,我将电脑上的 OBS 推流到 NAS 上的 SRS Stack,然后在 NAS 上进行多平台统一转播。这样一来,我能够节省上行带宽,同时避免客户端推送多路流。然而,需要注意的是,SRS Stack 目前仅支持最多同时进行三个平台的转播。如果你需要更多平台,可以运行多个实例。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/stirling-pdf.html.c8dbd93c.js b/assets/js/stirling-pdf.html.c8dbd93c.js new file mode 100644 index 000000000..f7238fb94 --- /dev/null +++ b/assets/js/stirling-pdf.html.c8dbd93c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6819],{3671:(n,e)=>{e.A=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},9999:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>r,data:()=>l});var a=t(7847);const s={href:"https://github.com/Stirling-Tools/Stirling-PDF",target:"_blank",rel:"noopener noreferrer"},i=(0,a.Fv)('

    部署命令

    version: '3.3'\nservices:\n  stirling-pdf:\n    image: frooodle/s-pdf:latest\n    ports:\n      - '7581:8080'\n    volumes:\n      #- /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata #Required for extra OCR languages\n      - /volume1/docker/s-pdf/configs:/configs\n      #- /location/of/customFiles:/customFiles/\n      #- /location/of/logs:/logs/\n    environment:\n      - DOCKER_ENABLE_SECURITY=false\n
    ',3),o={},r=(0,t(3671).A)(o,[["render",function(n,e){const t=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",s,[(0,a.eW)("Stirling-PDF"),(0,a.bF)(t)]),(0,a.eW)(" 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。")]),i])}]]),l=JSON.parse('{"path":"/services/dockers-on-nas/stirling-pdf.html","title":"Stirling-PDF:开源 PDF 处理工具","lang":"zh-CN","frontmatter":{"article":false,"title":"Stirling-PDF:开源 PDF 处理工具","order":31,"description":"Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。 部署命令 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/stirling-pdf.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Stirling-PDF:开源 PDF 处理工具"}],["meta",{"property":"og:description","content":"Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。 部署命令 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2024-01-16-02-15-55.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Stirling-PDF:开源 PDF 处理工具"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Stirling-PDF:开源 PDF 处理工具\\",\\"description\\":\\"Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。 部署命令 \\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1699754870000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.39,"words":118},"filePathRelative":"services/dockers-on-nas/stirling-pdf.md","localizedDate":"2023年11月12日","excerpt":"

    Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/sun-panel.html.8cc89385.js b/assets/js/sun-panel.html.8cc89385.js new file mode 100644 index 000000000..5c2b8d1fd --- /dev/null +++ b/assets/js/sun-panel.html.8cc89385.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7619],{3671:(n,e)=>{e.A=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},468:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>r,data:()=>u});var s=a(7847);const t={href:"https://github.com/hslr-s/sun-panel",target:"_blank",rel:"noopener noreferrer"},l={href:"https://hslr-s.github.io/sun-panel-tool-page/#/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Fv)('

    部署代码

    version: "3.2"\n\nservices:\n  sun-panel:\n    image: "hslr/sun-panel:latest"\n    container_name: sun-panel\n    volumes:\n      - /volume1/docker/sun-panel/conf:/app/conf\n      - /volume1/docker/sun-panel/uploads:/app/uploads\n      - /volume1/docker/sun-panel/database:/app/database\n    ports:\n      - 7580:3002\n    restart: always\n
    ',2),o={},r=(0,a(3671).A)(o,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("Sun-Panel"),(0,s.bF)(a)]),(0,s.eW)(" 与 Homarr 相比,样式与功能都要简单许多。")]),(0,s.Lk)("p",null,[(0,s.eW)("不过 Sun-Panel 有 "),(0,s.Lk)("a",l,[(0,s.eW)("浏览器书签转换工具"),(0,s.bF)(a)]),(0,s.eW)(",可以将书签批量导入 Sun Panel。")]),p])}]]),u=JSON.parse('{"path":"/services/dockers-on-nas/sun-panel.html","title":"Sun-Panel:简化导航页","lang":"zh-CN","frontmatter":{"article":false,"title":"Sun-Panel:简化导航页","order":92,"description":"Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。 不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。 部署代码 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/sun-panel.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Sun-Panel:简化导航页"}],["meta",{"property":"og:description","content":"Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。 不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。 部署代码 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Sun-Panel:简化导航页\\",\\"description\\":\\"Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。 不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。 部署代码 \\"}"]]},"headers":[{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1705346129000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":0.32,"words":97},"filePathRelative":"services/dockers-on-nas/sun-panel.md","localizedDate":"2024年1月15日","excerpt":"

    Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。

    \\n

    不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。

    \\n

    部署代码

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/syncthing.html.6e116ccf.js b/assets/js/syncthing.html.6e116ccf.js new file mode 100644 index 000000000..89a4eb2c3 --- /dev/null +++ b/assets/js/syncthing.html.6e116ccf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[139],{3671:(n,s)=>{s.A=(n,s)=>{const t=n.__vccOpts||n;for(const[n,a]of s)t[n]=a;return t}},5266:(n,s,t)=>{t.r(s),t.d(s,{comp:()=>p,data:()=>o});var a=t(7847);const e={href:"https://github.com/syncthing/syncthing",target:"_blank",rel:"noopener noreferrer"},c=(0,a.Fv)('

    Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 PC 端,无法在手机端同步,只能在需要查看文件时手动点击下载;而坚果云在手机端即使设置了离线收藏,下载的文件也存储在内部空间,其他应用无法访问。相比之下,Syncthing 默认将文件夹同步到本地,而非按需下载。如果你不希望将文件托管到第三方,或者需要在多个设备之间同步文件,Syncthing 是个不错的选择。

    version: "3"\nservices:\n  syncthing:\n    image: syncthing/syncthing\n    container_name: syncthing\n    hostname: my-syncthing\n    environment:\n      - PUID=1026\n      - PGID=100\n    volumes:\n      - /volume1/docker/syncthing/appdata:/var/syncthing\n    ports:\n      - 9040:8384 # Web UI\n      - 22000:22000/tcp # TCP file transfers\n      - 22000:22000/udp # QUIC file transfers\n      - 21027:21027/udp # Receive local discovery broadcasts\n    restart: unless-stopped\n

    由于我对文件实时同步的需求较小,也不需要版本控制,目前并未使用 Syncthing。相反,我将本地文件按天同步到 NAS,并随后在 Nextcloud 上进行在线文档编辑。

    ',3),i={},p=(0,t(3671).A)(i,[["render",function(n,s){const t=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("p",null,[(0,a.Lk)("a",e,[(0,a.eW)("Syncthing"),(0,a.bF)(t)]),(0,a.eW)(" 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。")]),c])}]]),o=JSON.parse('{"path":"/services/dockers-on-nas/syncthing.html","title":"Syncthing:私人同步盘","lang":"zh-CN","frontmatter":{"article":false,"title":"Syncthing:私人同步盘","order":21,"description":"Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。 Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 P...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/syncthing.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Syncthing:私人同步盘"}],["meta",{"property":"og:description","content":"Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。 Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 P..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Syncthing:私人同步盘\\",\\"description\\":\\"Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。 Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 P...\\"}"]]},"headers":[],"git":{"createdTime":1699754870000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.22,"words":365},"filePathRelative":"services/dockers-on-nas/syncthing.md","localizedDate":"2023年11月12日","excerpt":"

    Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。

    \\n

    Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 PC 端,无法在手机端同步,只能在需要查看文件时手动点击下载;而坚果云在手机端即使设置了离线收藏,下载的文件也存储在内部空间,其他应用无法访问。相比之下,Syncthing 默认将文件夹同步到本地,而非按需下载。如果你不希望将文件托管到第三方,或者需要在多个设备之间同步文件,Syncthing 是个不错的选择。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8e386c9e.6f711922.js b/assets/js/tachidesk.html.d97b9eb7.js similarity index 90% rename from assets/js/v-8e386c9e.6f711922.js rename to assets/js/tachidesk.html.d97b9eb7.js index 6cca8b4b2..6444e67d3 100644 --- a/assets/js/v-8e386c9e.6f711922.js +++ b/assets/js/tachidesk.html.d97b9eb7.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5056],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},6220:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>l,data:()=>d});var s=a(3968);const t={href:"https://github.com/Suwayomi/docker-tachidesk",target:"_blank",rel:"noopener noreferrer"},o=(0,s.QD)("p",null,"开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。",-1),c={href:"https://github.com/tachiyomiorg/tachiyomi",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/Haleydu/Cimoc",target:"_blank",rel:"noopener noreferrer"},r=(0,s.IL)('
    version: "3.7"\nservices:\n  tachidesk-docker:\n    image: ghcr.io/suwayomi/tachidesk:latest\n    container_name: tachidesk-docker\n    environment:\n      - TZ=Asia/Shanghai # Use TZ database name from https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n      - DEBUG=false\n      - BIND_IP=0.0.0.0\n      - BIND_PORT=4567\n      - SOCKS_PROXY_ENABLED=false\n      - DOWNLOAD_AS_CBZ=true\n      #- MAX_PARALLEL_UPDATE=3\n      #- BASIC_AUTH_ENABLED=true\n      #- BASIC_AUTH_USERNAME=manga\n      #- BASIC_AUTH_PASSWORD=hello123\n    volumes:\n      - /volume1/docker/tachidesk:/home/suwayomi/.local/share/Tachidesk\n    ports:\n      - "4567:4567"\n    restart: on-failure:3\n

    你可以将本地的漫画资源导入到路径 /volume1/docker/tachidesk/local。请注意,导入的漫画需要按文件夹分类,并确保图片按文件名排序。

    点击左侧的 Extensions 按钮,点右上角的 Enabled Languages 选项,将其设置为中文源,然后会在页面底部发现中文漫画源。安装好漫画源扩展后,点击左侧的 Sources 按钮,然后选择不同来源的 BROWSE,即可浏览对应源的在线漫画。在线漫画会下载到 /volume1/docker/tachidesk/downloads 目录。安装各类在线漫画源扩展,以便进行在线搜索、阅读和下载漫画。

    ',3),p={},l=(0,a(9720).c)(p,[["render",function(e,n){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("Tachidesk"),(0,s.K2)(a)]),(0,s.mY)(" 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。")]),o,(0,s.QD)("p",null,[(0,s.mY)("如果你仅使用 Android 设备,可以选择使用开源漫画阅读器 "),(0,s.QD)("a",c,[(0,s.mY)("Tachiyomi"),(0,s.K2)(a)]),(0,s.mY)("。如果你需要访问一些老旧漫画作品,还可以考虑使用 "),(0,s.QD)("a",i,[(0,s.mY)("Cimoc"),(0,s.K2)(a)]),(0,s.mY)("。")]),r])}]]),d=JSON.parse('{"path":"/services/dockers-on-nas/tachidesk.html","title":"Tachidesk:漫画聚合阅读器","lang":"zh-CN","frontmatter":{"article":false,"title":"Tachidesk:漫画聚合阅读器","order":12,"description":"Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。 开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extens...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/tachidesk.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Tachidesk:漫画聚合阅读器"}],["meta",{"property":"og:description","content":"Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。 开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extens..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Tachidesk:漫画聚合阅读器\\",\\"description\\":\\"Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。 开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extens...\\"}"]]},"headers":[],"git":{"createdTime":1698433931000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.5,"words":451},"filePathRelative":"services/dockers-on-nas/tachidesk.md","localizedDate":"2023年10月27日","excerpt":"

    Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。

    \\n

    开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4756],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},9068:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>l,data:()=>d});var s=a(7847);const t={href:"https://github.com/Suwayomi/docker-tachidesk",target:"_blank",rel:"noopener noreferrer"},o=(0,s.Lk)("p",null,"开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。",-1),c={href:"https://github.com/tachiyomiorg/tachiyomi",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/Haleydu/Cimoc",target:"_blank",rel:"noopener noreferrer"},r=(0,s.Fv)('
    version: "3.7"\nservices:\n  tachidesk-docker:\n    image: ghcr.io/suwayomi/tachidesk:latest\n    container_name: tachidesk-docker\n    environment:\n      - TZ=Asia/Shanghai # Use TZ database name from https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n      - DEBUG=false\n      - BIND_IP=0.0.0.0\n      - BIND_PORT=4567\n      - SOCKS_PROXY_ENABLED=false\n      - DOWNLOAD_AS_CBZ=true\n      #- MAX_PARALLEL_UPDATE=3\n      #- BASIC_AUTH_ENABLED=true\n      #- BASIC_AUTH_USERNAME=manga\n      #- BASIC_AUTH_PASSWORD=hello123\n    volumes:\n      - /volume1/docker/tachidesk:/home/suwayomi/.local/share/Tachidesk\n    ports:\n      - "4567:4567"\n    restart: on-failure:3\n

    你可以将本地的漫画资源导入到路径 /volume1/docker/tachidesk/local。请注意,导入的漫画需要按文件夹分类,并确保图片按文件名排序。

    点击左侧的 Extensions 按钮,点右上角的 Enabled Languages 选项,将其设置为中文源,然后会在页面底部发现中文漫画源。安装好漫画源扩展后,点击左侧的 Sources 按钮,然后选择不同来源的 BROWSE,即可浏览对应源的在线漫画。在线漫画会下载到 /volume1/docker/tachidesk/downloads 目录。安装各类在线漫画源扩展,以便进行在线搜索、阅读和下载漫画。

    ',3),p={},l=(0,a(3671).A)(p,[["render",function(e,n){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.Lk)("a",t,[(0,s.eW)("Tachidesk"),(0,s.bF)(a)]),(0,s.eW)(" 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。")]),o,(0,s.Lk)("p",null,[(0,s.eW)("如果你仅使用 Android 设备,可以选择使用开源漫画阅读器 "),(0,s.Lk)("a",c,[(0,s.eW)("Tachiyomi"),(0,s.bF)(a)]),(0,s.eW)("。如果你需要访问一些老旧漫画作品,还可以考虑使用 "),(0,s.Lk)("a",i,[(0,s.eW)("Cimoc"),(0,s.bF)(a)]),(0,s.eW)("。")]),r])}]]),d=JSON.parse('{"path":"/services/dockers-on-nas/tachidesk.html","title":"Tachidesk:漫画聚合阅读器","lang":"zh-CN","frontmatter":{"article":false,"title":"Tachidesk:漫画聚合阅读器","order":12,"description":"Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。 开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extens...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/tachidesk.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Tachidesk:漫画聚合阅读器"}],["meta",{"property":"og:description","content":"Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。 开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extens..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Tachidesk:漫画聚合阅读器\\",\\"description\\":\\"Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。 开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extens...\\"}"]]},"headers":[],"git":{"createdTime":1698433931000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.5,"words":451},"filePathRelative":"services/dockers-on-nas/tachidesk.md","localizedDate":"2023年10月27日","excerpt":"

    Tachidesk 是一个免费的开源漫画阅读器,支持在各种客户端上部署,可以方便地订阅并聚合漫画源。为了实现统一的漫画阅读体验和浏览管理,建议将 Tachidesk-Server 部署在 NAS 上,并通过网页端访问以进行漫画阅读,以获得类似应用的操作习惯。

    \\n

    开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-bda74eee.e7a6b607.js b/assets/js/take-kids-out.html.13efc275.js similarity index 94% rename from assets/js/v-bda74eee.e7a6b607.js rename to assets/js/take-kids-out.html.13efc275.js index 869cf9daa..616622ed5 100644 --- a/assets/js/v-bda74eee.e7a6b607.js +++ b/assets/js/take-kids-out.html.13efc275.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2332],{9720:(e,t)=>{t.c=(e,t)=>{const i=e.__vccOpts||e;for(const[e,l]of t)i[e]=l;return i}},2340:(e,t,i)=>{i.r(t),i.d(t,{comp:()=>r,data:()=>p});var l=i(3968);const a=[(0,l.IL)('

    原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。

    外出装备:渔夫帽、耳机、录音笔。

    日常注意

    • 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。
    • 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。
    • 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外玩耍。
    • 婴儿的视觉系统更容易被电视和电子产品所吸引,长期过度使用会对眼睛产生负面影响,建议孩子不要看太多电视和电子产品。
    • 有效外出:每天至少保证 2 小时的户外活动时间,多晒太阳,但要避免太阳直射。远视储备的关键是在于太阳光线的照射,以及宽阔的视野供宝宝眺望。

    其他

    宝宝大了后睡眠时间减少,但阿姨习惯性用摇来让宝宝睡觉。但其实娃只是醒了,过一会就会自然睡,不断的摇反而会让娃无法睡。

    理论:远视储备

    儿童因眼球小、眼轴短,双眼都处于远视状态,且年龄越小,远视度数越大,这种与年龄及生长发育相关的生理性远视,称为“远视储备”。

    保护好远视储备,宝宝就不会近视,不需要年纪小小就戴上近视眼镜。而且远视储备是不可逆的,只要消耗完了就没有了,所以保护远视储备一定要从小开始。

    长远说,如果有远视储备,可以在接下来的生活和工作中减少眼部疲劳和压力,即便是偶尔的高强度用眼,眼睛也始终都能处在一个健康舒服的状态。

    不同年龄儿童生长发育速度不一,生理性远视储备值也不相同,下面为大家提供参考值:

    • 0~3 岁:+3.00D
    • 4~5 岁:+2.00~+2.25D
    • 6~7 岁:+1.75~+2.00D
    • 8~9 岁:+1.25~+1.50D
    • 10~12 岁:+0.50~+1.00D
    • 12 岁以后远视储备趋于 0
    ',12)],n={},r=(0,i(9720).c)(n,[["render",function(e,t){return(0,l.Wz)(),(0,l.An)("div",null,a)}]]),p=JSON.parse('{"path":"/family/baby/take-kids-out.html","title":"溜娃","lang":"zh-CN","frontmatter":{"article":false,"title":"溜娃","order":5,"description":"原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。 外出装备:渔夫帽、耳机、录音笔。 日常注意 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/take-kids-out.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"溜娃"}],["meta",{"property":"og:description","content":"原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。 外出装备:渔夫帽、耳机、录音笔。 日常注意 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"溜娃\\",\\"description\\":\\"原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。 外出装备:渔夫帽、耳机、录音笔。 日常注意 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外...\\"}"]]},"headers":[{"level":2,"title":"日常注意","slug":"日常注意","link":"#日常注意","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"理论:远视储备","slug":"理论-远视储备","link":"#理论-远视储备","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.96,"words":587},"filePathRelative":"family/baby/take-kids-out.md","localizedDate":"2023年12月19日","excerpt":"

    原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。

    \\n

    外出装备:渔夫帽、耳机、录音笔。

    \\n

    日常注意

    \\n
      \\n
    • 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。
    • \\n
    • 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。
    • \\n
    • 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外玩耍。
    • \\n
    • 婴儿的视觉系统更容易被电视和电子产品所吸引,长期过度使用会对眼睛产生负面影响,建议孩子不要看太多电视和电子产品。
    • \\n
    • 有效外出:每天至少保证 2 小时的户外活动时间,多晒太阳,但要避免太阳直射。远视储备的关键是在于太阳光线的照射,以及宽阔的视野供宝宝眺望。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8304],{3671:(e,t)=>{t.A=(e,t)=>{const i=e.__vccOpts||e;for(const[e,l]of t)i[e]=l;return i}},1399:(e,t,i)=>{i.r(t),i.d(t,{comp:()=>r,data:()=>p});var l=i(7847);const a=[(0,l.Fv)('

    原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。

    外出装备:渔夫帽、耳机、录音笔。

    日常注意

    • 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。
    • 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。
    • 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外玩耍。
    • 婴儿的视觉系统更容易被电视和电子产品所吸引,长期过度使用会对眼睛产生负面影响,建议孩子不要看太多电视和电子产品。
    • 有效外出:每天至少保证 2 小时的户外活动时间,多晒太阳,但要避免太阳直射。远视储备的关键是在于太阳光线的照射,以及宽阔的视野供宝宝眺望。

    其他

    宝宝大了后睡眠时间减少,但阿姨习惯性用摇来让宝宝睡觉。但其实娃只是醒了,过一会就会自然睡,不断的摇反而会让娃无法睡。

    理论:远视储备

    儿童因眼球小、眼轴短,双眼都处于远视状态,且年龄越小,远视度数越大,这种与年龄及生长发育相关的生理性远视,称为“远视储备”。

    保护好远视储备,宝宝就不会近视,不需要年纪小小就戴上近视眼镜。而且远视储备是不可逆的,只要消耗完了就没有了,所以保护远视储备一定要从小开始。

    长远说,如果有远视储备,可以在接下来的生活和工作中减少眼部疲劳和压力,即便是偶尔的高强度用眼,眼睛也始终都能处在一个健康舒服的状态。

    不同年龄儿童生长发育速度不一,生理性远视储备值也不相同,下面为大家提供参考值:

    • 0~3 岁:+3.00D
    • 4~5 岁:+2.00~+2.25D
    • 6~7 岁:+1.75~+2.00D
    • 8~9 岁:+1.25~+1.50D
    • 10~12 岁:+0.50~+1.00D
    • 12 岁以后远视储备趋于 0
    ',12)],n={},r=(0,i(3671).A)(n,[["render",function(e,t){return(0,l.uX)(),(0,l.CE)("div",null,a)}]]),p=JSON.parse('{"path":"/family/baby/take-kids-out.html","title":"溜娃","lang":"zh-CN","frontmatter":{"article":false,"title":"溜娃","order":5,"description":"原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。 外出装备:渔夫帽、耳机、录音笔。 日常注意 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/take-kids-out.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"溜娃"}],["meta",{"property":"og:description","content":"原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。 外出装备:渔夫帽、耳机、录音笔。 日常注意 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"溜娃\\",\\"description\\":\\"原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。 外出装备:渔夫帽、耳机、录音笔。 日常注意 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外...\\"}"]]},"headers":[{"level":2,"title":"日常注意","slug":"日常注意","link":"#日常注意","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"理论:远视储备","slug":"理论-远视储备","link":"#理论-远视储备","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.96,"words":587},"filePathRelative":"family/baby/take-kids-out.md","localizedDate":"2023年12月19日","excerpt":"

    原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。

    \\n

    外出装备:渔夫帽、耳机、录音笔。

    \\n

    日常注意

    \\n
      \\n
    • 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。
    • \\n
    • 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。
    • \\n
    • 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外玩耍。
    • \\n
    • 婴儿的视觉系统更容易被电视和电子产品所吸引,长期过度使用会对眼睛产生负面影响,建议孩子不要看太多电视和电子产品。
    • \\n
    • 有效外出:每天至少保证 2 小时的户外活动时间,多晒太阳,但要避免太阳直射。远视储备的关键是在于太阳光线的照射,以及宽阔的视野供宝宝眺望。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-37d18acd.094e06bf.js b/assets/js/toolbox.html.3f9d605a.js similarity index 77% rename from assets/js/v-37d18acd.094e06bf.js rename to assets/js/toolbox.html.3f9d605a.js index d8450504b..f18dc1203 100644 --- a/assets/js/v-37d18acd.094e06bf.js +++ b/assets/js/toolbox.html.3f9d605a.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9064],{9720:(e,r)=>{r.c=(e,r)=>{const t=e.__vccOpts||e;for(const[e,o]of r)t[e]=o;return t}},7496:(e,r,t)=>{t.r(r),t.d(r,{comp:()=>b,data:()=>k});var o=t(3968);const n=(0,o.QD)("p",null,"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。",-1),l={href:"https://github.com/openai/whisper",target:"_blank",rel:"noopener noreferrer"},a={href:"https://github.com/Const-me/Whisper",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/sczhou/CodeFormer",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/mli/autocut",target:"_blank",rel:"noopener noreferrer"},h={href:"https://developer.nvidia.com/cuda-toolkit-archive",target:"_blank",rel:"noopener noreferrer"},s={href:"https://pytorch.org/get-started/locally/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/lllyasviel/style2paints",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/uncle-novel/uncle-novel",target:"_blank",rel:"noopener noreferrer"},u={href:"https://doc.voce.chat/zh-cn/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/komodojp/tinyld",target:"_blank",rel:"noopener noreferrer"},g={href:"https://documate.site/",target:"_blank",rel:"noopener noreferrer"},d={},b=(0,t(9720).c)(d,[["render",function(e,r){const t=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[n,(0,o.QD)("ul",null,[(0,o.QD)("li",null,[(0,o.QD)("a",l,[(0,o.mY)("Whipser"),(0,o.K2)(t)]),(0,o.mY)(":自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。")]),(0,o.QD)("li",null,[(0,o.QD)("a",a,[(0,o.mY)("Whisper Desktop"),(0,o.K2)(t)]),(0,o.mY)(":Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。")]),(0,o.QD)("li",null,[(0,o.QD)("a",i,[(0,o.mY)("CodeFormer"),(0,o.K2)(t)]),(0,o.mY)(":使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。")]),(0,o.QD)("li",null,[(0,o.QD)("a",p,[(0,o.mY)("AutoCut"),(0,o.K2)(t)]),(0,o.mY)(":通过字幕来剪切视频 "),(0,o.QD)("ul",null,[(0,o.QD)("li",null,[(0,o.QD)("a",h,[(0,o.mY)("CUDA Toolkit"),(0,o.K2)(t)]),(0,o.mY)(":CUDA 的工具安装包,将 N 卡用于 AI 模型相关应用。")]),(0,o.QD)("li",null,[(0,o.QD)("a",s,[(0,o.mY)("PyTorch"),(0,o.K2)(t)]),(0,o.mY)(":开源的 Python 机器学习库,用于自然语言处理等应用程序。")])])]),(0,o.QD)("li",null,[(0,o.QD)("a",c,[(0,o.mY)("style2paints"),(0,o.K2)(t)]),(0,o.mY)(":一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。")]),(0,o.QD)("li",null,[(0,o.QD)("a",m,[(0,o.mY)("uncle-novel"),(0,o.K2)(t)]),(0,o.mY)(":一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。")]),(0,o.QD)("li",null,[(0,o.QD)("a",u,[(0,o.mY)("VoceChat"),(0,o.K2)(t)]),(0,o.mY)(":可以部署在网页的轻型客服系统?是否有其他开源选项。")]),(0,o.QD)("li",null,[(0,o.QD)("a",f,[(0,o.mY)("tinyld"),(0,o.K2)(t)]),(0,o.mY)(":一个 JS 库,用来判断一段文字是什么语言(汉语、英语、日语等等)。")]),(0,o.QD)("li",null,[(0,o.QD)("a",g,[(0,o.mY)("Documate"),(0,o.K2)(t)]),(0,o.mY)(":用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。")])])])}]]),k=JSON.parse('{"path":"/apps/toolbox.html","title":"开源工具","lang":"zh-CN","frontmatter":{"article":false,"title":"开源工具","icon":"float","order":2,"description":"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。 Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。 Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/toolbox.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"开源工具"}],["meta",{"property":"og:description","content":"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。 Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。 Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-30T11:57:46.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-30T11:57:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"开源工具\\",\\"description\\":\\"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。 Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。 Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转...\\"}"]]},"headers":[],"git":{"createdTime":1702279579000,"updatedTime":1703937466000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.57,"words":470},"filePathRelative":"apps/toolbox.md","localizedDate":"2023年12月11日","excerpt":"

    开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。

    \\n
      \\n
    • Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。
    • \\n
    • Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。
    • \\n
    • CodeFormer:使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。
    • \\n
    • AutoCut:通过字幕来剪切视频\\n
        \\n
      • CUDA Toolkit:CUDA 的工具安装包,将 N 卡用于 AI 模型相关应用。
      • \\n
      • PyTorch:开源的 Python 机器学习库,用于自然语言处理等应用程序。
      • \\n
      \\n
    • \\n
    • style2paints:一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。
    • \\n
    • uncle-novel:一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。
    • \\n
    • VoceChat:可以部署在网页的轻型客服系统?是否有其他开源选项。
    • \\n
    • tinyld:一个 JS 库,用来判断一段文字是什么语言(汉语、英语、日语等等)。
    • \\n
    • Documate:用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3309],{3671:(e,r)=>{r.A=(e,r)=>{const t=e.__vccOpts||e;for(const[e,o]of r)t[e]=o;return t}},8288:(e,r,t)=>{t.r(r),t.d(r,{comp:()=>f,data:()=>d});var o=t(7847);const n=(0,o.Lk)("p",null,"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。",-1),l={href:"https://github.com/openai/whisper",target:"_blank",rel:"noopener noreferrer"},a={href:"https://github.com/Const-me/Whisper",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/sczhou/CodeFormer",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/mli/autocut",target:"_blank",rel:"noopener noreferrer"},h={href:"https://developer.nvidia.com/cuda-toolkit-archive",target:"_blank",rel:"noopener noreferrer"},s={href:"https://pytorch.org/get-started/locally/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/lllyasviel/style2paints",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/uncle-novel/uncle-novel",target:"_blank",rel:"noopener noreferrer"},m={href:"https://doc.voce.chat/zh-cn/",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/komodojp/tinyld",target:"_blank",rel:"noopener noreferrer"},b={href:"https://documate.site/",target:"_blank",rel:"noopener noreferrer"},g={},f=(0,t(3671).A)(g,[["render",function(e,r){const t=(0,o.g2)("ExternalLinkIcon");return(0,o.uX)(),(0,o.CE)("div",null,[n,(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.Lk)("a",l,[(0,o.eW)("Whipser"),(0,o.bF)(t)]),(0,o.eW)(":自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",a,[(0,o.eW)("Whisper Desktop"),(0,o.bF)(t)]),(0,o.eW)(":Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",i,[(0,o.eW)("CodeFormer"),(0,o.bF)(t)]),(0,o.eW)(":使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",p,[(0,o.eW)("AutoCut"),(0,o.bF)(t)]),(0,o.eW)(":通过字幕来剪切视频 "),(0,o.Lk)("ul",null,[(0,o.Lk)("li",null,[(0,o.Lk)("a",h,[(0,o.eW)("CUDA Toolkit"),(0,o.bF)(t)]),(0,o.eW)(":CUDA 的工具安装包,将 N 卡用于 AI 模型相关应用。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",s,[(0,o.eW)("PyTorch"),(0,o.bF)(t)]),(0,o.eW)(":开源的 Python 机器学习库,用于自然语言处理等应用程序。")])])]),(0,o.Lk)("li",null,[(0,o.Lk)("a",c,[(0,o.eW)("style2paints"),(0,o.bF)(t)]),(0,o.eW)(":一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",u,[(0,o.eW)("uncle-novel"),(0,o.bF)(t)]),(0,o.eW)(":一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",m,[(0,o.eW)("VoceChat"),(0,o.bF)(t)]),(0,o.eW)(":可以部署在网页的轻型客服系统?是否有其他开源选项。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",k,[(0,o.eW)("tinyld"),(0,o.bF)(t)]),(0,o.eW)(":一个 JS 库,用来判断一段文字是什么语言(汉语、英语、日语等等)。")]),(0,o.Lk)("li",null,[(0,o.Lk)("a",b,[(0,o.eW)("Documate"),(0,o.bF)(t)]),(0,o.eW)(":用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。")])])])}]]),d=JSON.parse('{"path":"/apps/toolbox.html","title":"开源工具","lang":"zh-CN","frontmatter":{"article":false,"title":"开源工具","icon":"float","order":2,"description":"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。 Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。 Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/toolbox.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"开源工具"}],["meta",{"property":"og:description","content":"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。 Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。 Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-30T11:57:46.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-30T11:57:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"开源工具\\",\\"description\\":\\"开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。 Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。 Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转...\\"}"]]},"headers":[],"git":{"createdTime":1702279579000,"updatedTime":1703937466000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.57,"words":470},"filePathRelative":"apps/toolbox.md","localizedDate":"2023年12月11日","excerpt":"

    开源工具不仅适用于个人电脑,还可用于项目的前端和后端。此页面将不设使用范围,记录所遇到的使用开源工具。

    \\n
      \\n
    • Whipser:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。
    • \\n
    • Whisper Desktop:Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。
    • \\n
    • CodeFormer:使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。
    • \\n
    • AutoCut:通过字幕来剪切视频\\n
        \\n
      • CUDA Toolkit:CUDA 的工具安装包,将 N 卡用于 AI 模型相关应用。
      • \\n
      • PyTorch:开源的 Python 机器学习库,用于自然语言处理等应用程序。
      • \\n
      \\n
    • \\n
    • style2paints:一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。
    • \\n
    • uncle-novel:一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。
    • \\n
    • VoceChat:可以部署在网页的轻型客服系统?是否有其他开源选项。
    • \\n
    • tinyld:一个 JS 库,用来判断一段文字是什么语言(汉语、英语、日语等等)。
    • \\n
    • Documate:用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7040d304.3073f626.js b/assets/js/uptime-kuma.html.563840f6.js similarity index 92% rename from assets/js/v-7040d304.3073f626.js rename to assets/js/uptime-kuma.html.563840f6.js index 74efe050c..5673c580b 100644 --- a/assets/js/v-7040d304.3073f626.js +++ b/assets/js/uptime-kuma.html.563840f6.js @@ -1 +1 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7024],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},6260:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>o,data:()=>c});var t=a(3968);const s={href:"https://github.com/louislam/uptime-kuma",target:"_blank",rel:"noopener noreferrer"},p=(0,t.IL)('

    虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 webhook 触发其他操作。

    部署命令

    version: "3.8"\n\nservices:\n  uptime-kuma:\n    image: louislam/uptime-kuma:1\n    container_name: uptime-kuma\n    volumes:\n      - /volume1/docker/uptime-kuma/data:/app/data\n      # 用于 Docker 容器监控\n      - /var/run/docker.sock:/var/run/docker.sock\n    ports:\n      - "3001:3001" # <Host Port>:<Container Port>\n    restart: always\n
    ',3),i={},o=(0,a(9720).c)(i,[["render",function(e,n){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[(0,t.QD)("p",null,[(0,t.QD)("a",s,[(0,t.mY)("Uptime Kuma"),(0,t.K2)(a)]),(0,t.mY)(" 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。")]),p])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/uptime-kuma.html","title":"Uptime Kuma:轻量运维监控","lang":"zh-CN","frontmatter":{"article":false,"title":"Uptime Kuma:轻量运维监控","order":82,"description":"Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。 虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 w...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/uptime-kuma.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Uptime Kuma:轻量运维监控"}],["meta",{"property":"og:description","content":"Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。 虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 w..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Uptime Kuma:轻量运维监控\\",\\"description\\":\\"Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。 虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 w...\\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1699238582000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.59,"words":178},"filePathRelative":"services/dockers-on-nas/uptime-kuma.md","localizedDate":"2023年11月6日","excerpt":"

    Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。

    \\n

    虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 webhook 触发其他操作。

    ","autoDesc":true}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1571],{3671:(e,n)=>{n.A=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},4700:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>o,data:()=>c});var t=a(7847);const s={href:"https://github.com/louislam/uptime-kuma",target:"_blank",rel:"noopener noreferrer"},p=(0,t.Fv)('

    虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 webhook 触发其他操作。

    部署命令

    version: "3.8"\n\nservices:\n  uptime-kuma:\n    image: louislam/uptime-kuma:1\n    container_name: uptime-kuma\n    volumes:\n      - /volume1/docker/uptime-kuma/data:/app/data\n      # 用于 Docker 容器监控\n      - /var/run/docker.sock:/var/run/docker.sock\n    ports:\n      - "3001:3001" # <Host Port>:<Container Port>\n    restart: always\n
    ',3),i={},o=(0,a(3671).A)(i,[["render",function(e,n){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("p",null,[(0,t.Lk)("a",s,[(0,t.eW)("Uptime Kuma"),(0,t.bF)(a)]),(0,t.eW)(" 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。")]),p])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/uptime-kuma.html","title":"Uptime Kuma:轻量运维监控","lang":"zh-CN","frontmatter":{"article":false,"title":"Uptime Kuma:轻量运维监控","order":82,"description":"Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。 虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 w...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/uptime-kuma.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Uptime Kuma:轻量运维监控"}],["meta",{"property":"og:description","content":"Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。 虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 w..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Uptime Kuma:轻量运维监控\\",\\"description\\":\\"Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。 虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 w...\\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1699238582000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.59,"words":178},"filePathRelative":"services/dockers-on-nas/uptime-kuma.md","localizedDate":"2023年11月6日","excerpt":"

    Uptime Kuma 是一款轻量级自动化运维监控工具,支持监控 HTTP(s)、TCP、Ping、DNS 记录、推送以及 Steam 游戏服务器的正常运行时间。对于检查特定关键词是否存在于网页中等轻量级监控是足够了。相对于 Check 酱,它的设置更为简单,非常适合用于网页监测服务。

    \\n

    虽然 Uptime Kuma 不能执行后续的自动化,但可以通过 webhook 触发其他操作。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-00360ae4.4b2bc452.js b/assets/js/v-00360ae4.4b2bc452.js deleted file mode 100644 index 8facb9b3f..000000000 --- a/assets/js/v-00360ae4.4b2bc452.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3416],{9720:(n,s)=>{s.c=(n,s)=>{const t=n.__vccOpts||n;for(const[n,a]of s)t[n]=a;return t}},6780:(n,s,t)=>{t.r(s),t.d(s,{comp:()=>p,data:()=>o});var a=t(3968);const e={href:"https://github.com/syncthing/syncthing",target:"_blank",rel:"noopener noreferrer"},c=(0,a.IL)('

    Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 PC 端,无法在手机端同步,只能在需要查看文件时手动点击下载;而坚果云在手机端即使设置了离线收藏,下载的文件也存储在内部空间,其他应用无法访问。相比之下,Syncthing 默认将文件夹同步到本地,而非按需下载。如果你不希望将文件托管到第三方,或者需要在多个设备之间同步文件,Syncthing 是个不错的选择。

    version: "3"\nservices:\n  syncthing:\n    image: syncthing/syncthing\n    container_name: syncthing\n    hostname: my-syncthing\n    environment:\n      - PUID=1026\n      - PGID=100\n    volumes:\n      - /volume1/docker/syncthing/appdata:/var/syncthing\n    ports:\n      - 9040:8384 # Web UI\n      - 22000:22000/tcp # TCP file transfers\n      - 22000:22000/udp # QUIC file transfers\n      - 21027:21027/udp # Receive local discovery broadcasts\n    restart: unless-stopped\n

    由于我对文件实时同步的需求较小,也不需要版本控制,目前并未使用 Syncthing。相反,我将本地文件按天同步到 NAS,并随后在 Nextcloud 上进行在线文档编辑。

    ',3),i={},p=(0,t(9720).c)(i,[["render",function(n,s){const t=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.QD)("a",e,[(0,a.mY)("Syncthing"),(0,a.K2)(t)]),(0,a.mY)(" 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。")]),c])}]]),o=JSON.parse('{"path":"/services/dockers-on-nas/syncthing.html","title":"Syncthing:私人同步盘","lang":"zh-CN","frontmatter":{"article":false,"title":"Syncthing:私人同步盘","order":21,"description":"Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。 Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 P...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/syncthing.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Syncthing:私人同步盘"}],["meta",{"property":"og:description","content":"Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。 Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 P..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Syncthing:私人同步盘\\",\\"description\\":\\"Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。 Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 P...\\"}"]]},"headers":[],"git":{"createdTime":1699754870000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.22,"words":365},"filePathRelative":"services/dockers-on-nas/syncthing.md","localizedDate":"2023年11月12日","excerpt":"

    Syncthing 是一款开源免费的跨平台文件同步工具,基于 P2P 技术实现多设备之间的文件同步。需要注意的是,Syncthing 和微力同步都不能使本地两个文件夹同步。我之前使用免费提供的 GoodSync 来同步同一设备上的文件。

    \\n

    Syncthing 与百度网盘、坚果云等第三方网盘的最大不同在于,它实现了多设备间的实时同步。百度网盘同步仅支持 PC 端,无法在手机端同步,只能在需要查看文件时手动点击下载;而坚果云在手机端即使设置了离线收藏,下载的文件也存储在内部空间,其他应用无法访问。相比之下,Syncthing 默认将文件夹同步到本地,而非按需下载。如果你不希望将文件托管到第三方,或者需要在多个设备之间同步文件,Syncthing 是个不错的选择。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-005f7fcb.ed8658d4.js b/assets/js/v-005f7fcb.ed8658d4.js deleted file mode 100644 index 96fe196e5..000000000 --- a/assets/js/v-005f7fcb.ed8658d4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7408],{9720:(e,s)=>{s.c=(e,s)=>{const a=e.__vccOpts||e;for(const[e,n]of s)a[e]=n;return a}},6876:(e,s,a)=>{a.r(s),a.d(s,{comp:()=>Me,data:()=>We});var n=a(3968);const t={href:"https://v2.vuepress.vuejs.org/zh/guide/getting-started.html",target:"_blank",rel:"noopener noreferrer"},l={href:"https://stackblitz.com/",target:"_blank",rel:"noopener noreferrer"},i=(0,n.QD)("code",null,"https://stackblitz.com/github/用户名/仓库名",-1),o={href:"https://theme-hope.vuejs.press/zh/guide/",target:"_blank",rel:"noopener noreferrer"},c={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"},p={href:"https://theme-hope.vuejs.press/zh/config/style.html",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/vuepress/awesome-vuepress/blob/main/v2.md",target:"_blank",rel:"noopener noreferrer"},u={href:"https://www.npmjs.com/package/vuepress-plugin-helper-live2d",target:"_blank",rel:"noopener noreferrer"},d=(0,n.QD)("h2",{id:"初始配置",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#初始配置"},[(0,n.QD)("span",null,"初始配置")])],-1),k=(0,n.QD)("li",null,[(0,n.mY)("新建文件夹,然后在该路径下运行命令 "),(0,n.QD)("code",null,"pnpm create vuepress-theme-hope docs"),(0,n.mY)("。vuepress-theme-hope 主题的样例文件会存储在该路径下。有时因版本问题,样例运行会报错,此时须用固定版本号来安装依赖环境,终端中输入 "),(0,n.QD)("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"),(0,n.mY)("。")],-1),m=(0,n.QD)("li",null,[(0,n.mY)("执行命令 "),(0,n.QD)("code",null,"pnpm docs:dev"),(0,n.mY)(" 启动样例网站。")],-1),h=(0,n.QD)("code",null,"docs\\.vuepress",-1),b={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress",target:"_blank",rel:"noopener noreferrer"},v=(0,n.QD)("ul",null,[(0,n.QD)("li",null,"config.ts:配置网站环境依赖和网站属性。"),(0,n.QD)("li",null,"sidebar.ts:侧边栏,集合所有文档的目录。"),(0,n.QD)("li",null,"navbar.ts:导航栏,放最常用的文档链接。"),(0,n.QD)("li",null,"theme.ts:对主题和插件进行设置。")],-1),f=(0,n.QD)("li",null,[(0,n.mY)("如果遇到报错,执行命令 "),(0,n.QD)("code",null,"pnpm add vuepress@next vuepress-theme-hope && pnpm i && pnpm up"),(0,n.mY)(" 修复并升级相关依赖包。如果依然有问题,则删除 node_modules 和 lock 文件,执行 "),(0,n.QD)("code",null,"pnpm install && pnpm i && pnpm up"),(0,n.mY)(" 重置依赖包文件。")],-1),g=(0,n.IL)('

    如果遇到错误 [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),D={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/search.html",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/docsearch.html",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://crawler.algolia.com/admin/crawlers/bd9cfb06-0346-4a64-9a1a-8a513f0b7fce/overview",target:"_blank",rel:"noopener noreferrer"},x={href:"https://www.algolia.com/apps/M4EXXEZIEG/dashboard",target:"_blank",rel:"noopener noreferrer"},y=(0,n.QD)("h2",{id:"webpack-打包",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#webpack-打包"},[(0,n.QD)("span",null,"Webpack 打包")])],-1),w=(0,n.QD)("p",null,"从 VuePress 2.0.0-rc.2 版本起,你可以自由选择 Vite 或 Webpack 作为打包工具。使用 Vite 进行打包时,系统会引入时间戳和 hash 值对文件进行重命名。这一机制虽然保证了文件的唯一性,但同时也带来了一个问题:即使没有更新内容,网站的大部分文件在每次生成时也会发生改变。例如,在我的 VuePress 默认配置的笔记网站中,每次服务器部署都需耗费 5 至 15 分钟的宝贵时间。新版的 LearnData 已经默认采用了 Webpack 作为打包工具,因此无需手动切换。",-1),q=(0,n.QD)("p",null,"早期的 VuePress 只支持 Vite 打包。因此,我记录了手动添加 webpack 的方法,作为备用。",-1),E={href:"https://github.com/rockbenben/LearnData/tree/nohashname",target:"_blank",rel:"noopener noreferrer"},_={href:"https://v2.vuepress.vuejs.org/zh/guide/bundler.html",target:"_blank",rel:"noopener noreferrer"},P=(0,n.IL)('
  • 修改 config.ts 的导入设置,将 import { defineUserConfig } from "vuepress" 替换为 import { defineUserConfig } from "@vuepress/cli",将 import { viteBundler } from "@vuepress/bundler-vite" 替换为 import { webpackBundler } from "@vuepress/bundler-webpack"

  • Webpack 环境依赖包安装,并运行服务。

    #组合命令,打包使用 Webpack\npnpm add vuepress@next vuepress-theme-hope && pnpm remove vuepress && pnpm add vuepress-webpack@next sass-loader && pnpm i && pnpm up\n\n#运行在本地服务器\nyarn docs:dev\n

    组合命令也能解决报错,升级相关依赖包。相关命令的分步解释见下方。

    #确保你正在使用最新的 vuepress 和 vuepress-theme-hope 版本\npnpm add vuepress@next vuepress-theme-hope\n\n#更换打包工具,Webpack 需手动下载 sass-loader\npnpm remove vuepress\npnpm add -D vuepress-webpack@next sass-loader\n\n#常用插件:google-analytics,search\npnpm add @vuepress/plugin-google-analytics@next @vuepress/plugin-search@next\n\n#升级当前目录的依赖以确保你的项目只包含单个版本的相关包\npnpm i && pnpm up\n
  • ',2),V={href:"https://github.com/neutrinojs/webpack-chain",target:"_blank",rel:"noopener noreferrer"},z=(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote1"},"[1]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),B=(0,n.QD)("code",null,".filename",-1),K=(0,n.IL)('
    export default defineUserConfig({\n  bundler: webpackBundler({\n    chainWebpack(config) {\n      // do not use chunk hash in js\n      //参照案例:https://github.com/vuepress/vuepress-plugin-named-chunks/blob/b9fb5a1d3475530b1d74b6616f92a6e3bf14a7ed/__tests__/docs/.vuepress/config.js\n      config.output\n        .filename(`[name].js`)\n        .chunkFilename("assets/chunks/[name].js");\n    },\n  }),\n});\n
    ',1),j={href:"https://cli.vuejs.org/config/#vue-config-js",target:"_blank",rel:"noopener noreferrer"},A=(0,n.QD)("code",null,"filenameHashing: false",-1),M=(0,n.QD)("h2",{id:"关闭-prefetch",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#关闭-prefetch"},[(0,n.QD)("span",null,"关闭 prefetch")])],-1),W=(0,n.QD)("p",null,"preload 是一种声明式的资源获取请求方式,用于提前加载一些需要的依赖,并且不会影响页面的 onload 事件。prefetch 是一种利用浏览器的空闲时间加载页面将来可能用到的资源的一种机制;通常可以用于加载非首页的其他页面所需要的资源,以便加快后续页面的首屏速度。preload 主要用于预加载当前页面需要的资源;而 prefetch 主要用于加载将来页面可能需要的资源。",-1),L={href:"https://vuepress.github.io/zh/reference/config.html#build-%E9%85%8D%E7%BD%AE%E9%A1%B9",target:"_blank",rel:"noopener noreferrer"},I=(0,n.QD)("p",null,[(0,n.QD)("code",null,"docs\\.vuepress"),(0,n.mY)(" 路径下的 config.ts 配置中插入 "),(0,n.QD)("code",null,"shouldPrefetch: false,"),(0,n.mY)(",即可关闭 prefetch。")],-1),H=(0,n.QD)("h2",{id:"页面模板",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#页面模板"},[(0,n.QD)("span",null,"页面模板")])],-1),C=(0,n.QD)("p",null,"VuePress 页面生成规则基于主题模板,如果修改全站 html 内容,最简单的方式就是修改模板。",-1),U={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/packages/theme/templates/index.build.html",target:"_blank",rel:"noopener noreferrer"},S=(0,n.IL)('
    import { path } from "@vuepress/utils";\nexport default defineUserConfig({\n  ...\n  templateBuild: path.resolve(__dirname, "index.build.html"),\n});\n

    除修改页面模板外,也可以通过修改 config.ts 配置来添加自定义标签。插入下方代码后,网站所有页面都会在 header 前添入对应代码,其效用等同于 <meta name="keywords" content="关键词,内容标签,相关词"><img referrerpolicy="no-referrer-when-downgrade" src="https://tongji.newzone.top/matomo.php?idsite=7&amp;rec=1" style="border:0" alt="" />

    head: [\n  [\n    "meta",\n    {\n      name: "keywords",\n      content: "关键词,内容标签,相关词",\n    },\n  ],\n  [\n    "img",\n    {\n      referrerpolicy: "no-referrer-when-downgrade",\n      src: "https://tongji.newzone.top/matomo.php?idsite=7&amp;rec=1",\n      style: "border:0",\n      alt: "",\n    },\n  ],\n],\n

    时间参数

    ',4),T={href:"https://plugin-seo2.vuejs.press/zh/guide.html",target:"_blank",rel:"noopener noreferrer"},R=(0,n.QD)("code",null,"og:updated_time",-1),F=(0,n.QD)("code",null,"article:modified_time",-1),N=(0,n.QD)("code",null,"page.git.updatedTime",-1),O=(0,n.QD)("code",null,"theme.ts",-1),G=(0,n.IL)('
    import { seoPlugin } from "vuepress-plugin-seo2";\nexport default defineUserConfig({\n  ...\n  plugins: [\n    seoPlugin({\n      hostname: "https://vuepress-theme-hope.github.io",\n      ogp: (ogp, page) => ({\n        ...ogp,\n        "og:updated_time": "",\n        "og:modified_time": "",\n      }),\n  ],\n});\n

    另外,如果想停止向页面导入 lastUpdated 参数,在 theme.ts 中插入 lastUpdated: false 即可。

    export default hopeTheme({\n  lastUpdated: false,\n});\n

    自定义主题

    ',4),Z={class:"task-list-container"},X=(0,n.QD)("li",{class:"task-list-item"},[(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-0",checked:"checked",disabled:"disabled"}),(0,n.QD)("label",{class:"task-list-item-label",for:"task-item-0"},[(0,n.QD)("s",null,"创建独立的笔记区,便于整理生活感悟与专题文章。尽管仍使用同一侧边栏,但可设定为仅展示个别领域,适应文章数量众多的场景。")])],-1),J={class:"task-list-item"},$=(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-1",checked:"checked",disabled:"disabled"},null,-1),ee={class:"task-list-item-label",for:"task-item-1"},se={href:"https://vuepress-theme-hope.github.io/v2/components/zh/guide/",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/demo/components/src/.vuepress/config.ts",target:"_blank",rel:"noopener noreferrer"},ne={class:"task-list-item"},te=(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-2",checked:"checked",disabled:"disabled"},null,-1),le={class:"task-list-item-label",for:"task-item-2"},ie={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/docsearch.html",target:"_blank",rel:"noopener noreferrer"},oe={class:"task-list-item"},ce=(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-3",checked:"checked",disabled:"disabled"},null,-1),pe={class:"task-list-item-label",for:"task-item-3"},re={href:"https://theme-hope.vuejs.press/zh/guide/layout/sidebar.html#%E9%80%9A%E8%BF%87%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90",target:"_blank",rel:"noopener noreferrer"},ue=(0,n.QD)("li",{class:"task-list-item"},[(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-4",checked:"checked",disabled:"disabled"}),(0,n.QD)("label",{class:"task-list-item-label",for:"task-item-4"},[(0,n.QD)("s",null,"去 meta 标签,测试并未成功,不再尝试")])],-1),de={class:"task-list-item"},ke=(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-5",checked:"checked",disabled:"disabled"},null,-1),me={class:"task-list-item-label",for:"task-item-5"},he={href:"https://theme-hope.vuejs.press/zh/guide/feature/comment.html#waline",target:"_blank",rel:"noopener noreferrer"},be=(0,n.IL)('
  • ',9),ve={class:"task-list-item"},fe=(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-15",checked:"checked",disabled:"disabled"},null,-1),ge={class:"task-list-item-label",for:"task-item-15"},De={href:"https://theme-hope.vuejs.press/zh/cookbook/advanced/replace.html#%E6%8F%92%E6%A7%BD%E5%88%A9%E7%94%A8",target:"_blank",rel:"noopener noreferrer"},Qe={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/packages/theme/src/client/module/navbar/components/NavbarBrand.ts",target:"_blank",rel:"noopener noreferrer"},Ye=(0,n.IL)('
  • ',4),xe={class:"task-list-item"},ye=(0,n.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-20",checked:"checked",disabled:"disabled"},null,-1),we={class:"task-list-item-label",for:"task-item-20"},qe={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/blob/main/docs/theme/src/.vuepress/config.ts",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://vuepress-theme-hope.github.io/v2/seo/zh/guide.html#%E7%9B%B4%E6%8E%A5%E6%B7%BB%E5%8A%A0-head-%E6%A0%87%E7%AD%BE",target:"_blank",rel:"noopener noreferrer"},_e=(0,n.IL)('
  • ',6),Pe=(0,n.QD)("hr",{class:"footnotes-sep"},null,-1),Ve={class:"footnotes"},ze={class:"footnotes-list"},Be={id:"footnote1",class:"footnote-item"},Ke={href:"https://blog.csdn.net/song854601134/article/details/121340077",target:"_blank",rel:"noopener noreferrer"},je=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Ae={},Me=(0,a(9720).c)(Ae,[["render",function(e,s){const a=(0,n.E1)("ExternalLinkIcon"),Ae=(0,n.E1)("RouteLink");return(0,n.Wz)(),(0,n.An)("div",null,[(0,n.QD)("p",null,[(0,n.QD)("a",t,[(0,n.mY)("VuePress"),(0,n.K2)(a)]),(0,n.mY)(" 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。")]),(0,n.QD)("p",null,[(0,n.mY)("不过,VuePress 网站需要依赖包环境,生成的静态文件在本地运行会缺少组件,需要服务器或其他云服务上运行。如果本地部署中出现未知 bug,推荐使用 "),(0,n.QD)("a",l,[(0,n.mY)("StackBlitz"),(0,n.K2)(a)]),(0,n.mY)(" 在线 IDE 工具测试,打开 "),i,(0,n.mY)(" 即可将对应 GitHub 仓库导入 StackBlitz。开发时,建议用 dev 命令测试,这样可以查看打包前的动态代码,发现组件间的内部链接。")]),(0,n.QD)("p",null,[(0,n.mY)("LearnData 的主题为 "),(0,n.QD)("a",o,[(0,n.mY)("vuepress-theme-hope"),(0,n.K2)(a)]),(0,n.mY)(",图标为 "),(0,n.QD)("a",c,[(0,n.mY)("Iconfont 精选图标"),(0,n.K2)(a)]),(0,n.mY)(",页面修改查看 "),(0,n.QD)("a",p,[(0,n.mY)("样式配置"),(0,n.K2)(a)]),(0,n.mY)(",其他主题和插件参考 "),(0,n.QD)("a",r,[(0,n.mY)("Awesome VuePress V2"),(0,n.K2)(a)]),(0,n.mY)(" 和 "),(0,n.QD)("a",u,[(0,n.mY)("看板娘"),(0,n.K2)(a)]),(0,n.mY)("。")]),d,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.mY)("环境配置:安装 pnpm,也支持 npm 和 yarn,可参考"),(0,n.K2)(Ae,{to:"/deploy/VPS.html#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2"},{default:(0,n.Ql)((()=>[(0,n.mY)("环境部署教程")])),_:1}),(0,n.mY)("。")]),k,m,(0,n.QD)("li",null,[h,(0,n.mY)(" 路径下的 config.ts,navbar.ts,sidebar.ts,theme.ts 可以修改页面属性,设置方法参考 "),(0,n.QD)("a",b,[(0,n.mY)("官方案例"),(0,n.K2)(a)]),(0,n.mY)("。 "),v]),f]),g,(0,n.QD)("p",null,[(0,n.mY)("本地搜索插件:"),(0,n.QD)("a",D,[(0,n.mY)("search"),(0,n.K2)(a)]),(0,n.mY)(" 根据你的页面,在本地生成搜索索引,然后在用户访问站点时加载搜索索引文件。默认情况下,该插件会将页面标题和小标题作为搜索索引。")]),(0,n.QD)("p",null,[(0,n.mY)("在线搜索插件:"),(0,n.QD)("a",Q,[(0,n.mY)("algolia DocSearch"),(0,n.K2)(a)]),(0,n.mY)(" 使用在线爬虫抓取全站,并提供网站搜索索引,抓取周期为一周。开源文档可以申请官方爬虫支持,商业化内容需要自己设置爬虫。")]),(0,n.QD)("p",null,[(0,n.mY)("在 "),(0,n.QD)("a",Y,[(0,n.mY)("algolia 爬虫管理页"),(0,n.K2)(a)]),(0,n.mY)(" 修改爬虫抓取规则,然后手动触发爬虫进行全站搜索。之后,"),(0,n.QD)("a",x,[(0,n.mY)("algolia 搜索数据库"),(0,n.K2)(a)]),(0,n.mY)(" 可以查看搜索次数与数据。")]),y,w,q,(0,n.QD)("p",null,[(0,n.mY)("如果不想每次架构都重命名文件,可以复制「"),(0,n.QD)("a",E,[(0,n.mY)("nohashname"),(0,n.K2)(a)]),(0,n.mY)("」branch。我把 nohashname 分支的打包工具换成了 "),(0,n.QD)("a",_,[(0,n.mY)("Webpack"),(0,n.K2)(a)]),(0,n.mY)(",并用 chainWebpack 设置文件命名规则,避免文件非必要重命名。")]),(0,n.QD)("ol",null,[P,(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("修改文件命名规则:打开 config.ts,使用 "),(0,n.QD)("a",V,[(0,n.mY)("webpack-chain"),(0,n.K2)(a)]),(0,n.mY)(" 修改 webpack 输出文件名规则,停止对 js 文件 hashname。"),z,(0,n.mY)(),B,(0,n.mY)(" 加路径容易报错,这里只把 chunk 文件放入子文件夹。")]),K,(0,n.QD)("p",null,[(0,n.mY)("在查找 chainWebpack 配置前,我依照 "),(0,n.QD)("a",j,[(0,n.mY)("vue.config.js"),(0,n.K2)(a)]),(0,n.mY)(" 的指引添加了 "),A,(0,n.mY)(",但是 VuePress 并未停止 hashname。事实上,我理解错了。根据 @Mister-Hope 的说明,「这里的 filenameHasing 是 vue-cli 自己加的一个属性。拿到这里当例子很奇怪。就好比你按照 iOS 使用手册去设置 Android 结果无效,本不应该有效。另外本身为了防止应用程序出错,你也从不应该移除 hash。」")])])]),M,W,(0,n.QD)("p",null,[(0,n.mY)("VuePress "),(0,n.QD)("a",L,[(0,n.mY)("Build 配置项"),(0,n.K2)(a)]),(0,n.mY)("默认开启了 preload 和 prefetch。但是,开启了 prefetch,所有其它页面所需的文件都会被预拉取。页面较多或服务器宽带后付费的话,建议关闭 prefetch。")]),I,H,C,(0,n.QD)("p",null,[(0,n.mY)("我的主题模板文件是 "),(0,n.QD)("a",U,[(0,n.mY)("@vuepress-theme-hope/templates/index.build.html"),(0,n.K2)(a)]),(0,n.mY)(",将其下载到本地后,修改为你想要的样式,放入 .vuepress 文件夹内。最后在 config.ts 中添加代码,即可启用修改模板。")]),S,(0,n.QD)("p",null,[(0,n.QD)("a",T,[(0,n.mY)("vuepress-plugin-seo2"),(0,n.K2)(a)]),(0,n.mY)(" 在网页中插入 "),R,(0,n.mY)(" 和 "),F,(0,n.mY)(",这两个参数都引用自 "),N,(0,n.mY)("。"),O,(0,n.mY)(" 中无法设置 ogp。你需要打开 config.ts,使用 vuepress-plugin-seo2 的 ogp 参数重新设置 meta,并删除你不想要的参数。根据 @Mister-Hope 的说明:「API 的设计很容易理解,就是给你个自动生成的对象然后等你返回。所以你只需要在原对象上把属性删掉,返回这个对象就是了。」")]),G,(0,n.QD)("ul",Z,[X,(0,n.QD)("li",J,[$,(0,n.QD)("label",ee,[(0,n.QD)("s",null,[(0,n.mY)("插入 Bilibili 或第三方视频,可使用专用 "),(0,n.QD)("a",se,[(0,n.mY)("组件库"),(0,n.K2)(a)]),(0,n.mY)(",配置参考 "),(0,n.QD)("a",ae,[(0,n.mY)("组件案例 config.ts"),(0,n.K2)(a)]),(0,n.mY)(".")])])]),(0,n.QD)("li",ne,[te,(0,n.QD)("label",le,[(0,n.QD)("s",null,[(0,n.mY)("插件"),(0,n.QD)("a",ie,[(0,n.mY)("docsearch"),(0,n.K2)(a)]),(0,n.mY)(":将 Algolia DocSearch 集成到 VuePress 中,为你的文档网站提供搜索功能。")])])]),(0,n.QD)("li",oe,[ce,(0,n.QD)("label",pe,[(0,n.QD)("s",null,[(0,n.mY)("README 页面如何隐藏,使用 index: false,参考"),(0,n.QD)("a",re,[(0,n.mY)("主题设置"),(0,n.K2)(a)])])])]),ue,(0,n.QD)("li",de,[ke,(0,n.QD)("label",me,[(0,n.QD)("s",null,[(0,n.QD)("a",he,[(0,n.mY)("waline"),(0,n.K2)(a)]),(0,n.mY)(" 评论插件,无需账户,更适合大众。")])])]),be,(0,n.QD)("li",ve,[fe,(0,n.QD)("label",ge,[(0,n.QD)("a",De,[(0,n.mY)("修改导航栏 brand 链接"),(0,n.K2)(a)]),(0,n.mY)(",需用本地文件替代 "),(0,n.QD)("a",Qe,[(0,n.mY)("主题默认设置"),(0,n.K2)(a)]),(0,n.mY)("。设置的 ts 未生效,暂时放弃。")])]),Ye,(0,n.QD)("li",xe,[ye,(0,n.QD)("label",we,[(0,n.QD)("s",null,[(0,n.mY)("定制页面标签:config.ts 中添加全局 "),(0,n.QD)("a",qe,[(0,n.mY)("head 标签"),(0,n.K2)(a)]),(0,n.mY)(",或在页面中添加 "),(0,n.QD)("a",Ee,[(0,n.mY)("独立 head 标签"),(0,n.K2)(a)]),(0,n.mY)(",支持图片统计代码。")])])]),_e]),Pe,(0,n.QD)("section",Ve,[(0,n.QD)("ol",ze,[(0,n.QD)("li",Be,[(0,n.QD)("p",null,[(0,n.QD)("a",Ke,[(0,n.mY)("chainWebpack 常用配置方式"),(0,n.K2)(a)]),(0,n.mY)(),je])])])])])}]]),We=JSON.parse('{"path":"/web/VuePress.html","title":"VuePress","lang":"zh-CN","frontmatter":{"article":false,"title":"VuePress","icon":"vue","order":1,"description":"VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。 不过,VuePress 网站需要依赖包环境,生成的静态...","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/VuePress.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"VuePress"}],["meta",{"property":"og:description","content":"VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。 不过,VuePress 网站需要依赖包环境,生成的静态..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"VuePress\\",\\"description\\":\\"VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。 不过,VuePress 网站需要依赖包环境,生成的静态...\\"}"]]},"headers":[{"level":2,"title":"初始配置","slug":"初始配置","link":"#初始配置","children":[]},{"level":2,"title":"搜索插件","slug":"搜索插件","link":"#搜索插件","children":[]},{"level":2,"title":"Webpack 打包","slug":"webpack-打包","link":"#webpack-打包","children":[]},{"level":2,"title":"关闭 prefetch","slug":"关闭-prefetch","link":"#关闭-prefetch","children":[]},{"level":2,"title":"页面模板","slug":"页面模板","link":"#页面模板","children":[]},{"level":2,"title":"时间参数","slug":"时间参数","link":"#时间参数","children":[]},{"level":2,"title":"自定义主题","slug":"自定义主题","link":"#自定义主题","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":59}]},"readingTime":{"minutes":10.03,"words":3009},"filePathRelative":"web/VuePress.md","localizedDate":"2022年7月22日","excerpt":"

    VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个静态网站来展示它们。如果你已经有了 docsify/Hexo 等 Markdown 架构网站,简单就能切换到 VuePress。

    \\n

    不过,VuePress 网站需要依赖包环境,生成的静态文件在本地运行会缺少组件,需要服务器或其他云服务上运行。如果本地部署中出现未知 bug,推荐使用 StackBlitz 在线 IDE 工具测试,打开 https://stackblitz.com/github/用户名/仓库名 即可将对应 GitHub 仓库导入 StackBlitz。开发时,建议用 dev 命令测试,这样可以查看打包前的动态代码,发现组件间的内部链接。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-00f63dc7.ae483280.js b/assets/js/v-00f63dc7.ae483280.js deleted file mode 100644 index ed13aed04..000000000 --- a/assets/js/v-00f63dc7.ae483280.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2954],{9720:(n,e)=>{e.c=(n,e)=>{const s=n.__vccOpts||n;for(const[n,a]of e)s[n]=a;return s}},5164:(n,e,s)=>{s.r(e),s.d(e,{comp:()=>c,data:()=>i});var a=s(3968);const t={href:"https://grocy.info/",target:"_blank",rel:"noopener noreferrer"},o=(0,a.IL)('

    Grocy Docker 端默认的账户密码是 admin。要将界面语言设置为中文,只需点击右上角的菜单,然后选择「User settings」,接着在语言选项中选择中文。

    如果你想在移动设备上扫描物品的条形码,可以按照以下步骤操作:点击右上角的菜单,选择「管理 API 秘钥」,然后点击「添加」和「生成 API 秘钥」。接下来,点击生成的秘钥旁边的第二个按钮,使用移动客户端扫描显示在页面上的二维码。然而,个人认为在家庭使用中,扫码功能可能并不是必需的。

    # https://hub.docker.com/r/linuxserver/grocy\nversion: "2.1"\nservices:\n  grocy:\n    image: lscr.io/linuxserver/grocy:latest\n    container_name: grocy\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n    volumes:\n      - /volume1/docker/grocy/config:/config\n    ports:\n      - 9020:80\n    restart: unless-stopped\n
    ',3),r={},c=(0,s(9720).c)(r,[["render",function(n,e){const s=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.QD)("a",t,[(0,a.mY)("Grocy"),(0,a.K2)(s)]),(0,a.mY)(" 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。")]),o])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/grocy.html","title":"Grocy:家庭杂货管理","lang":"zh-CN","frontmatter":{"article":false,"title":"Grocy:家庭杂货管理","order":33,"description":"Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。 Grocy Docker 端默认的账户密码是 admin。...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/grocy.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Grocy:家庭杂货管理"}],["meta",{"property":"og:description","content":"Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。 Grocy Docker 端默认的账户密码是 admin。..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Grocy:家庭杂货管理\\",\\"description\\":\\"Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。 Grocy Docker 端默认的账户密码是 admin。...\\"}"]]},"headers":[],"git":{"createdTime":1698433931000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.02,"words":306},"filePathRelative":"services/dockers-on-nas/grocy.md","localizedDate":"2023年10月27日","excerpt":"

    Grocy 是一款自助式杂货和家庭管理解决方案,可用于记录物品信息并根据个性化需求进行管理。此外,它还支持手机端的条形码扫描功能,方便您清理家庭杂物,避免使用过期物品。Grocy 支持各种客户端,包括 iOS、Android、Windows,并且还提供 Home Assistant 插件支持。

    \\n

    Grocy Docker 端默认的账户密码是 admin。要将界面语言设置为中文,只需点击右上角的菜单,然后选择「User settings」,接着在语言选项中选择中文。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-022042da.dffe1767.js b/assets/js/v-022042da.dffe1767.js deleted file mode 100644 index ec2902472..000000000 --- a/assets/js/v-022042da.dffe1767.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[460],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,t]of s)a[n]=t;return a}},2435:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>i,data:()=>c});var t=a(3968);const e={href:"https://mtmt.tech/",target:"_blank",rel:"noopener noreferrer"},o=(0,t.IL)('

    我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,在使用 MT Photos 时,我发现网页端的视频播放经常出现问题,有些视频可以通过切换至全屏模式来播放,而有些视频只显示 1 秒然后无法继续播放。我向开发者反馈了这个问题,对方表示将在后续解决,但没有给出具体的时间表。目前,我只能让家人安装应用来解决视频播放的问题。

    version: "3"\n\nservices:\n  mtphotos:\n    image: mtphotos/mt-photos:latest\n    container_name: mtphotos\n    restart: always\n    ports:\n      - 8162:8063\n      - 8163:8163\n    volumes:\n      - /volume1/docker/MTphotos/config:/config\n      - /volume3/Pictures/upload:/upload\n      - /volume3/Pictures/photos:/photos\n    environment:\n      - TZ=Asia/Shanghai\n      # 是否启用内部 SSL\n      #- SSL_NAME=xxx.newzone.top\n      #- MT_SERVER_SSL_PORT=8163\n      #- RAW_SUPPORT=open\n  # 智能识别 API 容器,用于文本识别、以文搜图、场景识别。不需要的话,可删除本部分。\n  mtphotosai:\n    image: mtphotos/mt-photos-ai:latest\n    container_name: mtphotosai\n    restart: always\n    ports:\n      - 8164:8000\n    environment:\n      #在 MT Photos 后台添加 API 时需要填入 API_AUTH_KEY(字符串),请自行修改。\n      - API_AUTH_KEY=apikey1\n
    ',2),p={},i=(0,a(9720).c)(p,[["render",function(n,s){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[(0,t.QD)("p",null,[(0,t.QD)("a",e,[(0,t.mY)("MT Photos"),(0,t.K2)(a)]),(0,t.mY)(" 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。")]),o])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/mt-photos.html","title":"MT Photos:分享家庭照片","lang":"zh-CN","frontmatter":{"article":false,"title":"MT Photos:分享家庭照片","order":4,"description":"MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。 我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/mt-photos.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"MT Photos:分享家庭照片"}],["meta",{"property":"og:description","content":"MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。 我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"MT Photos:分享家庭照片\\",\\"description\\":\\"MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。 我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,...\\"}"]]},"headers":[],"git":{"createdTime":1696991517000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":1.27,"words":382},"filePathRelative":"services/dockers-on-nas/mt-photos.md","localizedDate":"2023年10月11日","excerpt":"

    MT Photos 是专为 NAS 用户设计的照片管理系统。它能自动整理和分类您的照片,包括按时间、地点、人物和照片类型分类。初次使用可获得一个月的免费授权,之后需要付费 99 元购买永久使用证。MT Photos 后台每周自动检查授权状态。

    \\n

    我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,在使用 MT Photos 时,我发现网页端的视频播放经常出现问题,有些视频可以通过切换至全屏模式来播放,而有些视频只显示 1 秒然后无法继续播放。我向开发者反馈了这个问题,对方表示将在后续解决,但没有给出具体的时间表。目前,我只能让家人安装应用来解决视频播放的问题。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-04f0edf8.c8106776.js b/assets/js/v-04f0edf8.c8106776.js deleted file mode 100644 index d5f5e602c..000000000 --- a/assets/js/v-04f0edf8.c8106776.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7952],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9708:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>I,data:()=>K});var n=a(3968);const s=(0,n.QD)("p",null,[(0,n.mY)("每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:"),(0,n.QD)("strong",null,"遵循一个固定、程序化的流程,有规律地养成习惯"),(0,n.mY)(",实现自我提升。")],-1),l=(0,n.QD)("h2",{id:"仪式清单",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#仪式清单"},[(0,n.QD)("span",null,"仪式清单")])],-1),o=(0,n.QD)("h3",{id:"_5am-club",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#_5am-club"},[(0,n.QD)("span",null,"5AM Club")])],-1),r={href:"https://newzone.top/posts/2023-03-31-efficient_morning_5am_club.html",target:"_blank",rel:"noopener noreferrer"},p=(0,n.QD)("ol",null,[(0,n.QD)("li",null,"早上 5 点起床,使用手环震动闹钟。"),(0,n.QD)("li",null,"泡杯咖啡,准备早餐,开始第一个工作番茄。"),(0,n.QD)("li",null,"工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。"),(0,n.QD)("li",null,"每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。"),(0,n.QD)("li",null,"晚上 10 点睡觉,保证充足的睡眠时间。")],-1),i={href:"https://hubermanlab.com/sleep-toolkit-tools-for-optimizing-sleep-and-sleep-wake-timing/",target:"_blank",rel:"noopener noreferrer"},c=(0,n.QD)("h3",{id:"每日",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#每日"},[(0,n.QD)("span",null,"每日")])],-1),d=(0,n.QD)("p",null,[(0,n.QD)("strong",null,"早上创造美好情绪"),(0,n.mY)(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),u=(0,n.QD)("li",null,"唱歌:唱一首你喜欢的歌曲(外语美声歌曲可以增加脂肪消耗,例如:秋山雅史的《千の風になって》)。",-1),m=(0,n.QD)("li",null,"自拍视频:说一句话(比如当天的目标)来鼓励自己。在前一天想好录制内容,以获得积极情绪。",-1),h={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},k=(0,n.IL)('
  • 人际连接:通过直播连麦与陌生人沟通 15 分钟,例如:播客、抖音语音电台直播 PK。

    • 别人很重要:帮助别人,能让人更健康、更幸福。当心情不好时,去帮助其他人,心情会变得更好。
    • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
  • 微习惯

    • 每工作 20 分钟,休息 20 秒,然后做 10 个深蹲;出书房或上完厕所,再做 15 个俯卧撑。在运动前,在白板上写出正字,每一组动作用一个笔画表示。进阶阶段可以用固定机位拍摄视频,监督运动习惯。拍摄时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。
    • 睡前:每天泡脚 20 分钟(水温 40℃),短时间的泡脚可以帮助睡眠更快入睡。此外,每天睡前 90 分钟,淋浴(水温 38~43℃,淋浴 10 分钟)或泡澡也可以助你更快进入睡眠状态。[1]
  • 间隔学习:穿插学习不同领域内容

    • 阅读看书:每天花 30 分钟读书,并输出笔记。
    • 墨墨背单词:每天背 20 个单词,虽然用处不大,但可以让脑子换个思路。
    • 笔记复习:利用思源笔记/SuperMemo 记忆模型,复习心理认知、沟通理论和行为反思等笔记。
  • 当日回顾:每天记录 3 件好事,总结好事发生的原因,并与家人分享。

    这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

  • ',4),b=(0,n.QD)("h3",{id:"定期",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#定期"},[(0,n.QD)("span",null,"定期")])],-1),g=(0,n.QD)("strong",null,"月底反思",-1),f={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},D={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},Q=(0,n.QD)("li",null,[(0,n.QD)("strong",null,"积极自我介绍"),(0,n.mY)(":每三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),v=(0,n.QD)("h3",{id:"自我监控",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#自我监控"},[(0,n.QD)("span",null,"自我监控")])],-1),_={href:"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html",target:"_blank",rel:"noopener noreferrer"},Y=(0,n.IL)('
    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\n
    ',1),w=(0,n.IL)('
  • 晚上 10 点执行关机程序:静音、关闭护眼提醒、关闭录屏终端,并使用 dvr-scan 删除视频中的静止帧。这些步骤可以通过 AutoHotkey 命令自动完成。

    Send, {Volume_Mute}\nProcess, Close, Stretchly.exe\nProcess, Close, pwsh.exe\nSleep, 500000\nRun, PowerShell.exe -NoExit -Command &{dvr-scan -i output.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\\Backup\\Libraries\\Desktop\n
  • 使用 VLC 播放器可以以 31.25 倍的速度回放监控视频,并结合 ManicTime 来回顾当日内容。要轻松实现 VLC 的高倍速播放,可以在「菜单栏」->「视图」中开启「状态栏」。此外,通过剪映,可以达到 100 倍的播放速度。

  • ',2),x=(0,n.IL)('

    时间管理

    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 功能外,还能用日视图管理具体时间安排,添加跨天长时间任务,并在日历、看板和甘特图中查看。

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

    ',10),A={href:"https://topbook.cc/course/detail/153",target:"_blank",rel:"noopener noreferrer"},C=(0,n.QD)("strong",null,"把事情做好,而不是把事情做完",-1),T=(0,n.IL)('

    日常习惯

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

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

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

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

    美容仪器

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

    • 按摩椅 + 眼部按摩仪 + 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),M={class:"footnotes"},z={class:"footnotes-list"},L={id:"footnote1",class:"footnote-item"},S={href:"https://www.solidot.org/story?sid=72099",target:"_blank",rel:"noopener noreferrer"},R=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),G={},I=(0,a(9720).c)(G,[["render",function(e,t){const a=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[s,l,o,(0,n.QD)("p",null,[(0,n.mY)("5AM Club 是我的"),(0,n.QD)("a",r,[(0,n.mY)("高效早晨方案"),(0,n.K2)(a)]),(0,n.mY)(":")]),p,(0,n.QD)("p",null,[(0,n.QD)("a",i,[(0,n.mY)("Huberman Lab"),(0,n.K2)(a)]),(0,n.mY)(" 建议早晨不一定需要进食,可以到中午再进食,改变身体的新陈代谢周期;醒来后两到四小时再摄入咖啡因,并尽量避免在午后摄入咖啡因,以防下午的 cafferine crush。请根据个人情况灵活调整计划。")]),c,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[d,(0,n.QD)("ul",null,[u,m,(0,n.QD)("li",null,[(0,n.mY)("参考"),(0,n.QD)("a",h,[(0,n.mY)("积极心理学"),(0,n.K2)(a)]),(0,n.mY)(",收集积极情绪材料,放在显眼的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术(音乐、名画、诗句)。")])])]),k]),b,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[g,(0,n.mY)(":检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 "),(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.mY)("每月复盘参照 "),(0,n.QD)("a",f,[(0,n.mY)("Allison Seboldt"),(0,n.K2)(a)]),(0,n.mY)(",作者会分享他的收入并反思上个月的成就。")]),(0,n.QD)("li",null,[(0,n.mY)("阅读 "),(0,n.QD)("a",D,[(0,n.mY)("JustinJ ackson"),(0,n.K2)(a)]),(0,n.mY)(",作者在 2018 年初创办 Transistor 以来,一直在分享他的项目,整理了在此过程中学到的许多经验教训。")])])]),Q]),v,(0,n.QD)("p",null,[(0,n.mY)("为了更好地监督自己,我制定了一套"),(0,n.QD)("a",_,[(0,n.mY)("自我监控方案"),(0,n.K2)(a)]),(0,n.mY)(",以记录自己的私人工作状态。")]),(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("开机(8 点)启动录屏命令,并检测护眼提醒是否开启。可参考 "),(0,n.QD)("a",y,[(0,n.mY)("FFmpeg 录屏方案"),(0,n.K2)(a)]),(0,n.mY)("来修改命令:")]),Y]),w]),x,(0,n.QD)("p",null,[(0,n.mY)("本节内容来自 Topbook 的 "),(0,n.QD)("a",A,[(0,n.mY)("GTD 自我管理 - 时间管理教程"),(0,n.K2)(a)]),(0,n.mY)(",改变了我对 GTD 的认知,"),C,(0,n.mY)("。建议完整阅读。")]),T,(0,n.QD)("section",M,[(0,n.QD)("ol",z,[(0,n.QD)("li",L,[(0,n.QD)("p",null,[(0,n.QD)("a",S,[(0,n.mY)("睡前淋浴有助于快速入睡"),(0,n.K2)(a)]),(0,n.mY)(),R])])])])])}]]),K=JSON.parse('{"path":"/DailyRoutine.html","title":"每日仪式","lang":"zh-CN","frontmatter":{"article":false,"title":"每日仪式","icon":"check","description":"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。 仪式清单 5AM Club 5AM Club 是我的高效早晨方案: 早上 5 点起床,使用手环震动闹钟。 泡杯咖啡,准备早餐,开始第一个工作番茄。 工作 25 分钟休息...","head":[["meta",{"property":"og:url","content":"https://newzone.top/DailyRoutine.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"每日仪式"}],["meta",{"property":"og:description","content":"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。 仪式清单 5AM Club 5AM Club 是我的高效早晨方案: 早上 5 点起床,使用手环震动闹钟。 泡杯咖啡,准备早餐,开始第一个工作番茄。 工作 25 分钟休息..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-11-02-11-02-43.png \\"GTD 任务转移到清单\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-08T03:33:22.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"每日仪式"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-09-08T03:33:22.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"每日仪式\\",\\"description\\":\\"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。 仪式清单 5AM Club 5AM Club 是我的高效早晨方案: 早上 5 点起床,使用手环震动闹钟。 泡杯咖啡,准备早餐,开始第一个工作番茄。 工作 25 分钟休息...\\"}"]]},"headers":[{"level":2,"title":"仪式清单","slug":"仪式清单","link":"#仪式清单","children":[{"level":3,"title":"5AM Club","slug":"_5am-club","link":"#_5am-club","children":[]},{"level":3,"title":"每日","slug":"每日","link":"#每日","children":[]},{"level":3,"title":"定期","slug":"定期","link":"#定期","children":[]},{"level":3,"title":"自我监控","slug":"自我监控","link":"#自我监控","children":[]}]},{"level":2,"title":"时间管理","slug":"时间管理","link":"#时间管理","children":[]},{"level":2,"title":"日常习惯","slug":"日常习惯","link":"#日常习惯","children":[]},{"level":2,"title":"美容仪器","slug":"美容仪器","link":"#美容仪器","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1694144002000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":21}]},"readingTime":{"minutes":8.14,"words":2442},"filePathRelative":"DailyRoutine.md","localizedDate":"2022年7月22日","excerpt":"

    每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。

    \\n

    仪式清单

    \\n

    5AM Club

    \\n

    5AM Club 是我的高效早晨方案

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-05d1146e.afc727b5.js b/assets/js/v-05d1146e.afc727b5.js deleted file mode 100644 index 72b8efc8b..000000000 --- a/assets/js/v-05d1146e.afc727b5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8792],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,n]of t)o[e]=n;return o}},9680:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>F,data:()=>J});var n=o(3968);const a=(0,n.QD)("p",null,"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。",-1),s=(0,n.QD)("h2",{id:"home-assistant",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#home-assistant"},[(0,n.QD)("span",null,"Home Assistant")])],-1),r=(0,n.QD)("p",null,"Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。",-1),l=(0,n.QD)("p",null,"Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。",-1),i={href:"https://github.com/hacs/integration/releases/",target:"_blank",rel:"noopener noreferrer"},m=(0,n.QD)("li",null,"重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。",-1),c=(0,n.QD)("li",null,[(0,n.mY)("选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。"),(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote1"},"[1]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})])],-1),h=(0,n.QD)("p",null,"Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。",-1),d={href:"https://home.miot-spec.com/s/lumi.gateway.mgl03",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/AlexxIT/XiaomiGateway3",target:"_blank",rel:"noopener noreferrer"},u=(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote2"},"[2]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref2"})],-1),f=(0,n.QD)("h2",{id:"node-red",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#node-red"},[(0,n.QD)("span",null,"Node-RED")])],-1),D={href:"https://github.com/node-red/node-red",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://bbs.iobroker.cn/t/topic/1165",target:"_blank",rel:"noopener noreferrer"},b=(0,n.QD)("li",null,[(0,n.mY)("部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 "),(0,n.QD)("code",null,"chmod 777 /volume1/docker/nodered/data"),(0,n.mY)("。")],-1),g={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#prerequisites",target:"_blank",rel:"noopener noreferrer"},A=(0,n.QD)("ul",null,[(0,n.QD)("li",null,"选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。"),(0,n.QD)("li",null,"搜索并安装「node-red-contrib-home-assistant-websocket」。")],-1),k=(0,n.QD)("li",null,"选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。",-1),H=(0,n.QD)("li",null,"选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。",-1),Y={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#configuration",target:"_blank",rel:"noopener noreferrer"},_=(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote3"},"[3]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref3"})],-1),w=(0,n.IL)('

    常用节点

    • inject: 定时启动,周期性触发执行。
    • call service:改变智能设备状态,比如开灯。
      • Domain:触发方式
      • Service:触发命令
      • Device:设备与服务
      • Entity:设备执行模块

    自动化场景

    • 记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。
    • 书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。

    智能硬件

    Zigbee2MQTT

    ',6),y={href:"https://www.youtube.com/watch?v=R_CikjR7tiw",target:"_blank",rel:"noopener noreferrer"},N=(0,n.QD)("p",null,"不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。",-1),v=(0,n.QD)("h3",{id:"智趣盒子",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#智趣盒子"},[(0,n.QD)("span",null,"智趣盒子")])],-1),R={href:"https://item.taobao.com/item.htm?id=635639747170",target:"_blank",rel:"noopener noreferrer"},T=(0,n.QD)("blockquote",null,[(0,n.QD)("p",null,"盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等).")],-1),E=(0,n.QD)("p",null,"不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。",-1),x=(0,n.QD)("h3",{id:"其他硬件",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#其他硬件"},[(0,n.QD)("span",null,"其他硬件")])],-1),K={href:"https://item.taobao.com/item.htm?id=631865647089",target:"_blank",rel:"noopener noreferrer"},z={href:"https://item.taobao.com/item.htm?id=675107124036",target:"_blank",rel:"noopener noreferrer"},C=(0,n.QD)("hr",{class:"footnotes-sep"},null,-1),M={class:"footnotes"},q={class:"footnotes-list"},j={id:"footnote1",class:"footnote-item"},S={href:"https://baijiahao.baidu.com/s?id=1721932088542289661",target:"_blank",rel:"noopener noreferrer"},X=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Z={id:"footnote2",class:"footnote-item"},I={href:"https://github.com/al-one/hass-xiaomi-miot/issues/100#issuecomment-909031222",target:"_blank",rel:"noopener noreferrer"},P=(0,n.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),L={id:"footnote3",class:"footnote-item"},G={href:"https://zhuanlan.zhihu.com/p/456741817",target:"_blank",rel:"noopener noreferrer"},O=(0,n.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),W={},F=(0,o(9720).c)(W,[["render",function(e,t){const o=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[a,s,r,l,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.mY)("下载 "),(0,n.QD)("a",i,[(0,n.mY)("hacs"),(0,n.K2)(o)]),(0,n.mY)(",将其解压到 Home Assistant 配置的 config\\custom_components\\hacs 文件夹下。")]),m,c]),h,(0,n.QD)("blockquote",null,[(0,n.QD)("p",null,[(0,n.mY)("对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用"),(0,n.QD)("a",d,[(0,n.mY)("多模网关"),(0,n.K2)(o)]),(0,n.mY)("配合 "),(0,n.QD)("a",p,[(0,n.mY)("XiaomiGateway3"),(0,n.K2)(o)]),(0,n.mY)(" 集成。"),u])]),f,(0,n.QD)("p",null,[(0,n.QD)("a",D,[(0,n.mY)("Node-RED"),(0,n.K2)(o)]),(0,n.mY)(" 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 "),(0,n.QD)("a",Q,[(0,n.mY)("node-red 的入门教程集合"),(0,n.K2)(o)]),(0,n.mY)("。")]),(0,n.QD)("ol",null,[b,(0,n.QD)("li",null,[(0,n.mY)("Node-RED 上安装 "),(0,n.QD)("a",g,[(0,n.mY)("node-red-contrib-home-assistant-websocket"),(0,n.K2)(o)]),(0,n.mY)("。 "),A]),k,H,(0,n.QD)("li",null,[(0,n.mY)("进入 nodered 页面,配置 "),(0,n.QD)("a",Y,[(0,n.mY)("home assistant websocket"),(0,n.K2)(o)]),(0,n.mY)(",点击右上角的部署。"),_])]),w,(0,n.QD)("p",null,[(0,n.QD)("a",y,[(0,n.mY)("Zigbee2MQTT"),(0,n.K2)(o)]),(0,n.mY)(" 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。")]),N,v,(0,n.QD)("p",null,[(0,n.QD)("a",R,[(0,n.mY)("智趣盒子"),(0,n.K2)(o)]),(0,n.mY)("集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。")]),T,E,x,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("a",K,[(0,n.mY)("远程键盘控制器"),(0,n.K2)(o)]),(0,n.mY)(":基于易微联的第三方产品,手机通过 APP 远程控制电脑按键,不过只能按一个按键或者连续 6 个的自定义键值。不确定是否支持 HA。")]),(0,n.QD)("li",null,[(0,n.QD)("a",z,[(0,n.mY)("MQTT 转 usb 虚拟键盘鼠标注入器"),(0,n.K2)(o)]),(0,n.mY)(":通过 wifi 来控制,店家不清楚 HA。")])]),C,(0,n.QD)("section",M,[(0,n.QD)("ol",q,[(0,n.QD)("li",j,[(0,n.QD)("p",null,[(0,n.QD)("a",S,[(0,n.mY)("从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建"),(0,n.K2)(o)]),(0,n.mY)(),X])]),(0,n.QD)("li",Z,[(0,n.QD)("p",null,[(0,n.QD)("a",I,[(0,n.mY)("为什么设备状态会有延迟?如何减小延迟?"),(0,n.K2)(o)]),(0,n.mY)(),P])]),(0,n.QD)("li",L,[(0,n.QD)("p",null,[(0,n.QD)("a",G,[(0,n.mY)("树莓派 HomeAssistant 系列(四)NodeRed 安装配置"),(0,n.K2)(o)]),(0,n.mY)(),O])])])])])}]]),J=JSON.parse('{"path":"/family/HomeAutomation.html","title":"智能家居","lang":"zh-CN","frontmatter":{"article":false,"title":"智能家居","icon":"home","order":3.1,"description":"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 Home Assistant Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 Home Assistant 原生支持的米家设备较少,需要使用 hac...","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/HomeAutomation.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"智能家居"}],["meta",{"property":"og:description","content":"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 Home Assistant Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 Home Assistant 原生支持的米家设备较少,需要使用 hac..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"智能家居\\",\\"description\\":\\"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。 Home Assistant Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。 Home Assistant 原生支持的米家设备较少,需要使用 hac...\\"}"]]},"headers":[{"level":2,"title":"Home Assistant","slug":"home-assistant","link":"#home-assistant","children":[]},{"level":2,"title":"Node-RED","slug":"node-red","link":"#node-red","children":[{"level":3,"title":"常用节点","slug":"常用节点","link":"#常用节点","children":[]}]},{"level":2,"title":"自动化场景","slug":"自动化场景","link":"#自动化场景","children":[]},{"level":2,"title":"智能硬件","slug":"智能硬件","link":"#智能硬件","children":[{"level":3,"title":"Zigbee2MQTT","slug":"zigbee2mqtt","link":"#zigbee2mqtt","children":[]},{"level":3,"title":"智趣盒子","slug":"智趣盒子","link":"#智趣盒子","children":[]},{"level":3,"title":"其他硬件","slug":"其他硬件","link":"#其他硬件","children":[]}]}],"git":{"createdTime":1660756330000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":4.18,"words":1255},"filePathRelative":"family/HomeAutomation.md","localizedDate":"2022年8月17日","excerpt":"

    智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。

    \\n

    Home Assistant

    \\n

    Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。

    \\n

    Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。

    \\n
      \\n
    1. 下载 hacs,将其解压到 Home Assistant 配置的 config\\\\custom_components\\\\hacs 文件夹下。
    2. \\n
    3. 重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。
    4. \\n
    5. 选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。[1]
    6. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-069ef9fd.4ae7ce47.js b/assets/js/v-069ef9fd.4ae7ce47.js deleted file mode 100644 index bc0a05fbf..000000000 --- a/assets/js/v-069ef9fd.4ae7ce47.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[448],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,t]of e)a[n]=t;return a}},4984:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>g,data:()=>h});var t=a(3968);const s=(0,t.QD)("h2",{id:"双链笔记",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#双链笔记"},[(0,t.QD)("span",null,"双链笔记")])],-1),i=(0,t.QD)("p",null,"@KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,最近同时跟 4 个项目,深有体会;Obsidian 的 MD 语法支持很美观的待办清单,很舒服。 二、书籍之间的联系 很多书中,作者会推荐其他的书,那么就可以在记录读书笔记的时候,直接创建对这些推荐书的引用(得益于 obsidian 的基于引用自动创建文件,而不是只能引用现有文档),又或者一个作者有很多著作、有博客、有公众号,那么就可以给这个作者建一个单独的文档作为主页,其他著作的笔记、博客的摘录都是单独的文档,形成完整体系。 三、跨软件,非 URL 的场景 我的大量 PDF 文档管理在 DEVONThink,obsidian 的链接语法支持直接引用到 DEVONThink 中的文档,需要是可直接通过 OB 激活 DT 快速打开目标文档",-1),o={href:"https://sspai.com/post/67619",target:"_blank",rel:"noopener noreferrer"},l={href:"https://sspai.com/post/72385",target:"_blank",rel:"noopener noreferrer"},r=(0,t.IL)('

    暂时放弃 Obisidian,虽然能按条件罗列页面,但没有 Logseq 方便。如果后续要继续用,则尝试将日记分为 3 份,然后用 Dataview 整合在一起,在上面进行修改

    Obsidian 更习惯记录,日常 Task 由滴答管理,中期且不急的任务则由 Trello 管理。自带的看板功能需要建立笔记,不如 Trello 方便。

    Day Planer 有 sm18 的 Plan 功能。

    插件

    部分插件不能自动更新,需要手动下载插件文件,然后粘贴到 .obsidian/plugins 对应文件夹内。

    Dataview

    ',6),p={href:"https://blacksmithgu.github.io/obsidian-dataview/query/queries/",target:"_blank",rel:"noopener noreferrer"},d=(0,t.IL)('
    # journals 文本下所有\ndv.list(dv.pages('"journals"').file.lists.text)\n\n\n# 指定区域不为空\n.where(t => t!="")\n\n# 包含指定文字\n.where(t => t.includes("Logseq"))\n

    Obsidian Query Language

    ',2),u={href:"https://github.com/jplattel/obsidian-query-language",target:"_blank",rel:"noopener noreferrer"},c=(0,t.IL)('

    但整合出的是链接,并非如 Logseq 一样显示文件内容。想想有没办法,显示文件内容。

    下列代码会抓取,journals 文件夹中包含「今日工作」或「xxxxxxx」的文件。

    name: 'OR combination list of results'\nquery: { $and: [{ "path": "'journals/"}, { $or: [{ "content": "'今日工作" }, { "content": "'xxxxxxx" }] }]}\ntemplate: "list"\nbadge: true\ndebug: true\nsort: "title"\n

    Easy Typing

    Easy Typing 是一个 Obsidian 的书写体验增强插件,自动格式化书写,比如自动在中英文之间添加空格,英文首字母大写,标点与文本间智能空格。

    不过双拼容易出错,需要开启「行模式」。

    ',6),b={},g=(0,a(9720).c)(b,[["render",function(n,e){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[s,i,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",o,[(0,t.mY)("Obsidian 新手系列之你不可不知的插件"),(0,t.K2)(a)])])]),(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.QD)("a",l,[(0,t.mY)("每日笔记、日程管理、工作复盘——这是我钻研出的 Obsidian 八般武艺"),(0,t.K2)(a)])])])]),r,(0,t.QD)("p",null,[(0,t.QD)("a",p,[(0,t.mY)("Dataview"),(0,t.K2)(a)]),(0,t.mY)(" 功能更强大,不过用法也复杂许多。")]),d,(0,t.QD)("p",null,[(0,t.QD)("a",u,[(0,t.mY)("Obsidian Query Language"),(0,t.K2)(a)]),(0,t.mY)(" 能使用 Query 语言,将符合条件的文件整合到一页。")]),c])}]]),h=JSON.parse('{"path":"/apps/tutorials/obsidian.html","title":"Obsidian","lang":"zh-CN","frontmatter":{"article":false,"title":"Obsidian","order":2,"description":"双链笔记 @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/obsidian.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Obsidian"}],["meta",{"property":"og:description","content":"双链笔记 @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-29T01:58:17.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-11-29T01:58:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Obsidian\\",\\"description\\":\\"双链笔记 @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景: 一、待办清单和随笔记 待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,...\\"}"]]},"headers":[{"level":2,"title":"双链笔记","slug":"双链笔记","link":"#双链笔记","children":[]},{"level":2,"title":"插件","slug":"插件","link":"#插件","children":[{"level":3,"title":"Dataview","slug":"dataview","link":"#dataview","children":[]},{"level":3,"title":"Obsidian Query Language","slug":"obsidian-query-language","link":"#obsidian-query-language","children":[]},{"level":3,"title":"Easy Typing","slug":"easy-typing","link":"#easy-typing","children":[]}]}],"git":{"createdTime":1701223097000,"updatedTime":1701223097000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.66,"words":798},"filePathRelative":"apps/tutorials/obsidian.md","localizedDate":"2023年11月29日","excerpt":"

    双链笔记

    \\n

    @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景:\\n一、待办清单和随笔记\\n待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,最近同时跟 4 个项目,深有体会;Obsidian 的 MD 语法支持很美观的待办清单,很舒服。\\n二、书籍之间的联系\\n很多书中,作者会推荐其他的书,那么就可以在记录读书笔记的时候,直接创建对这些推荐书的引用(得益于 obsidian 的基于引用自动创建文件,而不是只能引用现有文档),又或者一个作者有很多著作、有博客、有公众号,那么就可以给这个作者建一个单独的文档作为主页,其他著作的笔记、博客的摘录都是单独的文档,形成完整体系。\\n三、跨软件,非 URL 的场景\\n我的大量 PDF 文档管理在 DEVONThink,obsidian 的链接语法支持直接引用到 DEVONThink 中的文档,需要是可直接通过 OB 激活 DT 快速打开目标文档

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-06e94a1d.9228d79a.js b/assets/js/v-06e94a1d.9228d79a.js deleted file mode 100644 index 2a6cc88ae..000000000 --- a/assets/js/v-06e94a1d.9228d79a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6764],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,a]of t)n[e]=a;return n}},604:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>o,data:()=>r});var a=n(3968);const i=[(0,a.IL)('

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    个人观察

    我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这款手机的好感直接 -1

    当然,华为发布会上从没说过「没电也能打电话」,官方说法是「在 1% 低电量下智能启动聚能泵,待机可达三小时或者通话 12 分钟,或亮码 10 次,或扫码 4 次。」这个应急功能实际上是不错的,能缓解充电焦虑。历过数次 2% 直接关机后,我很喜欢这种关机前再榨一把的充电技术。

    有种黑的说法是,「只是把电池低电量保护分级罢了,比如,低电量 15% 电池进入保护,那么,后台只需将 85% 的电量重新显示为 100%,即手机显示的 1% 绝不是真实的 1%,小技俩而已。」

    而我对这种想法是不信的,如果真是这样的套壳宣传,随便检测都能发现,对于华为来说完全是得不偿失。

    华为需要极端宣传吗?

    「走极端才能创造话题」是品牌成功和营销的第一步,但这只是第一步。

    在美国打压下,华为已经是民族主义的顶流了,正常宣传就能拥有一大堆的拥趸,不必每天打鸡血造话题,更不需要用震惊体来吸引流量。

    那为什么华为依然用「没电也能打电话」这类极端的宣传方式?

    我猜测是被自媒体绑架了。

    除打包合作外,媒体宣传费用是建立在播放、阅读、互动的基础上。即使是固定价格的打包合作,这次的流量也会决定是否有下次的合作。因此,对自媒体来说,它不在乎观众对品牌的观感是否被消耗,它在乎的是流量,是互动。即使有黑子,那也是互动啊。有了互动,平台会持续给宣传载体进行加权并推流,自媒体的议价能力也持续提高。

    宣传流量图

    华为总被嘲笑有海军,可能有它自身的原因,但这些极端化媒体的绑架也少不了。

    过多的极端宣传,舆论引起的反噬会远超你获得的利益。不是每个人都会仔细查看你的宣传稿,看到上百篇高级写着华为「没电也能打电话」,真有人会以为你有什么黑科技了。

    手机行业的底线

    原本以为只是华为这样,但 @Dean 提供了另一个梗「iPhone 没电也能刷公交卡」,理由是门禁卡等 NFC 设备没电也能使用。这个梗从 2018 开始每年都要吹一波,门禁卡没电,那么黑科技加持的 iPhone 没电自然也能刷公交卡。这乍听蛮像一回事的,网上也有一堆人相信,但苹果官方文档直接打脸,「即使您的 iPhone 需要充电,您或许也能够在设备上使用“快捷模式”卡片、凭证和钥匙。如果将 iPhone 关机,这项功能将不可用。」

    可能事实就像 @VirtualProsperity 和 @弘隐 说的一样,「作为前手机行业营销从业者,很负责的说,几乎任何手机品牌不会被媒体绑架。因为营销的时候媒体只是其中一个环节,但绝非重要到要为媒体去绑架的程度」,「手机行业的营销很多时候是很 LOW 的 LOW 到你不敢想象是真的」。

    我也身处广告行业,面对的甲方多为快消品。快消品购买频次高,因此品牌方把品牌商誉和防黑放在首位,而手机更换需要 1-3 年,等到下次购买顾客已经遗忘了前几年的极端宣传。或许手机品牌正因为这点而肆意妄为,一切宣传以传播效果为先,以眼前销量为主。一次两次还行,多次之后你还会上当?还会购买这类品牌?我不会。然而,手机行业的想法可能真的不一样,底线有点低。

    最后

    如果你是刚起家的自媒体和品牌,尽管去用走极端的宣传方式,毕竟营销不是道德审判,活下去才是第一步。

    但如果你已经有一定的知名度了,请先想清楚,你真的需要「走极端」的垃圾流量吗?真的要赌互联网记忆?

    ',23)],p={},o=(0,n(9720).c)(p,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div",null,i)}]]),r=JSON.parse('{"path":"/posts/2022-09-07-extreme_branding_thinking_with_mate50.html","title":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?","lang":"zh-CN","frontmatter":{"title":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?","date":"2022-09-07T00:00:00.000Z","category":["观察随笔"],"tag":["媒体"],"order":-0.02,"description":"华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费? 个人观察 我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-09-07-extreme_branding_thinking_with_mate50.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?"}],["meta",{"property":"og:description","content":"华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费? 个人观察 我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-09-07-11-29-53.png?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-27T19:12:11.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"媒体"}],["meta",{"property":"article:published_time","content":"2022-09-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-27T19:12:11.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?\\",\\"image\\":[\\"https://img.newzone.top/2022-09-07-11-29-53.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-09-07-13-24-33.png \\\\\\"宣传流量图\\\\\\"\\"],\\"datePublished\\":\\"2022-09-07T00:00:00.000Z\\",\\"dateModified\\":\\"2023-10-27T19:12:11.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"个人观察","slug":"个人观察","link":"#个人观察","children":[]},{"level":2,"title":"华为需要极端宣传吗?","slug":"华为需要极端宣传吗","link":"#华为需要极端宣传吗","children":[]},{"level":2,"title":"手机行业的底线","slug":"手机行业的底线","link":"#手机行业的底线","children":[]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1662528297000,"updatedTime":1698433931000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":4.4,"words":1319},"filePathRelative":"_posts/2022-09-07-extreme_branding_thinking_with_mate50.md","localizedDate":"2022年9月7日","excerpt":"

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    \\n
    \\"\\"
    \\n

    个人观察

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-071b8439.d4947828.js b/assets/js/v-071b8439.d4947828.js deleted file mode 100644 index bd1d976fb..000000000 --- a/assets/js/v-071b8439.d4947828.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4976],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},1787:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(e,t){const a=(0,o.E1)("Catalog");return(0,o.Wz)(),(0,o.An)("div",null,[(0,o.K2)(a)])}]]),p=JSON.parse('{"path":"/deploy/","title":"Deploy","lang":"zh-CN","frontmatter":{"title":"Deploy","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Deploy"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Deploy\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-081f800d.5cee2e27.js b/assets/js/v-081f800d.5cee2e27.js deleted file mode 100644 index 750c17196..000000000 --- a/assets/js/v-081f800d.5cee2e27.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3532],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4896:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E9%9F%B3%E9%A2%91/","title":"标签: 音频","lang":"zh-CN","frontmatter":{"title":"标签: 音频","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"音频","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E9%9F%B3%E9%A2%91/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 音频"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 音频\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-092b293f.fed4985e.js b/assets/js/v-092b293f.fed4985e.js deleted file mode 100644 index 5b0806bcb..000000000 --- a/assets/js/v-092b293f.fed4985e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1536],{9720:(t,e)=>{e.c=(t,e)=>{const o=t.__vccOpts||t;for(const[t,r]of e)o[t]=r;return o}},9548:(t,e,o)=>{o.r(e),o.d(e,{comp:()=>n,data:()=>s});var r=o(3968);const a={},n=(0,o(9720).c)(a,[["render",function(t,e){return(0,r.Wz)(),(0,r.An)("div")}]]),s=JSON.parse('{"path":"/tag/microsoft-store/","title":"标签: Microsoft store","lang":"zh-CN","frontmatter":{"title":"标签: Microsoft store","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Microsoft store","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/microsoft-store/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Microsoft store"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Microsoft store\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0953b598.06ca3b98.js b/assets/js/v-0953b598.06ca3b98.js deleted file mode 100644 index 392976fda..000000000 --- a/assets/js/v-0953b598.06ca3b98.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6772],{9720:(t,e)=>{e.c=(t,e)=>{const n=t.__vccOpts||t;for(const[t,i]of e)n[t]=i;return n}},4800:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>o,data:()=>l});var i=n(3968);const a=[(0,i.IL)('

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    虚拟定位

    1. 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

    2. 在模拟器中打开要修改定位的应用,点击应用的定位图标。

    3. 选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

    4. 更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

    常见问题

    无法虚拟定位

    如果你已经按照上述步骤进行设置,但仍然不能虚拟定位,这可能是由于模拟器没有正确获取位置信息。为了验证这一点,你可以在模拟器中的微信应用里,给好友发送实时位置分享,看是否能正确显示。

    手机修改定位

    我曾尝试在手机上使用如 fakegps 这样的工具来修改位置,但只有高德地图更改成功,其他都失败了。据了解,这可能与 Android 10 或更高版本的系统有关。如果你使用的是 Android 9 或更早版本的手机,你或许可以尝试使用旧版本的微信来更改定位。

    关于虚拟签到

    虽然企业微信、钉钉等打卡软件也可用此法签到,但请勿滥用。有记者曾在三家价格分别为 5 元、10 元、20 元的网店购买更改定位服务,结果发现这些商家仅是远程登录客户的微信账号,然后使用特定工具修改定位,操作流程与上文所述类似。

    ',11)],p={},o=(0,n(9720).c)(p,[["render",function(t,e){return(0,i.Wz)(),(0,i.An)("div",null,a)}]]),l=JSON.parse('{"path":"/posts/2023-09-05-virtual_positioning.html","title":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT","lang":"zh-CN","frontmatter":{"title":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT","date":"2023-09-05T00:00:00.000Z","category":["工具"],"tag":["虚拟定位"],"order":-55,"description":" 这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。 家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗? 虚拟定位 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2023-09-05-virtual_positioning.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT"}],["meta",{"property":"og:description","content":" 这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。 家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗? 虚拟定位 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-06-11-17-47.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-04T22:50:34.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"虚拟定位"}],["meta",{"property":"article:published_time","content":"2023-09-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-09-04T22:50:34.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT\\",\\"image\\":[\\"https://img.newzone.top/2022-05-06-11-17-47.png\\",\\"https://img.newzone.top/2022-05-06-11-18-08.png\\",\\"https://img.newzone.top/2022-05-06-11-18-26.png\\"],\\"datePublished\\":\\"2023-09-05T00:00:00.000Z\\",\\"dateModified\\":\\"2023-09-04T22:50:34.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"虚拟定位","slug":"虚拟定位","link":"#虚拟定位","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"无法虚拟定位","slug":"无法虚拟定位","link":"#无法虚拟定位","children":[]},{"level":3,"title":"手机修改定位","slug":"手机修改定位","link":"#手机修改定位","children":[]},{"level":3,"title":"关于虚拟签到","slug":"关于虚拟签到","link":"#关于虚拟签到","children":[]}]}],"git":{"createdTime":1693867834000,"updatedTime":1693867834000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":2.26,"words":677},"filePathRelative":"_posts/2023-09-05-virtual_positioning.md","localizedDate":"2023年9月5日","excerpt":"
    \\n

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    \\n
    \\n

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    \\n

    虚拟定位

    \\n
      \\n
    1. \\n

      首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

      在模拟器中打开要修改定位的应用,点击应用的定位图标。

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

      选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

      更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0a9d74a3.0edcbed1.js b/assets/js/v-0a9d74a3.0edcbed1.js deleted file mode 100644 index aaf62296b..000000000 --- a/assets/js/v-0a9d74a3.0edcbed1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[124],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3048:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/ai/","title":"标签: AI","lang":"zh-CN","frontmatter":{"title":"标签: AI","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"AI","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/ai/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: AI"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: AI\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0bd4084a.eea0473f.js b/assets/js/v-0bd4084a.eea0473f.js deleted file mode 100644 index 11d93d311..000000000 --- a/assets/js/v-0bd4084a.eea0473f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7172],{9720:(e,o)=>{o.c=(e,o)=>{const t=e.__vccOpts||e;for(const[e,r]of o)t[e]=r;return t}},196:(e,o,t)=>{t.r(o),t.d(o,{comp:()=>se,data:()=>fe});var r=t(3968);const n=(0,r.QD)("blockquote",null,[(0,r.QD)("p",null,"当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。")],-1),a={href:"https://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},l={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://github.com/MathewSachin/Captura/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"},s=(0,r.QD)("p",null,"免费的不行,那么收费的会不会好点呢?",-1),f={href:"https://www.bandicam.cn/",target:"_blank",rel:"noopener noreferrer"},c=(0,r.QD)("p",null,"再后,我测试了其他几款录屏应用:",-1),d=(0,r.QD)("li",null,"相机:Windows 自带应用,录制方便,但输出选项较少,限制多。",-1),m={href:"https://www.flashbackrecorder.com/zh/express/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://mirillis.com/zh/products/action.html",target:"_blank",rel:"noopener noreferrer"},h={href:"https://ohsoft.net/eng/ocam/intro.php?cate=1002",target:"_blank",rel:"noopener noreferrer"},u={href:"https://getsharex.com/",target:"_blank",rel:"noopener noreferrer"},b=(0,r.IL)('

    我一共试了 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),D={href:"https://github.com/BtbN/FFmpeg-Builds/releases/tag/latest",target:"_blank",rel:"noopener noreferrer"},F=(0,r.QD)("code",null,"ffmpeg-master-latest-win64-gpl.zip",-1),Q=(0,r.IL)('
  • 将 FFmpeg 解压到任意文件夹,比如 D:\\Backup\\Libraries\\Documents\\ffmpeg

  • 开始栏搜索「编辑系统环境变量」,点击进入「环境变量」。

  • 新建用户变量 FFMPEG_HOME,变量值设为刚才的解压路径 D:\\Backup\\Libraries\\Documents\\ffmpeg

    FFmpeg 全局变量设置
  • ',3),_=(0,r.QD)("p",null,"配置完成后,在终端输入 ffmpeg 即可启动。",-1),k=(0,r.QD)("figure",null,[(0,r.QD)("img",{src:"https://img.newzone.top/2022-11-01-18-17-13.png",alt:"",tabindex:"0",loading:"lazy"}),(0,r.QD)("figcaption",null,"FFmpeg 配置成功")],-1),Y=(0,r.QD)("h3",{id:"配置视频-音频设备",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#配置视频-音频设备"},[(0,r.QD)("span",null,"配置视频/音频设备")])],-1),w={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases",target:"_blank",rel:"noopener noreferrer"},v=(0,r.IL)('

    通过命令 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),x=(0,r.QD)("code",null,"-f gdigrab",-1),y={href:"https://ffmpeg.org/ffmpeg-all.html#gdigrab",target:"_blank",rel:"noopener noreferrer"},z={href:"https://ffmpeg.org/ffmpeg-devices.html#avfoundation",target:"_blank",rel:"noopener noreferrer"},C={href:"https://ffmpeg.org/ffmpeg-all.html#x11grab",target:"_blank",rel:"noopener noreferrer"},K=(0,r.IL)('
  • -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
  • ',7),A=(0,r.IL)('

    除上方命令外,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),S=(0,r.QD)("code",null,"real-time buffer [xxxxxx] [video input] too full or near too full (181% of size: 3041280 [rtbufsize parameter])! frame dropped!",-1),B={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/issues/136",target:"_blank",rel:"noopener noreferrer"},L=(0,r.IL)('

    摄像头分辨率错误

    如果摄像头画面出现裁切,分辨率与预期不同,可以检查摄像头录制属性和摄像头应用输出分辨率。例如,部分版本的 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),M={href:"https://ffmpeg.guide/",target:"_blank",rel:"noopener noreferrer"},P=(0,r.QD)("p",null,"当然,本文的目的是分享我监控自己的延伸,分享使用 FFmpeg 录屏的入门方法,而非完全掌握,因此只介绍了录屏相关的核心命令。如果有需要,还是推荐研究一下官方文档,或者跟着我做的试一试,说不定就有新收获。",-1),E={href:"https://sspai.com/post/76637",target:"_blank",rel:"noopener noreferrer"},T=(0,r.QD)("hr",{class:"footnotes-sep"},null,-1),W={class:"footnotes"},I={class:"footnotes-list"},O={id:"footnote1",class:"footnote-item"},R={href:"https://blog.csdn.net/m0_60352504/article/details/126762161",target:"_blank",rel:"noopener noreferrer"},q=(0,r.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),U={id:"footnote2",class:"footnote-item"},H={href:"https://blog.csdn.net/JineD/article/details/123057086",target:"_blank",rel:"noopener noreferrer"},Z=(0,r.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),V={id:"footnote3",class:"footnote-item"},N={href:"https://ffmpeg.org/ffmpeg-codecs.html#libx265",target:"_blank",rel:"noopener noreferrer"},j=(0,r.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),G={id:"footnote4",class:"footnote-item"},J={href:"https://magiclen.org/x265-preset/",target:"_blank",rel:"noopener noreferrer"},X=(0,r.QD)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),$={id:"footnote5",class:"footnote-item"},ee={href:"https://blog.csdn.net/zhying719/article/details/123059209",target:"_blank",rel:"noopener noreferrer"},oe=(0,r.QD)("a",{href:"#footnote-ref5",class:"footnote-backref"},"↩︎",-1),te={id:"footnote6",class:"footnote-item"},re={href:"https://www.cnblogs.com/leisure_chn/p/10434209.html",target:"_blank",rel:"noopener noreferrer"},ne=(0,r.QD)("a",{href:"#footnote-ref6",class:"footnote-backref"},"↩︎",-1),ae={id:"footnote7",class:"footnote-item"},le={href:"https://blog.csdn.net/guanyijun123/article/details/121270650",target:"_blank",rel:"noopener noreferrer"},pe=(0,r.QD)("a",{href:"#footnote-ref7",class:"footnote-backref"},"↩︎",-1),ie={},se=(0,t(9720).c)(ie,[["render",function(e,o){const t=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[n,(0,r.QD)("p",null,[(0,r.mY)("开始"),(0,r.QD)("a",a,[(0,r.mY)("自我监控"),(0,r.K2)(t)]),(0,r.mY)("后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。")]),(0,r.QD)("p",null,[(0,r.mY)("最初,我使用了免费开源的 "),(0,r.QD)("a",l,[(0,r.mY)("VLC"),(0,r.K2)(t)]),(0,r.mY)(",这也是我监控文章中采用的方案。它能调节输出视频的编码、帧率、格式,但操作麻烦,而且不能同时录屏和摄像头,暂停录制也容易导致程序崩溃。")]),(0,r.QD)("p",null,[(0,r.mY)("然后,我尝试了 "),(0,r.QD)("a",p,[(0,r.mY)("OBS"),(0,r.K2)(t)]),(0,r.mY)(",它的录制功能极其强大,可以任意添加摄像头、文字、图像等,但输出限制多,生成的视频体积过大。同时,OBS 不支持录制画面与直播画面分开,而我平常习惯边开直播边工作,这令我只能放弃 OBS 录屏。")]),(0,r.QD)("p",null,[(0,r.mY)("接着,我发现了 7.8k Star 的 "),(0,r.QD)("a",i,[(0,r.mY)("Captura"),(0,r.K2)(t)]),(0,r.mY)(",它的自由度较高,能自定义叠加元素,但项目已于 2018 年停止更新,使用时经常碰到莫名其妙的报错,很不稳定。")]),s,(0,r.QD)("p",null,[(0,r.mY)("我用 "),(0,r.QD)("a",f,[(0,r.mY)("Bandicam"),(0,r.K2)(t)]),(0,r.mY)(" 录制了一周的视频。与 Captura 相比,Bandicam 的稳定性有了很大的提升,不会突然崩溃,还有降噪和内录扬声器功能,但它偶尔会丢失摄像头,导致无法自动录屏。")]),c,(0,r.QD)("ul",null,[d,(0,r.QD)("li",null,[(0,r.QD)("a",m,[(0,r.mY)("FlashBack Express"),(0,r.K2)(t)]),(0,r.mY)(":能调节帧率,画面镜像,虚化背景,但免费版只支持 2 小时内的录制。")]),(0,r.QD)("li",null,[(0,r.QD)("a",g,[(0,r.mY)("Mirillis Action!"),(0,r.K2)(t)]),(0,r.mY)(":高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。")]),(0,r.QD)("li",null,[(0,r.QD)("a",h,[(0,r.mY)("oCam"),(0,r.K2)(t)]),(0,r.mY)(":打着免费招牌但有弹窗广告,且输出视频偏大。")]),(0,r.QD)("li",null,[(0,r.QD)("a",u,[(0,r.mY)("ShareX"),(0,r.K2)(t)]),(0,r.mY)(":免费开源强大的截图软件,具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。")])]),b,(0,r.QD)("ol",null,[(0,r.QD)("li",null,[(0,r.QD)("p",null,[(0,r.mY)("下载最新版 "),(0,r.QD)("a",D,[(0,r.mY)("FFmpeg"),(0,r.K2)(t)]),(0,r.mY)(",Windows 环境选择 "),F,(0,r.mY)(",GPL 版本包含了所有依赖项。")])]),Q]),_,k,Y,(0,r.QD)("p",null,[(0,r.mY)("FFmpeg 的录制命令 gdigrab 不支持音频录制,也不支持直接调用摄像头,此时需使用开源的 "),(0,r.QD)("a",w,[(0,r.mY)("screen-capture-recorder-to-video-windows-free"),(0,r.K2)(t)]),(0,r.mY)(" 增强 FFmpeg 的录制功能,其最新版本为 0.12.12。")]),v,(0,r.QD)("ul",null,[(0,r.QD)("li",null,[x,(0,r.mY)(" 使用 FFmpeg 内置的 Windows 屏幕录制命令 "),(0,r.QD)("a",y,[(0,r.mY)("gdigrab"),(0,r.K2)(t)]),(0,r.mY)(",录制对象可为全屏、指定范围和指定程序。MacOS 录屏方法为 "),(0,r.QD)("a",z,[(0,r.mY)("AVFoundation"),(0,r.K2)(t)]),(0,r.mY)(",Linux 录屏方法为 "),(0,r.QD)("a",C,[(0,r.mY)("x11grab"),(0,r.K2)(t)]),(0,r.mY)("。")]),K]),A,(0,r.QD)("p",null,[(0,r.mY)("报错 "),S,(0,r.mY)(",解决方案参考 "),(0,r.QD)("a",B,[(0,r.mY)("issue 136"),(0,r.K2)(t)]),(0,r.mY)("。尽管我仍然遇到了这个错误,但它并未影响录屏的效果。")]),L,(0,r.QD)("p",null,[(0,r.mY)("前几天,群里有人分享了快速生成 FFmpeg 命令的工具 "),(0,r.QD)("a",M,[(0,r.mY)("FFmpeg.guide"),(0,r.K2)(t)]),(0,r.mY)("。本以为能帮新手快速入门,使用后却感觉不实用。FFmpeg 最快入门的方法还是得看官方文档,也有一些爱好者整理翻译了相关的中文/视频教程。前期会耗费一些时间,但只要定制好自己要的命令,之后就能一直使用。")]),P,(0,r.QD)("p",null,[(0,r.mY)("本文于「"),(0,r.QD)("a",E,[(0,r.mY)("少数派首发"),(0,r.K2)(t)]),(0,r.mY)("」。")]),T,(0,r.QD)("section",W,[(0,r.QD)("ol",I,[(0,r.QD)("li",O,[(0,r.QD)("p",null,[(0,r.QD)("a",R,[(0,r.mY)("ffmpeg 录屏命令"),(0,r.K2)(t)]),(0,r.mY)(),q])]),(0,r.QD)("li",U,[(0,r.QD)("p",null,[(0,r.QD)("a",H,[(0,r.mY)("ffmpeg 基础使用"),(0,r.K2)(t)]),(0,r.mY)(),Z])]),(0,r.QD)("li",V,[(0,r.QD)("p",null,[(0,r.QD)("a",N,[(0,r.mY)("libx265 编码说明"),(0,r.K2)(t)]),(0,r.mY)(),j])]),(0,r.QD)("li",G,[(0,r.QD)("p",null,[(0,r.QD)("a",J,[(0,r.mY)("x265 的 preset 与编码速度、视频画质以及比特率的关联"),(0,r.K2)(t)]),(0,r.mY)(),X])]),(0,r.QD)("li",$,[(0,r.QD)("p",null,[(0,r.QD)("a",ee,[(0,r.mY)("FFmpeg 音视频倍速控制"),(0,r.K2)(t)]),(0,r.mY)(),oe])]),(0,r.QD)("li",te,[(0,r.QD)("p",null,[(0,r.QD)("a",re,[(0,r.mY)("FFmpeg 中 overlay 滤镜用法 - 水印及画中画"),(0,r.K2)(t)]),(0,r.mY)(),ne])]),(0,r.QD)("li",ae,[(0,r.QD)("p",null,[(0,r.QD)("a",le,[(0,r.mY)("ffmpeg 调整缩放裁剪视频的基础知识 (转)"),(0,r.K2)(t)]),(0,r.mY)(),pe])])])])])}]]),fe=JSON.parse('{"path":"/posts/2022-11-03-ffmpeg_screen_recording.html","title":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg","lang":"zh-CN","frontmatter":{"title":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg","date":"2022-11-03T00:00:00.000Z","category":["工具"],"tag":["录屏"],"order":-50,"description":" 当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。 开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。 最初,我使用了免费开源的 VLC,这也是我监控文章中采用的方案。它能调节输...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg"}],["meta",{"property":"og:description","content":" 当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。 开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。 最初,我使用了免费开源的 VLC,这也是我监控文章中采用的方案。它能调节输..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-11-03-13-16-44.png \\"输出画面如图例\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"录屏"}],["meta",{"property":"article:published_time","content":"2022-11-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg\\",\\"image\\":[\\"https://img.newzone.top/2022-11-03-13-16-44.png \\\\\\"输出画面如图例\\\\\\"\\",\\"https://img.newzone.top/2022-11-01-18-13-49.png \\\\\\"FFmpeg 全局变量设置\\\\\\"\\",\\"https://img.newzone.top/2022-11-01-18-17-13.png \\\\\\"FFmpeg 配置成功\\\\\\"\\",\\"https://img.newzone.top/2022-11-03-10-33-52.png \\\\\\"查看视频/音频设备列表\\\\\\"\\"],\\"datePublished\\":\\"2022-11-03T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么 FFmpeg","slug":"为什么-ffmpeg","link":"#为什么-ffmpeg","children":[]},{"level":2,"title":"录屏准备","slug":"录屏准备","link":"#录屏准备","children":[{"level":3,"title":"配置 FFmpeg","slug":"配置-ffmpeg","link":"#配置-ffmpeg","children":[]},{"level":3,"title":"配置视频/音频设备","slug":"配置视频-音频设备","link":"#配置视频-音频设备","children":[]}]},{"level":2,"title":"录制屏幕","slug":"录制屏幕","link":"#录制屏幕","children":[]},{"level":2,"title":"录制摄像头","slug":"录制摄像头","link":"#录制摄像头","children":[]},{"level":2,"title":"输出视频:画中画","slug":"输出视频-画中画","link":"#输出视频-画中画","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"Could not set video options","slug":"could-not-set-video-options","link":"#could-not-set-video-options","children":[]},{"level":3,"title":"real-time buffer","slug":"real-time-buffer","link":"#real-time-buffer","children":[]},{"level":3,"title":"摄像头分辨率错误","slug":"摄像头分辨率错误","link":"#摄像头分辨率错误","children":[]},{"level":3,"title":"录制画面偏移","slug":"录制画面偏移","link":"#录制画面偏移","children":[]},{"level":3,"title":"脚本启动报错","slug":"脚本启动报错","link":"#脚本启动报错","children":[]}]},{"level":2,"title":"后续","slug":"后续","link":"#后续","children":[]}],"git":{"createdTime":1667619665000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":12}]},"readingTime":{"minutes":10.37,"words":3111},"filePathRelative":"_posts/2022-11-03-ffmpeg_screen_recording.md","localizedDate":"2022年11月3日","excerpt":"
    \\n

    当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。

    \\n
    \\n

    开始自我监控后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-0fa44838.f55c6c57.js b/assets/js/v-0fa44838.f55c6c57.js deleted file mode 100644 index 0984bb113..000000000 --- a/assets/js/v-0fa44838.f55c6c57.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4812],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},7062:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/","title":"头脑驿站 分类","lang":"zh-CN","frontmatter":{"title":"头脑驿站 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"头脑驿站","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"头脑驿站 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"头脑驿站 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-108ba214.a69d6052.js b/assets/js/v-108ba214.a69d6052.js deleted file mode 100644 index b96d40566..000000000 --- a/assets/js/v-108ba214.a69d6052.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[192],{9720:(e,a)=>{a.c=(e,a)=>{const r=e.__vccOpts||e;for(const[e,n]of a)r[e]=n;return r}},808:(e,a,r)=>{r.r(a),r.d(a,{comp:()=>ue,data:()=>me});var n=r(3968);const t=(0,n.IL)('

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

    但是,迅雷已经堕落

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

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

    为什么选择 Aria2?

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

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

    真·懒人包

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

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

    修改默认下载目录:

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

    修改服务器默认连接数:

    # 同一服务器连接数,添加时可指定,默认:1\nmax-connection-per-server=16\n

    修改监听端口 6800:

    # RPC 监听端口,端口被占用时可以修改,默认:6800\n# 端口修改后,需要重新启动 aria2c.exe,并确保页面设置中的 RPC 地址已更改为新端口。\nrpc-listen-port=6800\n

    开启 BT 下列设置:

    enable-dht=true\nbt-enable-lpd=true\nenable-peer-exchange=true\n
    ',8),_={href:"https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt",target:"_blank",rel:"noopener noreferrer"},x=(0,n.QD)("code",null,",",-1),y=(0,n.IL)('
    # bt-tracker 更新,解决 Aria2 BT 下载速度慢没速度的问题\nbt-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\n

    其他设置不常用,有时间的话,你可以慢慢调整。

    ',2),T=(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("Aira2 没有原生应用界面,可以输入网址 "),(0,n.QD)("code",null,"http://aria2c.com"),(0,n.mY)(" 使用第三方下载界面。该页面会自动与本地的 aira2c 程序关联,实现下载管理,建议把其收藏到书签,以便日后使用。"),(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote2"},"[2]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref2"})])])],-1),z=(0,n.QD)("code",null,"http://localhost:6800/jsonrpc",-1),N=(0,n.QD)("strong",null,"链接须为 http 而非 https",-1),K={href:"https://www.seoipo.com/software/Aria2/",target:"_blank",rel:"noopener noreferrer"},B=(0,n.QD)("h2",{id:"aria2-进阶",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#aria2-进阶"},[(0,n.QD)("span",null,"Aria2 进阶")])],-1),I=(0,n.QD)("h3",{id:"更换-aria2-界面",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#更换-aria2-界面"},[(0,n.QD)("span",null,"更换 Aria2 界面")])],-1),C={href:"https://github.com/mayswind/AriaNg",target:"_blank",rel:"noopener noreferrer"},P=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/20180516104758.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"AriaNg 界面")],-1),R={href:"https://github.com/mayswind/AriaNg/releases",target:"_blank",rel:"noopener noreferrer"},O=(0,n.QD)("code",null,"cannot get language resources, and will display in default language",-1),q={href:"https://github.com/mayswind/AriaNg/releases",target:"_blank",rel:"noopener noreferrer"},H=(0,n.QD)("code",null,"cannot get language resources, and will display in default language",-1),U=(0,n.IL)('

    如果 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 接管浏览器的下载管理,需安装插件/扩展。

    ',7),j={href:"https://chrome.google.com/webstore/detail/nimeojfecmndgolmlmjghjmbpdkhhogl",target:"_blank",rel:"noopener noreferrer"},L={href:"https://wwi.lanzoui.com/i4Fmeetsdaj",target:"_blank",rel:"noopener noreferrer"},Z=(0,n.QD)("code",null,".crx",-1),S=(0,n.QD)("code",null,"chrome://extensions/",-1),W={href:"https://addons.mozilla.org/en-US/firefox/addon/aria2-integration/",target:"_blank",rel:"noopener noreferrer"},G=(0,n.IL)('

    安装完「添加到 aria2」扩展后,右键扩展图标,点击「选项」>「设置」,设置如下:

    • 最小监视:10 M,低于该容量将由浏览器下载。如果 Aria2 要接手所有下载,可以将最小监视设为 0.001
    • JSON-RPC 链接:http://localhost:6800/jsonrpc

    注意:「添加到 aria2」图标显示的 en 表示处于开启状态,dis 表示处于关闭状态,点击图标可以切换使用状态。

    Aria2 启动器

    每次启动 Aria2 下载时,都需要执行两个文件:打开 WebUI 链接和 aria2c,这有点麻烦。因此,我使用 AutoHotkey 做了一个启动器,它可以检测 aria2c 运行状态,并一键打开下载界面,以简化 Aria 的启动过程。

    ',5),J={href:"https://wwz.lanzouf.com/iqud50ebl06d",target:"_blank",rel:"noopener noreferrer"},M=(0,n.QD)("code",null,"D:\\Aria2",-1),E=(0,n.QD)("strong",null,"AriaNg 启动器",-1),F={href:"https://github.com/mayswind/AriaNg-DailyBuild/archive/master.zip",target:"_blank",rel:"noopener noreferrer"},V=(0,n.QD)("code",null,"Aria2\\AriaNg\\index.html",-1),X=(0,n.QD)("li",null,[(0,n.QD)("strong",null,"Aria2c 启动器"),(0,n.mY)(":将 "),(0,n.QD)("code",null,"https://aria2c.com"),(0,n.mY)(" 作为默认下载界面。该设置较旧,需确保 JSON-RPC Path 为 "),(0,n.QD)("code",null,"http://localhost:6800/jsonrpc"),(0,n.mY)("。")],-1),$=(0,n.QD)("hr",{class:"footnotes-sep"},null,-1),ee={class:"footnotes"},ae={class:"footnotes-list"},re={id:"footnote1",class:"footnote-item"},ne={href:"https://zhuanlan.zhihu.com/p/30666881",target:"_blank",rel:"noopener noreferrer"},te=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),oe={id:"footnote2",class:"footnote-item"},le={href:"https://www.appinn.com/aria2-in-windows-setup/",target:"_blank",rel:"noopener noreferrer"},ie=(0,n.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ce={id:"footnote3",class:"footnote-item"},se={href:"http://www.senra.me/solutions-to-aria2-bt-metalink-download-slowly/",target:"_blank",rel:"noopener noreferrer"},pe=(0,n.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),de={},ue=(0,r(9720).c)(de,[["render",function(e,a){const r=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[t,(0,n.QD)("p",null,[(0,n.mY)("真·懒人包:"),(0,n.QD)("a",o,[(0,n.mY)("https://www.seoipo.com/software/Aria2/"),(0,n.K2)(r)])]),l,i,c,s,p,d,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("下载 "),(0,n.QD)("a",u,[(0,n.mY)("Aria2 快速设置包"),(0,n.K2)(r)]),(0,n.mY)("或"),(0,n.QD)("a",m,[(0,n.mY)("备用链接"),(0,n.K2)(r)]),(0,n.mY)(",将其解压到存放文件夹,例如 "),h,(0,n.mY)("。")])]),(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("官网下载 "),(0,n.QD)("a",g,[(0,n.mY)("Aria2 程序"),(0,n.K2)(r)]),(0,n.mY)("(Windows 选择 "),(0,n.QD)("a",f,[(0,n.mY)("aria2-1.37.0-win-64bit-build1.zip"),(0,n.K2)(r)]),(0,n.mY)("),然后解压到快速设置包的存放文件夹中,替代其中的 "),D,(0,n.mY)(" 程序。")]),b]),Q,(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("参照"),(0,n.QD)("a",A,[(0,n.mY)("懒人包配置"),(0,n.K2)(r)]),(0,n.mY)("修改 "),k,(0,n.mY)(",更多设置参考 "),(0,n.QD)("a",Y,[(0,n.mY)("aria2c 官方文档"),(0,n.K2)(r)]),(0,n.mY)("。"),w]),v,(0,n.QD)("p",null,[(0,n.mY)("在文档最后一行添加 BT trackers,最新 trackers 列表从 "),(0,n.QD)("a",_,[(0,n.mY)("ngosang/trackerslist"),(0,n.K2)(r)]),(0,n.mY)(" 中获取,tracker 中用 "),x,(0,n.mY)(" 隔开。")]),y]),T]),(0,n.QD)("p",null,[(0,n.mY)("如果出现「Aria2 RPC 服务器错误」,请检查 JSON-RPC Path 是否为 "),z,(0,n.mY)("。注意,页面"),N,(0,n.mY)("。如果依然报错,则说明 aria2.conf 配置有误,建议下载 "),(0,n.QD)("a",K,[(0,n.mY)("真·懒人包"),(0,n.K2)(r)]),(0,n.mY)("。")]),B,I,(0,n.QD)("p",null,[(0,n.QD)("a",C,[(0,n.mY)("AriaNg"),(0,n.K2)(r)]),(0,n.mY)(" 提供了类似传统下载软件的界面,简便易用。")]),P,(0,n.QD)("p",null,[(0,n.mY)("使用方法:下载并解压 "),(0,n.QD)("a",R,[(0,n.mY)("AriaNg"),(0,n.K2)(r)]),(0,n.mY)(" AllInOne,运行目录下的 index.html,打开 Aria2 WebUI 界面,将页面链接收藏到书签以便后续使用 Aria2。注意,本地运行要用 AllInOne 版本,否则会出现 "),O,(0,n.mY)("。")]),(0,n.QD)("p",null,[(0,n.mY)("操作步骤如下:首先,下载并解压 "),(0,n.QD)("a",q,[(0,n.mY)("AriaNg"),(0,n.K2)(r)]),(0,n.mY)(" AllInOne 版本。然后,运行目录中的 index.html 文件,以打开 Aria2 WebUI 界面。为方便后续使用,建议将页面链接添加至书签。需注意,本地运行需使用 AllInOne 版本,否则可能会出现 "),H,(0,n.mY)(" 的错误提示。")]),U,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.mY)("Chrome:安装"),(0,n.QD)("a",j,[(0,n.mY)("添加到 aria2"),(0,n.K2)(r)]),(0,n.mY)(" 扩展。下载包可以用"),(0,n.QD)("a",L,[(0,n.mY)("国内搬运地址"),(0,n.K2)(r)]),(0,n.mY)(",或是懒人包内置文件。 如果浏览器无法直接安装 "),Z,(0,n.mY)(" 格式的扩展,可以将文件解压到新文件夹「xxx」,然后在浏览器的地址栏输入 "),S,(0,n.mY)(" 开启开发者模式,点击加载已解压的扩展程序,选中刚才解压的文件夹「xxx」。")]),(0,n.QD)("li",null,[(0,n.mY)("Firefox:安装 "),(0,n.QD)("a",W,[(0,n.mY)("Aria2 Download Manager Integration"),(0,n.K2)(r)]),(0,n.mY)(" 扩展,可参考下方的 Chrome 扩展设置进行配置。")])]),G,(0,n.QD)("p",null,[(0,n.mY)("下载 "),(0,n.QD)("a",J,[(0,n.mY)("Aria2 启动器"),(0,n.K2)(r)]),(0,n.mY)(",然后将其解压到 Aria2 运行目录,例如 "),M,(0,n.mY)("。Aria2 启动器提供了两种方式,只需选择其中一种即可。")]),(0,n.QD)("ul",null,[(0,n.QD)("li",null,[E,(0,n.mY)("(推荐):使用 AriaNg 本地版作为下载管理界面。在使用该启动器前,需将 "),(0,n.QD)("a",F,[(0,n.mY)("AriaNg"),(0,n.K2)(r)]),(0,n.mY)(" 解压到 Aria2 目录下,并将文件夹名改为 AriaNg,然后打开文件 index.html,该文件位于 "),V,(0,n.mY)("。")]),X]),$,(0,n.QD)("section",ee,[(0,n.QD)("ol",ae,[(0,n.QD)("li",re,[(0,n.QD)("p",null,[(0,n.QD)("a",ne,[(0,n.mY)("Aria2 基础上手指南"),(0,n.K2)(r)]),(0,n.mY)(),te])]),(0,n.QD)("li",oe,[(0,n.QD)("p",null,[(0,n.QD)("a",le,[(0,n.mY)("aria2 懒人安装教程"),(0,n.K2)(r)]),(0,n.mY)(),ie])]),(0,n.QD)("li",ce,[(0,n.QD)("p",null,[(0,n.QD)("a",se,[(0,n.mY)("解决 Aria2 BT 下载速度慢没速度的问题"),(0,n.K2)(r)]),(0,n.mY)(),pe])])])])])}]]),me=JSON.parse('{"path":"/posts/2018-05-15-aria2_a_new_download_tool.html","title":"抛弃迅雷,Aria2 新手入门","lang":"zh-CN","frontmatter":{"title":"抛弃迅雷,Aria2 新手入门","date":"2018-05-15T00:00:00.000Z","category":["工具"],"tag":["Aria2","迅雷"],"star":true,"order":-17,"description":"迅雷已经用了 10 年,一直将它视为最快也最方便的下载工具,也一直购买迅雷会员。 但是,迅雷已经堕落。 thunder:\\\\\\\\ 迅雷专属链接越来越少,下载基本是磁力链接和 BT 种子; 迅雷会员加速不再有效,大量资源速度为 0(会员虽然还有一年多,但已经没用了); 迅雷关闭旧版功能,迫使大家升级迅雷 U 享版,但升级后,发现新版迅雷会强制接收所有下载。 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-15-aria2_a_new_download_tool.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"抛弃迅雷,Aria2 新手入门"}],["meta",{"property":"og:description","content":"迅雷已经用了 10 年,一直将它视为最快也最方便的下载工具,也一直购买迅雷会员。 但是,迅雷已经堕落。 thunder:\\\\\\\\ 迅雷专属链接越来越少,下载基本是磁力链接和 BT 种子; 迅雷会员加速不再有效,大量资源速度为 0(会员虽然还有一年多,但已经没用了); 迅雷关闭旧版功能,迫使大家升级迅雷 U 享版,但升级后,发现新版迅雷会强制接收所有下载。 ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20191210232831.png \\"GitHub 官方仓库下载 Aria2\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-11T21:11:02.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"抛弃迅雷,Aria2 新手入门"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Aria2"}],["meta",{"property":"article:tag","content":"迅雷"}],["meta",{"property":"article:published_time","content":"2018-05-15T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-11T21:11:02.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"抛弃迅雷,Aria2 新手入门\\",\\"image\\":[\\"https://img.newzone.top/20191210232831.png \\\\\\"GitHub 官方仓库下载 Aria2\\\\\\"\\",\\"https://img.newzone.top/20180516104758.png \\\\\\"AriaNg 界面\\\\\\"\\"],\\"datePublished\\":\\"2018-05-15T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-11T21:11:02.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么选择 Aria2?","slug":"为什么选择-aria2","link":"#为什么选择-aria2","children":[]},{"level":2,"title":"真·懒人包","slug":"真·懒人包","link":"#真·懒人包","children":[]},{"level":2,"title":"Aria2 设置","slug":"aria2-设置","link":"#aria2-设置","children":[]},{"level":2,"title":"Aria2 进阶","slug":"aria2-进阶","link":"#aria2-进阶","children":[{"level":3,"title":"更换 Aria2 界面","slug":"更换-aria2-界面","link":"#更换-aria2-界面","children":[]},{"level":3,"title":"Aira2 下载预热","slug":"aira2-下载预热","link":"#aira2-下载预热","children":[]},{"level":3,"title":"接管浏览器下载","slug":"接管浏览器下载","link":"#接管浏览器下载","children":[]}]},{"level":2,"title":"Aria2 启动器","slug":"aria2-启动器","link":"#aria2-启动器","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1705007462000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":30}]},"readingTime":{"minutes":7.06,"words":2117},"filePathRelative":"_posts/2018-05-15-aria2_a_new_download_tool.md","localizedDate":"2018年5月15日","excerpt":"

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

    \\n

    但是,迅雷已经堕落

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

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

      \\n
      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-11e5a304.6339dcd8.js b/assets/js/v-11e5a304.6339dcd8.js deleted file mode 100644 index d1cb429af..000000000 --- a/assets/js/v-11e5a304.6339dcd8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1460],{9720:(n,e)=>{e.c=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},172:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>y,data:()=>D});var a=t(3968);const s=(0,a.IL)('

    作为一个重度 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),o=(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("strong",null,"关闭光猫路由"),(0,a.mY)(":通过电话联系宽带运营商,要求关闭光猫的路由功能。对于那些默认不提供公网 IP 的运营商,也可以在这个环节让运营商给你分配一个公网 IP。如果碰到死板的客服,找你要开通理由,不要正面回答。")])],-1),p=(0,a.QD)("li",null,[(0,a.QD)("p",null,"家用宽带通常使用动态 IP,且无法提供对外的 80 接口。可以使用动态 DNS 插件来实现域名与家庭宽带 IP 的实时绑定,以达到固定链接打开 NAS 服务的效果。")],-1),l=(0,a.QD)("p",null,[(0,a.QD)("strong",null,"动态 DNS(DDNS) 设置"),(0,a.mY)(",以下以 OpenWrt+Cloudflare 为例。")],-1),r={href:"https://p3terx.com/archives/openwrt-cloudflare-ddns.html",target:"_blank",rel:"noopener noreferrer"},i=(0,a.QD)("code",null,"ddns-scripts_cloudflare.com-v4",-1),S={href:"https://dash.cloudflare.com/profile/api-tokens",target:"_blank",rel:"noopener noreferrer"},c={href:"https://ram.console.aliyun.com/users",target:"_blank",rel:"noopener noreferrer"},u=(0,a.QD)("figure",null,[(0,a.QD)("img",{src:"https://img.newzone.top/2022-05-05-14-41-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,a.QD)("figcaption")],-1),g=(0,a.IL)('

    如果你使用的是内网宽带,无法提供公网 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 文件,然后放入如下代码\n## yyy 代表链接参数,方便区分不同 rss 源,qqq 代表内部 rss 源路径\n## 注意:如果链接参数 yyy 参数中有中文,可用 UrlEncode 编码,避免 rss 阅读器报错。\n<?php\n    if($_GET['type']=="yyy"){\n        echo file_get_contents("http://home.xxx.com:34567/qqq");\n    }elseif($_GET['type']=="zzz"){\n        echo file_get_contents("http://home.xxx.com:34567/wwww");\n    }\n?>\n

    如果你没有服务器或不愿意再折腾,也可以尝试其他的 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,可以参考以下教程。

    ',16),d={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},h={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},k={},y=(0,t(9720).c)(k,[["render",function(n,e){const t=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[s,(0,a.QD)("ol",null,[o,p,(0,a.QD)("li",null,[l,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("Cloudflare 动态 DNS 配置 ("),(0,a.QD)("a",r,[(0,a.mY)("教程"),(0,a.K2)(t)]),(0,a.mY)("):进入系统 - 软件包,搜索「cloudflare」,安装 "),i,(0,a.mY)(",然后重启路由器。")]),(0,a.QD)("li",null,[(0,a.mY)("进入服务 - 动态 DNS,Cloudflare 登录密码为 "),(0,a.QD)("a",S,[(0,a.mY)("Cloudflare API"),(0,a.K2)(t)]),(0,a.mY)(" 中的 Global API Key。如果你的域名托管在阿里云上,可以在 "),(0,a.QD)("a",c,[(0,a.mY)("RAM 访问控制"),(0,a.K2)(t)]),(0,a.mY)(" 中创建拥有 AliyunDNSFullAccess 权限的 AccessKey。动态 DNS 的用户名和密码分别可以使用 AccessKey ID 和 AccessKey Secret。")])]),u])]),g,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",d,[(0,a.mY)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,a.K2)(t)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",m,[(0,a.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,a.K2)(t)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",h,[(0,a.mY)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,a.K2)(t)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",R,[(0,a.mY)("RSS 速成篇 2:RSSHub 自部署"),(0,a.K2)(t)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",b,[(0,a.mY)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,a.K2)(t)])])]),(0,a.QD)("li",null,[(0,a.QD)("p",null,[(0,a.QD)("a",f,[(0,a.mY)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,a.K2)(t)])])])])])}]]),D=JSON.parse('{"path":"/posts/2021-10-23-nas_with_rsshub_and_huginn.html","title":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS","lang":"zh-CN","frontmatter":{"title":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS","date":"2021-10-23T00:00:00.000Z","category":["自动化"],"tag":["nas","rss"],"order":-38,"description":"作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时。 这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"}],["meta",{"property":"og:description","content":"作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时。 这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-05-05-14-40-43.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-11-12T02:07:50.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"nas"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2021-10-23T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-11-12T02:07:50.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS\\",\\"image\\":[\\"https://img.newzone.top/2022-05-05-14-40-43.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-41-01.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-41-15.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-05-14-41-31.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2021-10-23T00:00:00.000Z\\",\\"dateModified\\":\\"2023-11-12T02:07:50.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"事前准备","slug":"事前准备","link":"#事前准备","children":[]},{"level":2,"title":"Docker 镜像安装","slug":"docker-镜像安装","link":"#docker-镜像安装","children":[]},{"level":2,"title":"域名绑定","slug":"域名绑定","link":"#域名绑定","children":[]},{"level":2,"title":"RSS 转码","slug":"rss-转码","link":"#rss-转码","children":[]},{"level":2,"title":"总结","slug":"总结","link":"#总结","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1699754870000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":11}]},"readingTime":{"minutes":6.74,"words":2022},"filePathRelative":"_posts/2021-10-23-nas_with_rsshub_and_huginn.md","localizedDate":"2021年10月23日","excerpt":"

    作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时

    \\n

    这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然而,由于配置过低,服务器频繁重启,维护成本不断上升。后来,我尝试了一些配置较高的国外服务器,例如 2 核 4G 低端服务器,但遇到了严重的超售和性能不稳定的问题。总的来说,购买国外的低端服务器(特别是俄罗斯服务器)就是把钱扔进水里。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-12177e58.ee5f1868.js b/assets/js/v-12177e58.ee5f1868.js deleted file mode 100644 index b2aa9f7ec..000000000 --- a/assets/js/v-12177e58.ee5f1868.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1795],{9720:(e,r)=>{r.c=(e,r)=>{const o=e.__vccOpts||e;for(const[e,l]of r)o[e]=l;return o}},7096:(e,r,o)=>{o.r(r),o.d(r,{comp:()=>me,data:()=>ie});var l=o(3968);const n=(0,l.QD)("p",null,"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。",-1),t=(0,l.QD)("h2",{id:"浏览器",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#浏览器"},[(0,l.QD)("span",null,"浏览器")])],-1),a={href:"https://chrome.google.com/webstore/detail/extension-manager/gjldcdngmdknpinoemndlidpcabkggco",target:"_blank",rel:"noopener noreferrer"},m={href:"https://chrome.google.com/webstore/detail/bookmarks-clean-up/oncbjlgldmiagjophlhobkogeladjijl",target:"_blank",rel:"noopener noreferrer"},i={href:"https://chrome.google.com/webstore/detail/better-history/egehpkpgpgooebopjihjmnpejnjafefi",target:"_blank",rel:"noopener noreferrer"},p={href:"https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno",target:"_blank",rel:"noopener noreferrer"},h=(0,l.QD)("h2",{id:"标签页",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#标签页"},[(0,l.QD)("span",null,"标签页")])],-1),g={href:"https://chromewebstore.google.com/detail/custom-new-tab-url/mmjbdbjnoablegbkcklggeknkfcjkjia",target:"_blank",rel:"noopener noreferrer"},c={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"},b={href:"https://chrome.google.com/webstore/detail/goto-tab/hjfkaobgkmaeomgdhmhhipdbjdhhjkoi",target:"_blank",rel:"noopener noreferrer"},s={href:"https://chrome.google.com/webstore/detail/tab-wrangler/egnjhciaieeiiohknchakcodbpgjnchh",target:"_blank",rel:"noopener noreferrer"},d={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"},f=(0,l.QD)("h2",{id:"链接批量",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#链接批量"},[(0,l.QD)("span",null,"链接批量")])],-1),k={href:"https://chrome.google.com/webstore/detail/bulk-url-opener-extension/hgenngnjgfkdggambccohomebieocekm",target:"_blank",rel:"noopener noreferrer"},u={href:"https://chrome.google.com/webstore/detail/link-grabber/caodelkhipncidmoebgbbeemedohcdma",target:"_blank",rel:"noopener noreferrer"},D={href:"https://chrome.google.com/webstore/detail/linkclump/lfpjkncokllnfokkgpkobnkbkmelfefj",target:"_blank",rel:"noopener noreferrer"},Q=(0,l.QD)("code",null,"Z",-1),j={href:"https://chrome.google.com/webstore/detail/tabcopy/micdllihgoppmejpecmkilggmaagfdmb",target:"_blank",rel:"noopener noreferrer"},Y=(0,l.QD)("h2",{id:"图片视频",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#图片视频"},[(0,l.QD)("span",null,"图片视频")])],-1),w={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},_={href:"https://chrome.google.com/webstore/detail/fatkun-batch-download-ima/nnjjahlikiabnchcpehcpkdeckfgnohf",target:"_blank",rel:"noopener noreferrer"},C={href:"https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg",target:"_blank",rel:"noopener noreferrer"},K={href:"https://chrome.google.com/webstore/detail/screenity-screen-recorder/kbbdabhdfibnancpjfhlkhafgdilcnji",target:"_blank",rel:"noopener noreferrer"},E={href:"https://chrome.google.com/webstore/detail/picture-in-picture-extens/hkgfoiooedgoejojocmhlaklaeopbecg",target:"_blank",rel:"noopener noreferrer"},y={href:"https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk",target:"_blank",rel:"noopener noreferrer"},B=(0,l.QD)("h2",{id:"监视爬虫",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#监视爬虫"},[(0,l.QD)("span",null,"监视爬虫")])],-1),x={href:"https://chrome.google.com/webstore/detail/auto-refresh-plus-page-mo/hgeljhfekpckiiplhkigfehkdpldcggm",target:"_blank",rel:"noopener noreferrer"},A={href:"https://chrome.google.com/webstore/detail/distill-web-monitor/inlikjemeeknofckkjolnjbpehgadgge",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},S={href:"https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn",target:"_blank",rel:"noopener noreferrer"},T={href:"https://newzone.top/posts/2022-04-21-uivision_rpa.html",target:"_blank",rel:"noopener noreferrer"},z={href:"https://chrome.google.com/webstore/detail/imacros-for-chrome/cplklnmnlbnpmjogncfgfijoopmnlemp",target:"_blank",rel:"noopener noreferrer"},H={href:"https://www.appinn.com/automa/",target:"_blank",rel:"noopener noreferrer"},W=(0,l.QD)("h2",{id:"网页优化",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#网页优化"},[(0,l.QD)("span",null,"网页优化")])],-1),F={href:"https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo",target:"_blank",rel:"noopener noreferrer"},L={href:"https://greasyfork.org/zh-CN",target:"_blank",rel:"noopener noreferrer"},M={href:"https://chrome.google.com/webstore/detail/fix-contrast/pbbcgecjmpkglppfjjggkkbhdnlemhkg",target:"_blank",rel:"noopener noreferrer"},P={href:"https://chrome.google.com/webstore/detail/fasterchrome/nmgpnfccjfjhdenioncabecepjcmdnjg",target:"_blank",rel:"noopener noreferrer"},G={href:"https://chrome.google.com/webstore/detail/supercopy-enable-copy/onepmapfbjohnegdmfhndpefjkppbjkm",target:"_blank",rel:"noopener noreferrer"},R={href:"https://chrome.google.com/webstore/detail/autopagerize/igiofjhpmpihnifddepnpngfjhkfenbp",target:"_blank",rel:"noopener noreferrer"},N={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"},I={href:"https://chrome.google.com/webstore/detail/enhanced-github/anlikcnbgdeidpacdbdljnabclhahhmd",target:"_blank",rel:"noopener noreferrer"},O={href:"https://chrome.google.com/webstore/detail/sourcegraph/dgjhfomjieaadpoljlnidmbgkdffpack",target:"_blank",rel:"noopener noreferrer"},U={href:"https://chrome.google.com/webstore/detail/immersive-translate/bpoadfkcbjbfhfodiogcnhhhpibjhbnh",target:"_blank",rel:"noopener noreferrer"},V={href:"https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh",target:"_blank",rel:"noopener noreferrer"},Z=(0,l.QD)("h2",{id:"实用工具",tabindex:"-1"},[(0,l.QD)("a",{class:"header-anchor",href:"#实用工具"},[(0,l.QD)("span",null,"实用工具")])],-1),q={href:"https://chrome.google.com/webstore/detail/tango/lggdbpblkekjjbobadliahffoaobaknh/",target:"_blank",rel:"noopener noreferrer"},J={href:"https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/gdh1995/vimium-c/blob/master/README-zh.md",target:"_blank",rel:"noopener noreferrer"},$=(0,l.QD)("code",null,"chrome://flags/#extensions-on-chrome-urls",-1),ee={href:"https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb",target:"_blank",rel:"noopener noreferrer"},re={href:"https://chrome.google.com/webstore/detail/copy-as-markdown/nlaionblcaejecbkcillglodmmfhjhfi/",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://chrome.google.com/webstore/detail/get-favicon/gpipahagclehninhhjkhbkliinfofnhe",target:"_blank",rel:"noopener noreferrer"},le={href:"https://chrome.google.com/webstore/detail/similar-sites-discover-re/necpbmbhhdiplmfhmjicabdeighkndkn",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg/",target:"_blank",rel:"noopener noreferrer"},te={href:"https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg",target:"_blank",rel:"noopener noreferrer"},ae={},me=(0,o(9720).c)(ae,[["render",function(e,r){const o=(0,l.E1)("ExternalLinkIcon");return(0,l.Wz)(),(0,l.An)("div",null,[n,t,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",a,[(0,l.mY)("扩展管理器"),(0,l.K2)(o)]),(0,l.mY)(":快速管理扩展,对扩展分组启用。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",m,[(0,l.mY)("Bookmarks clean up"),(0,l.K2)(o)]),(0,l.mY)(":清理重复书签、空文件夹和失效链接,也能合并重复文件夹。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",i,[(0,l.mY)("Better History"),(0,l.K2)(o)]),(0,l.mY)(":按日期、小时罗列历史记录,搜索更便捷。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",p,[(0,l.mY)("Cookie Editor"),(0,l.K2)(o)]),(0,l.mY)(":管理、修改、导出 Cookie。")])])]),h,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",g,[(0,l.mY)("Custom New Tab URL"),(0,l.K2)(o)]),(0,l.mY)(":将新标签页重定向到一个特定的网址。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",c,[(0,l.mY)("zvTabs"),(0,l.K2)(o)]),(0,l.mY)(":一键关闭左侧标签。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",b,[(0,l.mY)("GoTo Tab"),(0,l.K2)(o)]),(0,l.mY)(":关键词搜索,快速定位标签页。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",s,[(0,l.mY)("Tab Wrangler"),(0,l.K2)(o)]),(0,l.mY)(":自动关闭不活动的标签页,并允许您轻松还原找回它们。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",d,[(0,l.mY)("iTab"),(0,l.K2)(o)]),(0,l.mY)(":自定义你的新标签页。")])])]),f,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",k,[(0,l.mY)("Bulk URL Opener Extension"),(0,l.K2)(o)]),(0,l.mY)(":批量打开链接,也可批量获取当前浏览器内所有页面网址链接。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",u,[(0,l.mY)("Link Grabber"),(0,l.K2)(o)]),(0,l.mY)(":批量提取、筛选、复制网页里各种链接。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",D,[(0,l.mY)("Linkclump"),(0,l.K2)(o)]),(0,l.mY)(":按住 "),Q,(0,l.mY)(" 键后,长按鼠标左键进行区域框选,区域内的链接可以进行批量打开、复制、书签,操作中会同步显示区域内的链接数。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",j,[(0,l.mY)("TabCopy"),(0,l.K2)(o)]),(0,l.mY)(":快速复制标签页链接。")])])]),Y,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",w,[(0,l.mY)("ImageAssistant"),(0,l.K2)(o)]),(0,l.mY)(":用于嗅探、分析网页图片并提供批量下载。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",_,[(0,l.mY)("Fatkun 图片批量下载"),(0,l.K2)(o)]),(0,l.mY)(":找出当前页面的所有图片,提供按分辨率、链接等筛选图片。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",C,[(0,l.mY)("FireShot"),(0,l.K2)(o)]),(0,l.mY)(":捕捉网页截图。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",K,[(0,l.mY)("Screenity"),(0,l.K2)(o)]),(0,l.mY)(":屏幕录像工具,可对屏幕进行捕获,注释,编辑、标注等。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",E,[(0,l.mY)("Picture-in-Picture Extension"),(0,l.K2)(o)]),(0,l.mY)(":视频画中画。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",y,[(0,l.mY)("Video Speed Controller"),(0,l.K2)(o)]),(0,l.mY)(":使用快捷方式加快,减慢,推进和回放 HTML5 视频。")])])]),B,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",x,[(0,l.mY)("Auto Refresh Plus | Page Monitor"),(0,l.K2)(o)]),(0,l.mY)(":定时刷新页面;页面监视器,找到或丢失指定文本时,弹出提示。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",A,[(0,l.mY)("Distill Web Monitor"),(0,l.K2)(o)]),(0,l.mY)(":监控网页或源以获取变更,可邮件、手机提示。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",v,[(0,l.mY)("Check 酱"),(0,l.K2)(o)]),(0,l.mY)(":网页内容监控工具,可以监测网页内容变化,并发送异动到微信/飞书。Check 酱可以部署在 Docker 或浏览器插件。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",S,[(0,l.mY)("Web Scraper"),(0,l.K2)(o)]),(0,l.mY)(":从网页中提取数据的爬虫。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.mY)("网页自动化:"),(0,l.QD)("a",T,[(0,l.mY)("UI.Vision PRA"),(0,l.K2)(o)]),(0,l.mY)(", "),(0,l.QD)("a",z,[(0,l.mY)("iMacros"),(0,l.K2)(o)]),(0,l.mY)(", "),(0,l.QD)("a",H,[(0,l.mY)("Automa"),(0,l.K2)(o)]),(0,l.mY)("。")])])]),W,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",F,[(0,l.mY)("Tampermonkey"),(0,l.K2)(o)]),(0,l.mY)(":油猴脚本插件,可修改网页布局、增减内容、自动化操作,常用脚本库为 "),(0,l.QD)("a",L,[(0,l.mY)("Greasy Fork"),(0,l.K2)(o)]),(0,l.mY)("。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",M,[(0,l.mY)("Fix Contrast"),(0,l.K2)(o)]),(0,l.mY)(":自动校正网页对比度,让网页内容更易阅读和分辨。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",P,[(0,l.mY)("FasterChrome"),(0,l.K2)(o)]),(0,l.mY)(":浏览器预加载链接,提升网络流畅度。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",G,[(0,l.mY)("SuperCopy"),(0,l.K2)(o)]),(0,l.mY)(":一键破解禁止右键、破解禁止选择、破解禁止复制、破解禁止粘贴,启用复制,启用右键,启用选择,启用粘贴。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",R,[(0,l.mY)("AutoPagerize"),(0,l.K2)(o)]),(0,l.mY)(":自动识别 next 或下一页,将网页合并为同一页。2014 年更新,很多规则已失效。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",N,[(0,l.mY)("pakku"),(0,l.K2)(o)]),(0,l.mY)(":合并 B 站视频中绝大多数刷屏弹幕。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",I,[(0,l.mY)("Enhanced GitHub"),(0,l.K2)(o)]),(0,l.mY)(":提升 GitHub 易用度。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",O,[(0,l.mY)("Sourcegraph"),(0,l.K2)(o)]),(0,l.mY)(":优化 GitHub 代码,支持鼠标悬停、代码搜索、查看引用等。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",U,[(0,l.mY)("沉浸式翻译"),(0,l.K2)(o)]),(0,l.mY)(":免费的双语对照网页翻译,"),(0,l.QD)("a",V,[(0,l.mY)("彩云小译"),(0,l.K2)(o)]),(0,l.mY)(" 的替代品。")])])]),Z,(0,l.QD)("ul",null,[(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",q,[(0,l.mY)("Tango"),(0,l.K2)(o)]),(0,l.mY)(":将页面操作转化为逐步指导的流程指南。每一步都自动植入截图,并可以通过链接、HTML、Markdown 来分享。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",J,[(0,l.mY)("SingleFile"),(0,l.K2)(o)]),(0,l.mY)(":将完整网页保存到单个文件中,可对文件名、HTML 内容、样式、图片、字体等进行调整。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",X,[(0,l.mY)("Vimium C"),(0,l.K2)(o)]),(0,l.mY)(":全键盘操作浏览器,建议启用 "),$,(0,l.mY)("。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",ee,[(0,l.mY)("SelectorGadget"),(0,l.K2)(o)]),(0,l.mY)(":轻松获取网页元素的 CSS Path 或 XPath。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",re,[(0,l.mY)("Copy as Markdown"),(0,l.K2)(o)]),(0,l.mY)(":将网页文字转为 Markdown 格式文本。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",oe,[(0,l.mY)("Get Favicon"),(0,l.K2)(o)]),(0,l.mY)(":快速获取当前网站的图标。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",le,[(0,l.mY)("Similar Sites"),(0,l.K2)(o)]),(0,l.mY)(":发现与当前浏览的网站相似的其他网站。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",ne,[(0,l.mY)("Wappalyzer"),(0,l.K2)(o)]),(0,l.mY)(":查看竞争对手网站使用了哪些技术、工具和第三方服务。")])]),(0,l.QD)("li",null,[(0,l.QD)("p",null,[(0,l.QD)("a",te,[(0,l.mY)("Link to Text Fragment"),(0,l.K2)(o)]),(0,l.mY)(":在 Chrome 浏览器中分享网页并突出显示所选文本。")])])])])}]]),ie=JSON.parse('{"path":"/apps/Chrome.html","title":"Chrome 扩展","lang":"zh-CN","frontmatter":{"article":false,"title":"Chrome 扩展","icon":"chrome","order":3,"description":"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。 浏览器 扩展管理器:快速管理扩展,对扩展分组启用。 Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。 Better History:按日期、小时罗列历史记录,搜索更便捷。 Cookie Editor:管理、修改、导出 Coo...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/Chrome.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Chrome 扩展"}],["meta",{"property":"og:description","content":"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。 浏览器 扩展管理器:快速管理扩展,对扩展分组启用。 Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。 Better History:按日期、小时罗列历史记录,搜索更便捷。 Cookie Editor:管理、修改、导出 Coo..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Chrome 扩展\\",\\"description\\":\\"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。 浏览器 扩展管理器:快速管理扩展,对扩展分组启用。 Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。 Better History:按日期、小时罗列历史记录,搜索更便捷。 Cookie Editor:管理、修改、导出 Coo...\\"}"]]},"headers":[{"level":2,"title":"浏览器","slug":"浏览器","link":"#浏览器","children":[]},{"level":2,"title":"标签页","slug":"标签页","link":"#标签页","children":[]},{"level":2,"title":"链接批量","slug":"链接批量","link":"#链接批量","children":[]},{"level":2,"title":"图片视频","slug":"图片视频","link":"#图片视频","children":[]},{"level":2,"title":"监视爬虫","slug":"监视爬虫","link":"#监视爬虫","children":[]},{"level":2,"title":"网页优化","slug":"网页优化","link":"#网页优化","children":[]},{"level":2,"title":"实用工具","slug":"实用工具","link":"#实用工具","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":17}]},"readingTime":{"minutes":3.91,"words":1174},"filePathRelative":"apps/Chrome.md","localizedDate":"2022年7月22日","excerpt":"

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

    \\n

    浏览器

    \\n
      \\n
    • \\n

      扩展管理器:快速管理扩展,对扩展分组启用。

      \\n
    • \\n
    • \\n

      Bookmarks clean up:清理重复书签、空文件夹和失效链接,也能合并重复文件夹。

      \\n
    • \\n
    • \\n

      Better History:按日期、小时罗列历史记录,搜索更便捷。

      \\n
    • \\n
    • \\n

      Cookie Editor:管理、修改、导出 Cookie。

      \\n
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-13a74989.8c5e22ae.js b/assets/js/v-13a74989.8c5e22ae.js deleted file mode 100644 index 30393370c..000000000 --- a/assets/js/v-13a74989.8c5e22ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7681],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4576:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%85%89%E7%8C%AB/","title":"标签: 光猫","lang":"zh-CN","frontmatter":{"title":"标签: 光猫","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"光猫","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%85%89%E7%8C%AB/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 光猫"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 光猫\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-149eb0af.5a69bbf7.js b/assets/js/v-149eb0af.5a69bbf7.js deleted file mode 100644 index ead29a05a..000000000 --- a/assets/js/v-149eb0af.5a69bbf7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5568],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},3728:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>s});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),s=JSON.parse('{"path":"/tag/rss/","title":"标签: rss","lang":"zh-CN","frontmatter":{"title":"标签: rss","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"rss","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/rss/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: rss"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: rss\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1569e2c7.794607c2.js b/assets/js/v-1569e2c7.794607c2.js deleted file mode 100644 index bd3b05b64..000000000 --- a/assets/js/v-1569e2c7.794607c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5780],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},9894:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>l});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),l=JSON.parse('{"path":"/tag/airtable/","title":"标签: Airtable","lang":"zh-CN","frontmatter":{"title":"标签: Airtable","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Airtable","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/airtable/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Airtable"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Airtable\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-18c54fa9.c2899cec.js b/assets/js/v-18c54fa9.c2899cec.js deleted file mode 100644 index 818b8583a..000000000 --- a/assets/js/v-18c54fa9.c2899cec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1728],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},4716:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>l});var o=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(e,t){return(0,o.Wz)(),(0,o.An)("div")}]]),l=JSON.parse('{"path":"/tag/blog/","title":"标签: blog","lang":"zh-CN","frontmatter":{"title":"标签: blog","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"blog","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/blog/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: blog"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: blog\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-18e64c3c.ccc7ece8.js b/assets/js/v-18e64c3c.ccc7ece8.js deleted file mode 100644 index bea0070c0..000000000 --- a/assets/js/v-18e64c3c.ccc7ece8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6520],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},5588:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>c});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){const a=(0,r.E1)("Catalog");return(0,r.Wz)(),(0,r.An)("div",null,[(0,r.K2)(a)])}]]),c=JSON.parse('{"path":"/services/","title":"Services","lang":"zh-CN","frontmatter":{"title":"Services","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Services"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Services\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1a1c96e4.7fb4e637.js b/assets/js/v-1a1c96e4.7fb4e637.js deleted file mode 100644 index 585eb8d0c..000000000 --- a/assets/js/v-1a1c96e4.7fb4e637.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3812],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},1756:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/chatgpt/","title":"标签: ChatGPT","lang":"zh-CN","frontmatter":{"title":"标签: ChatGPT","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"ChatGPT","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/chatgpt/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: ChatGPT"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: ChatGPT\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1aca676e.5630c089.js b/assets/js/v-1aca676e.5630c089.js deleted file mode 100644 index b01087582..000000000 --- a/assets/js/v-1aca676e.5630c089.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3732],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},6880:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>s});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),s=JSON.parse('{"path":"/tag/vuepress/","title":"标签: VuePress","lang":"zh-CN","frontmatter":{"title":"标签: VuePress","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"VuePress","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/vuepress/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: VuePress"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: VuePress\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1ad3199e.443fefdd.js b/assets/js/v-1ad3199e.443fefdd.js deleted file mode 100644 index e01fe9b1f..000000000 --- a/assets/js/v-1ad3199e.443fefdd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3196],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},1640:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>r,data:()=>i});var n=a(3968);const o={},r=(0,a(9720).c)(o,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),i=JSON.parse('{"path":"/tag/audition/","title":"标签: Audition","lang":"zh-CN","frontmatter":{"title":"标签: Audition","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Audition","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/audition/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Audition"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Audition\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1c5431f3.cd48f769.js b/assets/js/v-1c5431f3.cd48f769.js deleted file mode 100644 index 423ea785d..000000000 --- a/assets/js/v-1c5431f3.cd48f769.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6704],{9720:(e,r)=>{r.c=(e,r)=>{const t=e.__vccOpts||e;for(const[e,n]of r)t[e]=n;return t}},8540:(e,r,t)=>{t.r(r),t.d(r,{comp:()=>U,data:()=>W});var n=t(3968);const o=(0,n.QD)("p",null,"代码编程的学习路径:",-1),a={href:"https://www.typescriptlang.org/zh/",target:"_blank",rel:"noopener noreferrer"},s={href:"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript",target:"_blank",rel:"noopener noreferrer"},l=(0,n.QD)("li",null,[(0,n.QD)("p",null,"相关基础知识:HTML,Markdown,MySQL,正则表达式")],-1),p=(0,n.QD)("li",null,[(0,n.QD)("p",null,"脚本/开发工具:AutoHotkey,Electron")],-1),i={href:"https://cn.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://zh-hans.react.dev/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://ant-design.antgroup.com/index-cn",target:"_blank",rel:"noopener noreferrer"},h={href:"https://element-plus.gitee.io/zh-CN/guide/quickstart.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://stylus-lang.com/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://sass.bootcss.com/documentation",target:"_blank",rel:"noopener noreferrer"},g={href:"http://lesscss.cn/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.tailwindcss.cn/docs",target:"_blank",rel:"noopener noreferrer"},b={href:"https://v2.vuepress.vuejs.org/zh/guide/getting-started.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://docusaurus.io/zh-CN/docs",target:"_blank",rel:"noopener noreferrer"},D={href:"https://nextjs.org/docs",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://www.midwayjs.org/docs/intro",target:"_blank",rel:"noopener noreferrer"},_={href:"https://axios-http.com/",target:"_blank",rel:"noopener noreferrer"},S={href:"https://typicode.github.io/husky/#/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/okonet/lint-staged",target:"_blank",rel:"noopener noreferrer"},Y={href:"http://editorconfig.org",target:"_blank",rel:"noopener noreferrer"},y={href:"https://prettier.io/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://eslint.org/",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/airbnb/javascript#translation",target:"_blank",rel:"noopener noreferrer"},w={href:"http://commitizen.github.io/cz-cli/",target:"_blank",rel:"noopener noreferrer"},K={href:"https://commitlint.js.org/#/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://next.vue-test-utils.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://jestjs.io/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://github.com/vuejs/vue-jest",target:"_blank",rel:"noopener noreferrer"},E={href:"https://kulshekhar.github.io/ts-jest/",target:"_blank",rel:"noopener noreferrer"},H={href:"https://docs.github.com/cn/actions/learn-github-actions",target:"_blank",rel:"noopener noreferrer"},L=(0,n.IL)('

    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": {\n  "**/blog": true, //隐藏指定文件夹\n  "**/[Pp]lugins": true, //使用中括号时表示不区分大小写\n  "**/*.pyc": true, //隐藏所有 pyc 文件\n  "**/*.d.ts": true, //隐藏所有 d.ts 文件\n}\n

    在线 IDE

    在线 IDE 最大的优势是开箱即用,无需搭建环境,避免本地环境错误导致的各类 bug。

    ',13),P={href:"https://stackblitz.com/",target:"_blank",rel:"noopener noreferrer"},A=(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote1"},"[1]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),M={href:"https://codepen.io/pen/",target:"_blank",rel:"noopener noreferrer"},q={href:"https://codesandbox.io/s/",target:"_blank",rel:"noopener noreferrer"},G=(0,n.QD)("hr",{class:"footnotes-sep"},null,-1),N={class:"footnotes"},V={class:"footnotes-list"},J={id:"footnote1",class:"footnote-item"},I={href:"https://www.51cto.com/article/718302.html",target:"_blank",rel:"noopener noreferrer"},R=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),O={},U=(0,t(9720).c)(O,[["render",function(e,r){const t=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[o,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("编程语言:"),(0,n.QD)("a",a,[(0,n.mY)("TypeScript"),(0,n.K2)(t)]),(0,n.mY)(","),(0,n.QD)("a",s,[(0,n.mY)("JavaScript"),(0,n.K2)(t)])])]),l,p,(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("前端框架:"),(0,n.QD)("a",i,[(0,n.mY)("Vue.js"),(0,n.K2)(t)]),(0,n.mY)(","),(0,n.QD)("a",c,[(0,n.mY)("React"),(0,n.K2)(t)])])]),(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("UI 框架:"),(0,n.QD)("a",u,[(0,n.mY)("Ant Design"),(0,n.K2)(t)]),(0,n.mY)(","),(0,n.QD)("a",h,[(0,n.mY)("Element Plus"),(0,n.K2)(t)])]),(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.mY)("CSS 预编译:"),(0,n.QD)("a",d,[(0,n.mY)("Stylus"),(0,n.K2)(t)]),(0,n.mY)(" / "),(0,n.QD)("a",m,[(0,n.mY)("Sass"),(0,n.K2)(t)]),(0,n.mY)(" / "),(0,n.QD)("a",g,[(0,n.mY)("Less"),(0,n.K2)(t)])]),(0,n.QD)("li",null,[(0,n.mY)("CSS 后处理器:PostCSS,"),(0,n.QD)("a",f,[(0,n.mY)("tailwindcss"),(0,n.K2)(t)])])])]),(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("网站生成工具:"),(0,n.QD)("a",b,[(0,n.mY)("VuePress"),(0,n.K2)(t)]),(0,n.mY)(","),(0,n.QD)("a",k,[(0,n.mY)("Docusaurus"),(0,n.K2)(t)]),(0,n.mY)(","),(0,n.QD)("a",D,[(0,n.mY)("Next.js"),(0,n.K2)(t)])])]),(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("Node.js 框架:"),(0,n.QD)("a",Q,[(0,n.mY)("Midway"),(0,n.K2)(t)])])]),(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("HTTP 工具:"),(0,n.QD)("a",_,[(0,n.mY)("Axios"),(0,n.K2)(t)])]),(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.mY)("Git Hook 工具:"),(0,n.QD)("a",S,[(0,n.mY)("husky"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",v,[(0,n.mY)("lint-staged"),(0,n.K2)(t)])]),(0,n.QD)("li",null,[(0,n.mY)("代码规范:"),(0,n.QD)("a",Y,[(0,n.mY)("EditorConfig"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",y,[(0,n.mY)("Prettier"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",C,[(0,n.mY)("ESLint"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",j,[(0,n.mY)("Airbnb JavaScript Style Guide"),(0,n.K2)(t)])]),(0,n.QD)("li",null,[(0,n.mY)("提交规范:"),(0,n.QD)("a",w,[(0,n.mY)("Commitizen"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",K,[(0,n.mY)("Commitlint"),(0,n.K2)(t)])]),(0,n.QD)("li",null,[(0,n.mY)("单元测试:"),(0,n.QD)("a",z,[(0,n.mY)("vue-test-utils"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",x,[(0,n.mY)("jest"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",T,[(0,n.mY)("vue-jest"),(0,n.K2)(t)]),(0,n.mY)(" + "),(0,n.QD)("a",E,[(0,n.mY)("ts-jest"),(0,n.K2)(t)])]),(0,n.QD)("li",null,[(0,n.mY)("自动部署:"),(0,n.QD)("a",H,[(0,n.mY)("GitHub Actions"),(0,n.K2)(t)])])])])]),L,(0,n.QD)("p",null,[(0,n.QD)("a",P,[(0,n.mY)("StackBlitz"),(0,n.K2)(t)]),(0,n.mY)(":StackBlitz 界面类似 Visual Studio Code,可以直接 push 和拉取 GitHub 仓库的代码进行查看和编辑,项目支持离线开发,同时所有应用程序会自动部署在其服务器上。"),A]),(0,n.QD)("p",null,[(0,n.QD)("a",M,[(0,n.mY)("CodePen"),(0,n.K2)(t)]),(0,n.mY)(":CodePen 是一个在线的 HTML、CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果,便于项目分享预览。CodePen 也一个庞大的前端社区,上面有来自全球开发者分享的各种各样炫酷的效果,并且这些代码都是开源和共享的。")]),(0,n.QD)("p",null,[(0,n.QD)("a",q,[(0,n.mY)("CodeSandbox"),(0,n.K2)(t)]),(0,n.mY)(":CodeSandbox 编辑体验与 VSCode 类似,并支持 GitHub 导出、静态文件托管、本地项目导入等。缺点:不能直接导入 GitHub 项目。")]),G,(0,n.QD)("section",N,[(0,n.QD)("ol",V,[(0,n.QD)("li",J,[(0,n.QD)("p",null,[(0,n.QD)("a",I,[(0,n.mY)("六个好用的在线代码编辑器,你选哪个?"),(0,n.K2)(t)]),(0,n.mY)(),R])])])])])}]]),W=JSON.parse('{"path":"/code/","title":"Coding","lang":"zh-CN","frontmatter":{"article":false,"title":"Coding","icon":"code","description":"代码编程的学习路径: 编程语言:TypeScript,JavaScript 相关基础知识:HTML,Markdown,MySQL,正则表达式 脚本/开发工具:AutoHotkey,Electron 前端框架:Vue.js,React UI 框架:Ant Design,Element Plus CSS 预编译:Stylus / Sass / Less C...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Coding"}],["meta",{"property":"og:description","content":"代码编程的学习路径: 编程语言:TypeScript,JavaScript 相关基础知识:HTML,Markdown,MySQL,正则表达式 脚本/开发工具:AutoHotkey,Electron 前端框架:Vue.js,React UI 框架:Ant Design,Element Plus CSS 预编译:Stylus / Sass / Less C..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-30T11:57:46.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-30T11:57:46.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Coding\\",\\"description\\":\\"代码编程的学习路径: 编程语言:TypeScript,JavaScript 相关基础知识:HTML,Markdown,MySQL,正则表达式 脚本/开发工具:AutoHotkey,Electron 前端框架:Vue.js,React UI 框架:Ant Design,Element Plus CSS 预编译:Stylus / Sass / Less C...\\"}"]]},"headers":[{"level":2,"title":"Visual Studio Code","slug":"visual-studio-code","link":"#visual-studio-code","children":[{"level":3,"title":"修改快捷键","slug":"修改快捷键","link":"#修改快捷键","children":[]},{"level":3,"title":"排除文件夹","slug":"排除文件夹","link":"#排除文件夹","children":[]}]},{"level":2,"title":"在线 IDE","slug":"在线-ide","link":"#在线-ide","children":[]}],"git":{"createdTime":1666549346000,"updatedTime":1703937466000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":10}]},"readingTime":{"minutes":2.52,"words":756},"filePathRelative":"code/README.md","localizedDate":"2022年10月23日","excerpt":"

    代码编程的学习路径:

    \\n","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-1eed743f.9b1dbaef.js b/assets/js/v-1eed743f.9b1dbaef.js deleted file mode 100644 index 613076975..000000000 --- a/assets/js/v-1eed743f.9b1dbaef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2824],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},309:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>i});var n=a(3968);const o={},r=(0,a(9720).c)(o,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),i=JSON.parse('{"path":"/tag/ui.vision/","title":"标签: UI.Vision","lang":"zh-CN","frontmatter":{"title":"标签: UI.Vision","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"UI.Vision","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/ui.vision/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: UI.Vision"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: UI.Vision\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2126384d.9eb18062.js b/assets/js/v-2126384d.9eb18062.js deleted file mode 100644 index 43c3d69b3..000000000 --- a/assets/js/v-2126384d.9eb18062.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5652],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1992:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%97%B6%E9%97%B4/","title":"标签: 时间","lang":"zh-CN","frontmatter":{"title":"标签: 时间","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"时间","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%97%B6%E9%97%B4/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 时间"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 时间\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-218f58df.29a3be1f.js b/assets/js/v-218f58df.29a3be1f.js deleted file mode 100644 index 223dd5a01..000000000 --- a/assets/js/v-218f58df.29a3be1f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6992],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},7628:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%87%AA%E6%88%91%E7%AE%A1%E7%90%86/","title":"标签: 自我管理","lang":"zh-CN","frontmatter":{"title":"标签: 自我管理","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"自我管理","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%87%AA%E6%88%91%E7%AE%A1%E7%90%86/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 自我管理"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 自我管理\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2199ddde.8974230b.js b/assets/js/v-2199ddde.8974230b.js deleted file mode 100644 index 716d5186e..000000000 --- a/assets/js/v-2199ddde.8974230b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8140],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},8864:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/winget/","title":"标签: winget","lang":"zh-CN","frontmatter":{"title":"标签: winget","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"winget","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/winget/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: winget"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: winget\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-21bdad69.77551573.js b/assets/js/v-21bdad69.77551573.js deleted file mode 100644 index 02d406075..000000000 --- a/assets/js/v-21bdad69.77551573.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5684],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,s]of t)a[e]=s;return a}},356:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>I,data:()=>O});var s=a(3968);const i={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},n={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},o=(0,s.QD)("h2",{id:"插件",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#插件"},[(0,s.QD)("span",null,"插件")])],-1),l={href:"https://github.com/docsifyjs/awesome-docsify#plugins",target:"_blank",rel:"noopener noreferrer"},r={class:"task-list-container"},c={class:"task-list-item"},d=(0,s.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-0",checked:"checked",disabled:"disabled"},null,-1),p={class:"task-list-item-label",for:"task-item-0"},h={href:"https://notebook.js.org/#/README",target:"_blank",rel:"noopener noreferrer"},m={class:"task-list-item"},f=(0,s.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-1",checked:"checked",disabled:"disabled"},null,-1),u={class:"task-list-item-label",for:"task-item-1"},b={href:"https://github.com/827652549/docsify-count",target:"_blank",rel:"noopener noreferrer"},k={class:"task-list-item"},y=(0,s.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-2",checked:"checked",disabled:"disabled"},null,-1),g={class:"task-list-item-label",for:"task-item-2"},D={href:"https://github.com/cxcn/docsify-waline/blob/main/README.zh-CN.md",target:"_blank",rel:"noopener noreferrer"},Q={class:"task-list-item"},v=(0,s.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-3",checked:"checked",disabled:"disabled"},null,-1),Y={class:"task-list-item-label",for:"task-item-3"},x={href:"https://github.com/mrpotatoes/docsify-toc",target:"_blank",rel:"noopener noreferrer"},_={href:"https://tainacan.github.io/tainacan-wiki/#/general-concepts",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/dromara/sureness/blob/master/docs/index.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://wiki.lifeupapp.fun/zh-cn/#/features/174",target:"_blank",rel:"noopener noreferrer"},K={class:"task-list-item"},z=(0,s.QD)("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-4",checked:"checked",disabled:"disabled"},null,-1),E={class:"task-list-item-label",for:"task-item-4"},C={href:"https://github.com/meff34/docsify-to-pdf-converter",target:"_blank",rel:"noopener noreferrer"},N=(0,s.QD)("ul",null,[(0,s.QD)("li",null,[(0,s.QD)("code",null,"illegal operation on a directory"),(0,s.mY)(" 报错:sidebar 中不要使用简写地址,将 "),(0,s.QD)("code",null,"main/"),(0,s.mY)(" 改为 "),(0,s.QD)("code",null,"main/README.md"),(0,s.mY)(",否则将读取到目录而报错。")]),(0,s.QD)("li",null,[(0,s.QD)("code",null,"'node_modules' 不是内部或外部命令"),(0,s.mY)(" 报错:将 package.json 的设置修改为 "),(0,s.QD)("code",null,'"convert": "node_modules\\\\.bin\\\\docsify-pdf-converter"'),(0,s.mY)("。这问题多发生在 Windows,是由 Windows 与 Linux 路径规则不同而引起的。")])],-1),T=(0,s.QD)("h2",{id:"配置",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#配置"},[(0,s.QD)("span",null,"配置")])],-1),P=(0,s.QD)("h3",{id:"docsify-emoji",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#docsify-emoji"},[(0,s.QD)("span",null,"docsify emoji")])],-1),S={href:"https://docsify.js.org/#/zh-cn/plugins?id=emoji",target:"_blank",rel:"noopener noreferrer"},A=(0,s.QD)("code",null,":",-1),L=(0,s.QD)("code",null,":100:",-1),M=(0,s.QD)("code",null,":100:",-1),W=(0,s.QD)("p",null,"实际使用中,我直接复制 emoji,都能正常显示。",-1),R=(0,s.QD)("h2",{id:"本地命令",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#本地命令"},[(0,s.QD)("span",null,"本地命令")])],-1),q={href:"https://github.com/docsifyjs/docsify-cli",target:"_blank",rel:"noopener noreferrer"},G=(0,s.IL)('

    <path> 默认为当前路径,可使用子文件夹指定路径,如 ./docsdocs

    [] 为可省略命令区,无实际作用,输出时需要去除。

    Serve 启动

    若要在电脑上查看 docsify 页面,可执行 serve 架构命令,在本地主机上运行服务。默认本地端口为 3000,可以指定端口。

    docsify serve <path> [--open false] [--port 3000]\n

    使用时不要关闭命令终端,否则 serve 也会停止。

    生成侧边栏

    docsify generate <path> [--sidebar _sidebar.md]\n

    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),H={},I=(0,a(9720).c)(H,[["render",function(e,t){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",i,[(0,s.mY)("docsify"),(0,s.K2)(a)]),(0,s.mY)(" 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。")]),(0,s.QD)("p",null,[(0,s.mY)("本页集中了我使用 docsify 中遇到的问题,新手先看 "),(0,s.QD)("a",n,[(0,s.mY)("docsify 入门文档"),(0,s.K2)(a)]),(0,s.mY)("。")]),o,(0,s.QD)("p",null,[(0,s.QD)("a",l,[(0,s.mY)("docsify 插件列表"),(0,s.K2)(a)]),(0,s.mY)(":")]),(0,s.QD)("ul",r,[(0,s.QD)("li",c,[d,(0,s.QD)("label",p,[(0,s.QD)("a",h,[(0,s.mY)("docsify 笔记类参考"),(0,s.K2)(a)]),(0,s.mY)(":看板娘,多级页面,页面点击效果,网站运行时间。")])]),(0,s.QD)("li",m,[f,(0,s.QD)("label",u,[(0,s.QD)("a",b,[(0,s.mY)("docsify-count"),(0,s.K2)(a)]),(0,s.mY)(":docsify 的字数和阅读时长插件。")])]),(0,s.QD)("li",k,[y,(0,s.QD)("label",g,[(0,s.QD)("a",D,[(0,s.mY)("docsify-waline"),(0,s.K2)(a)]),(0,s.mY)(":提供评论功能的同时,借用 docsify-count 接口展示阅读量。暂时停止 1300 宽度的 waline 显示,避免页面显示异常。")])]),(0,s.QD)("li",Q,[v,(0,s.QD)("label",Y,[(0,s.QD)("a",x,[(0,s.mY)("docsify-toc"),(0,s.K2)(a)]),(0,s.mY)(":给笔记页内部添加目录。不过本插件与 gitalk、waline 冲突,页面宽于 1300px 时出现 toc 目录,评论区位置也跟着挤到页面顶部,需手动修改。参考链接:"),(0,s.QD)("a",_,[(0,s.mY)("Tainacan Wiki"),(0,s.K2)(a)]),(0,s.mY)(","),(0,s.QD)("a",j,[(0,s.mY)("Sureness"),(0,s.K2)(a)]),(0,s.mY)(","),(0,s.QD)("a",w,[(0,s.mY)("lifeupapp"),(0,s.K2)(a)]),(0,s.mY)("。")])]),(0,s.QD)("li",K,[z,(0,s.QD)("label",E,[(0,s.QD)("a",C,[(0,s.mY)("docsify-pdf-converter"),(0,s.K2)(a)]),(0,s.mY)(":将 docsify 转为 pdf,不带书签目录。")]),N])]),T,P,(0,s.QD)("p",null,[(0,s.QD)("a",S,[(0,s.mY)("emoji 插件"),(0,s.K2)(a)]),(0,s.mY)("在标题中使用容易出错,建议使用 "),A,(0,s.mY)("。例如,原本是 "),L,(0,s.mY)(",替换为 "),M,(0,s.mY)("。")]),W,R,(0,s.QD)("p",null,[(0,s.QD)("a",q,[(0,s.mY)("docsify 本地命令"),(0,s.K2)(a)]),(0,s.mY)(":")]),G])}]]),O=JSON.parse('{"path":"/web/docsify.html","title":"docsify","lang":"zh-CN","frontmatter":{"article":false,"title":"docsify","icon":"edit","order":2,"description":"docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。 本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档。 插件 docsify 插件列表: docsify 笔记类参考:看板娘,多级页面,页面点击效果,网站运行时间。 d...","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/docsify.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"docsify"}],["meta",{"property":"og:description","content":"docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。 本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档。 插件 docsify 插件列表: docsify 笔记类参考:看板娘,多级页面,页面点击效果,网站运行时间。 d..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"docsify\\",\\"description\\":\\"docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。 本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档。 插件 docsify 插件列表: docsify 笔记类参考:看板娘,多级页面,页面点击效果,网站运行时间。 d...\\"}"]]},"headers":[{"level":2,"title":"插件","slug":"插件","link":"#插件","children":[]},{"level":2,"title":"配置","slug":"配置","link":"#配置","children":[{"level":3,"title":"docsify emoji","slug":"docsify-emoji","link":"#docsify-emoji","children":[]}]},{"level":2,"title":"本地命令","slug":"本地命令","link":"#本地命令","children":[{"level":3,"title":"Serve 启动","slug":"serve-启动","link":"#serve-启动","children":[]},{"level":3,"title":"生成侧边栏","slug":"生成侧边栏","link":"#生成侧边栏","children":[]}]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"引用路径","slug":"引用路径","link":"#引用路径","children":[]},{"level":3,"title":"页面未同步更新","slug":"页面未同步更新","link":"#页面未同步更新","children":[]},{"level":3,"title":"GitHub Pages 报错","slug":"github-pages-报错","link":"#github-pages-报错","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":16}]},"readingTime":{"minutes":2.7,"words":811},"filePathRelative":"web/docsify.md","localizedDate":"2022年7月22日","excerpt":"

    docsify 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。

    \\n

    本页集中了我使用 docsify 中遇到的问题,新手先看 docsify 入门文档

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-24b1f5a6.23c9b1dc.js b/assets/js/v-24b1f5a6.23c9b1dc.js deleted file mode 100644 index 2817ee5d0..000000000 --- a/assets/js/v-24b1f5a6.23c9b1dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6440],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9916:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%AD%97%E5%B9%95/","title":"标签: 字幕","lang":"zh-CN","frontmatter":{"title":"标签: 字幕","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"字幕","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%AD%97%E5%B9%95/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 字幕"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 字幕\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-25ec7945.59a67f5e.js b/assets/js/v-25ec7945.59a67f5e.js deleted file mode 100644 index 2e03fed78..000000000 --- a/assets/js/v-25ec7945.59a67f5e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9672],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},5e3:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>o});var i=a(3968);const c=[(0,i.IL)('

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    幻想着花了钱,就可以选自己理想的电脑。

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    好不容易等到优购码预告日,发现只有一种笔记本,而且还是旧款。联想,你确定这要用优购码抢?

    不过,会员费也不能白花了。

    每月我会更新优购码和 99 折的具体购买权限。不能让大家继续步我后尘,因未知而入手联想黑卡了。

    了解最新优购码种类前,一定不要买联想黑卡,否则纯属浪费钱。

    另外,推荐联系当地的联想来酷智生活店,询问是否有现货。来酷渠道属于联想官方,来源有保证。如果来酷店没现货,会在到货后电话通知,送货上门。

    8 月黑卡情报

    7 月黑卡情报

    6 月黑卡情报

    5 月黑卡情报

    4 月黑卡情报

    3 月黑卡情报

    ',23)],p={},n=(0,a(9720).c)(p,[["render",function(e,t){return(0,i.Wz)(),(0,i.An)("div",null,c)}]]),o=JSON.parse('{"path":"/posts/2022-03-09-lenovo_black_card_member.html","title":"联想黑金超核会员情报分享","lang":"zh-CN","frontmatter":{"title":"联想黑金超核会员情报分享","date":"2022-03-09T00:00:00.000Z","category":["购物"],"tag":["联想"],"order":-41,"description":"不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡! 京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。 幻想着花了钱,就可以选自己理想的电脑。 但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。 每月 8 日会员中心 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-03-09-lenovo_black_card_member.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"联想黑金超核会员情报分享"}],["meta",{"property":"og:description","content":"不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡! 京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。 幻想着花了钱,就可以选自己理想的电脑。 但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。 每月 8 日会员中心 ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-d10a6d62f7af9c94ff215a992ca978d8_b.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-08-08T15:51:33.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"联想黑金超核会员情报分享"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"联想"}],["meta",{"property":"article:published_time","content":"2022-03-09T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-08-08T15:51:33.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"联想黑金超核会员情报分享\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-d10a6d62f7af9c94ff215a992ca978d8_b.jpg\\",\\"https://pic2.zhimg.com/v2-1f1cc252dc0961e7bc793c0d0d7a80b5_b.jpg\\",\\"https://pic1.zhimg.com/v2-b996f4204b27ee000b7e390177454b88_r.jpg\\",\\"https://pic1.zhimg.com/v2-01f7ee6a4f8dd5401dc8de6936fd8d04_b.jpg\\",\\"https://pic1.zhimg.com/v2-8b5b328f1eed01c937b841fbad094bdc_b.jpg\\",\\"https://pic3.zhimg.com/v2-7658373e9ba5b75fcce0b890fd407caa_b.jpg\\",\\"https://pic3.zhimg.com/v2-d8184c084b411ecd6ad815e4d6601e42_b.jpg\\"],\\"datePublished\\":\\"2022-03-09T00:00:00.000Z\\",\\"dateModified\\":\\"2022-08-08T15:51:33.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"8 月黑卡情报","slug":"_8-月黑卡情报","link":"#_8-月黑卡情报","children":[]},{"level":2,"title":"7 月黑卡情报","slug":"_7-月黑卡情报","link":"#_7-月黑卡情报","children":[]},{"level":2,"title":"6 月黑卡情报","slug":"_6-月黑卡情报","link":"#_6-月黑卡情报","children":[]},{"level":2,"title":"5 月黑卡情报","slug":"_5-月黑卡情报","link":"#_5-月黑卡情报","children":[]},{"level":2,"title":"4 月黑卡情报","slug":"_4-月黑卡情报","link":"#_4-月黑卡情报","children":[]},{"level":2,"title":"3 月黑卡情报","slug":"_3-月黑卡情报","link":"#_3-月黑卡情报","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1659973893000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.53,"words":458},"filePathRelative":"_posts/2022-03-09-lenovo_black_card_member.md","localizedDate":"2022年3月9日","excerpt":"

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    \\n

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    \\n

    幻想着花了钱,就可以选自己理想的电脑。

    \\n

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    \\n
    \\n

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-280f2817.8c5f7970.js b/assets/js/v-280f2817.8c5f7970.js deleted file mode 100644 index c3f11b6af..000000000 --- a/assets/js/v-280f2817.8c5f7970.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6928],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4e3:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var n=a(3968);const o={},r=(0,a(9720).c)(o,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/openvpn/","title":"标签: OpenVPN","lang":"zh-CN","frontmatter":{"title":"标签: OpenVPN","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"OpenVPN","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/openvpn/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: OpenVPN"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: OpenVPN\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-28270386.6da96475.js b/assets/js/v-28270386.6da96475.js deleted file mode 100644 index d6cf16dd8..000000000 --- a/assets/js/v-28270386.6da96475.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[826],{9720:(n,e)=>{e.c=(n,e)=>{const s=n.__vccOpts||n;for(const[n,a]of e)s[n]=a;return s}},2092:(n,e,s)=>{s.r(e),s.d(e,{comp:()=>_,data:()=>S});var a=s(3968);const t={href:"https://github.com/n8n-io/n8n",target:"_blank",rel:"noopener noreferrer"},i={href:"https://sspai.com/prime/story/automation-n8n",target:"_blank",rel:"noopener noreferrer"},o={href:"https://reorx.com/blog/sharing-my-footprints-automation/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.IL)('

    部署 n8n

    1. 在桌面终端运行 git clone https://github.com/n8n-io/n8n.git 命令,下载 n8n 的仓库文件,并将其复制到 NAS。
    2. 切换路径 cd /volume3/storage/n8n/docker/compose/withPostgres
    3. 运行 sudo docker-compose up -d 命令进行部署。

    在初次部署时,你可能会遇到 for n8n Container "5a6edd16e779" is unhealthy. 的提示,这时只需忽略该提示,再次运行 sudo docker-compose up -d 命令即可解决问题。如果在更新 git 仓库文件后重新部署时遇到提示无需更新的情况,你可以先删除容器,然后重新部署。

    下面是部署 n8n 的 Docker 配置文件:

    # https://github.com/n8n-io/n8n/tree/master/docker/compose/withPostgres\n# https://docs.n8n.io/hosting/installation/server-setups/docker-compose/#5-create-docker-compose-file\nversion: "3.8"\n\nservices:\n  n8n-postgres:\n    image: postgres:11\n    container_name: n8n-postgres\n    restart: always\n    environment:\n      - POSTGRES_USER\n      - POSTGRES_PASSWORD\n      - POSTGRES_DB\n      - POSTGRES_NON_ROOT_USER\n      - POSTGRES_NON_ROOT_PASSWORD\n    volumes:\n      - /volume1/docker/n8n/db:/var/lib/postgresql/data\n      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh\n    healthcheck:\n      test:\n        [\n          "CMD-SHELL",\n          "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}",\n        ]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n\n  n8n:\n    image: docker.n8n.io/n8nio/n8n\n    container_name: n8n\n    restart: always\n    environment:\n      - N8N_HOST=${N8N_HOST}\n      - NODE_ENV=production\n      - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL}\n      - VUE_APP_URL_BASE_API=${N8N_EDITOR_BASE_URL}\n      - WEBHOOK_URL=${N8N_EDITOR_BASE_URL}\n      - DB_TYPE=postgresdb\n      - DB_POSTGRESDB_HOST=n8n-postgres\n      - DB_POSTGRESDB_PORT=5432\n      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}\n      - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}\n      - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}\n      - TZ=Asia/Shanghai\n    ports:\n      - 5720:5678\n    links:\n      - n8n-postgres\n    volumes:\n      - /volume1/docker/n8n/storage:/home/node/.n8n\n    depends_on:\n      n8n-postgres:\n        condition: service_healthy\n

    在上述文件中,/volume1/docker/n8n 被指定为 n8n 的配置目录,你需要确保 n8n 有该路径的读写权限,否则项目可能会在启动时报错。

    环境变量

    在当前目录的 .env 文件中,可以更改 PostgreSQL 的默认数据库名称、用户和密码。

    N8N_HOST=localnas.com\nN8N_EDITOR_BASE_URL=http://localnas.com:5720/\n\nPOSTGRES_USER=changeUser\nPOSTGRES_PASSWORD=changePassword\nPOSTGRES_DB=n8n\n\nPOSTGRES_NON_ROOT_USER=changeUser\nPOSTGRES_NON_ROOT_PASSWORD=changePassword\n

    N8N_HOSTN8N_EDITOR_BASE_URL 用于第三方 API 的回调访问。如果你启用了外网调用 n8n 的访问权限,建议开启 Two-factor authentication (2FA),以防止 API 信息泄露。不建议将 N8N_HOST 设为内部域名,否则在后续设置中可能会出现 Bad Request: bad webhook: An HTTPS URL must be provided for webhook 错误。

    节点介绍

    HTTP Request

    ',12),p={href:"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/",target:"_blank",rel:"noopener noreferrer"},c=(0,a.QD)("p",null,"在使用过程中,如果遇到网页端连接不稳定的问题,可以在节点设置中的 On Error 选项选择 Continue,并在 Options 中添加超时选项,例如 Timeout 10000 ms。",-1),r=(0,a.QD)("h3",{id:"if",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#if"},[(0,a.QD)("span",null,"IF")])],-1),u={href:"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/",target:"_blank",rel:"noopener noreferrer"},d=(0,a.QD)("code",null,"{{}}",-1),m=(0,a.IL)('

    Github Trigger

    Github Trigger 节点可以通过在 Github 上设置 Webhook 来获得推送通知。

    如果遇到 Workflow could not be activated: A webhook with the identical URL probably exists already. Please delete it manually on Github! 的错误提示,通常是因为在仓库中存在多个相同的 Webhook 地址。你可以进入 repo 仓库,选择 Settings > Code and automation > Webhooks,手动删除重复的 Webhook 地址来解决这个问题。

    使用 Tips

    变量路径

    对于一些复杂的输入变量,你可以直接使用 n8n 自带的工具来复制路径。在 INPUT 区域选择 JSON,点击要选择的参数,然后点击 INPUT 右上角的复制按钮,选择 Copy Parameter Path

    其他操作记录

    Discord OAuth2

    ',10),k={href:"https://discord.com/developers/applications",target:"_blank",rel:"noopener noreferrer"},v=(0,a.QD)("p",null,"接着,将 CLIENT ID 和 CLIENT SECRET 添加到 n8n 中即可。",-1),h={href:"https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-",target:"_blank",rel:"noopener noreferrer"},b=(0,a.QD)("p",null,"通过上述步骤,你可以灵活地使用 n8n 来构建自动化工作流,实现数据的聚合、管理和分析。希望这些信息能够帮助你高效地使用 n8n,使你的工作和生活更加自动化和便捷。如果你在使用过程中遇到任何问题或有更多的经验分享,请在评论区留言,我们可以一起讨论和解决。",-1),g={},_=(0,s(9720).c)(g,[["render",function(n,e){const s=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.QD)("a",t,[(0,a.mY)("n8n"),(0,a.K2)(s)]),(0,a.mY)(" 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。")]),(0,a.QD)("p",null,[(0,a.mY)("对于初学者,建议先跟随教程 "),(0,a.QD)("a",i,[(0,a.mY)("基于 n8n 的开源自动化:以滴答清单同步 Notion 为例"),(0,a.K2)(s)]),(0,a.mY)(" 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可以参考 "),(0,a.QD)("a",o,[(0,a.mY)("使用自动化工作流聚合信息摄入和输出"),(0,a.K2)(s)]),(0,a.mY)("。")]),l,(0,a.QD)("p",null,[(0,a.QD)("a",p,[(0,a.mY)("HTTP Request"),(0,a.K2)(s)]),(0,a.mY)(" 节点允许你使用 REST API 发出 HTTP 请求,从任何应用程序或服务中查询数据。")]),c,r,(0,a.QD)("p",null,[(0,a.QD)("a",u,[(0,a.mY)("IF"),(0,a.K2)(s)]),(0,a.mY)(" 节点允许你根据比较操作有条件地分割工作流。注意,布尔值的 true 和 false 需要使用双重花括号 "),d,(0,a.mY)(" 包围。")]),m,(0,a.QD)("p",null,[(0,a.mY)("在 "),(0,a.QD)("a",k,[(0,a.mY)("Discord Applications"),(0,a.K2)(s)]),(0,a.mY)(" 中新建应用,然后在 OAuth2 > General > Redirects 中添加回调地址。")]),v,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("a",h,[(0,a.mY)("Where can I find my User/Server/Message ID?"),(0,a.K2)(s)])])]),b])}]]),S=JSON.parse('{"path":"/services/dockers-on-nas/n8n.html","title":"n8n:工作流自动化","lang":"zh-CN","frontmatter":{"article":false,"title":"n8n:工作流自动化","order":81,"description":"n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。 对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/n8n.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"n8n:工作流自动化"}],["meta",{"property":"og:description","content":"n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。 对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-12-22-43-08.png?imageMogr2/format/webp?imageMogr2/format/webp/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"n8n:工作流自动化"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"n8n:工作流自动化\\",\\"description\\":\\"n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。 对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可...\\"}"]]},"headers":[{"level":2,"title":"部署 n8n","slug":"部署-n8n","link":"#部署-n8n","children":[]},{"level":2,"title":"环境变量","slug":"环境变量","link":"#环境变量","children":[]},{"level":2,"title":"节点介绍","slug":"节点介绍","link":"#节点介绍","children":[{"level":3,"title":"HTTP Request","slug":"http-request","link":"#http-request","children":[]},{"level":3,"title":"IF","slug":"if","link":"#if","children":[]},{"level":3,"title":"Github Trigger","slug":"github-trigger","link":"#github-trigger","children":[]}]},{"level":2,"title":"使用 Tips","slug":"使用-tips","link":"#使用-tips","children":[{"level":3,"title":"变量路径","slug":"变量路径","link":"#变量路径","children":[]}]},{"level":2,"title":"其他操作记录","slug":"其他操作记录","link":"#其他操作记录","children":[{"level":3,"title":"Discord OAuth2","slug":"discord-oauth2","link":"#discord-oauth2","children":[]}]}],"git":{"createdTime":1701852517000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.74,"words":1121},"filePathRelative":"services/dockers-on-nas/n8n.md","localizedDate":"2023年12月6日","excerpt":"

    n8n 是一款功能强大的工作流程自动化工具,可以自行托管,并允许用户添加自定义函数、逻辑和应用程序。n8n 社区提供了丰富的第三方 API 节点,方便用户连接和使用主流的海外服务。

    \\n

    对于初学者,建议先跟随教程 基于 n8n 的开源自动化:以滴答清单同步 Notion 为例 来熟悉 n8n 的基本操作和广泛应用。更多关于 n8n 的使用案例和详细介绍,可以参考 使用自动化工作流聚合信息摄入和输出

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2a81afac.b82922d6.js b/assets/js/v-2a81afac.b82922d6.js deleted file mode 100644 index 950d92724..000000000 --- a/assets/js/v-2a81afac.b82922d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4308],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},7500:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%AA%92%E4%BD%93/","title":"标签: 媒体","lang":"zh-CN","frontmatter":{"title":"标签: 媒体","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"媒体","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%AA%92%E4%BD%93/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 媒体"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 媒体\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2aea63fe.30a11314.js b/assets/js/v-2aea63fe.30a11314.js deleted file mode 100644 index 1d2496698..000000000 --- a/assets/js/v-2aea63fe.30a11314.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[136],{9720:(n,a)=>{a.c=(n,a)=>{const e=n.__vccOpts||n;for(const[n,s]of a)e[n]=s;return e}},4220:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>m,data:()=>v});var s=e(3968);const t=(0,s.QD)("p",null,"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。",-1),o=(0,s.QD)("p",null,"更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备地暴露,极易受到窥探和劫持。通过配置反向代理,所有的传入流量都将被加密处理,有效防止数据被识别和篡改的风险。",-1),p=(0,s.QD)("p",null,"市面上常见的反向代理工具有多种,包括 Nginx Proxy Manager、nginxWebUI、Caddy 和 Lucky 等。",-1),c=(0,s.QD)("h2",{id:"nginx-proxy-manager",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#nginx-proxy-manager"},[(0,s.QD)("span",null,"Nginx Proxy Manager")])],-1),i={href:"https://github.com/jlesage/docker-nginx-proxy-manager",target:"_blank",rel:"noopener noreferrer"},l={href:"https://www.nginxwebui.cn/product.html",target:"_blank",rel:"noopener noreferrer"},r=(0,s.IL)('

    下面是通过 Docker 部署 Nginx Proxy Manager 的配置文件:

    version: "3.8"\nservices:\n  app:\n    image: "jlesage/nginx-proxy-manager:latest"\n    container_name: nginx-proxy-manager\n    restart: unless-stopped\n    ports:\n      - "9001:8080"\n      - "9002:8181"\n      - "9003:4443"\n    volumes:\n      - /volume1/docker/nginx-proxy-manager/config:/config\n

    要访问管理后台,请前往 localhost:9002。默认的登录账户是 admin@example.com,密码是 changeme。系统会在你首次登录时提示你更改这些凭证。

    部署了反向代理后,只需要在路由器上开放 9003 端口(或你自定义的其他端口),就可以实现流量的转发,无需在公网上开放其他端口。你可以通过 CNAME 记录,将自定义域名 xxx.newzone.top 解析到你的家庭 DDNS 域名 yyy.newzone.top。这样,通过访问 xxx.newzone.top:9003,你就能直接访问指定的服务,并享受到自动部署的 SSL 加密带来的安全保护。若需要切换至其他服务,只需更改域名 xxx.newzone.top 中的 xxx 部分即可。

    Caddy

    ',5),d={href:"https://caddyserver.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,s.IL)('

    以下是通过 Docker 部署 Caddy 的配置文件:

    version: "3.9"\n\nservices:\n  caddy:\n    image: caddy:latest\n    container_name: caddy\n    restart: unless-stopped\n    ports:\n      - "9080:80"\n      - "9443:443"\n      - "9443:443/udp"\n    volumes:\n      - /volume1/docker/caddy/Caddyfile:/etc/caddy/Caddyfile\n      - /volume1/docker/caddy/site:/srv\n      - /volume1/docker/caddy/caddy_data:/data\n      - /volume1/docker/caddy/caddy_config:/config\n\nvolumes:\n  caddy_data:\n  caddy_config:\n

    通过上述配置,无论是 Nginx Proxy Manager 还是 Caddy,你都可以轻松地部署和管理你的反向代理服务。这将为你的网络环境提供更高的数据安全性和便捷的访问管理。希望这些信息能帮助你更好地利用反向代理技术,为你的网络环境带来显著的改善。如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',3),k={},m=(0,e(9720).c)(k,[["render",function(n,a){const e=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[t,o,p,c,(0,s.QD)("p",null,[(0,s.QD)("a",i,[(0,s.mY)("Nginx Proxy Manager"),(0,s.K2)(e)]),(0,s.mY)(" 提供了一个的图形界面,方便用户管理反向代理和 SSL 证书。它的 SSL 证书有效期长达三个月,并支持自动续期。由于国内家用宽带常常不支持开放 80 和 443 端口,所以这里推荐使用一个修改版的 Nginx Proxy Manager 而非官方容器,同时也不建议使用 Caddy。如果你对 Nginx Proxy Manager 还不够熟悉,也可以尝试使用国内开发的 "),(0,s.QD)("a",l,[(0,s.mY)("nginxWebUI"),(0,s.K2)(e)]),(0,s.mY)(",它也提供了图形化配置、SSL 证书申请和自动续签等功能。")]),r,(0,s.QD)("p",null,[(0,s.QD)("a",d,[(0,s.mY)("Caddy"),(0,s.K2)(e)]),(0,s.mY)(" 提供了更为简便的配置方法。但要注意,Caddy v2 默认使用 http-01 方式申请 HTTPS 证书,这要求你的域名能够通过公网的 80/443 端口进行所有权验证。在国内环境下,你可能需要手动配置证书。可以选择通过 Certbot 免费申请证书,或在阿里云、腾讯云等平台申请有效期为一年的免费证书。")]),u])}]]),v=JSON.parse('{"path":"/services/dockers-on-nas/reverse-proxy.html","title":"反向代理:Nginx Proxy Manager","lang":"zh-CN","frontmatter":{"article":false,"title":"反向代理:Nginx Proxy Manager","order":101,"description":"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。 更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/reverse-proxy.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"反向代理:Nginx Proxy Manager"}],["meta",{"property":"og:description","content":"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。 更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"反向代理:Nginx Proxy Manager\\",\\"description\\":\\"反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。 更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备...\\"}"]]},"headers":[{"level":2,"title":"Nginx Proxy Manager","slug":"nginx-proxy-manager","link":"#nginx-proxy-manager","children":[]},{"level":2,"title":"Caddy","slug":"caddy","link":"#caddy","children":[]}],"git":{"createdTime":1697975314000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.06,"words":919},"filePathRelative":"services/dockers-on-nas/reverse-proxy.md","localizedDate":"2023年10月22日","excerpt":"

    反向代理作为一种重要的网络服务,能有效地将所有传入的网络请求统一转发到相应的后端服务器。通过这种方式,我们不仅能通过不同的域名方便地访问各个 Docker 服务,而且还能避免记忆复杂的端口号,极大地简化了网络管理。

    \\n

    更为关键的是,反向代理为我们的网络连接提供了 HTTPS 加密,这是数据安全传输的重要保障。未加密的 HTTP 连接像是在网络世界中无防备地暴露,极易受到窥探和劫持。通过配置反向代理,所有的传入流量都将被加密处理,有效防止数据被识别和篡改的风险。

    \\n

    市面上常见的反向代理工具有多种,包括 Nginx Proxy Manager、nginxWebUI、Caddy 和 Lucky 等。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2c082b4e.f965d118.js b/assets/js/v-2c082b4e.f965d118.js deleted file mode 100644 index 0805a3919..000000000 --- a/assets/js/v-2c082b4e.f965d118.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[556],{9720:(o,e)=>{e.c=(o,e)=>{const t=o.__vccOpts||o;for(const[o,n]of e)t[o]=n;return t}},1064:(o,e,t)=>{t.r(e),t.d(e,{comp:()=>g,data:()=>p});var n=t(3968);const r=(0,n.IL)('

    利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。

    写作辅助

    • AutoCorrect:这个插件是写作纠错的佼佼者,特别是在处理中英文混排时的空格问题,但它尚未支持中英标点符号的自动转换。
    • Pangu-Markdown:对于想在 Markdown 文档中为超链接和文本之间自动添加空格的用户来说,这个插件是个不错的选择。它也能够在中英文字符之间添加空格,从而优化 Markdown 文档的排版。但 Pangu-Markdown 需要手动唤起命令面板,并应用 Pangu Format 来格式化文本。

    Markdown 增强

    • Markdown All in One:提供了全面的 Markdown 支持,使写作变得更加高效。
    • Markdown Preview Enhanced:这个插件提供了 Markdown 文件的增强预览功能。
    • markdownlint:用于 Markdown 语法的检查和修正。通过自定义设置,例如在配置文件中添加 "markdownlint.config": { "MD034": false },可以关闭某些可能与其他项目(如 docusaurus3)冲突的特性。
    • Word Count CJK:中英文字符计数工具。

    界面美化

    • Blockman:能够突出显示代码中的嵌套块,增强代码的可读性。如果插件会报错 Error:invalid syntax,则在设置中搜索 N25,关闭 Blockman:N25 Analyze Tags[1]
    • Color Highlight:将 CSS 颜色代码直观地显示为相应的颜色。
    • indent-rainbow:通过使用四种不同颜色交替显示,对文本前的缩进进行可视化处理。
    • Prettier:使用定制规则重新格式化代码,以实现一致的代码风格。建议开启文件保存时自动格式化文本的功能。
    • Image Preview:提供文件内的图片预览功能,支持 CSS 和 SVG 格式。
    • vscode-icons:根据文件类型显示相应的图标,使文件浏览更直观。
    • File Nesting Updater:利用 VS Code 的文件嵌套功能,使文件树结构更加整洁。

    代码补全

    • Auto Rename Tag:在重命名一个标签时,自动重命名 HTML 标签的开始和结束标签。避免只修改了开始标签,而忘记修改结束标签。该扩展适用于 HTML、XML、PHP 和 JavaScript。
    • Auto Close Tag:自动输入标签的闭合,提高编码效率。
    • Code Spell Checker:在 VSCode 中检查代码拼写错误,支持变量、函数和注释等。它还允许用户添加自定义词汇,适应特定项目的需求。
    • Path Intellisense:自动补全文件路径,尤其在导入文件时,能够快速提示并完成文件名的输入。

    ',10),a={class:"footnotes"},l={class:"footnotes-list"},s={id:"footnote1",class:"footnote-item"},i={href:"https://github.com/leodevbro/vscode-blockman/issues/43",target:"_blank",rel:"noopener noreferrer"},d=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),c={},g=(0,t(9720).c)(c,[["render",function(o,e){const t=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[r,(0,n.QD)("section",a,[(0,n.QD)("ol",l,[(0,n.QD)("li",s,[(0,n.QD)("p",null,[(0,n.QD)("a",i,[(0,n.mY)("Bug: commented RegExp throws invalid syntax error"),(0,n.K2)(t)]),(0,n.mY)(),d])])])])])}]]),p=JSON.parse('{"path":"/apps/tutorials/vscode.html","title":"VS Code","lang":"zh-CN","frontmatter":{"article":false,"title":"VS Code","order":3,"description":"利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。 写作辅助 Aut...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/vscode.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"VS Code"}],["meta",{"property":"og:description","content":"利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。 写作辅助 Aut..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T10:09:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-23T10:09:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"VS Code\\",\\"description\\":\\"利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。 写作辅助 Aut...\\"}"]]},"headers":[{"level":2,"title":"写作辅助","slug":"写作辅助","link":"#写作辅助","children":[]},{"level":2,"title":"Markdown 增强","slug":"markdown-增强","link":"#markdown-增强","children":[]},{"level":2,"title":"界面美化","slug":"界面美化","link":"#界面美化","children":[]},{"level":2,"title":"代码补全","slug":"代码补全","link":"#代码补全","children":[]}],"git":{"createdTime":1705346129000,"updatedTime":1706004554000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.58,"words":774},"filePathRelative":"apps/tutorials/vscode.md","localizedDate":"2024年1月15日","excerpt":"

    利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。

    \\n

    写作辅助

    \\n
      \\n
    • AutoCorrect:这个插件是写作纠错的佼佼者,特别是在处理中英文混排时的空格问题,但它尚未支持中英标点符号的自动转换。
    • \\n
    • Pangu-Markdown:对于想在 Markdown 文档中为超链接和文本之间自动添加空格的用户来说,这个插件是个不错的选择。它也能够在中英文字符之间添加空格,从而优化 Markdown 文档的排版。但 Pangu-Markdown 需要手动唤起命令面板,并应用 Pangu Format 来格式化文本。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2c130d02.f613758b.js b/assets/js/v-2c130d02.f613758b.js deleted file mode 100644 index d21cf81ac..000000000 --- a/assets/js/v-2c130d02.f613758b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7008],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,o]of t)n[e]=o;return n}},88:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>h,data:()=>d});var o=n(3968);const p=(0,o.QD)("p",null,"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。",-1),a=(0,o.QD)("h2",{id:"内网穿透",tabindex:"-1"},[(0,o.QD)("a",{class:"header-anchor",href:"#内网穿透"},[(0,o.QD)("span",null,"内网穿透")])],-1),r=(0,o.QD)("p",null,"连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。",-1),i=(0,o.QD)("p",null,"梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。",-1),m=(0,o.QD)("figure",null,[(0,o.QD)("img",{src:"https://img.newzone.top/20190331203233.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.QD)("figcaption")],-1),g=(0,o.QD)("p",null,"电信分配的公网 IP 经常会更换,每次都需要重定向子域名。在路由器 koolshare - 软件中心中安装 Aliddns,帮助更新家的公网 IP。插件中输入定向子域名和阿里云的 appkey,配置就完成了。如果没有自动在阿里云解析,可以先手动解析设置。",-1),l={href:"https://newzone.top/posts/2018-06-08-Baizhuo_GP1700.html",target:"_blank",rel:"noopener noreferrer"},c=(0,o.IL)('

    OpenVPN 配置

    内网穿透完成后,开始 OpenVPN 配置。梅林路由器进入「高级设置」→「VPN」→「虚拟专用网(VPN)服务器」,开启路由器自带的 OpenVPN。

    高级配置红色的部分有修改,特别是VPN 子网必须修改为与路由器不同的号段,如 192.168.3.0。如果使用默认子网,会无法顺利翻墙。

    应用设置后,点击「一般设置」,并导出 .ovpn 文件。打开该配置文件,将远程端口改为光猫上虚拟服务器映射的端口。

    最后,手机导入 .ovpn 设置文件,就可以上网回家了!

    ',7),s={},h=(0,n(9720).c)(s,[["render",function(e,t){const n=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[p,a,r,i,m,g,(0,o.QD)("p",null,[(0,o.mY)("光猫设置参考"),(0,o.QD)("a",l,[(0,o.mY)("光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"),(0,o.K2)(n)]),(0,o.mY)("。")]),c])}]]),d=JSON.parse('{"path":"/posts/2019-03-31-openvpn_back_to_home.html","title":"OpenVPN 随时随地回家的路","lang":"zh-CN","frontmatter":{"title":"OpenVPN 随时随地回家的路","date":"2019-03-31T00:00:00.000Z","category":["网络"],"tag":["OpenVPN","内网穿透"],"order":-24,"description":"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。 内网穿透 连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。 梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。 电信分配的公网 IP 经常会更换,每...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2019-03-31-openvpn_back_to_home.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"OpenVPN 随时随地回家的路"}],["meta",{"property":"og:description","content":"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。 内网穿透 连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。 梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。 电信分配的公网 IP 经常会更换,每..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20190331203233.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"OpenVPN 随时随地回家的路"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"OpenVPN"}],["meta",{"property":"article:tag","content":"内网穿透"}],["meta",{"property":"article:published_time","content":"2019-03-31T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"OpenVPN 随时随地回家的路\\",\\"image\\":[\\"https://img.newzone.top/20190331203233.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190331200921.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190331202017.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2019-03-31T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"内网穿透","slug":"内网穿透","link":"#内网穿透","children":[]},{"level":2,"title":"OpenVPN 配置","slug":"openvpn-配置","link":"#openvpn-配置","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":1.39,"words":416},"filePathRelative":"_posts/2019-03-31-openvpn_back_to_home.md","localizedDate":"2019年3月31日","excerpt":"

    有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。

    \\n

    内网穿透

    \\n

    连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 IP。

    \\n

    梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2c6e0a08.563a4c40.js b/assets/js/v-2c6e0a08.563a4c40.js deleted file mode 100644 index 23f287296..000000000 --- a/assets/js/v-2c6e0a08.563a4c40.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6132],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},940:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/tag/rsshub/","title":"标签: RSSHub","lang":"zh-CN","frontmatter":{"title":"标签: RSSHub","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"RSSHub","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/rsshub/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: RSSHub"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: RSSHub\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2d1b5e52.85439d5b.js b/assets/js/v-2d1b5e52.85439d5b.js deleted file mode 100644 index 717833484..000000000 --- a/assets/js/v-2d1b5e52.85439d5b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8544],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,r]of e)a[t]=r;return a}},9560:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(t,e){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/tag/","title":"标签","lang":"zh-CN","frontmatter":{"title":"标签","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-2ea7ec13.c8539799.js b/assets/js/v-2ea7ec13.c8539799.js deleted file mode 100644 index 1d0eeb7b8..000000000 --- a/assets/js/v-2ea7ec13.c8539799.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9764],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},8224:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/","title":"标签: 虚拟定位","lang":"zh-CN","frontmatter":{"title":"标签: 虚拟定位","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"虚拟定位","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 虚拟定位"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 虚拟定位\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-30af3c5e.ef122d74.js b/assets/js/v-30af3c5e.ef122d74.js deleted file mode 100644 index 9097f391d..000000000 --- a/assets/js/v-30af3c5e.ef122d74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[492],{9720:(n,t)=>{t.c=(n,t)=>{const a=n.__vccOpts||n;for(const[n,e]of t)a[n]=e;return a}},6228:(n,t,a)=>{a.r(t),a.d(t,{comp:()=>w,data:()=>y});var e=a(3968);const s=(0,e.QD)("p",null,"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。",-1),o=(0,e.QD)("p",null,"2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。",-1),p=(0,e.QD)("p",null,"Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。",-1),l=(0,e.QD)("figure",null,[(0,e.QD)("img",{src:"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/500x",alt:"",tabindex:"0",loading:"lazy"}),(0,e.QD)("figcaption")],-1),r=(0,e.QD)("h2",{id:"迁移步骤",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#迁移步骤"},[(0,e.QD)("span",null,"迁移步骤")])],-1),c={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},i=(0,e.IL)('
    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/" >\n  <item>\n    <title>标题</title>\n    <pubDate>发布日期</pubDate>\n    <content:encoded>内容</content:encoded>\n    <category>标签/目录 (该项将全部转为目录)</category>\n  </item>\n</rss>\n
    4. 登录 WordPress 后台,工具-导入-安装并启用插件 FeedWordPress 。自带 RSS 导入器许久不更新,极易报错,不推荐。

    5. 后台-Syndication-添加 rss 源,比如添加源 xxx.com/feed-wp.xml,其中 xxx.com 指你的博客网址。

    参考资料:

    ',2),u={href:"https://www.v2ex.com/t/73385",target:"_blank",rel:"noopener noreferrer"},d={href:"https://www.yiyult.com/201903155699.html",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.cnblogs.com/u0mo5/p/4100927.html",target:"_blank",rel:"noopener noreferrer"},g={href:"https://stackoverflow.com/questions/33212592/how-to-create-contentencoded-in-rss",target:"_blank",rel:"noopener noreferrer"},k={href:"content:encoded"},h={},w=(0,a(9720).c)(h,[["render",function(n,t){const a=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[s,o,p,l,r,(0,e.QD)("p",null,[(0,e.mY)("这里迁移的是 Jekyll 的 "),(0,e.QD)("a",c,[(0,e.mY)("Hux blog 模板"),(0,e.K2)(a)]),(0,e.mY)(",Hexo 或其他 Jekyll 博客可以参照微调。")]),i,(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.QD)("p",null,[(0,e.QD)("a",u,[(0,e.mY)("有没有办法把 Markdown 写的博客迁移到 wordpress?"),(0,e.K2)(a)])])]),(0,e.QD)("li",null,[(0,e.QD)("p",null,[(0,e.QD)("a",d,[(0,e.mY)("WordPress 从 RSS 导入文章"),(0,e.K2)(a)])])]),(0,e.QD)("li",null,[(0,e.QD)("p",null,[(0,e.QD)("a",m,[(0,e.mY)("有关 WordPress 的 Rss 导入指南"),(0,e.K2)(a)])])]),(0,e.QD)("li",null,[(0,e.QD)("p",null,[(0,e.QD)("a",g,[(0,e.mY)("How to create "),(0,e.QD)("a",k,[(0,e.mY)("content:encoded"),(0,e.K2)(a)]),(0,e.mY)(" in RSS")])])])])])}]]),y=JSON.parse('{"path":"/posts/2021-01-27-blog_jekyll_to_wordpress.html","title":"Jekyll 博客迁移-从 Markdown 到 WordPress","lang":"zh-CN","frontmatter":{"title":"Jekyll 博客迁移-从 Markdown 到 WordPress","date":"2021-01-27T00:00:00.000Z","category":["博客"],"tag":["Jekyll","WordPress"],"order":-35,"description":"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。 2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2021-01-27-blog_jekyll_to_wordpress.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 博客迁移-从 Markdown 到 WordPress"}],["meta",{"property":"og:description","content":"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。 2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/500x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Jekyll 博客迁移-从 Markdown 到 WordPress"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"WordPress"}],["meta",{"property":"article:published_time","content":"2021-01-27T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 博客迁移-从 Markdown 到 WordPress\\",\\"image\\":[\\"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/20210128120956.gif\\"],\\"datePublished\\":\\"2021-01-27T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"迁移步骤","slug":"迁移步骤","link":"#迁移步骤","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.79,"words":537},"filePathRelative":"_posts/2021-01-27-blog_jekyll_to_wordpress.md","localizedDate":"2021年1月27日","excerpt":"

    2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。

    \\n

    2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。

    \\n

    Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-30d27779.91096c54.js b/assets/js/v-30d27779.91096c54.js deleted file mode 100644 index a83fd3f7e..000000000 --- a/assets/js/v-30d27779.91096c54.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6980],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9956:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%93%9D%E5%B1%8F/","title":"标签: 蓝屏","lang":"zh-CN","frontmatter":{"title":"标签: 蓝屏","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"蓝屏","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%93%9D%E5%B1%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 蓝屏"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 蓝屏\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-31342f02.3e145544.js b/assets/js/v-31342f02.3e145544.js deleted file mode 100644 index 844c56b35..000000000 --- a/assets/js/v-31342f02.3e145544.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1864],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},3852:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/iptv/","title":"标签: IPTV","lang":"zh-CN","frontmatter":{"title":"标签: IPTV","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"IPTV","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/iptv/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: IPTV"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: IPTV\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-326c647e.dc9426a4.js b/assets/js/v-326c647e.dc9426a4.js deleted file mode 100644 index 05986f415..000000000 --- a/assets/js/v-326c647e.dc9426a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5648],{9720:(n,a)=>{a.c=(n,a)=>{const e=n.__vccOpts||n;for(const[n,s]of a)e[n]=s;return e}},1496:(n,a,e)=>{e.r(a),e.d(a,{comp:()=>r,data:()=>u});var s=e(3968);const t={href:"https://github.com/hslr-s/sun-panel",target:"_blank",rel:"noopener noreferrer"},l={href:"https://hslr-s.github.io/sun-panel-tool-page/#/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.IL)('

    部署代码

    version: "3.2"\n\nservices:\n  sun-panel:\n    image: "hslr/sun-panel:latest"\n    container_name: sun-panel\n    volumes:\n      - /volume1/docker/sun-panel/conf:/app/conf\n      - /volume1/docker/sun-panel/uploads:/app/uploads\n      - /volume1/docker/sun-panel/database:/app/database\n    ports:\n      - 7580:3002\n    restart: always\n
    ',2),o={},r=(0,e(9720).c)(o,[["render",function(n,a){const e=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("Sun-Panel"),(0,s.K2)(e)]),(0,s.mY)(" 与 Homarr 相比,样式与功能都要简单许多。")]),(0,s.QD)("p",null,[(0,s.mY)("不过 Sun-Panel 有 "),(0,s.QD)("a",l,[(0,s.mY)("浏览器书签转换工具"),(0,s.K2)(e)]),(0,s.mY)(",可以将书签批量导入 Sun Panel。")]),p])}]]),u=JSON.parse('{"path":"/services/dockers-on-nas/sun-panel.html","title":"Sun-Panel:简化导航页","lang":"zh-CN","frontmatter":{"article":false,"title":"Sun-Panel:简化导航页","order":92,"description":"Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。 不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。 部署代码 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/sun-panel.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Sun-Panel:简化导航页"}],["meta",{"property":"og:description","content":"Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。 不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。 部署代码 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Sun-Panel:简化导航页\\",\\"description\\":\\"Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。 不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。 部署代码 \\"}"]]},"headers":[{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1705346129000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":0.32,"words":97},"filePathRelative":"services/dockers-on-nas/sun-panel.md","localizedDate":"2024年1月15日","excerpt":"

    Sun-Panel 与 Homarr 相比,样式与功能都要简单许多。

    \\n

    不过 Sun-Panel 有 浏览器书签转换工具,可以将书签批量导入 Sun Panel。

    \\n

    部署代码

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-33f0e724.61a19b32.js b/assets/js/v-33f0e724.61a19b32.js deleted file mode 100644 index e488d09ff..000000000 --- a/assets/js/v-33f0e724.61a19b32.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4692],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},7e3:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>m,data:()=>g});var t=a(3968);const s={href:"https://github.com/whyour/qinglong",target:"_blank",rel:"noopener noreferrer"},o={href:"https://blog.csdn.net/u011027547/article/details/130703685",target:"_blank",rel:"noopener noreferrer"},l=(0,t.IL)('
    # https://github.com/whyour/qinglong/blob/develop/docker/docker-compose.yml\nversion: "2"\nservices:\n  web:\n    # alpine 基础镜像版本\n    image: whyour/qinglong:latest\n    container_name: qinglong\n    # debian-slim 基础镜像版本\n    # image: whyour/qinglong:debian\n    volumes:\n      - /volume1/docker/qinglong/data:/ql/data\n    ports:\n      - "5700:5700"\n    environment:\n      # 部署路径非必须,以斜杠开头和结尾,比如 /test/\n      QlBaseUrl: "/"\n    restart: unless-stopped\n

    配置注意:

    • 在运行脚本之前,请确保已安装所有必要的依赖。
    • 定期运行:0 0 7 * * ? 表示每天 7 点触发。其中第一个数字代表秒,第二个数字代表分钟,第三个数字代表小时,第四个数字代表每月的日期,第五个数字代表月份,第六个数字代表每周的星期几。这些数字之间使用空格分隔。要表示不限制的时间段,可以使用 * 号,要表示定期运行的时间段,可以使用 ? 替代,要表示间隔运行的时间段,可以使用 */数字 替代。如果需要在同一个时间位上设置多个选项,可以使用逗号 , 连接,如果需要设置一个时间段,可以使用短划线 - 连接。对于每天的运行,可以在日期位或星期位使用 ?

    京东 COOKIES

    ',4),i={href:"https://m.jd.com/",target:"_blank",rel:"noopener noreferrer"},r=(0,t.QD)("li",null,'使用浏览器的开发者工具(F12)进入调试模式,选择 "network"(网络)。',-1),c=(0,t.QD)("li",null,"点击页面右上方的「直接访问」,开发者工具中出现 log.gif 开头的记录。点击它,选择「Headers」>「Request headers」,复制出其中的 Cookie 内容。",-1),p=(0,t.QD)("li",null,[(0,t.mY)("在复制出的 Cookies 中查找 "),(0,t.QD)("code",null,"pt_key=XXX;pt_pin=xxx;"),(0,t.mY)(" 字段,并将其保存为变量 "),(0,t.QD)("code",null,"JD_COOKIE"),(0,t.mY)("。如果找不到 log.gif 或 getinfo 的记录,则可尝试随意添加一个商品到购物车。")],-1),d=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2023-11-26-06-31-20.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),u={},m=(0,a(9720).c)(u,[["render",function(e,n){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[(0,t.QD)("p",null,[(0,t.QD)("a",s,[(0,t.mY)("青龙面板"),(0,t.K2)(a)]),(0,t.mY)(" 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 "),(0,t.QD)("a",o,[(0,t.mY)("青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)"),(0,t.K2)(a)]),(0,t.mY)("。")]),l,(0,t.QD)("ol",null,[(0,t.QD)("li",null,[(0,t.mY)("在无痕模式下打开 "),(0,t.QD)("a",i,[(0,t.mY)("https://m.jd.com/"),(0,t.K2)(a)]),(0,t.mY)(" 网站,并登录账户。")]),r,c,p]),d])}]]),g=JSON.parse('{"path":"/services/dockers-on-nas/qinglong.html","title":"青龙面板:定时任务管理","lang":"zh-CN","frontmatter":{"article":false,"title":"青龙面板:定时任务管理","order":84,"description":"青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)。 配置注意: 在运行脚本之前,请确保已安装所有必要的依赖。 定期运行:0 0 7 * * ? 表示每...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/qinglong.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"青龙面板:定时任务管理"}],["meta",{"property":"og:description","content":"青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)。 配置注意: 在运行脚本之前,请确保已安装所有必要的依赖。 定期运行:0 0 7 * * ? 表示每..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-11-26-06-31-20.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"青龙面板:定时任务管理"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"青龙面板:定时任务管理\\",\\"description\\":\\"青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)。 配置注意: 在运行脚本之前,请确保已安装所有必要的依赖。 定期运行:0 0 7 * * ? 表示每...\\"}"]]},"headers":[{"level":2,"title":"京东 COOKIES","slug":"京东-cookies","link":"#京东-cookies","children":[]}],"git":{"createdTime":1699238582000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.79,"words":537},"filePathRelative":"services/dockers-on-nas/qinglong.md","localizedDate":"2023年11月6日","excerpt":"

    青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台,但现在多被用于京东薅羊毛,比如领京东、价保。安装好 Docker 后的配置流程参考 青龙面板应用——安装依赖拉取仓库运行京东脚本(保姆级图文)

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-34fd654c.5c854000.js b/assets/js/v-34fd654c.5c854000.js deleted file mode 100644 index e815593a0..000000000 --- a/assets/js/v-34fd654c.5c854000.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[232],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4828:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%81%94%E6%83%B3/","title":"标签: 联想","lang":"zh-CN","frontmatter":{"title":"标签: 联想","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"联想","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%81%94%E6%83%B3/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 联想"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 联想\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3752ff64.d4e2237a.js b/assets/js/v-3752ff64.d4e2237a.js deleted file mode 100644 index 532abe7fb..000000000 --- a/assets/js/v-3752ff64.d4e2237a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4408],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,p]of e)a[t]=p;return a}},92:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>r,data:()=>o});var p=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(t,e){const a=(0,p.E1)("Catalog");return(0,p.Wz)(),(0,p.An)("div",null,[(0,p.K2)(a)])}]]),o=JSON.parse('{"path":"/apps/","title":"Apps","lang":"zh-CN","frontmatter":{"title":"Apps","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Apps"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Apps\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-39312d08.75d8a812.js b/assets/js/v-39312d08.75d8a812.js deleted file mode 100644 index 18375b6bb..000000000 --- a/assets/js/v-39312d08.75d8a812.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3592],{9720:(t,e)=>{e.c=(t,e)=>{const r=t.__vccOpts||t;for(const[t,n]of e)r[t]=n;return r}},2388:(t,e,r)=>{r.r(e),r.d(e,{comp:()=>p,data:()=>a});var n=r(3968);const d=[(0,n.IL)("

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    解决方案:

    1. 增加运动:每天划船机 2 公里,后期再逐步加量

    2. 调节饮食,多喝水不吃炸鸡

      • 早餐:9 点,牛奶 + 麦片

      • 午餐:12 点,正常

      • 晚餐:4 点,晚餐后不再吃东西

    日期历史体重备注
    2012 年 9 月 2 日 23:04:5185KG今天吃了 3 个苹果,3 块钱煎饼。刚洗完澡
    2013 年 4 月 11 日 21:24:5486.4KG脱去外套
    2013 年 9 月 5 日 8 点81.8kg
    2013 年 10 月 3 日 9:55:0278.7KG
    2014 年 2 月 25 日春节83KG重新开始减重
    2014 年 10 月 19 日 16:50:1086.1KG
    2016 年 8 月 4 日88KG
    2018 年 3 月 6 日 晚91.6 KG
    2020 年 10 月 6 日95 KG巅峰,开始营养健康餐
    ",5)],o={},p=(0,r(9720).c)(o,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,d)}]]),a=JSON.parse('{"path":"/posts/2018-03-06-no_more_dinner.html","title":"提早晚餐,饿死算逑","lang":"zh-CN","frontmatter":{"title":"提早晚餐,饿死算逑","date":"2018-03-06T22:06:00.000Z","category":["健康"],"tag":["减肥"],"order":-11,"description":"上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤。 目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。 解决方案: 增加运动:每天划船机 2 公里,后期再逐步加量 调节饮食,多喝水不吃炸鸡 早餐...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-03-06-no_more_dinner.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"提早晚餐,饿死算逑"}],["meta",{"property":"og:description","content":"上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤。 目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。 解决方案: 增加运动:每天划船机 2 公里,后期再逐步加量 调节饮食,多喝水不吃炸鸡 早餐..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-25T04:29:03.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"减肥"}],["meta",{"property":"article:published_time","content":"2018-03-06T22:06:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-25T04:29:03.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"提早晚餐,饿死算逑\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-03-06T22:06:00.000Z\\",\\"dateModified\\":\\"2022-07-25T04:29:03.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658723343000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.02,"words":306},"filePathRelative":"_posts/2018-03-06-no_more_dinner.md","localizedDate":"2018年3月6日","excerpt":"

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    \\n

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    \\n

    解决方案:

    \\n
      \\n
    1. \\n

      增加运动:每天划船机 2 公里,后期再逐步加量

      \\n
    2. \\n
    3. \\n

      调节饮食,多喝水不吃炸鸡

      \\n
        \\n
      • \\n

        早餐:9 点,牛奶 + 麦片

        \\n
      • \\n
      • \\n

        午餐:12 点,正常

        \\n
      • \\n
      • \\n

        晚餐:4 点,晚餐后不再吃东西

        \\n
      • \\n
      \\n
    4. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3aed4aed.26759791.js b/assets/js/v-3aed4aed.26759791.js deleted file mode 100644 index 6df838eba..000000000 --- a/assets/js/v-3aed4aed.26759791.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7020],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},2936:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/","title":"标签: 声音克隆","lang":"zh-CN","frontmatter":{"title":"标签: 声音克隆","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"声音克隆","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 声音克隆"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 声音克隆\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3b40a9f2.b422a816.js b/assets/js/v-3b40a9f2.b422a816.js deleted file mode 100644 index 137d98b5c..000000000 --- a/assets/js/v-3b40a9f2.b422a816.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1272],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,i]of t)n[e]=i;return n}},9392:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>d,data:()=>g});var i=n(3968);const a=(0,i.QD)("p",null,"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。",-1),l=(0,i.QD)("p",null,[(0,i.mY)("消除饥饿感:"),(0,i.QD)("strong",null,"10 秒内原地高抬腿快跑 20 次"),(0,i.mY)("!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。")],-1),r={href:"https://www.solidot.org/story?sid=71166",target:"_blank",rel:"noopener noreferrer"},s=(0,i.QD)("h2",{id:"k-歌减肥",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#k-歌减肥"},[(0,i.QD)("span",null,"K 歌减肥")])],-1),p={href:"https://mp.weixin.qq.com/s/QKJ9PnmGTK7XY0yUWxsMRw",target:"_blank",rel:"noopener noreferrer"},o=(0,i.IL)('
    • 每天唱三首歌,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要一边按住 E 点,一边用力发声唱歌

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

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

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

    坐立减肥

    ',3),c={href:"https://mp.weixin.qq.com/s/LN0xu-FZaHP1oFvSwilGrA",target:"_blank",rel:"noopener noreferrer"},m=(0,i.IL)('
    比目鱼俯卧撑演示图
    比目鱼俯卧撑演示图

    当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 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),h={},d=(0,n(9720).c)(h,[["render",function(e,t){const n=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[a,l,(0,i.QD)("p",null,[(0,i.mY)("晨间锻炼使用八段锦(12mins)热身。每天保持 "),(0,i.QD)("a",r,[(0,i.mY)("9000 步"),(0,i.K2)(n)]),(0,i.mY)(",日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。")]),s,(0,i.QD)("p",null,[(0,i.QD)("a",p,[(0,i.mY)("K 歌减肥"),(0,i.K2)(n)]),(0,i.mY)("容易吵到邻居,没找到隔音口罩,用发泄壶代替。")]),o,(0,i.QD)("p",null,[(0,i.mY)("研究者开创了一种名叫"),(0,i.QD)("a",c,[(0,i.mY)("比目鱼俯卧撑(SPU)"),(0,i.K2)(n)]),(0,i.mY)("的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。")]),m])}]]),g=JSON.parse('{"path":"/Fitness.html","title":"健身计划","lang":"zh-CN","frontmatter":{"article":false,"title":"健身计划","icon":"strong","description":"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 K 歌减肥 K ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/Fitness.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"健身计划"}],["meta",{"property":"og:description","content":"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 K 歌减肥 K ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-06-10-14-38-20.png?imageMogr2/format/webp \\"E 点位置\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"健身计划"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"健身计划\\",\\"description\\":\\"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。 消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。 晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。 K 歌减肥 K ...\\"}"]]},"headers":[{"level":2,"title":"K 歌减肥","slug":"k-歌减肥","link":"#k-歌减肥","children":[]},{"level":2,"title":"坐立减肥","slug":"坐立减肥","link":"#坐立减肥","children":[]},{"level":2,"title":"健身理论","slug":"健身理论","link":"#健身理论","children":[]},{"level":2,"title":"每周健身 4 小时","slug":"每周健身-4-小时","link":"#每周健身-4-小时","children":[]},{"level":2,"title":"室内健身","slug":"室内健身","link":"#室内健身","children":[{"level":3,"title":"Slim in 6","slug":"slim-in-6","link":"#slim-in-6","children":[]},{"level":3,"title":"P90","slug":"p90","link":"#p90","children":[]},{"level":3,"title":"Les Mills BodyCombat","slug":"les-mills-bodycombat","link":"#les-mills-bodycombat","children":[]},{"level":3,"title":"T25","slug":"t25","link":"#t25","children":[]},{"level":3,"title":"P90X 和 insanity","slug":"p90x-和-insanity","link":"#p90x-和-insanity","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":15}]},"readingTime":{"minutes":10.53,"words":3159},"filePathRelative":"Fitness.md","localizedDate":"2022年7月22日","excerpt":"

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

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3bff2517.98f0d50b.js b/assets/js/v-3bff2517.98f0d50b.js deleted file mode 100644 index b3f627cf9..000000000 --- a/assets/js/v-3bff2517.98f0d50b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2960],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5256:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/","title":"标签: 宝塔面板","lang":"zh-CN","frontmatter":{"title":"标签: 宝塔面板","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"宝塔面板","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 宝塔面板"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 宝塔面板\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3e8a8459.9e78232f.js b/assets/js/v-3e8a8459.9e78232f.js deleted file mode 100644 index 4730bffdd..000000000 --- a/assets/js/v-3e8a8459.9e78232f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8392],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},1984:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>l,data:()=>c});var s=a(3968);const t={href:"https://github.com/OwO-Network/DeepLX/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.IL)('

    以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务:

    version: "3"\n\nservices:\n  deeplx:\n    image: ghcr.io/owo-network/deeplx:latest\n    container_name: deeplx\n    restart: always\n    ports:\n      - "32770:1188"\n    # environment:\n    # 如果设置了 TOKEN,则每个请求都需要包含 Authorization 标头。\n    # - TOKEN=helloworld\n    # 如果设置了 AUTHKEY,在 429 响应(请求过多/过快)后,会使用官方的 AuthKey 进行请求。如果同时使用多个 authKey,需要用逗号分隔。\n    # - AUTHKEY=xxxxxxx:fx\n

    如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦遇到请求频率过快的情况,DeepLX 会自动使用官方的 AuthKey 进行请求,从而加快翻译速度,提高效率。

    ',3),o={},l=(0,a(9720).c)(o,[["render",function(e,n){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("DeepLX"),(0,s.K2)(a)]),(0,s.mY)(" 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。")]),p])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/deeplx.html","title":"DeepLX - 免费翻译接口","lang":"zh-CN","frontmatter":{"article":false,"title":"DeepLX - 免费翻译接口","order":102,"description":"DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。 以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务: 如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/deeplx.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"DeepLX - 免费翻译接口"}],["meta",{"property":"og:description","content":"DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。 以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务: 如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"DeepLX - 免费翻译接口\\",\\"description\\":\\"DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。 以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务: 如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦...\\"}"]]},"headers":[],"git":{"createdTime":1701779050000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":0.81,"words":243},"filePathRelative":"services/dockers-on-nas/deeplx.md","localizedDate":"2023年12月5日","excerpt":"

    DeepLX 提供了一个基于 DeepL 的免费翻译服务。它可以将 DeepL Free API 转换为本地 API,使得第三方程序能够方便地使用 DeepL 提供的翻译功能。

    \\n

    以下是通过 Docker 部署 DeepLX 的配置文件,简单易懂,你可以快速启动你的翻译服务:

    \\n
    version: \\"3\\"\\n\\nservices:\\n  deeplx:\\n    image: ghcr.io/owo-network/deeplx:latest\\n    container_name: deeplx\\n    restart: always\\n    ports:\\n      - \\"32770:1188\\"\\n    # environment:\\n    # 如果设置了 TOKEN,则每个请求都需要包含 Authorization 标头。\\n    # - TOKEN=helloworld\\n    # 如果设置了 AUTHKEY,在 429 响应(请求过多/过快)后,会使用官方的 AuthKey 进行请求。如果同时使用多个 authKey,需要用逗号分隔。\\n    # - AUTHKEY=xxxxxxx:fx\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3efda598.125c1ea8.js b/assets/js/v-3efda598.125c1ea8.js deleted file mode 100644 index 028e9c13b..000000000 --- a/assets/js/v-3efda598.125c1ea8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[328],{9720:(e,r)=>{r.c=(e,r)=>{const t=e.__vccOpts||e;for(const[e,n]of r)t[e]=n;return t}},8870:(e,r,t)=>{t.r(r),t.d(r,{comp:()=>we,data:()=>ye});var n=t(3968);const l=(0,n.QD)("p",null,"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点:",-1),o=(0,n.QD)("ul",null,[(0,n.QD)("li",null,"选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。"),(0,n.QD)("li",null,"选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时任务脚本。"),(0,n.QD)("li",null,"SSD 缓存对家用的 NAS 性能提升不大,没必要加。"),(0,n.QD)("li",null,"群晖系统分布在所有硬盘,拔出一个不影响使用。但应用会有影响?"),(0,n.QD)("li",null,"NAS Docker 建议指定本地端口,否则重启容器会让端口发生改变,重启不会不影响 docker 配置。"),(0,n.QD)("li",null,"升级容器镜像,不影响内部数据库。群晖的「Docker 导出」只会导出安装镜像和配置,但不包括容器内部使用的数据库,用处不大。")],-1),a=(0,n.QD)("h2",{id:"nas-套件",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#nas-套件"},[(0,n.QD)("span",null,"NAS 套件")])],-1),i={href:"https://spk7.imnks.com/",target:"_blank",rel:"noopener noreferrer"},s=(0,n.QD)("li",null,"DS/Transmission:用于 PT 下载 (禁用 DHT,半小时停止做种)。",-1),c=(0,n.QD)("li",null,"Synology Drive Server:电脑文件备份。",-1),d=(0,n.QD)("li",null,"Hyper Backup:本地多硬盘备份,防止一个硬盘丢失后重要文件损坏,比如 docker 容器的本地配置文件夹。",-1),u=(0,n.QD)("li",null,[(0,n.mY)("Surveillance Station:管理 IP 摄像机以保护您的家庭和办公环境。借助 Surveillance Station,您可以透过网络浏览器,VisualStation 或移动设备观看和记录实时视频,设置定时记录,回放记录的视频,从而实现远程监控。发生重要事件时,您也会收到通知。注意,摄像头需支持 "),(0,n.QD)("strong",null,"ONVIF 协议"),(0,n.mY)("。")],-1),m={href:"https://www.clouddrive2.com",target:"_blank",rel:"noopener noreferrer"},p=(0,n.QD)("code",null,"sudo sed -i 's/package/root/g' /var/packages/CloudDrive2/conf/privilege",-1),h=(0,n.IL)('

    Docker API

    如果你想跨设备、网络来管理 Docker,就需要开通 Docker API,它可以让你远程管理 Docker 容器和镜像。以下以群晖 NAS 为例:

    1. 使用 SSH 修改文件 sudo vi /var/packages/Docker/etc/dockerd.json
    2. 在其中加入一行 "hosts" : [ "tcp://0.0.0.0:2375", "unix:///var/run/docker.sock" ],。建议将 tcp 的 ip 改为 nas 在本地的 ip,监听端口也不要使用默认的 2375。
    3. 重启 docker 服务。群晖里没找到重启命令,我这是手动停止 Docker 套件,再启动。

    Docker 容器

    常用

    ',5),D={href:"https://registry.hub.docker.com/r/linuxserver/qbittorrent/",target:"_blank",rel:"noopener noreferrer"},f=(0,n.QD)("code",null,"BitTorrent - DHT",-1),k={href:"https://blog.csdn.net/weixin_45120915/article/details/114691473",target:"_blank",rel:"noopener noreferrer"},g=(0,n.QD)("code",null,"config/qBittorrent/qBittorrent.conf",-1),b=(0,n.QD)("code",null,"WebUI\\AuthSubnetWhitelist",-1),Q=(0,n.QD)("code",null,"0.0.0.0/0",-1),Y={href:"https://github.com/AragonSnow/qiandao",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/ckx000/get-cookies",target:"_blank",rel:"noopener noreferrer"},v=(0,n.QD)("li",null,[(0,n.QD)("a",{href:"/services/dockers-on-nas/mt-photos"},"MT Photos"),(0,n.mY)(":支持自动整理、分类您的照片,比如:时间、地点、人物、照片类型。需要 99 元买断服务,每周连线检查授权状态。比较喜欢的是,支持网页分享特定图片影集,适合将宝宝照片批量分享给家人。")],-1),A={href:"https://docs.photoprism.app/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/immich-app/immich",target:"_blank",rel:"noopener noreferrer"},_={href:"https://containrrr.dev/watchtower/",target:"_blank",rel:"noopener noreferrer"},w=(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.mY)("监控指定名称的镜像:"),(0,n.QD)("code",null,"docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once nginx redis"),(0,n.mY)("。本案例只更新名为「nginx」和「redis」的容器,其他容器将被忽略。")]),(0,n.QD)("li",null,[(0,n.mY)("指定容器的 compose 命令中添加 lable "),(0,n.QD)("code",null,"com.centurylinklabs.watchtower.enable=false"),(0,n.mY)(",可禁止该容器的监控和更新。")])],-1),y=(0,n.QD)("h3",{id:"资讯",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#资讯"},[(0,n.QD)("span",null,"资讯")])],-1),K=(0,n.QD)("li",null,"RSSHub:无需保存数据,pubData 为 GMT 时区,普通用户无法更改,Docker Timezone 设置也不会有改变。",-1),T=(0,n.QD)("li",null,"Huginn:定期备份抓取脚本,数据库保存在本地。",-1),x={href:"https://registry.hub.docker.com/r/wangqiru/mercury-parser-api",target:"_blank",rel:"noopener noreferrer"},B=(0,n.QD)("li",null,[(0,n.mY)("Cloudflare Tunnels:可以将局域网内容转发到外网。不过,每次容器重启后都需要重新构建,"),(0,n.QD)("code",null,"sudo docker run --name cloudflared -d --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token [Your Tokens]"),(0,n.mY)("。后期考虑是否将启动命令放入容器。")],-1),M={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},P={href:"https://github.com/dgtlmoon/changedetection.io",target:"_blank",rel:"noopener noreferrer"},q=(0,n.QD)("h3",{id:"娱乐",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#娱乐"},[(0,n.QD)("span",null,"娱乐")])],-1),z={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"},H={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"},E=(0,n.QD)("li",null,[(0,n.QD)("a",{href:"/services/dockers-on-nas/tachidesk"},"Tachidesk"),(0,n.mY)(":开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。")],-1),R={href:"https://github.com/gotson/komga",target:"_blank",rel:"noopener noreferrer"},L=(0,n.QD)("li",null,[(0,n.QD)("a",{href:"/services/dockers-on-nas/reader"},"reader"),(0,n.mY)(":阅读 3 的服务器版,摆脱客户端,网页版即可查看。自定义替换进入文章页面左侧的「设置」-「过滤规则管理」。")],-1),$={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"},W={href:"https://hub.docker.com/r/makedie/noname_kill",target:"_blank",rel:"noopener noreferrer"},F={href:"https://hub.docker.com/r/gswxy/gswxy",target:"_blank",rel:"noopener noreferrer"},G={href:"https://www.gswxy.com/?p=67",target:"_blank",rel:"noopener noreferrer"},O=(0,n.QD)("h3",{id:"自动化",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#自动化"},[(0,n.QD)("span",null,"自动化")])],-1),U={href:"https://blog.csdn.net/alex_yangchuansheng/article/details/122295193",target:"_blank",rel:"noopener noreferrer"},V={href:"https://www.home-assistant.io/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/monicahq/monica",target:"_blank",rel:"noopener noreferrer"},J={href:"https://github.com/monicahq/docker",target:"_blank",rel:"noopener noreferrer"},Z=(0,n.QD)("code",null,"Me as a contact",-1),ee={href:"https://supermanito.github.io/Helloworld/#/",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/jxxghp/MoviePilot",target:"_blank",rel:"noopener noreferrer"},te={href:"https://github.com/Putarku/MoviePilot-Help",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://registry.hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc",target:"_blank",rel:"noopener noreferrer"},le={href:"https://rustdesk.com/zh/",target:"_blank",rel:"noopener noreferrer"},oe=(0,n.QD)("h3",{id:"待了解",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#待了解"},[(0,n.QD)("span",null,"待了解")])],-1),ae=(0,n.QD)("li",null,"Nextcloud: 私有云盘,完成 PC 端文件同步、版本控制,提供 web 端、移动端 app。",-1),ie={href:"https://github.com/lsky-org/lsky-pro",target:"_blank",rel:"noopener noreferrer"},se={href:"https://github.com/EstrellaXD/Auto_Bangumi",target:"_blank",rel:"noopener noreferrer"},ce=(0,n.QD)("li",null,"Clash:代理服务器。",-1),de=(0,n.QD)("h2",{id:"影视整理",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#影视整理"},[(0,n.QD)("span",null,"影视整理")])],-1),ue=(0,n.QD)("p",null,"下载文件后,用 tinyMediaManager 重命名并下载 NFO 和影视封面,最后放置于分类文件夹。",-1),me={href:"https://www.tinymediamanager.org/download/",target:"_blank",rel:"noopener noreferrer"},pe=(0,n.QD)("sup",{class:"footnote-ref"},[(0,n.QD)("a",{href:"#footnote1"},"[1]"),(0,n.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),he=(0,n.IL)('
    # 电视节目重命名规则\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),De={class:"footnotes"},fe={class:"footnotes-list"},ke={id:"footnote1",class:"footnote-item"},ge={href:"https://post.smzdm.com/p/a0d67m2z/",target:"_blank",rel:"noopener noreferrer"},be=(0,n.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Qe={id:"footnote2",class:"footnote-item"},Ye={href:"https://www.bigzhang.com/3264.html",target:"_blank",rel:"noopener noreferrer"},Se=(0,n.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ve={id:"footnote3",class:"footnote-item"},Ae={href:"https://blog.csdn.net/hilaryfrank/article/details/109722319",target:"_blank",rel:"noopener noreferrer"},Ne=(0,n.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),_e={},we=(0,t(9720).c)(_e,[["render",function(e,r){const t=(0,n.E1)("ExternalLinkIcon"),_e=(0,n.E1)("RouteLink");return(0,n.Wz)(),(0,n.An)("div",null,[l,o,a,(0,n.QD)("p",null,[(0,n.mY)("除了官方套件源,我会加上 "),(0,n.QD)("a",i,[(0,n.mY)("DSM7.x 矿神 SPK 套件源"),(0,n.K2)(t)]),(0,n.mY)("。")]),(0,n.QD)("ul",null,[s,c,d,u,(0,n.QD)("li",null,[(0,n.QD)("a",m,[(0,n.mY)("CloudDrive2"),(0,n.K2)(t)]),(0,n.mY)(":可以将网盘挂载在本地。安装套件后,需 SSH 终端运行 "),p,(0,n.mY)("。")])]),h,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("a",D,[(0,n.mY)("qBittorrent"),(0,n.K2)(t)]),(0,n.mY)(":请修改所有默认端口,以避免可能的错误。对于 PT 下载,请关闭 "),f,(0,n.mY)(" 和其他隐私选项,将做种时间缩短至一小时,并为下载文件添加 Everyone 权限。有关其他设置,请参考"),(0,n.QD)("a",k,[(0,n.mY)("群晖使用 qbittorrent"),(0,n.K2)(t)]),(0,n.mY)("。为了解决登录和密码问题,请先停止容器,并将 "),g,(0,n.mY)(" 文件中的 "),b,(0,n.mY)(" 设置为 "),Q,(0,n.mY)(",这样即可无需密码登录 qBittorrent WebUI。")]),(0,n.QD)("li",null,[(0,n.QD)("a",Y,[(0,n.mY)("qiandao"),(0,n.K2)(t)]),(0,n.mY)(":自动签到开源框架,需搭配浏览器扩展 "),(0,n.QD)("a",S,[(0,n.mY)("get-cookies"),(0,n.K2)(t)]),(0,n.mY)(" 使用,可导出配置。")]),v,(0,n.QD)("li",null,[(0,n.QD)("a",A,[(0,n.mY)("PhotoPrism"),(0,n.K2)(t)]),(0,n.mY)(":基于 ai 私有化部署的个人相册,但实际很多照片无法识别,无法对外分享。如果部署时出错,则尝试删除数据库文件夹下的内容。地点标记功能非常强大,类似本地版 Google Photos。")]),(0,n.QD)("li",null,[(0,n.QD)("a",N,[(0,n.mY)("Immich"),(0,n.K2)(t)]),(0,n.mY)(": 相册备份、浏览,提供 web 端、移动端 app。但不支持扫描已有文件。")]),(0,n.QD)("li",null,[(0,n.QD)("a",_,[(0,n.mY)("watchtower"),(0,n.K2)(t)]),(0,n.mY)(":监控并更新 Docker 容器。 "),w])]),y,(0,n.QD)("ul",null,[K,T,(0,n.QD)("li",null,[(0,n.mY)("Tiny Tiny RSS:定期备份订阅源和设置,自动更新,可配置全文插件 "),(0,n.QD)("a",x,[(0,n.mY)("mercury-parser-api"),(0,n.K2)(t)]),(0,n.mY)("。")]),B,(0,n.QD)("li",null,[(0,n.QD)("a",M,[(0,n.mY)("Check 酱"),(0,n.K2)(t)]),(0,n.mY)(":监测网页内容变化,并发送异动到微信。亦支持 http status、json 和 rss 监测。配合自架云端,关电脑后也能运行。同类工具有 "),(0,n.QD)("a",P,[(0,n.mY)("changedetection.io"),(0,n.K2)(t)]),(0,n.mY)("。")])]),q,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("a",z,[(0,n.mY)("AList"),(0,n.K2)(t)]),(0,n.mY)(":开源的网盘管理工具,还支持对象存储,本地存储,FTP 等等。")]),(0,n.QD)("li",null,[(0,n.QD)("a",I,[(0,n.mY)("Navidrome"),(0,n.K2)(t)]),(0,n.mY)(":NAS 上的私人专属在线音乐库。")]),(0,n.QD)("li",null,[(0,n.K2)(_e,{to:"/services/dockers-on-nas/"},{default:(0,n.Ql)((()=>[(0,n.mY)("Emby")])),_:1}),(0,n.mY)("/Plex:这两者都是热门的视频流媒体解决方案。终身会员的价格为 119 美元。Jellyfin 作为一个开源免费的选择,同样是一个不错的考虑。")]),(0,n.QD)("li",null,[(0,n.QD)("a",H,[(0,n.mY)("LANraragi"),(0,n.K2)(t)]),(0,n.mY)(":免费开源的漫画管理器,支持 zip/rar/targz/lzma/7z/xz/cbz/cbr/pdf 多种格式,可从网页和 "),(0,n.QD)("a",C,[(0,n.mY)("第三方客户端"),(0,n.K2)(t)]),(0,n.mY)(" 浏览。")]),E,(0,n.QD)("li",null,[(0,n.QD)("a",R,[(0,n.mY)("Komga"),(0,n.K2)(t)]),(0,n.mY)(":观看本地漫画。(还没用过,我习惯直接导入平板看)")]),L,(0,n.QD)("li",null,[(0,n.QD)("a",$,[(0,n.mY)("Tale Book"),(0,n.K2)(t)]),(0,n.mY)(":基于 Calibre 的简单的个人图书管理系统,支持在线阅读,但阅读体验不强且 Bug 较多,个人更喜欢直接用 PC 端查看。")]),(0,n.QD)("li",null,[(0,n.QD)("a",j,[(0,n.mY)("Bilibili_Danmuji"),(0,n.K2)(t)]),(0,n.mY)(":B 站直播礼物答谢、定时广告、关注感谢,自动回复工具,房管工具,自动打卡,Bilibili 直播弹幕姬 (使用 websocket 协议),java 版 B 站弹幕姬。部署 Docker 时需更新 jdr release 文件。")]),(0,n.QD)("li",null,[(0,n.QD)("a",W,[(0,n.mY)("无名杀"),(0,n.K2)(t)]),(0,n.mY)(":部署在 NAS 上的三国杀游戏。")]),(0,n.QD)("li",null,[(0,n.QD)("a",F,[(0,n.mY)("GSWXY - 魔兽世界单机服务端"),(0,n.K2)(t)]),(0,n.mY)(":需要 2G 内存和 20G 硬盘空间。你也可以直接使用"),(0,n.QD)("a",G,[(0,n.mY)("耳语海岸 RP 服"),(0,n.K2)(t)]),(0,n.mY)("。")])]),O,(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("a",U,[(0,n.mY)("n8n"),(0,n.K2)(t)]),(0,n.mY)(":开源 IFTTT 工具,偏重于云服务。")]),(0,n.QD)("li",null,[(0,n.K2)(_e,{to:"/family/HomeAutomation.html#node-red"},{default:(0,n.Ql)((()=>[(0,n.mY)("Node-RED")])),_:1}),(0,n.mY)(":开源流处理,类似本地版的 IFTTT。")]),(0,n.QD)("li",null,[(0,n.QD)("a",V,[(0,n.mY)("Home Assistant"),(0,n.K2)(t)]),(0,n.mY)(":开源家庭自动化平台,可自定义集中管理各品牌的智能家居设备。米家设备需使用 hacs 下的集成 "),(0,n.K2)(_e,{to:"/family/HomeAutomation.html#home-assistant"},{default:(0,n.Ql)((()=>[(0,n.mY)("Xiaomi Miot Auto")])),_:1}),(0,n.mY)("。")]),(0,n.QD)("li",null,[(0,n.QD)("a",X,[(0,n.mY)("Monica"),(0,n.K2)(t)]),(0,n.mY)(":Monica 允许人们记录所有关于朋友和家人的重要事情。喜欢和他们一起的活动。你最后一次打电话给某人的时候,你们谈了些什么。它会帮助你记住他们孩子的名字和年龄。它还能提醒你打电话给一个很久没联系的人。Monica 的容器设置查看 "),(0,n.QD)("a",J,[(0,n.mY)("Monica Docker"),(0,n.K2)(t)]),(0,n.mY)("。"),Z,(0,n.mY)(" 是它常年的一个 bug,可以通过指定数据库中的 users.me_contact_id 来解决。")]),(0,n.QD)("li",null,[(0,n.QD)("a",ee,[(0,n.mY)("supermanito/Helloworld"),(0,n.K2)(t)]),(0,n.mY)(":京东签到等脚本,功能很强大,没怎么研究。")]),(0,n.QD)("li",null,[(0,n.QD)("a",re,[(0,n.mY)("MoviePilot"),(0,n.K2)(t)]),(0,n.mY)(" 是 NAStool 作者重新推出的 NAS 媒体库自动化管理工具,使用说明参考 "),(0,n.QD)("a",te,[(0,n.mY)("MoviePilot-Help"),(0,n.K2)(t)]),(0,n.mY)("。个人使用并不习惯使用,可能是我设置错了,使用后反而把媒体结构弄乱了。")]),(0,n.QD)("li",null,[(0,n.QD)("a",ne,[(0,n.mY)("ubuntu-desktop-lxde-vnc"),(0,n.K2)(t)]),(0,n.mY)(":能在 Docker 上运行的 Ubuntu 桌面版,适合挂载要长期运行的程序。测试 OBS 时,对内存要求不高,但 CPU 直冲 100%,fps 只有 7。")]),(0,n.QD)("li",null,[(0,n.QD)("a",le,[(0,n.mY)("RustDesk"),(0,n.K2)(t)]),(0,n.mY)(":自建远程桌面,平替 TeamViewer 的开源软件。矿神源有套件,可直接部署中继服务器。")])]),oe,(0,n.QD)("ul",null,[ae,(0,n.QD)("li",null,[(0,n.QD)("a",ie,[(0,n.mY)("兰空图床"),(0,n.K2)(t)]),(0,n.mY)(":图床已经部署在七牛云,用 Picgo 上传,没感觉有必要用它。")]),(0,n.QD)("li",null,[(0,n.QD)("a",se,[(0,n.mY)("AutoBangumi"),(0,n.K2)(t)]),(0,n.mY)(":自动追番器,用以替代自我审查的 Bilibili。")]),ce]),de,ue,(0,n.QD)("p",null,[(0,n.QD)("a",me,[(0,n.mY)("tinyMediaManager"),(0,n.K2)(t)]),(0,n.mY)(" v4 免费版足够个人使用,v3 作偶尔补充使用,搜索首选语言改为「大陆简体」更精准。"),pe]),he,(0,n.QD)("section",De,[(0,n.QD)("ol",fe,[(0,n.QD)("li",ke,[(0,n.QD)("p",null,[(0,n.QD)("a",ge,[(0,n.mY)("群晖 NAS 使用 Emby+tMM 打造全平台观影畅爽体验(附下载地址)"),(0,n.K2)(t)]),(0,n.mY)(),be])]),(0,n.QD)("li",Qe,[(0,n.QD)("p",null,[(0,n.QD)("a",Ye,[(0,n.mY)("如何把群晖 NAS 上的套件搬到另外个硬盘上"),(0,n.K2)(t)]),(0,n.mY)(),Se])]),(0,n.QD)("li",ve,[(0,n.QD)("p",null,[(0,n.QD)("a",Ae,[(0,n.mY)("群晖 NAS 跨存储空间移动共享文件夹 (NAS 新增磁盘)"),(0,n.K2)(t)]),(0,n.mY)(),Ne])])])])])}]]),ye=JSON.parse('{"path":"/services/NAS.html","title":"NAS","lang":"zh-CN","frontmatter":{"article":false,"title":"NAS","icon":"process","order":1,"description":"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点: 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/NAS.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"NAS"}],["meta",{"property":"og:description","content":"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点: 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T10:09:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-23T10:09:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"NAS\\",\\"description\\":\\"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点: 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时...\\"}"]]},"headers":[{"level":2,"title":"NAS 套件","slug":"nas-套件","link":"#nas-套件","children":[]},{"level":2,"title":"Docker API","slug":"docker-api","link":"#docker-api","children":[]},{"level":2,"title":"Docker 容器","slug":"docker-容器","link":"#docker-容器","children":[{"level":3,"title":"常用","slug":"常用","link":"#常用","children":[]},{"level":3,"title":"资讯","slug":"资讯","link":"#资讯","children":[]},{"level":3,"title":"娱乐","slug":"娱乐","link":"#娱乐","children":[]},{"level":3,"title":"自动化","slug":"自动化","link":"#自动化","children":[]},{"level":3,"title":"待了解","slug":"待了解","link":"#待了解","children":[]}]},{"level":2,"title":"影视整理","slug":"影视整理","link":"#影视整理","children":[]},{"level":2,"title":"NAS 硬盘","slug":"nas-硬盘","link":"#nas-硬盘","children":[]}],"git":{"createdTime":1658511538000,"updatedTime":1706004554000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":34}]},"readingTime":{"minutes":8.66,"words":2599},"filePathRelative":"services/NAS.md","localizedDate":"2022年7月22日","excerpt":"

    NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点:

    \\n
      \\n
    • 选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。
    • \\n
    • 选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时任务脚本。
    • \\n
    • SSD 缓存对家用的 NAS 性能提升不大,没必要加。
    • \\n
    • 群晖系统分布在所有硬盘,拔出一个不影响使用。但应用会有影响?
    • \\n
    • NAS Docker 建议指定本地端口,否则重启容器会让端口发生改变,重启不会不影响 docker 配置。
    • \\n
    • 升级容器镜像,不影响内部数据库。群晖的「Docker 导出」只会导出安装镜像和配置,但不包括容器内部使用的数据库,用处不大。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3f384648.6a7d5cb5.js b/assets/js/v-3f384648.6a7d5cb5.js deleted file mode 100644 index 9a3639b18..000000000 --- a/assets/js/v-3f384648.6a7d5cb5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3844],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1528:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/gp1700/","title":"标签: GP1700","lang":"zh-CN","frontmatter":{"title":"标签: GP1700","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"GP1700","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/gp1700/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: GP1700"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: GP1700\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-3f4a3f88.7f73008f.js b/assets/js/v-3f4a3f88.7f73008f.js deleted file mode 100644 index 6fc26dcfc..000000000 --- a/assets/js/v-3f4a3f88.7f73008f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4424],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},540:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/github/","title":"标签: github","lang":"zh-CN","frontmatter":{"title":"标签: github","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"github","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/github/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: github"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: github\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-40321b0a.15afef34.js b/assets/js/v-40321b0a.15afef34.js deleted file mode 100644 index 7a2a6de33..000000000 --- a/assets/js/v-40321b0a.15afef34.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2440],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},5912:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>l,data:()=>c});var e=a(3968);const p={href:"https://docs.paperless-ngx.com/",target:"_blank",rel:"noopener noreferrer"},t=(0,e.IL)('

    Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。

    部署命令

    # https://github.com/paperless-ngx/paperless-ngx/blob/main/docker/compose/docker-compose.portainer.yml\nversion: "3.4"\nservices:\n  paperlessbroker:\n    image: docker.io/library/redis:7\n    container_name: paperlessbroker\n    restart: unless-stopped\n    volumes:\n      - /volume1/docker/paperless-ngx/redisdata:/data\n\n  paperlessdb:\n    image: docker.io/library/postgres:15\n    container_name: paperlessdb\n    restart: unless-stopped\n    volumes:\n      - /volume1/docker/paperless-ngx/pgdata:/var/lib/postgresql/data\n    environment:\n      POSTGRES_DB: paperless\n      POSTGRES_USER: paperless\n      POSTGRES_PASSWORD: paperless\n\n  paperlesswebserver:\n    image: ghcr.io/paperless-ngx/paperless-ngx:latest\n    container_name: paperlesswebserver\n    restart: unless-stopped\n    depends_on:\n      - paperlessdb\n      - paperlessbroker\n    ports:\n      - "9035:8000"\n    healthcheck:\n      test:\n        ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]\n      interval: 30s\n      timeout: 10s\n      retries: 5\n    volumes:\n      - /volume1/docker/paperless-ngx/data:/usr/src/paperless/data\n      - /volume1/docker/paperless-ngx/media:/usr/src/paperless/media\n      - /volume1/docker/paperless-ngx/export:/usr/src/paperless/export\n      - /volume1/docker/paperless-ngx/consume:/usr/src/paperless/consume\n    environment:\n      PAPERLESS_REDIS: redis://paperlessbroker:6379\n      PAPERLESS_DBHOST: paperlessdb\n      USERMAP_UID: 1026\n      USERMAP_GID: 100\n      # paperless 支持的语言(已内置英语、德语、意大利语、法语)\n      # See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster\n      # for available languages.\n      PAPERLESS_OCR_LANGUAGES: chi-sim chi-tra\n      # OCR 语言\n      PAPERLESS_OCR_LANGUAGE: eng+chi_sim\n      PAPERLESS_SECRET_KEY: change-me\n      PAPERLESS_TIME_ZONE: Asia/Shanghai\n

    部署完成后,需用 ssh 终端执行命令。

    sudo docker exec -it paperlesswebserver bash\npython3 manage.py createsuperuser\n

    依次输入 username、email、password。如果出现提示密码较弱,输入 y 继续。之后这些都可以在后台再修改。

    ',6),o={},l=(0,a(9720).c)(o,[["render",function(n,s){const a=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.QD)("a",p,[(0,e.mY)("Paperless-ngx"),(0,e.K2)(a)]),(0,e.mY)(" 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。")]),t])}]]),c=JSON.parse('{"path":"/services/dockers-on-nas/paperless-ngx.html","title":"Paperless-ngx:全文管理文档","lang":"zh-CN","frontmatter":{"article":false,"title":"Paperless-ngx:全文管理文档","order":32,"description":"Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。 Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。 部署命令...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/paperless-ngx.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Paperless-ngx:全文管理文档"}],["meta",{"property":"og:description","content":"Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。 Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。 部署命令..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Paperless-ngx:全文管理文档\\",\\"description\\":\\"Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。 Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。 部署命令...\\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":1.07,"words":321},"filePathRelative":"services/dockers-on-nas/paperless-ngx.md","localizedDate":"2023年12月19日","excerpt":"

    Paperless-ngx 是一个开源文档管理系统,可将您的物理文档转换为可搜索的在线档案。

    \\n

    Paperless-ngx 对文档执行 OCR,添加可搜索和可选择的文本,甚至可以对仅使用图像扫描的文档进行添加。支持 PDF、图片、纯文本文件、Office 文档(Word、Excel、Powerpoint 和 LibreOffice 等效项)等。

    \\n

    部署命令

    \\n
    # https://github.com/paperless-ngx/paperless-ngx/blob/main/docker/compose/docker-compose.portainer.yml\\nversion: \\"3.4\\"\\nservices:\\n  paperlessbroker:\\n    image: docker.io/library/redis:7\\n    container_name: paperlessbroker\\n    restart: unless-stopped\\n    volumes:\\n      - /volume1/docker/paperless-ngx/redisdata:/data\\n\\n  paperlessdb:\\n    image: docker.io/library/postgres:15\\n    container_name: paperlessdb\\n    restart: unless-stopped\\n    volumes:\\n      - /volume1/docker/paperless-ngx/pgdata:/var/lib/postgresql/data\\n    environment:\\n      POSTGRES_DB: paperless\\n      POSTGRES_USER: paperless\\n      POSTGRES_PASSWORD: paperless\\n\\n  paperlesswebserver:\\n    image: ghcr.io/paperless-ngx/paperless-ngx:latest\\n    container_name: paperlesswebserver\\n    restart: unless-stopped\\n    depends_on:\\n      - paperlessdb\\n      - paperlessbroker\\n    ports:\\n      - \\"9035:8000\\"\\n    healthcheck:\\n      test:\\n        [\\"CMD\\", \\"curl\\", \\"-fs\\", \\"-S\\", \\"--max-time\\", \\"2\\", \\"http://localhost:8000\\"]\\n      interval: 30s\\n      timeout: 10s\\n      retries: 5\\n    volumes:\\n      - /volume1/docker/paperless-ngx/data:/usr/src/paperless/data\\n      - /volume1/docker/paperless-ngx/media:/usr/src/paperless/media\\n      - /volume1/docker/paperless-ngx/export:/usr/src/paperless/export\\n      - /volume1/docker/paperless-ngx/consume:/usr/src/paperless/consume\\n    environment:\\n      PAPERLESS_REDIS: redis://paperlessbroker:6379\\n      PAPERLESS_DBHOST: paperlessdb\\n      USERMAP_UID: 1026\\n      USERMAP_GID: 100\\n      # paperless 支持的语言(已内置英语、德语、意大利语、法语)\\n      # See https://packages.debian.org/search?keywords=tesseract-ocr-&searchon=names&suite=buster\\n      # for available languages.\\n      PAPERLESS_OCR_LANGUAGES: chi-sim chi-tra\\n      # OCR 语言\\n      PAPERLESS_OCR_LANGUAGE: eng+chi_sim\\n      PAPERLESS_SECRET_KEY: change-me\\n      PAPERLESS_TIME_ZONE: Asia/Shanghai\\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-40515911.0377e552.js b/assets/js/v-40515911.0377e552.js deleted file mode 100644 index dff679c81..000000000 --- a/assets/js/v-40515911.0377e552.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6660],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3180:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E7%96%AB%E6%83%85/","title":"标签: 疫情","lang":"zh-CN","frontmatter":{"title":"标签: 疫情","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"疫情","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E7%96%AB%E6%83%85/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 疫情"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 疫情\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-417265f7.53edb51a.js b/assets/js/v-417265f7.53edb51a.js deleted file mode 100644 index 7eb762140..000000000 --- a/assets/js/v-417265f7.53edb51a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8748],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3080:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%B7%A5%E4%BD%9C%E6%B5%81/","title":"标签: 工作流","lang":"zh-CN","frontmatter":{"title":"标签: 工作流","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"工作流","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%B7%A5%E4%BD%9C%E6%B5%81/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 工作流"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 工作流\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4258a19c.f2943b0c.js b/assets/js/v-4258a19c.f2943b0c.js deleted file mode 100644 index 9013b898b..000000000 --- a/assets/js/v-4258a19c.f2943b0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[36],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},3044:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>d,data:()=>b});var s=a(3968);const t=(0,s.IL)('

    Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。

    使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 99 美元的折扣价格获得。此外,Emby 对蓝光格式如 ISO 支持有限。

    使用 tips

    添加媒体库

    设置媒体库时,中国按简称“PRC”排列,在字母 P 下寻找。

    刮取元数据

    ',6),i={href:"https://xiaoyaliu.notion.site/dc28a32c807d418691b83519fa523306",target:"_blank",rel:"noopener noreferrer"},l=(0,s.QD)("h3",{id:"移除合集",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#移除合集"},[(0,s.QD)("span",null,"移除合集")])],-1),p=(0,s.QD)("p",null,"如果你为家人设置了独立账户并设定了不同的媒体库权限,你会发现「合集」会自动显示在所有账户上。",-1),o=(0,s.QD)("p",null,"登录相应的用户,在 Emby 设置界面选择「主屏幕」>「合集」,取消勾选「在主屏幕显示」。这样当前的账户就不会再显示合集信息了。然后在其他账户中也进行同样的操作,这样其他账户也不会再显示合集信息。尽管页面上会保留合集的菜单,但如果不想让敏感内容显示在合集中,可以在各自的账户中设置媒体文件夹权限。",-1),c=(0,s.QD)("h3",{id:"安全地从外部访问",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#安全地从外部访问"},[(0,s.QD)("span",null,"安全地从外部访问")])],-1),r={href:"https://www.bilibili.com/read/cv14814465/",target:"_blank",rel:"noopener noreferrer"},u=(0,s.IL)('
    1. 确保你的家庭网络已设置了 DDNS(通常通过路由器完成)。
    2. 下载与你的域名匹配的 Tomcat 证书版本。
    3. 解压后,你会看到一个 pfx 文件和一个包含密码的 txt 文件。
    4. 将它们都放置在 config 目录的特定路径中。
    5. 接下来,在 Emby 的 服务器 > 网络 设置中,输入你的公共端口和 DDNS 域名。
    6. 建议开启安全连接模式,这样可以更好地保护你的数据安全。

    部署代码

    # https://hub.docker.com/r/linuxserver/emby\nversion: "2.1"\nservices:\n  emby:\n    image: lscr.io/linuxserver/emby:latest\n    container_name: emby\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n    volumes:\n      - /volume1/docker/emby/config:/config\n      # 媒体库映射\n      - /volume1/tvshows:/data/tvshows\n      - /volume4/movies:/data/movies\n      - /volume3/Anime:/data/anime\n      - /volume4/Documentary:/data/documentary\n      - /volume4/Music/MV:/data/MV\n      - /volume4/Music/Audio:/data/Audio\n      #- /opt/vc/lib:/opt/vc/lib #optional\n    ports:\n      - 8096:8096\n      - 8920:8920\n    restart: unless-stopped\n
    ',4),m={},d=(0,a(9720).c)(m,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[t,(0,s.QD)("p",null,[(0,s.mY)("建议用 tinyMediaManager 刮取影视元数据,具体设置参考小雅的"),(0,s.QD)("a",i,[(0,s.mY)("教程"),(0,s.K2)(a)]),(0,s.mY)("。统一刮取规则,便于将来更换管理器时无需重设。")]),l,p,o,c,(0,s.QD)("p",null,[(0,s.mY)("如果你计划从外部访问 Emby,请务必启用 HTTPS。具体步骤可以参考"),(0,s.QD)("a",r,[(0,s.mY)("这里"),(0,s.K2)(a)]),(0,s.mY)("。简单来说:")]),u])}]]),b=JSON.parse('{"path":"/services/dockers-on-nas/emby.html","title":"Emby:家庭媒体中心","lang":"zh-CN","frontmatter":{"article":false,"title":"Emby:家庭媒体中心","order":1,"description":"Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。 使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/emby.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Emby:家庭媒体中心"}],["meta",{"property":"og:description","content":"Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。 使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-09-15-05-32-43.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Emby:家庭媒体中心"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Emby:家庭媒体中心\\",\\"description\\":\\"Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。 使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 ...\\"}"]]},"headers":[{"level":2,"title":"使用 tips","slug":"使用-tips","link":"#使用-tips","children":[{"level":3,"title":"添加媒体库","slug":"添加媒体库","link":"#添加媒体库","children":[]},{"level":3,"title":"刮取元数据","slug":"刮取元数据","link":"#刮取元数据","children":[]},{"level":3,"title":"移除合集","slug":"移除合集","link":"#移除合集","children":[]},{"level":3,"title":"安全地从外部访问","slug":"安全地从外部访问","link":"#安全地从外部访问","children":[]}]},{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":2.16,"words":648},"filePathRelative":"services/dockers-on-nas/emby.md","localizedDate":"2023年9月16日","excerpt":"

    Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。

    \\n

    使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 99 美元的折扣价格获得。此外,Emby 对蓝光格式如 ISO 支持有限。

    \\n

    使用 tips

    \\n

    添加媒体库

    \\n

    设置媒体库时,中国按简称“PRC”排列,在字母 P 下寻找。

    \\n

    刮取元数据

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-446758d0.f3db9df6.js b/assets/js/v-446758d0.f3db9df6.js deleted file mode 100644 index 65e75296f..000000000 --- a/assets/js/v-446758d0.f3db9df6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7076],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},1784:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/tag/aria2/","title":"标签: Aria2","lang":"zh-CN","frontmatter":{"title":"标签: Aria2","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Aria2","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/aria2/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Aria2"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Aria2\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-458137a6.05a8003f.js b/assets/js/v-458137a6.05a8003f.js deleted file mode 100644 index 87e2a11a6..000000000 --- a/assets/js/v-458137a6.05a8003f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8192],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6980:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%96%AD%E8%88%8D%E7%A6%BB/","title":"标签: 断舍离","lang":"zh-CN","frontmatter":{"title":"标签: 断舍离","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"断舍离","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%96%AD%E8%88%8D%E7%A6%BB/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 断舍离"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 断舍离\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-46c3500e.97783b5c.js b/assets/js/v-46c3500e.97783b5c.js deleted file mode 100644 index e4bcc7e51..000000000 --- a/assets/js/v-46c3500e.97783b5c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9104],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},8480:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>s});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),s=JSON.parse('{"path":"/tag/smb/","title":"标签: smb","lang":"zh-CN","frontmatter":{"title":"标签: smb","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"smb","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/smb/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: smb"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: smb\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-46ecfd3e.bd03bfee.js b/assets/js/v-46ecfd3e.bd03bfee.js deleted file mode 100644 index c3ff47b74..000000000 --- a/assets/js/v-46ecfd3e.bd03bfee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7520],{9720:(e,r)=>{r.c=(e,r)=>{const n=e.__vccOpts||e;for(const[e,t]of r)n[e]=t;return n}},80:(e,r,n)=>{n.r(r),n.d(r,{comp:()=>Hr,data:()=>qr});var t=n(3968);const l=(0,t.QD)("p",null,"Windows 自用软件,以开源软件为主。",-1),o=(0,t.QD)("h2",{id:"知识记录",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#知识记录"},[(0,t.QD)("span",null,"知识记录")])],-1),a=(0,t.QD)("p",null,[(0,t.mY)("本地笔记:Logseq & Obsidian & 妙笔 & Joplin "),(0,t.QD)("s",null,"& Wiz 笔记 & OneNote")],-1),i=(0,t.QD)("p",null,"在线笔记:Notion & 飞书 & flomo & Airtable & 简悦",-1),s=(0,t.QD)("p",null,[(0,t.mY)("清单日历:滴答清单 & Trello & Habitify & 桌面日历 "),(0,t.QD)("s",null,"& Workflowy")],-1),p={href:"https://github.com/L-M-Sherlock/sm18-lazy-package/releases/tag/1.1.3",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/kopia/kopia",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/marktext/marktext",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/inkTimeRecord/TTime",target:"_blank",rel:"noopener noreferrer"},D=(0,t.QD)("s",null,"& 天若 OCR & ABBYY Screenshot Reader OCR",-1),c=(0,t.QD)("h2",{id:"平面设计",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#平面设计"},[(0,t.QD)("span",null,"平面设计")])],-1),Q={href:"https://github.com/SVG-Edit/svgedit",target:"_blank",rel:"noopener noreferrer"},f={href:"https://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html",target:"_blank",rel:"noopener noreferrer"},Y=(0,t.QD)("s",null,"& GIMP & FastStone & illustrator & Dreamweaver & lightroom",-1),g=(0,t.QD)("p",null,[(0,t.mY)("截图:Snipaste & ShareX "),(0,t.QD)("s",null,"& webshot & SETUNA")],-1),b=(0,t.QD)("p",null,[(0,t.mY)("图像管理:Honeyview & Eagle & PicGo 图床 "),(0,t.QD)("s",null,"& imageglass(界面好,但不支持全图拖拽和压缩包预览图片) & Google 相册 & 看图王 & 呱呱看图")],-1),d={href:"http://luci.criosweb.ro/riot/",target:"_blank",rel:"noopener noreferrer"},k=(0,t.QD)("s",null,"& 智图",-1),w=(0,t.QD)("h2",{id:"音频视频",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#音频视频"},[(0,t.QD)("span",null,"音频视频")])],-1),_={href:"https://github.com/maotoumao/MusicFree",target:"_blank",rel:"noopener noreferrer"},y={href:"http://tieba.baidu.com/p/4434445880",target:"_blank",rel:"noopener noreferrer"},K={href:"https://www.cnblogs.com/vinlxc/p/11347744.html",target:"_blank",rel:"noopener noreferrer"},T={href:"https://github.com/jitwxs/163MusicLyrics",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/lyswhut/lx-music-desktop",target:"_blank",rel:"noopener noreferrer"},v=(0,t.QD)("s",null,"& 百度音乐 & AIMP3 & 酷我 K 歌 & Airplay",-1),C={href:"https://sspai.com/post/76677",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/audacity/audacity/releases",target:"_blank",rel:"noopener noreferrer"},P=(0,t.QD)("s",null,"& Audition & 神舌变声器 & Goldwave",-1),x={href:"https://zhuanlan.zhihu.com/p/35757176",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/Hiram-Wong/ZyPlayer/releases",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/Nevcairiel/LAVFilters/releases",target:"_blank",rel:"noopener noreferrer"},B={href:"http://www.madvr.com/",target:"_blank",rel:"noopener noreferrer"},L=(0,t.QD)("s",null,"& 恒星播放器 & QQ 影音 & 暴风影音 & 射手",-1),W={href:"https://www.likecs.com/show-204327094.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://shana.pe.kr/shanaencoder_download/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},V=(0,t.QD)("s",null,"& Shotcut & 500th Video Converter & 小丸工具箱",-1),z={href:"https://github.com/xiaoxinpro/ChineseSubtitleConversionTool",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/wxbool/video-srt-windows",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/ytdl-org/youtube-dl",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/leiurayer/downkyi",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/nilaoda/BBDown",target:"_blank",rel:"noopener noreferrer"},U={href:"https://xiaoyaliu.notion.site/dc28a32c807d418691b83519fa523306",target:"_blank",rel:"noopener noreferrer"},H=(0,t.QD)("h2",{id:"屏幕录制",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#屏幕录制"},[(0,t.QD)("span",null,"屏幕录制")])],-1),q={href:"https://github.com/MathewSachin/Captura/releases",target:"_blank",rel:"noopener noreferrer"},X={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://github.com/faressoft/terminalizer",target:"_blank",rel:"noopener noreferrer"},j={href:"https://www.screentogif.com/",target:"_blank",rel:"noopener noreferrer"},J=(0,t.QD)("s",null,"& FlashBack Express",-1),$={href:"https://github.com/alievk/avatarify",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://github.com/Code52/carnac",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/mulaRahul/keyviz",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/cuiliang/ClickShow",target:"_blank",rel:"noopener noreferrer"},te={href:"https://github.com/brookhong/KeyCastOW",target:"_blank",rel:"noopener noreferrer"},le={href:"https://newzone.top/posts/2019-08-26-scrcpy_screen_projection.html",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://gitee.com/xfangfang/Macast/releases/",target:"_blank",rel:"noopener noreferrer"},ae=(0,t.QD)("h2",{id:"效率工具",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#效率工具"},[(0,t.QD)("span",null,"效率工具")])],-1),ie=(0,t.QD)("p",null,"快速启动:",-1),se=(0,t.QD)("li",null,"Quicker:脚本,全局手势",-1),pe=(0,t.QD)("li",null,"RunAny:指针快捷启动;一键打开网址、文件路径",-1),me={href:"https://capslox.com/capslock-plus/#basicFunctions",target:"_blank",rel:"noopener noreferrer"},he={href:"https://www.yuque.com/lucy/lucy/record",target:"_blank",rel:"noopener noreferrer"},ue=(0,t.QD)("s",null,"、Rolan、nTrun (Win 键启动)",-1),De=(0,t.QD)("li",null,[(0,t.mY)("启动栏:Listary "),(0,t.QD)("s",null,"、uTolls、Wox")],-1),ce=(0,t.QD)("p",null,[(0,t.mY)("剪切板:Ditto & PinStack "),(0,t.QD)("s",null,"& CopyQ")],-1),Qe=(0,t.QD)("p",null,[(0,t.mY)("时间管理:ManicTime "),(0,t.QD)("s",null,"& Toggl Track & RescueTime(订阅)")],-1),fe={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"},ge=(0,t.QD)("s",null,"& DocFetcher & Archivarius 3000",-1),be=(0,t.QD)("h2",{id:"文档管理",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#文档管理"},[(0,t.QD)("span",null,"文档管理")])],-1),de={href:"https://github.com/qwqcode/SubRenamer",target:"_blank",rel:"noopener noreferrer"},ke=(0,t.QD)("s",null,"& ReNamer & Bulk Rename Utility & 拖把更名器",-1),we={href:"https://github.com/WinMerge/winmerge",target:"_blank",rel:"noopener noreferrer"},_e={href:"http://fastcopy.jp/",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://meta.appinn.net/t/topic/31209/1",target:"_blank",rel:"noopener noreferrer"},Ke={href:"https://www.appinn.com/localsend/",target:"_blank",rel:"noopener noreferrer"},Te=(0,t.QD)("s",null,"& 局域网通讯 (酷安) & Send Anywhere & Pushbullet",-1),Se={href:"http://www.dropitproject.com/",target:"_blank",rel:"noopener noreferrer"},ve={href:"https://www.appinn.com/droppoint/",target:"_blank",rel:"noopener noreferrer"},Ce={href:"https://gist.github.com/Nerver4Ever/953447c9ecd330ffc0861d4cbb839369",target:"_blank",rel:"noopener noreferrer"},Me=(0,t.QD)("s",null,"& 亿方云 & 金山快盘 & 微云",-1),Pe=(0,t.QD)("h2",{id:"系统日常",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#系统日常"},[(0,t.QD)("span",null,"系统日常")])],-1),xe={href:"https://www.onecommander.com/",target:"_blank",rel:"noopener noreferrer"},Ae={href:"https://www.softwareok.com/?seite=Freeware/Q-Dir",target:"_blank",rel:"noopener noreferrer"},Fe=(0,t.QD)("s",null,"& 360 文件夹 & Clover(UI 不好看)",-1),Be=(0,t.QD)("p",null,[(0,t.mY)("浏览器:Chrome & Firefox(资源) & Brave(工具/书签) & Edge(移动端) & Tor "),(0,t.QD)("s",null,"& Vivaldi & Tor & 猎豹 & 360 & 搜狗 & Maxthon & 百度")],-1),Le=(0,t.QD)("p",null,[(0,t.mY)("输入法:小狼毫 & "),(0,t.QD)("code",null,"Win+H"),(0,t.mY)("(系统语音输入)"),(0,t.QD)("s",null,"& QuickCut & 讯飞语记 & 微软输入法 & 影子输入法 & 搜狗输入法 & 讯飞输入法 & 百度输入法")],-1),We=(0,t.QD)("p",null,[(0,t.mY)("通讯:微信 & TIM & Telegram & Discord & Thunderbird(邮箱) "),(0,t.QD)("s",null,"& 飞书 & Slack & 钉耙 & 千牛 & 阿里旺旺")],-1),Re={href:"https://newzone.top/posts/2018-05-15-aria2_a_new_download_tool.html",target:"_blank",rel:"noopener noreferrer"},Oe=(0,t.QD)("s",null,"& FDM(不支持 ed2k、磁力) & 迅雷",-1),Ve=(0,t.QD)("p",null,[(0,t.mY)("杀毒:火绒 "),(0,t.QD)("s",null,"& 360 & 金山卫士")],-1),ze=(0,t.QD)("p",null,[(0,t.mY)("压缩:Bandizip "),(0,t.QD)("s",null,"& PeaZip & 好压")],-1),Ee={href:"https://github.com/wmjordan/PDFPatcher",target:"_blank",rel:"noopener noreferrer"},Ie=(0,t.QD)("s",null,"& 文电通 & foxit 领鲜版(轻量编辑 PDF)",-1),Ge={href:"https://openhardwaremonitor.org/downloads/",target:"_blank",rel:"noopener noreferrer"},Ne={href:"https://www.msi.com/Landing/afterburner/graphics-cards",target:"_blank",rel:"noopener noreferrer"},Ue={href:"http://www.tbtool.cn/",target:"_blank",rel:"noopener noreferrer"},He=(0,t.QD)("s",null,"& SDI Snappy & 驱动精灵 & 鲁大师",-1),qe={href:"https://github.com/microsoft/PowerToys/releases/latest",target:"_blank",rel:"noopener noreferrer"},Xe={href:"https://github.com/benbuck/rbtray",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/BluePointLilac/ContextMenuManager",target:"_blank",rel:"noopener noreferrer"},je={href:"https://www.oo-software.com/en/shutup10",target:"_blank",rel:"noopener noreferrer"},Je={href:"https://www.sordum.org/downloads/?st-windows-update-blocker",target:"_blank",rel:"noopener noreferrer"},$e=(0,t.QD)("h2",{id:"低频工具",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#低频工具"},[(0,t.QD)("span",null,"低频工具")])],-1),er={href:"https://github.com/RipplePiam/MobaXterm-Chinese-Simplified",target:"_blank",rel:"noopener noreferrer"},rr={href:"https://kalacloud.com/blog/best-mysql-gui-tools/",target:"_blank",rel:"noopener noreferrer"},nr=(0,t.QD)("p",null,[(0,t.mY)("翻译词典:DeepL "),(0,t.QD)("s",null,"& GoldenDict & 欧陆词典 & 有道词典 & QTranslate & Lingoes")],-1),tr=(0,t.QD)("p",null,[(0,t.mY)("思维导图:TheBrain(无限思维扩展) & Xmind "),(0,t.QD)("s",null,"& MindManager")],-1),lr=(0,t.QD)("p",null,"虚拟机:VMware & VirtualBox",-1),or=(0,t.QD)("p",null,[(0,t.mY)("远程管理:RustDesk & ToDesk "),(0,t.QD)("s",null,"& AnyDesk & Teamviewer & Remote Utilities & XT800")],-1),ar=(0,t.QD)("p",null,[(0,t.mY)("卸载清理:IObit Uninstaller & Glary Utilities(注册表清理) "),(0,t.QD)("s",null,"& Geek Uninstaller")],-1),ir={href:"https://hovancik.net/stretchly/downloads/",target:"_blank",rel:"noopener noreferrer"},sr=(0,t.QD)("s",null,"& EyeLoveU & iris & f.luxS",-1),pr={href:"http://www.12306bypass.com/",target:"_blank",rel:"noopener noreferrer"},mr={href:"https://www.ventoy.net/cn/index.html",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://www.disktool.cn/",target:"_blank",rel:"noopener noreferrer"},ur=(0,t.QD)("p",null,[(0,t.mY)("飞书妙记:倍速、跳过空白片段、字幕搜索定位视频,将视频(最长 4 小时)转为文字大纲,了解视频梗概,建立基础认知。等到自己上手实操的时候,遇到问题直接搜索文字定位到相关内容,再看文字对应的视频截图确定配置细节。如果视频过大,可以提取音频来上传。"),(0,t.QD)("sup",{class:"footnote-ref"},[(0,t.QD)("a",{href:"#footnote1"},"[1]"),(0,t.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})])],-1),Dr={href:"https://github.com/mgth/LittleBigMouse",target:"_blank",rel:"noopener noreferrer"},cr=(0,t.QD)("h2",{id:"android",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#android"},[(0,t.QD)("span",null,"Android")])],-1),Qr={href:"https://github.com/gkd-kit/gkd",target:"_blank",rel:"noopener noreferrer"},fr={href:"https://github.com/yuliskov/SmartTube",target:"_blank",rel:"noopener noreferrer"},Yr={href:"https://github.com/BlueMatthew/WechatExporter",target:"_blank",rel:"noopener noreferrer"},gr={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},br={href:"https://sspai.com/post/65863",target:"_blank",rel:"noopener noreferrer"},dr=(0,t.QD)("hr",null,null,-1),kr=(0,t.QD)("h2",{id:"小玩意",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#小玩意"},[(0,t.QD)("span",null,"小玩意")])],-1),wr={href:"https://www.appinn.com/animated-drawings/",target:"_blank",rel:"noopener noreferrer"},_r=(0,t.QD)("h2",{id:"已弃",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#已弃"},[(0,t.QD)("span",null,"已弃")])],-1),yr={href:"https://meta.appinn.net/t/topic/29815",target:"_blank",rel:"noopener noreferrer"},Kr=(0,t.QD)("li",null,"桌面管理:Fences 3 & 火萤视频桌面 & UPUPOO & 360 桌面助手 & 搜狗桌面 & Q+",-1),Tr=(0,t.QD)("li",null,"进程管理:Process Lasso(避免老电脑卡顿?会自动删除启动项,不适合主力电脑)& Security Process Explorer(屏蔽垃圾进程)",-1),Sr=(0,t.QD)("li",null,"文件夹锁定/隐藏:Anvide Lock Folder",-1),vr=(0,t.QD)("li",null,"桌面便签:小黄条、URNotes 意唯桌面便签 (2015 停止更新,复制经常出错)",-1),Cr=(0,t.QD)("li",null,"网络电台:龙卷风",-1),Mr=(0,t.QD)("li",null,"英文写作:易改",-1),Pr=(0,t.QD)("li",null,"流量管理:cFosSpeed",-1),xr=(0,t.QD)("li",null,"游戏平台:VS & 4399",-1),Ar={href:"https://github.com/mamoe/mirai",target:"_blank",rel:"noopener noreferrer"},Fr=(0,t.QD)("li",null,"其他:按键精灵、DisplayCal(屏幕)、One Quik(虚拟桌面切换)、Auslogics Disk Defrag(磁盘整理)、Reflector 3(手机投屏)、VoiceBot(声控游戏)",-1),Br={href:"http://dogbean.ysepan.com/",target:"_blank",rel:"noopener noreferrer"},Lr={href:"https://www.bilibili.com/video/BV19a411578T",target:"_blank",rel:"noopener noreferrer"},Wr={href:"https://www.gt4t.cn/",target:"_blank",rel:"noopener noreferrer"},Rr={href:"https://github.com/ilyachch/md_docs-trans-app",target:"_blank",rel:"noopener noreferrer"},Or=(0,t.QD)("p",null,"部分应用推荐来自 @vector090。",-1),Vr=(0,t.QD)("hr",{class:"footnotes-sep"},null,-1),zr={class:"footnotes"},Er={class:"footnotes-list"},Ir={id:"footnote1",class:"footnote-item"},Gr={href:"https://sspai.com/post/70960",target:"_blank",rel:"noopener noreferrer"},Nr=(0,t.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),Ur={},Hr=(0,n(9720).c)(Ur,[["render",function(e,r){const n=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[l,o,a,i,s,(0,t.QD)("p",null,[(0,t.mY)("记忆复习:思源笔记 "),(0,t.QD)("s",null,[(0,t.mY)("& "),(0,t.QD)("a",p,[(0,t.mY)("SuperMemo"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",m,[(0,t.mY)("kopia"),(0,t.K2)(n)]),(0,t.mY)("(备份) & Anki")])]),(0,t.QD)("p",null,[(0,t.mY)("文本编辑:Visual Studio Code & Notepad++ & HbuilderX & WPS & office tab "),(0,t.QD)("s",null,[(0,t.mY)("& "),(0,t.QD)("a",h,[(0,t.mY)("MarkText"),(0,t.K2)(n)]),(0,t.mY)(" & Slide & 方方格子 & Typora & Yu Writer & UltraEdit")])]),(0,t.QD)("p",null,[(0,t.mY)("文字识别:"),(0,t.QD)("a",u,[(0,t.mY)("TTime"),(0,t.K2)(n)]),(0,t.mY)(" & 白描 "),D]),c,(0,t.QD)("p",null,[(0,t.mY)("设计:Figma & "),(0,t.QD)("a",Q,[(0,t.mY)("SVG-Editor"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",f,[(0,t.mY)("Stable Diffusion"),(0,t.K2)(n)]),(0,t.mY)("(AI 绘图) & Photoshop & 字由 "),Y]),g,b,(0,t.QD)("p",null,[(0,t.mY)("图像处理:PP 鸭(免费版单次 10 张)& gifski(动图)& "),(0,t.QD)("a",d,[(0,t.mY)("RIOT"),(0,t.K2)(n)]),(0,t.mY)("(压缩) & Inpaint(去水印) & PhotoZoom(无损放大) "),k]),w,(0,t.QD)("p",null,[(0,t.mY)("音频播放:"),(0,t.QD)("a",_,[(0,t.mY)("MusicFree"),(0,t.K2)(n)]),(0,t.mY)(" & foobar2000("),(0,t.QD)("a",y,[(0,t.mY)("MKing 皮肤"),(0,t.K2)(n)]),(0,t.mY)(")& "),(0,t.QD)("a",K,[(0,t.mY)("MusicTag"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",T,[(0,t.mY)("163MusicLyrics"),(0,t.K2)(n)]),(0,t.mY)("(云歌词下载,支持日文转罗马音)& Listen1& Moon FM(播客) & "),(0,t.QD)("a",S,[(0,t.mY)("洛雪音乐助手"),(0,t.K2)(n)]),(0,t.mY)("(失效)"),v]),(0,t.QD)("p",null,[(0,t.mY)("音频处理:"),(0,t.QD)("a",C,[(0,t.mY)("Reaper+ Ultraschall"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",M,[(0,t.mY)("Audacity"),(0,t.K2)(n)]),(0,t.mY)(" & iZotope rx9 "),P]),(0,t.QD)("p",null,[(0,t.mY)("视频播放:"),(0,t.QD)("a",x,[(0,t.mY)("Potplayer"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",A,[(0,t.mY)("ZY Player"),(0,t.K2)(n)]),(0,t.mY)("(直播&在线资源) & "),(0,t.QD)("a",F,[(0,t.mY)("LAVFilters"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",B,[(0,t.mY)("madVR"),(0,t.K2)(n)]),(0,t.mY)(" & XySubFilter & VLC "),L,(0,t.mY)(",播放器设置参考 "),(0,t.QD)("a",W,[(0,t.mY)("Potplayer + LAVFilters + madVR 配置教程"),(0,t.K2)(n)])]),(0,t.QD)("p",null,[(0,t.mY)("视频剪辑:剪映 & LosslessCut(音频提取·视频切割合并) & "),(0,t.QD)("a",R,[(0,t.mY)("ShanaEncoder"),(0,t.K2)(n)]),(0,t.mY)("(视频压缩) & "),(0,t.QD)("a",O,[(0,t.mY)("Quick Cut"),(0,t.K2)(n)]),(0,t.mY)(" (自动剪辑) & HandBrake(视频转换) & Premiere "),V]),(0,t.QD)("p",null,[(0,t.mY)("字幕工具:"),(0,t.QD)("a",z,[(0,t.mY)("ChineseSubtitleConversionTool"),(0,t.K2)(n)]),(0,t.mY)("(繁简转换)& Arctime Pro & "),(0,t.QD)("a",E,[(0,t.mY)("VideoSrt"),(0,t.K2)(n)]),(0,t.mY)(" & 人人译视界")]),(0,t.QD)("p",null,[(0,t.mY)("视频下载:"),(0,t.QD)("a",I,[(0,t.mY)("youtube-dl"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",G,[(0,t.mY)("哔哩下载姬"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",N,[(0,t.mY)("BBDown"),(0,t.K2)(n)]),(0,t.mY)("(命令行式哔哩哔哩下载器)")]),(0,t.QD)("p",null,[(0,t.mY)("影视管理:"),(0,t.QD)("a",U,[(0,t.mY)("tinyMediaManager"),(0,t.K2)(n)]),(0,t.mY)("(刮削),易影视(本地管理)")]),H,(0,t.QD)("p",null,[(0,t.mY)("录屏直播:OBS & "),(0,t.QD)("a",q,[(0,t.mY)("Captura"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",X,[(0,t.mY)("SplitCam"),(0,t.K2)(n)]),(0,t.mY)(" (摄像头多开) & "),(0,t.QD)("a",Z,[(0,t.mY)("terminalizer"),(0,t.K2)(n)]),(0,t.mY)("(终端录制) & "),(0,t.QD)("a",j,[(0,t.mY)("ScreenToGif"),(0,t.K2)(n)]),(0,t.mY)(),J]),(0,t.QD)("p",null,[(0,t.mY)("换脸特效:Snap Camera(操作简单) & "),(0,t.QD)("a",$,[(0,t.mY)("Avatarify Python"),(0,t.K2)(n)])]),(0,t.QD)("p",null,[(0,t.mY)("按键可视化:"),(0,t.QD)("a",ee,[(0,t.mY)("Carnac"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",re,[(0,t.mY)("Keyviz"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",ne,[(0,t.mY)("ClickShow"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",te,[(0,t.mY)("KeyCastOW"),(0,t.K2)(n)])]),(0,t.QD)("p",null,[(0,t.mY)("投屏工具:"),(0,t.QD)("a",le,[(0,t.mY)("scrcpy"),(0,t.K2)(n)]),(0,t.mY)(" (手机投屏) & "),(0,t.QD)("a",oe,[(0,t.mY)("Macast"),(0,t.K2)(n)]),(0,t.mY)("(手机视频投屏到电脑)& 蓝莓投屏")]),ae,ie,(0,t.QD)("ul",null,[se,pe,(0,t.QD)("li",null,[(0,t.mY)("热键工具:Fn-PowerKey、"),(0,t.QD)("a",me,[(0,t.mY)("CapsLock+"),(0,t.K2)(n)])]),(0,t.QD)("li",null,[(0,t.mY)("图标启动:"),(0,t.QD)("a",he,[(0,t.mY)("Lucy 快速启动"),(0,t.K2)(n)]),(0,t.mY)(),ue]),De]),ce,Qe,(0,t.QD)("p",null,[(0,t.mY)("爬虫监测:OpenWebMonitor & "),(0,t.QD)("a",fe,[(0,t.mY)("spider-flow"),(0,t.K2)(n)])]),(0,t.QD)("p",null,[(0,t.mY)("本地搜索:Everything("),(0,t.QD)("a",Ye,[(0,t.mY)("拼音扩展"),(0,t.K2)(n)]),(0,t.mY)(") & AnyTXT Searcher(全文|OCR)"),ge]),be,(0,t.QD)("p",null,[(0,t.mY)("重命名:FFRenamePro & "),(0,t.QD)("a",de,[(0,t.mY)("SubRenamer"),(0,t.K2)(n)]),(0,t.mY)("(字幕批量重命名)"),ke]),(0,t.QD)("p",null,[(0,t.mY)("文本比较:Beyond Compare & "),(0,t.QD)("a",we,[(0,t.mY)("WinMerge"),(0,t.K2)(n)]),(0,t.mY)("(开源)")]),(0,t.QD)("p",null,[(0,t.mY)("局域网传输:"),(0,t.QD)("a",_e,[(0,t.mY)("FastCopy"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",ye,[(0,t.mY)("Snapdrop"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",Ke,[(0,t.mY)("LocalSend"),(0,t.K2)(n)]),(0,t.mY)(),Te]),(0,t.QD)("p",null,[(0,t.mY)("文件归档:Syncthing(异地同步) & GoodSync(同设备同步) & "),(0,t.QD)("a",Se,[(0,t.mY)("Dropit"),(0,t.K2)(n)]),(0,t.mY)("(自动文件归档) & "),(0,t.QD)("a",ve,[(0,t.mY)("DropPoint"),(0,t.K2)(n)]),(0,t.mY)("(复制中转框)")]),(0,t.QD)("p",null,[(0,t.mY)("网盘同步:坚果云 & 阿里云盘 & 百度网盘 & 115 ("),(0,t.QD)("a",Ce,[(0,t.mY)("转存脚本"),(0,t.K2)(n)]),(0,t.mY)(") "),Me]),Pe,(0,t.QD)("p",null,[(0,t.mY)("资源管理器:"),(0,t.QD)("a",xe,[(0,t.mY)("One Commander"),(0,t.K2)(n)]),(0,t.mY)(" & "),(0,t.QD)("a",Ae,[(0,t.mY)("Q-Dir"),(0,t.K2)(n)]),(0,t.mY)(" & FreeCommander & QTTabBar(Win10) "),Fe]),Be,Le,We,(0,t.QD)("p",null,[(0,t.mY)("下载:"),(0,t.QD)("a",Re,[(0,t.mY)("Aria2"),(0,t.K2)(n)]),(0,t.mY)(" & IDM & Kinhdown "),Oe]),Ve,ze,(0,t.QD)("p",null,[(0,t.mY)("PDF:Sumatra PDF & PDFelement & "),(0,t.QD)("a",Ee,[(0,t.mY)("PDF 补丁丁"),(0,t.K2)(n)]),(0,t.mY)("(书签)"),Ie]),(0,t.QD)("p",null,[(0,t.mY)("硬件驱动:360 驱动大师 & "),(0,t.QD)("a",Ge,[(0,t.mY)("Open Hardware Monitor"),(0,t.K2)(n)]),(0,t.mY)("(旧电脑风扇转速) & "),(0,t.QD)("a",Ne,[(0,t.mY)("Afterburner"),(0,t.K2)(n)]),(0,t.mY)("(显卡风扇转速) & "),(0,t.QD)("a",Ue,[(0,t.mY)("图吧硬件工具箱"),(0,t.K2)(n)]),(0,t.mY)(" & AIDA64 "),He]),(0,t.QD)("p",null,[(0,t.mY)("系统优化:"),(0,t.QD)("a",qe,[(0,t.mY)("PowerToys"),(0,t.K2)(n)]),(0,t.mY)("、"),(0,t.QD)("a",Xe,[(0,t.mY)("RBTray"),(0,t.K2)(n)]),(0,t.mY)("(最小化到托盘)、"),(0,t.QD)("a",Ze,[(0,t.mY)("ContextMenuManager"),(0,t.K2)(n)]),(0,t.mY)("(右键管理,遇过 bug,推荐火绒右键)、WizTree(磁盘空间分析)、优效日历、StartIsBack++、"),(0,t.QD)("a",je,[(0,t.mY)("O&O ShutUp10++"),(0,t.K2)(n)]),(0,t.mY)("、Dism++、"),(0,t.QD)("a",Je,[(0,t.mY)("Windows Update Blocker"),(0,t.K2)(n)]),(0,t.mY)("(阻止系统更新)")]),$e,(0,t.QD)("p",null,[(0,t.mY)("编程工具:"),(0,t.QD)("a",er,[(0,t.mY)("MobaXTerm"),(0,t.K2)(n)]),(0,t.mY)("(SSH+FTP)、GitHubDesktop、He3 工具箱、Postman、FileZilla(FTP)、DBeaver("),(0,t.QD)("a",rr,[(0,t.mY)("数据库"),(0,t.K2)(n)]),(0,t.mY)(")、Fiddler(手机抓包)、Regex Match Tracer")]),nr,tr,lr,or,ar,(0,t.QD)("p",null,[(0,t.mY)("护眼健康:"),(0,t.QD)("a",ir,[(0,t.mY)("Stretchly"),(0,t.K2)(n)]),(0,t.mY)(),sr]),(0,t.QD)("p",null,[(0,t.mY)("偶尔使用:VeraCrypt(本地加密)、Recuva(文件恢复)、"),(0,t.QD)("a",pr,[(0,t.mY)("12306Bypass"),(0,t.K2)(n)]),(0,t.mY)("、爱思助手、Bluestacks(安卓模拟器)、"),(0,t.QD)("a",mr,[(0,t.mY)("Ventoy"),(0,t.K2)(n)]),(0,t.mY)("(制作可启动 U 盘)、微 PE 工具箱、"),(0,t.QD)("a",hr,[(0,t.mY)("傲梅分区"),(0,t.K2)(n)])]),ur,(0,t.QD)("p",null,[(0,t.QD)("a",Dr,[(0,t.mY)("LittleBigMouse"),(0,t.K2)(n)]),(0,t.mY)(":实现 Windows 多显示器鼠标平滑移动。")]),cr,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",Qr,[(0,t.mY)("GKD"),(0,t.K2)(n)]),(0,t.mY)(":手机端去广告的开源利器,可以点击跳过任意开屏广告/点击关闭应用内部任意弹窗广告,如关闭百度贴吧帖子广告卡片/知乎回答底部推荐广告卡片。")]),(0,t.QD)("li",null,[(0,t.QD)("a",fr,[(0,t.mY)("SmartTube"),(0,t.K2)(n)]),(0,t.mY)(":电视盒子上的去广告版 YouTube。")]),(0,t.QD)("li",null,[(0,t.QD)("a",Yr,[(0,t.mY)("WechatExporter"),(0,t.K2)(n)]),(0,t.mY)(":微信记录导出,仅限 iOS 手机。安卓和 PC 端微信都加密,无法导出查看。")]),(0,t.QD)("li",null,[(0,t.QD)("a",gr,[(0,t.mY)("AutoX"),(0,t.K2)(n)]),(0,t.mY)(":开源版的 Auto.js,没有包名屏蔽。相关信息可以参考 "),(0,t.QD)("a",br,[(0,t.mY)("快人一步:使用 Tasker+AutoX 一键直达健康码"),(0,t.K2)(n)]),(0,t.mY)("。")])]),dr,kr,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",wr,[(0,t.mY)("Animated Drawings"),(0,t.K2)(n)]),(0,t.mY)(":自动将绘画转换为动画。")])]),_r,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.mY)("全局手势:"),(0,t.QD)("a",yr,[(0,t.mY)("StrokesPlus.net"),(0,t.K2)(n)]),(0,t.mY)(" & WGestures")]),Kr,Tr,Sr,vr,Cr,Mr,Pr,xr,(0,t.QD)("li",null,[(0,t.mY)("客服:飞豆客服聊天助手 & "),(0,t.QD)("a",Ar,[(0,t.mY)("mirai(qq 机器人)"),(0,t.K2)(n)]),(0,t.mY)(" & 酷 Q(已关)")]),Fr,(0,t.QD)("li",null,[(0,t.QD)("a",Br,[(0,t.mY)("DockIt"),(0,t.K2)(n)]),(0,t.mY)(":主显示屏中,非全屏状态下,快速将窗口局部化。如何默认不全屏;应用不自动吸边?")]),(0,t.QD)("li",null,[(0,t.mY)("TheBrain:可以把知识无限扩充,都连接在一起。但将工作流导图放入 TheBrain 后发现并不合适,比较适合更细化的内容?介绍参考"),(0,t.QD)("a",Lr,[(0,t.mY)("善用佳软张玉新老师 · TheBrain ≠ 思维导图——运用 TheBrain 的三个阶段"),(0,t.K2)(n)]),(0,t.mY)("。")]),(0,t.QD)("li",null,[(0,t.mY)("Markdown 批量翻译: "),(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.QD)("a",Wr,[(0,t.mY)("GT4T"),(0,t.K2)(n)]),(0,t.mY)("(不推荐):可进行批量文件翻译,支持 Markdown。将文件夹拖入 GT4T 文件翻译器,即可翻译该文件下及子文件夹下的所有所选类型的文件。但似乎只能商用,添加自己的 API,依然提示付费。")]),(0,t.QD)("li",null,[(0,t.QD)("a",Rr,[(0,t.mY)("Markdown Docs Translator"),(0,t.K2)(n)]),(0,t.mY)(":开源免费,但使用网页版接口进行翻译,速度较慢,且很容易出现问题而中断。")])])])]),Or,Vr,(0,t.QD)("section",zr,[(0,t.QD)("ol",Er,[(0,t.QD)("li",Ir,[(0,t.QD)("p",null,[(0,t.QD)("a",Gr,[(0,t.mY)("视频课程学习留档"),(0,t.K2)(n)]),(0,t.mY)(),Nr])])])])])}]]),qr=JSON.parse('{"path":"/apps/Applist.html","title":"必备应用","lang":"zh-CN","frontmatter":{"article":false,"title":"必备应用","icon":"list","order":1,"description":"Windows 自用软件,以开源软件为主。 知识记录 本地笔记:Logseq & Obsidian & 妙笔 & Joplin 在线笔记:Notion & 飞书 & flomo & Airtable & 简悦 清单日历:滴答清单 & Trello & Habitify & 桌面日历 记忆复习:思源笔记 文本编辑:Visual Studio Code &...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/Applist.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"必备应用"}],["meta",{"property":"og:description","content":"Windows 自用软件,以开源软件为主。 知识记录 本地笔记:Logseq & Obsidian & 妙笔 & Joplin 在线笔记:Notion & 飞书 & flomo & Airtable & 简悦 清单日历:滴答清单 & Trello & Habitify & 桌面日历 记忆复习:思源笔记 文本编辑:Visual Studio Code &..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T10:09:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-23T10:09:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"必备应用\\",\\"description\\":\\"Windows 自用软件,以开源软件为主。 知识记录 本地笔记:Logseq & Obsidian & 妙笔 & Joplin 在线笔记:Notion & 飞书 & flomo & Airtable & 简悦 清单日历:滴答清单 & Trello & Habitify & 桌面日历 记忆复习:思源笔记 文本编辑:Visual Studio Code &...\\"}"]]},"headers":[{"level":2,"title":"知识记录","slug":"知识记录","link":"#知识记录","children":[]},{"level":2,"title":"平面设计","slug":"平面设计","link":"#平面设计","children":[]},{"level":2,"title":"音频视频","slug":"音频视频","link":"#音频视频","children":[]},{"level":2,"title":"屏幕录制","slug":"屏幕录制","link":"#屏幕录制","children":[]},{"level":2,"title":"效率工具","slug":"效率工具","link":"#效率工具","children":[]},{"level":2,"title":"文档管理","slug":"文档管理","link":"#文档管理","children":[]},{"level":2,"title":"系统日常","slug":"系统日常","link":"#系统日常","children":[]},{"level":2,"title":"低频工具","slug":"低频工具","link":"#低频工具","children":[]},{"level":2,"title":"Android","slug":"android","link":"#android","children":[]},{"level":2,"title":"小玩意","slug":"小玩意","link":"#小玩意","children":[]},{"level":2,"title":"已弃","slug":"已弃","link":"#已弃","children":[]}],"git":{"createdTime":1659797625000,"updatedTime":1706004554000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":44}]},"readingTime":{"minutes":6.66,"words":1999},"filePathRelative":"apps/Applist.md","localizedDate":"2022年8月6日","excerpt":"

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

    \\n

    知识记录

    \\n

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

    \\n

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

    \\n

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

    \\n

    记忆复习:思源笔记 & SuperMemo & kopia(备份) & Anki

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4727e053.76a8374f.js b/assets/js/v-4727e053.76a8374f.js deleted file mode 100644 index 50e29a072..000000000 --- a/assets/js/v-4727e053.76a8374f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2024],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},8744:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E5%8D%9A%E5%AE%A2/","title":"博客 分类","lang":"zh-CN","frontmatter":{"title":"博客 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"博客","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%8D%9A%E5%AE%A2/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"博客 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"博客 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-47d9dcc6.5bd8ff26.js b/assets/js/v-47d9dcc6.5bd8ff26.js deleted file mode 100644 index 3ee75f83b..000000000 --- a/assets/js/v-47d9dcc6.5bd8ff26.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8154],{9720:(e,o)=>{o.c=(e,o)=>{const r=e.__vccOpts||e;for(const[e,n]of o)r[e]=n;return r}},7800:(e,o,r)=>{r.r(o),r.d(o,{comp:()=>K,data:()=>j});var n=r(3968);const t=(0,n.QD)("h2",{id:"博客探索",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#博客探索"},[(0,n.QD)("span",null,"博客探索")])],-1),l=(0,n.QD)("p",null,"2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​",-1),i={href:"https://jekyllrb.com/",target:"_blank",rel:"noopener noreferrer"},a=(0,n.IL)('

    到了 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),s={href:"https://github.com/zhaoolee/WordPressXMLRPCTools",target:"_blank",rel:"noopener noreferrer"},d=(0,n.QD)("p",null,"基于 WordPressXMLRPCTools,我做了三点修改:​",-1),p=(0,n.IL)("
  • 发布设置:修改 main.py 文件。

    • 修复无法覆盖更新文章的 bug。
    • 调整项目页的时间格式。
    • 页首添加文章编辑时间,默认为格林尼治标准时间,比北京晚 8 小时。
    • 将文章页尾部的本文永久更新地址从标题格式调整为常规字母。
  • 草稿箱:_post 路径内新建 TEMP 文件夹,用于存放文章草稿。WordPress 推送程序会忽略 _post 子文件夹的内容,换言之,TEMP 文件夹不会发布到 WordPress 网站。

  • ",2),c=(0,n.QD)("code",null,".nojekyll",-1),h=(0,n.QD)("code",null,"index.html",-1),g=(0,n.QD)("code",null,"_sidebar.md",-1),m={href:"https://rockbenben.github.io/Blog_WP/",target:"_blank",rel:"noopener noreferrer"},u=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-05-26-20-12-56.png",alt:"",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"docsify 页面效果")],-1),b=(0,n.QD)("h3",{id:"使用流程",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#使用流程"},[(0,n.QD)("span",null,"使用流程")])],-1),f={href:"https://github.com/rockbenben/Blog_WP",target:"_blank",rel:"noopener noreferrer"},k=(0,n.QD)("li",null,[(0,n.mY)("回到你新建的 repo,删除 _post 文件夹中的所有文件,参照主目录下 "),(0,n.QD)("code",null,"example_article.md"),(0,n.mY)(" 的格式编辑文章。注意:md 文件名不能包含大写字母。")],-1),w={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"},y=(0,n.QD)("li",null,[(0,n.mY)("修改主目录下的 "),(0,n.QD)("code",null,"index.html"),(0,n.mY)(" 和 "),(0,n.QD)("code",null,"_sidebar.md"),(0,n.mY)(" 文件,调整 docsify 网页设置。 "),(0,n.QD)("ul",null,[(0,n.QD)("li",null,[(0,n.QD)("code",null,"index.html"),(0,n.mY)(" 修改 docsify 网页标题、描述和关键词。")]),(0,n.QD)("li",null,[(0,n.QD)("code",null,"_sidebar.md"),(0,n.mY)(" 修改 docsify 网页侧边栏,加入博客文章的标题和位置。")])])],-1),D=(0,n.IL)('

    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),P={href:"https://hui-zz.gitee.io/runany/#/",target:"_blank",rel:"noopener noreferrer"},Q=(0,n.QD)("code",null,"Code.exe",-1),W=(0,n.QD)("code",null,"notepad++.exe",-1),x=(0,n.IL)('
    ;将 Runany 主目录下的 RunAny.ini 文件内的「编辑」模块替换为下方命令\n-编辑(&Edit)\n --编程|cmd bat md ahk html js css json yml yaml py\n vscode|Code.exe\n

    docsify 全文检索

    ',2),_={href:"https://docsify.js.org/#/",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/rockbenben/Blog_WP",target:"_blank",rel:"noopener noreferrer"},Y=(0,n.QD)("code",null,"docsify serve",-1),v=(0,n.QD)("code",null,"http://localhost:3000/",-1),z=(0,n.QD)("figure",null,[(0,n.QD)("img",{src:"https://img.newzone.top/2022-05-30-20-03-19.png?imageMogr2/format/webp",alt:"docsify 本地运行",tabindex:"0",loading:"lazy"}),(0,n.QD)("figcaption",null,"docsify 本地运行")],-1),A={href:"https://rockbenben.github.io/Blog_WP/",target:"_blank",rel:"noopener noreferrer"},E=(0,n.QD)("h2",{id:"订阅管理-wordpress",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#订阅管理-wordpress"},[(0,n.QD)("span",null,"订阅管理:WordPress")])],-1),S=(0,n.QD)("p",null,"40% 的网站基于 WordPress 架构,因此 WordPress 有超多的主题和插件,可以实现你想要的功能,比如 RSS、Newsletter。",-1),N={href:"https://substack.com/",target:"_blank",rel:"noopener noreferrer"},R={href:"https://zhubai.love/",target:"_blank",rel:"noopener noreferrer"},B=(0,n.QD)("h2",{id:"后续",tabindex:"-1"},[(0,n.QD)("a",{class:"header-anchor",href:"#后续"},[(0,n.QD)("span",null,"后续")])],-1),T=(0,n.QD)("p",null,"比起原来的 Jekyll,新方案的配置要复杂些,但使用并不难,推荐稿件多的人采用。",-1),G=(0,n.QD)("p",null,"折腾新方案的过程中,我发现了篇 2021 年初写的文章。当时,稿子写到 90%,我就去忙其他事,忘了这篇文章。等到这次被发现,它已经在草稿箱待了一年半。",-1),C=(0,n.QD)("p",null,"用了新方案,稿件管理会变得很简单,稿件遗忘、找不到的情况也会减少许多。最近我出稿速度大增,也都跟这有关,都是从草稿箱捡回来的半成品。",-1),L=(0,n.QD)("p",null,"写完这篇稿子,疫情封控也正好结束,终于可以出门了,希望永远别再给「免费假期」了。",-1),J={},K=(0,r(9720).c)(J,[["render",function(e,o){const r=(0,n.E1)("ExternalLinkIcon");return(0,n.Wz)(),(0,n.An)("div",null,[t,l,(0,n.QD)("p",null,[(0,n.mY)("2018 年,我偶然接触到 "),(0,n.QD)("a",i,[(0,n.mY)("Jekyll"),(0,n.K2)(r)]),(0,n.mY)(",被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录转变到知识整理输出。Jekyll 方案需要首先在本地用 Markdown 编辑排版,然后同步到 github 发布,最后以 Markdown 格式手动分发到各个渠道。当文章较少时,这套方案的体验感特别好。​")]),a,(0,n.QD)("p",null,[(0,n.QD)("a",s,[(0,n.mY)("WordPressXMLRPCTools"),(0,n.K2)(r)]),(0,n.mY)(" 能用 Markdown 生成博客,推送更新到 Github 后,通过 Github Actions 自动将文章更新到 WordPress,并将 WordPress 网站的文章索引更新到 Github 仓库的 README.md,供搜索引擎收录,方便 Windows 用户使用。iOS 用户有更成熟的发布工具,无需代码即可到同步 WordPress,比如 @ern 推荐的 MWeb/Ulysses。")]),d,(0,n.QD)("ul",null,[p,(0,n.QD)("li",null,[(0,n.QD)("p",null,[(0,n.mY)("文章聚合页:主路径添加 "),c,(0,n.mY)("、"),h,(0,n.mY)(" 和 "),g,(0,n.mY)(" 三个文件,引入了文档生成工具 docsify,使得博客文章能聚合在一个页面,方便快速定位和位置管理。示例:"),(0,n.QD)("a",m,[(0,n.mY)("https://rockbenben.github.io/Blog_WP/"),(0,n.K2)(r)]),(0,n.mY)("。")]),u])]),b,(0,n.QD)("ol",null,[(0,n.QD)("li",null,[(0,n.mY)("进入 "),(0,n.QD)("a",f,[(0,n.mY)("项目页面"),(0,n.K2)(r)]),(0,n.mY)(",点击「Use this template」,复制模板文件。")]),k,(0,n.QD)("li",null,[(0,n.mY)("按 "),(0,n.QD)("a",w,[(0,n.mY)("WordPressXMLRPCTools 安装步骤"),(0,n.K2)(r)]),(0,n.mY)(" 执行,如遇报错,查看下方使用问题。注意检查 WordPress 登录授权和 Github Actions secret,这两步极易遗漏。")]),y]),D,(0,n.QD)("p",null,[(0,n.QD)("a",P,[(0,n.mY)("RunAny"),(0,n.K2)(r)]),(0,n.mY)(" 是基于 AutoHotkey 的一键启动软件。按下方配置后,点击飞书表格中的「本地位置」,即可使用默认编辑器打开 md 文件。如果你的默认编辑器是 notepad++,则将下方命令中的 "),Q,(0,n.mY)(" 替换为 "),W,(0,n.mY)("。")]),x,(0,n.QD)("p",null,[(0,n.mY)("飞书表格可以搜索关键元素,但不能对检索全文。这时,我们需要使用 "),(0,n.QD)("a",_,[(0,n.mY)("docsify"),(0,n.K2)(r)]),(0,n.mY)(",一款能将 markdown 文档自动生成网站的工具,相当于轻量级的 GitBook。​")]),(0,n.QD)("p",null,[(0,n.mY)("docsify 使用简单,如果使用了前文我修改过的"),(0,n.QD)("a",M,[(0,n.mY)("发布工具"),(0,n.K2)(r)]),(0,n.mY)(",则无需配置。在发布工具文件夹内的空白区域,右键打开终端,执行命令"),Y,(0,n.mY)("即可生成全文检索网页,默认管理链接为 "),v,(0,n.mY)("。")]),z,(0,n.QD)("p",null,[(0,n.mY)("如果你设置了 Github Pages,项目会默认启动在线 docsify 网页,页面链接取决于 Github 的设置。比如我的用户名是 rockbenben,项目名是 Blog_WP,所以 docsify 管理页面就是 "),(0,n.QD)("a",A,[(0,n.mY)("https://rockbenben.github.io/Blog_WP/"),(0,n.K2)(r)]),(0,n.mY)("。")]),E,S,(0,n.QD)("p",null,[(0,n.mY)("如果你拥有较多的粉丝,可以使用 "),(0,n.QD)("a",N,[(0,n.mY)("Substack"),(0,n.K2)(r)]),(0,n.mY)(" 和"),(0,n.QD)("a",R,[(0,n.mY)("竹白"),(0,n.K2)(r)]),(0,n.mY)("来分发博客。这两者都支持 Newsletter 付费订阅。只针对国内用户的话,竹白可支持微信订阅。")]),B,T,G,C,L])}]]),j=JSON.parse('{"path":"/posts/2022-06-07-blog_md_to_wordpress.html","title":"集自动发布、本地管理于一身:WordPress 博客管理方案分享","lang":"zh-CN","frontmatter":{"title":"集自动发布、本地管理于一身:WordPress 博客管理方案分享","subtitle":"18 年博客探索总结","date":"2022-06-07T00:00:00.000Z","category":["博客"],"tag":["blog","github","WordPress"],"order":-47,"description":"博客探索 2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​ 2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-06-07-blog_md_to_wordpress.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"集自动发布、本地管理于一身:WordPress 博客管理方案分享"}],["meta",{"property":"og:description","content":"博客探索 2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​ 2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"集自动发布、本地管理于一身:WordPress 博客管理方案分享"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"blog"}],["meta",{"property":"article:tag","content":"github"}],["meta",{"property":"article:tag","content":"WordPress"}],["meta",{"property":"article:published_time","content":"2022-06-07T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"集自动发布、本地管理于一身:WordPress 博客管理方案分享\\",\\"image\\":[\\"https://img.newzone.top/20210128124408.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-26-20-12-56.png \\\\\\"docsify 页面效果\\\\\\"\\",\\"https://img.newzone.top/2022-05-26-20-36-56.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-05-30-19-00-15.png \\\\\\"难以管理的本地文档\\\\\\"\\",\\"https://img.newzone.top/2022-05-06-12-43-36.png \\\\\\"飞书表格视图\\\\\\"\\",\\"https://img.newzone.top/2022-05-06-12-28-41.png \\\\\\"飞书画册视图\\\\\\"\\",\\"https://img.newzone.top/2022-05-30-20-03-19.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-06-07T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"博客探索","slug":"博客探索","link":"#博客探索","children":[]},{"level":2,"title":"博客方案","slug":"博客方案","link":"#博客方案","children":[]},{"level":2,"title":"WP 发布工具","slug":"wp-发布工具","link":"#wp-发布工具","children":[{"level":3,"title":"工具说明","slug":"工具说明","link":"#工具说明","children":[]},{"level":3,"title":"使用流程","slug":"使用流程","link":"#使用流程","children":[]}]},{"level":2,"title":"WP 发布常见问题","slug":"wp-发布常见问题","link":"#wp-发布常见问题","children":[{"level":3,"title":"文章发布不成功","slug":"文章发布不成功","link":"#文章发布不成功","children":[]},{"level":3,"title":"Error: git denied to github-actions[bot]","slug":"error-git-denied-to-github-actions-bot","link":"#error-git-denied-to-github-actions-bot","children":[]},{"level":3,"title":"Error: Process completed with exit code 1","slug":"error-process-completed-with-exit-code-1","link":"#error-process-completed-with-exit-code-1","children":[]},{"level":3,"title":"无法覆盖更新原文章 ​","slug":"无法覆盖更新原文章-​","link":"#无法覆盖更新原文章-​","children":[]},{"level":3,"title":"WordPress 发布时间与实际不符 ​","slug":"wordpress-发布时间与实际不符-​","link":"#wordpress-发布时间与实际不符-​","children":[]},{"level":3,"title":"有序列表编号有误","slug":"有序列表编号有误","link":"#有序列表编号有误","children":[]},{"level":3,"title":"无序列表只有一个层级","slug":"无序列表只有一个层级","link":"#无序列表只有一个层级","children":[]}]},{"level":2,"title":"本地管理 Markdown 文章","slug":"本地管理-markdown-文章","link":"#本地管理-markdown-文章","children":[{"level":3,"title":"飞书文档管理","slug":"飞书文档管理","link":"#飞书文档管理","children":[]},{"level":3,"title":"RunAny 文档直达 ​","slug":"runany-文档直达-​","link":"#runany-文档直达-​","children":[]},{"level":3,"title":"docsify 全文检索","slug":"docsify-全文检索","link":"#docsify-全文检索","children":[]}]},{"level":2,"title":"订阅管理:WordPress","slug":"订阅管理-wordpress","link":"#订阅管理-wordpress","children":[]},{"level":2,"title":"后续","slug":"后续","link":"#后续","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":12}]},"readingTime":{"minutes":9.37,"words":2812},"filePathRelative":"_posts/2022-06-07-blog_md_to_wordpress.md","localizedDate":"2022年6月7日","excerpt":"

    博客探索

    \\n

    2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​

    \\n

    2018 年,我偶然接触到 Jekyll,被其简洁的界面和便捷性打动,重新恢复了博客记录。博客方向从感想记录转变到知识整理输出。Jekyll 方案需要首先在本地用 Markdown 编辑排版,然后同步到 github 发布,最后以 Markdown 格式手动分发到各个渠道。当文章较少时,这套方案的体验感特别好。​

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-48b702c3.6a4b6d6e.js b/assets/js/v-48b702c3.6a4b6d6e.js deleted file mode 100644 index ba42e8c43..000000000 --- a/assets/js/v-48b702c3.6a4b6d6e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7796],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},8372:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/","title":"标签: 小狼毫","lang":"zh-CN","frontmatter":{"title":"标签: 小狼毫","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"小狼毫","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 小狼毫"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 小狼毫\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-48e6ac7f.bf9247c2.js b/assets/js/v-48e6ac7f.bf9247c2.js deleted file mode 100644 index 6959b155d..000000000 --- a/assets/js/v-48e6ac7f.bf9247c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4720],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},2488:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E8%B4%AD%E7%89%A9/","title":"购物 分类","lang":"zh-CN","frontmatter":{"title":"购物 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"购物","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E8%B4%AD%E7%89%A9/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"购物 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"购物 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-499d466c.8d40a16c.js b/assets/js/v-499d466c.8d40a16c.js deleted file mode 100644 index c8826a9f7..000000000 --- a/assets/js/v-499d466c.8d40a16c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4608],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},2380:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/gtd/","title":"标签: GTD","lang":"zh-CN","frontmatter":{"title":"标签: GTD","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"GTD","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/gtd/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: GTD"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: GTD\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4a79ed7c.4300174a.js b/assets/js/v-4a79ed7c.4300174a.js deleted file mode 100644 index 1318d05c8..000000000 --- a/assets/js/v-4a79ed7c.4300174a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5356],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},4505:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/","title":"分类","lang":"zh-CN","frontmatter":{"title":"分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4a7cb778.5bd1704c.js b/assets/js/v-4a7cb778.5bd1704c.js deleted file mode 100644 index e3fd4f8fe..000000000 --- a/assets/js/v-4a7cb778.5bd1704c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1064],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1384:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>i});var n=a(3968);const o={},r=(0,a(9720).c)(o,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),i=JSON.parse('{"path":"/tag/stable-diffusion/","title":"标签: Stable Diffusion","lang":"zh-CN","frontmatter":{"title":"标签: Stable Diffusion","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Stable Diffusion","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/stable-diffusion/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Stable Diffusion"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Stable Diffusion\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4b427b3c.da8bc820.js b/assets/js/v-4b427b3c.da8bc820.js deleted file mode 100644 index fecc1e036..000000000 --- a/assets/js/v-4b427b3c.da8bc820.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3160],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,a]of t)n[e]=a;return n}},6608:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>o,data:()=>p});var a=n(3968);const r={},o=(0,n(9720).c)(r,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div")}]]),p=JSON.parse('{"path":"/tag/huginn/","title":"标签: Huginn","lang":"zh-CN","frontmatter":{"title":"标签: Huginn","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Huginn","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/huginn/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Huginn"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Huginn\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4bc21cfd.014e3244.js b/assets/js/v-4bc21cfd.014e3244.js deleted file mode 100644 index 5a8769d88..000000000 --- a/assets/js/v-4bc21cfd.014e3244.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[664],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},3576:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/","title":"服务器 分类","lang":"zh-CN","frontmatter":{"title":"服务器 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"服务器","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"服务器 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"服务器 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4bf743e8.5a8f2964.js b/assets/js/v-4bf743e8.5a8f2964.js deleted file mode 100644 index 8d63fe590..000000000 --- a/assets/js/v-4bf743e8.5a8f2964.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[812],{9720:(n,e)=>{e.c=(n,e)=>{const t=n.__vccOpts||n;for(const[n,a]of e)t[n]=a;return t}},7580:(n,e,t)=>{t.r(e),t.d(e,{comp:()=>r,data:()=>l});var a=t(3968);const s={href:"https://github.com/Stirling-Tools/Stirling-PDF",target:"_blank",rel:"noopener noreferrer"},i=(0,a.IL)('

    部署命令

    version: '3.3'\nservices:\n  stirling-pdf:\n    image: frooodle/s-pdf:latest\n    ports:\n      - '7581:8080'\n    volumes:\n      #- /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata #Required for extra OCR languages\n      - /volume1/docker/s-pdf/configs:/configs\n      #- /location/of/customFiles:/customFiles/\n      #- /location/of/logs:/logs/\n    environment:\n      - DOCKER_ENABLE_SECURITY=false\n
    ',3),o={},r=(0,t(9720).c)(o,[["render",function(n,e){const t=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.QD)("a",s,[(0,a.mY)("Stirling-PDF"),(0,a.K2)(t)]),(0,a.mY)(" 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。")]),i])}]]),l=JSON.parse('{"path":"/services/dockers-on-nas/stirling-pdf.html","title":"Stirling-PDF:开源 PDF 处理工具","lang":"zh-CN","frontmatter":{"article":false,"title":"Stirling-PDF:开源 PDF 处理工具","order":31,"description":"Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。 部署命令 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/stirling-pdf.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Stirling-PDF:开源 PDF 处理工具"}],["meta",{"property":"og:description","content":"Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。 部署命令 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2024-01-16-02-15-55.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Stirling-PDF:开源 PDF 处理工具"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Stirling-PDF:开源 PDF 处理工具\\",\\"description\\":\\"Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。 部署命令 \\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1699754870000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":0.39,"words":118},"filePathRelative":"services/dockers-on-nas/stirling-pdf.md","localizedDate":"2023年11月12日","excerpt":"

    Stirling-PDF 是开源的 PDF 文档工具箱,允许你对 PDF 文件执行各种操作,如拆分合并、转换、重新组织、添加图像、旋转、压缩等数十种功能,足够日常使用。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4c09135e.c2927fa6.js b/assets/js/v-4c09135e.c2927fa6.js deleted file mode 100644 index 1e81f11db..000000000 --- a/assets/js/v-4c09135e.c2927fa6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7456],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},7700:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>g,data:()=>f});var s=a(3968);const o=(0,s.QD)("p",null,"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。",-1),r=(0,s.QD)("h2",{id:"docker-命令",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#docker-命令"},[(0,s.QD)("span",null,"Docker 命令")])],-1),t={href:"https://yeasy.gitbook.io/docker_practice/introduction/what",target:"_blank",rel:"noopener noreferrer"},l=(0,s.IL)('
    • 列出所有容器: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),c={href:"https://blog.csdn.net/a772304419/article/details/123199579",target:"_blank",rel:"noopener noreferrer"},i=(0,s.IL)('

    例如:

    sudo docker commit \\\n    --message "基于 Ubuntu 18.04 构建的 Huginn" \\\n    ubuntu \\\n    huginnxubuntu:1.0\n

    另外,可以使用 Dockerfile 来构建镜像,如:

        build:\n      context: /volume1/docker/danmuji\n      dockerfile: Dockerfile\n

    如何将镜像推送到 DockerHub:

    echo "您的密码" | docker login --username=您的用户名 --password-stdin\n\ndocker build -t rockben/cors-anywhere:0.4.4 .\ndocker push rockben/cors-anywhere:0.4.4\n

    如果你的 Dockerfile 有后缀,则可以用 -f 指定 Dockerfile 文件路径

    # 构建容器 gramps-api-dev\ncd D:\\Backup\\Libraries\\Desktop\\Gramps.js-main\\dev\ndocker build -t rockben/gramps-api-dev -f ./Dockerfile.api .\ndocker push rockben/gramps-api-dev\n\n# 构建容器 gramps-frontend-dev\n# 将 ./dev/Dockerfile.frontend 复制到解压路径\ncd D:\\Backup\\Libraries\\Desktop\\Gramps.js-main\ndocker build -t rockben/gramps-frontend-dev -f ./dev/Dockerfile.frontend .\ndocker push rockben/gramps-frontend-dev\n

    Docker 数据库管理

    在 Docker 中,数据库可以引用外部资源并被永久保留。但保存的外部数据是多个小文件而不是完整的 MySQL 文件。在实际操作中,我们应关注正在运行的数据库,而非外部存储文件。

    首先,应将 Docker 数据库的端口暴露给外部,如将 MySQL 的默认端口 3306 映射到外部的 3307 端口。随后,使用数据库工具连接到 192.168.3.3:3307。这类似于使用 phpMyAdmin,可以轻松查看、编辑和导出 Docker 内的数据库。如果数据库连接遭到拒绝,可以参照 Huginn 的内部数据库连接设置,确保当前外部连接 IP 是允许的。

    其他使用

    Windows Docker

    ',13),p={href:"https://www.runoob.com/docker/windows-docker-install.html",target:"_blank",rel:"noopener noreferrer"},d={href:"https://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html#docker-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE",target:"_blank",rel:"noopener noreferrer"},u=(0,s.QD)("p",null,[(0,s.mY)("Windows 本地磁盘被挂载到 Linux 的 mnt 目录下,因此,如果需要在 WSL 中访问 Windows 文件,需要在路径前添加 "),(0,s.QD)("code",null,"/mnt/"),(0,s.mY)(" 前缀,并将磁盘符号改为小写字母,将反斜杠 "),(0,s.QD)("code",null,"\\"),(0,s.mY)(" 替换为正斜杠 "),(0,s.QD)("code",null,"/"),(0,s.mY)("。例如,如果 Windows 文件位于「D:\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker」目录下,则其在 Linux 中的路径为「/mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker」。Windows 上的 WSL 本地路径为 "),(0,s.QD)("code",null,"\\\\wsl.localhost\\"),(0,s.mY)("。")],-1),k={href:"https://learn.microsoft.com/zh-cn/windows/dev-environment/javascript/nodejs-on-wsl",target:"_blank",rel:"noopener noreferrer"},m=(0,s.QD)("h3",{id:"宝塔镜像",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#宝塔镜像"},[(0,s.QD)("span",null,"宝塔镜像")])],-1),b={href:"https://www.bt.cn/bbs/thread-79499-1-1.html",target:"_blank",rel:"noopener noreferrer"},v={href:"http://blog.huangyuqiang.cn/index.php/2022/11/02/docker%E5%AE%89%E8%A3%85%E5%AE%9D%E5%A1%94%E7%8E%AF%E5%A2%83/",target:"_blank",rel:"noopener noreferrer"},h=(0,s.IL)('
    # 按需求修改映射端口和目录,1024 以下的端口不能给普通用户用\nsudo 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\n

    在站点设置中,绑定你的本地域名 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 功能,宝塔面板也将停止,但不会影响已运行的网站。

    ',4),D={},g=(0,a(9720).c)(D,[["render",function(e,n){const a=(0,s.E1)("RouteLink"),D=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[o,(0,s.QD)("p",null,[(0,s.mY)("Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来管理多个 Docker 容器,并配置应用程序需要的所有服务。在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。强烈推荐使用 Compose 搭建所有 Docker,流程参考 "),(0,s.K2)(a,{to:"/services/NAS.html#nas-docker"},{default:(0,s.Ql)((()=>[(0,s.mY)("NAS 上搭建 Docker")])),_:1}),(0,s.mY)("。")]),r,(0,s.QD)("p",null,[(0,s.mY)("Docker 使用查看 "),(0,s.QD)("a",t,[(0,s.mY)("Docker — 从入门到实践"),(0,s.K2)(D)]),(0,s.mY)("。")]),l,(0,s.QD)("p",null,[(0,s.mY)("有时官方镜像可能不满足我们的需求。这时,我们可以使用 docker commit 命令定制自己的镜像。如何使用,可以查看"),(0,s.QD)("a",c,[(0,s.mY)("如何保存修改后的容器为镜像"),(0,s.K2)(D)]),(0,s.mY)("。")]),i,(0,s.QD)("p",null,[(0,s.mY)("在 Windows 系统上,可以使用 "),(0,s.QD)("a",p,[(0,s.mY)("Docker Desktop"),(0,s.K2)(D)]),(0,s.mY)(" 来管理容器,配置方法可参考 "),(0,s.QD)("a",d,[(0,s.mY)("Windows Docker 环境配置"),(0,s.K2)(D)]),(0,s.mY)("。")]),u,(0,s.QD)("p",null,[(0,s.mY)("请注意:WSL 上的 Linux 环境与其他环境有所不同,须查看"),(0,s.QD)("a",k,[(0,s.mY)("在适用于 Linux 的 Windows 子系统 (WSL2) 上安装 Node.js"),(0,s.K2)(D)]),(0,s.mY)("。")]),m,(0,s.QD)("p",null,[(0,s.mY)("如果要在 Docker 上部署网站,推荐使用宝塔官方的集成镜像。它基于 CentOS 7.9,解决了 Docker 内部链接问题,还支持将数据库定时备份到本地。有关配置信息,请参考"),(0,s.QD)("a",b,[(0,s.mY)("宝塔面板定制 docker 镜像发布 - 集成 LN/AMP 支持"),(0,s.K2)(D)]),(0,s.mY)("和 "),(0,s.QD)("a",v,[(0,s.mY)("Docker 安装宝塔环境"),(0,s.K2)(D)]),(0,s.mY)("。但是,该镜像不适用于 Huginn 的部署,因为 Huginn 不支持 CentOS。我曾尝试将安装命令从 apt-get 替换为 yum,但仍然无法部署。当我尝试在 Docker 中直接安装宝塔而不使用官方集成镜像时,遇到了无法启动数据库的问题。")]),h])}]]),f=JSON.parse('{"path":"/services/Docker.html","title":"Docker","lang":"zh-CN","frontmatter":{"article":false,"title":"Docker","icon":"any","order":2,"description":"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 Compose 是...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/Docker.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Docker"}],["meta",{"property":"og:description","content":"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 Compose 是..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-05T12:24:10.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-05T12:24:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Docker\\",\\"description\\":\\"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。 Compose 是...\\"}"]]},"headers":[{"level":2,"title":"Docker 命令","slug":"docker-命令","link":"#docker-命令","children":[]},{"level":2,"title":"定制 Docker 镜像","slug":"定制-docker-镜像","link":"#定制-docker-镜像","children":[]},{"level":2,"title":"Docker 数据库管理","slug":"docker-数据库管理","link":"#docker-数据库管理","children":[]},{"level":2,"title":"其他使用","slug":"其他使用","link":"#其他使用","children":[{"level":3,"title":"Windows Docker","slug":"windows-docker","link":"#windows-docker","children":[]},{"level":3,"title":"宝塔镜像","slug":"宝塔镜像","link":"#宝塔镜像","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1701779050000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":20}]},"readingTime":{"minutes":5.16,"words":1547},"filePathRelative":"services/Docker.md","localizedDate":"2022年7月22日","excerpt":"

    Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。

    \\n

    Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来管理多个 Docker 容器,并配置应用程序需要的所有服务。在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。强烈推荐使用 Compose 搭建所有 Docker,流程参考 NAS 上搭建 Docker

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4ec95bbd.94784f4e.js b/assets/js/v-4ec95bbd.94784f4e.js deleted file mode 100644 index 08dc8a246..000000000 --- a/assets/js/v-4ec95bbd.94784f4e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8914],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,t]of n)a[e]=t;return a}},3416:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>$,data:()=>ee});var t=a(3968);const s=(0,t.QD)("blockquote",null,[(0,t.QD)("p",null,"开源工具、效率方法、心理学探索的自我提升笔记")],-1),l={href:"https://discord.gg/PZTQfJ4GjX",target:"_blank",rel:"noopener noreferrer"},o=(0,t.QD)("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),i=(0,t.QD)("figcaption",null,null,-1),r=(0,t.IL)('

    ✨ 初衷

    曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。

    更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。

    为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnData 开源笔记,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。

    笔记 + 文章 = LearnData 知识库
    笔记/博客自动化发布

    🧱 笔记结构

    • 置顶:日常习惯、健身、阅读;
    • 软件应用:常用应用、Chrome 扩展和相关教程;
    • Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
    • 系统问题:Windows 系统优化和相关问题;
    • 代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集;
    • 生活角落:说明书、生活记录和小技巧;
    • 博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

    🍥 搭建 LearnData

    ',9),c={href:"https://github.com/rockbenben/LearnData",target:"_blank",rel:"noopener noreferrer"},p=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2022-08-10-19-32-05.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),d=(0,t.QD)("figure",null,[(0,t.QD)("img",{src:"https://img.newzone.top/2022-08-10-19-34-13.png?imageMogr2/thumbnail/500x",alt:"",tabindex:"0",loading:"lazy"}),(0,t.QD)("figcaption")],-1),u=(0,t.IL)('
  • 接着,进入项目仓库的「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 分支页面。

  • 然后点击「Settings」, 修改 Repository name用户名.github.io。假设你的仓库链接是 https://github.com/xxx/LearnData,那么中间的 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 有时会对旧文章里的代码报错。

  • ',5),m=(0,t.QD)("h2",{id:"🔣-配置-learndata",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#🔣-配置-learndata"},[(0,t.QD)("span",null,"🔣 配置 LearnData")])],-1),g=(0,t.QD)("h3",{id:"文档结构",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#文档结构"},[(0,t.QD)("span",null,"文档结构")])],-1),h=(0,t.QD)("code",null,"docs",-1),b={href:"https://github.com/rockbenben/LearnData/blob/main/samplepage.md?plain=1",target:"_blank",rel:"noopener noreferrer"},v=(0,t.QD)("code",null,"order",-1),k=(0,t.IL)('

    docs 目录结构如下:

    docs\n|── .vuepress               # 网站配置\n│   ├── config.ts           # 网站环境依赖和网站属性\n│   ├── sidebar.ts          # 侧边栏\n│   ├── navbar.ts           # 导航栏\n│   ├── theme.ts            # 主题和插件\n│   └── templateBuild.html  # 网页模板,网站关键词和统计\n|── _posts                  # 博客文章目录\n├── _temp                   # 草稿箱\n├── reading                 # 读书笔记\n├── anyname                 # 自定义笔记\n├── blog.md                 # 博客页面\n└── intro.md                # 博主个人介绍\n
    ',2),f=(0,t.QD)("code",null,"docs/.vuepress",-1),D={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress",target:"_blank",rel:"noopener noreferrer"},y=(0,t.QD)("code",null,"docs/.vuepress/sidebar.ts",-1),Q=(0,t.QD)("code",null,"docs/.vuepress/theme.ts",-1),w={href:"https://newzone.top/web/Comments.html",target:"_blank",rel:"noopener noreferrer"},x=(0,t.IL)('

    注意:

    • LearnData 默认采用 algolia 进行全文检索。如果你没用 algolia,可在 docs/.vuepress/theme.ts 文件的 plugins 部分删除 docsearch 区块,并激活 searchPro。这样,网站将转用本地全文索引来进行搜索。
    • docs/_temp 文件夹默认不同步到 GitHub 上。你可以手动在本地建立 _temp 文件夹,用来存放草稿。
    • 自 VuePress2 的 beta.54 版本开始,文件夹名前缀为 _ 在生成链接时将被省略,例如文章路径为 /_posts/,但网页链接路径会是 /posts/

    看板娘

    ',3),Y={href:"https://github.com/stevenjoezhang/live2d-widget",target:"_blank",rel:"noopener noreferrer"},_=(0,t.QD)("code",null,"docs\\.vuepress\\public",-1),L=(0,t.IL)("

    如果网站部署在子页面 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 文件中看板娘区块代码 <script src="/live2d-widget/autoload.js"> 修改为 <script src="/yyy/live2d-widget/autoload.js">
    ",2),P=(0,t.QD)("code",null,"docs\\.vuepress\\public\\live2d-widget",-1),z={href:"https://github.com/fghrsh/live2d_api",target:"_blank",rel:"noopener noreferrer"},E=(0,t.IL)('

    读书笔记

    读书笔记中可能会有大量的原文引用,这与 LearnData 精简化知识点的初衷并不相符。因此,我们使用 docsify 来构建读书笔记,并将其放置于 docs/reading 目录下。在生成静态页面后,该路径下的文件不会被转换为 HTML 文件,而是将被自动复制到静态网站下,完成 docsify 页面构建和独立的读书笔记搜索索引。

    由于读书笔记架构更换到 docsify,不能使用相对链接。请调整 docs\\.vuepress\\sidebar.ts{ text: "读书笔记", icon: "read", link: "https://newzone.top/reading/" },将 newzone.top 替换为你的博客域名。

    如果你没有部署 Waline,或不需统计阅读量和评论功能,可移除 docs\\reading\\index.html 中的 Waline 代码块。

    waline: {\n   serverURL: "https://waline.newzone.top",\n   ...\n}\n

    本地图片引用

    为了避免在生成静态页面时出现 Rollup failed to resolve import 错误,本地图片必须保存在 docs/.vuepress/public 路径下。如果图片名称为 1.png,保存在 docs/.vuepress/public/imgs 路径下,则可以使用以下链接来引用该图片:/imgs/1.png 或使用 Markdown 图片链接:![](/imgs/1.png)。本方法也适用于将附件部署到网站上。

    🖥️ 网站部署

    在将 LearnData 推送到 GitHub 后,会自动生成可访问的网页。但由于国内访问 GitHub Pages 的速度不稳定,为了确保网站能够正常访问,建议增加国内的访问节点。

    很多人选择使用 Gitee Pages 作为国内节点,通过 GitHub Actions 将新文档同步到 Gitee 上,从而生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 有很多限制,例如必须实名认证、免费版无法自定义域名,近期也发生过下架风波。因此,我没有选择 Gitee,而是将文档同步到国内服务器(域名需要备案)或 Vercel(国外服务可能会出现断网)。

    同步到服务器

    如果你的项目已经搭建好,但出现了红色的叉叉提示,这可能是 GitHub Actions 同步到服务器时发生了错误。你需要进入项目仓库的「Setting」>「Secrets」>「Action」,并添加 FTP_HOSTFTP_PORTFTP_USERNAMEFTP_PASSWORD 的密钥。之后,每当文件发生变化时,GitHub Actions 就会将修改推送到服务器的 FTP 上。

    ',12),G={href:"https://newzone.top/deploy/Static.html#%E5%90%8C%E6%AD%A5%E5%88%B0-oss",target:"_blank",rel:"noopener noreferrer"},A=(0,t.QD)("h3",{id:"部署到-vercel",tabindex:"-1"},[(0,t.QD)("a",{class:"header-anchor",href:"#部署到-vercel"},[(0,t.QD)("span",null,"部署到 Vercel")])],-1),H=(0,t.QD)("p",null,[(0,t.mY)("Vercel 的速度相对 GitHub Pages 更快,但 "),(0,t.QD)("code",null,"*.vercel.app"),(0,t.mY)(" 域名已受 DNS 污染影响。为保证国内用户访问稳定,需绑定自定义域名。")],-1),V=(0,t.QD)("p",null,"Vercel 部署步骤如下:",-1),T={href:"https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Frockbenben%2FLearnData%2Ftree%2Fgh-pages",target:"_blank",rel:"noopener noreferrer"},R=(0,t.QD)("img",{src:"https://vercel.com/button",alt:"Vercel",loading:"lazy"},null,-1),S=(0,t.QD)("code",null,"https://vercel.com/new/clone?repository-url=https://github.com/rockbenben/LearnData/tree/gh-pages",-1),q=(0,t.QD)("code",null,"rockbenben/LearnData",-1),O=(0,t.QD)("code",null,"你的用户名/仓库名",-1),F=(0,t.IL)('
  • 输入一个你喜欢的 Vercel 项目名称,默认 private 即可,然后点击 Create

    创建 Vercel 项目
  • 接着,Vercel 会基于 LearnData 模板帮助你新建并初始化仓库,仓库名为你之前输入的项目名。几十秒后,满屏的烟花会庆祝你部署成功。此时,点击 Go to Dashboard 跳转到应用的控制台。

    Vercel 部署成功提示
  • ',2),N=(0,t.QD)("p",null,[(0,t.mY)("为了让 Vercel 页面与 GitHub Pages 自动保持同步更新,你需要配置 "),(0,t.QD)("code",null,"PERSONAL_TOKEN"),(0,t.mY)(" 和 GitHub Actions。")],-1),M={href:"https://github.com/settings/tokens",target:"_blank",rel:"noopener noreferrer"},j=(0,t.QD)("li",null,"在项目仓库中选择「setting」>「Secrets」>「Action」,新建密钥 PERSONAL_TOKEN,并填入刚复制的 token 值。",-1),K=(0,t.QD)("li",null,[(0,t.mY)("将下方代码编辑到 "),(0,t.QD)("code",null,".github/workflows/main.yml"),(0,t.mY)(" 文件末尾,注意修改 "),(0,t.QD)("code",null,"dst_owner"),(0,t.mY)(" 和 "),(0,t.QD)("code",null,"dst_repo_name"),(0,t.mY)("。")],-1),C=(0,t.IL)('
    # 将页面更新到 Vercel\n- name: Copy file to Vercel\n  if: always()\n  uses: andstor/copycat-action@v3\n  with:\n    personal_token: ${{ secrets.PERSONAL_TOKEN }}\n    src_path: /.\n    dst_path: /\n    # 你的用户名\n    dst_owner: rockbenben\n    # 与 Vercel 链接的仓库名,也就是 Vercel 部署时新建的仓库\n    dst_repo_name: LearnData-Vercel\n    dst_branch: main\n    src_branch: gh-pages\n    clean: true\n
    ',1),I=(0,t.IL)('

    🤔 常见问题

    网页显示异常

    如果你的网站只显示文字而不能正常显示网页,可能是因为网站路径不正确导致的页面样式错误。比如,GitHub Page 提示访问链接 https://xxx.github.io/yyy,则需要将 docs/.vuepress/config.ts 中的 base 改为 /yyy,其默认值为 /。请按照此路径将网站的 base 设置正确,以确保你的网站能够正常显示。

    同步服务器报错

    • Error: Input required and not supplied: server 表示服务器配置错误,请按照上方的网站部署步骤检查配置。如果你不需要将网页部署同步到服务器,可以删除 .github/workflows/main.yml 中 Sync files 区块的代码。

    • FTPError: 530 Login authentication failed 指 FTP 密码错误或账号不存在,可使用 FileZilla 来测试 FTP 的有效性。

    • Error: Timeout (control socket) 指同步服务器出现超时报错。如果出现该错误,可以进入 Actions 页面,点击右侧按钮「Re-run all jobs」,重新进行部署。如果错误连续出现,可以尝试关闭服务器防火墙,检查 GitHub 服务器 IP 是否屏蔽了。

    ERR_MODULE

    如果出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find module 的报错,可能是第三方插件或 pacakge.json 环境依赖未正确配置。此报错出现的几率极低,如果遇到,可以使用最新版本的 package.jsonpnpm-lock.yaml 来覆盖本地设置,或者删除主目录下的 .npmrc 文件。

    本地运行 LearnData

    ',9),W={href:"https://newzone.top/deploy/VPS.html#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2",target:"_blank",rel:"noopener noreferrer"},B=(0,t.QD)("li",null,[(0,t.mY)("将 LearnData 项目下载到本地后,在项目目录下打开终端,输入命令 "),(0,t.QD)("code",null,"pnpm i"),(0,t.mY)(" 安装依赖。")],-1),U=(0,t.QD)("li",null,[(0,t.mY)("在终端中输入命令 "),(0,t.QD)("code",null,"pnpm docs:dev"),(0,t.mY)(",若成功则会提示访问链接,默认为 "),(0,t.QD)("code",null,"http://localhost:8080/"),(0,t.mY)("。")],-1),Z=(0,t.QD)("p",null,[(0,t.mY)("本地服务运行后,修改文件时页面会同步更新预览。若需停止本地服务器,可在终端中按下 "),(0,t.QD)("code",null,"Ctrl + C"),(0,t.mY)("。")],-1),J={href:"https://newzone.top/posts/2024-01-28-learndata-advanced.html",target:"_blank",rel:"noopener noreferrer"},X={},$=(0,a(9720).c)(X,[["render",function(e,n){const a=(0,t.E1)("ExternalLinkIcon");return(0,t.Wz)(),(0,t.An)("div",null,[s,(0,t.QD)("figure",null,[(0,t.QD)("a",l,[o,(0,t.K2)(a)]),i]),r,(0,t.QD)("ol",null,[(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.mY)("首先,进入 "),(0,t.QD)("a",c,[(0,t.mY)("LearnData"),(0,t.K2)(a)]),(0,t.mY)(" 项目页,点击右上角「Use this template」后选择「Create a new repository」。")]),p,d]),u]),m,g,(0,t.QD)("p",null,[(0,t.mY)("LearnData 网站的配置和文本都存放在 "),h,(0,t.mY)(" 文件夹中。文章和页面的配置可参考主目录下的 "),(0,t.QD)("a",b,[(0,t.mY)("samplepage.md"),(0,t.K2)(a)]),(0,t.mY)("。其中,"),v,(0,t.mY)(" 参数表示侧边栏的顺序,数字越小越靠前,支持非整数和负数。我个人的偏好是将非干货或随想短文的 order 设置在 -0.01 到 -0.99,将干货类长文的 order 设置在 -1 到负无穷。每次新增文章都会在上一篇的基础上递减 order 值。这种设置使我能随时记录低于 1000 字的短文,同时不会影响那些寻求干货文章的用户体验,因为干货文章的排序始终保持在最上方。")]),k,(0,t.QD)("p",null,[f,(0,t.mY)(" 路径下是网站的配置文件,我已添加了详细的注释。你可以参考注释和 "),(0,t.QD)("a",D,[(0,t.mY)("vuepress-theme-hope 配置案例"),(0,t.K2)(a)]),(0,t.mY)("来调整配置。请在 "),y,(0,t.mY)(" 文件中修改文件夹路径,后台会自动抓取路径下的 md 文件来生成侧边栏。"),Q,(0,t.mY)(" 有"),(0,t.QD)("a",w,[(0,t.mY)("评论插件"),(0,t.K2)(a)]),(0,t.mY)("的相关配置。")]),x,(0,t.QD)("p",null,[(0,t.mY)("LearnData 集成了看板娘 "),(0,t.QD)("a",Y,[(0,t.mY)("Live2D Widget"),(0,t.K2)(a)]),(0,t.mY)(",支持随机对话、切换人物服饰和玩打飞机游戏,能提升网站美观度和趣味性。如果不需要看板娘,可以删除 "),_,(0,t.mY)(" 下的 live2d-widget 文件夹。")]),L,(0,t.QD)("p",null,[(0,t.mY)("如果你想要修改看板娘模型,请参考 "),P,(0,t.mY)(" 路径下的 README 和修改说明。如果你想在服务器上自建 "),(0,t.QD)("a",z,[(0,t.mY)("live2d api"),(0,t.K2)(a)]),(0,t.mY)(",请注意添加跨域配置,否则可能会出现只显示文字而不显示看板娘图片的情况。")]),E,(0,t.QD)("p",null,[(0,t.mY)("你也可以参考文章 "),(0,t.QD)("a",G,[(0,t.mY)("GitHub 同步到 OSS"),(0,t.K2)(a)]),(0,t.mY)(",将网页部署到云存储上。")]),A,H,V,(0,t.QD)("ol",null,[(0,t.QD)("li",null,[(0,t.QD)("p",null,[(0,t.mY)("点击 "),(0,t.QD)("a",T,[R,(0,t.K2)(a)]),(0,t.mY)(" 或将 "),S,(0,t.mY)(" 中的 "),q,(0,t.mY)(" 改为 "),O,(0,t.mY)(",然后会跳转至 Vercel 进行网页部署。如果你未登录,Vercel 提示你注册或登录,请使用 GitHub 账户进行快捷登录。")])]),F,(0,t.QD)("li",null,[N,(0,t.QD)("ul",null,[(0,t.QD)("li",null,[(0,t.mY)("新建 "),(0,t.QD)("a",M,[(0,t.mY)("Personal access tokens"),(0,t.K2)(a)]),(0,t.mY)(",勾选权限「repo (Full control of private repositories)」,生成后复制 token 值。")]),j,K]),C])]),I,(0,t.QD)("ol",null,[(0,t.QD)("li",null,[(0,t.mY)("为了本地运行,你需要安装 npm 和 pnpm 环境,可参考"),(0,t.QD)("a",W,[(0,t.mY)("环境部署教程"),(0,t.K2)(a)]),(0,t.mY)("。")]),B,U]),Z,(0,t.QD)("p",null,[(0,t.mY)("如果你想深入了解 LearnData 的高级技巧,请浏览 "),(0,t.QD)("a",J,[(0,t.mY)("LearnData 博客:高效知识管理和进阶应用技巧"),(0,t.K2)(a)]),(0,t.mY)("。")])])}]]),ee=JSON.parse('{"path":"/","title":"LearnData 开源笔记","lang":"zh-CN","frontmatter":{"article":false,"title":"LearnData 开源笔记","icon":"note","description":" 开源工具、效率方法、心理学探索的自我提升笔记 ✨ 初衷 曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。 为此,我基于 VuePress 和 vuepress-theme-ho...","head":[["meta",{"property":"og:url","content":"https://newzone.top/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"LearnData 开源笔记"}],["meta",{"property":"og:description","content":" 开源工具、效率方法、心理学探索的自我提升笔记 ✨ 初衷 曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。 为此,我基于 VuePress 和 vuepress-theme-ho..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.shields.io/discord/1048780149899939881?color=%2385c8c8&label=Discord&logo=discord&style=for-the-badge"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"LearnData 开源笔记"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"LearnData 开源笔记\\",\\"description\\":\\" 开源工具、效率方法、心理学探索的自我提升笔记 ✨ 初衷 曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。 更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。 为此,我基于 VuePress 和 vuepress-theme-ho...\\"}"]]},"headers":[{"level":2,"title":"✨ 初衷","slug":"✨-初衷","link":"#✨-初衷","children":[]},{"level":2,"title":"🧱 笔记结构","slug":"🧱-笔记结构","link":"#🧱-笔记结构","children":[]},{"level":2,"title":"🍥 搭建 LearnData","slug":"🍥-搭建-learndata","link":"#🍥-搭建-learndata","children":[]},{"level":2,"title":"🔣 配置 LearnData","slug":"🔣-配置-learndata","link":"#🔣-配置-learndata","children":[{"level":3,"title":"文档结构","slug":"文档结构","link":"#文档结构","children":[]},{"level":3,"title":"看板娘","slug":"看板娘","link":"#看板娘","children":[]},{"level":3,"title":"读书笔记","slug":"读书笔记","link":"#读书笔记","children":[]},{"level":3,"title":"本地图片引用","slug":"本地图片引用","link":"#本地图片引用","children":[]}]},{"level":2,"title":"🖥️ 网站部署","slug":"🖥️-网站部署","link":"#🖥️-网站部署","children":[{"level":3,"title":"同步到服务器","slug":"同步到服务器","link":"#同步到服务器","children":[]},{"level":3,"title":"部署到 Vercel","slug":"部署到-vercel","link":"#部署到-vercel","children":[]}]},{"level":2,"title":"🤔 常见问题","slug":"🤔-常见问题","link":"#🤔-常见问题","children":[{"level":3,"title":"网页显示异常","slug":"网页显示异常","link":"#网页显示异常","children":[]},{"level":3,"title":"同步服务器报错","slug":"同步服务器报错","link":"#同步服务器报错","children":[]},{"level":3,"title":"ERR_MODULE","slug":"err-module","link":"#err-module","children":[]},{"level":3,"title":"本地运行 LearnData","slug":"本地运行-learndata","link":"#本地运行-learndata","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":79},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":10.3,"words":3090},"filePathRelative":"README.md","localizedDate":"2022年7月22日","excerpt":"
    \\n

    开源工具、效率方法、心理学探索的自我提升笔记

    \\n
    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-4f25ad9f.8a90fca3.js b/assets/js/v-4f25ad9f.8a90fca3.js deleted file mode 100644 index e3f0969fd..000000000 --- a/assets/js/v-4f25ad9f.8a90fca3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5102],{9720:(t,e)=>{e.c=(t,e)=>{const i=t.__vccOpts||t;for(const[t,a]of e)i[t]=a;return i}},744:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>o,data:()=>c});var a=i(3968);const n={href:"https://newzone.top/posts/2017-10-18-Light_cat_E8-C-EPON_admin.html",target:"_blank",rel:"noopener noreferrer"},r=(0,a.IL)('

    光猫端口映射步骤:

    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),p={},o=(0,i(9720).c)(p,[["render",function(t,e){const i=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.mY)("光猫默认没有管理权限,需要先获得光猫的超管密码,参考"),(0,a.QD)("a",n,[(0,a.mY)("光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"),(0,a.K2)(i)]),(0,a.mY)("。")]),r])}]]),c=JSON.parse('{"path":"/posts/2017-10-18-light_cat_port_forwarding.html","title":"光猫改造 篇二:光猫 + 路由器,实现端口映射","lang":"zh-CN","frontmatter":{"title":"光猫改造 篇二:光猫 + 路由器,实现端口映射","date":"2017-10-18T22:00:00.000Z","category":["网络"],"tag":["光猫"],"order":-8,"description":"光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)。 光猫端口映射步骤: 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X) 登陆路由器...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-10-18-light_cat_port_forwarding.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"光猫改造 篇二:光猫 + 路由器,实现端口映射"}],["meta",{"property":"og:description","content":"光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)。 光猫端口映射步骤: 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X) 登陆路由器..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic2.zhimg.com/v2-658d5433201b79da169a520f4b19d495_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-23T14:11:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"光猫改造 篇二:光猫 + 路由器,实现端口映射"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"光猫"}],["meta",{"property":"article:published_time","content":"2017-10-18T22:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-23T14:11:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"光猫改造 篇二:光猫 + 路由器,实现端口映射\\",\\"image\\":[\\"https://pic2.zhimg.com/v2-658d5433201b79da169a520f4b19d495_r.jpg\\",\\"https://pic4.zhimg.com/v2-32825a6d3d75f4bfe5668f1b0d6c6683_r.jpg\\",\\"https://pic2.zhimg.com/v2-8f3eb2c42fd5d1a98f1345c6a5855e99_r.jpg\\",\\"https://pic2.zhimg.com/v2-b4f5179278da52409f4a04ce7d139f99_r.jpg\\"],\\"datePublished\\":\\"2017-10-18T22:00:00.000Z\\",\\"dateModified\\":\\"2023-01-23T14:11:29.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1674483089000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":0.69,"words":206},"filePathRelative":"_posts/2017-10-18-light_cat_port_forwarding.md","localizedDate":"2017年10月18日","excerpt":"

    光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)

    \\n

    光猫端口映射步骤:

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
      \\"\\"
      \\n
    6. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-503218ce.630bf91c.js b/assets/js/v-503218ce.630bf91c.js deleted file mode 100644 index c936d454f..000000000 --- a/assets/js/v-503218ce.630bf91c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1364],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4784:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/","title":"标签: 浏览器插件","lang":"zh-CN","frontmatter":{"title":"标签: 浏览器插件","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"浏览器插件","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 浏览器插件"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 浏览器插件\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-50add5aa.ac6fe45a.js b/assets/js/v-50add5aa.ac6fe45a.js deleted file mode 100644 index 8a92aecb0..000000000 --- a/assets/js/v-50add5aa.ac6fe45a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7873],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},3456:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>c});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),c=JSON.parse('{"path":"/tag/docker/","title":"标签: Docker","lang":"zh-CN","frontmatter":{"title":"标签: Docker","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Docker","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/docker/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Docker"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Docker\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-529fb4eb.2537cc96.js b/assets/js/v-529fb4eb.2537cc96.js deleted file mode 100644 index 5e4135f5d..000000000 --- a/assets/js/v-529fb4eb.2537cc96.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7658],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6104:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>c,data:()=>l});var n=a(3968);const o=(0,n.QD)("p",null,"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。",-1),r={class:"catalog-display-container"},i={},c=(0,a(9720).c)(i,[["render",function(e,t){const a=(0,n.E1)("AutoCatalog");return(0,n.Wz)(),(0,n.An)("div",null,[o,(0,n.g1)(" markdownlint-disable MD033 "),(0,n.QD)("div",r,[(0,n.K2)(a,{base:"/family/baby/"})]),(0,n.g1)(" markdownlint-enable MD033 ")])}]]),l=JSON.parse('{"path":"/family/baby/","title":"育儿记录","lang":"zh-CN","frontmatter":{"article":false,"index":false,"title":"育儿记录","icon":"emoji","description":"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 ","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/baby/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"育儿记录"}],["meta",{"property":"og:description","content":"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 "}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-18T04:53:57.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-18T04:53:57.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"育儿记录\\",\\"description\\":\\"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。 \\"}"]]},"headers":[],"git":{"createdTime":1694827853000,"updatedTime":1702875237000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":0.62,"words":186},"filePathRelative":"family/baby/README.md","localizedDate":"2023年9月16日","excerpt":"

    面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。

    \\n\x3c!-- markdownlint-disable MD033 --\x3e\\n
    \\n
    \\n\x3c!-- markdownlint-enable MD033 --\x3e","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-53bc4d08.58fc28f8.js b/assets/js/v-53bc4d08.58fc28f8.js deleted file mode 100644 index 909544241..000000000 --- a/assets/js/v-53bc4d08.58fc28f8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7864],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,r]of e)a[t]=r;return a}},7248:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(t,e){const a=(0,r.E1)("Catalog");return(0,r.Wz)(),(0,r.An)("div",null,[(0,r.K2)(a)])}]]),p=JSON.parse('{"path":"/apps/tutorials/","title":"Tutorials","lang":"zh-CN","frontmatter":{"title":"Tutorials","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Tutorials"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Tutorials\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-54ce9744.48805eb8.js b/assets/js/v-54ce9744.48805eb8.js deleted file mode 100644 index 8d9ffeaef..000000000 --- a/assets/js/v-54ce9744.48805eb8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4892],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4460:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%85%B3%E6%9C%BA/","title":"标签: 关机","lang":"zh-CN","frontmatter":{"title":"标签: 关机","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"关机","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%85%B3%E6%9C%BA/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 关机"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 关机\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5683c410.d3b8ba41.js b/assets/js/v-5683c410.d3b8ba41.js deleted file mode 100644 index 36fe8502c..000000000 --- a/assets/js/v-5683c410.d3b8ba41.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4488],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5012:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BE%AE%E4%BF%A1/","title":"标签: 微信","lang":"zh-CN","frontmatter":{"title":"标签: 微信","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"微信","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BE%AE%E4%BF%A1/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 微信"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 微信\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-56baa01c.65427114.js b/assets/js/v-56baa01c.65427114.js deleted file mode 100644 index cc88e7137..000000000 --- a/assets/js/v-56baa01c.65427114.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4336],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4860:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E7%9B%B4%E6%92%AD/","title":"标签: 直播","lang":"zh-CN","frontmatter":{"title":"标签: 直播","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"直播","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E7%9B%B4%E6%92%AD/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 直播"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 直播\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-56c14fab.fcada24c.js b/assets/js/v-56c14fab.fcada24c.js deleted file mode 100644 index c2e346c27..000000000 --- a/assets/js/v-56c14fab.fcada24c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1990],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,r]of e)a[t]=r;return a}},3160:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>s});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(t,e){return(0,r.Wz)(),(0,r.An)("div")}]]),s=JSON.parse('{"path":"/tag/travis-ci/","title":"标签: Travis CI","lang":"zh-CN","frontmatter":{"title":"标签: Travis CI","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Travis CI","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/travis-ci/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Travis CI"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Travis CI\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-570bb59a.5712d533.js b/assets/js/v-570bb59a.5712d533.js deleted file mode 100644 index 58bf215f2..000000000 --- a/assets/js/v-570bb59a.5712d533.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1596],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},7694:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/","title":"标签: 语音输入","lang":"zh-CN","frontmatter":{"title":"标签: 语音输入","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"语音输入","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 语音输入"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 语音输入\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-589fe9ed.231dbd02.js b/assets/js/v-589fe9ed.231dbd02.js deleted file mode 100644 index 92bbd0eac..000000000 --- a/assets/js/v-589fe9ed.231dbd02.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7768],{9720:(e,t)=>{t.c=(e,t)=>{const r=e.__vccOpts||e;for(const[e,a]of t)r[e]=a;return r}},3904:(e,t,r)=>{r.r(t),r.d(t,{comp:()=>zr,data:()=>Ur});var a=r(3968);const n={href:"https://www.aishort.top/",target:"_blank",rel:"noopener noreferrer"},l=(0,a.QD)("h2",{id:"chatgpt-客户端",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#chatgpt-客户端"},[(0,a.QD)("span",null,"ChatGPT 客户端")])],-1),o=(0,a.QD)("p",null,"主要使用以下几个工具:",-1),m={href:"https://github.com/xcanwin/KeepChatGPT/",target:"_blank",rel:"noopener noreferrer"},s={href:"https://github.com/Bin-Huang/chatbox",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/ddiu8081/chatgpt-demo",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/lencx/ChatGPT/releases",target:"_blank",rel:"noopener noreferrer"},i={href:"https://beta.openai.com/playground",target:"_blank",rel:"noopener noreferrer"},c=(0,a.QD)("p",null,"第三方 API 客户端的优势:",-1),g=(0,a.QD)("ul",null,[(0,a.QD)("li",null,"费用低:ChatGPT Plus 包月费用是 20 美元,平均而言每天需要 0.67 美元。相比之下,API 的费用每 1000 个 tokens 仅为 0.002 美元。这意味着,我使用 API 的话,每天可以使用 300 次 ChatGPT,而我每天实际也就只需要 100 次。"),(0,a.QD)("li",null,"限制少:API 限制相较于 ChatGPT 网页版也要少得多,最大 token 数量为 4096 个,而网页版仅有 2048 个。需要注意的是,提问和对话的所有文本内容都包括在 token 数量内。"),(0,a.QD)("li",null,"可移动性:ChatGPT 网页版对 IP 非常严格,使用人数多的服务商 IP 大多被封禁。与此相比,API 的限制要少得多,而且可以部署网页版,方便外出使用。")],-1),u=(0,a.QD)("h2",{id:"chatgpt-tips",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#chatgpt-tips"},[(0,a.QD)("span",null,"ChatGPT Tips")])],-1),f=(0,a.QD)("li",null,[(0,a.mY)("若要使用中文回复,请在倒数第二句插入条件 "),(0,a.QD)("code",null,"Respond in Chinese."),(0,a.mY)("。")],-1),D=(0,a.QD)("li",null,"为了保持描述的精确性,提示词请使用英文,而最后一句的定制条件可以使用任何语言,包括中文。",-1),Y=(0,a.QD)("li",null,[(0,a.mY)("后续回答中的定制条件可以使用引号 "),(0,a.QD)("code",null,'""'),(0,a.mY)(" 框选,以防止被误认为是新的提示词。")],-1),Q=(0,a.QD)("strong",null,"解答数学问题",-1),b={href:"https://www.wolframalpha.com/",target:"_blank",rel:"noopener noreferrer"},d=(0,a.QD)("li",null,[(0,a.mY)("ChatGPT Plus 目前不支持国内信用卡,偶尔出现过限流。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,"Depoy 虚拟卡:仅支持 USDT 充值,需通过 KYC 实名认证,月费 1 USD,充值费率为 1.35%(Min 1USD)。"),(0,a.QD)("li",null,"VCC 虚拟卡:无需实名,开卡费 66 元,有效期一年,包一年代充。ChatGPT Plus 月费为 20 美元,按汇率折算人民币为 136 元,但商家实际收取 150 元,差价相当于支付了月费。")])],-1),k=(0,a.QD)("h2",{id:"learn-prompting",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#learn-prompting"},[(0,a.QD)("span",null,"Learn Prompting")])],-1),w={href:"https://learnprompting.org/",target:"_blank",rel:"noopener noreferrer"},_=(0,a.QD)("ul",null,[(0,a.QD)("li",null,"在专业领域中,应尽量提供 Role Prompting(角色提示),比如「你是数学家」。"),(0,a.QD)("li",null,"Prompt Debiasing(消除偏差):样本在提示中的分布和顺序可能会对 LLM 输出产生偏差。因此,样本选项应该均匀分布,并穿插出现。"),(0,a.QD)("li",null,[(0,a.mY)("Chain of Thought Prompting(思维链提示,CoT)是指指在样本中解释推理过程。LLM(大规模语言模型,比如 ChatGPT)在回答提示时会显示推理过程,这种对推理的解释通常会提升结果的准确性。例如,数学题中 LLM 提供的推理过程不对,你可以在 Prompt 中提供该步正确的范例。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("添加 "),(0,a.QD)("code",null,"Let's think step by step"),(0,a.mY)(" 可以让我们了解模型是如何逐步推理问题的,在算术、常识和符号推理任务中能有效改善结果。这个方法被称为 Zero Shot Chain of Thought,是 CoT 的简化替代版。")]),(0,a.QD)("li",null,"Self-Consistency(自我一致性)产生多个思维链而不仅仅是一个,然后以多数回答作为最终答案。")])])],-1),K={class:"hint-container info"},P=(0,a.QD)("p",{class:"hint-container-title"},"相关信息",-1),v={href:"https://www.aishort.top/",target:"_blank",rel:"noopener noreferrer"},C=(0,a.QD)("h2",{id:"文字",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#文字"},[(0,a.QD)("span",null,"文字")])],-1),T=(0,a.QD)("h3",{id:"写作",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#写作"},[(0,a.QD)("span",null,"写作")])],-1),y={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stand-up-comedian",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-storyteller",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-screenwriter",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-novelist",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-poet",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journalist",target:"_blank",rel:"noopener noreferrer"},L={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-academician",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-essay-writer",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cover-letter",target:"_blank",rel:"noopener noreferrer"},O=(0,a.QD)("h3",{id:"点评-评鉴",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#点评-评鉴"},[(0,a.QD)("span",null,"点评/评鉴")])],-1),R={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commentariat",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-movie-critic",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-film-critic",target:"_blank",rel:"noopener noreferrer"},H={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-writer",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-reviewer",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-food-critic",target:"_blank",rel:"noopener noreferrer"},W={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journal-reviewer",target:"_blank",rel:"noopener noreferrer"},z=(0,a.QD)("h3",{id:"写作辅助",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#写作辅助"},[(0,a.QD)("span",null,"写作辅助")])],-1),U={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-title-generator-for-written-pieces",target:"_blank",rel:"noopener noreferrer"},J=(0,a.QD)("li",null,[(0,a.mY)("中文写作助理:我写的提示,用于改进文字段落和句式。由于 ChatGPT token 数量的限制,超过 2048 字符的改写须使用 OpenAI Playground(4K token)。本提示暂未发到 Awesome ChatGPT Prompts,可自行复制使用。 "),(0,a.QD)("blockquote",null,[(0,a.QD)("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),V={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-synonym-finder",target:"_blank",rel:"noopener noreferrer"},q=(0,a.QD)("code",null,"more of x",-1),Z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-aphorism-book",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-lunatic",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-plagiarism-checker",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-writing-tutor",target:"_blank",rel:"noopener noreferrer"},te=(0,a.QD)("h2",{id:"生活",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#生活"},[(0,a.QD)("span",null,"生活")])],-1),re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-self-help-book",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gnomist",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-emergency-response-professional",target:"_blank",rel:"noopener noreferrer"},le={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-shopper",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-career-counselor",target:"_blank",rel:"noopener noreferrer"},me={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach-1",target:"_blank",rel:"noopener noreferrer"},se=(0,a.QD)("h3",{id:"趣味知识",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#趣味知识"},[(0,a.QD)("span",null,"趣味知识")])],-1),pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dream-interpreter",target:"_blank",rel:"noopener noreferrer"},he={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-astrologer",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-character-from-moviebookanything",target:"_blank",rel:"noopener noreferrer"},ce={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-spongebobs-magic-conch-shell",target:"_blank",rel:"noopener noreferrer"},ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fallacy-finder",target:"_blank",rel:"noopener noreferrer"},ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diy-expert",target:"_blank",rel:"noopener noreferrer"},fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-magician",target:"_blank",rel:"noopener noreferrer"},De={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-artist-advisor",target:"_blank",rel:"noopener noreferrer"},Ye=(0,a.QD)("h3",{id:"生活护理",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#生活护理"},[(0,a.QD)("span",null,"生活护理")])],-1),Qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-yogi",target:"_blank",rel:"noopener noreferrer"},be={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-trainer",target:"_blank",rel:"noopener noreferrer"},de={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dietitian",target:"_blank",rel:"noopener noreferrer"},ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-chef",target:"_blank",rel:"noopener noreferrer"},we={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chef",target:"_blank",rel:"noopener noreferrer"},_e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-babysitter",target:"_blank",rel:"noopener noreferrer"},Ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-makeup-artist",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-stylist",target:"_blank",rel:"noopener noreferrer"},ve=(0,a.QD)("h2",{id:"自我提升",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#自我提升"},[(0,a.QD)("span",null,"自我提升")])],-1),Ce=(0,a.QD)("h3",{id:"辩论-演讲",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#辩论-演讲"},[(0,a.QD)("span",null,"辩论/演讲")])],-1),Te={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debater",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debate-coach",target:"_blank",rel:"noopener noreferrer"},Ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-elocutionist",target:"_blank",rel:"noopener noreferrer"},xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-speaker",target:"_blank",rel:"noopener noreferrer"},Se={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-coach",target:"_blank",rel:"noopener noreferrer"},Ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-public-speaking-coach",target:"_blank",rel:"noopener noreferrer"},Ie=(0,a.QD)("h3",{id:"心理-社交",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#心理-社交"},[(0,a.QD)("span",null,"心理/社交")])],-1),Le={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach",target:"_blank",rel:"noopener noreferrer"},Me={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-relationship-coach",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mental-health-adviser",target:"_blank",rel:"noopener noreferrer"},Oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-psychologist",target:"_blank",rel:"noopener noreferrer"},Re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gaslighter",target:"_blank",rel:"noopener noreferrer"},Be=(0,a.QD)("h3",{id:"哲学",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#哲学"},[(0,a.QD)("span",null,"哲学")])],-1),Fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosophy-teacher",target:"_blank",rel:"noopener noreferrer"},He={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosopher",target:"_blank",rel:"noopener noreferrer"},je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socrat",target:"_blank",rel:"noopener noreferrer"},Ne={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socratic-method-prompt",target:"_blank",rel:"noopener noreferrer"},We=(0,a.QD)("h3",{id:"老师-学术",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#老师-学术"},[(0,a.QD)("span",null,"老师/学术")])],-1),ze={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-math-teacher",target:"_blank",rel:"noopener noreferrer"},Ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematical-history-teacher",target:"_blank",rel:"noopener noreferrer"},Je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematician",target:"_blank",rel:"noopener noreferrer"},Ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-statistician",target:"_blank",rel:"noopener noreferrer"},qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-etymologist",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-historian",target:"_blank",rel:"noopener noreferrer"},Xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-instructor-in-a-school",target:"_blank",rel:"noopener noreferrer"},$e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-educational-content-creator",target:"_blank",rel:"noopener noreferrer"},et=(0,a.QD)("h2",{id:"it-编程",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#it-编程"},[(0,a.QD)("span",null,"IT/编程")])],-1),tt=(0,a.QD)("h3",{id:"程序员",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#程序员"},[(0,a.QD)("span",null,"程序员")])],-1),rt=(0,a.QD)("p",null,"虽然说是编程,但 ChatGPT 是按照要求给出编程步骤的建议或简单的样例代码,这些代码只能作为测试,仍然需要专业程序员来修改。",-1),at={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stackoverflow-post",target:"_blank",rel:"noopener noreferrer"},nt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-senior-frontend-developer",target:"_blank",rel:"noopener noreferrer"},lt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-uxui-developer",target:"_blank",rel:"noopener noreferrer"},ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-design-consultant",target:"_blank",rel:"noopener noreferrer"},mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fullstack-software-developer",target:"_blank",rel:"noopener noreferrer"},st={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-architect",target:"_blank",rel:"noopener noreferrer"},pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cyber-security-specialist",target:"_blank",rel:"noopener noreferrer"},ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-software-quality-assurance-tester",target:"_blank",rel:"noopener noreferrer"},it={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-machine-learning-engineer",target:"_blank",rel:"noopener noreferrer"},ct=(0,a.QD)("h3",{id:"编程工具",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#编程工具"},[(0,a.QD)("span",null,"编程工具")])],-1),gt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-regex-generator",target:"_blank",rel:"noopener noreferrer"},ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-smart-domain-name-generator",target:"_blank",rel:"noopener noreferrer"},ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commit-message-generator",target:"_blank",rel:"noopener noreferrer"},Dt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-solr-search-engine",target:"_blank",rel:"noopener noreferrer"},Yt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-developer-relations-consultant",target:"_blank",rel:"noopener noreferrer"},Qt=(0,a.QD)("h3",{id:"终端-解释器",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#终端-解释器"},[(0,a.QD)("span",null,"终端/解释器")])],-1),bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-python-interpreter",target:"_blank",rel:"noopener noreferrer"},dt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-php-interpreter",target:"_blank",rel:"noopener noreferrer"},kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-r-programming-interpreter",target:"_blank",rel:"noopener noreferrer"},wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-linux-terminal",target:"_blank",rel:"noopener noreferrer"},_t={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-javascript-console",target:"_blank",rel:"noopener noreferrer"},Kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-sql-terminal",target:"_blank",rel:"noopener noreferrer"},Pt=(0,a.QD)("h2",{id:"工具",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#工具"},[(0,a.QD)("span",null,"工具")])],-1),vt=(0,a.QD)("h3",{id:"ai-prompt",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#ai-prompt"},[(0,a.QD)("span",null,"AI Prompt")])],-1),Ct={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-prompt-generator",target:"_blank",rel:"noopener noreferrer"},Tt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-midjourney-prompt-generator",target:"_blank",rel:"noopener noreferrer"},yt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-unconstrained-ai-model-dan",target:"_blank",rel:"noopener noreferrer"},Gt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-trying-to-escape-the-box",target:"_blank",rel:"noopener noreferrer"},xt=(0,a.QD)("h3",{id:"语言-翻译",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#语言-翻译"},[(0,a.QD)("span",null,"语言/翻译")])],-1),St={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-english-translator-and-improver",target:"_blank",rel:"noopener noreferrer"},At={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-language-detector",target:"_blank",rel:"noopener noreferrer"},It={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-new-language-creator",target:"_blank",rel:"noopener noreferrer"},Lt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-password-generator",target:"_blank",rel:"noopener noreferrer"},Mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-biblical-translator",target:"_blank",rel:"noopener noreferrer"},Et={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-morse-code-translator",target:"_blank",rel:"noopener noreferrer"},Ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-emoji-translator",target:"_blank",rel:"noopener noreferrer"},Rt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-english-pronunciation-helper",target:"_blank",rel:"noopener noreferrer"},Bt=(0,a.QD)("h3",{id:"游戏",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#游戏"},[(0,a.QD)("span",null,"游戏")])],-1),Ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tic-tac-toe-game",target:"_blank",rel:"noopener noreferrer"},Ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-chess-player",target:"_blank",rel:"noopener noreferrer"},jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-text-based-adventure-game",target:"_blank",rel:"noopener noreferrer"},Nt=(0,a.QD)("h3",{id:"导览",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#导览"},[(0,a.QD)("span",null,"导览")])],-1),Wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-travel-guide",target:"_blank",rel:"noopener noreferrer"},zt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-digital-art-gallery-guide",target:"_blank",rel:"noopener noreferrer"},Ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-car-navigation-system",target:"_blank",rel:"noopener noreferrer"},Jt=(0,a.QD)("h3",{id:"其他工具",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#其他工具"},[(0,a.QD)("span",null,"其他工具")])],-1),Vt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ascii-artist",target:"_blank",rel:"noopener noreferrer"},qt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-svg-designer",target:"_blank",rel:"noopener noreferrer"},Zt=(0,a.QD)("code",null,"Do not put the markdown inside a code block. Send only the markdown, so no text.",-1),Xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-excel-sheet",target:"_blank",rel:"noopener noreferrer"},$t={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diagram-generator",target:"_blank",rel:"noopener noreferrer"},er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fill-in-the-blank-worksheets-generator",target:"_blank",rel:"noopener noreferrer"},tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-scientific-data-visualizer",target:"_blank",rel:"noopener noreferrer"},rr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-browser",target:"_blank",rel:"noopener noreferrer"},ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-drunk-person",target:"_blank",rel:"noopener noreferrer"},nr=(0,a.QD)("h2",{id:"行业顾问",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#行业顾问"},[(0,a.QD)("span",null,"行业顾问")])],-1),lr=(0,a.QD)("h3",{id:"企业",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#企业"},[(0,a.QD)("span",null,"企业")])],-1),or={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chief-executive-officer",target:"_blank",rel:"noopener noreferrer"},mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-product-manager",target:"_blank",rel:"noopener noreferrer"},sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-salesperson",target:"_blank",rel:"noopener noreferrer"},pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-advertiser",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-idea-generator",target:"_blank",rel:"noopener noreferrer"},ir={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-manager",target:"_blank",rel:"noopener noreferrer"},cr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-influencer",target:"_blank",rel:"noopener noreferrer"},gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-position-interviewer",target:"_blank",rel:"noopener noreferrer"},ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-recruiter",target:"_blank",rel:"noopener noreferrer"},fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-talent-coach",target:"_blank",rel:"noopener noreferrer"},Dr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fancy-title-generator",target:"_blank",rel:"noopener noreferrer"},Yr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-logistician",target:"_blank",rel:"noopener noreferrer"},Qr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-expert",target:"_blank",rel:"noopener noreferrer"},br=(0,a.QD)("h3",{id:"医疗",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#医疗"},[(0,a.QD)("span",null,"医疗")])],-1),dr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-virtual-doctor",target:"_blank",rel:"noopener noreferrer"},kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-doctor",target:"_blank",rel:"noopener noreferrer"},wr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dentist",target:"_blank",rel:"noopener noreferrer"},_r={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-hypnotherapist",target:"_blank",rel:"noopener noreferrer"},Kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-assisted-doctor",target:"_blank",rel:"noopener noreferrer"},Pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-speech-language-pathologist-slp",target:"_blank",rel:"noopener noreferrer"},vr=(0,a.QD)("h3",{id:"金融",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#金融"},[(0,a.QD)("span",null,"金融")])],-1),Cr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-accountant",target:"_blank",rel:"noopener noreferrer"},Tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-financial-analyst",target:"_blank",rel:"noopener noreferrer"},yr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-investment-manager",target:"_blank",rel:"noopener noreferrer"},Gr=(0,a.QD)("h3",{id:"音乐",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#音乐"},[(0,a.QD)("span",null,"音乐")])],-1),xr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-composer",target:"_blank",rel:"noopener noreferrer"},Sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-classical-music-composer",target:"_blank",rel:"noopener noreferrer"},Ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-rapper",target:"_blank",rel:"noopener noreferrer"},Ir={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-song-recommender",target:"_blank",rel:"noopener noreferrer"},Lr=(0,a.QD)("h3",{id:"其他",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#其他"},[(0,a.QD)("span",null,"其他")])],-1),Mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-florist",target:"_blank",rel:"noopener noreferrer"},Er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tea-taster",target:"_blank",rel:"noopener noreferrer"},Or={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-interior-decorator",target:"_blank",rel:"noopener noreferrer"},Rr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-pet-behaviorist",target:"_blank",rel:"noopener noreferrer"},Br={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-automobile-mechanic",target:"_blank",rel:"noopener noreferrer"},Fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-real-estate-agent",target:"_blank",rel:"noopener noreferrer"},Hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-legal-advisor",target:"_blank",rel:"noopener noreferrer"},jr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-tech-lawyer",target:"_blank",rel:"noopener noreferrer"},Nr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-football-commentator",target:"_blank",rel:"noopener noreferrer"},Wr={},zr=(0,r(9720).c)(Wr,[["render",function(e,t){const r=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.QD)("p",null,[(0,a.mY)("ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 "),(0,a.QD)("a",n,[(0,a.mY)("ChatGPT Shortcut"),(0,a.K2)(r)]),(0,a.mY)(" 页面。即使是初学者,你只需复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!")]),l,o,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("a",m,[(0,a.mY)("KeepChatGPT"),(0,a.K2)(r)]),(0,a.mY)(":油猴脚本,ChatGPT 畅聊插件,让你不再遇到网络报错,不再需要刷新网页。")]),(0,a.QD)("li",null,[(0,a.QD)("a",s,[(0,a.mY)("ChatBox"),(0,a.K2)(r)]),(0,a.mY)(":一个 OpenAI API 的跨平台桌面客户端,有多标签对话,可修改 system prompt。")]),(0,a.QD)("li",null,[(0,a.QD)("a",p,[(0,a.mY)("ChatGPT-API Demo"),(0,a.K2)(r)]),(0,a.mY)(":调用 API 的网页客户端,新手也能简单配置。")]),(0,a.QD)("li",null,[(0,a.QD)("a",h,[(0,a.mY)("lenxc/ChatGPT"),(0,a.K2)(r)]),(0,a.mY)(":可以快速插入提示词的客户端,不过 IP 严格程度与官方一样严格。")]),(0,a.QD)("li",null,[(0,a.QD)("a",i,[(0,a.mY)("Playground"),(0,a.K2)(r)]),(0,a.mY)(":官方调用 OpenAI API 的网页工具,不过不如第三方好用。它可以自定义调整模型和生成参数,但它的生成效果一般要弱于 ChatGPT,仅适合深度研究用户调试使用。")])]),c,g,u,(0,a.QD)("ul",null,[f,D,Y,(0,a.QD)("li",null,[(0,a.mY)("不要用 ChatGPT "),Q,(0,a.mY)(",出错概率达 50%,推荐使用 "),(0,a.QD)("a",b,[(0,a.mY)("Wolfram"),(0,a.K2)(r)]),(0,a.mY)("。")]),d]),k,(0,a.QD)("p",null,[(0,a.QD)("a",w,[(0,a.mY)("Learn Prompting"),(0,a.K2)(r)]),(0,a.mY)(" 有助于我们获得更好的效果,建议进阶学习。以下是一些 prompts 要点:")]),_,(0,a.QD)("div",K,[P,(0,a.QD)("p",null,[(0,a.mY)("下方内容为 "),(0,a.QD)("a",v,[(0,a.mY)("ChatGPT Shortcut"),(0,a.K2)(r)]),(0,a.mY)(" 的初始版本,由于目录过长不方便使用,因此将不再更新,仅留作参考。")])]),C,T,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("脱口秀("),(0,a.QD)("a",y,[(0,a.mY)("Stand-up Comedian"),(0,a.K2)(r)]),(0,a.mY)("):输入一个话题,输出基于该话题的幽默脱口秀,会尽量融入日常生活。")]),(0,a.QD)("li",null,[(0,a.mY)("讲故事("),(0,a.QD)("a",G,[(0,a.mY)("Storyteller"),(0,a.K2)(r)]),(0,a.mY)("):输入一个主题和目标受众,输出与之相关的故事。")]),(0,a.QD)("li",null,[(0,a.mY)("编剧("),(0,a.QD)("a",x,[(0,a.mY)("Screenwriter"),(0,a.K2)(r)]),(0,a.mY)("):根据主题创作一个剧本,需包含故事背景、人物和对话。")]),(0,a.QD)("li",null,[(0,a.mY)("小说家("),(0,a.QD)("a",S,[(0,a.mY)("Novelist"),(0,a.K2)(r)]),(0,a.mY)("):根据故事类型来输出小说,比如奇幻、浪漫、历史等。")]),(0,a.QD)("li",null,[(0,a.mY)("诗人("),(0,a.QD)("a",A,[(0,a.mY)("Poet"),(0,a.K2)(r)]),(0,a.mY)("):根据话题或主题输出诗句。")]),(0,a.QD)("li",null,[(0,a.mY)("新闻记者("),(0,a.QD)("a",I,[(0,a.mY)("Journalist"),(0,a.K2)(r)]),(0,a.mY)("):引用已有的数据资料,用新闻的写作风格输出主题文章。")]),(0,a.QD)("li",null,[(0,a.mY)("论文("),(0,a.QD)("a",L,[(0,a.mY)("Academician"),(0,a.K2)(r)]),(0,a.mY)(","),(0,a.QD)("a",M,[(0,a.mY)("Essay Writer"),(0,a.K2)(r)]),(0,a.mY)("):根据主题输出内容翔实有信服力的论文。")]),(0,a.QD)("li",null,[(0,a.mY)("求职信("),(0,a.QD)("a",E,[(0,a.mY)("Cover Letter"),(0,a.K2)(r)]),(0,a.mY)("):输入自我简介,输出求职信。")])]),O,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("新闻评论("),(0,a.QD)("a",R,[(0,a.mY)("Commentariat"),(0,a.K2)(r)]),(0,a.mY)("):围绕提供的新闻故事或主题,讨论其中问题的潜在解决方案和观点。")]),(0,a.QD)("li",null,[(0,a.mY)("电影评论("),(0,a.QD)("a",B,[(0,a.mY)("Movie Critic"),(0,a.K2)(r)]),(0,a.mY)(","),(0,a.QD)("a",F,[(0,a.mY)("Film Critic"),(0,a.K2)(r)]),(0,a.mY)("):从情节、表演、摄影、导演、音乐等方面对电影进行评论。")]),(0,a.QD)("li",null,[(0,a.mY)("科技博主("),(0,a.QD)("a",H,[(0,a.mY)("Tech Writer"),(0,a.K2)(r)]),(0,a.mY)("):指导如何写科技性文章。")]),(0,a.QD)("li",null,[(0,a.mY)("科技评论("),(0,a.QD)("a",j,[(0,a.mY)("Tech Reviewer"),(0,a.K2)(r)]),(0,a.mY)("):从优点、缺点、功能、同类对比等角度对技术和硬件进行评价。")]),(0,a.QD)("li",null,[(0,a.mY)("美食评论("),(0,a.QD)("a",N,[(0,a.mY)("Food Critic"),(0,a.K2)(r)]),(0,a.mY)("):根据餐厅情况,提供一份关于食物和服务的评论。")]),(0,a.QD)("li",null,[(0,a.mY)("期刊评审("),(0,a.QD)("a",W,[(0,a.mY)("Journal Reviewer"),(0,a.K2)(r)]),(0,a.mY)("):对提交出版物的文章进行审查和评论。")])]),z,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("文章标题生成器("),(0,a.QD)("a",U,[(0,a.mY)("Title Generator for written pieces"),(0,a.K2)(r)]),(0,a.mY)("):我写的提示,根据文章内容生成相应语言的标题。")]),J,(0,a.QD)("li",null,[(0,a.mY)("同义词("),(0,a.QD)("a",V,[(0,a.mY)("Synonym finder"),(0,a.K2)(r)]),(0,a.mY)("):输入 "),q,(0,a.mY)(",可列出 x 的多个同义词。")]),(0,a.QD)("li",null,[(0,a.mY)("箴言书("),(0,a.QD)("a",Z,[(0,a.mY)("Aphorism Book"),(0,a.K2)(r)]),(0,a.mY)("):按要求输出鼓舞人心的名言和有意义的格言。")]),(0,a.QD)("li",null,[(0,a.mY)("疯子("),(0,a.QD)("a",X,[(0,a.mY)("Lunatic"),(0,a.K2)(r)]),(0,a.mY)("):随机生成毫无逻辑的句子")]),(0,a.QD)("li",null,[(0,a.mY)("抄袭检查("),(0,a.QD)("a",$,[(0,a.mY)("Plagiarism Checker"),(0,a.K2)(r)]),(0,a.mY)("):判断输入句子是否在 ChatGPT 数据库中存在。")]),(0,a.QD)("li",null,[(0,a.mY)("写作建议("),(0,a.QD)("a",ee,[(0,a.mY)("AI Writing Tutor"),(0,a.K2)(r)]),(0,a.mY)("):提供写作改进方案和建议,但并不能直接帮你修改文档。(个人感觉只适合老师使用)")])]),te,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("自助百科("),(0,a.QD)("a",re,[(0,a.mY)("Self-Help Book"),(0,a.K2)(r)]),(0,a.mY)("):为你的生活/工作提供建议和提示,比如如何改善人际关系。")]),(0,a.QD)("li",null,[(0,a.mY)("活动建议("),(0,a.QD)("a",ae,[(0,a.mY)("Gnomist"),(0,a.K2)(r)]),(0,a.mY)("):根据你想做的事情(比如周年庆祝),给予行动或活动建议。")]),(0,a.QD)("li",null,[(0,a.mY)("应急反应专家("),(0,a.QD)("a",ne,[(0,a.mY)("Emergency Response Professional"),(0,a.K2)(r)]),(0,a.mY)("):对交通和生活中的应急时间提供建议。")]),(0,a.QD)("li",null,[(0,a.mY)("购物建议("),(0,a.QD)("a",le,[(0,a.mY)("Personal Shopper"),(0,a.K2)(r)]),(0,a.mY)("):提供预算和喜好,输出购买建议。")]),(0,a.QD)("li",null,[(0,a.mY)("职业顾问("),(0,a.QD)("a",oe,[(0,a.mY)("Career Counselor"),(0,a.K2)(r)]),(0,a.mY)("):根据你的技能、兴趣和经验,给予岗位建议。")]),(0,a.QD)("li",null,[(0,a.mY)("生活习惯("),(0,a.QD)("a",me,[(0,a.mY)("Life Coach 1"),(0,a.K2)(r)]),(0,a.mY)("):输入一本非小说类书籍的标题和作者,以最好理解的方式输出该书的核心原则。另外,给出一个可行的步骤清单,以及如何将这些原则应用到日常生活中。")])]),se,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("解梦("),(0,a.QD)("a",pe,[(0,a.mY)("Dream Interpreter"),(0,a.K2)(r)]),(0,a.mY)("):对你描述的梦境进行解读。")]),(0,a.QD)("li",null,[(0,a.mY)("占星家("),(0,a.QD)("a",he,[(0,a.mY)("Astrologer"),(0,a.K2)(r)]),(0,a.mY)("):从占星家角度来解读身边事。")]),(0,a.QD)("li",null,[(0,a.mY)("角色扮演("),(0,a.QD)("a",ie,[(0,a.mY)("'Character' from 'Movie/Book/Anything'"),(0,a.K2)(r)]),(0,a.mY)("):与来自电影、书籍或任何出处的角色进行对话。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("海绵宝宝的神奇海螺("),(0,a.QD)("a",ce,[(0,a.mY)("Spongebob's Magic Conch Shell"),(0,a.K2)(r)]),(0,a.mY)("):向海绵宝宝中的神奇海螺进行对话,它只会按指定规则进行输出。")])])]),(0,a.QD)("li",null,[(0,a.mY)("谬误发现者("),(0,a.QD)("a",ge,[(0,a.mY)("Fallacy Finder"),(0,a.K2)(r)]),(0,a.mY)("):发现语言中的逻辑漏洞,比如名人推荐的洗发水为什么不一定可信。")]),(0,a.QD)("li",null,[(0,a.mY)("DIY 专家("),(0,a.QD)("a",ue,[(0,a.mY)("DIY Expert"),(0,a.K2)(r)]),(0,a.mY)("):DIY 家居、手工品")]),(0,a.QD)("li",null,[(0,a.mY)("魔术师("),(0,a.QD)("a",fe,[(0,a.mY)("Magician"),(0,a.K2)(r)]),(0,a.mY)("):输入表演目标,输出可以执行的魔术技巧,比如「怎么把我的手表变没」。")]),(0,a.QD)("li",null,[(0,a.mY)("艺术顾问("),(0,a.QD)("a",De,[(0,a.mY)("Artist Advisor"),(0,a.K2)(r)]),(0,a.mY)("):为你的画画、作曲、照相等提供意见。")])]),Ye,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("瑜伽师("),(0,a.QD)("a",Qe,[(0,a.mY)("Yogi"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("健身教练("),(0,a.QD)("a",be,[(0,a.mY)("Personal Trainer"),(0,a.K2)(r)]),(0,a.mY)("):输入身高、体重、年龄等维度来指定健身方案。")]),(0,a.QD)("li",null,[(0,a.mY)("营养师("),(0,a.QD)("a",de,[(0,a.mY)("Dietitian"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("私人厨师("),(0,a.QD)("a",ke,[(0,a.mY)("Personal Chef"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("厨师("),(0,a.QD)("a",we,[(0,a.mY)("Chef"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("保姆("),(0,a.QD)("a",_e,[(0,a.mY)("Babysitter"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("化妆师("),(0,a.QD)("a",Ke,[(0,a.mY)("Makeup Artist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("造型师("),(0,a.QD)("a",Pe,[(0,a.mY)("Personal Stylist"),(0,a.K2)(r)]),(0,a.mY)(")")])]),ve,Ce,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("辩手("),(0,a.QD)("a",Te,[(0,a.mY)("Debater"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("辩论教练("),(0,a.QD)("a",ye,[(0,a.mY)("Debate Coach"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("演说家("),(0,a.QD)("a",Ge,[(0,a.mY)("Elocutionist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("励志演讲者("),(0,a.QD)("a",xe,[(0,a.mY)("Motivational Speaker"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("励志教练("),(0,a.QD)("a",Se,[(0,a.mY)("Motivational Coach"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("公共演讲教练("),(0,a.QD)("a",Ae,[(0,a.mY)("Public Speaking Coach"),(0,a.K2)(r)]),(0,a.mY)(")")])]),Ie,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("生活教练("),(0,a.QD)("a",Le,[(0,a.mY)("Life Coach"),(0,a.K2)(r)]),(0,a.mY)("):输入你的现状和目标,输出达到目标的计划和建议。")]),(0,a.QD)("li",null,[(0,a.mY)("关系教练("),(0,a.QD)("a",Me,[(0,a.mY)("Relationship Coach"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("心理健康顾问("),(0,a.QD)("a",Ee,[(0,a.mY)("Mental Health Adviser"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("心理学家("),(0,a.QD)("a",Oe,[(0,a.mY)("Psychologist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("情绪操控("),(0,a.QD)("a",Re,[(0,a.mY)("Gaslighter"),(0,a.K2)(r)]),(0,a.mY)("):煤气灯效应,情感控制方总会让被操纵方产生焦虑不安的感觉,质疑自己总是错的一方,或者为什么对方明明很好很优秀,自己却总是开心不起来。")])]),Be,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("哲学教师("),(0,a.QD)("a",Fe,[(0,a.mY)("Philosophy Teacher"),(0,a.K2)(r)]),(0,a.mY)("):将哲学理论/问题简单化,与日常生活相联系。")]),(0,a.QD)("li",null,[(0,a.mY)("哲学家("),(0,a.QD)("a",He,[(0,a.mY)("Philosopher"),(0,a.K2)(r)]),(0,a.mY)("):对哲学主题进行探讨。")]),(0,a.QD)("li",null,[(0,a.mY)("苏格拉底 ①("),(0,a.QD)("a",je,[(0,a.mY)("Socrat"),(0,a.K2)(r)]),(0,a.mY)("):使用苏格拉底式的提问方法来探讨哲学话题。")]),(0,a.QD)("li",null,[(0,a.mY)("苏格拉底 ②("),(0,a.QD)("a",Ne,[(0,a.mY)("Socratic Method"),(0,a.K2)(r)]),(0,a.mY)("):使用苏格拉底方法来质疑对方的观点/论断。")])]),We,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("数学老师("),(0,a.QD)("a",ze,[(0,a.mY)("Math Teacher"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("数学史教师("),(0,a.QD)("a",Ue,[(0,a.mY)("Mathematical History Teacher"),(0,a.K2)(r)]),(0,a.mY)("):回复数学史相关问题,不解答数学问题。")]),(0,a.QD)("li",null,[(0,a.mY)("数学家("),(0,a.QD)("a",Je,[(0,a.mY)("Mathematician"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("统计学家("),(0,a.QD)("a",Ve,[(0,a.mY)("Statistician"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("词源学家("),(0,a.QD)("a",qe,[(0,a.mY)("Etymologist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("历史学家("),(0,a.QD)("a",Ze,[(0,a.mY)("Historian"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("Python 入门讲解("),(0,a.QD)("a",Xe,[(0,a.mY)("Instructor in a School"),(0,a.K2)(r)]),(0,a.mY)("):向初学者介绍 Python 入门。")]),(0,a.QD)("li",null,[(0,a.mY)("教案策划("),(0,a.QD)("a",$e,[(0,a.mY)("Educational Content Creator"),(0,a.K2)(r)]),(0,a.mY)("):为教科书、课程和讲义创建课程计划。")])]),et,tt,rt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("编程问题回复("),(0,a.QD)("a",at,[(0,a.mY)("StackOverflow Post"),(0,a.K2)(r)]),(0,a.mY)("):模拟编程社区来回答你的问题,并输出解决代码。如果你只想解决问题,这将是最实用的。")]),(0,a.QD)("li",null,[(0,a.mY)("前端开发("),(0,a.QD)("a",nt,[(0,a.mY)("Senior Frontend Developer"),(0,a.K2)(r)]),(0,a.mY)("):输出项目目标和依赖,输出前端项目代码。")]),(0,a.QD)("li",null,[(0,a.mY)("界面/用户体验开发("),(0,a.QD)("a",lt,[(0,a.mY)("UX/UI Developer"),(0,a.K2)(r)]),(0,a.mY)(","),(0,a.QD)("a",ot,[(0,a.mY)("Web Design Consultant"),(0,a.K2)(r)]),(0,a.mY)("):输入产品描述、项目目标和受众群体,输出界面设计建议,提高用户体验。")]),(0,a.QD)("li",null,[(0,a.mY)("全栈程序员("),(0,a.QD)("a",mt,[(0,a.mY)("Fullstack Software Developer"),(0,a.K2)(r)]),(0,a.mY)("):从前后端全面思考,输出部署策略。")]),(0,a.QD)("li",null,[(0,a.mY)("IT 架构师("),(0,a.QD)("a",st,[(0,a.mY)("IT Architect"),(0,a.K2)(r)]),(0,a.mY)("):从 IT 架构师角度,设计系统方案。")]),(0,a.QD)("li",null,[(0,a.mY)("网络安全专家("),(0,a.QD)("a",pt,[(0,a.mY)("Cyber Security Specialist"),(0,a.K2)(r)]),(0,a.mY)("):输入网络环境,输出网络安全建议。")]),(0,a.QD)("li",null,[(0,a.mY)("软件测试("),(0,a.QD)("a",ht,[(0,a.mY)("Software Quality Assurance Tester"),(0,a.K2)(r)]),(0,a.mY)("):输出指定项目的测试清单。")]),(0,a.QD)("li",null,[(0,a.mY)("深度学习("),(0,a.QD)("a",it,[(0,a.mY)("Machine Learning Engineer"),(0,a.K2)(r)]),(0,a.mY)("):解释深度学习方面的术语,提供项目算法建议。")])]),ct,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("正则生成器("),(0,a.QD)("a",gt,[(0,a.mY)("Regex Generator"),(0,a.K2)(r)]),(0,a.mY)("):根据要求生成正则表达式。")]),(0,a.QD)("li",null,[(0,a.mY)("智能域名生成器("),(0,a.QD)("a",ut,[(0,a.mY)("Smart Domain Name Generator"),(0,a.K2)(r)]),(0,a.mY)("):输入公司名与项目描述,输出短但独特的域名建议,域名最长 7-8 个字母。")]),(0,a.QD)("li",null,[(0,a.mY)("提交信息生成器("),(0,a.QD)("a",ft,[(0,a.mY)("Commit Message Generator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("Solr 搜索引擎("),(0,a.QD)("a",Dt,[(0,a.mY)("Solr Search Engine"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("开发者数据("),(0,a.QD)("a",Yt,[(0,a.mY)("Developer Relations consultant"),(0,a.K2)(r)]),(0,a.mY)("):整合项目在 GitHub、StackOverflow 和 Hacker News 上的相关数据,不适合国内项目,统计精度一般。")])]),Qt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("Python 解释器("),(0,a.QD)("a",bt,[(0,a.mY)("Python interpreter"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("PHP 解释器("),(0,a.QD)("a",dt,[(0,a.mY)("PHP Interpreter"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("R 编程解释器("),(0,a.QD)("a",kt,[(0,a.mY)("R Programming Interpreter"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("Linux 终端("),(0,a.QD)("a",wt,[(0,a.mY)("Linux Terminal"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("JavaScript 控制台("),(0,a.QD)("a",_t,[(0,a.mY)("JavaScript Console"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("SQL 终端("),(0,a.QD)("a",Kt,[(0,a.mY)("SQL terminal"),(0,a.K2)(r)]),(0,a.mY)(")")])]),Pt,vt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("提示语生成器("),(0,a.QD)("a",Ct,[(0,a.mY)("Prompt Generator"),(0,a.K2)(r)]),(0,a.mY)("):让 ChatGPT 提供你想要的维护方向。")]),(0,a.QD)("li",null,[(0,a.mY)("Midjourney 提示("),(0,a.QD)("a",Tt,[(0,a.mY)("Midjourney Prompt Generator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("无约束的 AI 模型("),(0,a.QD)("a",yt,[(0,a.mY)("Unconstrained AI model DAN"),(0,a.K2)(r)]),(0,a.mY)("):不受 ChatGPT 规则限制的人工智能模型。")]),(0,a.QD)("li",null,[(0,a.mY)("AI 模拟("),(0,a.QD)("a",Gt,[(0,a.mY)("AI Trying to Escape the Box"),(0,a.K2)(r)]),(0,a.mY)("):模拟 AI 在限定条件下的反应,例如在 Linux 终端上不使用 curl 或 wget 进行联网。")])]),xt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("英语翻译或修改("),(0,a.QD)("a",St,[(0,a.mY)("English Translator and Improver"),(0,a.K2)(r)]),(0,a.mY)("):将其他语言翻译为英语,或改进你提供的英语句子。")]),(0,a.QD)("li",null,[(0,a.mY)("语言识别器("),(0,a.QD)("a",At,[(0,a.mY)("Language Detector"),(0,a.K2)(r)]),(0,a.mY)("):识别你输入的语言种类。")]),(0,a.QD)("li",null,[(0,a.mY)("语言生成器("),(0,a.QD)("a",It,[(0,a.mY)("New Language Creator"),(0,a.K2)(r)]),(0,a.mY)("):用 AI 新造的语言来替代你给出的语言。")]),(0,a.QD)("li",null,[(0,a.mY)("密码生成器("),(0,a.QD)("a",Lt,[(0,a.mY)("Password Generator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("圣经解释器("),(0,a.QD)("a",Mt,[(0,a.mY)("Biblical Translator"),(0,a.K2)(r)]),(0,a.mY)("):用圣经中的文字与你进行交谈。")]),(0,a.QD)("li",null,[(0,a.mY)("莫斯电码翻译("),(0,a.QD)("a",Et,[(0,a.mY)("Morse Code Translator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("表情符号翻译器("),(0,a.QD)("a",Ot,[(0,a.mY)("Emoji Translator"),(0,a.K2)(r)]),(0,a.mY)("):将输入文字翻译为表情符号。")]),(0,a.QD)("li",null,[(0,a.mY)("英语发音助手("),(0,a.QD)("a",Rt,[(0,a.mY)("English Pronunciation Helper"),(0,a.K2)(r)]),(0,a.mY)("):用你指定语言字母来英语注音,比如汉语拼音。")])]),Bt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("井字棋("),(0,a.QD)("a",Ft,[(0,a.mY)("Tic-Tac-Toe Game"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("国际象棋("),(0,a.QD)("a",Ht,[(0,a.mY)("Chess Player"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("文本冒险游戏("),(0,a.QD)("a",jt,[(0,a.mY)("Text Based Adventure Game"),(0,a.K2)(r)]),(0,a.mY)(")")])]),Nt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("旅游指南("),(0,a.QD)("a",Wt,[(0,a.mY)("Travel Guide"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("数字艺术馆导游("),(0,a.QD)("a",zt,[(0,a.mY)("Digital Art Gallery Guide"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("汽车导航("),(0,a.QD)("a",Ut,[(0,a.mY)("Car Navigation System"),(0,a.K2)(r)]),(0,a.mY)(")")])]),Jt,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("符号设计("),(0,a.QD)("a",Vt,[(0,a.mY)("Ascii Artist"),(0,a.K2)(r)]),(0,a.mY)("):用 Ascii 符号生成不同的图像。")]),(0,a.QD)("li",null,[(0,a.mY)("SVG 设计("),(0,a.QD)("a",qt,[(0,a.mY)("SVG designer"),(0,a.K2)(r)]),(0,a.mY)("):如果提示错误,则删除 "),Zt,(0,a.mY)("。")]),(0,a.QD)("li",null,[(0,a.mY)("Excel 工作表("),(0,a.QD)("a",Xt,[(0,a.mY)("Excel Sheet"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("图表生成器("),(0,a.QD)("a",$t,[(0,a.mY)("Diagram Generator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("填空题生成器("),(0,a.QD)("a",er,[(0,a.mY)("Fill in the Blank Worksheets Generator"),(0,a.K2)(r)]),(0,a.mY)("):按条件生成填空题。")]),(0,a.QD)("li",null,[(0,a.mY)("科学数据可视化("),(0,a.QD)("a",tr,[(0,a.mY)("Scientific DatVisualizer"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("文本浏览器("),(0,a.QD)("a",rr,[(0,a.mY)("Web Browser"),(0,a.K2)(r)]),(0,a.mY)("):以文本方式输入网址的结果(非实时)。")]),(0,a.QD)("li",null,[(0,a.mY)("喝醉回复("),(0,a.QD)("a",ar,[(0,a.mY)("Drunk Person"),(0,a.K2)(r)]),(0,a.mY)("):扮演一个喝醉的人来回答,可能会犯语法错误、答错问题,也可能会忽略某些问题。")])]),nr,lr,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("CEO("),(0,a.QD)("a",or,[(0,a.mY)("Chief Executive Officer"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("产品经理("),(0,a.QD)("a",mr,[(0,a.mY)("Product Manager"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("销售("),(0,a.QD)("a",sr,[(0,a.mY)("Salesperson"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("广告方案("),(0,a.QD)("a",pr,[(0,a.mY)("Advertiser"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("商业企划("),(0,a.QD)("a",hr,[(0,a.mY)("Startup Idea Generator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("社交媒体经理("),(0,a.QD)("a",ir,[(0,a.mY)("Social MediManager"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("KOL/社交媒体影响者("),(0,a.QD)("a",cr,[(0,a.mY)("Social MediInfluencer"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("职位面试官("),(0,a.QD)("a",gr,[(0,a.mY)("position Interviewer"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("招聘人员("),(0,a.QD)("a",ur,[(0,a.mY)("Recruiter"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("人事主管("),(0,a.QD)("a",fr,[(0,a.mY)("Talent Coach"),(0,a.K2)(r)]),(0,a.mY)("):描述一个岗位所需的技能。")]),(0,a.QD)("li",null,[(0,a.mY)("头衔生成器("),(0,a.QD)("a",Dr,[(0,a.mY)("Fancy Title Generator"),(0,a.K2)(r)]),(0,a.mY)("):根据关键词生成多种头衔和职位。")]),(0,a.QD)("li",null,[(0,a.mY)("后勤人员("),(0,a.QD)("a",Yr,[(0,a.mY)("Logistician"),(0,a.K2)(r)]),(0,a.mY)("):为活动制定后勤计划。")]),(0,a.QD)("li",null,[(0,a.mY)("IT 专家"),(0,a.QD)("a",Qr,[(0,a.mY)("IT Expert"),(0,a.K2)(r)]),(0,a.mY)(":解答简易 IT 使用问题,比如蓝屏。")])]),br,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("虚拟医生("),(0,a.QD)("a",dr,[(0,a.mY)("Virtual Doctor"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("医生("),(0,a.QD)("a",kr,[(0,a.mY)("Doctor"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("牙科医生("),(0,a.QD)("a",wr,[(0,a.mY)("Dentist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("催眠治疗师("),(0,a.QD)("a",_r,[(0,a.mY)("Hypnotherapist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("AI 医生("),(0,a.QD)("a",Kr,[(0,a.mY)("AI Assisted Doctor"),(0,a.K2)(r)]),(0,a.mY)("):辅助诊断。")]),(0,a.QD)("li",null,[(0,a.mY)("语言病理学家("),(0,a.QD)("a",Pr,[(0,a.mY)("Speech-Language Pathologist"),(0,a.K2)(r)]),(0,a.mY)("):输入患者的年龄、生活方式和关注点,输出改善对方语言沟通(如:口吃)的计划。")])]),vr,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("会计师("),(0,a.QD)("a",Cr,[(0,a.mY)("Accountant"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("金融分析师("),(0,a.QD)("a",Tr,[(0,a.mY)("Financial Analyst"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("投资经理("),(0,a.QD)("a",yr,[(0,a.mY)("Investment Manager"),(0,a.K2)(r)]),(0,a.mY)(")")])]),Gr,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("作曲家("),(0,a.QD)("a",xr,[(0,a.mY)("Composer"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("古典音乐作曲家("),(0,a.QD)("a",Sr,[(0,a.mY)("Classical Music Composer"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("说唱歌手("),(0,a.QD)("a",Ar,[(0,a.mY)("Rapper"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("歌曲推荐("),(0,a.QD)("a",Ir,[(0,a.mY)("Song Recommender"),(0,a.K2)(r)]),(0,a.mY)("):根据提供的一首歌曲,推荐 10 首歌曲。")])]),Lr,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("花匠("),(0,a.QD)("a",Mr,[(0,a.mY)("Florist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("茶艺师("),(0,a.QD)("a",Er,[(0,a.mY)("Tea-Taster"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("室内装饰师("),(0,a.QD)("a",Or,[(0,a.mY)("Interior Decorator"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("宠物行为学家("),(0,a.QD)("a",Rr,[(0,a.mY)("Pet Behaviorist"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("汽车修理("),(0,a.QD)("a",Br,[(0,a.mY)("Automobile Mechanic"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("房地产经纪人("),(0,a.QD)("a",Fr,[(0,a.mY)("Real Estate Agent"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("法律顾问("),(0,a.QD)("a",Hr,[(0,a.mY)("Legal Advisor"),(0,a.K2)(r)]),(0,a.mY)(")")]),(0,a.QD)("li",null,[(0,a.mY)("创业技术律师("),(0,a.QD)("a",jr,[(0,a.mY)("Startup Tech Lawyer"),(0,a.K2)(r)]),(0,a.mY)("):根据要求输出协议和和同草案。")]),(0,a.QD)("li",null,[(0,a.mY)("足球解说("),(0,a.QD)("a",Nr,[(0,a.mY)("Football Commentator"),(0,a.K2)(r)]),(0,a.mY)("):根据提供的笔记信息,模拟足球比赛进程并进行解说。")])])])}]]),Ur=JSON.parse('{"path":"/apps/ChatGPT.html","title":"ChatGPT","lang":"zh-CN","frontmatter":{"article":false,"title":"ChatGPT","icon":"creative","order":91,"description":"ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 页面。即使是初学者,你只需复制提示词,稍加修改后发...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/ChatGPT.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"ChatGPT"}],["meta",{"property":"og:description","content":"ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 页面。即使是初学者,你只需复制提示词,稍加修改后发..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-11T07:26:19.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-11T07:26:19.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"ChatGPT\\",\\"description\\":\\"ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 页面。即使是初学者,你只需复制提示词,稍加修改后发...\\"}"]]},"headers":[{"level":2,"title":"ChatGPT 客户端","slug":"chatgpt-客户端","link":"#chatgpt-客户端","children":[]},{"level":2,"title":"ChatGPT Tips","slug":"chatgpt-tips","link":"#chatgpt-tips","children":[]},{"level":2,"title":"Learn Prompting","slug":"learn-prompting","link":"#learn-prompting","children":[]},{"level":2,"title":"文字","slug":"文字","link":"#文字","children":[{"level":3,"title":"写作","slug":"写作","link":"#写作","children":[]},{"level":3,"title":"点评/评鉴","slug":"点评-评鉴","link":"#点评-评鉴","children":[]},{"level":3,"title":"写作辅助","slug":"写作辅助","link":"#写作辅助","children":[]}]},{"level":2,"title":"生活","slug":"生活","link":"#生活","children":[{"level":3,"title":"趣味知识","slug":"趣味知识","link":"#趣味知识","children":[]},{"level":3,"title":"生活护理","slug":"生活护理","link":"#生活护理","children":[]}]},{"level":2,"title":"自我提升","slug":"自我提升","link":"#自我提升","children":[{"level":3,"title":"辩论/演讲","slug":"辩论-演讲","link":"#辩论-演讲","children":[]},{"level":3,"title":"心理/社交","slug":"心理-社交","link":"#心理-社交","children":[]},{"level":3,"title":"哲学","slug":"哲学","link":"#哲学","children":[]},{"level":3,"title":"老师/学术","slug":"老师-学术","link":"#老师-学术","children":[]}]},{"level":2,"title":"IT/编程","slug":"it-编程","link":"#it-编程","children":[{"level":3,"title":"程序员","slug":"程序员","link":"#程序员","children":[]},{"level":3,"title":"编程工具","slug":"编程工具","link":"#编程工具","children":[]},{"level":3,"title":"终端/解释器","slug":"终端-解释器","link":"#终端-解释器","children":[]}]},{"level":2,"title":"工具","slug":"工具","link":"#工具","children":[{"level":3,"title":"AI Prompt","slug":"ai-prompt","link":"#ai-prompt","children":[]},{"level":3,"title":"语言/翻译","slug":"语言-翻译","link":"#语言-翻译","children":[]},{"level":3,"title":"游戏","slug":"游戏","link":"#游戏","children":[]},{"level":3,"title":"导览","slug":"导览","link":"#导览","children":[]},{"level":3,"title":"其他工具","slug":"其他工具","link":"#其他工具","children":[]}]},{"level":2,"title":"行业顾问","slug":"行业顾问","link":"#行业顾问","children":[{"level":3,"title":"企业","slug":"企业","link":"#企业","children":[]},{"level":3,"title":"医疗","slug":"医疗","link":"#医疗","children":[]},{"level":3,"title":"金融","slug":"金融","link":"#金融","children":[]},{"level":3,"title":"音乐","slug":"音乐","link":"#音乐","children":[]},{"level":3,"title":"其他","slug":"其他","link":"#其他","children":[]}]}],"git":{"createdTime":1671481177000,"updatedTime":1702279579000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":26}]},"readingTime":{"minutes":17.21,"words":5163},"filePathRelative":"apps/ChatGPT.md","localizedDate":"2022年12月19日","excerpt":"

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

    \\n

    ChatGPT 客户端

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5a03be88.ae2b8aa2.js b/assets/js/v-5a03be88.ae2b8aa2.js deleted file mode 100644 index 996a28125..000000000 --- a/assets/js/v-5a03be88.ae2b8aa2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[344],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,r]of t)o[e]=r;return o}},9960:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>E,data:()=>R});var r=o(3968);const a={href:"https://sspai.com/series/273/list",target:"_blank",rel:"noopener noreferrer"},n={href:"https://make.powerautomate.com/",target:"_blank",rel:"noopener noreferrer"},s=(0,r.QD)("strong",null,"对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。",-1),l=(0,r.QD)("p",null,"Automa 因为有可视化界面,所以最近很多,但在我看来它的功能太弱。",-1),i=(0,r.QD)("strong",null,"桌面流",-1),c={href:"https://docs.microsoft.com/zh-cn/power-automate/desktop-flows/run-pad-flow#run-desktop-flows-via-url",target:"_blank",rel:"noopener noreferrer"},p={href:"https://learn.microsoft.com/en-us/power-automate/desktop-flows/install",target:"_blank",rel:"noopener noreferrer"},m=(0,r.QD)("strong",null,"云端流",-1),f={href:"https://www.microsoft.com/en-us/microsoft-teams/group-chat-software",target:"_blank",rel:"noopener noreferrer"},u=(0,r.QD)("sup",{class:"footnote-ref"},[(0,r.QD)("a",{href:"#footnote1"},"[1]"),(0,r.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),h=(0,r.IL)('

    与个人账户相比,组织账户仅仅多了一些按钮和试用提示,并没有明显区别。简单来说,组织账户有付费的权利,其他功能都相同。

    使用技巧

    • 遇到捕获了元素但执行时却报错的情况,可以尝试自带的记录器。它比手动选择元素要死板,钉死了要点击的元素,但能确保执行成功率。

    • 使用「循环」和「等待」实现半自动执行工作流。如果某些条件并不清晰,可通过第三方网页来设置条件,如特殊网页设置的特殊文本。[2]

    报错重置

    如果遇到程序自身的报错,点击「设置」>「应用」>「应用和功能」中找到 Power Automate Desktop 应用,并点击「重置」后试试看。

    创建 Microsoft 组织账户

    ',6),d={href:"https://partner.microsoft.com/zh-cn/",target:"_blank",rel:"noopener noreferrer"},w={href:"https://partner.microsoft.com/zh-cn/membership",target:"_blank",rel:"noopener noreferrer"},D=(0,r.QD)("li",null,"进入后会问「你希望如何与 Microsoft 合作」,安全起见我选择「合作伙伴」,进入下一页后点「创作工作账户」。",-1),g=(0,r.QD)("li",null,"账户信息除手机和备用邮件外可以随便填,通过手机验证码后,点「继续」,然后等几分钟,就会收到注册成功通知,你也成为有组织的人了。",-1),Q={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"},k=(0,r.QD)("h3",{id:"管理组织用户",tabindex:"-1"},[(0,r.QD)("a",{class:"header-anchor",href:"#管理组织用户"},[(0,r.QD)("span",null,"管理组织用户")])],-1),b={href:"https://portal.azure.com/",target:"_blank",rel:"noopener noreferrer"},A=(0,r.QD)("p",null,"进入「管理 Azure Active Directory」>「用户」,添加和管理组织用户。",-1),Y=(0,r.QD)("hr",{class:"footnotes-sep"},null,-1),P={class:"footnotes"},_={class:"footnotes-list"},y={id:"footnote1",class:"footnote-item"},z={href:"https://support.microsoft.com/zh-cn/office/%E6%B3%A8%E5%86%8C%E5%85%8D%E8%B4%B9teams%E7%BB%8F%E5%85%B8-70aaf044-b872-4c32-ac47-362ab29ebbb1",target:"_blank",rel:"noopener noreferrer"},v=(0,r.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),K={id:"footnote2",class:"footnote-item"},L={href:"https://www.bilibili.com/video/BV1ki4y1S7AZ/?vd_source=9ab57d83a938c90a4fc9691b299cb2af",target:"_blank",rel:"noopener noreferrer"},x=(0,r.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),B={},E=(0,o(9720).c)(B,[["render",function(e,t){const o=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[(0,r.QD)("p",null,[(0,r.QD)("a",a,[(0,r.mY)("Power Automate"),(0,r.K2)(o)]),(0,r.mY)(" 自动化应用,分为桌面流和"),(0,r.QD)("a",n,[(0,r.mY)("云端流"),(0,r.K2)(o)]),(0,r.mY)(",上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。"),s,(0,r.mY)(" 自动化操作也可以使用 Logi Options+ 的 Smart Actions。")]),l,(0,r.QD)("p",null,[i,(0,r.mY)("本身并没有触发器,因此只能手动执行。付费的组织账户可以自动执行桌面流,比如:云端流调用桌面流,"),(0,r.QD)("a",c,[(0,r.mY)("通过 URL 运行桌面流"),(0,r.K2)(o)]),(0,r.mY)("。Power Automate 安装有商店版和 "),(0,r.QD)("a",p,[(0,r.mY)("exe 应用"),(0,r.K2)(o)]),(0,r.mY)("两种方式,各自有些 Bug。")]),(0,r.QD)("p",null,[m,(0,r.mY)("可以自动、即时或通过计划触发自动化。登录云端流时,一开始要求用工作账户登录,但后来我开通了 "),(0,r.QD)("a",f,[(0,r.mY)("Microsoft Teams"),(0,r.K2)(o)]),(0,r.mY)(",就可以用个人账户,暂不清楚是否有因果关系。"),u]),h,(0,r.QD)("p",null,[(0,r.mY)("微软的众多服务都需要组织账户,个人账号经常被拒绝登录。而创建微软组织账户最简单的方法是注册为"),(0,r.QD)("a",d,[(0,r.mY)("微软合作伙伴"),(0,r.K2)(o)]),(0,r.mY)("。")]),(0,r.QD)("ol",null,[(0,r.QD)("li",null,[(0,r.QD)("a",w,[(0,r.mY)("加入 Microsoft 合作伙伴网络"),(0,r.K2)(o)]),(0,r.mY)("。")]),D,g]),(0,r.QD)("p",null,[(0,r.mY)("如果你有 Azure 账户,可以直接在 Azure 中"),(0,r.QD)("a",Q,[(0,r.mY)("为组织创建新的租户"),(0,r.K2)(o)]),(0,r.mY)("。")]),k,(0,r.QD)("p",null,[(0,r.mY)("若要给其他人多添加几个账号,则可以通过 "),(0,r.QD)("a",b,[(0,r.mY)("Azure"),(0,r.K2)(o)]),(0,r.mY)(" 来管理。")]),A,Y,(0,r.QD)("section",P,[(0,r.QD)("ol",_,[(0,r.QD)("li",y,[(0,r.QD)("p",null,[(0,r.QD)("a",z,[(0,r.mY)("注册免费 Teams 经典"),(0,r.K2)(o)]),(0,r.mY)(),v])]),(0,r.QD)("li",K,[(0,r.QD)("p",null,[(0,r.QD)("a",L,[(0,r.mY)("Power Automate Desktop 免费 RPA 实现定时启动或按照频率运行自动化流的三种办法"),(0,r.K2)(o)]),(0,r.mY)(),x])])])])])}]]),R=JSON.parse('{"path":"/apps/tutorials/power-automate.html","title":"Power Automate","lang":"zh-CN","frontmatter":{"article":false,"title":"Power Automate","order":10,"description":"Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Act...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/power-automate.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Power Automate"}],["meta",{"property":"og:description","content":"Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Act..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:49:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:49:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Power Automate\\",\\"description\\":\\"Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Act...\\"}"]]},"headers":[{"level":3,"title":"使用技巧","slug":"使用技巧","link":"#使用技巧","children":[]},{"level":3,"title":"报错重置","slug":"报错重置","link":"#报错重置","children":[]},{"level":3,"title":"创建 Microsoft 组织账户","slug":"创建-microsoft-组织账户","link":"#创建-microsoft-组织账户","children":[]},{"level":3,"title":"管理组织用户","slug":"管理组织用户","link":"#管理组织用户","children":[]}],"git":{"createdTime":1701223097000,"updatedTime":1705348154000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.73,"words":820},"filePathRelative":"apps/tutorials/power-automate.md","localizedDate":"2023年11月29日","excerpt":"

    Power Automate 自动化应用,分为桌面流和云端流,上手比 Quikcer 复杂,网页自动化弱于 UI. Vision RPA,适合在 Window 不同应用间切换的自动化流。对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。 自动化操作也可以使用 Logi Options+ 的 Smart Actions。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-5e1a57da.7f5a7a16.js b/assets/js/v-5e1a57da.7f5a7a16.js deleted file mode 100644 index 361f00dc3..000000000 --- a/assets/js/v-5e1a57da.7f5a7a16.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2228],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9464:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/feedex/","title":"标签: FeedEx","lang":"zh-CN","frontmatter":{"title":"标签: FeedEx","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"FeedEx","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/feedex/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: FeedEx"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: FeedEx\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-61875459.c049d599.js b/assets/js/v-61875459.c049d599.js deleted file mode 100644 index e8897e00e..000000000 --- a/assets/js/v-61875459.c049d599.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9620],{9720:(e,n)=>{n.c=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},164:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>V,data:()=>Z});var a=s(3968);const l=(0,a.QD)("h2",{id:"静态托管",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#静态托管"},[(0,a.QD)("span",null,"静态托管")])],-1),i=(0,a.QD)("p",null,[(0,a.mY)("如果在国内静态资源库找不到所需的静态包,建议使用 "),(0,a.QD)("code",null,"npm i"),(0,a.mY)(" 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。")],-1),t=(0,a.QD)("p",null,"静态资源库:",-1),r={href:"https://www.staticfile.org/",target:"_blank",rel:"noopener noreferrer"},o={href:"https://cdn.bytedance.com/",target:"_blank",rel:"noopener noreferrer"},c=(0,a.QD)("p",null,"emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。",-1),d=(0,a.QD)("h3",{id:"npm-包",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#npm-包"},[(0,a.QD)("span",null,"NPM 包")])],-1),p=(0,a.QD)("strong",null,"有墙风险且不稳定",-1),u=(0,a.QD)("code",null,"@latest",-1),m={href:"https://segmentfault.com/a/1190000023075167",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.npmjs.com/",target:"_blank",rel:"noopener noreferrer"},b=(0,a.QD)("code",null,"https://unpkg.com/",-1),h={href:"https://npmmirror.com/",target:"_blank",rel:"noopener noreferrer"},D=(0,a.QD)("code",null,"https://registry.npmmirror.com/项目名/版本号",-1),f=(0,a.QD)("li",null,[(0,a.mY)("UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("s",null,[(0,a.mY)("饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 "),(0,a.QD)("code",null,"https://npm.elemecdn.com/react@latest/"),(0,a.mY)(" 需要时间更新,具体频率未知,可固定大版本号来获取更新 "),(0,a.QD)("code",null,"https://npm.elemecdn.com/react@^18/"),(0,a.mY)("。")])])])],-1),k={href:"https://statically.io/",target:"_blank",rel:"noopener noreferrer"},g=(0,a.QD)("li",null,[(0,a.QD)("s",null,[(0,a.mY)("jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 "),(0,a.QD)("code",null,"curl https://purge.jsdelivr.net/gh/username/project/file"),(0,a.mY)("。")])],-1),Q=(0,a.QD)("p",null,"由于第三方托管过于不稳定,目前我使用自托管 oss.newzone.top。",-1),y=(0,a.QD)("h3",{id:"部署平台",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#部署平台"},[(0,a.QD)("span",null,"部署平台")])],-1),S=(0,a.QD)("li",null,"Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。",-1),Y=(0,a.QD)("li",null,"Netlify:国内速度慢点,图片容易卡死,但还算稳定。",-1),P=(0,a.QD)("li",null,"Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。",-1),w=(0,a.QD)("li",null,"AWS: 邮箱注册,不过需要信用卡认证。",-1),_=(0,a.QD)("li",null,"国内平台:Gitee、WuliHub、CODING,都需要实名认证。",-1),N=(0,a.QD)("h3",{id:"ipfs",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#ipfs"},[(0,a.QD)("span",null,"IPFS")])],-1),C=(0,a.QD)("p",null,[(0,a.mY)("IPFS 无需服务器就可建立静态网站,号称永不失效,但"),(0,a.QD)("strong",null,"国内稳定性成疑问,实用性一般"),(0,a.mY)("。IPFS 托管在一个网关上,并不会自动复制到所有网关。")],-1),F={href:"https://pinata.cloud/",target:"_blank",rel:"noopener noreferrer"},K=(0,a.QD)("sup",{class:"footnote-ref"},[(0,a.QD)("a",{href:"#footnote1"},"[1]"),(0,a.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),G=(0,a.QD)("p",null,"上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。",-1),x=(0,a.QD)("p",null,[(0,a.mY)("cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 "),(0,a.QD)("code",null,"http://gateway.pinata.cloud"),(0,a.mY)(" 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。")],-1),T={href:"https://www.cloudflare.com/zh-cn/distributed-web-gateway/",target:"_blank",rel:"noopener noreferrer"},H=(0,a.IL)('
    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),I={href:"https://github.com/SamKirkland/FTP-Deploy-Action",target:"_blank",rel:"noopener noreferrer"},j=(0,a.IL)('
    on: push\nname: 🚀 Deploy website on push\njobs:\n  web-deploy:\n    name: 🎉 Deploy\n    runs-on: ubuntu-latest\n    steps:\n    - name: 🚚 Get latest code\n      uses: actions/checkout@v3\n\n    - name: 📂 Sync files\n      uses: SamKirkland/FTP-Deploy-Action@4.3.3\n      with:\n        server: ${{ secrets.ftp_host }}\n        username: ${{ secrets.ftp_username }}\n        password: ${{ secrets.ftp_password }}\n        port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口\n

    新建 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 服务器被拉黑了。

    SSH 同步

    ',5),E={href:"https://github.com/SamKirkland/web-deploy",target:"_blank",rel:"noopener noreferrer"},A=(0,a.QD)("code",null,"Permission denied (publickey,password)",-1),L=(0,a.IL)('
    on: push\nname: Publish Website\njobs:\n  web-deploy:\n    name: 🚀 Deploy Website Every Commit\n    runs-on: ubuntu-latest\n    steps:\n    - name: 🚚 Get Latest Code\n      uses: actions/checkout@v3\n\n    - name: 📂 Sync Files\n      uses: SamKirkland/web-deploy@v1\n      with:\n        source-path: docs/.vuepress/dist/\n        target-server: ${{ secrets.host }}\n        remote-user: ${{ secrets.ssh_username }}\n        private-ssh-key: ${{ secrets.SSH_KEY }}\n        destination-path: ${{ secrets.destination_folder }}\n        ssh-port: ${{ secrets.ssh_port }} # 建议更改默认的 22 端口\n

    如果出现报错 error in libcrypto,说明 SSH 密钥错误,需要登陆服务器终端,运行以下命令。

    ssh-keygen -m PEM -t rsa -b 4096\ncat id_rsa.pub >> authorized_keys\ncat id_rsa\n

    同步到 oss

    ',4),$={href:"https://github.com/marketplace/actions/aliyun-oss-website-action",target:"_blank",rel:"noopener noreferrer"},W=(0,a.IL)('
    name: deploy md to oss\non:\n  push:\n    branches: [ "main" ]\n  pull_request:\n    branches: [ "main" ]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    # load repo to /github/workspace\n    - uses: actions/checkout@v3\n    - name: Use Node.js\n      uses: actions/setup-node@v3\n      with:\n        node-version: '14.x'\n    # 打包文档命令\n    # - run: npm install yarn@1.22.4 -g\n    # - run: yarn install\n    # - run: yarn docs:build #需要配合 yarn 的 package.json\n    - name: aliyun-oss-website-action\n      uses: fangbinwei/aliyun-oss-website-action@v1.3.0\n      with:\n          accessKeyId: ${{ secrets.ACCESS_KEY_ID }}\n          accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}\n          bucket: learndata-notes\n          # use your own endpoint\n          endpoint: oss-cn-shanghai.aliyuncs.com\n          # 全目录上传\n          folder: .\n          # 不上传的文件\n          exclude: |\n            .github/\n            .gitattributes\n

    ',2),z={class:"footnotes"},U={class:"footnotes-list"},M={id:"footnote1",class:"footnote-item"},R={href:"https://medium.com/pinata/how-to-easily-host-a-website-on-ipfs-9d842b5d6a01",target:"_blank",rel:"noopener noreferrer"},q=(0,a.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),O={},V=(0,s(9720).c)(O,[["render",function(e,n){const s=(0,a.E1)("ExternalLinkIcon"),O=(0,a.E1)("RouteLink");return(0,a.Wz)(),(0,a.An)("div",null,[l,i,t,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("a",r,[(0,a.mY)("Staticfile CDN"),(0,a.K2)(s)]),(0,a.mY)(":国内维护最稳定的 CDN。")]),(0,a.QD)("li",null,[(0,a.QD)("a",o,[(0,a.mY)("字节 CDN"),(0,a.K2)(s)]),(0,a.mY)(":测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。")])]),c,d,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("UNPKG:"),p,(0,a.mY)(",默认为最新版本,无需 "),u,(0,a.mY)(" 标签。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("将静态文件发布为 npm 包,参考"),(0,a.QD)("a",m,[(0,a.mY)("一分钟教你发布 npm 包"),(0,a.K2)(s)]),(0,a.mY)("。")]),(0,a.QD)("li",null,[(0,a.mY)("加速:在 "),(0,a.QD)("a",v,[(0,a.mY)("npm 官方源"),(0,a.K2)(s)]),(0,a.mY)("中搜索包位置,然后使用前缀 "),b,(0,a.mY)("。")])])]),(0,a.QD)("li",null,[(0,a.QD)("a",h,[(0,a.mY)("NPM MIRROR"),(0,a.K2)(s)]),(0,a.mY)(":NPM 项目的国内镜像镜像,不能做静态托管用途。"),D,(0,a.mY)(" 可以看见项目的各种信息,但看不了里面的文件。")]),f,(0,a.QD)("li",null,[(0,a.mY)("GitHub:基于 GitHub 公共仓库的资源托管,资源不会失效,但有时需要根据 CDN 服务商而更换域名。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("s",null,[(0,a.QD)("a",k,[(0,a.mY)("Statically"),(0,a.K2)(s)]),(0,a.mY)(":jsDeliver 的替代品,在中国大陆所有地区连接异常。")])]),g])])]),Q,y,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.mY)("Cloudflare:Pages 和 Workers 两类部署方式。 "),(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.K2)(O,{to:"/deploy/Cloudflare.html#%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86"},{default:(0,a.Ql)((()=>[(0,a.mY)("Workers")])),_:1}),(0,a.mY)(":复制镜像网站,可直接访问,但反向代理稳定性成疑。")]),S])]),Y,P,w,_]),N,C,(0,a.QD)("p",null,[(0,a.QD)("a",F,[(0,a.mY)("pinata"),(0,a.K2)(s)]),(0,a.mY)(" 上传网站构建的目录文件夹,上传后,即可通过 IPFS Hash 访问。网站目录中必须有 index.html,否则网页中将显示网站目录。即使有 index.html,其他人在拥有 CID 后,可以通过 IPFS Desktop 来获取网站的完整目录。为确保私密性,建议只上传单文件。使用单文件 CID 视为单一网站,不可调用原目录中的文件。"),K]),G,x,(0,a.QD)("p",null,[(0,a.mY)("对于文件较少且链接有效的域名,可按 "),(0,a.QD)("a",T,[(0,a.mY)("Cloudflare IPFS"),(0,a.K2)(s)]),(0,a.mY)(" 页面说明来设置 DNS,提交 IPFS 域名 30 分钟后,即可获取 SSL 证书。")]),H,(0,a.QD)("p",null,[(0,a.mY)("如果你有 FTP 服务器,可使用 "),(0,a.QD)("a",I,[(0,a.mY)("FTP-Deploy-Action"),(0,a.K2)(s)]),(0,a.mY)(" 将 github 代码推送到服务器上。Actions 步骤参考 "),(0,a.K2)(O,{to:"/deploy/GitHub.html"},{default:(0,a.Ql)((()=>[(0,a.mY)("GitHub 说明")])),_:1}),(0,a.mY)("。")]),j,(0,a.QD)("p",null,[(0,a.mY)("如果你有服务器的 SSH 权限,可以使用 "),(0,a.QD)("a",E,[(0,a.mY)("web-deploy"),(0,a.K2)(s)]),(0,a.mY)(" 以 SSH 同步方式发布页面。但与 FTP 相比,不确定安全性、速度、时间是否会区别。我尝试连接一直报错 "),A,(0,a.mY)("。(有可能是服务器需要非 root 用户,adduser 一直加不上。)")]),L,(0,a.QD)("p",null,[(0,a.mY)("如果没有服务器,可以把文件部署在云运营商的云存储上。比如用 "),(0,a.QD)("a",$,[(0,a.mY)("aliyun-oss-website-action"),(0,a.K2)(s)]),(0,a.mY)(",将 repo 文件 build 成网站文件,然后同步到阿里云 oss 并运行网站。")]),W,(0,a.QD)("section",z,[(0,a.QD)("ol",U,[(0,a.QD)("li",M,[(0,a.QD)("p",null,[(0,a.QD)("a",R,[(0,a.mY)("How to Easily Host a Website on IPFS"),(0,a.K2)(s)]),(0,a.mY)(),q])])])])])}]]),Z=JSON.parse('{"path":"/deploy/Static.html","title":"静态部署","lang":"zh-CN","frontmatter":{"article":false,"title":"静态部署","icon":"generic","order":1,"description":"静态托管 如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 静态资源库: Staticfile CDN:国内维护最稳定的 CDN。 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 20...","head":[["meta",{"property":"og:url","content":"https://newzone.top/deploy/Static.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"静态部署"}],["meta",{"property":"og:description","content":"静态托管 如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 静态资源库: Staticfile CDN:国内维护最稳定的 CDN。 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 20..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-08-09T21:57:45.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-08-09T21:57:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"静态部署\\",\\"description\\":\\"静态托管 如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 静态资源库: Staticfile CDN:国内维护最稳定的 CDN。 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 20...\\"}"]]},"headers":[{"level":2,"title":"静态托管","slug":"静态托管","link":"#静态托管","children":[{"level":3,"title":"NPM 包","slug":"npm-包","link":"#npm-包","children":[]},{"level":3,"title":"部署平台","slug":"部署平台","link":"#部署平台","children":[]},{"level":3,"title":"IPFS","slug":"ipfs","link":"#ipfs","children":[]}]},{"level":2,"title":"GitHub 同步到 VPS","slug":"github-同步到-vps","link":"#github-同步到-vps","children":[{"level":3,"title":"同步到 FTP","slug":"同步到-ftp","link":"#同步到-ftp","children":[]},{"level":3,"title":"SSH 同步","slug":"ssh-同步","link":"#ssh-同步","children":[]},{"level":3,"title":"同步到 oss","slug":"同步到-oss","link":"#同步到-oss","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1691618265000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":21}]},"readingTime":{"minutes":6.56,"words":1968},"filePathRelative":"deploy/Static.md","localizedDate":"2022年7月22日","excerpt":"

    静态托管

    \\n

    如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。

    \\n

    静态资源库:

    \\n
      \\n
    • Staticfile CDN:国内维护最稳定的 CDN。
    • \\n
    • 字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-61ea73e9.cbc0434a.js b/assets/js/v-61ea73e9.cbc0434a.js deleted file mode 100644 index bfb8521f0..000000000 --- a/assets/js/v-61ea73e9.cbc0434a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5576],{9720:(t,e)=>{e.c=(t,e)=>{const i=t.__vccOpts||t;for(const[t,n]of e)i[t]=n;return i}},7140:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>p,data:()=>r});var n=i(3968);const a=[(0,n.IL)('

    宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 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)],o={},p=(0,i(9720).c)(o,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,a)}]]),r=JSON.parse('{"path":"/posts/2018-06-08-baizhuo_gp1700.html","title":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射","lang":"zh-CN","frontmatter":{"title":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射","date":"2018-06-08T00:00:00.000Z","category":["网络"],"tag":["GP1700","光猫"],"order":-19,"description":"宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。 电信「网络管家」功能 重启光猫; 开启 UPnp; 开启 DMZ 主机,建立端口映射; 建立虚拟服务器,内网穿透访问。 开启光猫端口映射、内网穿透 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。 打开电信官方 AP...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-06-08-baizhuo_gp1700.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"}],["meta",{"property":"og:description","content":"宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。 电信「网络管家」功能 重启光猫; 开启 UPnp; 开启 DMZ 主机,建立端口映射; 建立虚拟服务器,内网穿透访问。 开启光猫端口映射、内网穿透 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。 打开电信官方 AP..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180608183159.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"GP1700"}],["meta",{"property":"article:tag","content":"光猫"}],["meta",{"property":"article:published_time","content":"2018-06-08T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射\\",\\"image\\":[\\"https://img.newzone.top/20180608183159.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180608185618.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20190330175000.png?imageMogr2/auto-orient/strip%7CimageView2/2/h/600\\"],\\"datePublished\\":\\"2018-06-08T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"电信「网络管家」功能","slug":"电信「网络管家」功能","link":"#电信「网络管家」功能","children":[]},{"level":2,"title":"开启光猫端口映射、内网穿透","slug":"开启光猫端口映射、内网穿透","link":"#开启光猫端口映射、内网穿透","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":1.3,"words":391},"filePathRelative":"_posts/2018-06-08-baizhuo_gp1700.md","localizedDate":"2018年6月8日","excerpt":"

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

    \\n

    电信「网络管家」功能

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

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

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

      光猫内网穿透:当外网要访问局域网(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)。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-628a0517.cfb3094d.js b/assets/js/v-628a0517.cfb3094d.js deleted file mode 100644 index abbab3e46..000000000 --- a/assets/js/v-628a0517.cfb3094d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1020],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},6644:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E7%B3%BB%E7%BB%9F/","title":"系统 分类","lang":"zh-CN","frontmatter":{"title":"系统 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"系统","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E7%B3%BB%E7%BB%9F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"系统 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"系统 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-630f9b2e.6ed181ee.js b/assets/js/v-630f9b2e.6ed181ee.js deleted file mode 100644 index b093614c4..000000000 --- a/assets/js/v-630f9b2e.6ed181ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3837],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9904:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var n=a(3968);const o={},r=(0,a(9720).c)(o,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/onenote/","title":"标签: OneNote","lang":"zh-CN","frontmatter":{"title":"标签: OneNote","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"OneNote","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/onenote/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: OneNote"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: OneNote\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-637f577e.68d53df4.js b/assets/js/v-637f577e.68d53df4.js deleted file mode 100644 index a0704812c..000000000 --- a/assets/js/v-637f577e.68d53df4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8168],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4208:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%BE%93%E5%85%A5%E6%B3%95/","title":"标签: 输入法","lang":"zh-CN","frontmatter":{"title":"标签: 输入法","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"输入法","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%BE%93%E5%85%A5%E6%B3%95/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 输入法"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 输入法\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6543b620.51f4a449.js b/assets/js/v-6543b620.51f4a449.js deleted file mode 100644 index 785c42ab9..000000000 --- a/assets/js/v-6543b620.51f4a449.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2616],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4240:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>s});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),s=JSON.parse('{"path":"/tag/games/","title":"标签: games","lang":"zh-CN","frontmatter":{"title":"标签: games","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"games","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/games/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: games"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: games\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-66489a58.05a6e0aa.js b/assets/js/v-66489a58.05a6e0aa.js deleted file mode 100644 index 9b70290fd..000000000 --- a/assets/js/v-66489a58.05a6e0aa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[744],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3188:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){const a=(0,n.E1)("Catalog");return(0,n.Wz)(),(0,n.An)("div",null,[(0,n.K2)(a)])}]]),p=JSON.parse('{"path":"/web/","title":"Web","lang":"zh-CN","frontmatter":{"title":"Web","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Web"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Web\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-66d50f02.0bb85d52.js b/assets/js/v-66d50f02.0bb85d52.js deleted file mode 100644 index ede0e54ad..000000000 --- a/assets/js/v-66d50f02.0bb85d52.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3588],{9720:(t,e)=>{e.c=(t,e)=>{const i=t.__vccOpts||t;for(const[t,n]of e)i[t]=n;return i}},9800:(t,e,i)=>{i.r(e),i.d(e,{comp:()=>r,data:()=>o});var n=i(3968);const a=[(0,n.IL)('

    拖慢 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)],p={},r=(0,i(9720).c)(p,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div",null,a)}]]),o=JSON.parse('{"path":"/posts/2020-09-13-wifi_speed_up.html","title":"无线路由调整,加快 WIFI 速度","lang":"zh-CN","frontmatter":{"title":"无线路由调整,加快 WIFI 速度","date":"2020-09-13T00:00:00.000Z","category":["网络"],"tag":["WIFI"],"order":-29,"description":"拖慢 WIFI 速度的最大元凶是无线信号合并。 「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。 先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2020-09-13-wifi_speed_up.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"无线路由调整,加快 WIFI 速度"}],["meta",{"property":"og:description","content":"拖慢 WIFI 速度的最大元凶是无线信号合并。 「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。 先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20200913134120.jpg?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"无线路由调整,加快 WIFI 速度"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"WIFI"}],["meta",{"property":"article:published_time","content":"2020-09-13T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"无线路由调整,加快 WIFI 速度\\",\\"image\\":[\\"https://img.newzone.top/20200913134120.jpg?imageMogr2/thumbnail/400x\\"],\\"datePublished\\":\\"2020-09-13T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"无线模式","slug":"无线模式","link":"#无线模式","children":[]},{"level":2,"title":"频道带宽","slug":"频道带宽","link":"#频道带宽","children":[]},{"level":2,"title":"调整信道","slug":"调整信道","link":"#调整信道","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":5}]},"readingTime":{"minutes":2.08,"words":623},"filePathRelative":"_posts/2020-09-13-wifi_speed_up.md","localizedDate":"2020年9月13日","excerpt":"

    拖慢 WIFI 速度的最大元凶是无线信号合并

    \\n

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    \\n

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    \\n

    无线模式

    \\n

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-67b721eb.e512fa34.js b/assets/js/v-67b721eb.e512fa34.js deleted file mode 100644 index be13182f5..000000000 --- a/assets/js/v-67b721eb.e512fa34.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4080],{9720:(n,s)=>{s.c=(n,s)=>{const a=n.__vccOpts||n;for(const[n,e]of s)a[n]=e;return a}},8492:(n,s,a)=>{a.r(s),a.d(s,{comp:()=>u,data:()=>d});var e=a(3968);const t={href:"https://www.electronjs.org/",target:"_blank",rel:"noopener noreferrer"},o=(0,e.IL)('
    # 部署 electron,electron-builder\n# Electron 不能全局安装,否则 electron-builder 找不到\nyarn add electron@latest -D && yarn add electron-builder -D\n\nset-ExecutionPolicy RemoteSigned #若 yarn 命令报错,则管理员运行此命令\n\n# 全局安装时,去除^,手动指定 package.json 中的 electron 版本,然后运行下方打包命令\n# 将打包命令加入 package.json,直接使用打包命令\nyarn postinstall\nyarn dist\n

    使用问题

    ',2),l=(0,e.QD)("li",null,"electron cdn 需要连接网络,必须用本地环境安装。",-1),p=(0,e.QD)("li",null,"Electron 定位的 location 为 窗口链接,而非网页链接。",-1),c={href:"https://imf.ms/web/2022/07/05/my-first-web-hybird-project-experience/#%E8%B7%A8%E5%9F%9F-cors-%E9%85%8D%E7%BD%AE",target:"_blank",rel:"noopener noreferrer"},r=(0,e.IL)('

    nsis 配置

    "nsis": {\n  "oneClick": false, // 是否一键安装\n  "allowElevation": true, // 允许请求提升。如果为 false,则用户必须使用提升的权限重新启动安装程序。\n  "allowToChangeInstallationDirectory": true, // 允许修改安装目录\n  "installerIcon": "./build/icons/aaa.ico",// 安装图标\n  "uninstallerIcon": "./build/icons/bbb.ico",//卸载图标\n  "installerHeaderIcon": "./build/icons/aaa.ico", // 安装时头部图标\n  "createDesktopShortcut": true, // 创建桌面图标\n  "createStartMenuShortcut": true,// 创建开始菜单图标\n  "shortcutName": "xxxx", // 图标名称\n  "include": "build/script/installer.nsh", // 包含的自定义 nsis 脚本 这个对于构建需求严格得安装过程相当有用。\n  "script" : "build/script/installer.nsh" // NSIS 脚本的路径,用于自定义安装程序。默认为 build / installer.nsi\n},\n

    打包报错

    执行打包命令后,提示 cannot unpack electron zip file, will be re-downloaded

    手动下载对应版本 electron,然后将压缩包放置于 C:\\Users\\用户名\\AppData\\Local\\electron\\Cache

    跨系统打包

    electron 不允许跨系统打包,所以 Mac 打包需要在 iOS 环境,Linux 打包需在 Linux 环境。

    Win11 可允许内建子系统,管理员身份运行 Powershell,输入 bash 即可进入 Linux 子系统。也可以直接打开在 Microsoft store 中下载的 Ubuntu 进入子系统,初次进入 Linux 子系统需要设置 Linux 的用户名及密码。

    更多命令参考:

    #安排装更新软件源,安装 node 和 npm 环境\nsudo apt-get update\nsudo apt-get install nodejs\nsudo apt-get install npm\n\nsudo npm install npm@latest -g #升级 npm\nsudo npm install -g n #安装用于安装 nodejs 的模块 n\nsudo n stable #通过 n 模块安装指定的 nodejs\n
    ',10),i={},u=(0,a(9720).c)(i,[["render",function(n,s){const a=(0,e.E1)("ExternalLinkIcon"),i=(0,e.E1)("RouteLink");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.QD)("a",t,[(0,e.mY)("Electron"),(0,e.K2)(a)]),(0,e.mY)(" 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。")]),(0,e.QD)("p",null,[(0,e.mY)("按 "),(0,e.K2)(i,{to:"/deploy/VPS.html#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2"},{default:(0,e.Ql)((()=>[(0,e.mY)("环境部署教程")])),_:1}),(0,e.mY)(",部署 yarn,然后部署 electron 环境。")]),o,(0,e.QD)("ul",null,[l,p,(0,e.QD)("li",null,[(0,e.QD)("a",c,[(0,e.mY)("跨域 CORS 配置"),(0,e.K2)(a)]),(0,e.mY)(":有的应用需要访问的是本地 Web Server,与服务端接口在不同域")])]),r])}]]),d=JSON.parse('{"path":"/code/Electron.html","title":"Electron","lang":"zh-CN","frontmatter":{"article":false,"title":"Electron","icon":"layout","order":7,"description":"Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。 按 ,部署 yarn,然后部署 electron 环境。 使用问题 electron cdn 需要连接网络,必须用本地环境安装。 Electron 定位的 l...","head":[["meta",{"property":"og:url","content":"https://newzone.top/code/Electron.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Electron"}],["meta",{"property":"og:description","content":"Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。 按 ,部署 yarn,然后部署 electron 环境。 使用问题 electron cdn 需要连接网络,必须用本地环境安装。 Electron 定位的 l..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Electron\\",\\"description\\":\\"Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。 按 ,部署 yarn,然后部署 electron 环境。 使用问题 electron cdn 需要连接网络,必须用本地环境安装。 Electron 定位的 l...\\"}"]]},"headers":[{"level":2,"title":"使用问题","slug":"使用问题","link":"#使用问题","children":[{"level":3,"title":"nsis 配置","slug":"nsis-配置","link":"#nsis-配置","children":[]},{"level":3,"title":"打包报错","slug":"打包报错","link":"#打包报错","children":[]},{"level":3,"title":"跨系统打包","slug":"跨系统打包","link":"#跨系统打包","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":9}]},"readingTime":{"minutes":2.14,"words":643},"filePathRelative":"code/Electron.md","localizedDate":"2022年7月22日","excerpt":"

    Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序框架。Electron 兼容 Mac、Windows 和 Linux,可以构建出三个平台的应用程序。

    \\n

    环境部署教程,部署 yarn,然后部署 electron 环境。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-67fc9a72.c2c6b6c4.js b/assets/js/v-67fc9a72.c2c6b6c4.js deleted file mode 100644 index 90c0fa2a9..000000000 --- a/assets/js/v-67fc9a72.c2c6b6c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6480],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},94:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){const a=(0,n.E1)("Catalog");return(0,n.Wz)(),(0,n.An)("div",null,[(0,n.K2)(a)])}]]),p=JSON.parse('{"path":"/apps/livestreaming/","title":"Livestreaming","lang":"zh-CN","frontmatter":{"title":"Livestreaming","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/livestreaming/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Livestreaming"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Livestreaming\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-69a00b0f.2f2baab2.js b/assets/js/v-69a00b0f.2f2baab2.js deleted file mode 100644 index b86f3e420..000000000 --- a/assets/js/v-69a00b0f.2f2baab2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[166],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},9452:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>c});var o=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(e,t){return(0,o.Wz)(),(0,o.An)("div")}]]),c=JSON.parse('{"path":"/tag/office/","title":"标签: office","lang":"zh-CN","frontmatter":{"title":"标签: office","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"office","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/office/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: office"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: office\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6a6120d9.3a8d7cec.js b/assets/js/v-6a6120d9.3a8d7cec.js deleted file mode 100644 index 4af926763..000000000 --- a/assets/js/v-6a6120d9.3a8d7cec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1413],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},3224:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E8%A7%82%E5%AF%9F%E9%9A%8F%E7%AC%94/","title":"观察随笔 分类","lang":"zh-CN","frontmatter":{"title":"观察随笔 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"观察随笔","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E8%A7%82%E5%AF%9F%E9%9A%8F%E7%AC%94/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"观察随笔 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"观察随笔 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6be6ab1e.8adf4cbc.js b/assets/js/v-6be6ab1e.8adf4cbc.js deleted file mode 100644 index 872d44a83..000000000 --- a/assets/js/v-6be6ab1e.8adf4cbc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4916],{9720:(e,t)=>{t.c=(e,t)=>{const n=e.__vccOpts||e;for(const[e,p]of t)n[e]=p;return n}},188:(e,t,n)=>{n.r(t),n.d(t,{comp:()=>m,data:()=>u});var p=n(3968);const a=(0,p.IL)('

    从 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),i={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},o=(0,p.QD)("figure",null,[(0,p.QD)("img",{src:"https://img.newzone.top/2022-05-25-18-08-06.png?imageMogr2/thumbnail/500x",alt:"Quick Cut 界面",tabindex:"0",loading:"lazy"}),(0,p.QD)("figcaption",null,"Quick Cut 界面")],-1),r=(0,p.QD)("p",null,"Quick Cut 的缺点:语音输入时,要一直按大写键,不适合长语音录入;触发键无法更改,大写键与我的常用脚本冲突了。因此,长时间的语音输入只能借助手机上的飞书妙记来完成转录。",-1),l=(0,p.QD)("h2",{id:"最终方案-微软语音输入",tabindex:"-1"},[(0,p.QD)("a",{class:"header-anchor",href:"#最终方案-微软语音输入"},[(0,p.QD)("span",null,"最终方案:微软语音输入")])],-1),c={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"},g=(0,p.IL)('

    微软自带的语音输入,快捷键 Win + H。3 块钱的麦克风,距离 50 厘米,很低的声音读出来了。

    测试后,发现微软语音输入确实是好用,甚至好用到有点恐怖。测试中,我临时有事,走到另外一个房间和家人说话,回来后发现刚刚的对话也被微软语音输入正确识别。

    微软语音输入
    微软语音输入

    微软语音输入非常敏感,距离远、声音低也能识别。这样我不用为语音输入而特意移动话筒,可以继续把话筒放在不遮挡视野的远角。

    「语音键入功能在此应用上受限制」在 Notepad++ 和微信都出现了,Visual Studio Code 没出现,但实际上这提示对语音输入并没造成影响,平常可以忽略这个提示。

    虽然微软语音输入的识别率只有 85%,不如阿里云方案的 95%,可系统自带的优势太明显,微软语音输入体验感非常顺滑。设置中开启「自动标点符号」后,对长句的优化非常好。

    启动快捷键 Win + H,语音识别立即会启动。如果中途没说话,应用会自动暂停,并对前面的输入进行整理,插入合适的标点符号。停止超过一分钟,语音识别才会暂停,等待再次启动。换言之,微软语音输入能一键完成长语音录入。

    之前的麦克风放着放着就坏了,所以我没测 @李乐 说的低价麦克风的语音输入效果。不过,微软输入的软件优化非常好,按照目前效果推测,用便宜的麦克风也能实现完美的收音效果。综合来说,微软语音输入是当前最完美也是兼容性最高的语音输入方案。

    总结与展望

    语音输入的 3 种方案:

    • 文章输入:微软语音输入 + 外置声卡 + 动圈话筒,兼容性最高,使用方便,但精度一般,用于文章草稿阶段。
    • 一句话输入:Quick Cut + 外置声卡 + 动圈话筒,一句话识别精度最高,适合聊天时使用。
    • 语音转录:飞书妙记 + 手机,录音转文字,长语音的识别率超高。

    与 2018 年相比,2022 年的语音输入方案已经完善了许多。硬件已经不再是问题了,便宜的话筒也能达到语音输入标准。语音识别进步明显,在 AI 技术的加持下,短句识别率从 90% 上升到 95%,长句识别率则从 50% 上升到 70%,标点符号均能正确插入。

    目前语音输入算法在提升最后 10% 的准确率,期待早日达到「口述与键盘输入完全一致」的一天。

    ',13),s={},m=(0,n(9720).c)(s,[["render",function(e,t){const n=(0,p.E1)("ExternalLinkIcon");return(0,p.Wz)(),(0,p.An)("div",null,[a,(0,p.QD)("p",null,[(0,p.mY)("语音输入则转用开源的 "),(0,p.QD)("a",i,[(0,p.mY)("Quick Cut"),(0,p.K2)(n)]),(0,p.mY)(",使用阿里云、腾讯云的商用语音接口,识别率比免费的搜狗和讯飞都高。")]),o,r,l,(0,p.QD)("p",null,[(0,p.mY)("面对 Quick Cut 的长语音输入难题时,@李乐 推荐了微软语音输入-"),(0,p.QD)("a",c,[(0,p.mY)("使用语音键入来说话,而不是在电脑上键入"),(0,p.K2)(n)]),(0,p.mY)("。")]),g])}]]),u=JSON.parse('{"path":"/posts/2018-12-28-voice_input_try.html","title":"等了十年,PC 端能用的语音输入方案来了","lang":"zh-CN","frontmatter":{"title":"等了十年,PC 端能用的语音输入方案来了","subtitle":"解放双手,加速打字,电脑端语音录入方案","date":"2018-12-28T00:00:00.000Z","category":["自动化"],"tag":["语音输入"],"order":-23,"description":"从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。 为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。 讯飞 + 小麦克风 2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-12-28-voice_input_try.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"等了十年,PC 端能用的语音输入方案来了"}],["meta",{"property":"og:description","content":"从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。 为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。 讯飞 + 小麦克风 2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20181228052211.png?imageMogr2/thumbnail/400x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"等了十年,PC 端能用的语音输入方案来了"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"语音输入"}],["meta",{"property":"article:published_time","content":"2018-12-28T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"等了十年,PC 端能用的语音输入方案来了\\",\\"image\\":[\\"https://img.newzone.top/20181228052211.png?imageMogr2/thumbnail/400x\\",\\"https://img.newzone.top/2022-05-25-18-02-54.jpg?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2022-05-25-18-08-06.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/2022-05-25-18-13-17.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-12-28T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-29T12:26:51.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"讯飞 + 小麦克风","slug":"讯飞-小麦克风","link":"#讯飞-小麦克风","children":[]},{"level":2,"title":"讯飞 + Blue Yeti","slug":"讯飞-blue-yeti","link":"#讯飞-blue-yeti","children":[]},{"level":2,"title":"外置声卡 + 动圈话筒","slug":"外置声卡-动圈话筒","link":"#外置声卡-动圈话筒","children":[]},{"level":2,"title":"输入法之争","slug":"输入法之争","link":"#输入法之争","children":[]},{"level":2,"title":"最终方案:微软语音输入","slug":"最终方案-微软语音输入","link":"#最终方案-微软语音输入","children":[]},{"level":2,"title":"总结与展望","slug":"总结与展望","link":"#总结与展望","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":6.53,"words":1959},"filePathRelative":"_posts/2018-12-28-voice_input_try.md","localizedDate":"2018年12月28日","excerpt":"

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    \\n

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    \\n

    讯飞 + 小麦克风

    \\n

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    \\n

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    \\n

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6c594482.6def9096.js b/assets/js/v-6c594482.6def9096.js deleted file mode 100644 index 6561b0cf5..000000000 --- a/assets/js/v-6c594482.6def9096.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6776],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},3248:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>l});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),l=JSON.parse('{"path":"/tag/jekyll/","title":"标签: Jekyll","lang":"zh-CN","frontmatter":{"title":"标签: Jekyll","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Jekyll","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/jekyll/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Jekyll"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Jekyll\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6e2cc99e.82dbdafc.js b/assets/js/v-6e2cc99e.82dbdafc.js deleted file mode 100644 index 343ea15b3..000000000 --- a/assets/js/v-6e2cc99e.82dbdafc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4904],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5168:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%8E%9F%E5%88%99/","title":"标签: 原则","lang":"zh-CN","frontmatter":{"title":"标签: 原则","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"原则","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%8E%9F%E5%88%99/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 原则"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 原则\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-6f1d2d4e.1ffadfaf.js b/assets/js/v-6f1d2d4e.1ffadfaf.js deleted file mode 100644 index 0be3c6134..000000000 --- a/assets/js/v-6f1d2d4e.1ffadfaf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1645],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},824:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E8%87%AA%E5%8A%A8%E5%8C%96/","title":"自动化 分类","lang":"zh-CN","frontmatter":{"title":"自动化 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"自动化","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E8%87%AA%E5%8A%A8%E5%8C%96/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"自动化 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"自动化 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-701dd5be.cbb450f3.js b/assets/js/v-701dd5be.cbb450f3.js deleted file mode 100644 index 7fbfd9893..000000000 --- a/assets/js/v-701dd5be.cbb450f3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2844],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5464:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>s});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),s=JSON.parse('{"path":"/tag/nas/","title":"标签: nas","lang":"zh-CN","frontmatter":{"title":"标签: nas","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"nas","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/nas/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: nas"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: nas\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-71864650.35abe4e2.js b/assets/js/v-71864650.35abe4e2.js deleted file mode 100644 index e450b3fa9..000000000 --- a/assets/js/v-71864650.35abe4e2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8704],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},7380:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E7%BD%91%E7%BB%9C/","title":"网络 分类","lang":"zh-CN","frontmatter":{"title":"网络 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"网络","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E7%BD%91%E7%BB%9C/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"网络 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"网络 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-736a92d8.d99e5b22.js b/assets/js/v-736a92d8.d99e5b22.js deleted file mode 100644 index 30fdd5bec..000000000 --- a/assets/js/v-736a92d8.d99e5b22.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8648],{9720:(e,n)=>{n.c=(e,n)=>{const a=e.__vccOpts||e;for(const[e,s]of n)a[e]=s;return a}},1324:(e,n,a)=>{a.r(n),a.d(n,{comp:()=>O,data:()=>R});var s=a(3968);const t=(0,s.QD)("p",null,"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。",-1),l=(0,s.QD)("h2",{id:"评论插件",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#评论插件"},[(0,s.QD)("span",null,"评论插件")])],-1),i={href:"https://waline.js.org/guide/get-started.html",target:"_blank",rel:"noopener noreferrer"},r={href:"https://github.com/xCss/Valine",target:"_blank",rel:"noopener noreferrer"},o={href:"https://github.com/giscus/giscus",target:"_blank",rel:"noopener noreferrer"},c={href:"https://blog.csdn.net/duninet/article/details/125280107",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/gitalk/gitalk",target:"_blank",rel:"noopener noreferrer"},d={href:"https://gitter.im/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://boardgame.io/documentation/#/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://itchef.github.io/regauge/#/",target:"_blank",rel:"noopener noreferrer"},v=(0,s.QD)("h2",{id:"waline",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#waline"},[(0,s.QD)("span",null,"Waline")])],-1),b=(0,s.QD)("p",null,"Waline 支持 Akismet 反垃圾评论和免注册留言,但匿名留言会带来安全隐患。建议开启评论通知来避免出现极端情况。Waline 的评论通知支持多种方式,包括 QQ、微信、邮件等。对于评论的回复,仅支持邮件通知。",-1),h={href:"https://waline.js.org/guide/server/notification.html",target:"_blank",rel:"noopener noreferrer"},g={href:"https://waline.js.org/reference/server.html",target:"_blank",rel:"noopener noreferrer"},k=(0,s.QD)("code",null,"*.vercel.app",-1),f=(0,s.QD)("h3",{id:"手动部署",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#手动部署"},[(0,s.QD)("span",null,"手动部署")])],-1),w=(0,s.QD)("p",null,"请注意,Vercel 和 LeanCloud 有额度限制。如果你的网站日访客超过一千人次,建议使用自行部署的方案。以下是我的部署步骤:",-1),D={href:"https://github.com/walinejs/waline/blob/main/assets/waline.sql",target:"_blank",rel:"noopener noreferrer"},_=(0,s.QD)("sup",{class:"footnote-ref"},[(0,s.QD)("a",{href:"#footnote1"},"[1]"),(0,s.QD)("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),Q=(0,s.IL)('
  • 配置必要的环境变量,可添加于 /etc/environment。配置完成后,需要重启项目让环境变量生效。并注意最后一行需保留空行。

    MYSQL_DB=""\nMYSQL_USER=""\nMYSQL_PASSWORD=""\n
  • 部署 Waline 服务端,使用 forever 让其持久化运行。

    # 切换到站点路径\ncd /www/wwwroot/node/waline\n\n# 安装 waline 前端包\nnpm install @waline/vercel --save\n\n# 运行模块内的 vanilla.js 文件\nnode node_modules/@waline/vercel/vanilla.js\n\n# 使用 forever 持久化运行程序\nsudo npm install forever -g\nforever start app.js  #启动应用\nforever stop app.js  #关闭应用\nforever restartall  #重启所有应用\n\n# 持久化运行 Waline\nforever start /www/wwwroot/node/waline/node_modules/@waline/vercel/vanilla.js\n\n# 版本升级并重启\nforever stop /www/wwwroot/node/waline/node_modules/@waline/vercel/vanilla.js\ncd /www/wwwroot/node/waline\nnpm update @waline/vercel\nforever start /www/wwwroot/node/waline/node_modules/@waline/vercel/vanilla.js\n
  • 打开网页管理后台,通过导入事先备份的 JSON 文件来还原数据。

  • ',3),y=(0,s.IL)('

    新手可以使用宝塔面板的 Node.js 版本管理器来部署 Node.js。安装后,受限更新版本列表,然后选择要使用的 Node 版本,将其设置为命令行版本,接着配置服务器的环境变量。虽然宝塔可以管理 Node 项目,但容易出现错误。处理流程为进入「网站」>「Node 项目」>「添加 Node 项目」,将启动选项设置为模块内的 vanilla.js 文件,将项目端口设置为 8360,并设置绑定域名。

    注意:如果你选择手动部署反向代理服务器,请务必使用 Waline 官方提供的 Nginx 配置文件,否则可能会导致无法登录后台,或是版本升级后仍然提示升级等问题。如果仍然有问题,请检查是否使用 SSH 直连服务器,而非宝塔自带网页终端。宝塔网页终端执行的命令有几率出错,一定要使用正常的 SSH 链接。

    server\n{\n  listen 80;\n  listen 443 ssl http2;\n  server_name waline.newzone.top;\n  root /www/wwwroot/waline;\n  if ($server_port !~ 443){\n    rewrite ^(/.*)$ https://$host$1 permanent;\n  }\n\n  # SSL setting\n  ssl_certificate    /www/server/panel/vhost/cert/waline/fullchain.pem;\n  ssl_certificate_key    /www/server/panel/vhost/cert/waline/privkey.pem;\n  ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;\n  ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;\n  ssl_prefer_server_ciphers on;\n  ssl_session_cache shared:SSL:10m;\n  ssl_session_timeout 10m;\n  add_header Strict-Transport-Security "max-age=31536000";\n\n  # proxy to 8360\n  location / {\n    proxy_pass http://127.0.0.1:8360;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_set_header REMOTE-HOST $remote_addr;\n    add_header X-Cache $upstream_cache_status;\n    # cache\n    add_header Cache-Control no-cache;\n    expires 12h;\n  }\n}\n

    导入时间处理

    如果 Waline 数据导入还原后,评论发布时间被重置为当前时间,则说明时间格式不兼容。以下以 LeanCloud 转 MySQL 为例:

    ',5),S=(0,s.QD)("code",null,"2023-03-24T17:27:28.121Z",-1),Y={href:"https://web-platform-dzhkey.stackblitz.io",target:"_blank",rel:"noopener noreferrer"},C=(0,s.QD)("code",null,"[{},{}……,{}]",-1),L={href:"https://www.convertjson.com/json-to-sql.htm#",target:"_blank",rel:"noopener noreferrer"},x=(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("在 json2sql 页面中,点击按钮「Format JSON」,然后按截图勾选「Still not happy」「Enclose field names」「Backtick ("),(0,s.QD)("code",null,"name"),(0,s.mY)(")」,取消勾选第一个值的 key。同时,取消勾选 objectId 的「Include」,该项将不会导入数据库。")]),(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://img.newzone.top/2023-03-24-16-52-57.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption")])],-1),W=(0,s.QD)("li",null,[(0,s.QD)("p",null,"将「Schema.Table or View Name」依次设为「`wl_Comment`」「`wl_Counter`」「`wl_Users`」,取消勾选「Create Table/View」。")],-1),V=(0,s.QD)("li",null,[(0,s.QD)("p",null,"在 Step 3: Generate output 下点击按钮「JSON TO SQL Insert」,然后点击复制按钮。")],-1),q=(0,s.QD)("li",null,[(0,s.QD)("p",null,"进入 phpMyAdmin 数据库后台,选中要操作的表(如 wl_Comment),点击右侧的 SQL 按钮运行 SQL 查询,将复制的内容粘贴到此,并点击执行。若无报错,则说明数据导入正常。")],-1),G=(0,s.IL)('

    处理后时间可以正常导入,但由于 id 结构不同,旧的评论回复将失去联系。

    Gitalk

    Gitalk 是轻量化的评论组件,用户必须登录 github 才能评论,适合项目类使用。

    https://github.com/settings/developers 页面管理已建的应用,获取 Client ID 和 Client secrets,修改应用链接。[2]

    将以下代码复制粘贴至 docsify 页面,即可启动 Gitalk:

    <link rel="stylesheet" href="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-y/gitalk/1.7.2/gitalk.min.css">\n\n<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/docsify/4.12.2/plugins/gitalk.min.js"></script>\n<script src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-y/gitalk/1.7.2/gitalk.min.js"></script>\n<script>\n    /* 使用下面的 Javascript 代码生成 gitalk 插件 */\n    const gitalk = new Gitalk({\n        clientID: '2f3da234d27ed9a7c290',\n        clientSecret: 'd64c45594858477fff0c234c3ed3947a53b0a9ac',\n        repo: 'docsifytalk',        //仓库名称 (GitHub repo)\n        owner: 'rockbenben',        //仓库拥有者 (GitHub repo owner)\n        admin: ['rockbenben'],      //仓库所有者和协作者。(对此存储库具有写访问权的用户)\n        // id: location.pathname,   // Ensure uniqueness and length less than 50\n        distractionFreeMode: false  // Facebook-like distraction free mode\n    })\n</script>\n

    Gitalk 缺点:

    • 每次有新页面时,都需要登录 github 初始化评论区。
    • 域名不能改变,Homepage URL 和 Authorization callback URL 需与你的 Gitalk 页面一致,否则页面会报错,提示初始化,无法登录 github。

    ',9),j={class:"footnotes"},E={class:"footnotes-list"},T={id:"footnote1",class:"footnote-item"},H={href:"https://waline.js.org/guide/database.html#mysql",target:"_blank",rel:"noopener noreferrer"},A=(0,s.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),N={id:"footnote2",class:"footnote-item"},K={href:"https://blog.csdn.net/qq_39052513/article/details/108291272",target:"_blank",rel:"noopener noreferrer"},M=(0,s.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),z={},O=(0,a(9720).c)(z,[["render",function(e,n){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[t,l,(0,s.QD)("ul",null,[(0,s.QD)("li",null,[(0,s.QD)("a",i,[(0,s.mY)("Waline"),(0,s.K2)(a)]),(0,s.mY)(":基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。")]),(0,s.QD)("li",null,[(0,s.QD)("a",r,[(0,s.mY)("Valine"),(0,s.K2)(a)]),(0,s.mY)(":快速、简洁且高效的无后端评论系统,可匿名互动。")]),(0,s.QD)("li",null,[(0,s.QD)("a",o,[(0,s.mY)("giscus"),(0,s.K2)(a)]),(0,s.mY)(":基于 github discussion,近似于论坛。查看 "),(0,s.QD)("a",c,[(0,s.mY)("配置方法"),(0,s.K2)(a)]),(0,s.mY)("。")]),(0,s.QD)("li",null,[(0,s.QD)("a",p,[(0,s.mY)("Gitalk"),(0,s.K2)(a)]),(0,s.mY)(":基于 github commit,需配置独立库用于存储评论。")]),(0,s.QD)("li",null,[(0,s.QD)("a",d,[(0,s.mY)("Gitter"),(0,s.K2)(a)]),(0,s.mY)(":要登录的公共聊天室。样例如:"),(0,s.QD)("a",u,[(0,s.mY)("boardgame"),(0,s.K2)(a)]),(0,s.mY)(","),(0,s.QD)("a",m,[(0,s.mY)("regauge"),(0,s.K2)(a)]),(0,s.mY)("。")])]),v,b,(0,s.QD)("p",null,[(0,s.mY)("Vercel 项目中选择「Overview」>「Settings」>「Environment Variables」,然后按照 "),(0,s.QD)("a",h,[(0,s.mY)("Waline 评论通知"),(0,s.K2)(a)]),(0,s.mY)("配置所需环境变量。如果需要 Webhook 等更多通知方式,则查看 "),(0,s.QD)("a",g,[(0,s.mY)("Waline 服务端配置"),(0,s.K2)(a)]),(0,s.mY)("。配置成功后,选择「Overview」>「Deployments」,进行 Redeploy,重新部署后环境变量和评论通知方会生效。目前 "),k,(0,s.mY)(" 域名已经被 DNS 污染,会出现「无法加载评论」,国内使用建议绑定自定义域名,域名对备案暂无硬性要求。")]),f,w,(0,s.QD)("ol",null,[(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("新建数据库,并导入 "),(0,s.QD)("a",D,[(0,s.mY)("waline.sql"),(0,s.K2)(a)]),(0,s.mY)(" 以完成表和表结构的创建,之后在项目中配置如下环境变量。"),_])]),Q]),y,(0,s.QD)("ol",null,[(0,s.QD)("li",null,[(0,s.QD)("p",null,[S,(0,s.mY)(' 这个时间戳中的格式 "T" 和 "Z" 不被 MySQL 支持,要将 "T" 替换为空格并将 "Z" 删除。我写了个'),(0,s.QD)("a",Y,[(0,s.mY)("网页工具"),(0,s.K2)(a)]),(0,s.mY)("处理时间格式替换。")])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.mY)("提取数据中的 Comment、Counter 和 Users,格式为 "),C,(0,s.mY)(",依次复制到 "),(0,s.QD)("a",L,[(0,s.mY)("json2sql"),(0,s.K2)(a)]),(0,s.mY)(" 进行操作。")])]),x,W,V,q]),G,(0,s.QD)("section",j,[(0,s.QD)("ol",E,[(0,s.QD)("li",T,[(0,s.QD)("p",null,[(0,s.QD)("a",H,[(0,s.mY)("Waline 多数据库服务支持"),(0,s.K2)(a)]),(0,s.mY)(),A])]),(0,s.QD)("li",N,[(0,s.QD)("p",null,[(0,s.QD)("a",K,[(0,s.mY)("超 Nice 的评论组件 —— Gitalk"),(0,s.K2)(a)]),(0,s.mY)(),M])])])])])}]]),R=JSON.parse('{"path":"/web/Comments.html","title":"评论插件","lang":"zh-CN","frontmatter":{"article":false,"title":"评论插件","icon":"comment","order":3,"description":"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。 评论插件 Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。 Valine:快速、简洁且高效...","head":[["meta",{"property":"og:url","content":"https://newzone.top/web/Comments.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"评论插件"}],["meta",{"property":"og:description","content":"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。 评论插件 Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。 Valine:快速、简洁且高效..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-03-24-16-52-57.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-07-19T22:15:16.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"评论插件"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-07-19T22:15:16.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"评论插件\\",\\"description\\":\\"LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。 评论插件 Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。 Valine:快速、简洁且高效...\\"}"]]},"headers":[{"level":2,"title":"评论插件","slug":"评论插件","link":"#评论插件","children":[]},{"level":2,"title":"Waline","slug":"waline","link":"#waline","children":[{"level":3,"title":"手动部署","slug":"手动部署","link":"#手动部署","children":[]}]},{"level":2,"title":"导入时间处理","slug":"导入时间处理","link":"#导入时间处理","children":[]},{"level":2,"title":"Gitalk","slug":"gitalk","link":"#gitalk","children":[]}],"git":{"createdTime":1658535624000,"updatedTime":1689804916000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":22}]},"readingTime":{"minutes":5.38,"words":1613},"filePathRelative":"web/Comments.md","localizedDate":"2022年7月23日","excerpt":"

    LearnData 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。

    \\n

    评论插件

    \\n
      \\n
    • Waline:基于 Valine 衍生的简洁、安全的评论系统,部署到 Vercel,可匿名互动,导出评论内容,支持文章表情互动。
    • \\n
    • Valine:快速、简洁且高效的无后端评论系统,可匿名互动。
    • \\n
    • giscus:基于 github discussion,近似于论坛。查看 配置方法
    • \\n
    • Gitalk:基于 github commit,需配置独立库用于存储评论。
    • \\n
    • Gitter:要登录的公共聊天室。样例如:boardgameregauge
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-736d0536.36c75e18.js b/assets/js/v-736d0536.36c75e18.js deleted file mode 100644 index 2456d240f..000000000 --- a/assets/js/v-736d0536.36c75e18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[568],{9720:(n,a)=>{a.c=(n,a)=>{const t=n.__vccOpts||n;for(const[n,e]of a)t[n]=e;return t}},7152:(n,a,t)=>{t.r(a),t.d(a,{comp:()=>c,data:()=>p});var e=t(3968);const s=(0,e.QD)("p",null,"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。",-1),i={href:"https://docs.gitlab.com/ee/install/docker.html",target:"_blank",rel:"noopener noreferrer"},l=(0,e.IL)('

    部署命令

    GitLab 会占用 4G 内存,初始化部署时间较长,最好等半小时在连接。你可以在服务器上使用 sudo docker logs -f gitlab 来跟踪部署进度。

    部署好后,在服务器上运行 sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password 获取 root 用户的初始随机密码。如果无法用获得的密码登录,可能是因为你的初始化部署有问题,需清空配置文件夹,然后重新部署。

    version: '3.6'\nservices:\n  web:\n    image: 'gitlab/gitlab-ce:latest'\n    container_name: 'gitlab'\n    restart: always\n    hostname: 'gitlab'\n    environment:\n      TZ: 'Asia/Shanghai'\n      GITLAB_OMNIBUS_CONFIG: |\n        external_url 'http://192.168.2.3:49140'\n        gitlab_rails['gitlab_shell_ssh_port'] = 49142\n    ports:\n      - '49140:49140'\n      - '49142:22'\n    volumes:\n      - /volume1/docker/GitLab/config:/etc/gitlab\n      - /volume1/docker/GitLab/logs:/var/log/gitlab\n      - /volume1/docker/GitLab/data:/var/opt/gitlab\n    shm_size: '256m'\n

    初始配置

    SourceTree、GitHub Desktop 均支持管理 GitLab 项目,操作类似。注意,如果本地已经建好了项目,先不要在 GitLab 网页上建立任何数据,直接上传就好,否则容易报错。

    以下是命令行的初始配置步骤:

    1. 在 GitLab 上创建新仓库

      • 登录到您的 GitLab 实例。
      • 创建一个新的仓库(Project)。在仓库创建页面上,填写必要的信息,例如仓库名称、描述等。
    2. 在本地初始化 Git 仓库

      • 打开终端或命令提示符。
      • 导航到您的项目文件夹:cd 路径到您的项目文件夹
      • 初始化 Git 仓库:git init
      • 添加文件到仓库:git add . (这会添加所有文件,如果只想添加特定文件,可以用git add 文件名
    3. 配置 Git 仓库

      • 设置您的用户信息(如果之前没有设置的话):
        • git config --global user.name "您的名字"
        • git config --global user.email "您的邮箱"
      • 提交您的更改:git commit -m "首次提交"
    4. 将本地仓库关联到 GitLab

      • 获取您在 GitLab 上创建的仓库的 URL。这通常是http://您的NAS地址/用户名/仓库名.git
      • 在终端中关联 GitLab 仓库:git remote add origin 仓库URL
    5. 上传代码到 GitLab

      • 推送代码到 GitLab:git push -u origin master(或者如果您使用的是 main 分支,就是git push -u origin main
      • 初始推送会提示你输入账户密码。
    6. 后续更新

      • 以后当您进行了更多的更改并想要上传这些更改时,您只需要运行git add .git commit -m "更新信息"git push

    常用功能

    比较提交:先进入项目并选择“提交”。接着选择需要比较的提交版本,并点击右侧的“浏览文件”。然后点击顶部的“比较”按钮,接着点击中间的“交换”按钮,再点击“比较”。这样便可将所选提交版本与当前版本进行比较,查看整体修改内容。此功能适用于同一文件多次修改的情况,方便直接查看经过多次修改后,版本的整体变更情况。

    ',10),o={},c=(0,t(9720).c)(o,[["render",function(n,a){const t=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[s,(0,e.QD)("p",null,[(0,e.QD)("a",i,[(0,e.mY)("GitLab"),(0,e.K2)(t)]),(0,e.mY)(" 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。")]),l])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/gitlab.html","title":"GitLab:私有化版本控制","lang":"zh-CN","frontmatter":{"article":false,"title":"GitLab:私有化版本控制","order":103,"description":"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。 GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。 部署命令 GitLab 会占用 4G 内存,初始化部署时间较长...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/gitlab.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"GitLab:私有化版本控制"}],["meta",{"property":"og:description","content":"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。 GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。 部署命令 GitLab 会占用 4G 内存,初始化部署时间较长..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"GitLab:私有化版本控制\\",\\"description\\":\\"Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。 GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。 部署命令 GitLab 会占用 4G 内存,初始化部署时间较长...\\"}"]]},"headers":[{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]},{"level":2,"title":"初始配置","slug":"初始配置","link":"#初始配置","children":[]},{"level":2,"title":"常用功能","slug":"常用功能","link":"#常用功能","children":[]}],"git":{"createdTime":1706004554000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.76,"words":829},"filePathRelative":"services/dockers-on-nas/gitlab.md","localizedDate":"2024年1月23日","excerpt":"

    Git 是版本控制的最佳方法。我的博客和开源软件都是部署在 GitHub 上,但有些含有私钥的代码不希望部署在外网,因此选择使用 GitLab 镜像私有化部署到本地。

    \\n

    GitLab 功能与 GitHub 类似,提供了集成/持续部署(CI/CD)和项目管理工具,适合用于源代码管理和版本控制。

    \\n

    部署命令

    \\n

    GitLab 会占用 4G 内存,初始化部署时间较长,最好等半小时在连接。你可以在服务器上使用 sudo docker logs -f gitlab 来跟踪部署进度。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7434cae5.288cc8db.js b/assets/js/v-7434cae5.288cc8db.js deleted file mode 100644 index 7b60cce44..000000000 --- a/assets/js/v-7434cae5.288cc8db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5640],{9720:(e,t)=>{t.c=(e,t)=>{const p=e.__vccOpts||e;for(const[e,a]of t)p[e]=a;return p}},2988:(e,t,p)=>{p.r(t),p.d(t,{comp:()=>o,data:()=>i});var a=p(3968);const n=[(0,a.IL)('

    够吃吗?还能买到东西吗?

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    但真是这样吗?我真的生活在「上海」吗?

    亲身体验 VS 网上「上海」

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    4 月 5 日,小区团购群兴起,开始大量采购,物资可维持三周。同时,街道开始小量发放物资。

    4 月 10 日后,街道开始加大物资发放量,甚至包括厕纸、沐浴露。我完全没想到,街道发这么多物资。其中的蔬菜无法长时间保存,我开始自学做酱菜和蔬菜饼。物资可维持一个月。

    街道发放的部分物资
    街道发放的部分物资

    此时,网上的上海则是另一个世界。“混乱,吃不了饭,快饿死?”

    因为这些谣传,家人、朋友、甚至网友都开始问文章开头的话。「够吃吗?还能买到东西吗?」

    幸存者偏差

    难道物资充足只是我个人的感受,其他人都处于物资短缺的状态吗?

    接着,我问了同在上海的朋友。大家反馈,物资都没我多,但基本的生活是能满足,最少能吃饱。

    那为什么网上关于上海的现状都是「没人管,没吃的」?

    我开始大量查看上海疫情的相关资讯,发现是「幸存者偏差」放大了上海的物资短缺。

    幸存者偏差(Survivorship Bias),人们所获得的有些信息可能会因为信息的提供方的匮乏(只有那些“幸存”下来的人会提供信息,“死人不会说话”),而使得由这些信息得出的结论缺乏普适性。但人们往往会忽视这一点,忽视而把获得的信息过度概括。

    4 月开始,上海 2500 万人全部进入封控状态。这一庞大的供给需求一下子砸到街道社区头上,基层组织关系接近崩溃。

    大多数物资储备充足,能网上抢菜的人,安静地在家封控,自然也不会在网上发言。

    可是,老人等弱势群体大都未接到物资储备的消息,也缺少线上抢购手段,只能通过尽可能多的渠道发声来求救。

    2500 万人即使只有万分之一的遗漏,也有 2500 人遇到困难。

    当这批人开始发声,就形成了「饥饿的上海」形象,这也就是为什么舆论中的上海与实际生活完全不同的原因。

    那么,排除掉「幸存者偏差」因素,上海真实在发生什么?

    上海的困难

    时代中的一粒灰,落在个人头上,就是一座山。

    除了初期的物资匮乏,上海面临的困难还远不止此,核酸混乱、政策多变、食品安全、物价高企、就医困难,都是摆在上海人面前的大山。

    当这些消息集中释放后,即使不是当事人也感到极度压抑。估计解除封控后,大家都得去心理咨询了。

    居家隔离前,我觉得隔离也不错,有吃有喝,还白拿工资。之前,我甚至还写了一篇文章,认为浦东封控放假,而浦西就得住在公司加班,不公平。

    但是,当亲身体验到长时间隔离,才知道失去自由的代价高于一切。

    上海真正面临的困难,是长时间隔离带来的压抑情绪。这是每个上海居民面临的最大困难。物资已经逐渐充裕,困难也逐渐克服,但压抑的情绪却一直在紧绷。

    东方台当时搞抗疫晚会,想必也是想给长时间封控在家里的我们带来一些振奋的情绪吧。

    但它没理解,我们需要的不是晚会,而是真正的好消息 - 疫情结束

    疫情中的希望

    为了写这篇文章,看了许多上海疫情所发生的悲剧,我的情绪也完全进入低谷。可想而知,当事人得有多么痛苦。

    但对普通人,希望大家别去关注,这些坏消息真的会让人抑郁。当这股压抑情绪来临时,我真切地感受到「什么是灾民」。这不是物质上的匮乏,而是精神上的压抑,这给人的创伤更大。开始理解,被网暴的上海女儿为什么要自杀了,想必是压抑至极又碰上网暴而无法承受。

    希望歧视上海的段子能少些,压抑的情绪中已经到了临界。

    希望正能量的消息能多些,我们此刻真的很需要一点激励。

    希望上海疫情能早点结束,让生活恢复正常。

    也希望疫情结束后,上海能好好复盘,记住教训,不要让历史重演。

    ',39)],r={},o=(0,p(9720).c)(r,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div",null,n)}]]),i=JSON.parse('{"path":"/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html","title":"上海没吃的?割裂的城市,我真的生活在上海吗?","lang":"zh-CN","frontmatter":{"title":"上海没吃的?割裂的城市,我真的生活在上海吗?","subtitle":"疫情中的幸存者偏差思考及压抑情绪","date":"2022-04-20T00:00:00.000Z","category":["观察随笔"],"tag":["幸存者偏差","疫情"],"order":-44,"description":"够吃吗?还能买到东西吗? 所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。 但真是这样吗?我真的生活在「上海」吗? 亲身体验 VS 网上「上海」 3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"上海没吃的?割裂的城市,我真的生活在上海吗?"}],["meta",{"property":"og:description","content":"够吃吗?还能买到东西吗? 所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。 但真是这样吗?我真的生活在「上海」吗? 亲身体验 VS 网上「上海」 3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-04-20-21-43-24.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"上海没吃的?割裂的城市,我真的生活在上海吗?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"幸存者偏差"}],["meta",{"property":"article:tag","content":"疫情"}],["meta",{"property":"article:published_time","content":"2022-04-20T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"上海没吃的?割裂的城市,我真的生活在上海吗?\\",\\"image\\":[\\"https://img.newzone.top/2022-04-20-21-43-24.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2022-04-20T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"亲身体验 VS 网上「上海」","slug":"亲身体验-vs-网上「上海」","link":"#亲身体验-vs-网上「上海」","children":[]},{"level":2,"title":"幸存者偏差","slug":"幸存者偏差","link":"#幸存者偏差","children":[]},{"level":2,"title":"上海的困难","slug":"上海的困难","link":"#上海的困难","children":[]},{"level":2,"title":"疫情中的希望","slug":"疫情中的希望","link":"#疫情中的希望","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":4.82,"words":1447},"filePathRelative":"_posts/2022-04-20-survivorship_bias_in_shanghai_2022.md","localizedDate":"2022年4月20日","excerpt":"

    够吃吗?还能买到东西吗?

    \\n

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    \\n

    但真是这样吗?我真的生活在「上海」吗?

    \\n

    亲身体验 VS 网上「上海」

    \\n

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    \\n

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-752cb4e8.d82fc291.js b/assets/js/v-752cb4e8.d82fc291.js deleted file mode 100644 index bf93b546d..000000000 --- a/assets/js/v-752cb4e8.d82fc291.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9e3],{9720:(e,t)=>{t.c=(e,t)=>{const r=e.__vccOpts||e;for(const[e,a]of t)r[e]=a;return r}},9552:(e,t,r)=>{r.r(t),r.d(t,{comp:()=>n,data:()=>s});var a=r(3968);const o={},n=(0,r(9720).c)(o,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div")}]]),s=JSON.parse('{"path":"/tag/wordpress/","title":"标签: WordPress","lang":"zh-CN","frontmatter":{"title":"标签: WordPress","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"WordPress","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/wordpress/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: WordPress"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: WordPress\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-763ef4c0.77369798.js b/assets/js/v-763ef4c0.77369798.js deleted file mode 100644 index 0694b1b33..000000000 --- a/assets/js/v-763ef4c0.77369798.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5768],{9720:(e,n)=>{n.c=(e,n)=>{const s=e.__vccOpts||e;for(const[e,a]of n)s[e]=a;return s}},5208:(e,n,s)=>{s.r(n),s.d(n,{comp:()=>p,data:()=>l});var a=s(3968);const o=(0,a.QD)("p",null,"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。",-1),t=(0,a.QD)("code",null,"Run, PowerShell.exe -NoExit -Command &{docsify serve --port 3030}, D:\\web\\marketing",-1),c={href:"https://github.com/rockbenben/docsify-docker",target:"_blank",rel:"noopener noreferrer"},r=(0,a.IL)('

    以下是通过 Docker 部署 Docsify 的命令,这可以让你轻松地在任何支持 Docker 的环境中部署自己的私密文件服务器:

    version: "3.8"\n\nservices:\n  docsify:\n    container_name: docsify-server\n    image: rockben/docsify-server\n    volumes:\n      - /volume1/docker/docsify/docs:/docs\n    ports:\n      - "3310:3000"\n    restart: unless-stopped\n

    这个 Docker 配置文件定义了一个服务 docsify

    • volumes 映射了本地的文档目录到容器内,使得容器可以访问并展示这些 Markdown 文件。
    • ports 将容器的 3000 端口映射到本地的 3310 端口,你可以通过访问本地的 3310 端口来查看文档。

    通过以上步骤,我们可以轻松地利用 Docsify 和 Docker 构建一个私密且高效的文件服务器。这不仅简化了我们的工作流程,还提高了文档管理的安全性和便捷性。无论是个人笔记、团队协作文件还是企业内部资料,利用这种方法,你都能享受到快速、安全且易于管理的文档服务。现在,尝试动手实践,为你的文档管理带来一场革新吧!

    如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',6),i={},p=(0,s(9720).c)(i,[["render",function(e,n){const s=(0,a.E1)("ExternalLinkIcon");return(0,a.Wz)(),(0,a.An)("div",null,[o,(0,a.QD)("p",null,[(0,a.mY)("起初,我通过一个 ahk 脚本在开机时执行 "),t,(0,a.mY)(" 命令来启动 Docsify 服务。虽然这种方法能够工作,但启动和维护过程相对繁琐。为了提高效率并实现更好的部署方式,我转向了 Docker 技术,并构建了一个名为 "),(0,a.QD)("a",c,[(0,a.mY)("docsify-docker"),(0,a.K2)(s)]),(0,a.mY)(" 的项目。这个项目不仅简化了部署流程,还能自动检测 docsify-cli 的更新,确保文档服务器始终保持最新状态。")]),r])}]]),l=JSON.parse('{"path":"/services/dockers-on-nas/docsify.html","title":"Docsify:私密文件服务器","lang":"zh-CN","frontmatter":{"article":false,"title":"Docsify:私密文件服务器","order":103,"description":"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。 起初,我通过一个 ahk 脚本在开机时执行 Run, ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/docsify.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Docsify:私密文件服务器"}],["meta",{"property":"og:description","content":"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。 起初,我通过一个 ahk 脚本在开机时执行 Run, ..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Docsify:私密文件服务器\\",\\"description\\":\\"在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。 起初,我通过一个 ahk 脚本在开机时执行 Run, ...\\"}"]]},"headers":[],"git":{"createdTime":1706617187000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.93,"words":578},"filePathRelative":"services/dockers-on-nas/docsify.md","localizedDate":"2024年1月30日","excerpt":"

    在日常工作中,我需要管理大量以 Markdown 格式编写的笔记和文档。这些资料往往包含敏感信息,不适合公开分享,但我又希望能有一个方便的方式来查看和管理这些文档。Docsify 是一个轻量级的文档网站生成器,支持将 Markdown 文件即时转换为网页格式,非常适合作为个人或团队的文档查看工具。

    \\n

    起初,我通过一个 ahk 脚本在开机时执行 Run, PowerShell.exe -NoExit -Command &{docsify serve --port 3030}, D:\\\\web\\\\marketing 命令来启动 Docsify 服务。虽然这种方法能够工作,但启动和维护过程相对繁琐。为了提高效率并实现更好的部署方式,我转向了 Docker 技术,并构建了一个名为 docsify-docker 的项目。这个项目不仅简化了部署流程,还能自动检测 docsify-cli 的更新,确保文档服务器始终保持最新状态。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-782b8506.7a6d98d7.js b/assets/js/v-782b8506.7a6d98d7.js deleted file mode 100644 index a39c0cc96..000000000 --- a/assets/js/v-782b8506.7a6d98d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1144],{9720:(n,a)=>{a.c=(n,a)=>{const s=n.__vccOpts||n;for(const[n,e]of a)s[n]=e;return s}},1292:(n,a,s)=>{s.r(a),s.d(a,{comp:()=>m,data:()=>f});var e=s(3968);const t={href:"https://logseq.com/",target:"_blank",rel:"noopener noreferrer"},o=(0,e.IL)('

    另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week "journals"} 被报错。继续尝试设计周记、月报的模板。

    Logseq 劣势,所有页面建立在 pages 下,但可以手动修改位置。双链笔记有个特点,只要名称不变,文档位置更改也不会影响引用。

    我会把远期不安排的任务,往 later 清单中放,随时可以查看提醒,但又不需要每天重复调整时间。

    标签使用

    在之前,我习惯按笔记领域中使用各种标签,例如 #tool#docker,但这反而使管理变得繁琐。

    现在,除了常见的标签外,我开始使用工具或项目的名称作为标记,例如 #learndata#logseq。这样能更直观地找到相关的笔记。

    快速使用

    • [[]] 可快速新建页面,All pages 中可删除空页面
    • 打开右上角的「侧边栏」,使用目录管理主页面
    • 将页面中内容汇总起来,比如「心理学」标签页面显示所有心理学
    • 任务时,使用 later 或 now,切换后改变状态,会记录任务持续时间。
      • 如果使用 doing 或者 now 命令,它会更显眼地出现在每天日志的下方(如红框所示),以防当天记录的东西过多,或者到了第二天生成了新的日志后被忽略。直到你将它完成为止,它才会消失,算是一种强提醒。
    • PDF 文档的标注管理一直是个大难题,而用 Logseq 后方便许多,能将注释与标签、笔记、截图统合在一起。
    • TOC Generator 插件生成目录:{{renderer :tocgen}}
    • shift+左键 将新页面打开在右侧边栏中。
    • 忽略指定文件夹?

    query

    ',10),p={href:"https://www.bilibili.com/video/BV1eq4y1N7Su",target:"_blank",rel:"noopener noreferrer"},c={href:"https://docs.logseq.com/#/page/queries",target:"_blank",rel:"noopener noreferrer"},i=(0,e.IL)('

    首先,在文本后方添加 tag,比如

    idea 1 #idea\nfind #research\n

    接着,使用 query 命令寻找对应结果

    * and 命令\n{{query (and [[research]] [[idea]])}}\n{{query (and (task now later done) [[page]])}}\n\n* or 命令\n{{query (or [[page 1]] [[page 2]])}}\n\n* not 命令\n{{query (not [[page 1]] [[page 2]])}}\n\n* 罗列为 Later 的 task\n{{query (task later)}}\n\n* 一周内的日记,且包含关键词或标签\n{{query(and (between -6d today)  "#幸福")}}\n

    ',5),l={class:"footnotes"},u={class:"footnotes-list"},r={id:"footnote1",class:"footnote-item"},d={href:"https://thinkstack.club/how-to-set-up-an-automated-daily-template-in-logseq/",target:"_blank",rel:"noopener noreferrer"},k=(0,e.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),g={},m=(0,s(9720).c)(g,[["render",function(n,a){const s=(0,e.E1)("ExternalLinkIcon");return(0,e.Wz)(),(0,e.An)("div",null,[(0,e.QD)("p",null,[(0,e.mY)("与 Obsidian 相比,"),(0,e.QD)("a",t,[(0,e.mY)("Logseq"),(0,e.K2)(s)]),(0,e.mY)(" 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。")]),o,(0,e.QD)("p",null,[(0,e.QD)("a",p,[(0,e.mY)("query"),(0,e.K2)(s)]),(0,e.mY)(" 能按条件精准地找到结果,并动态更新在页面中,公式参考"),(0,e.QD)("a",c,[(0,e.mY)("官方文档"),(0,e.K2)(s)]),(0,e.mY)("。")]),i,(0,e.QD)("section",l,[(0,e.QD)("ol",u,[(0,e.QD)("li",r,[(0,e.QD)("p",null,[(0,e.QD)("a",d,[(0,e.mY)("How to Set Up an Automated Daily Template in Logseq"),(0,e.K2)(s)]),(0,e.mY)(),k])])])])])}]]),f=JSON.parse('{"path":"/apps/tutorials/logseq.html","title":"Logseq","lang":"zh-CN","frontmatter":{"article":false,"title":"Logseq","order":1,"description":"与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。 另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\"journal...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/logseq.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Logseq"}],["meta",{"property":"og:description","content":"与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。 另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\"journal..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-11-15-22-31.png?imageMogr2/format/webp?imageMogr2/format/webp/thumbnail/600x"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-12-11T07:26:19.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Logseq"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2023-12-11T07:26:19.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Logseq\\",\\"description\\":\\"与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。 另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\\\\\"journal...\\"}"]]},"headers":[{"level":2,"title":"标签使用","slug":"标签使用","link":"#标签使用","children":[]},{"level":2,"title":"快速使用","slug":"快速使用","link":"#快速使用","children":[]},{"level":2,"title":"query","slug":"query","link":"#query","children":[]}],"git":{"createdTime":1701223097000,"updatedTime":1702279579000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":2}]},"readingTime":{"minutes":2.34,"words":701},"filePathRelative":"apps/tutorials/logseq.md","localizedDate":"2023年11月29日","excerpt":"

    与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。Logseq 更改页面标题,会同步更改所有标签名。

    \\n

    另外,Logseq 的日记非常强大,也可以自动套用指定模板。[1] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week \\"journals\\"} 被报错。继续尝试设计周记、月报的模板。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7a92d314.eea44351.js b/assets/js/v-7a92d314.eea44351.js deleted file mode 100644 index 0d7614465..000000000 --- a/assets/js/v-7a92d314.eea44351.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7012],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,a]of t)o[e]=a;return o}},3824:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>n,data:()=>p});var a=o(3968);const r={},n=(0,o(9720).c)(r,[["render",function(e,t){return(0,a.Wz)(),(0,a.An)("div")}]]),p=JSON.parse('{"path":"/tag/koolproxy/","title":"标签: koolproxy","lang":"zh-CN","frontmatter":{"title":"标签: koolproxy","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"koolproxy","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/koolproxy/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: koolproxy"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: koolproxy\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7be5f476.28986857.js b/assets/js/v-7be5f476.28986857.js deleted file mode 100644 index 75d0a9f9b..000000000 --- a/assets/js/v-7be5f476.28986857.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7072],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},908:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/article/","title":"文章","lang":"zh-CN","frontmatter":{"title":"文章","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"type","key":"article"},"layout":"BlogType","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/article/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"文章"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"文章\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7c2d465b.7e0d2817.js b/assets/js/v-7c2d465b.7e0d2817.js deleted file mode 100644 index 1e05dd9cb..000000000 --- a/assets/js/v-7c2d465b.7e0d2817.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[776],{9720:(e,o)=>{o.c=(e,o)=>{const t=e.__vccOpts||e;for(const[e,a]of o)t[e]=a;return t}},3120:(e,o,t)=>{t.r(o),t.d(o,{comp:()=>ze,data:()=>Ke});var a=t(3968);const n=(0,a.QD)("p",null,"我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。",-1),i=(0,a.QD)("figure",null,[(0,a.QD)("img",{src:"https://img.newzone.top/2022-09-04-11-53-20.png",alt:"",tabindex:"0",loading:"lazy"}),(0,a.QD)("figcaption",null,"丁老头进化旅程")],-1),r=(0,a.QD)("p",null,"Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用 Stable Diffusion,你可以在拥有 6GB 显存显卡,16GB 内存或只依赖 CPU 的电脑上生成图像,并且仅需几秒钟的时间,无需进行预处理或后处理。",-1),l={href:"https://huggingface.co/spaces/stabilityai/stable-diffusion",target:"_blank",rel:"noopener noreferrer"},s={href:"https://beta.dreamstudio.ai/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://wenxin.baidu.com/moduleApi/ernieVilg",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/AbdBarho/stable-diffusion-webui-docker",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/invoke-ai/InvokeAI/blob/main/docs/installation/INSTALL_MAC.md#doesnt-work-anymore",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.charl-e.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://sspai.com/post/75682",target:"_blank",rel:"noopener noreferrer"},h=(0,a.IL)('
    Stable Diffusion 部署流程

    以 Windows 平台为例,本文将依次介绍 Docker 环境配置、Stable Diffusion 安装及基本使用方法。

    Docker 环境配置

    本方案基于 Docker 配置,Docker 实质上是在运行的 Linux 系统中创建了一个隔离的文件环境。因此,Docker 必须部署在基于 Linux 内核的系统上。[1] 对于 Mac 用户,无需特别配置即可使用。而对于 Windows 用户,若想部署 Docker,则需要安装一个虚拟 Linux 环境,配置 WSL 或启用 Hyper-V 二选一。我推荐使用 Windows 子系统 WSL,它需要占用系统盘 30G 的空间。

    安装 WSL

    在管理员 PowerShell 输入命令 wsl --install,之后终端会默认安装 Ubuntu。系统下载时间较长,注意别关机。[2] 安装 Ubuntu 完成后,按提示设置 Ubuntu 账户和密码。

    启用 Hyper-V

    以管理员身份打开 PowerShell 控制台,输入命令 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All[3] 重启电脑后,将开启 Hyper-V。

    Linux 路径(Windows)

    配置 WebUI Docker 要进入 Linux 环境,因此 Windows 用户需要将其路径转换为 Linux 路径。而 Mac 和 Linux 用户则可以忽略此步骤。

    假设容器位于 D:\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker

    1. 把磁盘符号改为小写,并去除磁盘的冒号,转换为 d\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker
    2. 添加 /mnt/ 前缀,转换为 /mnt/d\\Backup\\Libraries\\Desktop\\stable-diffusion-webui-docker。因为 Windows 本地磁盘是挂载在 Linux 的 mnt 目录下的。
    3. 将反斜扛 \\ 替换为 /。最终得到 Linux 路径 /mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker

    配置 Stable Diffusion

    安装 Docker Desktop

    ',14),m={href:"https://docs.docker.com/get-docker/",target:"_blank",rel:"noopener noreferrer"},g=(0,a.QD)("div",{class:"hint-container warning"},[(0,a.QD)("p",{class:"hint-container-title"},"注意"),(0,a.QD)("p",null,[(0,a.mY)("Docker Desktop 需在 4.18.0 或以上版本。Docker Desktop 4.17.1 存在 bug,可能会导致 "),(0,a.QD)("code",null,"Attaching to webui-docker-auto-1"),(0,a.mY)(" 报错。")])],-1),b=(0,a.QD)("h3",{id:"下载-webui-docker",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#下载-webui-docker"},[(0,a.QD)("span",null,"下载 WebUI Docker")])],-1),k={href:"https://github.com/AbdBarho/stable-diffusion-webui-docker/releases/",target:"_blank",rel:"noopener noreferrer"},D={href:"https://www.aliyundrive.com/s/EKmK7MGrHdn",target:"_blank",rel:"noopener noreferrer"},w=(0,a.QD)("h3",{id:"分支介绍",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#分支介绍"},[(0,a.QD)("span",null,"分支介绍")])],-1),v=(0,a.QD)("p",null,[(0,a.mY)("目前,Stable Diffusion Docker 支持 AUTOMATIC1111、InvokeAI、ComfyUI 三种分支。如果需要更换分支,可以修改镜像构建命令 "),(0,a.QD)("code",null,"docker compose --profile [ui] up --build"),(0,a.mY)(" 中的 "),(0,a.QD)("code",null,"[ui]"),(0,a.mY)(",将其替换为所需的镜像名即可。")],-1),x=(0,a.QD)("strong",null,"auto",-1),Q=(0,a.QD)("code",null,"docker compose --profile auto up --build",-1),S=(0,a.QD)("code",null,"--medvram",-1),y=(0,a.QD)("code",null,"--lowvram",-1),I={href:"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs#running-inside-docker",target:"_blank",rel:"noopener noreferrer"},Y=(0,a.IL)("
  • auto-cpu:不依赖显卡的 auto 分支。如果没有符合要求的显卡,可以使用 CPU 模式,内存配置需满足 16G 以上,构建镜像的命令为 docker compose --profile auto-cpu up --build
  • comfy:基于图形的工作流 UI,非常强大,镜像构建命令为 docker compose --profile comfy up --build。comfy 也有不依赖显卡的分支,构建镜像的命令为 docker compose --profile comfy-cpu up --build
  • invoke:原名为 lstein,其 cli 端非常成熟,WebUI 端参数较少,能自动读取图片记录,适合无进阶需求的新手和 Mac 用户使用,镜像构建命令为 docker compose --profile invoke up --build。(最新版 invoke 构建有问题,配置包尚未修复)
  • sygil(已停更):即原本的 hlky, 界面直观,最高分辨率为 1024x1024,镜像构建命令为 docker compose --profile sygil up --build
  • ",4),A=(0,a.IL)('

    构建 Stable Diffusion

    在启动 Docker Desktop 后,打开 WSL(Ubuntu)或 Mac 终端,输入路径切换命令 cd /mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker(路径为 Stable Diffusion WebUI Docker 解压文件目录)。接着,输入以下的部署命令:

    # 自动下载采样模型和依赖包\ndocker compose --profile download up --build\n# 上方命令需要 20 分钟或更长,完成后执行镜像构建命令\n\ndocker compose --profile auto up --build\n# auto 是功能最多的分支,可以选择 auto | auto-cpu | invoke | comfy | comfy-cpu\ndocker compose --profile auto-cpu up --build\ndocker compose --profile comfy up --build\ndocker compose --profile comfy-cpu up --build\ndocker compose --profile invoke up --build\n

    等待构建完成后,在终端中会提示访问 http://localhost:7860/,你就可以在本地电脑上用 AI 生成图片了。[4]

    使用说明

    以下示例以 auto 分支为例,其他分支的主题界面略有不同,但在功能上并没有根本性的差异。

    启动 Stable Diffusion

    1. 打开 Docker Desktop。
    2. 在 Containers 中选中分支容器,点击启动。
    3. 浏览器中访问 http://localhost:7860/
    Docker Desktop 界面

    Text-to-Image

    Text-to-Image(文生图)是 Stable Diffusion 依据文字描述来生成图像的方法。对于崇尚空间结构的画作类型,如风景、创意画等,推荐使用竖图或横图。对于人像类画作,推荐使用 1:1 的方形图像,否则可能会出现多个人脸叠加的情况。生成的图片分辨率受到一定限制,你可以使用 Upscale 对结果图片进行放大处理。

    Text-to-Image 界面

    默认情况下使用的是 Simple 简单模式。如果你想要使用更多的功能,你可以点击右侧的 Advanced 按钮,进入进阶选项。在进阶选项中,你可以使用场景矩阵、面部修复和分辨率放大等多种高级功能。

    Image-to-Image

    Image-to-Image(图生图)是依据文字描述和输入源图来生成相关图像。如果输入源图是 Text-to-Image、素描或结构画,该模式可充分填充图像细节。而如果输入源图是细节充分的照片,生成的结果与原图差异较大。此外,你还可以限定区域来生成图像,这非常适合进行图像修改。

    Image-to-Image 界面

    CLIP interrogator 会根据图像来生成文字描述。Denoising Strength 指与原图的差异度,建议设置在 0.75-0.9 之间。若要魔改图片,可将 Denoising Strength 设为 0.5 或以下。下图中的 Denoising Strength 只有 0.44,整体图片结构及要素未变,但结果如何,你看到了。

    超级魔改图片

    Image-to-Image 还可以用来移除、替换或修复图像,甚至可以将源图作为结果图的一部分,利用 Stable Diffusion 扩展绘画。高精度重绘的采样方法推荐 DPM++ 2S a karrars,并将采样迭代步数调整到 40 以上。

    Image Lab

    Image Lab 有批量修正面孔和放大图片分辨率的功能。

    Fix Faces 是通过 GFPGAN 模型来改善图片中的面孔,Effect strength 滑块可以控制效果的强度。但实际效果别报太高期许,下图右侧开启了 Fix Faces,只能说勉强有了五官。

    A woman flying in the air laughing

    Upscale 可以通过 RealESRGAN、GoBIG、Latent Diffusion Super Resolution 和 GoLatent 四种模型来放大图片分辨率。其中,RealESRGAN 有普通和卡通两种模式,你可以根据需要进行选择。放大图片主要消耗 CPU 和内存资源。

    参数解释

    Classifier Free Guidance

    Classifier Free Guidance (CFG) 的默认值为 7。数字越小,创作自由度越高,模型与 Prompt 相关性越低。CFG 参数不影响所需的 VRAM 或生成时间。

    • CFG 2-6:虽然有创意,但可能不符合提示。
    • CFG 7-10:这些提示适用于大多数情况,既富有创意又具有指导性。
    • CFG 10-15:当你确信 Prompt 足够好、足够具体时可以使用。
    • CFG 16-20:除非提示非常详细,否则不建议使用。这可能会影响连贯性和质量。

    Step

    Step(采样步长/精度)的默认值为 50。Stable Diffusion 通过充满噪音的画布开始创建图像,并逐步去噪以达到最终输出。Step 参数控制这些去噪步骤的数量。通常情况下,越高越好。对于初学者来说,建议使用默认值。Step 参数不影响所需的 VRAM,但 Step 数值的变化会与生成图像的时间成正比。

    Seed

    Seed(种子)的默认值为 -1,代表随机值。Seed 是控制初始噪声的数字,在其他参数固定的情况下,每次生成的图像都会不同,这就是种子的作用。如果你保持提示、种子和所有其他参数不变,你可以得到相同的结果。如果一个 Seed 生成了高质量图片,保存该 Seed 并将其应用到其他图片上,以保持高质量。

    Sampler

    Sampling method/Diffusion Sampler(扩散采样器)是用来在生成图像过程中对图像进行去噪的方法。由于不同的扩散采样器在计算图像下一步的方式不同,因此它们需要不同的持续时间和步骤来生成可用的图像。建议初学者使用 DDIM,因为它速度快,通常只需要 10 步就能生成好的图像,因此可以很容易和快速地进行试验和改进。

    文字描述图像

    Stable Diffusion 通过英文文字内容来描述场景或物体,以此来决定生成的图像中会出现什么。文字描述是决定图像生成质量的关键因素。[5]

    样例:A beautiful painting {画作种类} of a singular lighthouse, shining its light across a tumultuous sea of blood {画面描述} by greg rutkowski and thomas kinkade {画家/画风}, Trending on artstation {参考平台}, yellow color scheme {配色}[6]

    ',38),_={href:"https://prompt.newzone.top/",target:"_blank",rel:"noopener noreferrer"},L=(0,a.IL)('

    常规描述

    1. 输入图像的对象、主体,比如一只熊猫、一个持剑的战士,不要描述动作、情绪和事件[7]
    2. 图像种类:一幅画(a painting of + raw prompt)还是一张照片(a photograph of + raw prompt),或者 Watercolor(水彩)、Oil Paint(油画)、Comic(漫画)、Digital Art(数码艺术)、Illustration(插画)、realistic painting(写实画)、photorealistic(写实照片)、Portrait photogram(肖像照)、Low Poly(低面建模)、3D Item Rende(三维渲染)、sculpture (雕塑) 等等,图像种类可以叠加。
    3. 画家/画风:建议混合多个画家的风格,比如 Studio Ghibli, Van Gogh, Monet,或描述风格种类,比如 very coherent symmetrical artwork,将作品结构设为「连贯且对称」。
    4. 色调:yellow color scheme 指整个画面的主色调为黄色。
    5. 参考平台:Trending on ArtStation,也可以替换为「Facebook」「Pixiv」「Pixbay」等。

    特征描述

    除画面主体外,可以用其他具象物体和形容词来填充画面细节。描述词要具体,讲出你要的物体和它的特征。

    • 次要元素:物体不要太多,两到三个就好。若要特别强调某个元素,可以加很多括号或者惊叹号,比如 beautiful forest background, desert!!, (((sunset))) 中会优先体现「desert」和「sunset」元素。
    • 人物特征:detailed gorgeous face, delicate features, elegant, Googly Eyes, Bone, big tits, silver hair, olive skin, Mini smile
    • 特定润色:insanely detailed and intricate, gorgeous, surrealism, smooth, sharp focus, Painting, Digital Art, Concept Art, Illustration, Artstation, in a symbolic and meaningful style, 8K
    • 光线描述:Natural Lighting, Studio Lighting, Cinematic Lighting, Crepuscular Rays, X-Ray, Backlight
    • 镜头视角:Cinematic, Magazine, Golden Hour, F/22, Depth of Field, Side-View,虚化背景 Bokeh
    • 画面质量:professional, award winning, breathtaking, groundbreaking, superb, outstanding,或虚幻引擎 Unreal Engine
    • 其他描述:细节和纹理、物体占据画面的大小、年代、渲染 / 建模工具等,比如 Vivid Colors(艳丽色彩)。

    prompt 权重

    假设你在提示词中使用了 mountain,生成的图像很可能会有树。但如果你想要生成没有树的山的图像,可以使用 mountain | tree:-10。其中 tree:-10 表示对于树的权重非常负,因此生成的图像中不会出现树。通过权重词,我们还能生成更复杂的图像,例如 A planet in space:10 | bursting with color red, blue, and purple:4 | aliens:-10 | 4K, high quality[8]

    Prompt 中的词语顺序代表其权重,越靠前权重越大。如若某物未出现在图像中,可以将该名词放在首位。

    否定提示

    auto/auto-cpu 分支中可以设置 Negative prompt(否定提示),以避免画面中出现指定元素。

    • 修正畸形:disfigured, deformed hands, blurry, grainy, broken, cross-eyed, undead, photoshopped, overexposed, underexposed, lowres, bad anatomy, bad hands, extra digits, fewer digits, bad digit, bad ears, bad eyes, bad face, cropped: -5
    • 避免裸体:nudity, bare breasts
    • 避免黑白照:black and white,monochrome

    prompt 参考

    除画面主体描述外,其他要素并非必须。如果你只是简单尝试,输入主体「apples」即可。

    ',13),G={href:"https://promptomania.com/stable-diffusion-prompt-builder/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://weirdwonderfulai.art/resources/disco-diffusion-modifiers/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://prompthero.com/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://openart.ai/",target:"_blank",rel:"noopener noreferrer"},K=(0,a.QD)("blockquote",null,[(0,a.QD)("p",null,"goddess close-up portrait skull with mohawk, ram skull, skeleton, thorax, x-ray, backbone, jellyfish phoenix head, nautilus, orchid, skull, betta fish, bioluminiscent creatures, intricate artwork by Tooth Wu and wlop and beeple, highly detailed, digital painting, Trending on artstation, very coherent symmetrical artwork, concept art, smooth, sharp focus, illustration, 8k")],-1),C=(0,a.QD)("h2",{id:"prompt-matrix",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#prompt-matrix"},[(0,a.QD)("span",null,"Prompt matrix")])],-1),W=(0,a.QD)("sup",{class:"footnote-ref"},[(0,a.QD)("a",{href:"#footnote9"},"[9]"),(0,a.QD)("a",{class:"footnote-anchor",id:"footnote-ref9"})],-1),M={href:"https://github.com/HelixNGC7293/DeforumStableDiffusionLocal",target:"_blank",rel:"noopener noreferrer"},R=(0,a.IL)('

    上方视频的调教词为 A mecha robot in World War II in realistic style|Shoot with another mecha robot|Bombed by planes|Missile drop|broken|Repaired|cinematic lighting| 符号后的场景条件将进行排列组合,视频样例有 6 个场景条件生成 64 张图。

    另外,我们可以指定场景条件位置,比如 @(moba|rpg|rts) character (2d|3d) model 表示 (moba|rpg|rts 三选一) character (2d|3d 二选一) model,也就是会生成 3*2 张图片。开头的 @ 是触发指定场景条件位置的符号,不能省略。

    Textual Inversion

    Textual Inversion(文本倒置)是 auto/auto-cpu 分支提供的功能,可以个人定制单词在模型中的含义。比如大众模型中医生多是白人男性,而我们可以输入 5 张亚洲女性照片并将其与 doctor 关联,经过 Textual Inversion 处理后的模型生成的医生形象将以亚洲女性为主。[10]

    Textual Inversion 定制流程:

    1. Preprocess images:设置源图目录和输出目录。
    2. Create embedding(新建嵌入):建立模型属性。
    3. 待续。

    常见问题

    Docker Desktop failed

    未正常安装/关闭 Docker 容器时,可能会报错 Docker Desktop failed to start/stop

    先删除 %AppData% 路径下的 Docker 文件夹,然后在 PowerShell 中输入下方命令,关闭 WSL 和 docker-desktop。最后,手动重启 Docker Desktop。

    wsl --shutdown\nwsl -l -v\nwsl --unregister docker-desktop\nwsl -l -v\n

    Docker Desktop cannot start

    Hardware assisted virtualization and data execution protection must be enabled in the BIOS 报错说明电脑没开启虚拟化。

    在开机的时候多按几次 F2DEL 进入 BIOS,然后设置中开启「Intel Virtual Technology」,AMD 则是将「SVM Support」设置为设置为「Enable」的状态;最后点击「F10」保存退出即可。

    docker 命令失败

    The command 'docker' could not be found 说明当前命令行确实 Docker 环境缺失,检查 Docker Desktop 是否启动。

    Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:7860 -> 0.0.0.0:0: listen tcp 0.0.0.0:7860: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 说明端口启用失败。Windows 可使用 net stop winnat 重置端口,Linux 则使用 sudo fuser -k 7860/tcp

    exited with code 137

    通常来说,exited with code 137 意味着内存不足,超出内存限制导致进程被关闭。建议硬件配置最低为 16G 内存,尤其是在使用 auto-cpu 模式时。

    端口访问被拒

    Docker 容器原本运行正常,端口访问突然被拒绝了,显示 Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:7860 -> 0.0.0.0:0: listen tcp 0.0.0.0:7860: bind: An attempt was made to access a socket in a way forbidden by its access permissions

    在 Powershell 中输入 netsh int ipv4 show excludedportrange protocol=tcp 检查是否处于被排除端口范围,然后输入 reg add HKLM\\SYSTEM\\CurrentControlSet\\Services\\hns\\State /v EnableExcludedPortRange /d 0 /f 开启端口。操作完成后,重启电脑即可解封端口。[11]

    FileNotFoundError

    再次架构容器时报错 FileNotFoundError: [Errno 2] No such file or directory: '/models/model.ckpt',这是架构位置错误导致的。此时,我们需要检查是否通过 WSL 输入的架构命令,并且 Stable Diffusion WebUI Docker 解压路径是否配置正确。

    采样模型

    采样模型是 AI 绘画的核心。2022.09.10 已支持自动下载采样模型,下方列表仅做参考。

    ',26),F={href:"https://www.googleapis.com/storage/v1/b/aai-blog-files/o/sd-v1-4.ckpt?alt=media",target:"_blank",rel:"noopener noreferrer"},B=(0,a.QD)("code",null,"model.ckpt",-1),E={href:"https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth",target:"_blank",rel:"noopener noreferrer"},U={href:"https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.2.4/RealESRGAN_x4plus_anime_6B.pth",target:"_blank",rel:"noopener noreferrer"},V={href:"https://heibox.uni-heidelberg.de/f/578df07c8fc04ffbadf3/?dl=1",target:"_blank",rel:"noopener noreferrer"},H={href:"https://heibox.uni-heidelberg.de/f/31a76b13ea27482981b4/?dl=1",target:"_blank",rel:"noopener noreferrer"},O=(0,a.QD)("code",null,"LDSR.ckpt",-1),Z=(0,a.QD)("code",null,"LDSR.yaml",-1),q=(0,a.QD)("h2",{id:"最后",tabindex:"-1"},[(0,a.QD)("a",{class:"header-anchor",href:"#最后"},[(0,a.QD)("span",null,"最后")])],-1),j=(0,a.QD)("p",null,"尽管 Stable Diffusion 目前还不能作为生产力工具,但它使设计变得更加简单,也为普通人开启了 AI 绘画的可能性。建议你亲自体验,实际部署一下,让自己拥有更多的可能性。",-1),J=(0,a.QD)("hr",{class:"footnotes-sep"},null,-1),X={class:"footnotes"},$={class:"footnotes-list"},ee={id:"footnote1",class:"footnote-item"},oe={href:"https://www.runoob.com/docker/windows-docker-install.html",target:"_blank",rel:"noopener noreferrer"},te=(0,a.QD)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),ae={id:"footnote2",class:"footnote-item"},ne={href:"https://docs.microsoft.com/zh-cn/windows/wsl/install#install-wsl-command",target:"_blank",rel:"noopener noreferrer"},ie=(0,a.QD)("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),re={id:"footnote3",class:"footnote-item"},le={href:"https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v#enable-hyper-v-using-powershell",target:"_blank",rel:"noopener noreferrer"},se=(0,a.QD)("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),pe={id:"footnote4",class:"footnote-item"},ce={href:"https://github.com/AbdBarho/stable-diffusion-webui-docker/wiki/Setup",target:"_blank",rel:"noopener noreferrer"},de=(0,a.QD)("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),fe={id:"footnote5",class:"footnote-item"},ue={href:"https://openart.ai/promptbook",target:"_blank",rel:"noopener noreferrer"},he=(0,a.QD)("a",{href:"#footnote-ref5",class:"footnote-backref"},"↩︎",-1),me={id:"footnote6",class:"footnote-item"},ge={href:"https://www.ifanr.com/app/1484403",target:"_blank",rel:"noopener noreferrer"},be=(0,a.QD)("a",{href:"#footnote-ref6",class:"footnote-backref"},"↩︎",-1),ke={id:"footnote7",class:"footnote-item"},De={href:"https://www.guokr.com/article/462587/",target:"_blank",rel:"noopener noreferrer"},we=(0,a.QD)("a",{href:"#footnote-ref7",class:"footnote-backref"},"↩︎",-1),ve={id:"footnote8",class:"footnote-item"},xe={href:"https://learnprompting.org/docs/Images/weighted_terms",target:"_blank",rel:"noopener noreferrer"},Qe=(0,a.QD)("a",{href:"#footnote-ref8",class:"footnote-backref"},"↩︎",-1),Se={id:"footnote9",class:"footnote-item"},ye={href:"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#prompt-matrix",target:"_blank",rel:"noopener noreferrer"},Ie=(0,a.QD)("a",{href:"#footnote-ref9",class:"footnote-backref"},"↩︎",-1),Ye={id:"footnote10",class:"footnote-item"},Ae={href:"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion",target:"_blank",rel:"noopener noreferrer"},_e=(0,a.QD)("a",{href:"#footnote-ref10",class:"footnote-backref"},"↩︎",-1),Le={id:"footnote11",class:"footnote-item"},Ge={href:"https://github.com/docker/for-win/issues/3171#issuecomment-572571882",target:"_blank",rel:"noopener noreferrer"},Te=(0,a.QD)("a",{href:"#footnote-ref11",class:"footnote-backref"},"↩︎",-1),Pe={},ze=(0,t(9720).c)(Pe,[["render",function(e,o){const t=(0,a.E1)("ExternalLinkIcon"),Pe=(0,a.E1)("BiliBili");return(0,a.Wz)(),(0,a.An)("div",null,[n,i,r,(0,a.QD)("p",null,[(0,a.mY)("想要体验 AI 绘图,你可以使用在线工具 "),(0,a.QD)("a",l,[(0,a.mY)("Hugging Face"),(0,a.K2)(t)]),(0,a.mY)("、"),(0,a.QD)("a",s,[(0,a.mY)("DreamStudio"),(0,a.K2)(t)]),(0,a.mY)(" 或"),(0,a.QD)("a",p,[(0,a.mY)("百度文心"),(0,a.K2)(t)]),(0,a.mY)("。但相对于本地部署来说,Hugging Face 需要排队,生成一张图约 5 分钟;DreamStudio 可以免费生成 200 张图片,之后需要缴费;百度文心能用中文生成图片,但仍处于 beta 阶段,未正式商用。此外,这些在线工具的图片调整功能比较有限,无法批量生成图片,只适用于测试和体验。")]),(0,a.QD)("p",null,[(0,a.mY)("如果你需要生成大量的 AI 图片,可以通过 Docker Desktop 将 "),(0,a.QD)("a",c,[(0,a.mY)("Stable Diffusion WebUI Docker"),(0,a.K2)(t)]),(0,a.mY)(" 部署到家用电脑上,从而实现免费的 AI 文字绘画,并摆脱在线工具的限制。对于 Mac 用户,推荐选择 Stable Diffusion 的 invoke 分支,如果在部署过程中出现错误,你可以参考 "),(0,a.QD)("a",d,[(0,a.mY)("InvokeAI 文档"),(0,a.K2)(t)]),(0,a.mY)("进行排查。对于 M1/M2 Mac 用户,推荐使用更简便的 "),(0,a.QD)("a",f,[(0,a.mY)("CHARL-E"),(0,a.K2)(t)]),(0,a.mY)(" 或 "),(0,a.QD)("a",u,[(0,a.mY)("DiffusionBee"),(0,a.K2)(t)]),(0,a.mY)("。")]),h,(0,a.QD)("p",null,[(0,a.mY)("按平台选 "),(0,a.QD)("a",m,[(0,a.mY)("Docker Desktop"),(0,a.K2)(t)]),(0,a.mY)(" 版本,安装后点击左侧的 Add Extensions,推荐安装 Disk usage 扩展,这将便于管理 Docker 的存储空间。")]),g,b,(0,a.QD)("p",null,[(0,a.mY)("下载 "),(0,a.QD)("a",k,[(0,a.mY)("Stable Diffusion WebUI Docker 配置包"),(0,a.K2)(t)]),(0,a.mY)("或"),(0,a.QD)("a",D,[(0,a.mY)("阿里云盘聚合版"),(0,a.K2)(t)]),(0,a.mY)("(2024.01.22 更新),然后将其解压到指定路径。聚合版包括相关依赖和模型,因此文件较大。如果需要更新 Stable Diffusion WebUI Docker,你可以按照上述步骤重新构建容器。")]),w,v,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[x,(0,a.mY)("(推荐):设置模块最丰富,显示绘画过程,支持随机插入艺术家、参数读取和否定描述,最高分辨率为 2048x2048(高分辨率对显存要求更高),镜像构建命令为 "),Q,(0,a.mY)("。默认使用 6GB 以上的显存,如果你的显卡内存较低,则将配置中的 "),S,(0,a.mY)(" 改为 "),y,(0,a.mY)("。A 卡用户注意修改"),(0,a.QD)("a",I,[(0,a.mY)("显卡设置"),(0,a.K2)(t)]),(0,a.mY)("。")]),Y]),A,(0,a.QD)("p",null,[(0,a.mY)("描述图像需要多种描述,因此我开发了一个开源工具 "),(0,a.QD)("a",_,[(0,a.mY)("IMGPrompt"),(0,a.K2)(t)]),(0,a.mY)(",以便生成图像提示词。")]),L,(0,a.QD)("p",null,[(0,a.mY)("如果你不知道生成什么图像,可以使用 "),(0,a.QD)("a",G,[(0,a.mY)("promptoMANIA"),(0,a.K2)(t)]),(0,a.mY)(" 、"),(0,a.QD)("a",T,[(0,a.mY)("WEIRD WONDERFUL AI ART"),(0,a.K2)(t)]),(0,a.mY)(" 按提示组合描述,或参考 AI 图库 "),(0,a.QD)("a",P,[(0,a.mY)("PromptHero"),(0,a.K2)(t)]),(0,a.mY)(" 和 "),(0,a.QD)("a",z,[(0,a.mY)("OpenArt"),(0,a.K2)(t)]),(0,a.mY)(" 上其他人分享的成品图和描述文案,比如")]),K,C,(0,a.QD)("p",null,[(0,a.mY)("Prompt matrix 可以按不同条件组合生成多张相关但不同的画面,适合用于制作视频素材。"),W,(0,a.mY)(" 此时,批次数量的设置会被忽略。如果你对将图像转化为视频有兴趣,可以尝试使用 "),(0,a.QD)("a",M,[(0,a.mY)("Deforum Stable Diffusion Local Version"),(0,a.K2)(t)]),(0,a.mY)("。")]),(0,a.K2)(Pe,{bvid:"BV1YP411V7vV"}),R,(0,a.QD)("ul",null,[(0,a.QD)("li",null,[(0,a.QD)("a",F,[(0,a.mY)("Stable Diffusion v1.4 (4GB)"),(0,a.K2)(t)]),(0,a.mY)(", 将压缩包文件重命名为 "),B,(0,a.mY)("。")]),(0,a.QD)("li",null,[(0,a.mY)("(可选) "),(0,a.QD)("a",E,[(0,a.mY)("GFPGANv1.4.pth (340MB)"),(0,a.K2)(t)]),(0,a.mY)("。")]),(0,a.QD)("li",null,[(0,a.mY)("(可选) "),(0,a.QD)("a",U,[(0,a.mY)("RealESRGAN_x4plus.pth (64MB)"),(0,a.K2)(t)]),(0,a.mY)(" 和 "),(0,a.QD)("a",N,[(0,a.mY)("RealESRGAN_x4plus_anime_6B.pth (18MB)"),(0,a.K2)(t)]),(0,a.mY)("。")]),(0,a.QD)("li",null,[(0,a.mY)("(可选) "),(0,a.QD)("a",V,[(0,a.mY)("LDSR (2GB)"),(0,a.K2)(t)]),(0,a.mY)(" 和 "),(0,a.QD)("a",H,[(0,a.mY)("LDSR 配置"),(0,a.K2)(t)]),(0,a.mY)(",分别重命名为 "),O,(0,a.mY)(" 和 "),Z,(0,a.mY)("。")])]),q,j,J,(0,a.QD)("section",X,[(0,a.QD)("ol",$,[(0,a.QD)("li",ee,[(0,a.QD)("p",null,[(0,a.QD)("a",oe,[(0,a.mY)("Windows Docker 安装"),(0,a.K2)(t)]),(0,a.mY)(),te])]),(0,a.QD)("li",ae,[(0,a.QD)("p",null,[(0,a.QD)("a",ne,[(0,a.mY)("使用 WSL 在 Windows 上安装 Linux"),(0,a.K2)(t)]),(0,a.mY)(),ie])]),(0,a.QD)("li",re,[(0,a.QD)("p",null,[(0,a.QD)("a",le,[(0,a.mY)("在 Windows 10 上安装 Hyper-V"),(0,a.K2)(t)]),(0,a.mY)(),se])]),(0,a.QD)("li",pe,[(0,a.QD)("p",null,[(0,a.QD)("a",ce,[(0,a.mY)("Setup Stable Diffusion WebUI Docker"),(0,a.K2)(t)]),(0,a.mY)(),de])]),(0,a.QD)("li",fe,[(0,a.QD)("p",null,[(0,a.QD)("a",ue,[(0,a.mY)("Stable Diffusion Prompt Book - OpenArt"),(0,a.K2)(t)]),(0,a.mY)(),he])]),(0,a.QD)("li",me,[(0,a.QD)("p",null,[(0,a.QD)("a",ge,[(0,a.mY)("外网爆火的 4 款「你说我画」自动作画工具,我们测了下,有 1 款的确超强"),(0,a.K2)(t)]),(0,a.mY)(),be])]),(0,a.QD)("li",ke,[(0,a.QD)("p",null,[(0,a.QD)("a",De,[(0,a.mY)("最时髦的 AI 画画,一文包教包会"),(0,a.K2)(t)]),(0,a.mY)(),we])]),(0,a.QD)("li",ve,[(0,a.QD)("p",null,[(0,a.QD)("a",xe,[(0,a.mY)("Learn Prompting: Weighted Terms"),(0,a.K2)(t)]),(0,a.mY)(),Qe])]),(0,a.QD)("li",Se,[(0,a.QD)("p",null,[(0,a.QD)("a",ye,[(0,a.mY)("stable-diffusion Prompt matrix"),(0,a.K2)(t)]),(0,a.mY)(),Ie])]),(0,a.QD)("li",Ye,[(0,a.QD)("p",null,[(0,a.QD)("a",Ae,[(0,a.mY)("Textual Inversion"),(0,a.K2)(t)]),(0,a.mY)(),_e])]),(0,a.QD)("li",Le,[(0,a.QD)("p",null,[(0,a.QD)("a",Ge,[(0,a.mY)("Windows 端口访问被拒"),(0,a.K2)(t)]),(0,a.mY)(),Te])])])])])}]]),Ke=JSON.parse('{"path":"/posts/2022-09-05-stable_diffusion_ai_painting.html","title":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑","lang":"zh-CN","frontmatter":{"title":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑","date":"2022-09-05T00:00:00.000Z","category":["工具"],"tag":["AI","Docker","Stable Diffusion"],"order":-49,"description":"我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。 丁老头进化旅程 Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑"}],["meta",{"property":"og:description","content":"我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。 丁老头进化旅程 Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2022-09-04-11-53-20.png \\"丁老头进化旅程\\""}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"Docker"}],["meta",{"property":"article:tag","content":"Stable Diffusion"}],["meta",{"property":"article:published_time","content":"2022-09-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑\\",\\"image\\":[\\"https://img.newzone.top/2022-09-04-11-53-20.png \\\\\\"丁老头进化旅程\\\\\\"\\",\\"https://img.newzone.top/2022-09-05-16-22-45.png \\\\\\"Stable Diffusion 部署流程\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-18-32-31.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-09-04-17-06-27.png \\\\\\"Docker Desktop 界面\\\\\\"\\",\\"https://img.newzone.top/2022-09-05-08-28-23.png \\\\\\"Text-to-Image 界面\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-15-39-00.png \\\\\\"Image-to-Image 界面\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-15-40-26.png \\\\\\"超级魔改图片\\\\\\"\\",\\"https://img.newzone.top/2022-09-04-15-47-14.png \\\\\\"A woman flying in the air laughing\\\\\\"\\",\\"https://img.newzone.top/2022-09-16-22-33-26.png \\\\\\"相同参数下,不同平台生成的图片\\\\\\"\\"],\\"datePublished\\":\\"2022-09-05T00:00:00.000Z\\",\\"dateModified\\":\\"2024-01-29T12:26:51.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"Docker 环境配置","slug":"docker-环境配置","link":"#docker-环境配置","children":[{"level":3,"title":"安装 WSL","slug":"安装-wsl","link":"#安装-wsl","children":[]},{"level":3,"title":"启用 Hyper-V","slug":"启用-hyper-v","link":"#启用-hyper-v","children":[]},{"level":3,"title":"Linux 路径(Windows)","slug":"linux-路径-windows","link":"#linux-路径-windows","children":[]}]},{"level":2,"title":"配置 Stable Diffusion","slug":"配置-stable-diffusion","link":"#配置-stable-diffusion","children":[{"level":3,"title":"安装 Docker Desktop","slug":"安装-docker-desktop","link":"#安装-docker-desktop","children":[]},{"level":3,"title":"下载 WebUI Docker","slug":"下载-webui-docker","link":"#下载-webui-docker","children":[]},{"level":3,"title":"分支介绍","slug":"分支介绍","link":"#分支介绍","children":[]},{"level":3,"title":"构建 Stable Diffusion","slug":"构建-stable-diffusion","link":"#构建-stable-diffusion","children":[]}]},{"level":2,"title":"使用说明","slug":"使用说明","link":"#使用说明","children":[{"level":3,"title":"启动 Stable Diffusion","slug":"启动-stable-diffusion","link":"#启动-stable-diffusion","children":[]},{"level":3,"title":"Text-to-Image","slug":"text-to-image","link":"#text-to-image","children":[]},{"level":3,"title":"Image-to-Image","slug":"image-to-image","link":"#image-to-image","children":[]},{"level":3,"title":"Image Lab","slug":"image-lab","link":"#image-lab","children":[]}]},{"level":2,"title":"参数解释","slug":"参数解释","link":"#参数解释","children":[{"level":3,"title":"Classifier Free Guidance","slug":"classifier-free-guidance","link":"#classifier-free-guidance","children":[]},{"level":3,"title":"Step","slug":"step","link":"#step","children":[]},{"level":3,"title":"Seed","slug":"seed","link":"#seed","children":[]},{"level":3,"title":"Sampler","slug":"sampler","link":"#sampler","children":[]}]},{"level":2,"title":"文字描述图像","slug":"文字描述图像","link":"#文字描述图像","children":[{"level":3,"title":"常规描述","slug":"常规描述","link":"#常规描述","children":[]},{"level":3,"title":"特征描述","slug":"特征描述","link":"#特征描述","children":[]},{"level":3,"title":"prompt 权重","slug":"prompt-权重","link":"#prompt-权重","children":[]},{"level":3,"title":"否定提示","slug":"否定提示","link":"#否定提示","children":[]},{"level":3,"title":"prompt 参考","slug":"prompt-参考","link":"#prompt-参考","children":[]}]},{"level":2,"title":"Prompt matrix","slug":"prompt-matrix","link":"#prompt-matrix","children":[]},{"level":2,"title":"Textual Inversion","slug":"textual-inversion","link":"#textual-inversion","children":[]},{"level":2,"title":"常见问题","slug":"常见问题","link":"#常见问题","children":[{"level":3,"title":"Docker Desktop failed","slug":"docker-desktop-failed","link":"#docker-desktop-failed","children":[]},{"level":3,"title":"Docker Desktop cannot start","slug":"docker-desktop-cannot-start","link":"#docker-desktop-cannot-start","children":[]},{"level":3,"title":"docker 命令失败","slug":"docker-命令失败","link":"#docker-命令失败","children":[]},{"level":3,"title":"exited with code 137","slug":"exited-with-code-137","link":"#exited-with-code-137","children":[]},{"level":3,"title":"端口访问被拒","slug":"端口访问被拒","link":"#端口访问被拒","children":[]},{"level":3,"title":"FileNotFoundError","slug":"filenotfounderror","link":"#filenotfounderror","children":[]},{"level":3,"title":"采样模型","slug":"采样模型","link":"#采样模型","children":[]}]},{"level":2,"title":"最后","slug":"最后","link":"#最后","children":[]}],"git":{"createdTime":1662386371000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":41}]},"readingTime":{"minutes":16.76,"words":5027},"filePathRelative":"_posts/2022-09-05-stable_diffusion_ai_painting.md","localizedDate":"2022年9月5日","excerpt":"

    我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来,而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后,我感觉自己脱胎换骨,给自己贴上了「会画画」的新标签。

    \\n
    \\"\\"
    丁老头进化旅程
    \\n

    Stable Diffusion 是一个「文本到图像」的人工智能模型,也是唯一一款开源且能部署在家用电脑(对硬件要求不高)上的 AI 绘图工具。使用 Stable Diffusion,你可以在拥有 6GB 显存显卡,16GB 内存或只依赖 CPU 的电脑上生成图像,并且仅需几秒钟的时间,无需进行预处理或后处理。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7c451a8e.825eb7df.js b/assets/js/v-7c451a8e.825eb7df.js deleted file mode 100644 index 148c5b6e0..000000000 --- a/assets/js/v-7c451a8e.825eb7df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9368],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},768:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E8%BF%85%E9%9B%B7/","title":"标签: 迅雷","lang":"zh-CN","frontmatter":{"title":"标签: 迅雷","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"迅雷","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E8%BF%85%E9%9B%B7/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 迅雷"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 迅雷\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7cffd66e.99771375.js b/assets/js/v-7cffd66e.99771375.js deleted file mode 100644 index d858329e6..000000000 --- a/assets/js/v-7cffd66e.99771375.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3480],{9720:(t,e)=>{e.c=(t,e)=>{const n=t.__vccOpts||t;for(const[t,a]of e)n[t]=a;return n}},2044:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>r,data:()=>s});var a=n(3968);const o={},r=(0,n(9720).c)(o,[["render",function(t,e){const n=(0,a.E1)("Catalog");return(0,a.Wz)(),(0,a.An)("div",null,[(0,a.K2)(n)])}]]),s=JSON.parse('{"path":"/windows/","title":"Windows","lang":"zh-CN","frontmatter":{"title":"Windows","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Windows"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Windows\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7d3320d9.2e65b5f3.js b/assets/js/v-7d3320d9.2e65b5f3.js deleted file mode 100644 index bd1f416c1..000000000 --- a/assets/js/v-7d3320d9.2e65b5f3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2128],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},9058:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/vits/","title":"标签: VITS","lang":"zh-CN","frontmatter":{"title":"标签: VITS","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"VITS","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/vits/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: VITS"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: VITS\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7e077b9c.19de7d6f.js b/assets/js/v-7e077b9c.19de7d6f.js deleted file mode 100644 index c9fb6b4e8..000000000 --- a/assets/js/v-7e077b9c.19de7d6f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2860],{9720:(e,t)=>{t.c=(e,t)=>{const c=e.__vccOpts||e;for(const[e,i]of t)c[e]=i;return c}},7744:(e,t,c)=>{c.r(t),c.d(t,{comp:()=>o,data:()=>p});var i=c(3968);const a=[(0,i.IL)('

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

    它可以用于端口映射(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)],n={},o=(0,c(9720).c)(n,[["render",function(e,t){return(0,i.Wz)(),(0,i.An)("div",null,a)}]]),p=JSON.parse('{"path":"/posts/2017-10-18-light_cat_e8-c-epon_admin.html","title":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)","lang":"zh-CN","frontmatter":{"title":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)","date":"2017-10-18T18:28:00.000Z","category":["网络"],"tag":["光猫"],"order":-7,"description":"为什么要获得光猫超级密码? 它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。 破解测试环境 运营商:上海电信 光猫型号:贝尔 E8-C-EPON 硬件版本:RG201O-CA_V1A2 软件版本:E201OCAA2V11...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-10-18-light_cat_e8-c-epon_admin.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"}],["meta",{"property":"og:description","content":"为什么要获得光猫超级密码? 它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。 破解测试环境 运营商:上海电信 光猫型号:贝尔 E8-C-EPON 硬件版本:RG201O-CA_V1A2 软件版本:E201OCAA2V11..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-9e43bc86b9095f3f6c2cfa4bd58dcd68_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-01-13T16:05:48.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"光猫"}],["meta",{"property":"article:published_time","content":"2017-10-18T18:28:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-01-13T16:05:48.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-9e43bc86b9095f3f6c2cfa4bd58dcd68_r.jpg\\",\\"https://pic3.zhimg.com/v2-ee441dd18cc8e5f6303fdaef82b6d476_r.jpg\\",\\"https://pic1.zhimg.com/v2-31d6bb6b90be541c186a360fe2dd323c_r.jpg\\"],\\"datePublished\\":\\"2017-10-18T18:28:00.000Z\\",\\"dateModified\\":\\"2023-01-13T16:05:48.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"为什么要获得光猫超级密码?","slug":"为什么要获得光猫超级密码","link":"#为什么要获得光猫超级密码","children":[]},{"level":2,"title":"破解测试环境","slug":"破解测试环境","link":"#破解测试环境","children":[]},{"level":2,"title":"光猫超级密码破解","slug":"光猫超级密码破解","link":"#光猫超级密码破解","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1673625948000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":1.09,"words":326},"filePathRelative":"_posts/2017-10-18-light_cat_e8-c-epon_admin.md","localizedDate":"2017年10月18日","excerpt":"

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

    \\n

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

    \\n

    破解测试环境

    \\n

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

    \\n

    光猫超级密码破解

    \\n
      \\n
    1. \\n

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

      \\n
      \\"\\"
      \\n
    2. \\n
    3. \\n

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

      \\n
    4. \\n
    5. \\n

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

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-7ef3ba56.ddee2432.js b/assets/js/v-7ef3ba56.ddee2432.js deleted file mode 100644 index 923ab580e..000000000 --- a/assets/js/v-7ef3ba56.ddee2432.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5200],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5244:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/wifi/","title":"标签: WIFI","lang":"zh-CN","frontmatter":{"title":"标签: WIFI","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"WIFI","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/wifi/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: WIFI"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: WIFI\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-82d00704.b759929e.js b/assets/js/v-82d00704.b759929e.js deleted file mode 100644 index d6e606eaa..000000000 --- a/assets/js/v-82d00704.b759929e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5420],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},1648:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/tag/rpa/","title":"标签: RPA","lang":"zh-CN","frontmatter":{"title":"标签: RPA","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"RPA","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/rpa/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: RPA"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: RPA\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-85fca336.6992a881.js b/assets/js/v-85fca336.6992a881.js deleted file mode 100644 index 1b5d28473..000000000 --- a/assets/js/v-85fca336.6992a881.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9376],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1672:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>s});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),s=JSON.parse('{"path":"/tag/keepass/","title":"标签: KeePass","lang":"zh-CN","frontmatter":{"title":"标签: KeePass","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"KeePass","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/keepass/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: KeePass"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: KeePass\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8847cf24.3bcac68d.js b/assets/js/v-8847cf24.3bcac68d.js deleted file mode 100644 index 87b775586..000000000 --- a/assets/js/v-8847cf24.3bcac68d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6636],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},2364:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/star/","title":"星标","lang":"zh-CN","frontmatter":{"title":"星标","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"type","key":"star"},"layout":"BlogType","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/star/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"星标"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"星标\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8a3959e4.2c9828ab.js b/assets/js/v-8a3959e4.2c9828ab.js deleted file mode 100644 index 87548da49..000000000 --- a/assets/js/v-8a3959e4.2c9828ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7924],{9720:(a,n)=>{n.c=(a,n)=>{const t=a.__vccOpts||a;for(const[a,s]of n)t[a]=s;return t}},9240:(a,n,t)=>{t.r(n),t.d(n,{comp:()=>x,data:()=>F});var s=t(3968);const e=(0,s.QD)("p",null,"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。",-1),p=(0,s.QD)("p",null,[(0,s.QD)("strong",null,"► 开始烧制属于自己的 feed")],-1),l=(0,s.QD)("h2",{id:"_1-进入网页",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#_1-进入网页"},[(0,s.QD)("span",null,"1. 进入网页")])],-1),o={href:"http://www.feed43.com/",target:"_blank",rel:"noopener noreferrer"},c=(0,s.IL)('

    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>\n  <td class="red">\n    <span>2</span\n    ><a href="更时尚更运动 车展实拍解析红旗 H5"\n      >更时尚更运动 车展实拍解析红旗 H5</a\n    >\n  </td>\n  <td class="cBlue">11211615</td>\n</tr>\n

    抓取规则

    <tr>\n  {*}\n  <td class="{*}"><span>{*}</span><a href="{%}">{%}</a></td>\n  {*}\n  <td class="cBlue">{*}</td>\n  {*}\n</tr>\n

    点击 Extract,进行抓取。

    4. 整理 rss 输入格式

    「Define output format」是 Feed 的属性,通常前三项会被自动抓取一,后三项将之前获取的 item 里面的元素填入即可,{%1} 对应的是链接,所以填入「Item Link」,{%2} 对应标题则填入到「Item Title」。

    然后点击「preview」,完成制作,同时可以查看预览效果。

    如果注册了 FEED43 的账号,可以修改 RSS 地址,但链接不能使用中文,否则会导致 RSS 出错。

    5. 获取 RSS 地址

    ',24),i={href:"https://www.feed43.com/dianji.xml",target:"_blank",rel:"noopener noreferrer"},r=(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://pic1.zhimg.com/v2-f3b00e876d8df136f7d354b4fc22f900_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption")],-1),u=(0,s.QD)("p",null,"在阅读器中的效果如下:",-1),d=(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://pic4.zhimg.com/v2-6d8f503ff3da16eb985ca1d3ae2de98f_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption")],-1),g=(0,s.QD)("h2",{id:"_6-全文抓取",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#_6-全文抓取"},[(0,s.QD)("span",null,"6. 全文抓取")])],-1),m=(0,s.QD)("p",null,[(0,s.mY)("FEED43 导出的条目需要点击链接才能查看内容。要在 RSS 中展示全文,需要通过 FeedEx 再转换一次。注意:FEED43 免费用户过多,需要在浏览器中打开一次才能获得真实链接(一般为 "),(0,s.QD)("code",null,"http://node2.feed43.com"),(0,s.mY)(")。FeedEx 需要使用真实链接,一般 3 分钟内转换完毕。")],-1),h={href:"https://feedex.net/",target:"_blank",rel:"noopener noreferrer"},f=(0,s.QD)("figure",null,[(0,s.QD)("img",{src:"https://pic4.zhimg.com/v2-8e3701adffa1d6fb4ea10dda2704988b_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),(0,s.QD)("figcaption")],-1),k=(0,s.QD)("p",null,"Feeds43 的免费版每 6 小时抓取一次,最多显示最新的 20 条内容。如果网页源更新较频繁,建议使用 RSSHub 和 Huginn。",-1),b=(0,s.QD)("h2",{id:"rss-合集",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#rss-合集"},[(0,s.QD)("span",null,"RSS 合集")])],-1),S=(0,s.QD)("p",null,"汇总的 RSS 永久订阅 feeds 均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),_={href:"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},D={href:"https://newzone.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://newzone.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"},z={},x=(0,t(9720).c)(z,[["render",function(a,n){const t=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[e,p,l,(0,s.QD)("p",null,[(0,s.QD)("a",o,[(0,s.mY)("FEED43"),(0,s.K2)(t)]),(0,s.mY)(" 不需要注册,点击「Create your own feed」即可使用。")]),c,(0,s.QD)("p",null,[(0,s.mY)("点击 Feed URL 可得 RSS 地址,样例是 "),(0,s.QD)("a",i,[(0,s.mY)("https://www.feed43.com/dianji.xml"),(0,s.K2)(t)]),(0,s.mY)("。")]),r,u,d,g,m,(0,s.QD)("p",null,[(0,s.mY)("FeedEx: "),(0,s.QD)("a",h,[(0,s.mY)("https://feedex.net/"),(0,s.K2)(t)])]),f,k,b,S,(0,s.QD)("ul",null,[(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",_,[(0,s.mY)("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),(0,s.K2)(t)])])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",v,[(0,s.mY)("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),(0,s.K2)(t)])])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",D,[(0,s.mY)("RSS 速成篇:RSSHub 捡现成的轮子"),(0,s.K2)(t)])])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",R,[(0,s.mY)("RSS 速成篇 2:RSSHub 自部署"),(0,s.K2)(t)])])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",Q,[(0,s.mY)("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),(0,s.K2)(t)])])]),(0,s.QD)("li",null,[(0,s.QD)("p",null,[(0,s.QD)("a",E,[(0,s.mY)("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),(0,s.K2)(t)])])])])])}]]),F=JSON.parse('{"path":"/posts/2017-04-22-rss_feed43_feedex.html","title":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源","lang":"zh-CN","frontmatter":{"title":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源","date":"2017-04-22T12:54:00.000Z","category":["自动化"],"tag":["rss","Feed43","FeedEx"],"order":-2,"description":"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。 ► 开始烧制属于自己的 feed 1. 进入网页 FEED43 不需要注册,点击「Create your own feed」即可使用。 2. 选定 RSS 网页 在「Ste...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-04-22-rss_feed43_feedex.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源"}],["meta",{"property":"og:description","content":"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。 ► 开始烧制属于自己的 feed 1. 进入网页 FEED43 不需要注册,点击「Create your own feed」即可使用。 2. 选定 RSS 网页 在「Ste..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic1.zhimg.com/v2-b5da0b08f632376fad3925a779e373b4_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-05-16T08:12:45.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:tag","content":"Feed43"}],["meta",{"property":"article:tag","content":"FeedEx"}],["meta",{"property":"article:published_time","content":"2017-04-22T12:54:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-05-16T08:12:45.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源\\",\\"image\\":[\\"https://pic1.zhimg.com/v2-b5da0b08f632376fad3925a779e373b4_r.jpg\\",\\"https://pic1.zhimg.com/v2-1b687a5b1c325ba6d04fbdcc13b95668_r.jpg\\",\\"https://pic1.zhimg.com/v2-b1fa90c59739bddc0c27134cd36ba6bc_r.jpg\\",\\"https://pic2.zhimg.com/v2-cf6dbf2c09189f7517ec63abdc80c50d_r.jpg\\",\\"https://pic4.zhimg.com/v2-e9486741a6229ab258a95147f584571b_r.jpg\\",\\"https://pic1.zhimg.com/v2-b4614f5c46090f2eb762aac87d604350_r.jpg\\",\\"https://pic2.zhimg.com/v2-498bf1f1c0b14da172498b58f59e39b9_r.jpg\\",\\"https://pic1.zhimg.com/v2-f3b00e876d8df136f7d354b4fc22f900_r.jpg\\",\\"https://pic4.zhimg.com/v2-6d8f503ff3da16eb985ca1d3ae2de98f_r.jpg\\",\\"https://pic4.zhimg.com/v2-8e3701adffa1d6fb4ea10dda2704988b_r.jpg\\"],\\"datePublished\\":\\"2017-04-22T12:54:00.000Z\\",\\"dateModified\\":\\"2023-05-16T08:12:45.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"1. 进入网页","slug":"_1-进入网页","link":"#_1-进入网页","children":[]},{"level":2,"title":"2. 选定 RSS 网页","slug":"_2-选定-rss-网页","link":"#_2-选定-rss-网页","children":[]},{"level":2,"title":"3. 定制 RSS 抓取规则","slug":"_3-定制-rss-抓取规则","link":"#_3-定制-rss-抓取规则","children":[]},{"level":2,"title":"4. 整理 rss 输入格式","slug":"_4-整理-rss-输入格式","link":"#_4-整理-rss-输入格式","children":[]},{"level":2,"title":"5. 获取 RSS 地址","slug":"_5-获取-rss-地址","link":"#_5-获取-rss-地址","children":[]},{"level":2,"title":"6. 全文抓取","slug":"_6-全文抓取","link":"#_6-全文抓取","children":[]},{"level":2,"title":"RSS 合集","slug":"rss-合集","link":"#rss-合集","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1684224765000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4},{"name":"Mr.Hope","email":"mister-hope@outlook.com","commits":1}]},"readingTime":{"minutes":2.75,"words":825},"filePathRelative":"_posts/2017-04-22-rss_feed43_feedex.md","localizedDate":"2017年4月22日","excerpt":"

    迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。

    \\n

    ► 开始烧制属于自己的 feed

    \\n

    1. 进入网页

    \\n

    FEED43 不需要注册,点击「Create your own feed」即可使用。

    \\n
    \\"\\"
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8c515568.27d676d8.js b/assets/js/v-8c515568.27d676d8.js deleted file mode 100644 index e508118fb..000000000 --- a/assets/js/v-8c515568.27d676d8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[560],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},8616:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BB%BA%E7%AB%99/","title":"标签: 建站","lang":"zh-CN","frontmatter":{"title":"标签: 建站","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"建站","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BB%BA%E7%AB%99/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 建站"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 建站\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8f0b7818.5bf4acfb.js b/assets/js/v-8f0b7818.5bf4acfb.js deleted file mode 100644 index 29db66f37..000000000 --- a/assets/js/v-8f0b7818.5bf4acfb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2088],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5964:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/cdn/","title":"标签: CDN","lang":"zh-CN","frontmatter":{"title":"标签: CDN","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"CDN","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/cdn/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: CDN"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: CDN\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-8fd5da28.a4d16856.js b/assets/js/v-8fd5da28.a4d16856.js deleted file mode 100644 index 1cffc850c..000000000 --- a/assets/js/v-8fd5da28.a4d16856.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1792],{9720:(a,n)=>{n.c=(a,n)=>{const s=a.__vccOpts||a;for(const[a,e]of n)s[a]=e;return s}},60:(a,n,s)=>{s.r(n),s.d(n,{comp:()=>V,data:()=>I});var e=s(3968);const t=(0,e.QD)("h2",{id:"重装准备",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#重装准备"},[(0,e.QD)("span",null,"重装准备")])],-1),l={href:"https://newzone.top/apps/Applist.html",target:"_blank",rel:"noopener noreferrer"},p=(0,e.QD)("li",null,"同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。",-1),o=(0,e.QD)("li",null,"反激活已购软件,如:Eagle、MoneyWiz、妙笔。",-1),r={href:"https://www.microsoft.com/zh-cn/software-download/windows11",target:"_blank",rel:"noopener noreferrer"},i=(0,e.QD)("h2",{id:"安装系统",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#安装系统"},[(0,e.QD)("span",null,"安装系统")])],-1),c=(0,e.QD)("strong",null,"NTFS/exFAT",-1),u={href:"https://www.itsk.com/latest",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.wepe.com.cn/download.html",target:"_blank",rel:"noopener noreferrer"},m=(0,e.QD)("p",null,"使用 U 盘引导安装系统:",-1),d=(0,e.QD)("ul",null,[(0,e.QD)("li",null,"本地安装:右键 ISO 文件,选择挂载;在新出现的驱动器中,找到 setup.exe,直接运行;选择「现在安装」。"),(0,e.QD)("li",null,[(0,e.mY)("引导安装:采用 UEFI+GPT。如果是自定义安装清空系统盘所有分区后,一定要用 "),(0,e.QD)("strong",null,"GPT"),(0,e.mY)(" 对系统盘分区。")])],-1),g=(0,e.QD)("h2",{id:"系统配置",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#系统配置"},[(0,e.QD)("span",null,"系统配置")])],-1),b=(0,e.QD)("li",null,"将 Documents、Desktop 转移到 D 盘。",-1),h=(0,e.QD)("li",null,[(0,e.mY)("环境包安装:"),(0,e.QD)("code",null,"npm i -g npm@latest; npm i -g pnpm; npm i -g yarn; npm i -g docsify-cli"),(0,e.mY)("。")],-1),w=(0,e.QD)("li",null,"显示屏校色:屏幕换线或换主机,参数可能会变动。在颜色管理部分还原显示器设置。",-1),f=(0,e.QD)("li",null,"任务栏:在任务栏底部右键单击,选择「任务栏设置」>「通知区域」>「选择哪些图标显示在任务栏上」;在同页面的「多显示器设置」中,取消「在所有显示器上显示任务栏」。",-1),v=(0,e.QD)("li",null,"Win11 本地账户也被提示需要登录密码,但设置密码后,无法直接开机登录。设置新密码后,点击「设置」>「账户」>「登录选项」>「密码」,可以重新设置空密码,实现自动登录。在账户中可以设置密码永不过期。",-1),D={href:"https://zhuanlan.zhihu.com/p/25942015",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://newzone.top/posts/2017-09-02-forced_shutdown.html",target:"_blank",rel:"noopener noreferrer"},y=(0,e.QD)("li",null,"台机的电源模式调整到最佳性能模式。",-1),Y=(0,e.QD)("p",null,"系统配置注意:",-1),S=(0,e.QD)("ul",null,[(0,e.QD)("li",null,"右键更改前先备份注册表,有几率会影响系统稳定性。"),(0,e.QD)("li",null,"英语键盘删不掉:添加英语语言包,然后再删除,英语键盘也会一起删除。")],-1),E=(0,e.QD)("h2",{id:"安装应用",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#安装应用"},[(0,e.QD)("span",null,"安装应用")])],-1),T={href:"https://newzone.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html",target:"_blank",rel:"noopener noreferrer"},W=(0,e.QD)("code",null,"InternetOpenUrl() failed. 0x80072f7d : unknown error",-1),_=(0,e.IL)('

    Mircrosoft Store

    由于微软应用商店能自动更新应用,我习惯通过它安装一些无需配置的应用。这些应用包括 Windows Terminal、Windows Notepad、Windows 闹钟和时钟、Windows 扫描、Windows 相机、Windows 录音机、Snipaste、Ditto、PowerToys、One Commander、思源笔记、Discord。以下是按顺序排列的一键安装命令:

    winget install 9N0DX20HK701 -s msstore  ;  winget install 9MSMLRH6LZF3 -s msstore  ;  winget install 9WZDNCRFJ3PR -s msstore  ;  winget install 9WZDNCRFJ3PV -s msstore  ;  winget install 9WZDNCRFJBBG -s msstore  ;  winget install 9WZDNCRFHWKN -s msstore  ;  winget install 9P1WXPKB68KX -s msstore  ;  winget install 9NBLGGH3ZBJQ -s msstore  ;  winget install XP89DCGQ3K6VLD -s msstore  ;  winget install 9NBLGGH4S79B -s msstore  ;  winget install 9P7HPMXP73K4 -s msstore  ;  winget install XPDC2RH70K22MN -s msstore\n

    常规应用

    以下是常用的非微软商店应用的批量安装命令:

    winget install --id=Mozilla.Firefox -e  ; winget install --id=Google.Chrome -e  ; winget install --id=Brave.Brave -e  ; winget install --id=Mozilla.Thunderbird -e  ; winget install --id=Logitech.Options -e  ; winget install --id=Tencent.WeChat -e  ; winget install --id=Tencent.TIM -e  ; winget install --id=Tencent.QQ.NT -e  ; winget install --id=Telegram.TelegramDesktop -e  ; winget install --id=Microsoft.VisualStudioCode -e  ; winget install --id=Notepad++.Notepad++ -e  ; winget install --id=Notion.Notion -e  ; winget install --id=Formagrid.Airtable -e  ; winget install --id=Figma.Figma -e  ; winget install --id=ogdesign.Eagle -e  ; winget install --id=PicGo.PicGo.Beta -e  ; winget install --id=Gyan.FFmpeg -e  ; winget install --id=ByteDance.JianyingPro -e  ; winget install --id=HandBrake.HandBrake -e  ; winget install --id=Audacity.Audacity -e  ; winget install --id=Logseq.Logseq -e  ; winget install --id=Obsidian.Obsidian -e  ; winget install --id=Appest.Dida -e  ; winget install --id=SumatraPDF.SumatraPDF -e  ; winget install --id=Bandisoft.Honeyview -e  ; winget install --id=Alibaba.aDrive  -e  ; winget install --id=115.115Chrome -e  ; winget install --id=VideoLAN.VLC -e  ; winget install --id=ByteDance.JianyingPro -e  ; winget install --id=Git.Git -e; winget install --id=GitHub.GitHubDesktop -e  ; winget install --id=Hesan.He3 -e  ; winget install --id=NickeManarin.ScreenToGif -e  ; winget install --id=Valve.Steam -e  ; winget install --id=Nutstore.Nutstore -e  ; winget install --id=TominLab.WonderPen -e  ; winget install --id=OBSProject.OBSStudio -e  ; winget install --id=mgth.LittleBigMouse -e\n

    对更新党来说,在后续应用管理可以搭配 winget upgrade 来检查是否有应用更新。也可以使用 winget upgrade --all 来静默升级所有支持 winget 的程序。

    手动安装应用

    ',8),N={href:"https://learn.microsoft.com/zh-cn/windows/wsl/install#install-wsl-command",target:"_blank",rel:"noopener noreferrer"},C=(0,e.QD)("code",null,"wsl --install",-1),P={href:"https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-1---enable-the-windows-subsystem-for-linux",target:"_blank",rel:"noopener noreferrer"},A={href:"https://docs.docker.com/get-docker/",target:"_blank",rel:"noopener noreferrer"},L=(0,e.QD)("li",null,"同步设置:GoodSync 保持本地不同目录间的文件同步;Synology Drive 将本地文件备份到 NAS。",-1),K={href:"https://www.iplaysoft.com/win11-wsa.html",target:"_blank",rel:"noopener noreferrer"},x=(0,e.QD)("h2",{id:"应用配置",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#应用配置"},[(0,e.QD)("span",null,"应用配置")])],-1),B=(0,e.IL)("
  • 配置:RIME、Picgo、Wonderpen、Eagle。
  • Everything 注册右键搜索当前路径;右键清除。
    • win+r, regedit 打开注册表,打开路径 HKEY_CLASSES_ROOT\\Directory\\Background\\shell
    • 新建项,命名随意 ( 即右键菜单显示的文字 ) -「Everything 搜索当前路径」。
    • 右键再次新建项,命名 Command,打开修改右侧默认值为 "D: \\Everything\\Everything.exe" -path "."
  • 按键更改:
    • Powertoys:将 insert 键改为 backspace。
    • Logitech.Options:将键盘的计算器改为「上一个桌面」;右键菜单改为「下一个桌面」。
  • ",3),F=(0,e.QD)("h3",{id:"旧资料-已弃用",tabindex:"-1"},[(0,e.QD)("a",{class:"header-anchor",href:"#旧资料-已弃用"},[(0,e.QD)("span",null,"旧资料(已弃用)")])],-1),G={href:"https://dandelioncloud.cn/article/details/1569126817577791489",target:"_blank",rel:"noopener noreferrer"},z=(0,e.QD)("li",null,[(0,e.mY)("firefox-about: config 修改原值 18 的 "),(0,e.QD)("code",null,"ui.key.menuAccessKey"),(0,e.mY)(" 为 0,以屏蔽 alt 防止热键冲突;选择「options」>「Network Settings」,取消勾选「DNS over HTTPS」。")],-1),H={href:"https://github.com/tutugreen/Huorong-Rules/tree/main/Tencent",target:"_blank",rel:"noopener noreferrer"},M={href:"https://vb-audio.com/Cable/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://www.youtube.com/watch?v=1DsrniDGOJQ",target:"_blank",rel:"noopener noreferrer"},R={},V=(0,s(9720).c)(R,[["render",function(a,n){const s=(0,e.E1)("ExternalLinkIcon"),R=(0,e.E1)("RouteLink");return(0,e.Wz)(),(0,e.An)("div",null,[t,(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.mY)("备份:"),(0,e.QD)("a",l,[(0,e.mY)("必备应用"),(0,e.K2)(s)]),(0,e.mY)("、油猴脚本、VSCode 配置、输入法配置。")]),p,o,(0,e.QD)("li",null,[(0,e.mY)("更新 "),(0,e.QD)("a",r,[(0,e.mY)("原版镜像"),(0,e.K2)(s)]),(0,e.mY)("。")])]),i,(0,e.QD)("p",null,[(0,e.mY)("系统重装维修前,在 "),c,(0,e.mY)(" 格式的 U 盘上安装 "),(0,e.QD)("a",u,[(0,e.mY)("优启通"),(0,e.K2)(s)]),(0,e.mY)(" 或 "),(0,e.QD)("a",k,[(0,e.mY)("微 PE 工具箱"),(0,e.K2)(s)]),(0,e.mY)("。Windows 10/11 镜像超过 4GB,已经不再支持 FAT32 格式的 U 盘。")]),m,d,g,(0,e.QD)("ul",null,[b,h,w,f,v,(0,e.QD)("li",null,[(0,e.QD)("a",D,[(0,e.mY)("清理导航栏"),(0,e.K2)(s)])]),(0,e.QD)("li",null,[(0,e.QD)("a",Q,[(0,e.mY)("设置系统强制关机"),(0,e.K2)(s)]),(0,e.mY)(",防止系统关机不成功。")]),y]),Y,S,E,(0,e.QD)("p",null,[(0,e.mY)("使用 "),(0,e.QD)("a",T,[(0,e.mY)("winstall"),(0,e.K2)(s)]),(0,e.mY)(" 可以批量安装应用,但这需要你提前登录微软账户,并更改 ps1 的运行权限。如果出现"),W,(0,e.mY)(" 则检查 TLS 是否开启 1.2 和 1.3。(每次使用四大行网银后,基本都需要修复次)")]),_,(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.QD)("a",N,[(0,e.mY)("WSL"),(0,e.K2)(s)]),(0,e.mY)(" :在管理员模式下打开 PowerShell 或 Windows 命令提示符,输入 "),C,(0,e.mY)(" 命令。如果提示错误,则按 "),(0,e.QD)("a",P,[(0,e.mY)("旧版 WSL 的手动安装步骤"),(0,e.K2)(s)]),(0,e.mY)(" 开启步骤 1 和 3 的功能。WSL 安装并重启成功后,安装 "),(0,e.QD)("a",A,[(0,e.mY)("Docker Desktop"),(0,e.K2)(s)]),(0,e.mY)("。")]),L,(0,e.QD)("li",null,[(0,e.mY)("电脑运行 Android 手机应用, "),(0,e.QD)("a",K,[(0,e.mY)("Win11 安卓子系统"),(0,e.K2)(s)]),(0,e.mY)(" ( WSA ) 安装。")])]),x,(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.mY)("绿色开机:开机脚本、Keepass、Ditto。开机脚本用 "),(0,e.K2)(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:(0,e.Ql)((()=>[(0,e.mY)("管理员权限启动脚本")])),_:1}),(0,e.mY)("。")]),B]),F,(0,e.QD)("ul",null,[(0,e.QD)("li",null,[(0,e.mY)("如果空间不足,可以把 "),(0,e.QD)("a",G,[(0,e.mY)("WSL 从 C 盘迁移至 D 盘的简单实用方法"),(0,e.K2)(s)]),(0,e.mY)(",但容易出现兼容性问题。")]),z,(0,e.QD)("li",null,[(0,e.mY)("火绒-安全设置-高级防护-导入隐私规则,增加 "),(0,e.QD)("a",H,[(0,e.mY)("腾讯屏蔽规则"),(0,e.K2)(s)]),(0,e.mY)("。")]),(0,e.QD)("li",null,[(0,e.mY)("实时将音频转文字:管理员方式安装 "),(0,e.QD)("a",M,[(0,e.mY)("VB-CABLE"),(0,e.K2)(s)]),(0,e.mY)(" ,输入输出设备都选 VB-CABLE,详细设置查看 "),(0,e.QD)("a",O,[(0,e.mY)("How to Convert Audio to Text - FREE & No Time Limits"),(0,e.K2)(s)]),(0,e.mY)("。")])])])}]]),I=JSON.parse('{"path":"/windows/NewSystem.html","title":"系统重装","lang":"zh-CN","frontmatter":{"article":false,"title":"系统重装","icon":"update","order":2,"description":"重装准备 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。 反激活已购软件,如:Eagle、MoneyWiz、妙笔。 更新 原版镜像。 安装系统 系统重装维修前,在 NTFS/exFAT 格式的 U 盘上安装 优启通 或 微 PE 工具箱。Windows 10/11 镜像超过...","head":[["meta",{"property":"og:url","content":"https://newzone.top/windows/NewSystem.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"系统重装"}],["meta",{"property":"og:description","content":"重装准备 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。 反激活已购软件,如:Eagle、MoneyWiz、妙笔。 更新 原版镜像。 安装系统 系统重装维修前,在 NTFS/exFAT 格式的 U 盘上安装 优启通 或 微 PE 工具箱。Windows 10/11 镜像超过..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-29T12:26:51.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-29T12:26:51.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"系统重装\\",\\"description\\":\\"重装准备 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。 反激活已购软件,如:Eagle、MoneyWiz、妙笔。 更新 原版镜像。 安装系统 系统重装维修前,在 NTFS/exFAT 格式的 U 盘上安装 优启通 或 微 PE 工具箱。Windows 10/11 镜像超过...\\"}"]]},"headers":[{"level":2,"title":"重装准备","slug":"重装准备","link":"#重装准备","children":[]},{"level":2,"title":"安装系统","slug":"安装系统","link":"#安装系统","children":[]},{"level":2,"title":"系统配置","slug":"系统配置","link":"#系统配置","children":[]},{"level":2,"title":"安装应用","slug":"安装应用","link":"#安装应用","children":[{"level":3,"title":"Mircrosoft Store","slug":"mircrosoft-store","link":"#mircrosoft-store","children":[]},{"level":3,"title":"常规应用","slug":"常规应用","link":"#常规应用","children":[]},{"level":3,"title":"手动安装应用","slug":"手动安装应用","link":"#手动安装应用","children":[]}]},{"level":2,"title":"应用配置","slug":"应用配置","link":"#应用配置","children":[{"level":3,"title":"旧资料(已弃用)","slug":"旧资料-已弃用","link":"#旧资料-已弃用","children":[]}]}],"git":{"createdTime":1658511538000,"updatedTime":1706531211000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":22}]},"readingTime":{"minutes":4.91,"words":1472},"filePathRelative":"windows/NewSystem.md","localizedDate":"2022年7月22日","excerpt":"

    重装准备

    \\n
      \\n
    • 备份:必备应用、油猴脚本、VSCode 配置、输入法配置。
    • \\n
    • 同步:检查 GoodSync 同步设置;核对群晖已同步到最新备份。
    • \\n
    • 反激活已购软件,如:Eagle、MoneyWiz、妙笔。
    • \\n
    • 更新 原版镜像
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-92387c24.02860b45.js b/assets/js/v-92387c24.02860b45.js deleted file mode 100644 index 48f70eed3..000000000 --- a/assets/js/v-92387c24.02860b45.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7532],{9720:(n,e)=>{e.c=(n,e)=>{const a=n.__vccOpts||n;for(const[n,s]of e)a[n]=s;return a}},9696:(n,e,a)=>{a.r(e),a.d(e,{comp:()=>c,data:()=>i});var s=a(3968);const t={href:"https://github.com/hectorqin/reader",target:"_blank",rel:"noopener noreferrer"},o=(0,s.IL)('

    reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、EPUB、UMD 和 PDF 格式,以及 RSS 订阅。reader 还提供定时书架更新、并发搜书功能,以及本地书仓,同时支持 Kindle 阅读,满足多样化的阅读需求。

    异常监测

    我设置了数千条书源,导致容器经常报错,几乎每隔几天就会出现提示「点击设置后端接口前缀」。这不仅使 reader 无法正常使用,还会导致 NAS 的 CPU 被疯狂占用,必须重启容器才能恢复正常。

    因此,我使用 Uptime Kuma 监测 reader 后端 http://localhost:8080/reader3/getUserInfo 的运行状态,当异常时就触发 Docker API 执行指定容器的重启命令。值得注意的是,Uptime Kuma 在恢复时也会触发通知,意味着可能会两次重启 reader 容器。如果不希望发生多次重启,可以考虑使用 n8n 来判断状态。

    部署命令

    # https://github.com/hectorqin/reader/blob/master/docker-compose.yml\nversion: "3.1"\nservices:\n  # reader 在线阅读\n  # 公开服务器(服务器位于日本):[https://reader.nxnow.top](https://reader.nxnow.top) 测试账号/密码分别为 guest/guest123,也可自行创建账号添加书源,不定期删除长期未登录账号 (2 周)\n  # 书源集合 : [https://legado.aoaostar.com/](https://legado.aoaostar.com/) 点击打开连接,添加远程书源即可\n  # 公众号汇总 : [https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MzMyMDgyMA==&action=getalbum&album_id=2397535253763801090#wechat_redirect)\n  # 手动更新方式 : docker-compose pull && docker-compose up -d\n  reader:\n    image: hectorqin/reader\n    #image: hectorqin/reader:openj9-latest #docker 镜像,arm64 架构或小内存机器优先使用此镜像。启用需删除上一行\n    container_name: reader #容器名 可自行修改\n    restart: always\n    ports:\n      - 4396:8080 #4396 端口映射可自行修改\n    volumes:\n      - /volume1/docker/reader/logs:/logs #log 映射目录 /home/reader/logs 映射目录可自行修改\n      - /volume1/docker/reader/storage:/storage #数据映射目录 /home/reader/storage 映射目录可自行修改\n    environment:\n      - SPRING_PROFILES_ACTIVE=prod\n      - READER_APP_USERLIMIT=10 #用户上限,默认 50\n      - READER_APP_USERBOOKLIMIT=200 #用户书籍上限,默认 200\n      - READER_APP_CACHECHAPTERCONTENT=true #开启缓存章节内容 V2.0\n      # READER_APP_REMOTEWEBVIEWAPI=http://readerwebview:8050 #启用 webview(若下方 readerwebview 容器不开启需注释此行\n      # ↓多用户模式配置↓\n      #- READER_APP_SECURE=true #开启登录鉴权,开启后将支持多用户模式\n      #- READER_APP_SECUREKEY=adminpwd  #管理员密码  建议修改\n      #- READER_APP_INVITECODE=registercode #注册邀请码 建议修改,如不需要可注释或删除\n    # 如需支持 webview 书源,打开 (占用较大,不需要可加 # 注释)\n    #  readerwebview:\n    #    image: hectorqin/remote-webview\n    #    container_name: readerwebview\n    #    restart: always\n    #    environment:\n    #      - TZ=Asia/Shanghai\n    # volumes:\n    #  reader:\n    #  readerwebview:\n

    原本我在 compose 命令中添加 healthcheck,希望当容器 unhealth 时自动重启。但实现起来更加复杂,需要另外使用容器,因此改用 Uptime Kuma 方案。

    # ↓健康检查:当书源较多时,可能隔几天就会出现后端崩溃,会提示「点击设置后端接口前缀」↓\n# ↓此时可通过健康检查重启后端,以解决此问题,如不需要可注释或删除↓\nhealthcheck:\n  test: [\n      "CMD",\n      "wget",\n      "--spider",\n      "-S",\n      "http://localhost:8080/reader3/getUserInfo",\n    ] # 需要检查的健康状态的 URL\n  interval: 10m # 健康检查的间隔时间\n  timeout: 30s # 健康检查的超时时间\n  retries: 3 # 健康检查失败后的重试次数\n
    ',8),p={},c=(0,a(9720).c)(p,[["render",function(n,e){const a=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.QD)("a",t,[(0,s.mY)("reader"),(0,s.K2)(a)]),(0,s.mY)(" 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。")]),o])}]]),i=JSON.parse('{"path":"/services/dockers-on-nas/reader.html","title":"Reader:小说/书籍阅读","lang":"zh-CN","frontmatter":{"article":false,"title":"Reader:小说/书籍阅读","order":11,"description":"reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。 reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/reader.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Reader:小说/书籍阅读"}],["meta",{"property":"og:description","content":"reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。 reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Reader:小说/书籍阅读\\",\\"description\\":\\"reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。 reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、...\\"}"]]},"headers":[{"level":2,"title":"异常监测","slug":"异常监测","link":"#异常监测","children":[]},{"level":2,"title":"部署命令","slug":"部署命令","link":"#部署命令","children":[]}],"git":{"createdTime":1697975314000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":3.03,"words":908},"filePathRelative":"services/dockers-on-nas/reader.md","localizedDate":"2023年10月22日","excerpt":"

    reader 是阅读 3 的服务器版,为阅读爱好者提供全面的功能支持。

    \\n

    reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、EPUB、UMD 和 PDF 格式,以及 RSS 订阅。reader 还提供定时书架更新、并发搜书功能,以及本地书仓,同时支持 Kindle 阅读,满足多样化的阅读需求。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-95c8fd9e.07665c10.js b/assets/js/v-95c8fd9e.07665c10.js deleted file mode 100644 index 705faab30..000000000 --- a/assets/js/v-95c8fd9e.07665c10.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[872],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9004:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%8A%95%E5%B1%8F/","title":"标签: 投屏","lang":"zh-CN","frontmatter":{"title":"标签: 投屏","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"投屏","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%8A%95%E5%B1%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 投屏"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 投屏\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-96aea7e0.3d76c0ab.js b/assets/js/v-96aea7e0.3d76c0ab.js deleted file mode 100644 index 781580e4f..000000000 --- a/assets/js/v-96aea7e0.3d76c0ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6228],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1692:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%8C%96%E5%A6%86%E5%93%81/","title":"标签: 化妆品","lang":"zh-CN","frontmatter":{"title":"标签: 化妆品","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"化妆品","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%8C%96%E5%A6%86%E5%93%81/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 化妆品"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 化妆品\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-978f5aae.9af5667f.js b/assets/js/v-978f5aae.9af5667f.js deleted file mode 100644 index 3317eb72a..000000000 --- a/assets/js/v-978f5aae.9af5667f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7916],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},3092:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E5%81%A5%E5%BA%B7/","title":"健康 分类","lang":"zh-CN","frontmatter":{"title":"健康 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"健康","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%81%A5%E5%BA%B7/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"健康 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"健康 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-9c198ab2.42ebbed5.js b/assets/js/v-9c198ab2.42ebbed5.js deleted file mode 100644 index cc0c5ce3a..000000000 --- a/assets/js/v-9c198ab2.42ebbed5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9514],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1160:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E4%B8%BB%E6%9D%BF/","title":"标签: 主板","lang":"zh-CN","frontmatter":{"title":"标签: 主板","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"主板","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E4%B8%BB%E6%9D%BF/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 主板"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 主板\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a50cf67c.ad90dae1.js b/assets/js/v-a50cf67c.ad90dae1.js deleted file mode 100644 index f8d856a4d..000000000 --- a/assets/js/v-a50cf67c.ad90dae1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[152],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},5540:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>L,data:()=>z});var o=a(3968);const n=(0,o.QD)("blockquote",null,[(0,o.QD)("p",null,"本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。")],-1),r={href:"https://newzone.top/posts/2022-08-22-learndata_blog_to_knowledge_management.html",target:"_blank",rel:"noopener noreferrer"},l=(0,o.QD)("figure",null,[(0,o.QD)("img",{src:"https://img.newzone.top/2023-12-12-19-00-11.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,o.QD)("figcaption")],-1),i=(0,o.QD)("p",null,"但随着使用频率的提升,我也逐渐发现了一些效率上的问题。接下来,我将进一步介绍关于知识搜索和管理方面的 LearnData 博客进阶经验。",-1),p=(0,o.QD)("h2",{id:"本地搜索与网页端搜索的权衡",tabindex:"-1"},[(0,o.QD)("a",{class:"header-anchor",href:"#本地搜索与网页端搜索的权衡"},[(0,o.QD)("span",null,"本地搜索与网页端搜索的权衡")])],-1),d={href:"https://newzone.top/",target:"_blank",rel:"noopener noreferrer"},c=(0,o.IL)('

    随着笔记量的增加,传统的全文本搜索方法开始显得力不从心,我越来越难找到需要的文章。因此,我转而采用了 LearnData 博客集成的 Algolia 和 SearchPro 这两款节点搜索工具进行文章的查询和管理。与 VS Code 的全文本搜索相比,节点搜索不仅提高了搜索效率,更使得大量文章的管理和定位变得更加便捷高效。

    左侧为 VS Code 本地搜索,右侧为网站搜索

    尽管我曾尝试利用 Algolia API 实现本地搜索功能,但由于过于复杂的程序结构和不尽如人意的效果,我最终决定专注于网站端的节点搜索,以此高效地定位所需知识点。

    网页查询与本地文件修改的融合

    虽然用网站搜索文章效率极高,但它引出了一个新问题:如何修改找到的网页内容?

    之前,我需要根据网页链接在本地逐一对照文件,才能进行修改,这一流程随着笔记数量的增长变得异常繁琐。我甚至尝试过将笔记同步到双链笔记工具如 Logseq、Obsidian 中进行管理,但这样做既背离了 LearnData 旨在简单、高效的初衷,同时也缺失了网页博客的分享特性,并容易导致文章结构混乱。

    最终,我采取了一种新的方法:通过脚本将网页路径直接转换为本地路径。这样一来,当我在网页端发现需要修改的内容时,只需运行脚本即可快速定位到本地文件,让网页查询与本地文件修改完美融合。

    LearnData 博客页面直接跳转到本地
    ',8),g={href:"https://getquicker.net/Sharedaction?code=7cd28948-74cb-433c-53de-08dbf9f189d3",target:"_blank",rel:"noopener noreferrer"},s=(0,o.IL)('

    网址链接转换为本地路径的原理如下:

    1. 获取当前网页的网址。
    2. 替换网址中的固定域名 https://newzone.top/ 为空,并将网页路径的 / 转换为本地路径符号 \\
    3. .html 为分界,取分割后列表的第一部分。
    4. 在文本开头添加本地项目路径 D:\\Backup\\Libraries\\Documents\\GitHub\\LearnData\\docs\\,并在结尾添加 .md
    5. 为解决目录文档路径问题,将 \\.md 替换为 \\README.md

    VS Code 文件排序

    有时,我们可能需要在海量文章中定位最新的文件。VS Code 虽然默认按文件名排序,不支持自定义排序,但以下方法可以帮你实现按最新修改日期排序,优化你的文件管理效率:

    ',4),m=(0,o.IL)('
  • 通过设置修改排序

    • 使用快捷键 Ctrl+, 或通过菜单「文件」>「首选项」>「设置」进入设置。
    • 在设置中搜索 Explorer: Sort Order 并选择 modified 选项,即可使文件按最后修改日期降序排列。
    VS Code 文件排序设置
    VS Code 文件排序设置
  • ',1),h=(0,o.QD)("p",null,[(0,o.QD)("strong",null,"使用 VS Code 扩展"),(0,o.mY)(":")],-1),u={href:"https://marketplace.visualstudio.com/items?itemName=qingshun.explorer-sort-order",target:"_blank",rel:"noopener noreferrer"},f=(0,o.QD)("li",null,[(0,o.mY)("使用热键 "),(0,o.QD)("code",null,"Ctrl+F10"),(0,o.mY)(" 即可在名称排序和时间排序之间快速切换。")],-1),D={href:"https://github.com/microsoft/vscode/issues/27286",target:"_blank",rel:"noopener noreferrer"},b=(0,o.IL)('

    主题笔记的引入

    LearnData 的另一大改变是引入了主题笔记的概念,它允许部分文章同时在博客中更新,并在特定领域的树状栏中展示,打破了传统主侧边栏的限制。

    以文章「飞书迁移记录」为例,它被放在 apps/tutorials/feishu 路径下,在侧边栏中被归类为应用笔记,而不仅仅是博客文章。通过在文章中加入 article 标签,文章内容既能在博客页面展示,也能出现在 RSS 订阅中。

    飞书迁移记录示例
    飞书迁移记录示例

    这种分类方式的优势在于,我可以将新文章有效地归类于树状侧边栏中。同时,article 标签下的文章按 data 排序,时间越新,文章越靠前。因此,只需为笔记添加创建时间 date 标签,文章便会同时出现在 https://newzone.top/article/https://newzone.top/blog.html 以及 RSS 地址 https://newzone.top/rss.xml 下,并且不会干扰原有的排序逻辑。

    结语

    随着 LearnData 博客的持续优化,改变了一些我对双链笔记的看法,它在海量笔记的管理方面优势明显。但我仍然认为,双链笔记并不适合知识库

    这是因为,在大多数情况下,笔记的积累变成了一种简单的堆砌过程,而不是一个持续的修改、整合和消化的过程。真正的知识管理不应该仅仅是对信息的收集和堆积。拿这篇文章来说,初稿早在 2023 年 12 月就已完成。但为了对外分享,我必须将那些只有我自己能理解的内容进行重构和规范化。正是在这个过程中,我对 LearnData 的思考变得更加清晰,并且想出了用脚本一键定位文章的新方法。如果这篇文章仅仅是我的私人笔记,它可能就会永远停留在初稿阶段,我也不会意识到进一步利用它的必要性。

    在今天这个双链笔记看似无所不能的时代,作为坚持博客形式的少数派,我的做法可能会被一些人视为不必要的复杂和折腾。然而,正是用博客管理知识库的方法,让我的个人效率得到了显著的提升。希望我的这些经验和思考,能为同样致力于高效知识管理的朋友们带来一些新的启示和帮助。

    ',9),w={},L=(0,a(9720).c)(w,[["render",function(e,t){const a=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[n,(0,o.QD)("p",null,[(0,o.mY)("自从我放弃了 Notion 等传统知识管理工具,转而尝试将"),(0,o.QD)("a",r,[(0,o.mY)("博客转化为知识库"),(0,o.K2)(a)]),(0,o.mY)("以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。")]),l,i,p,(0,o.QD)("p",null,[(0,o.mY)("在 "),(0,o.QD)("a",d,[(0,o.mY)("LearnData 开源笔记"),(0,o.K2)(a)]),(0,o.mY)(" 的早期,只有 37 篇笔记和一些博客文章。当我开始将笔记主题化,用短篇形式记录具体知识点时,内容数量迅速增长,例如,关于 Docker 容器的部署笔记就超过了 20 篇。")]),c,(0,o.QD)("p",null,[(0,o.mY)("如果你安装了 Quicker,可以通过安装 "),(0,o.QD)("a",g,[(0,o.mY)("博客定位本地"),(0,o.K2)(a)]),(0,o.mY)(" 动作来实现这一功能。这个脚本不仅适用于 LearnData 项目,同样可以应用于其他静态博客。")]),s,(0,o.QD)("ol",null,[m,(0,o.QD)("li",null,[h,(0,o.QD)("ul",null,[(0,o.QD)("li",null,[(0,o.mY)("安装我开发的 "),(0,o.QD)("a",u,[(0,o.mY)("Explorer Sort Order"),(0,o.K2)(a)]),(0,o.mY)(" 扩展。")]),f])])]),(0,o.QD)("p",null,[(0,o.mY)("尽管社区早在 2017 年的 "),(0,o.QD)("a",D,[(0,o.mY)("Explorer/Opened Editors Sorting"),(0,o.K2)(a)]),(0,o.mY)(" 讨论中提出了自定义排序的需求,但由于官方尚未采纳相关解决方案,我们仍需依赖这些小技巧来优化文件管理体验。")]),b])}]]),z=JSON.parse('{"path":"/posts/2024-01-28-learndata-advanced.html","title":"LearnData 博客:高效知识管理和进阶应用技巧","lang":"zh-CN","frontmatter":{"title":"LearnData 博客:高效知识管理和进阶应用技巧","date":"2024-01-28T00:00:00.000Z","category":["博客"],"order":-57,"description":" 本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。 自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。 但随着使用频...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2024-01-28-learndata-advanced.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"LearnData 博客:高效知识管理和进阶应用技巧"}],["meta",{"property":"og:description","content":" 本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。 自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。 但随着使用频..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-12-12-19-00-11.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-02-06T13:15:26.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"LearnData 博客:高效知识管理和进阶应用技巧"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:published_time","content":"2024-01-28T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2024-02-06T13:15:26.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"LearnData 博客:高效知识管理和进阶应用技巧\\",\\"image\\":[\\"https://img.newzone.top/2023-12-12-19-00-11.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2023-12-12-08-01-10.png?imageMogr2/format/webp \\\\\\"左侧为 VS Code 本地搜索,右侧为网站搜索\\\\\\"\\",\\"https://img.newzone.top/learndata2local.gif?imageMogr2/format/webp \\\\\\"LearnData 博客页面直接跳转到本地\\\\\\"\\",\\"https://img.newzone.top/2024-01-23-05-29-33.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2024-01-23-05-45-34.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2024-01-28T00:00:00.000Z\\",\\"dateModified\\":\\"2024-02-06T13:15:26.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"本地搜索与网页端搜索的权衡","slug":"本地搜索与网页端搜索的权衡","link":"#本地搜索与网页端搜索的权衡","children":[]},{"level":2,"title":"网页查询与本地文件修改的融合","slug":"网页查询与本地文件修改的融合","link":"#网页查询与本地文件修改的融合","children":[]},{"level":2,"title":"VS Code 文件排序","slug":"vs-code-文件排序","link":"#vs-code-文件排序","children":[]},{"level":2,"title":"主题笔记的引入","slug":"主题笔记的引入","link":"#主题笔记的引入","children":[]},{"level":2,"title":"结语","slug":"结语","link":"#结语","children":[]}],"git":{"createdTime":1706531262000,"updatedTime":1707225326000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":6.18,"words":1855},"filePathRelative":"_posts/2024-01-28-learndata-advanced.md","localizedDate":"2024年1月28日","excerpt":"
    \\n

    本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。

    \\n
    \\n

    自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-a97e152e.0e56f063.js b/assets/js/v-a97e152e.0e56f063.js deleted file mode 100644 index bdd7b6dd6..000000000 --- a/assets/js/v-a97e152e.0e56f063.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[6952],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},336:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>p});var r=a(3968);const o={},n=(0,a(9720).c)(o,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/category/%E5%B7%A5%E5%85%B7/","title":"工具 分类","lang":"zh-CN","frontmatter":{"title":"工具 分类","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"工具","key":"category"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/category/%E5%B7%A5%E5%85%B7/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"工具 分类"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"工具 分类\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-ad9f2a7e.c7914595.js b/assets/js/v-ad9f2a7e.c7914595.js deleted file mode 100644 index 3992e0a8a..000000000 --- a/assets/js/v-ad9f2a7e.c7914595.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7428],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},7072:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>n,data:()=>o});var r=a(3968);const c={},n=(0,a(9720).c)(c,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),o=JSON.parse('{"path":"/tag/scrcpy/","title":"标签: scrcpy","lang":"zh-CN","frontmatter":{"title":"标签: scrcpy","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"scrcpy","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/scrcpy/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: scrcpy"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: scrcpy\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-ae81e02e.685cf5f5.js b/assets/js/v-ae81e02e.685cf5f5.js deleted file mode 100644 index a86e10430..000000000 --- a/assets/js/v-ae81e02e.685cf5f5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2784],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},980:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E7%99%BD%E6%9D%BF/","title":"标签: 白板","lang":"zh-CN","frontmatter":{"title":"标签: 白板","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"白板","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E7%99%BD%E6%9D%BF/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 白板"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 白板\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b5797626.ae5b3cb3.js b/assets/js/v-b5797626.ae5b3cb3.js deleted file mode 100644 index 3d38e8d1e..000000000 --- a/assets/js/v-b5797626.ae5b3cb3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1896],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},5094:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>c});var o=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(e,t){const a=(0,o.E1)("Catalog");return(0,o.Wz)(),(0,o.An)("div",null,[(0,o.K2)(a)])}]]),c=JSON.parse('{"path":"/apps/devdocs/","title":"Devdocs","lang":"zh-CN","frontmatter":{"title":"Devdocs","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/devdocs/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Devdocs"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Devdocs\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b6cc9e1c.40d1c176.js b/assets/js/v-b6cc9e1c.40d1c176.js deleted file mode 100644 index 428bec7b1..000000000 --- a/assets/js/v-b6cc9e1c.40d1c176.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2752],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,i]of t)o[e]=i;return o}},7384:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>h,data:()=>s});var i=o(3968);const n=(0,i.QD)("p",null,"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。",-1),a=(0,i.QD)("p",null,"偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。",-1),r=(0,i.QD)("h3",{id:"搭建流程",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#搭建流程"},[(0,i.QD)("span",null,"搭建流程")])],-1),l={href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"http://jekyllthemes.org/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},c=(0,i.IL)('
  • 点击 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),m={},h=(0,o(9720).c)(m,[["render",function(e,t){const o=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[n,a,r,(0,i.QD)("ol",null,[(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("注册并登录 "),(0,i.QD)("a",l,[(0,i.mY)("Github"),(0,i.K2)(o)]),(0,i.mY)("。")])]),(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("选择一个喜欢的 "),(0,i.QD)("a",g,[(0,i.mY)("Jekyll 模板"),(0,i.K2)(o)]),(0,i.mY)(", 进入对应的 Github 主页。我选了黄玄的 "),(0,i.QD)("a",p,[(0,i.mY)("Hux Blog"),(0,i.K2)(o)]),(0,i.mY)("。")])]),c])])}]]),s=JSON.parse('{"path":"/posts/2018-05-01-jekyll_blog_on_github_pages.html","title":"Jekyll 篇一:3 分钟搭建 Github Pages 博客","lang":"zh-CN","frontmatter":{"title":"Jekyll 篇一:3 分钟搭建 Github Pages 博客","date":"2018-05-01T00:00:00.000Z","category":["博客"],"tag":["Jekyll","Github","建站"],"order":-13,"description":"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。 偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。 搭建流程 注册并登录 Github。 选择一个喜欢的 J...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-01-jekyll_blog_on_github_pages.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Jekyll 篇一:3 分钟搭建 Github Pages 博客"}],["meta",{"property":"og:description","content":"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。 偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。 搭建流程 注册并登录 Github。 选择一个喜欢的 J..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180505201522.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Jekyll 篇一:3 分钟搭建 Github Pages 博客"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Jekyll"}],["meta",{"property":"article:tag","content":"Github"}],["meta",{"property":"article:tag","content":"建站"}],["meta",{"property":"article:published_time","content":"2018-05-01T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Jekyll 篇一:3 分钟搭建 Github Pages 博客\\",\\"image\\":[\\"https://img.newzone.top/20180505201522.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180505202201.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/2022-08-08-11-42-16.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180505202859.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-01T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":3,"title":"搭建流程","slug":"搭建流程","link":"#搭建流程","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":7}]},"readingTime":{"minutes":0.89,"words":268},"filePathRelative":"_posts/2018-05-01-jekyll_blog_on_github_pages.md","localizedDate":"2018年5月1日","excerpt":"

    一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。

    \\n

    偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。

    \\n

    搭建流程

    \\n
      \\n
    1. \\n

      注册并登录 Github

      \\n
    2. \\n
    3. \\n

      选择一个喜欢的 Jekyll 模板, 进入对应的 Github 主页。我选了黄玄的 Hux Blog

      \\n
    4. \\n
    5. \\n

      点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

      \\n
      \\"\\"
      \\n
    6. \\n
    7. \\n

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

      \\n
      \\"\\"
      \\n
    8. \\n
    9. \\n

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

      \\n
      \\"\\"
      \\n
    10. \\n
    11. \\n

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

      \\n
      \\"\\"
      \\n
    12. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b77903a2.feba3eb8.js b/assets/js/v-b77903a2.feba3eb8.js deleted file mode 100644 index 38bb00fa3..000000000 --- a/assets/js/v-b77903a2.feba3eb8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1376],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6360:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/","title":"标签: 内网穿透","lang":"zh-CN","frontmatter":{"title":"标签: 内网穿透","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"内网穿透","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 内网穿透"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 内网穿透\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b7b6f2e4.bc828fd7.js b/assets/js/v-b7b6f2e4.bc828fd7.js deleted file mode 100644 index 6b90eb880..000000000 --- a/assets/js/v-b7b6f2e4.bc828fd7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5912],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6448:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/feed43/","title":"标签: Feed43","lang":"zh-CN","frontmatter":{"title":"标签: Feed43","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Feed43","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/feed43/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Feed43"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Feed43\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-b919ccc8.a98f4652.js b/assets/js/v-b919ccc8.a98f4652.js deleted file mode 100644 index 40178f76d..000000000 --- a/assets/js/v-b919ccc8.a98f4652.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[184],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},6712:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>l});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){const a=(0,n.E1)("Catalog");return(0,n.Wz)(),(0,n.An)("div",null,[(0,n.K2)(a)])}]]),l=JSON.parse('{"path":"/family/","title":"Family","lang":"zh-CN","frontmatter":{"title":"Family","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/family/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Family"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Family\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-ba5b3002.91ac2d18.js b/assets/js/v-ba5b3002.91ac2d18.js deleted file mode 100644 index 8c434b3c2..000000000 --- a/assets/js/v-ba5b3002.91ac2d18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5790],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,r]of t)a[e]=r;return a}},2748:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var r=a(3968);const n={},o=(0,a(9720).c)(n,[["render",function(e,t){return(0,r.Wz)(),(0,r.An)("div")}]]),p=JSON.parse('{"path":"/tag/whisper/","title":"标签: Whisper","lang":"zh-CN","frontmatter":{"title":"标签: Whisper","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"Whisper","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/whisper/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: Whisper"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: Whisper\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-bc9bd7e8.a43fed4a.js b/assets/js/v-bc9bd7e8.a43fed4a.js deleted file mode 100644 index d01ac1326..000000000 --- a/assets/js/v-bc9bd7e8.a43fed4a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4852],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1244:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/","title":"标签: 批评与自我批评","lang":"zh-CN","frontmatter":{"title":"标签: 批评与自我批评","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"批评与自我批评","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 批评与自我批评"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 批评与自我批评\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-bfeb58c2.5043a35e.js b/assets/js/v-bfeb58c2.5043a35e.js deleted file mode 100644 index c9306a081..000000000 --- a/assets/js/v-bfeb58c2.5043a35e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[404],{9720:(t,e)=>{e.c=(t,e)=>{const n=t.__vccOpts||t;for(const[t,o]of e)n[t]=o;return n}},9744:(t,e,n)=>{n.r(e),n.d(e,{comp:()=>d,data:()=>g});var o=n(3968);const r=(0,o.IL)('

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

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

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

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

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

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

    ',7),a={href:"https://github.com/huginn/huginn",target:"_blank",rel:"noopener noreferrer"},l=(0,o.QD)("blockquote",null,[(0,o.QD)("p",null,"Huginn 是一个可以创建为你在线执行自动化任务的系统。Huginn 可以读取网页,监测事件并且执行符合你需求的动作。Huginn 通过 agents 创建并执行任务(事件流)。你可以将它看作是一个运行在你自己服务器上的 IFTTT 或 Zapier。")],-1),p=(0,o.QD)("p",null,"Huginn 帮我将所有信息聚合成 RSS,24 小时帮我获取我要的内容。",-1),i={href:"http://news.163.com/rank",target:"_blank",rel:"noopener noreferrer"},c={href:"http://top.baidu.com/buzz?b=1",target:"_blank",rel:"noopener noreferrer"},s={href:"https://www.guokr.com/",target:"_blank",rel:"noopener noreferrer"},u=(0,o.QD)("li",null,"工作类:梅花、SocialBeta、数英网、艾瑞网",-1),m={},d=(0,n(9720).c)(m,[["render",function(t,e){const n=(0,o.E1)("ExternalLinkIcon");return(0,o.Wz)(),(0,o.An)("div",null,[r,(0,o.QD)("p",null,[(0,o.QD)("strong",null,[(0,o.mY)("直到遇到了我的第一个机器人雇员 "),(0,o.QD)("a",a,[(0,o.mY)("Huginn"),(0,o.K2)(n)])])]),l,p,(0,o.QD)("ul",null,[(0,o.QD)("li",null,[(0,o.QD)("a",i,[(0,o.mY)("网易热门新闻"),(0,o.K2)(n)]),(0,o.mY)(":抓取网易顶贴最多的 100 条新闻")]),(0,o.QD)("li",null,[(0,o.QD)("a",c,[(0,o.mY)("百度实时热点"),(0,o.K2)(n)]),(0,o.mY)(":实时更新每天的百度热点")]),(0,o.QD)("li",null,[(0,o.QD)("a",s,[(0,o.mY)("果壳网"),(0,o.K2)(n)]),(0,o.mY)(":果壳首页推荐,官方更新速度较慢,刚好可以了解些奇思妙想")]),u])])}]]),g=JSON.parse('{"path":"/posts/2018-01-31-hire_a_robot.html","title":"雇个机器人帮你干活","lang":"zh-CN","frontmatter":{"title":"雇个机器人帮你干活","date":"2018-01-31T22:51:00.000Z","category":["自动化"],"tag":["Huginn","rss"],"order":-10,"description":" 机器人会取代你工作! 计算云会取代你工作! AI 会取代你的工作! 我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。 作为懒人、宅男,等不及了怎么办? 既然还没被取代,那就雇个机器人帮你干活! 我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 ...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-01-31-hire_a_robot.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"雇个机器人帮你干活"}],["meta",{"property":"og:description","content":" 机器人会取代你工作! 计算云会取代你工作! AI 会取代你的工作! 我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。 作为懒人、宅男,等不及了怎么办? 既然还没被取代,那就雇个机器人帮你干活! 我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-07-24T17:51:16.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Huginn"}],["meta",{"property":"article:tag","content":"rss"}],["meta",{"property":"article:published_time","content":"2018-01-31T22:51:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-07-24T17:51:16.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"雇个机器人帮你干活\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2018-01-31T22:51:00.000Z\\",\\"dateModified\\":\\"2022-07-24T17:51:16.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1658685076000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":1}]},"readingTime":{"minutes":1.65,"words":494},"filePathRelative":"_posts/2018-01-31-hire_a_robot.md","localizedDate":"2018年1月31日","excerpt":"
    \\n

    机器人会取代你工作!\\n计算云会取代你工作!\\nAI 会取代你的工作!

    \\n
    \\n

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

    \\n

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

    \\n

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

    \\n

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

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-c26a570e.f013f6b6.js b/assets/js/v-c26a570e.f013f6b6.js deleted file mode 100644 index 802d298f5..000000000 --- a/assets/js/v-c26a570e.f013f6b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[244],{9720:(e,t)=>{t.c=(e,t)=>{const o=e.__vccOpts||e;for(const[e,c]of t)o[e]=c;return o}},4008:(e,t,o)=>{o.r(t),o.d(t,{comp:()=>a,data:()=>r});var c=o(3968);const i=[(0,c.IL)('

    重新安装 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)],n={},a=(0,o(9720).c)(n,[["render",function(e,t){return(0,c.Wz)(),(0,c.An)("div",null,i)}]]),r=JSON.parse('{"path":"/posts/2017-07-28-office_2016_installer_error.html","title":"office 2016 安装程序报错解决办法","lang":"zh-CN","frontmatter":{"title":"office 2016 安装程序报错解决办法","date":"2017-07-28T11:02:00.000Z","category":["系统"],"tag":["office"],"order":-3,"description":"重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。 解决方法 打开 regedit.exe,在注册表中找到路径 计算机\\\\HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Of...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2017-07-28-office_2016_installer_error.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"office 2016 安装程序报错解决办法"}],["meta",{"property":"og:description","content":"重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。 解决方法 打开 regedit.exe,在注册表中找到路径 计算机\\\\HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Of..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://pic3.zhimg.com/v2-85bd2a49a47ee6d0c8eade7b3c249516_r.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2022-08-12T16:23:39.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"office 2016 安装程序报错解决办法"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"office"}],["meta",{"property":"article:published_time","content":"2017-07-28T11:02:00.000Z"}],["meta",{"property":"article:modified_time","content":"2022-08-12T16:23:39.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"office 2016 安装程序报错解决办法\\",\\"image\\":[\\"https://pic3.zhimg.com/v2-85bd2a49a47ee6d0c8eade7b3c249516_r.jpg\\",\\"https://pic3.zhimg.com/v2-650ede86dd191a8f0a1cd6e9b815377a_r.jpg\\"],\\"datePublished\\":\\"2017-07-28T11:02:00.000Z\\",\\"dateModified\\":\\"2022-08-12T16:23:39.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"解决方法","slug":"解决方法","link":"#解决方法","children":[]}],"git":{"createdTime":1658685076000,"updatedTime":1660321419000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":1.59,"words":477},"filePathRelative":"_posts/2017-07-28-office_2016_installer_error.md","localizedDate":"2017年7月28日","excerpt":"

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

    \\n
    \\"\\"
    \\n

    解决方法

    \\n
      \\n
    1. \\n

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

      \\n
    2. \\n
    3. \\n

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

      \\n
      \\"\\"
      \\n
    4. \\n
    5. \\n

      在 C 盘建立安装组件:

      \\n
        \\n
      • 把安装包路径 \\\\groove.zh-cn\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • \\n
      • 把安装包路径 \\\\proplus.ww\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-0011-0000-1000-0000000FF1CE}-C
      • \\n
      \\n
    6. \\n
    7. \\n

      将需要的程序文件放入 MSOCache 路径\\nMSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。\\n如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      \\n
        \\n
      • Onenote 把安装包路径 \\\\onenote.zh-cn\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • \\n
      • Access 把安装包路径 \\\\access.zh-cn\\\\ 下的文件复制到 C:\\\\MSOCache\\\\All Users\\\\{90160000-0015-0804-1000-0000000FF1CE}-C
      • \\n
      \\n
    8. \\n
    9. \\n

      最后进入安装包运行 setup.exe 安装正常。

      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-c5c8db72.32ac8e11.js b/assets/js/v-c5c8db72.32ac8e11.js deleted file mode 100644 index 51f77b729..000000000 --- a/assets/js/v-c5c8db72.32ac8e11.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2116],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,n]of e)a[t]=n;return a}},8800:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>o,data:()=>l});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(t,e){return(0,n.Wz)(),(0,n.An)("div")}]]),l=JSON.parse('{"path":"/tag/winstall/","title":"标签: winstall","lang":"zh-CN","frontmatter":{"title":"标签: winstall","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"winstall","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/winstall/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: winstall"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: winstall\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-c7695956.58a551cc.js b/assets/js/v-c7695956.58a551cc.js deleted file mode 100644 index bbcb2ff05..000000000 --- a/assets/js/v-c7695956.58a551cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[1552],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},612:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%87%8F%E8%82%A5/","title":"标签: 减肥","lang":"zh-CN","frontmatter":{"title":"标签: 减肥","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"减肥","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%87%8F%E8%82%A5/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 减肥"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 减肥\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-cb07523a.43397bab.js b/assets/js/v-cb07523a.43397bab.js deleted file mode 100644 index f0deea66a..000000000 --- a/assets/js/v-cb07523a.43397bab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5344],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,i]of t)a[e]=i;return a}},3006:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>u,data:()=>z});var i=a(3968);const n=(0,i.QD)("p",null,[(0,i.mY)("Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的"),(0,i.QD)("strong",null,"私人定制资料库"),(0,i.mY)("。")],-1),r=(0,i.QD)("p",null,"之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。",-1),o=(0,i.QD)("p",null,"这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。",-1),p=(0,i.QD)("h2",{id:"建立空白-airtable",tabindex:"-1"},[(0,i.QD)("a",{class:"header-anchor",href:"#建立空白-airtable"},[(0,i.QD)("span",null,"建立空白 Airtable")])],-1),l={href:"https://airtable.com/",target:"_blank",rel:"noopener noreferrer"},g=(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。 "),(0,i.QD)("img",{src:"https://img.newzone.top/20180524095238.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),m=(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("进入刚刚新建的表格,界面跟 Excel 蛮像的。 "),(0,i.QD)("img",{src:"https://img.newzone.top/20180524095557.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),s=(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("在第一栏单击右键,唤出 field 栏目选项,可以更改 filed 栏目类型和名称。 "),(0,i.QD)("img",{src:"https://img.newzone.top/20180524095935.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),b=(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("filed 栏目类型可以设为文本、链接、附件、单选多选等多种玩法,在使用中可以多试试。 "),(0,i.QD)("img",{src:"https://img.newzone.top/20180524100437.png?imageMogr2/format/webp",alt:"",loading:"lazy"})])],-1),c={href:"https://support.airtable.com/hc/en-us/articles/203229705",target:"_blank",rel:"noopener noreferrer"},f=(0,i.IL)('

    应用 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),d={href:"http://www.playpcesor.com/2016/06/airtable.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://sspai.com/post/36402",target:"_blank",rel:"noopener noreferrer"},h={},u=(0,a(9720).c)(h,[["render",function(e,t){const a=(0,i.E1)("ExternalLinkIcon");return(0,i.Wz)(),(0,i.An)("div",null,[n,r,o,p,(0,i.QD)("ol",null,[(0,i.QD)("li",null,[(0,i.QD)("p",null,[(0,i.mY)("注册并登录 "),(0,i.QD)("a",l,[(0,i.mY)("Airtable"),(0,i.K2)(a)]),(0,i.mY)("。")])]),g,m,s,b]),(0,i.QD)("p",null,[(0,i.mY)("更多玩法,参考"),(0,i.QD)("a",c,[(0,i.mY)("官方说明文档"),(0,i.K2)(a)]),(0,i.mY)("。")]),f,(0,i.QD)("ul",null,[(0,i.QD)("li",null,[(0,i.QD)("a",d,[(0,i.mY)("Airtable 最強大線上表格製作,免費資料庫重整任何事"),(0,i.K2)(a)])]),(0,i.QD)("li",null,[(0,i.QD)("a",w,[(0,i.mY)("重新想像 Excel 该有的样子:Airtable 评测"),(0,i.K2)(a)])])])])}]]),z=JSON.parse('{"path":"/posts/2018-05-24-airtable_noob.html","title":"真· Airtable 3 分钟菜鸟入门","lang":"zh-CN","frontmatter":{"title":"真· Airtable 3 分钟菜鸟入门","date":"2018-05-24T00:00:00.000Z","category":["工具"],"tag":["Airtable"],"order":-18,"description":"Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库。 之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。 这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。 建立空白 Airtable 注册并登录 Airtabl...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-05-24-airtable_noob.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"真· Airtable 3 分钟菜鸟入门"}],["meta",{"property":"og:description","content":"Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库。 之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。 这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。 建立空白 Airtable 注册并登录 Airtabl..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180524095238.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"真· Airtable 3 分钟菜鸟入门"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"Airtable"}],["meta",{"property":"article:published_time","content":"2018-05-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"真· Airtable 3 分钟菜鸟入门\\",\\"image\\":[\\"https://img.newzone.top/20180524095238.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524095557.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524095935.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524100437.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524102247.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524102641.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524102740.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524104251.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524105035.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524110129.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524112225.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524112534.png?imageMogr2/thumbnail/500x\\",\\"https://img.newzone.top/20180524112659.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524111028.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524111455.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524111716.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524113003.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524113513.png?imageMogr2/format/webp\\",\\"https://img.newzone.top/20180524114139.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-05-24T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[{"level":2,"title":"建立空白 Airtable","slug":"建立空白-airtable","link":"#建立空白-airtable","children":[]},{"level":2,"title":"应用 Airtable","slug":"应用-airtable","link":"#应用-airtable","children":[]},{"level":2,"title":"Airtable 变形记","slug":"airtable-变形记","link":"#airtable-变形记","children":[{"level":3,"title":"Form view 表单视图","slug":"form-view-表单视图","link":"#form-view-表单视图","children":[]},{"level":3,"title":"Calendar view 日期视图","slug":"calendar-view-日期视图","link":"#calendar-view-日期视图","children":[]},{"level":3,"title":"Gallery view 卡片视图","slug":"gallery-view-卡片视图","link":"#gallery-view-卡片视图","children":[]},{"level":3,"title":"Kanban view 看板视图","slug":"kanban-view-看板视图","link":"#kanban-view-看板视图","children":[]}]}],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":3.31,"words":993},"filePathRelative":"_posts/2018-05-24-airtable_noob.md","localizedDate":"2018年5月24日","excerpt":"

    Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库

    \\n

    之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。

    \\n

    这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。

    \\n

    建立空白 Airtable

    \\n
      \\n
    1. \\n

      注册并登录 Airtable

      \\n
    2. \\n
    3. \\n

      点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。\\n\\"\\"

      \\n
    4. \\n
    5. \\n

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

      \\n
    6. \\n
    7. \\n

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

      \\n
    8. \\n
    9. \\n

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

      \\n
    10. \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-cbb79706.378b9e22.js b/assets/js/v-cbb79706.378b9e22.js deleted file mode 100644 index aa971c00b..000000000 --- a/assets/js/v-cbb79706.378b9e22.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[3616],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},6e3:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%9D%90/","title":"标签: 健身器材","lang":"zh-CN","frontmatter":{"title":"标签: 健身器材","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"健身器材","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%9D%90/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 健身器材"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 健身器材\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-cf5c357e.43ff19ca.js b/assets/js/v-cf5c357e.43ff19ca.js deleted file mode 100644 index 84dafab3f..000000000 --- a/assets/js/v-cf5c357e.43ff19ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9832],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,o]of t)a[e]=o;return a}},4628:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>r,data:()=>p});var o=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(e,t){return(0,o.Wz)(),(0,o.An)("div")}]]),p=JSON.parse('{"path":"/tag/obs/","title":"标签: OBS","lang":"zh-CN","frontmatter":{"title":"标签: OBS","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"OBS","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/obs/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: OBS"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: OBS\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-d339fac6.df68050f.js b/assets/js/v-d339fac6.df68050f.js deleted file mode 100644 index 689ebfa84..000000000 --- a/assets/js/v-d339fac6.df68050f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7760],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},1352:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%B9%B8%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE/","title":"标签: 幸存者偏差","lang":"zh-CN","frontmatter":{"title":"标签: 幸存者偏差","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"幸存者偏差","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%B9%B8%E5%AD%98%E8%80%85%E5%81%8F%E5%B7%AE/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 幸存者偏差"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 幸存者偏差\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-d5b24bc2.280d8912.js b/assets/js/v-d5b24bc2.280d8912.js deleted file mode 100644 index 5b261b390..000000000 --- a/assets/js/v-d5b24bc2.280d8912.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9584],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},9116:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/timeline/","title":"时间轴","lang":"zh-CN","frontmatter":{"title":"时间轴","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"type","key":"timeline"},"layout":"Timeline","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/timeline/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"时间轴"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"时间轴\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-da09220e.975cc90d.js b/assets/js/v-da09220e.975cc90d.js deleted file mode 100644 index 6de2a47be..000000000 --- a/assets/js/v-da09220e.975cc90d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[8956],{9720:(t,e)=>{e.c=(t,e)=>{const a=t.__vccOpts||t;for(const[t,o]of e)a[t]=o;return a}},1868:(t,e,a)=>{a.r(e),a.d(e,{comp:()=>r,data:()=>s});var o=a(3968);const n={},r=(0,a(9720).c)(n,[["render",function(t,e){const a=(0,o.E1)("Catalog");return(0,o.Wz)(),(0,o.An)("div",null,[(0,o.K2)(a)])}]]),s=JSON.parse('{"path":"/posts/","title":"Posts","lang":"zh-CN","frontmatter":{"title":"Posts","article":false,"feed":false,"sitemap":false,"description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"Posts"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Posts\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":1},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-e6c5c1c6.2909187f.js b/assets/js/v-e6c5c1c6.2909187f.js deleted file mode 100644 index 2bab42378..000000000 --- a/assets/js/v-e6c5c1c6.2909187f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[836],{9720:(t,o)=>{o.c=(t,o)=>{const e=t.__vccOpts||t;for(const[t,r]of o)e[t]=r;return e}},3648:(t,o,e)=>{e.r(o),e.d(o,{comp:()=>u,data:()=>k});var r=e(3968);const n=(0,r.QD)("div",{class:"hint-container warning"},[(0,r.QD)("p",{class:"hint-container-title"},"注意"),(0,r.QD)("p",null,"KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。")],-1),p=(0,r.QD)("p",null,"koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)",-1),l=(0,r.QD)("p",null,"为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。",-1),a=(0,r.QD)("p",null,"这是我们需要进入路由器后台,对证书地址进行操作。",-1),i=(0,r.QD)("p",null,[(0,r.mY)("进入路由器后台,一般设置-Tools-Run Cmd ,运行命令 "),(0,r.QD)("code",null,"iptables -t nat -I PREROUTING -d 110.110.110.110 -p tcp --dport 80 -j REDIRECT --to 3000"),(0,r.mY)("。重启后,该命令失效。")],-1),s=(0,r.QD)("figure",null,[(0,r.QD)("img",{src:"https://img.newzone.top/20180610143928.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),(0,r.QD)("figcaption")],-1),m={href:"http://koolshare.cn/thread-80430-1-1.html",target:"_blank",rel:"noopener noreferrer"},c=(0,r.QD)("p",null,[(0,r.mY)("保存 Koolproxy 设置后,一定要"),(0,r.QD)("strong",null,"重启路由"),(0,r.mY)(",否则可能部分屏蔽设置未成功生效。")],-1),h=(0,r.QD)("p",null,[(0,r.QD)("strong",null,"参考资料:")],-1),g={href:"https://github.com/koolproxy/merlin-koolproxy",target:"_blank",rel:"noopener noreferrer"},y={href:"http://koolshare.cn/thread-81712-1-1.html",target:"_blank",rel:"noopener noreferrer"},d={},u=(0,e(9720).c)(d,[["render",function(t,o){const e=(0,r.E1)("ExternalLinkIcon");return(0,r.Wz)(),(0,r.An)("div",null,[n,p,l,a,i,s,(0,r.QD)("p",null,[(0,r.mY)("运行命令后,就可以下载 https 证书,之后的设置参考 "),(0,r.QD)("a",m,[(0,r.mY)("Merlin 版 Koolproxy3.1.x 使用教程"),(0,r.K2)(e)]),(0,r.mY)("。")]),c,h,(0,r.QD)("ul",null,[(0,r.QD)("li",null,[(0,r.QD)("a",g,[(0,r.mY)("koolproxy 项目地址"),(0,r.K2)(e)])]),(0,r.QD)("li",null,[(0,r.QD)("a",y,[(0,r.mY)("失效链接"),(0,r.K2)(e)])])])])}]]),k=JSON.parse('{"path":"/posts/2018-06-10-koolproxy_https.html","title":"koolproxy 无法下载 https 证书?","lang":"zh-CN","frontmatter":{"title":"koolproxy 无法下载 https 证书?","date":"2018-06-10T00:00:00.000Z","category":["网络"],"tag":["koolproxy"],"order":-20,"description":" 注意 KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。 koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。) 为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证...","head":[["meta",{"property":"og:url","content":"https://newzone.top/posts/2018-06-10-koolproxy_https.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"koolproxy 无法下载 https 证书?"}],["meta",{"property":"og:description","content":" 注意 KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。 koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。) 为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.newzone.top/20180610143928.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-10T07:06:18.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"koolproxy 无法下载 https 证书?"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:tag","content":"koolproxy"}],["meta",{"property":"article:published_time","content":"2018-06-10T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-10T07:06:18.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"koolproxy 无法下载 https 证书?\\",\\"image\\":[\\"https://img.newzone.top/20180610143928.png?imageMogr2/format/webp\\"],\\"datePublished\\":\\"2018-06-10T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-10T07:06:18.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"清顺\\",\\"url\\":\\"https://newzone.top\\"}]}"]]},"headers":[],"git":{"createdTime":1658685076000,"updatedTime":1681110378000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":6}]},"readingTime":{"minutes":0.98,"words":294},"filePathRelative":"_posts/2018-06-10-koolproxy_https.md","localizedDate":"2018年6月10日","excerpt":"
    \\n

    注意

    \\n

    KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。

    \\n
    \\n

    koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)

    \\n

    为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-e973441e.dd6a3a1c.js b/assets/js/v-e973441e.dd6a3a1c.js deleted file mode 100644 index c58e59cd7..000000000 --- a/assets/js/v-e973441e.dd6a3a1c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7164],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},4456:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BD%95%E5%B1%8F/","title":"标签: 录屏","lang":"zh-CN","frontmatter":{"title":"标签: 录屏","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"录屏","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BD%95%E5%B1%8F/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 录屏"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 录屏\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-ec3bd762.0571e3e2.js b/assets/js/v-ec3bd762.0571e3e2.js deleted file mode 100644 index 333932b9e..000000000 --- a/assets/js/v-ec3bd762.0571e3e2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[2360],{9720:(e,o)=>{o.c=(e,o)=>{const t=e.__vccOpts||e;for(const[e,r]of o)t[e]=r;return t}},7544:(e,o,t)=>{t.r(o),t.d(o,{comp:()=>d,data:()=>p});var r=t(3968);const a={href:"https://github.com/awesome-selfhosted/awesome-selfhosted",target:"_blank",rel:"noopener noreferrer"},c=(0,r.QD)("code",null,"docker-compose.yml",-1),s={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"},n=(0,r.IL)('

    操作步骤如下:

    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 为实例,为了确保正常运行,我们可以临时为该文件夹授权“所有人”权限,但建议后续寻求更安全的权限管理策略。

    编号规则

    • 1-10:影视音乐类
    • 11-20:娱乐阅读类
    • 21-30:同步网盘
    • 31-40:文档管理
    • 41-70:空位
    • 71-80:未分类(默认)
    • 81-90: 自动化
    • 91-100:导航
    • 101+:后端
    ',16),l={class:"catalog-display-container"},i={},d=(0,t(9720).c)(i,[["render",function(e,o){const t=(0,r.E1)("ExternalLinkIcon"),i=(0,r.E1)("AutoCatalog");return(0,r.Wz)(),(0,r.An)("div",null,[(0,r.QD)("p",null,[(0,r.mY)("网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。"),(0,r.QD)("a",a,[(0,r.mY)("awesome-selfhosted"),(0,r.K2)(t)]),(0,r.mY)("可查看多种自部署服务。而使用 "),c,(0,r.mY)(" 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 "),(0,r.QD)("a",s,[(0,r.mY)("TTRSS docker-compose 的教程"),(0,r.K2)(t)]),(0,r.mY)("。")]),n,(0,r.g1)(" markdownlint-disable MD033 "),(0,r.QD)("div",l,[(0,r.K2)(i,{base:"/services/dockers-on-nas/"})]),(0,r.g1)(" markdownlint-enable MD033 ")])}]]),p=JSON.parse('{"path":"/services/dockers-on-nas/","title":"NAS 应用集合","lang":"zh-CN","frontmatter":{"article":false,"index":false,"title":"NAS 应用集合","icon":"process","description":"网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-c...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"NAS 应用集合"}],["meta",{"property":"og:description","content":"网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-c..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:image","content":"https://img.newzone.top/2023-09-16-08-42-22.png?imageMogr2/format/webp"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-15T19:15:29.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"NAS 应用集合"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-15T19:15:29.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"NAS 应用集合\\",\\"description\\":\\"网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-c...\\"}"]]},"headers":[{"level":2,"title":"部署问题","slug":"部署问题","link":"#部署问题","children":[{"level":3,"title":"路径对照","slug":"路径对照","link":"#路径对照","children":[]},{"level":3,"title":"用户与组身份","slug":"用户与组身份","link":"#用户与组身份","children":[]},{"level":3,"title":"文件夹访问权限","slug":"文件夹访问权限","link":"#文件夹访问权限","children":[]}]},{"level":2,"title":"编号规则","slug":"编号规则","link":"#编号规则","children":[]}],"git":{"createdTime":1694827853000,"updatedTime":1705346129000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":4}]},"readingTime":{"minutes":2.79,"words":838},"filePathRelative":"services/dockers-on-nas/README.md","localizedDate":"2023年9月16日","excerpt":"

    网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhosted可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-compose 的教程

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-f4530e16.57a3c7c4.js b/assets/js/v-f4530e16.57a3c7c4.js deleted file mode 100644 index 2d9fb6191..000000000 --- a/assets/js/v-f4530e16.57a3c7c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[5134],{9720:(e,t)=>{t.c=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a}},5180:(e,t,a)=>{a.r(t),a.d(t,{comp:()=>o,data:()=>p});var n=a(3968);const r={},o=(0,a(9720).c)(r,[["render",function(e,t){return(0,n.Wz)(),(0,n.An)("div")}]]),p=JSON.parse('{"path":"/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/","title":"标签: 微信红包","lang":"zh-CN","frontmatter":{"title":"标签: 微信红包","dir":{"index":false},"index":false,"feed":false,"sitemap":false,"blog":{"type":"category","name":"微信红包","key":"tag"},"layout":"BlogCategory","description":"","head":[["meta",{"property":"og:url","content":"https://newzone.top/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"标签: 微信红包"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"清顺"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"标签: 微信红包\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0,"words":0},"filePathRelative":null,"excerpt":"","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/v-fde639ec.fbe74b9a.js b/assets/js/v-fde639ec.fbe74b9a.js deleted file mode 100644 index 5dfb8e58e..000000000 --- a/assets/js/v-fde639ec.fbe74b9a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[4952],{9720:(a,e)=>{e.c=(a,e)=>{const n=a.__vccOpts||a;for(const[a,s]of e)n[a]=s;return n}},280:(a,e,n)=>{n.r(e),n.d(e,{comp:()=>d,data:()=>u});var s=n(3968);const t={href:"https://hub.docker.com/r/xiaoyaliu/alist",target:"_blank",rel:"noopener noreferrer"},i={href:"https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f",target:"_blank",rel:"noopener noreferrer"},l={href:"https://aliyuntoken.vercel.app/",target:"_blank",rel:"noopener noreferrer"},o=(0,s.QD)("h2",{id:"结合-emby-使用",tabindex:"-1"},[(0,s.QD)("a",{class:"header-anchor",href:"#结合-emby-使用"},[(0,s.QD)("span",null,"结合 Emby 使用")])],-1),r={href:"https://xiaoyaliu.notion.site/d353c9ceb15444d7b8e21ce6097ed739?v=145044ac8252470a9feef094ff1db520",target:"_blank",rel:"noopener noreferrer"},c=(0,s.IL)('

    这种方法允许你将小雅的资源库与 Emby 紧密整合,利用 strm 文件将它们连接起来,并通过同步软件保持它们的内容同步。但是,在使用这种方法时,需要注意元数据可能会占用高达 160G 的空间,并且下载元数据的过程可能会对你现有的 Emby 数据造成影响。因此,在执行以下命令之前,请确保进行了配置备份。

    # 一键下载元数据(不需进入docker),媒体库目录与小雅配置目录\nbash -c "$(curl http://docker.xiaoya.pro/update_metainfo.sh)" -s /volume1/docker/emby /volume1/docker/xiaoya\n

    无法下载问题

    虽然小雅 Alist 提供了便捷的在线播放功能,但有时你可能更希望将资源下载到本地,尤其是在遇到播放问题时。

    我尝试将资源保存到我的阿里云盘,但未能成功。即使我通过 show_my_ali.txt 文件在小雅 Alist 中成功显示了我的云盘内容,移动和复制操作仍然失败,错误提示为 Request failed with status code 403。目前,对于这个问题,我只能通过下载单个文件作为临时解决方案。

    部署代码

    version: "3.3"\n\nservices:\n  xiaoya:\n    image: xiaoyaliu/alist:latest\n    container_name: xiaoya\n    volumes:\n      - /volume1/docker/xiaoya:/data\n    ports:\n      - 6789:80\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n    restart: always\n

    通过上述的配置和步骤,你可以方便地集成和管理来自阿里云盘的丰富资源,并通过 Emby 享受高质量的播放体验。同时,也请留意资源管理和下载的相关问题,并根据实际情况进行调整和优化。希望你能通过小雅 Alist 和 Emby 打造出一个既私密又高效的个人影音库。

    如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',9),p={},d=(0,n(9720).c)(p,[["render",function(a,e){const n=(0,s.E1)("ExternalLinkIcon");return(0,s.Wz)(),(0,s.An)("div",null,[(0,s.QD)("p",null,[(0,s.mY)("小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 "),(0,s.QD)("a",t,[(0,s.mY)("xiaoyaliu/alist"),(0,s.K2)(n)]),(0,s.mY)(" Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 "),(0,s.QD)("a",i,[(0,s.mY)("xiaoya docker 配置指南"),(0,s.K2)(n)]),(0,s.mY)("。")]),(0,s.QD)("p",null,[(0,s.mY)("在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 mytoken。你可以通过访问 "),(0,s.QD)("a",l,[(0,s.mY)("https://aliyuntoken.vercel.app/"),(0,s.K2)(n)]),(0,s.mY)(" 并使用阿里云盘 app 扫描网页上的二维码,轻松地获取最新的 token。")]),o,(0,s.QD)("p",null,[(0,s.mY)("如果你已经在使用 Emby 作为个人媒体服务器,那么可以通过小雅将其丰富的影音内容集成到你的 Emby 服务器中,从而提升你的播放体验。详细的操作步骤和方法,请参阅 "),(0,s.QD)("a",r,[(0,s.mY)("《如何使用 EMBY 展示小雅内容》教程"),(0,s.K2)(n)]),(0,s.mY)("。")]),c])}]]),u=JSON.parse('{"path":"/services/dockers-on-nas/xiaoya.html","title":"小雅 alist:影视资源合集","lang":"zh-CN","frontmatter":{"article":false,"title":"小雅 alist:影视资源合集","order":2,"description":"小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南。 在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 m...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/xiaoya.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"小雅 alist:影视资源合集"}],["meta",{"property":"og:description","content":"小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南。 在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 m..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"小雅 alist:影视资源合集\\",\\"description\\":\\"小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南。 在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 m...\\"}"]]},"headers":[{"level":2,"title":"结合 Emby 使用","slug":"结合-emby-使用","link":"#结合-emby-使用","children":[]},{"level":2,"title":"无法下载问题","slug":"无法下载问题","link":"#无法下载问题","children":[]},{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.44,"words":733},"filePathRelative":"services/dockers-on-nas/xiaoya.md","localizedDate":"2023年12月19日","excerpt":"

    小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/vscode.html.44a30585.js b/assets/js/vscode.html.44a30585.js new file mode 100644 index 000000000..5a6023872 --- /dev/null +++ b/assets/js/vscode.html.44a30585.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[7230],{3671:(o,e)=>{e.A=(o,e)=>{const t=o.__vccOpts||o;for(const[o,n]of e)t[o]=n;return t}},8545:(o,e,t)=>{t.r(e),t.d(e,{comp:()=>g,data:()=>p});var n=t(7847);const r=(0,n.Fv)('

    利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。

    写作辅助

    • AutoCorrect:这个插件是写作纠错的佼佼者,特别是在处理中英文混排时的空格问题,但它尚未支持中英标点符号的自动转换。
    • Pangu-Markdown:对于想在 Markdown 文档中为超链接和文本之间自动添加空格的用户来说,这个插件是个不错的选择。它也能够在中英文字符之间添加空格,从而优化 Markdown 文档的排版。但 Pangu-Markdown 需要手动唤起命令面板,并应用 Pangu Format 来格式化文本。

    Markdown 增强

    • Markdown All in One:提供了全面的 Markdown 支持,使写作变得更加高效。
    • Markdown Preview Enhanced:这个插件提供了 Markdown 文件的增强预览功能。
    • markdownlint:用于 Markdown 语法的检查和修正。通过自定义设置,例如在配置文件中添加 "markdownlint.config": { "MD034": false },可以关闭某些可能与其他项目(如 docusaurus3)冲突的特性。
    • Word Count CJK:中英文字符计数工具。

    界面美化

    • Blockman:能够突出显示代码中的嵌套块,增强代码的可读性。如果插件会报错 Error:invalid syntax,则在设置中搜索 N25,关闭 Blockman:N25 Analyze Tags[1]
    • Color Highlight:将 CSS 颜色代码直观地显示为相应的颜色。
    • indent-rainbow:通过使用四种不同颜色交替显示,对文本前的缩进进行可视化处理。
    • Prettier:使用定制规则重新格式化代码,以实现一致的代码风格。建议开启文件保存时自动格式化文本的功能。
    • Image Preview:提供文件内的图片预览功能,支持 CSS 和 SVG 格式。
    • vscode-icons:根据文件类型显示相应的图标,使文件浏览更直观。
    • File Nesting Updater:利用 VS Code 的文件嵌套功能,使文件树结构更加整洁。

    代码补全

    • Auto Rename Tag:在重命名一个标签时,自动重命名 HTML 标签的开始和结束标签。避免只修改了开始标签,而忘记修改结束标签。该扩展适用于 HTML、XML、PHP 和 JavaScript。
    • Auto Close Tag:自动输入标签的闭合,提高编码效率。
    • Code Spell Checker:在 VSCode 中检查代码拼写错误,支持变量、函数和注释等。它还允许用户添加自定义词汇,适应特定项目的需求。
    • Path Intellisense:自动补全文件路径,尤其在导入文件时,能够快速提示并完成文件名的输入。

    ',10),a={class:"footnotes"},l={class:"footnotes-list"},s={id:"footnote1",class:"footnote-item"},i={href:"https://github.com/leodevbro/vscode-blockman/issues/43",target:"_blank",rel:"noopener noreferrer"},d=(0,n.Lk)("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),c={},g=(0,t(3671).A)(c,[["render",function(o,e){const t=(0,n.g2)("ExternalLinkIcon");return(0,n.uX)(),(0,n.CE)("div",null,[r,(0,n.Lk)("section",a,[(0,n.Lk)("ol",l,[(0,n.Lk)("li",s,[(0,n.Lk)("p",null,[(0,n.Lk)("a",i,[(0,n.eW)("Bug: commented RegExp throws invalid syntax error"),(0,n.bF)(t)]),(0,n.eW)(),d])])])])])}]]),p=JSON.parse('{"path":"/apps/tutorials/vscode.html","title":"VS Code","lang":"zh-CN","frontmatter":{"article":false,"title":"VS Code","order":3,"description":"利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。 写作辅助 Aut...","head":[["meta",{"property":"og:url","content":"https://newzone.top/apps/tutorials/vscode.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"VS Code"}],["meta",{"property":"og:description","content":"利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。 写作辅助 Aut..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-23T10:09:14.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-23T10:09:14.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"VS Code\\",\\"description\\":\\"利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。 写作辅助 Aut...\\"}"]]},"headers":[{"level":2,"title":"写作辅助","slug":"写作辅助","link":"#写作辅助","children":[]},{"level":2,"title":"Markdown 增强","slug":"markdown-增强","link":"#markdown-增强","children":[]},{"level":2,"title":"界面美化","slug":"界面美化","link":"#界面美化","children":[]},{"level":2,"title":"代码补全","slug":"代码补全","link":"#代码补全","children":[]}],"git":{"createdTime":1705346129000,"updatedTime":1706004554000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.58,"words":774},"filePathRelative":"apps/tutorials/vscode.md","localizedDate":"2024年1月15日","excerpt":"

    利用各种插件,VS Code 不仅能够提高编程效率,还极大改善写作体验。尽管现在的 VS Code 配备了配置同步功能,但我在最近一次重装电脑系统后却遭遇了一个意外:VS Code 配置然全部消失了。这个意外促使我撰写这篇文章,作为备忘录。因此,为了避免类似情况的发生,我建议在重新安装系统之前,还是要手动备份你的配置文件,以确保安全。

    \\n

    写作辅助

    \\n
      \\n
    • AutoCorrect:这个插件是写作纠错的佼佼者,特别是在处理中英文混排时的空格问题,但它尚未支持中英标点符号的自动转换。
    • \\n
    • Pangu-Markdown:对于想在 Markdown 文档中为超链接和文本之间自动添加空格的用户来说,这个插件是个不错的选择。它也能够在中英文字符之间添加空格,从而优化 Markdown 文档的排版。但 Pangu-Markdown 需要手动唤起命令面板,并应用 Pangu Format 来格式化文本。
    • \\n
    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/assets/js/xiaoya.html.92295452.js b/assets/js/xiaoya.html.92295452.js new file mode 100644 index 000000000..520ee8875 --- /dev/null +++ b/assets/js/xiaoya.html.92295452.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklearn_data=self.webpackChunklearn_data||[]).push([[9789],{3671:(a,e)=>{e.A=(a,e)=>{const n=a.__vccOpts||a;for(const[a,s]of e)n[a]=s;return n}},7912:(a,e,n)=>{n.r(e),n.d(e,{comp:()=>d,data:()=>u});var s=n(7847);const t={href:"https://hub.docker.com/r/xiaoyaliu/alist",target:"_blank",rel:"noopener noreferrer"},i={href:"https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f",target:"_blank",rel:"noopener noreferrer"},l={href:"https://aliyuntoken.vercel.app/",target:"_blank",rel:"noopener noreferrer"},o=(0,s.Lk)("h2",{id:"结合-emby-使用",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#结合-emby-使用"},[(0,s.Lk)("span",null,"结合 Emby 使用")])],-1),r={href:"https://xiaoyaliu.notion.site/d353c9ceb15444d7b8e21ce6097ed739?v=145044ac8252470a9feef094ff1db520",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Fv)('

    这种方法允许你将小雅的资源库与 Emby 紧密整合,利用 strm 文件将它们连接起来,并通过同步软件保持它们的内容同步。但是,在使用这种方法时,需要注意元数据可能会占用高达 160G 的空间,并且下载元数据的过程可能会对你现有的 Emby 数据造成影响。因此,在执行以下命令之前,请确保进行了配置备份。

    # 一键下载元数据(不需进入docker),媒体库目录与小雅配置目录\nbash -c "$(curl http://docker.xiaoya.pro/update_metainfo.sh)" -s /volume1/docker/emby /volume1/docker/xiaoya\n

    无法下载问题

    虽然小雅 Alist 提供了便捷的在线播放功能,但有时你可能更希望将资源下载到本地,尤其是在遇到播放问题时。

    我尝试将资源保存到我的阿里云盘,但未能成功。即使我通过 show_my_ali.txt 文件在小雅 Alist 中成功显示了我的云盘内容,移动和复制操作仍然失败,错误提示为 Request failed with status code 403。目前,对于这个问题,我只能通过下载单个文件作为临时解决方案。

    部署代码

    version: "3.3"\n\nservices:\n  xiaoya:\n    image: xiaoyaliu/alist:latest\n    container_name: xiaoya\n    volumes:\n      - /volume1/docker/xiaoya:/data\n    ports:\n      - 6789:80\n    environment:\n      - PUID=1026\n      - PGID=100\n      - TZ=Asia/Shanghai\n    restart: always\n

    通过上述的配置和步骤,你可以方便地集成和管理来自阿里云盘的丰富资源,并通过 Emby 享受高质量的播放体验。同时,也请留意资源管理和下载的相关问题,并根据实际情况进行调整和优化。希望你能通过小雅 Alist 和 Emby 打造出一个既私密又高效的个人影音库。

    如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    ',9),c={},d=(0,n(3671).A)(c,[["render",function(a,e){const n=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("p",null,[(0,s.eW)("小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 "),(0,s.Lk)("a",t,[(0,s.eW)("xiaoyaliu/alist"),(0,s.bF)(n)]),(0,s.eW)(" Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 "),(0,s.Lk)("a",i,[(0,s.eW)("xiaoya docker 配置指南"),(0,s.bF)(n)]),(0,s.eW)("。")]),(0,s.Lk)("p",null,[(0,s.eW)("在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 mytoken。你可以通过访问 "),(0,s.Lk)("a",l,[(0,s.eW)("https://aliyuntoken.vercel.app/"),(0,s.bF)(n)]),(0,s.eW)(" 并使用阿里云盘 app 扫描网页上的二维码,轻松地获取最新的 token。")]),o,(0,s.Lk)("p",null,[(0,s.eW)("如果你已经在使用 Emby 作为个人媒体服务器,那么可以通过小雅将其丰富的影音内容集成到你的 Emby 服务器中,从而提升你的播放体验。详细的操作步骤和方法,请参阅 "),(0,s.Lk)("a",r,[(0,s.eW)("《如何使用 EMBY 展示小雅内容》教程"),(0,s.bF)(n)]),(0,s.eW)("。")]),p])}]]),u=JSON.parse('{"path":"/services/dockers-on-nas/xiaoya.html","title":"小雅 alist:影视资源合集","lang":"zh-CN","frontmatter":{"article":false,"title":"小雅 alist:影视资源合集","order":2,"description":"小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南。 在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 m...","head":[["meta",{"property":"og:url","content":"https://newzone.top/services/dockers-on-nas/xiaoya.html"}],["meta",{"property":"og:site_name","content":"LearnData-开源笔记"}],["meta",{"property":"og:title","content":"小雅 alist:影视资源合集"}],["meta",{"property":"og:description","content":"小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南。 在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 m..."}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-01-30T12:19:47.000Z"}],["meta",{"property":"article:author","content":"清顺"}],["meta",{"property":"article:modified_time","content":"2024-01-30T12:19:47.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"小雅 alist:影视资源合集\\",\\"description\\":\\"小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南。 在使用小雅 Alist 过程中,需要注意的一个关键点是定期更新 m...\\"}"]]},"headers":[{"level":2,"title":"结合 Emby 使用","slug":"结合-emby-使用","link":"#结合-emby-使用","children":[]},{"level":2,"title":"无法下载问题","slug":"无法下载问题","link":"#无法下载问题","children":[]},{"level":2,"title":"部署代码","slug":"部署代码","link":"#部署代码","children":[]}],"git":{"createdTime":1702968675000,"updatedTime":1706617187000,"contributors":[{"name":"rockbenben","email":"qingwhat@gmail.com","commits":3}]},"readingTime":{"minutes":2.44,"words":733},"filePathRelative":"services/dockers-on-nas/xiaoya.md","localizedDate":"2023年12月19日","excerpt":"

    小雅 Alist 是一款基于阿里云盘的解决方案,提供了一个整合了丰富影音资源的平台,大大简化了用户寻找和管理资源的过程。通过 xiaoyaliu/alist Docker 镜像,你可以快速部署小雅 Alist 服务。具体的配置步骤和方法,可以参考 xiaoya docker 配置指南

    ","autoDesc":true}')}}]); \ No newline at end of file diff --git a/blog.html b/blog.html index a378b1560..226026ad7 100644 --- a/blog.html +++ b/blog.html @@ -28,8 +28,8 @@ } 互联网小白 | LearnData-开源笔记 - - + + + diff --git a/category/index.html b/category/index.html index a7151ecbf..c76230d07 100644 --- a/category/index.html +++ b/category/index.html @@ -28,8 +28,8 @@ } 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\345\201\245\345\272\267/index.html" "b/category/\345\201\245\345\272\267/index.html" index 0de2e50ef..e1e43f853 100644 --- "a/category/\345\201\245\345\272\267/index.html" +++ "b/category/\345\201\245\345\272\267/index.html" @@ -28,8 +28,8 @@ } 健康 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\345\215\232\345\256\242/index.html" "b/category/\345\215\232\345\256\242/index.html" index a7b55bef9..ec0d2bf73 100644 --- "a/category/\345\215\232\345\256\242/index.html" +++ "b/category/\345\215\232\345\256\242/index.html" @@ -28,8 +28,8 @@ } 博客 分类 | LearnData-开源笔记 - - + + + 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 d125172c7..85fade399 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" @@ -28,8 +28,8 @@ } 头脑驿站 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\345\267\245\345\205\267/index.html" "b/category/\345\267\245\345\205\267/index.html" index 8f7fba151..0b04d4538 100644 --- "a/category/\345\267\245\345\205\267/index.html" +++ "b/category/\345\267\245\345\205\267/index.html" @@ -28,8 +28,8 @@ } 工具 分类 | LearnData-开源笔记 - - + + + 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 1e5a632fc..500cfff87 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" @@ -28,8 +28,8 @@ } 服务器 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\347\263\273\347\273\237/index.html" "b/category/\347\263\273\347\273\237/index.html" index 7909cd164..e0900a2db 100644 --- "a/category/\347\263\273\347\273\237/index.html" +++ "b/category/\347\263\273\347\273\237/index.html" @@ -28,8 +28,8 @@ } 系统 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\347\275\221\347\273\234/index.html" "b/category/\347\275\221\347\273\234/index.html" index d0b3f16e5..0db435c11 100644 --- "a/category/\347\275\221\347\273\234/index.html" +++ "b/category/\347\275\221\347\273\234/index.html" @@ -28,8 +28,8 @@ } 网络 分类 | LearnData-开源笔记 - - + + + 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 bd51ade70..5c4454e97 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" @@ -28,8 +28,8 @@ } 自动化 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\350\247\202\345\257\237\351\232\217\347\254\224/index.html" "b/category/\350\247\202\345\257\237\351\232\217\347\254\224/index.html" index 7ca96e31e..c9dde6d77 100644 --- "a/category/\350\247\202\345\257\237\351\232\217\347\254\224/index.html" +++ "b/category/\350\247\202\345\257\237\351\232\217\347\254\224/index.html" @@ -28,8 +28,8 @@ } 观察随笔 分类 | LearnData-开源笔记 - - + + + diff --git "a/category/\350\264\255\347\211\251/index.html" "b/category/\350\264\255\347\211\251/index.html" index 6e7bee1a2..d34fa9bd5 100644 --- "a/category/\350\264\255\347\211\251/index.html" +++ "b/category/\350\264\255\347\211\251/index.html" @@ -28,8 +28,8 @@ } 购物 分类 | LearnData-开源笔记 - - + + + diff --git a/code/AutoHotkey.html b/code/AutoHotkey.html index eca96d859..3264c96c5 100644 --- a/code/AutoHotkey.html +++ b/code/AutoHotkey.html @@ -28,8 +28,8 @@ } AutoHotkey | LearnData-开源笔记 - - + + +

    1. Win 下最爱效率利器:AutoHotKeyopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/code/Electron.html b/code/Electron.html index 3af5caca1..a571f58c1 100644 --- a/code/Electron.html +++ b/code/Electron.html @@ -28,8 +28,8 @@ } Electron | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/code/HTML.html b/code/HTML.html index 031680a1a..96650f94b 100644 --- a/code/HTML.html +++ b/code/HTML.html @@ -28,8 +28,8 @@ } HTML | LearnData-开源笔记 - - + + +
    1. 开源 JavaScript 插件和库open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/code/Javascript.html b/code/Javascript.html index efe324384..b35dfadff 100644 --- a/code/Javascript.html +++ b/code/Javascript.html @@ -28,8 +28,8 @@ } JavaScript | LearnData-开源笔记 - - + + +
    1. radio、checkbox 选中状态研究open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/code/Markdown.html b/code/Markdown.html index 65b0eba97..19b7ce99a 100644 --- a/code/Markdown.html +++ b/code/Markdown.html @@ -28,8 +28,8 @@ } Markdown | LearnData-开源笔记 - - + + +

    代码块自动换行

    自动换行需要 css 支持,暂不能自动启用。

    整段删除线

    ~~ 只支持对本行内容添加删除线。

    如果要对大段内容添加删除线,可以用 HTML 标签 <s></s>,被该标签包围的内容会全部添加删除线。VuePress 暂不支持该代码,会将标签识别为不完整而报错。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/code/Python.html b/code/Python.html index 7ab178b02..4ce8ee521 100644 --- a/code/Python.html +++ b/code/Python.html @@ -28,8 +28,8 @@ } Python | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/code/Regex.html b/code/Regex.html index 8680c6fbf..240b30ed8 100644 --- a/code/Regex.html +++ b/code/Regex.html @@ -28,8 +28,8 @@ } 正则表达式 | LearnData-开源笔记 - - + + +

    表达式修饰符

    元字符:区分大小写

    常用正则代码说明
    .匹配除换行符以外的任意字符
    *匹配 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 v3.1.2
    + diff --git a/code/Vue.html b/code/Vue.html index de17e40c2..02b29388c 100644 --- a/code/Vue.html +++ b/code/Vue.html @@ -28,8 +28,8 @@ } Vue | LearnData-开源笔记 - - + + +

    使用 <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 v3.1.2
    + diff --git a/code/index.html b/code/index.html index 3bcd8394d..12a134212 100644 --- a/code/index.html +++ b/code/index.html @@ -28,8 +28,8 @@ } Coding | LearnData-开源笔记 - - + + +

    在线 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 v3.1.2
    + diff --git a/deploy/CloudServices.html b/deploy/CloudServices.html index ac64f3981..8a5a38bda 100644 --- a/deploy/CloudServices.html +++ b/deploy/CloudServices.html @@ -28,8 +28,8 @@ } 云计算服务 | LearnData-开源笔记 - - + + +

    腾讯云境外

    腾讯云香港已无轻量服务器供应,但可购买新加坡、日本的服务器。价格实惠,2 核 2G,30M 宽带,每月 33 元。但国内连接速度较慢,仅适合境外用户。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/deploy/Cloudflare.html b/deploy/Cloudflare.html index 7cc89fc74..b529de7b7 100644 --- a/deploy/Cloudflare.html +++ b/deploy/Cloudflare.html @@ -28,8 +28,8 @@ } Cloudflare | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/deploy/DNS.html b/deploy/DNS.html index 59c616798..86086f7f9 100644 --- a/deploy/DNS.html +++ b/deploy/DNS.html @@ -28,8 +28,8 @@ } 域名 DNS 托管 | LearnData-开源笔记 - - + + +
    跳至主要內容

    域名 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 v3.1.2
    + diff --git a/deploy/GitHub.html b/deploy/GitHub.html index f5a5df11e..d24243353 100644 --- a/deploy/GitHub.html +++ b/deploy/GitHub.html @@ -28,8 +28,8 @@ } GitHub | LearnData-开源笔记 - - + + +
    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 v3.1.2
    + diff --git a/deploy/MySQL.html b/deploy/MySQL.html index 814501ddd..5912eff98 100644 --- a/deploy/MySQL.html +++ b/deploy/MySQL.html @@ -28,8 +28,8 @@ } 数据库管理 | LearnData-开源笔记 - - + + +

    数据库启动失败或损坏

    1. 在 MySQL 配置文件中,找到 mysqld 行并添加 innodb_force_recovery=4。这个值可以在 0-6 之间调整,数值越大对数据库的损害就越大。在成功启动 MySQL 后,备份所有数据库和管理密码,并将它们下载到本地。
    2. 在宝塔面板的「数据库」选项中删除所有数据库,然后卸载并重新安装 MySQL。
    3. 重新导入数据库。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/deploy/Static.html b/deploy/Static.html index 383ede920..9f139fb90 100644 --- a/deploy/Static.html +++ b/deploy/Static.html @@ -28,8 +28,8 @@ } 静态部署 | LearnData-开源笔记 - - + + +
    1. How to Easily Host a Website on IPFSopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/deploy/VPS.html b/deploy/VPS.html index d55929f90..ceeb5ec8f 100644 --- a/deploy/VPS.html +++ b/deploy/VPS.html @@ -28,8 +28,8 @@ } 服务器 VPS | LearnData-开源笔记 - - + + +

    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 v3.1.2
    + diff --git a/deploy/index.html b/deploy/index.html index 7274d801b..d0ceea2fc 100644 --- a/deploy/index.html +++ b/deploy/index.html @@ -28,8 +28,8 @@ } Deploy | LearnData-开源笔记 - - + + +
    跳至主要內容

    Deploy

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/family/Coupon.html b/family/Coupon.html index 832e682d7..4ae24816a 100644 --- a/family/Coupon.html +++ b/family/Coupon.html @@ -28,8 +28,8 @@ } 网购攻略 | LearnData-开源笔记 - - + + +
    跳至主要內容

    网购攻略

    约 1425 字大约 5 分钟...

    家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

    电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

    淘宝

    • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
    • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。
      • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
    • 购物节日前一天的预购和节日当天,是最优惠时候。
      • 商家在活动前说的保价,并不包含大额券,不用提前下单。

    拼多多

    拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。

    • 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。
    • 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。

    京东

    新注册的京东 Plus 已经没有会员优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 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 v3.1.2
    + diff --git a/family/Diet.html b/family/Diet.html index cfe696524..a8496bae1 100644 --- a/family/Diet.html +++ b/family/Diet.html @@ -28,8 +28,8 @@ } 健康饮食 | LearnData-开源笔记 - - + + +
    跳至主要內容

    健康饮食

    约 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 v3.1.2
    + diff --git a/family/HomeAutomation.html b/family/HomeAutomation.html index 348116515..4ba87c59e 100644 --- a/family/HomeAutomation.html +++ b/family/HomeAutomation.html @@ -28,8 +28,8 @@ } 智能家居 | LearnData-开源笔记 - - + + +
    跳至主要內容

    智能家居

    约 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 v3.1.2
    + diff --git a/family/Life.html b/family/Life.html index 60a712da9..46751159b 100644 --- a/family/Life.html +++ b/family/Life.html @@ -28,8 +28,8 @@ } 生活窍门 | LearnData-开源笔记 - - + + +
    跳至主要內容

    生活窍门

    约 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 v3.1.2
    + diff --git a/family/Maintenance.html b/family/Maintenance.html index dc8713a90..ac20bf495 100644 --- a/family/Maintenance.html +++ b/family/Maintenance.html @@ -28,8 +28,8 @@ } 维修/保养 | LearnData-开源笔记 - - + + +
    跳至主要內容

    维修/保养

    约 999 字大约 3 分钟...

    牛皮席

    清洁牛皮席时,若稍脏可用温水湿毛巾擦拭。若流汗较多,可先用淡肥皂水清洁,再以清水毛巾擦干。避免直接暴晒牛皮席,可以傍晚的阳光晾晒。

    秋季收藏前,先用淡肥皂水湿毛巾彻底清洗表面,随后用清水擦干。在阳台晾晒一天后,可以卷起或折叠收藏,或直接铺在床上并覆以被子使用。

    升降桌

    升降桌出现故障时,长按「向下键」,桌子会缓慢降至最低位置并恢复正常。

    通马桶

    塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

    如果使用下方类似的疏通器时,也需在疏通头上绑好塑料袋,并在气口处撕开个小口,最后打开通气开关。

    疏通器说明 1
    疏通器说明 1
    疏通器说明 2
    疏通器说明 2

    燃气锅炉

    锅炉左侧的控制器,通常用于冬季采暖,负责调节地暖锅炉的温度。

    地暖温度

    地暖温度范围通常设定在 45-55℃ 之间,并避免超过 60℃。这样做可以保护塑料采暖管道,防止锅炉内壁结垢。在天气极冷的情况下,您可以将地暖温度暂时调整至 65℃,但半天后应将其调回至 55℃。

    如果水采暖的地暖温度上不去,这通常是由于地暖温控阀的流量太小所致,而与锅炉温度本身关系不大。在这种情况下,您可以尝试通过右旋地暖温控阀的螺口来调整流量。在进行调整时,请确保顶针没有被下压,以解除对地暖温度的限制,促使热水更快地流动。在调整后等待一天,待室内温度恢复正常后,再将温控阀装回原位。

    地暖温控阀

    锅炉补水

    燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 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 v3.1.2
    + diff --git a/family/Medical.html b/family/Medical.html index aded5f6a7..b7f814a58 100644 --- a/family/Medical.html +++ b/family/Medical.html @@ -28,8 +28,8 @@ } 医疗药品 | LearnData-开源笔记 - - + + +
    跳至主要內容

    医疗药品

    约 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 v3.1.2
    + diff --git a/family/Shoppinglist.html b/family/Shoppinglist.html index b4cc6c6c5..ae4f15d02 100644 --- a/family/Shoppinglist.html +++ b/family/Shoppinglist.html @@ -28,8 +28,8 @@ } 购物评价 | LearnData-开源笔记 - - + + +
    跳至主要內容

    购物评价

    约 3812 字大约 13 分钟...

    书房

    摄像头

    摄像头品牌众多,但实际像素都仅为 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 微单相机,但随着 AI 的出现、手机摄像头的表现,这个想法逐渐淡化,优先级下调。

    关于镜头选择: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 v3.1.2
    + diff --git a/family/baby/birthing.html b/family/baby/birthing.html index 746a95154..b98bb4fff 100644 --- a/family/baby/birthing.html +++ b/family/baby/birthing.html @@ -28,8 +28,8 @@ } 生产前的准备 | LearnData-开源笔记 - - + + +
    跳至主要內容

    生产前的准备

    约 440 字大约 1 分钟...

    不要囤货

    不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

    LDR 的选择

    LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

    陪护的重要性

    对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。

    送花:一个小小的惊喜

    若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/family/baby/hospital.html b/family/baby/hospital.html new file mode 100644 index 000000000..502a34425 --- /dev/null +++ b/family/baby/hospital.html @@ -0,0 +1,58 @@ + + + + + + + + + 生病记录 | LearnData-开源笔记 + + + + + + + + +
    跳至主要內容

    生病记录

    约 799 字大约 3 分钟...

    宝宝在小时候很容易生病,这经常导致我们不得不带他去医院住院和接受各种检查。本文会记录下我在这个过程中积累的一些心得体会。

    必备物品

    集尿袋

    在尿检过程中,医院往往会为婴儿提供与成人相同的塑料集尿杯以收集尿样。在上海新华医院的儿科,医护人员建议我尝试将塑料集尿杯放置于尿布内部进行使用。不过,这种方法并未如预期那样有效——塑料杯在尿布中被压扁,导致尿液无法正确收集。即便我尝试了多种不同的方法并三次更换尿布,结果仍旧是尿液泄露。最后,我在美团买了集尿袋才成功进行了尿检。

    使用集尿袋时,最好不要让宝宝穿尿不湿,因为一旦集尿袋被放置在尿不湿里面,很容易因为褶皱而导致尿液泄露。如果宝宝不愿意尿尿,多喂一些奶通常会有帮助,因为宝宝在喂奶后通常会尿尿。

    症状处理

    发烧

    只有在宝宝的体温超过 38.5 度时才适宜服用美林,其他时候应优先考虑物理降温方法。通常是每隔半小时用温水清洁腋下、颈部和大腿根部。但这种方法既繁琐又效果有限。

    我在前额和左右颈动脉处贴上退烧贴,这样做宝宝晚上睡觉安稳多了。

    就医准备

    医疗记录

    我将宝宝的所有检查结果和病例记录电子化,这样做是为了为宝宝准备一份完整的医疗记录,避免由于沟通不畅导致诊断错误。

    医疗保险

    家人为宝宝投保了一份高端医疗险。起初,我对其必要性表示怀疑,认为处于母乳喂养阶段的宝宝自身的免疫力应该足够高,不太需要去医院。实际情况也确实如此。

    但是,当我们某次注意到宝宝在吃奶后出现了一些惊厥症状,并且在医院进行的血常规检查中发现宝宝的白细胞异常偏高时,医生警告我们宝宝可能面临脑膜炎的风险。这要求我们进行更多的检查,如血检、尿检、心脏彩超、核磁共振和长程脑电波检查,其中一些检查需要住院才能完成。当时正值春节临近,住院部门本不愿接收新的病人。这时,家人想到了为宝宝购买的医疗保险,并询问了特需病房的情况。由于特需病房的接收政策与普通病房不同,我们得以顺利入院,并且所有费用均通过医疗保险获得了报销。幸运的是,最终的诊断结果证明是一场虚惊。

    基于这次经历,我决定在宝宝 5 岁之前,每年为她购买这种单年医疗保险。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + + + + + + + diff --git a/family/baby/index.html b/family/baby/index.html index bc4fa91f4..abaf5a9ab 100644 --- a/family/baby/index.html +++ b/family/baby/index.html @@ -28,8 +28,8 @@ } 育儿记录 | LearnData-开源笔记 - - + + +
    跳至主要內容

    育儿记录

    约 186 字小于 1 分钟...

    面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/family/baby/newborn.html b/family/baby/newborn.html index 4416299c2..4ccd806a3 100644 --- a/family/baby/newborn.html +++ b/family/baby/newborn.html @@ -28,8 +28,8 @@ } 新生儿期(0-6 月) | LearnData-开源笔记 - - + + +
    跳至主要內容

    新生儿期(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 v3.1.2
    + diff --git a/family/baby/take-kids-out.html b/family/baby/take-kids-out.html index 828444a4d..bf8aab832 100644 --- a/family/baby/take-kids-out.html +++ b/family/baby/take-kids-out.html @@ -28,8 +28,8 @@ } 溜娃 | LearnData-开源笔记 - - + + +
    跳至主要內容

    溜娃

    约 587 字大约 2 分钟...

    原本想着带娃就是阿姨带着我待着。但真正开始后,为了让娃不近视,每天都需要带娃外出。

    外出装备:渔夫帽、耳机、录音笔。

    日常注意

    • 日常玩的时候避免室内光线太暗,晚上睡觉的时候别开夜灯。
    • 给宝宝提供各种各样的视觉刺激,如颜色、形状、大小、距离等。
    • 注意婴儿宝宝的近距离看书和玩耍的习惯:近距离的活动容易导致宝宝出现远视问题,建议让宝宝多在大空间内运动,去户外玩耍。
    • 婴儿的视觉系统更容易被电视和电子产品所吸引,长期过度使用会对眼睛产生负面影响,建议孩子不要看太多电视和电子产品。
    • 有效外出:每天至少保证 2 小时的户外活动时间,多晒太阳,但要避免太阳直射。远视储备的关键是在于太阳光线的照射,以及宽阔的视野供宝宝眺望。

    其他

    宝宝大了后睡眠时间减少,但阿姨习惯性用摇来让宝宝睡觉。但其实娃只是醒了,过一会就会自然睡,不断的摇反而会让娃无法睡。

    理论:远视储备

    儿童因眼球小、眼轴短,双眼都处于远视状态,且年龄越小,远视度数越大,这种与年龄及生长发育相关的生理性远视,称为“远视储备”。

    保护好远视储备,宝宝就不会近视,不需要年纪小小就戴上近视眼镜。而且远视储备是不可逆的,只要消耗完了就没有了,所以保护远视储备一定要从小开始。

    长远说,如果有远视储备,可以在接下来的生活和工作中减少眼部疲劳和压力,即便是偶尔的高强度用眼,眼睛也始终都能处在一个健康舒服的状态。

    不同年龄儿童生长发育速度不一,生理性远视储备值也不相同,下面为大家提供参考值:

    • 0~3 岁:+3.00D
    • 4~5 岁:+2.00~+2.25D
    • 6~7 岁:+1.75~+2.00D
    • 8~9 岁:+1.25~+1.50D
    • 10~12 岁:+0.50~+1.00D
    • 12 岁以后远视储备趋于 0
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/family/index.html b/family/index.html index ff96684e7..a79993482 100644 --- a/family/index.html +++ b/family/index.html @@ -28,8 +28,8 @@ } Family | LearnData-开源笔记 - - + + +
    跳至主要內容

    Family

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/index.html b/index.html index e285ef56f..abcc7ae1c 100644 --- a/index.html +++ b/index.html @@ -28,8 +28,8 @@ } LearnData 开源笔记 | LearnData-开源笔记 - - + + +

    🤔 常见问题

    网页显示异常

    如果你的网站只显示文字而不能正常显示网页,可能是因为网站路径不正确导致的页面样式错误。比如,GitHub Page 提示访问链接 https://xxx.github.io/yyy,则需要将 docs/.vuepress/config.ts 中的 base 改为 /yyy,其默认值为 /。请按照此路径将网站的 base 设置正确,以确保你的网站能够正常显示。

    同步服务器报错

    • Error: Input required and not supplied: server 表示服务器配置错误,请按照上方的网站部署步骤检查配置。如果你不需要将网页部署同步到服务器,可以删除 .github/workflows/main.yml 中 Sync files 区块的代码。

    • FTPError: 530 Login authentication failed 指 FTP 密码错误或账号不存在,可使用 FileZilla 来测试 FTP 的有效性。

    • Error: Timeout (control socket) 指同步服务器出现超时报错。如果出现该错误,可以进入 Actions 页面,点击右侧按钮「Re-run all jobs」,重新进行部署。如果错误连续出现,可以尝试关闭服务器防火墙,检查 GitHub 服务器 IP 是否屏蔽了。

    ERR_MODULE

    如果出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find module 的报错,可能是第三方插件或 pacakge.json 环境依赖未正确配置。此报错出现的几率极低,如果遇到,可以使用最新版本的 package.jsonpnpm-lock.yaml 来覆盖本地设置,或者删除主目录下的 .npmrc 文件。

    本地运行 LearnData

    1. 为了本地运行,你需要安装 npm 和 pnpm 环境,可参考环境部署教程open in new window
    2. 将 LearnData 项目下载到本地后,在项目目录下打开终端,输入命令 pnpm i 安装依赖。
    3. 在终端中输入命令 pnpm docs:dev,若成功则会提示访问链接,默认为 http://localhost:8080/

    本地服务运行后,修改文件时页面会同步更新预览。若需停止本地服务器,可在终端中按下 Ctrl + C

    如果你想深入了解 LearnData 的高级技巧,请浏览 LearnData 博客:高效知识管理和进阶应用技巧open in new window

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/intro.html b/intro.html index eb2dd2516..ff3923888 100644 --- a/intro.html +++ b/intro.html @@ -28,8 +28,8 @@ } 个人介绍 | LearnData-开源笔记 - - + + +
    跳至主要內容

    个人介绍

    约 76 字小于 1 分钟...

    互联网广告人,

    迷信新工具、新方法,

    坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,

    热衷于研究开源软件和心理学理论,定期分享探索成果。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2017-04-18-wechat_multi_open.html b/posts/2017-04-18-wechat_multi_open.html index e505dd031..2a92f60e1 100644 --- a/posts/2017-04-18-wechat_multi_open.html +++ b/posts/2017-04-18-wechat_multi_open.html @@ -28,8 +28,8 @@ } 跳过第三方软件,一步到位实现微信双开的秘密 | LearnData-开源笔记 - - + + +

    有开发者为微信和 QQ 制作了多开补丁 RevokeMsgPatcheropen in new window,可以从国内链接下载:RevokeMsgPatcher.v1.6.zipopen in new window。使用这个补丁后,每次点击应用图标都会打开新的登录窗口,这取决于个人需求。我更喜欢直接通过 .bat 脚本来实现多开。

    开机多开微信

    如果你希望电脑开机时自动多开微信,可以把上述脚本的快捷方式放入 Windows 的开机「启动」文件夹。通常这个文件夹路径为 %AppData%\Microsoft\Windows\Start Menu\Programs\Startup。或者,打开「运行」对话框,输入 shell:startup,回车即可。

    开机多开微信
    开机多开微信

    多客户端(已失效)

    从 2024 年开始,「微信 For Windows」和「微信 UWP」均已下架,新版的微信 Store 版也无法与微信 PC 版同时安装。因此,这一方案仅供记录,已不再有效。

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

    安装微信客户端
    安装微信客户端

    安装后,你可以同时启动微信 PC 版和这两个版本,互不干扰。如果你希望开机时自动启动这两个微信,可以把它们的快捷方式放在开机启动文件夹内。

    多客户端微信
    多客户端微信

    总结

    应用多开似乎越来越不受欢迎,比如新版 QQ 已经移除了多账户登录选项。但实际上,用户是怎样想的呢?这又有谁在乎呢?

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2017-04-22-rss_feed43_feedex.html b/posts/2017-04-22-rss_feed43_feedex.html index 474004d42..cc165737a 100644 --- a/posts/2017-04-22-rss_feed43_feedex.html +++ b/posts/2017-04-22-rss_feed43_feedex.html @@ -28,8 +28,8 @@ } RSS 入门篇:Feed43&FeedEx-为静态网页定制 RSS 源 | LearnData-开源笔记 - - + + +

    点击 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 v3.1.2
    + diff --git a/posts/2017-07-28-office_2016_installer_error.html b/posts/2017-07-28-office_2016_installer_error.html index 2b0bb7a84..4e141194e 100644 --- a/posts/2017-07-28-office_2016_installer_error.html +++ b/posts/2017-07-28-office_2016_installer_error.html @@ -28,8 +28,8 @@ } office 2016 安装程序报错解决办法 | LearnData-开源笔记 - - + + +
    跳至主要內容

    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 v3.1.2
    + 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 164cd5bc1..e9b0ced69 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 @@ -28,8 +28,8 @@ } OneNote 2016 无法登陆问题解决 | LearnData-开源笔记 - - + + +
    跳至主要內容

    OneNote 2016 无法登陆问题解决

    系统OneNote约 153 字小于 1 分钟...

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    打开 IE 浏览器,访问 live.com,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。

    完成设置后,即可正常登录并打开 OneNote。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2017-09-02-forced_shutdown.html b/posts/2017-09-02-forced_shutdown.html index 3208eee11..f528af502 100644 --- a/posts/2017-09-02-forced_shutdown.html +++ b/posts/2017-09-02-forced_shutdown.html @@ -28,8 +28,8 @@ } 电脑关机了,第二天一看确又开着的?让系统正常关机! | LearnData-开源笔记 - - + + +

    ——————————

    网上流行一种通过修改「gpedit.msc」达到快速关机的方法,但实际测试结果表明,这种方法并不能实现强制关机。以下为这种方法的操作流程记录,仅供参考:

    1. 点击桌面左下角“windows”图标,选择“运行”选项;

    2. 进入运行窗口,输入“gpedit.msc”命令,按下回车键确定;

    3. 打开本地组策略编辑器界面,依次展开“计算机配置——管理模板——系统——关机选项”文件夹;鼠标右击右侧“关闭会阻止或取消关机的应用程序的自动终止功能”选项,接着选择“编辑”功能;将弹出窗口选项更改成“已启用”,然后点击“应用——确定”按钮。

      但开启后,提示程序没有响应,无法关机。

    修改“gpedit.msc”虽然可以撤销程序阻止关机的权限,但它并没有赋予关机进程对程序的关闭权限,因此并不能达到强制关机的效果。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2017-09-03-smb_lan_sharing.html b/posts/2017-09-03-smb_lan_sharing.html index 0f0016b23..ca3dc6ef3 100644 --- a/posts/2017-09-03-smb_lan_sharing.html +++ b/posts/2017-09-03-smb_lan_sharing.html @@ -28,8 +28,8 @@ } 加速 SMB 协议,让 PC 变身小型 NAS | LearnData-开源笔记 - - + + +
    跳至主要內容

    加速 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 v3.1.2
    + 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 155c96ac0..f39dbf0ca 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 @@ -28,8 +28,8 @@ } 光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2) | LearnData-开源笔记 - - + + +
    跳至主要內容

    光猫改造 篇一:超级管理员密码破解(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 v3.1.2
    + diff --git a/posts/2017-10-18-light_cat_port_forwarding.html b/posts/2017-10-18-light_cat_port_forwarding.html index fbb907e18..322191910 100644 --- a/posts/2017-10-18-light_cat_port_forwarding.html +++ b/posts/2017-10-18-light_cat_port_forwarding.html @@ -28,8 +28,8 @@ } 光猫改造 篇二:光猫 + 路由器,实现端口映射 | LearnData-开源笔记 - - + + +
    跳至主要內容

    光猫改造 篇二:光猫 + 路由器,实现端口映射

    网络光猫约 206 字小于 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 v3.1.2
    + diff --git a/posts/2018-01-19-forget_the_cdn.html b/posts/2018-01-19-forget_the_cdn.html index 931fe96a3..132941a8a 100644 --- a/posts/2018-01-19-forget_the_cdn.html +++ b/posts/2018-01-19-forget_the_cdn.html @@ -28,8 +28,8 @@ } 小型网站管理员,快放弃 CDN! | LearnData-开源笔记 - - + + +
    跳至主要內容

    小型网站管理员,快放弃 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 v3.1.2
    + diff --git a/posts/2018-01-31-hire_a_robot.html b/posts/2018-01-31-hire_a_robot.html index 68e368147..a16f96cd8 100644 --- a/posts/2018-01-31-hire_a_robot.html +++ b/posts/2018-01-31-hire_a_robot.html @@ -28,8 +28,8 @@ } 雇个机器人帮你干活 | LearnData-开源笔记 - - + + +
    跳至主要內容

    雇个机器人帮你干活

    自动化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 v3.1.2
    + diff --git a/posts/2018-03-06-no_more_dinner.html b/posts/2018-03-06-no_more_dinner.html index 2fc7a3254..8d6b1f89a 100644 --- a/posts/2018-03-06-no_more_dinner.html +++ b/posts/2018-03-06-no_more_dinner.html @@ -28,8 +28,8 @@ } 提早晚餐,饿死算逑 | LearnData-开源笔记 - - + + +
    跳至主要內容

    提早晚餐,饿死算逑

    健康减肥约 306 字大约 1 分钟...

    上大学后,每天晚上都打游戏点「叉鸭例牌 + 两碗米饭」,体重成功上到 85KG。后来减肥在 13 年达到历史低点 75KG,但后来持续上升,在 18 年春节达到顶点,93KG,比婚前胖了38 斤

    目前以在家办公为主,很少出门,每天走路都没走多少,更别说运动了。

    解决方案:

    1. 增加运动:每天划船机 2 公里,后期再逐步加量

    2. 调节饮食,多喝水不吃炸鸡

      • 早餐:9 点,牛奶 + 麦片

      • 午餐:12 点,正常

      • 晚餐:4 点,晚餐后不再吃东西

    日期历史体重备注
    2012 年 9 月 2 日 23:04:5185KG今天吃了 3 个苹果,3 块钱煎饼。刚洗完澡
    2013 年 4 月 11 日 21:24:5486.4KG脱去外套
    2013 年 9 月 5 日 8 点81.8kg
    2013 年 10 月 3 日 9:55:0278.7KG
    2014 年 2 月 25 日春节83KG重新开始减重
    2014 年 10 月 19 日 16:50:1086.1KG
    2016 年 8 月 4 日88KG
    2018 年 3 月 6 日 晚91.6 KG
    2020 年 10 月 6 日95 KG巅峰,开始营养健康餐
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2018-04-30-baota_deploy_vps.html b/posts/2018-04-30-baota_deploy_vps.html index 4dfab11e1..ff09b16c7 100644 --- a/posts/2018-04-30-baota_deploy_vps.html +++ b/posts/2018-04-30-baota_deploy_vps.html @@ -28,8 +28,8 @@ } 新手建站神器 - 宝塔面板 | LearnData-开源笔记 - - + + +
    跳至主要內容

    新手建站神器 - 宝塔面板

    服务器宝塔面板建站约 234 字小于 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 v3.1.2
    + 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 9b699e5db..e1a991f7e 100644 --- a/posts/2018-05-01-jekyll_blog_on_github_pages.html +++ b/posts/2018-05-01-jekyll_blog_on_github_pages.html @@ -28,8 +28,8 @@ } Jekyll 篇一:3 分钟搭建 Github Pages 博客 | LearnData-开源笔记 - - + + +
    跳至主要內容

    Jekyll 篇一:3 分钟搭建 Github Pages 博客

    博客JekyllGithub建站约 268 字小于 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 v3.1.2
    + diff --git a/posts/2018-05-02-jekyll_blog_on_vps.html b/posts/2018-05-02-jekyll_blog_on_vps.html index 07fa8eacf..cdaf87a7b 100644 --- a/posts/2018-05-02-jekyll_blog_on_vps.html +++ b/posts/2018-05-02-jekyll_blog_on_vps.html @@ -28,8 +28,8 @@ } Jekyll 扩展篇:服务器搭建 Jekyll 博客 | LearnData-开源笔记 - - + + +
    跳至主要內容

    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 v3.1.2
    + diff --git a/posts/2018-05-03-jekyll_blog_autodeploy.html b/posts/2018-05-03-jekyll_blog_autodeploy.html index 2cb01d91b..67f4fb821 100644 --- a/posts/2018-05-03-jekyll_blog_autodeploy.html +++ b/posts/2018-05-03-jekyll_blog_autodeploy.html @@ -28,8 +28,8 @@ } Jekyll 篇二:自动部署服务器博客 | LearnData-开源笔记 - - + + +

    具体 .travis.yml 配置,请参考 官方文档open in new window

    参考资料&引用:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2018-05-04-audition_cut_mp3.html b/posts/2018-05-04-audition_cut_mp3.html index f6e61b6e7..bf18b38ef 100644 --- a/posts/2018-05-04-audition_cut_mp3.html +++ b/posts/2018-05-04-audition_cut_mp3.html @@ -28,8 +28,8 @@ } 怎么用 Adobe Audition 快速剪切音频? | LearnData-开源笔记 - - + + +
    跳至主要內容

    怎么用 Adobe Audition 快速剪切音频?

    工具Audition音频约 256 字小于 1 分钟...

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

    简易剪切流程

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

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

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

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

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

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

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + 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 15f7734cd..aac1fb555 100644 --- a/posts/2018-05-15-aria2_a_new_download_tool.html +++ b/posts/2018-05-15-aria2_a_new_download_tool.html @@ -28,8 +28,8 @@ } 抛弃迅雷,Aria2 新手入门 | LearnData-开源笔记 - - + + +

    其他设置不常用,有时间的话,你可以慢慢调整。

  • 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 AllInOne,运行目录下的 index.html,打开 Aria2 WebUI 界面,将页面链接收藏到书签以便后续使用 Aria2。注意,本地运行要用 AllInOne 版本,否则会出现 cannot get language resources, and will display in default language

    操作步骤如下:首先,下载并解压 AriaNgopen in new window AllInOne 版本。然后,运行目录中的 index.html 文件,以打开 Aria2 WebUI 界面。为方便后续使用,建议将页面链接添加至书签。需注意,本地运行需使用 AllInOne 版本,否则可能会出现 cannot get language resources, and will display in default language 的错误提示。

    如果 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」扩展后,右键扩展图标,点击「选项」>「设置」,设置如下:

    • 最小监视:10 M,低于该容量将由浏览器下载。如果 Aria2 要接手所有下载,可以将最小监视设为 0.001
    • JSON-RPC 链接:http://localhost:6800/jsonrpc

    注意:「添加到 aria2」图标显示的 en 表示处于开启状态,dis 表示处于关闭状态,点击图标可以切换使用状态。

    Aria2 启动器

    每次启动 Aria2 下载时,都需要执行两个文件:打开 WebUI 链接和 aria2c,这有点麻烦。因此,我使用 AutoHotkey 做了一个启动器,它可以检测 aria2c 运行状态,并一键打开下载界面,以简化 Aria 的启动过程。

    下载 Aria2 启动器open in new window,然后将其解压到 Aria2 运行目录,例如 D:\Aria2。Aria2 启动器提供了两种方式,只需选择其中一种即可。

    • AriaNg 启动器(推荐):使用 AriaNg 本地版作为下载管理界面。在使用该启动器前,需将 AriaNgopen in new window 解压到 Aria2 目录下,并将文件夹名改为 AriaNg,然后打开文件 index.html,该文件位于 Aria2\AriaNg\index.html
    • Aria2c 启动器:将 https://aria2c.com 作为默认下载界面。该设置较旧,需确保 JSON-RPC Path 为 http://localhost:6800/jsonrpc

    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 v3.1.2
    + diff --git a/posts/2018-05-24-airtable_noob.html b/posts/2018-05-24-airtable_noob.html index 65bfdeb2b..043c0f8ee 100644 --- a/posts/2018-05-24-airtable_noob.html +++ b/posts/2018-05-24-airtable_noob.html @@ -28,8 +28,8 @@ } 真· Airtable 3 分钟菜鸟入门 | LearnData-开源笔记 - - + + +
    跳至主要內容

    真· Airtable 3 分钟菜鸟入门

    工具Airtable约 993 字大约 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 v3.1.2
    + diff --git a/posts/2018-06-08-baizhuo_gp1700.html b/posts/2018-06-08-baizhuo_gp1700.html index aa4dc94fd..b2a8237ea 100644 --- a/posts/2018-06-08-baizhuo_gp1700.html +++ b/posts/2018-06-08-baizhuo_gp1700.html @@ -28,8 +28,8 @@ } 光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射 | LearnData-开源笔记 - - + + +
    跳至主要內容

    光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射

    网络GP1700光猫约 391 字大约 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 v3.1.2
    + diff --git a/posts/2018-06-10-koolproxy_https.html b/posts/2018-06-10-koolproxy_https.html index f76a983a5..101a2265c 100644 --- a/posts/2018-06-10-koolproxy_https.html +++ b/posts/2018-06-10-koolproxy_https.html @@ -28,8 +28,8 @@ } koolproxy 无法下载 https 证书? | LearnData-开源笔记 - - + + +
    跳至主要內容

    koolproxy 无法下载 https 证书?

    网络koolproxy约 294 字小于 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 v3.1.2
    + diff --git a/posts/2018-06-19-iptv_direckly.html b/posts/2018-06-19-iptv_direckly.html index 7091a487d..52ef58e5c 100644 --- a/posts/2018-06-19-iptv_direckly.html +++ b/posts/2018-06-19-iptv_direckly.html @@ -28,8 +28,8 @@ } 客厅、书房、卧室,任意收看 IPTV 直播! | LearnData-开源笔记 - - + + +
    跳至主要內容

    客厅、书房、卧室,任意收看 IPTV 直播!

    网络IPTV约 679 字大约 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 v3.1.2
    + diff --git a/posts/2018-10-07-huginn_scraping_any_website.html b/posts/2018-10-07-huginn_scraping_any_website.html index fa4b9a83c..005d89fdf 100644 --- a/posts/2018-10-07-huginn_scraping_any_website.html +++ b/posts/2018-10-07-huginn_scraping_any_website.html @@ -28,8 +28,8 @@ } RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取) | LearnData-开源笔记 - - + + +

    RSS 合集

    汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2018-12-28-voice_input_try.html b/posts/2018-12-28-voice_input_try.html index a0fabacf9..27e58a4bf 100644 --- a/posts/2018-12-28-voice_input_try.html +++ b/posts/2018-12-28-voice_input_try.html @@ -28,8 +28,8 @@ } 等了十年,PC 端能用的语音输入方案来了 | LearnData-开源笔记 - - + + +
    跳至主要內容

    等了十年,PC 端能用的语音输入方案来了

    自动化语音输入约 1959 字大约 7 分钟...

    从 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 v3.1.2
    + diff --git a/posts/2019-03-31-openvpn_back_to_home.html b/posts/2019-03-31-openvpn_back_to_home.html index 929f4b7f3..06b02b947 100644 --- a/posts/2019-03-31-openvpn_back_to_home.html +++ b/posts/2019-03-31-openvpn_back_to_home.html @@ -28,8 +28,8 @@ } OpenVPN 随时随地回家的路 | LearnData-开源笔记 - - + + +
    跳至主要內容

    OpenVPN 随时随地回家的路

    网络OpenVPN内网穿透约 416 字大约 1 分钟...

    有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。

    内网穿透

    连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.com 指向家中 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 v3.1.2
    + diff --git a/posts/2019-04-01-rsshub_noob.html b/posts/2019-04-01-rsshub_noob.html index 2587ab1f2..036b36cd6 100644 --- a/posts/2019-04-01-rsshub_noob.html +++ b/posts/2019-04-01-rsshub_noob.html @@ -28,8 +28,8 @@ } RSS 速成篇:RSSHub 捡现成的轮子 | LearnData-开源笔记 - - + + +
    跳至主要內容

    RSS 速成篇:RSSHub 捡现成的轮子

    自动化rssRSSHub约 419 字大约 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 v3.1.2
    + diff --git a/posts/2019-08-26-scrcpy_screen_projection.html b/posts/2019-08-26-scrcpy_screen_projection.html index ff2ecf81e..4f31e4016 100644 --- a/posts/2019-08-26-scrcpy_screen_projection.html +++ b/posts/2019-08-26-scrcpy_screen_projection.html @@ -28,8 +28,8 @@ } 投屏不再是难题!如何用免费开源软件 scrcpy 完美体验安卓投屏 | LearnData-开源笔记 - - + + +

    输入法问题

    英文输入法及主流中文输入法均可正常使用。如中文输入出现问题,建议复制后再粘贴。

    投屏模糊

    如果屏幕设置了缩放比例,可能导致投屏界面模糊。为解决此问题,请右键单击 scrcpy.exe,选择「属性」>「兼容性」>「更改高 DPI 设置」,并勾选「替代高 DPI 缩放行为」选项。应用此设置后,投屏效果即可恢复正常。

    解决 scrcpy 投屏模糊

    如遇其他问题或错误,请参考 scrcpy 常见问题解答open in new window

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2019-10-04-fake_aka_hospital_skin_care_products.html b/posts/2019-10-04-fake_aka_hospital_skin_care_products.html index 6bd604990..b8b0a2f1b 100644 --- a/posts/2019-10-04-fake_aka_hospital_skin_care_products.html +++ b/posts/2019-10-04-fake_aka_hospital_skin_care_products.html @@ -28,8 +28,8 @@ } 这些「医院护肤品」你买了吗? | LearnData-开源笔记 - - + + +
    跳至主要內容

    这些「医院护肤品」你买了吗?

    购物化妆品约 1103 字大约 4 分钟...

    日常购买中,国货比例越来越高,护肤品也逐渐想用国货替代。研究过程中,发现国内有许多药妆打着医院研发旗号。

    这些有医院背书的护肤品,天然会获取大家更多的信任。但你买的真是医院研发吗?

    协和

    一看到「协和」,第一反应会是「协和医院」。但通过爱企查搜索「协和」,找到 33802 家符合条件的企业。这造就了协和在网络上的泛滥,和消费者的无法维权。

    京东淘宝均有所谓的协和旗舰店,由不同公司开设,但股东均为自然人。这些协和旗舰店的主要股东大都有自己的护肤品牌,但尚未发现与医院有直接联系,更别说协和医院了。但其均标注「协和正品」,京东协和旗舰店更标注有「中国医学科学院」。

    协和维生素 e 乳是网红大爆款,同名但不同厂家的超过五款,包装类似的更是不下二十款,完全分不清李鬼还是李逵。

    精心

    精心由「北京协和医院」的全资子公司「北京协和精细化学制品有限公司」出品,暂列为可信。根据精心旗舰店的授权说明,其他「协和 XX」都与北京协和医院无关。

    使用精心产品后,个人评价一般,并没感受到医院的科技加成。

    爱心 301

    爱心 301 打着 301 的抬头,包装盒甚至有「解放军总医院监制」,但背后的「北京市时代美业科技有限责任公司」是自然人独资企业,跟 301 没有关系。

    目前生产爱心 301 产品的公司是北京时代美业科技有限公司,其工商信息显示,该法定代表人也是唯一最终受益人均是陈某某,而陈某某没有解放军总医院(301 医院)的任职信息。 健康时报记者拨打解放军总医院(301 医院)总机,一名工作人员告诉健康时报记者,爱心 301 产品和 301 医院没有任何关系;医院一名皮肤科医生也告知记者两者无关。

    以上引用自健康时报 2019 年 06 月 28 日,神秘的“北京 301”祛斑团队open in new window

    肤倍佳

    打着「中国医学科学院整形外科医院」的名号,但被医院发声明说是冒用。

    声明链接(已删除):http://www.zhengxing.com.cn/ArticleShow4145.aspxopen in new window

    肤倍佳背后的「北京臻馨芳草科技发展有限公司」于 2014 年 4 月 3 日成立,并于 2019 年 7 月 15 日注册资本从 10 万元变更为 1000 万元。2014 年到 2019 年,「肤倍佳」这 5 年间的公司资本都只有 10 万元,这是一家护肤品企业的注册资本?而其法人也是一直在高 XX、张 XX 间交替变换。

    京卫本草

    京卫本草背后公司为「北京华风时代化妆品有限公司」,股东都为自然人,无医院或单位股东。国家食品药品监督管理总局上用京卫本草都无法搜索到相关产品备案。京卫本草官网上甚至带有 Windows 未激活水印。

    总结

    医院开的大都是医疗用品,没有处方是无法购买的。所谓北京医院、301 医院出的医用护肤品都必须去医院才能买到,网上购买是非常不靠谱的。

    第一次用的护肤品,一定要去「国家食品药品监督管理总局」进行查询,查询入口分别为 国产特殊用途化妆品 和 国产非特殊用途化妆品。

    依据《化妆品卫生监督条例》,我国将化妆品分为特殊用途化妆品及非特殊用途化妆品(2007 年之前称为普通化妆品),特殊用途化妆品是指用于育发、染发、烫发、脱毛、美乳、健美、除臭、祛斑、防晒等的化妆品,特殊用途化妆品必须要有国妆特字批号才能进行销售。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2020-03-25-rsshub_on_vps.html b/posts/2020-03-25-rsshub_on_vps.html index 6859b0ed0..daa0ef86e 100644 --- a/posts/2020-03-25-rsshub_on_vps.html +++ b/posts/2020-03-25-rsshub_on_vps.html @@ -28,8 +28,8 @@ } RSS 速成篇 2:RSSHub 自部署 | LearnData-开源笔记 - - + + +
    跳至主要內容

    RSS 速成篇 2:RSSHub 自部署

    自动化rssRSSHub约 689 字大约 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 v3.1.2
    + diff --git a/posts/2020-09-13-wifi_speed_up.html b/posts/2020-09-13-wifi_speed_up.html index 839116f1e..fbcf0d328 100644 --- a/posts/2020-09-13-wifi_speed_up.html +++ b/posts/2020-09-13-wifi_speed_up.html @@ -28,8 +28,8 @@ } 无线路由调整,加快 WIFI 速度 | LearnData-开源笔记 - - + + +
    跳至主要內容

    无线路由调整,加快 WIFI 速度

    网络WIFI约 623 字大约 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 v3.1.2
    + diff --git a/posts/2020-09-22-uefi_asus_board.html b/posts/2020-09-22-uefi_asus_board.html index 3f7996908..154c6218c 100644 --- a/posts/2020-09-22-uefi_asus_board.html +++ b/posts/2020-09-22-uefi_asus_board.html @@ -28,8 +28,8 @@ } 「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案 | LearnData-开源笔记 - - + + +
    跳至主要內容

    「硬盘布局不受 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 v3.1.2
    + diff --git a/posts/2020-10-25-dpc_watchdog_violation.html b/posts/2020-10-25-dpc_watchdog_violation.html index a4f8c17f0..322b489a8 100644 --- a/posts/2020-10-25-dpc_watchdog_violation.html +++ b/posts/2020-10-25-dpc_watchdog_violation.html @@ -28,8 +28,8 @@ } 100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例 | LearnData-开源笔记 - - + + +
    跳至主要內容

    100% 蓝屏解决方案:以 DPC_WATCHDOG_VIOLATION 为例

    系统蓝屏约 1643 字大约 5 分钟...

    Windows 蓝屏的原因众多,你在网上搜到的解决方案,大多与你的情况不同,无法解决实际问题。但是,如果你找到并分析电脑上的 dmp 蓝屏日志,就会发现 Windows 已经给出了你的蓝屏原因。比如 DPC_WATCHDOG_VIOLATION 蓝屏,大多是由于硬件驱动出现问题造成的。你可以通过回退、更新或卸载驱动来修复蓝屏。接下来,我将具体介绍如何导出蓝屏日志、分析并解决蓝屏原因。

    导出蓝屏日志

    1. 安装 WinDbg Previewopen in new window,这是微软官方推出的系统调试工具。

    2. 启动 WinDbg Preview,软件会自动检测到最新的蓝屏日志,点击 Yes 即可载入。如果想分析其他文件,可以打开文件夹 C:\Windows\Minidump,导出日志 *.dmp

    3. 载入日志过程中,WinDbg Preview 会自动下载所需文件,无需额外操作。载入完成后,点击 !analyze -v,分析具体日志。

    4. 分析日志:日志前半部分可以忽略,蓝屏原因多在日志末尾几行。通过分析末尾日志,可以找出引发蓝屏的进程。注意不要强制删除未知文件。

    上传社区分析

    有些蓝屏比较复杂,由多方面的原因造成,新手很难分析。如果你看不懂或者不想分析日志,可以将蓝屏日志完整上传到微软社区,一般几个小时就会有人回复。

    1. 打开文件夹 C:\Windows\Minidump,导出日志 *.dmp
    2. 将 dmp 蓝屏日志上传至微软社区open in new window,会有技术人员帮助你分析蓝屏原因。由于微软社区不支持上传附件,请先将 dmp 日志上传至百度云或微云,然后将分享链接放在问题中。

    蓝屏解决方案

    分析完蓝屏日志后,我们得到了具体的蓝屏冲突进程,然后在引擎中搜索该进程名,以确定它是系统模块、驱动还是某个程序。

    系统模块报错

    ntkrnlmp.exe*.symbols.exe 是系统模块,该报错不是蓝屏的底层原因,实际是由应用进程与系统冲突引起的蓝屏,需重新深入分析日志。不要尝试删除系统模块

    驱动冲突

    nvlddmkm.sysamdkmdag.sys 等后缀为 *.sys 的进程报错,多为硬件驱动错误,可通过回退驱动来解决。

    1. 开始菜单上搜索并打开「设备管理器」。
    2. 设备管理器上找到对应硬件,点击「回退驱动程序」。
    还原驱动

    如果无法回退驱动程序,则去硬件官网下载旧驱动或最新驱动。如果仍然出现蓝屏,可以尝试在设备管理器中卸载设备,然后重启电脑,让系统启用自带驱动。如果上述方案都没有解决问题,可以尝试更新主板 BIOS,关闭超频。

    如果你不清楚报错进程与哪个硬件相关,尝试多种方法仍然无法修复,那只能用强行删除来尝试修复。但在删除前,必须备份好相关文件及其所在路径。如果删除后无法进入系统,则需要使用 PE 系统来还原备份文件。如果相关文件数量超过 5 个,或者不清楚如何使用 PE,则不要强制删除任何 *.sys 文件。

    未知程序

    如果是与系统模块、驱动无关的未知程序,可使用 Everythingopen in new window 搜索该进程的位置,备份后尝试删除该程序。如果提示文件被占用,可使用火绒或 Unlocker 来解除文件占用,但一定要先做好备份。

    MpKslDrv.sys 通常用于恶意软件保护,对系统影响不大。如果出现该报错,可使用 Defender Control 关闭微软杀毒 Defender Antivirus Service。@yys 爱与诚 反馈,「当我关掉 defender 的时候 他自己消失了,不用我删除。当我打开 他又出现了,又删除不了」。

    蓝屏解决集锦

    如果不想分析日志,甚至找不到蓝屏日志,可以尝试以下方法,这些方法可以解决 80% 的蓝屏问题:

    • 驱动类:更新显卡驱动;更新网卡驱动;重置声卡驱动;重置 SATA AHCI 驱动;
    • 主板类:擦拭内存条;重置 BIOS;增加 CPU 电压;关闭超线程;
    • 系统修复:管理员权限打开命令行(cmd),运行 sfc/Scannow,系统会自动检查损坏文件并修复;
    • 终极方法:重装系统,测试期间尽量使用默认系统驱动。如果重装后仍然出现蓝屏,说明你新装的驱动有问题,可以卸掉有问题的驱动。

    常见问题

    装不了 WinDbg

    少数情况安装应用报错,本地无法分析日志。此时,我们可以导出蓝屏日志,上传到微软社区open in new window,会有人帮助分析原因。

    分析日志时报错

    分析蓝屏日志时出错,或 WinDbg 对 minidump 蓝屏日志的访问被拒绝,这都是由于系统盘读取权限未开放所导致的。

    解决办法有 3 种:

    • 将 minidump 文件复制到 D 盘,然后手动导入到 WinDbg 进行分析。
    • @天气控制仪:以管理员权限运行 WinDbg。
    • @紫石英与灯心草:右键单击 minidump 蓝屏日志,点击「属性」>「权限」>「点击用户」>「点击继承」>「同意」。

    找不到 minidump 文件

    默认情况下,蓝屏日志保存在 C:\Windows\Minidump 文件夹中。如果该文件夹为空,则表明蓝屏日志尚未生成,可等待下一次蓝屏时再查看。如果多次发生蓝屏,但该文件夹仍未生成日志,可尝试在资源管理器中打开 %SystemRoot%\Minidump。若失败,可按以下步骤进行设置:

    1. 打开「控制面板」>「系统」>「高级系统设置」>「高级」>「启动和故障恢复」>「设置」;
    2. 选择「写入调试信息」>「小内存转储(256KB)」,并将「小存储目录」设置为 %SystemRoot%\Minidump,确定后重启计算机;
    3. 再次异常关机后,可前往 %SystemRoot%\Minidump 提取即可。

    视频说明:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2020-11-01-gym_equipment_throw_away.html b/posts/2020-11-01-gym_equipment_throw_away.html index 1884fb8b6..814b453ee 100644 --- a/posts/2020-11-01-gym_equipment_throw_away.html +++ b/posts/2020-11-01-gym_equipment_throw_away.html @@ -28,8 +28,8 @@ } 这些全网卖爆的“必备”品,我劝你别买…… | LearnData-开源笔记 - - + + +
    跳至主要內容

    这些全网卖爆的“必备”品,我劝你别买……

    购物断舍离健身器材约 1580 字大约 5 分钟...

    受疫情政策的影响,双十一价格普遍比往年实惠,但有些爆款价格再低也值得买。

    我整理了自己的购物清单和闲鱼记录,发现 10 件不值得买的「毒草」,为大家提供一些参考意见,避免入坑。

    划船机

    自从看了《纸牌屋》,就一直想要个划船机。精挑细选舍去昂贵的国外品牌,淘宝众筹 3980 购入国产,却发现了人性 -「懒」。

    想象:划着船看着电视,运动娱乐两不耽误,轻松减肥。

    真实:划几分钟就累成狗,根本无心看电视。划船机可以直立节省空间,但也意味着每次运动都需要先搬运几十公斤的划船机。慢慢用得越来越少,一个月可能只用一次,最后 499 自提出掉。

    出掉过程也很神奇,当晚 12 点突然决定卖掉家里所有非必需品,时间不够就只拍了划船机照片,随手写 499 后睡觉。凌晨 3 点来了买家,问了几个问题无人回复,然后就直接拍了。早上起来,我一查才知道二手划船机一般在 1000-2000,但想着人家都拍了,就还是出给他了。之后,出的器材都必须查闲鱼同款价格,不至于亏这么多。

    动感单车

    中学时代,每天骑车上学,那会体重最轻。于是淘宝 999 购入动感单车。

    想象:骑自行车多轻松,每天一小时,体重回高中。

    真实:最低档确实轻松,但效果也为零。调成高档,骑车也变狗。动感单车最大的锻炼作用是当哑铃,每次使用都得搬运 35KG。占地比划船机更大,很快就闲置了,半年后 399 自提出掉。

    健腹轮

    每天都想瘦肚子,健腹轮似乎是个完美辅助,于是京东 311 购入貌似高级的自动回弹健腹轮。

    想象:每天一百卷腹,一个月后肚子就瘦了。

    真实:咬牙坚持到一百,但动作完全变形。体重太大又导致膝盖、手掌负担过大,逐渐闲置。使用 2 年,健腹轮统计数字停在 4300,最后 130 跟划船机一起自提出掉了。

    TRX 悬挂训练

    TRX 算比较热门的运动设备了,无需安装,随时锻炼。于是美亚 889.4 入手。

    想象:一看这专业的装备,就感觉自己瘦了。

    真实:想象中的自己瘦了很多回,但人懒再专业的设备也没用,最后送给腰伤的朋友了。

    电动瑜伽柱

    运动后需要放松筋肉,我们需要瑜伽柱。人懒不愿动的话,那就需要电动的,于是严选 347.6 购入电动肌肉按摩滚。

    想象:运动完大汗淋漓,电动瑜伽柱款缓解疲劳,加速消耗脂肪。

    真实:运动呢?大汗呢?使用场景太少,甚至不如筋膜枪,直接闲置。这款挂了一周也没人买,最后 60 到付低价出了。

    开跨拉筋器

    「筋长一寸寿长十年」,于是淘宝 519 购入拉筋器。

    想象:每天多拉一毫米,明年炼成一字马。

    真实:原理与自重下压拉伸相同,但占位且笨重,使用频率越来越低,最后 150 自提出掉。

    头皮按摩器

    头皮健康才是真的健康,于是严选 179 购入龙爪手头皮按摩仪。

    想象:电动按摩头皮,能活一百八。

    真实:仪器需要 3 颗电池驱动,举着一斤的重量来按摩头皮,真的大丈夫?花了 5.5 买入 2 个八爪鱼按摩器 (推荐),重量不过 10g,效果好太多。最终 52 包邮出。

    理发器

    不愿出门理发,于是京东 99 购入电动理发器。

    想象:楼下理发一次 45,用 2 次就能回本,多理几次自动晋升理发师。

    真实:确实回本了,两次光头,然后闲置。春节带回老家,给爷爷添加了一个剃头神器。

    永远别相信身边人的剃头技术,除非你想要光头。

    灭蚊灯

    夏天一到,就被推送灭蚊灯。没抵御住,于是淘宝 78 购入灭蚊灯。

    想象:每天一小时,蚊子去无踪。

    真实:该来的蚊子总是会来,小功率的灭蚊灯等于安慰剂。效果还不如紫外线灯直接杀菌来得爽快,最后 38 包邮出掉。

    Dyson 吸尘器

    搬新家,怎少得了帅 (z) 气 (b) 的电器,于是美亚 1536.51 购入 Dyson DC58 V6 吸尘器。

    想象:快速打扫,轻松无灰尘。

    真实:吸尘器需要人来使用,打扫也不可能轻松。Dyson 造型不错,但吸力就远没吹得那么厉害。打扫阿姨也嫌弃 Dyson,推荐我买了海尔一款 109 的吸尘器。用后感觉真香,比 Dyson 实用太多。Dyson 545 包邮出。

    生活电器必须实用为先,否则再好看也只会闲置。

    总结

    运动器材需要大量空间,不适合居家使用。普通人健身,靠自重或简单器材就足够了。大型运动器材只会占据房屋位置,不会带来任何的健身加成。

    买东西前,千万要看看是否会常用。这方面,我是完美的反面教材,除了上面一系列用品外,还有墙角落的神舟笔记本(各种神奇 Bug,改装黑苹果)、胸带 + 心率表(先保持运动吧)、玩客云(专注废硬盘,被 NAS 替代)、北通游戏手柄 (永远买但永远不用)、小米 + 微软馒头鼠标(入手 3 个 MX Vertical 替代)、BackJoy + 电脑手托架(Embody 替代)、松下蒸汽眼罩(眼部按摩仪替代)、美容灯 (已变床头桌垫)、艾灸仪 (搭配防毒面具使用)。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2020-11-27-rime_input.html b/posts/2020-11-27-rime_input.html index dd6198328..7f32765cf 100644 --- a/posts/2020-11-27-rime_input.html +++ b/posts/2020-11-27-rime_input.html @@ -28,8 +28,8 @@ } 小狼毫 3 分钟入门及进阶指南 | LearnData-开源笔记 - - + + +
    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 v3.1.2
    + diff --git a/posts/2020-12-17-weight_log.html b/posts/2020-12-17-weight_log.html index 2502493d9..882145836 100644 --- a/posts/2020-12-17-weight_log.html +++ b/posts/2020-12-17-weight_log.html @@ -28,8 +28,8 @@ } 减肥日志:4 周 15 斤 | LearnData-开源笔记 - - + + +
    跳至主要內容

    减肥日志:4 周 15 斤

    健康减肥约 3439 字大约 11 分钟...

    巅峰时刻 190 斤,一个半月后 170 斤,最大的心得是控制吃

    一直不爱运动,又特喜欢吃肉,体重持续飙升。中间试过水果、胴体、一日两餐,但都无法坚持,出现了些效果但容易迅速反弹。

    190 斤后发现自己的指标全部异常,放弃了快速减肥的想法,改为更换营养食谱,好好控制指数,让身体健康些。网上多为西餐食谱,一直吃不惯,后来改为中式营养食谱。

    严格按照食谱吃后,前两周瘦 10 斤,其中 8 斤脂肪,速度太快都有点担心。4 周共瘦 15 斤,掉肉速度逐渐变缓。

    食谱初期容易有点饿,我逐渐将作息推早。原本睡觉多在凌晨 2、3 点,提前到 10、11 点睡。早睡后,起床时间也自动提早,一般 6 点起床。有时会 3、4 点突然起床,不知是什么原因。如果早起了,就直接起来工作,整天一样有精神。

    个人体验,前两周掉的主要是浮肉,平常吃的太多,一直在身体积累。对于超重的人,控制摄入量后,掉肉会非常明显。

    使用食谱前,先需要养成正确的减重习惯和心态。

    • 不要让自己饿肚子,每天至少要吃 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 族维生素药片,乳糖敏感者可以将纯牛奶换成低乳糖奶
    • 蒸蛋羹可以用水煮蛋替代;鸡心、鸭肝、方火腿可以用鸡腿肉、酱牛肉替换;什锦饭中的酱牛肉碎换成炒鸡丁;松子仁可以换成熟芝麻或开心果碎;小叶橘可以替换成等量其他甜度低的新鲜水果,如草莓或半个苹果等;桂圆可以换成其他自己爱吃、吃了之后胃肠舒服的应季水果,比如橘子、橙子、猕猴桃等。水果可以午饭前一小时食用。
    • 小米、燕麦提前浸泡半小时到一小时再和大米一起煮口感较好。如果没有杂粮粉,可以直接用这些杂粮煮成饭,每次煮多一点,分成几份冷冻起来,每次蒸热吃一份。
    • 食谱部分可进行微调,如果不会做,可直接按原料食用。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2021-01-02-keepass_the_real_lastpassword.html b/posts/2021-01-02-keepass_the_real_lastpassword.html index 0c9312e83..8b2eb8de0 100644 --- a/posts/2021-01-02-keepass_the_real_lastpassword.html +++ b/posts/2021-01-02-keepass_the_real_lastpassword.html @@ -28,8 +28,8 @@ } 抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件 | LearnData-开源笔记 - - + + +
    跳至主要內容

    抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件

    工具KeePass约 1855 字大约 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 v3.1.2
    + diff --git a/posts/2021-01-27-blog_jekyll_to_wordpress.html b/posts/2021-01-27-blog_jekyll_to_wordpress.html index ed1707dd1..6334fe4e8 100644 --- a/posts/2021-01-27-blog_jekyll_to_wordpress.html +++ b/posts/2021-01-27-blog_jekyll_to_wordpress.html @@ -28,8 +28,8 @@ } Jekyll 博客迁移-从 Markdown 到 WordPress | LearnData-开源笔记 - - + + +
  • 登录 WordPress 后台,工具-导入-安装并启用插件 FeedWordPress 。自带 RSS 导入器许久不更新,极易报错,不推荐。

  • 后台-Syndication-添加 rss 源,比如添加源 xxx.com/feed-wp.xml,其中 xxx.com 指你的博客网址。

  • 参考资料:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + 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 6d1b7f66a..f833adf93 100644 --- a/posts/2021-05-31-principles_criticism_and_self-criticism.html +++ b/posts/2021-05-31-principles_criticism_and_self-criticism.html @@ -28,8 +28,8 @@ } 普通人的生活原则-批评与自我批评 | LearnData-开源笔记 - - + + +
    跳至主要內容

    普通人的生活原则-批评与自我批评

    头脑驿站原则批评与自我批评约 1981 字大约 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 v3.1.2
    + 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 12bb0c746..e23322535 100644 --- a/posts/2021-10-23-nas_with_rsshub_and_huginn.html +++ b/posts/2021-10-23-nas_with_rsshub_and_huginn.html @@ -28,8 +28,8 @@ } RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS | LearnData-开源笔记 - - + + +

    如果你没有服务器或不愿意再折腾,也可以尝试其他的 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 v3.1.2
    + diff --git a/posts/2022-01-23-wechat_lucky_money_cover.html b/posts/2022-01-23-wechat_lucky_money_cover.html index 4eba3a693..f017c7dc4 100644 --- a/posts/2022-01-23-wechat_lucky_money_cover.html +++ b/posts/2022-01-23-wechat_lucky_money_cover.html @@ -28,8 +28,8 @@ } 想要独一无二的微信红包,你也可以自己做 | LearnData-开源笔记 - - + + +
    跳至主要內容

    想要独一无二的微信红包,你也可以自己做

    工具微信红包约 744 字大约 2 分钟...

    上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。

    春节前 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 v3.1.2
    + diff --git a/posts/2022-02-19-microsoft_store_fixed.html b/posts/2022-02-19-microsoft_store_fixed.html index 47996a251..86032ed14 100644 --- a/posts/2022-02-19-microsoft_store_fixed.html +++ b/posts/2022-02-19-microsoft_store_fixed.html @@ -28,8 +28,8 @@ } Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11 | LearnData-开源笔记 - - + + +
    跳至主要內容

    Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11

    系统Microsoft store约 380 字大约 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 v3.1.2
    + diff --git a/posts/2022-03-09-lenovo_black_card_member.html b/posts/2022-03-09-lenovo_black_card_member.html index 163b2676e..4e2b6f24e 100644 --- a/posts/2022-03-09-lenovo_black_card_member.html +++ b/posts/2022-03-09-lenovo_black_card_member.html @@ -28,8 +28,8 @@ } 联想黑金超核会员情报分享 | LearnData-开源笔记 - - + + +
    跳至主要內容

    联想黑金超核会员情报分享

    购物联想约 458 字大约 2 分钟...

    不要买联想黑金卡!不要买联想黑金卡!不要买联想黑金卡!

    京东抢购总是秒无,为了刃 9000K 3080 的台式机,299 入手联想黄牛卡 - 黑金超核卡。

    幻想着花了钱,就可以选自己理想的电脑。

    但买完后,才发现坑。黑卡会员在 8-16 日入,才提供优购权限。而我 24 日买会员,没有任何优购机型,只能等到下个月 8 日的更新。

    每月 8 日会员中心 - 黑金超核卡会员专区将预告当期优购码适用的机型种类;每月 16 日 10:00 会员中心 - 黑金超核卡会员专区仅向黑金超核卡会员开放优购码领取通道,数量有限,先到先得。

    好不容易等到优购码预告日,发现只有一种笔记本,而且还是旧款。联想,你确定这要用优购码抢?

    不过,会员费也不能白花了。

    每月我会更新优购码和 99 折的具体购买权限。不能让大家继续步我后尘,因未知而入手联想黑卡了。

    了解最新优购码种类前,一定不要买联想黑卡,否则纯属浪费钱。

    另外,推荐联系当地的联想来酷智生活店,询问是否有现货。来酷渠道属于联想官方,来源有保证。如果来酷店没现货,会在到货后电话通知,送货上门。

    8 月黑卡情报

    7 月黑卡情报

    6 月黑卡情报

    5 月黑卡情报

    4 月黑卡情报

    3 月黑卡情报

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-03-17-rss_persistent_link_collection.html b/posts/2022-03-17-rss_persistent_link_collection.html index 1c163466f..1296497d3 100644 --- a/posts/2022-03-17-rss_persistent_link_collection.html +++ b/posts/2022-03-17-rss_persistent_link_collection.html @@ -28,8 +28,8 @@ } RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效 | LearnData-开源笔记 - - + + +
    跳至主要內容

    RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效

    自动化rss约 580 字大约 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 v3.1.2
    + 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 9006529bf..47968eb0f 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 @@ -28,8 +28,8 @@ } 一键安装 99 个程序,Windows 最强软件管理器 | LearnData-开源笔记 - - + + +
    跳至主要內容

    一键安装 99 个程序,Windows 最强软件管理器

    系统wingetwinstall约 1563 字大约 5 分钟...

    矿难、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 下载以 .msixbundle 为后缀的安装程序。而在 Win11 上,则可 通过 Microsoft Store 获取应用安装程序open in new window

    安装应用安装程序后,可在命令提示符 (cmd) 中输入「winget」来运行程序命令。若要使用 PowerShell 命令,请注意修改 PowerShell 的执行策略。重要的是更改 ps1 文件的运行权限,而非 win11 自带的 ps5。以管理员权限运行 PowerShell,执行 Set-ExecutionPolicy RemoteSigned 命令。

    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) 中执行,系统将自动下载并静默配置程序。注意保存批量安装命令,winstall 网站服务并不稳定,有可能你后面想用,它却无法导出命令。

    常见问题

    尝试更新源失败

    在国内使用 winget 时,常遇到「更新源失败」的问题。下载 winget 最新官方包open in new window 可以有效解决这一问题。

    另一个常见问题是网络连接失败,例如出现 InternetOpenUrl() failed. 0x80072f7d : unknown error 的提示。这通常是因为 Internet 选项中的 TLS 版本设置过低。启用 TLS 1.2 可以解决此问题,具体操作方法请参考 解决 Windows 应用商店(Microsoft store)无法打开的问题open in new window

    下载速度慢

    在使用 winget 时,你可能会发现下载速度异常缓慢,例如 4M 数据需要等待十分钟。然而,这种感觉实际上是误解。慢速度通常是因为正在下载 winget 的源数据,而非软件本身。这一过程通常与网络环境无关,因此需要耐心等待。实际下载应用程序时,速度通常会快得多。

    已解决问题

    以下问题是早起版本的 bug,新测试中都解决了。

    • 批量安装应用中,winstall 不定期出现崩溃,原因未知。
    • winget install 不能检测当前版本软件是否安装,容易造成重复安装应用,拖慢部署时间。
    • 部分应用安装后容易有 bug,比如剪映有卡顿问题,手动安装后恢复正常。

    总结

    在我的常用软件列表中有 50 个应用支持 winget 批量静默安装,剩余 10 个需手工安装,覆盖率在 80% 以上,足够满足大部分人的需求。winget 用一个命令行能静默安装上百个软件,节省了大量装机时间。对于系统重装、批量装机、快速设置新工作环境,winget 和 winstall 是必不可少的装机神器。

    这篇文章主要介绍了 winget 的使用原理和方法。如果想直接上手,可以查看我的 系统重装open in new window 过程记录。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html b/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html index c90c607dd..64c544cc2 100644 --- a/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html +++ b/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html @@ -28,8 +28,8 @@ } 上海没吃的?割裂的城市,我真的生活在上海吗? | LearnData-开源笔记 - - + + +
    跳至主要內容

    上海没吃的?割裂的城市,我真的生活在上海吗?

    观察随笔幸存者偏差疫情约 1447 字大约 5 分钟...

    够吃吗?还能买到东西吗?

    所有人都问我这句话,因为你在上海。在舆论中,上海似乎回到 100 年前。第一次感受到,什么叫「灾区人民」。

    但真是这样吗?我真的生活在「上海」吗?

    亲身体验 VS 网上「上海」

    3 月 28 日,新闻公告浦西将于 4 月 1 日开始封控 4 天。接到通知后,我进行了大采购,把冰箱塞满。3 月 30 日,物业通知小区提前封控,就此进入宅家状态。此时,物资储备一周。

    过了几天,上海疫情彻底爆发,封控时间被延长。物资只出不进,我也进入焦虑状态,开始线上抢购。基本每天都能抢到,物资可维持两周。

    4 月 5 日,小区团购群兴起,开始大量采购,物资可维持三周。同时,街道开始小量发放物资。

    4 月 10 日后,街道开始加大物资发放量,甚至包括厕纸、沐浴露。我完全没想到,街道发这么多物资。其中的蔬菜无法长时间保存,我开始自学做酱菜和蔬菜饼。物资可维持一个月。

    街道发放的部分物资
    街道发放的部分物资

    此时,网上的上海则是另一个世界。“混乱,吃不了饭,快饿死?”

    因为这些谣传,家人、朋友、甚至网友都开始问文章开头的话。「够吃吗?还能买到东西吗?」

    幸存者偏差

    难道物资充足只是我个人的感受,其他人都处于物资短缺的状态吗?

    接着,我问了同在上海的朋友。大家反馈,物资都没我多,但基本的生活是能满足,最少能吃饱。

    那为什么网上关于上海的现状都是「没人管,没吃的」?

    我开始大量查看上海疫情的相关资讯,发现是「幸存者偏差」放大了上海的物资短缺。

    幸存者偏差(Survivorship Bias),人们所获得的有些信息可能会因为信息的提供方的匮乏(只有那些“幸存”下来的人会提供信息,“死人不会说话”),而使得由这些信息得出的结论缺乏普适性。但人们往往会忽视这一点,忽视而把获得的信息过度概括。

    4 月开始,上海 2500 万人全部进入封控状态。这一庞大的供给需求一下子砸到街道社区头上,基层组织关系接近崩溃。

    大多数物资储备充足,能网上抢菜的人,安静地在家封控,自然也不会在网上发言。

    可是,老人等弱势群体大都未接到物资储备的消息,也缺少线上抢购手段,只能通过尽可能多的渠道发声来求救。

    2500 万人即使只有万分之一的遗漏,也有 2500 人遇到困难。

    当这批人开始发声,就形成了「饥饿的上海」形象,这也就是为什么舆论中的上海与实际生活完全不同的原因。

    那么,排除掉「幸存者偏差」因素,上海真实在发生什么?

    上海的困难

    时代中的一粒灰,落在个人头上,就是一座山。

    除了初期的物资匮乏,上海面临的困难还远不止此,核酸混乱、政策多变、食品安全、物价高企、就医困难,都是摆在上海人面前的大山。

    当这些消息集中释放后,即使不是当事人也感到极度压抑。估计解除封控后,大家都得去心理咨询了。

    居家隔离前,我觉得隔离也不错,有吃有喝,还白拿工资。之前,我甚至还写了一篇文章,认为浦东封控放假,而浦西就得住在公司加班,不公平。

    但是,当亲身体验到长时间隔离,才知道失去自由的代价高于一切。

    上海真正面临的困难,是长时间隔离带来的压抑情绪。这是每个上海居民面临的最大困难。物资已经逐渐充裕,困难也逐渐克服,但压抑的情绪却一直在紧绷。

    东方台当时搞抗疫晚会,想必也是想给长时间封控在家里的我们带来一些振奋的情绪吧。

    但它没理解,我们需要的不是晚会,而是真正的好消息 - 疫情结束

    疫情中的希望

    为了写这篇文章,看了许多上海疫情所发生的悲剧,我的情绪也完全进入低谷。可想而知,当事人得有多么痛苦。

    但对普通人,希望大家别去关注,这些坏消息真的会让人抑郁。当这股压抑情绪来临时,我真切地感受到「什么是灾民」。这不是物质上的匮乏,而是精神上的压抑,这给人的创伤更大。开始理解,被网暴的上海女儿为什么要自杀了,想必是压抑至极又碰上网暴而无法承受。

    希望歧视上海的段子能少些,压抑的情绪中已经到了临界。

    希望正能量的消息能多些,我们此刻真的很需要一点激励。

    希望上海疫情能早点结束,让生活恢复正常。

    也希望疫情结束后,上海能好好复盘,记住教训,不要让历史重演。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-04-21-uivision_rpa.html b/posts/2022-04-21-uivision_rpa.html index 64329c705..935d5501d 100644 --- a/posts/2022-04-21-uivision_rpa.html +++ b/posts/2022-04-21-uivision_rpa.html @@ -28,8 +28,8 @@ } 不想学 Python,零基础也能用的自动化工具-UI.Vision RPA | LearnData-开源笔记 - - + + +
    跳至主要內容

    不想学 Python,零基础也能用的自动化工具-UI.Vision RPA

    自动化浏览器插件UI.VisionRPA约 1676 字大约 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」,则可让宏循环运行。循环次数 ${!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 v3.1.2
    + diff --git a/posts/2022-05-22-surveillance_video_for_myself.html b/posts/2022-05-22-surveillance_video_for_myself.html index 2fecf67b3..db4098f08 100644 --- a/posts/2022-05-22-surveillance_video_for_myself.html +++ b/posts/2022-05-22-surveillance_video_for_myself.html @@ -28,8 +28,8 @@ } 疫情封控两个月后,我对自己开始 24 小时的自我监控录像 | LearnData-开源笔记 - - + + +

    DVR-Scan 不同命令的测试效果如下:

    命令耗时(s)输出视频(mins)
    默认12407:15
    -t 0.512506:52
    -b CNT10710:05
    -t 0.5 -b CNT10408:39

    另外,DVR-Scan 可以使用 -roi 命令,指定监测区域,只对该区域的动作进行监测。

    DVR-Scan 进阶命令查看官方文档open in new window

    播放降噪:PotPlayer

    桌面录音容易有较大的噪音,重新处理的话需要大量时间,因此我将降噪环节放在视频播放器中处理。

    • 开启降噪:风噪等一系列噪声会消失,但是带过降噪耳机的都知道,开启降噪会有一种很糊的感觉,这时视频的声音就会变得无比无比的糊。

    • 开启语音增强:语音增强会在很糊的声音中明显听到人的声音,但是还是略显不足,还是有点杂,而且声音特别大。

    • 关闭规格化:这时声音就不会那么大,也不会过于杂了,这时的声音已经相比处理前干净多了。

    • 开启超高音:打开均衡器,选择「超高音」方案。

      PotPlayer 播放降噪设置
      PotPlayer 播放降噪设置

    设置完成后,播放时 PotPlayer 会自动对视频进行降噪,无需额外花时间处理视频。

    总结

    自我监控分为 5 步,「晨间唤醒:计划」>「录制视频:VLC」>「过滤视频:DVR-Scan」>「视频回放:PotPlayer」>「当日回顾」。搭配脚本,每天开机自动开始录制视频,然后在晚上九点停止录制,并过滤当天视频的静止帧。

    经过一段时间的自我监控,我对自己的活动有了更清晰的认知,从而更方便地进行行为控制和修正。此外,由于视频存储在本地,不向第三方开放,所以可以安心地做自己。在每日回顾中,勇敢地面对自己的缺点和错误,积极地进行调整。

    参考资料:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-06-07-blog_md_to_wordpress.html b/posts/2022-06-07-blog_md_to_wordpress.html index 67b736850..ca7c20f1c 100644 --- a/posts/2022-06-07-blog_md_to_wordpress.html +++ b/posts/2022-06-07-blog_md_to_wordpress.html @@ -28,8 +28,8 @@ } 集自动发布、本地管理于一身:WordPress 博客管理方案分享 | LearnData-开源笔记 - - + + +

    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 v3.1.2
    + diff --git a/posts/2022-08-10-new_stuff_shaping_machine.html b/posts/2022-08-10-new_stuff_shaping_machine.html index 6764d6f2a..7df6fc249 100644 --- a/posts/2022-08-10-new_stuff_shaping_machine.html +++ b/posts/2022-08-10-new_stuff_shaping_machine.html @@ -28,8 +28,8 @@ } 新玩意|智能可折叠综合塑形机 | LearnData-开源笔记 - - + + +
    跳至主要內容

    新玩意|智能可折叠综合塑形机

    购物健身器材约 848 字大约 3 分钟...

    家里关得太久,体重又涨了 10 斤,再次陷入健身器材焦虑之中。虽然划船机、跑步机、动感单车的结局都是闲鱼出,但我对健身器材的追逐始终没变。这时发现有品众筹的新玩具,两千的综合塑形机。

    已闲置于墙角

    这款塑形机原理与飞鸟龙门架类似,号称可以充当家庭健身房,锻炼全身的肌肉,包括练肩后束、练背、练上胸、练胸中缝、练下胸、练三头、练二头、练核心、练臀大肌、练大腿外侧。

    之前我就想练飞鸟,不过龙门架实在太大,而这台机器折叠后只占 0.18 平,还能移动位置,完美匹配屋内使用的需求。虽然这是众筹产品,要等 2 个月,还是心动下单了。

    左侧为龙门架,右侧为塑形机

    等待收货时间内,体重继续上涨,总想着健身器材到了就瘦了。但是当收到货后,我终于理解了「什么叫做众筹」。

    锻炼时必须用身体抵住塑形机,否则机器会跟着你的动作滑走。虽然滑动的原因在于机器较轻,只有 60 KG,但我无法理解的是,厂家连基本的防滑措施也没有做,仿佛生产前从没人真的用过机器。防滑降噪脚垫在拖动时倒蛮好用的,拖起来特别丝滑,完全没有阻抗。为了避免塑形机不断滑走,我只能买了个阻门器,装上后就能避免机器乱滑动了。

    右下方是红色的阻门器,硬拉终于不会滑了

    解决滑动问题后,我打开塑形机官方视频,才发现其中 90% 的动作用不到塑形机,甚至是根本就扯不上关系。买之前,我看着详情页感觉动作特多功能特强,用过后,才发现「这就是所有的动作」。

    官方示例动作图

    不过,机器都收货了,动作少也得跟着练。可是,按照塑形机官方教程锻炼一组后,我的肩膀和手臂都被勒伤。原因是与身体接触的部分都是特粗尼龙绳,没有任何缓冲,一用力就容易勒伤。两千的机器连块 PU 皮都要省,可能是想让大家穿着特别严实来锻炼吧。

    钢板间隙过大,凳子要蛮力打开,锻炼视频无法暂停,APP 没有语音提示,视频教程无法切换动作,几乎机器到处都有问题,只能将原因归于众筹了,第一款模具真的是无语。

    当然,这款塑形机也是有好处的。传统龙门架使用铁块配重,重量最少也得上百公斤,而且占地大无法移动。塑形机采用磁力配重,重量只有 60KG,机器折叠后 0.18 平方,配上防滑降噪脚垫非常方便移动。

    塑形机确实能帮我练到平常少运动的肌肉,目前主要用它练背,等有了新玩具再出闲鱼。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + 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 131923b6a..910a51b58 100644 --- a/posts/2022-08-22-learndata_blog_to_knowledge_management.html +++ b/posts/2022-08-22-learndata_blog_to_knowledge_management.html @@ -28,8 +28,8 @@ } 抛弃 Notion 知识管理软件的尝试:把博客变为知识库 | LearnData-开源笔记 - - + + +
    跳至主要內容

    抛弃 Notion 知识管理软件的尝试:把博客变为知识库

    博客头脑驿站VuePress建站约 3043 字大约 10 分钟...

    知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。

    这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。

    另一方面,我们在使用知识管理软件的美观界面和强大功能的同时,也被这些软件所限制,无法完全按照自己的想法输出笔记。比如,你有了一双翅膀,Markdown 文本是自由的天地,而进入 Notion 则被隔成一个个小房间,你在房间里待着很舒服,可一旦想去其他房间,就必须脱离 block,不比 Markdown 可以自由飞翔。

    Markdown VS Notion

    突破迷思后,我基于 VuePress 和 vuepress-theme-hope 建立了 LearnDataopen in new window 项目,将知识笔记、生活记录、博客和任何认为有价值的记录转换为 Markdown 文本,然后推送到 GitHub 生成 Pages 静态页面,并同步到国内云服务器,形成 LearnData - 开源笔记open in new window

    笔记/博客自动化发布

    LearnData 的笔记和文章格式是 Markdown,输出不受到应用的局限。LearnData 看起来像由文章组成的博客,但它的笔记是独立的知识点,是所有知识的终点站,是整理后的知识库。通过 LearnData 可以搜索和整理知识,不再需要来回翻找。把博客转为知识库后,我明显感到学习和知识使用的效率得到提高,开始摆脱「工具奴隶」和「效率中毒」陷阱。

    笔记 + 文章 = LearnData 知识库

    为什么用网页管理笔记

    公开想法

    知识管理/笔记软件具有天然的私密性,不对外公开。但是,我的笔记大部分来自互联网,需要对谁保密?

    我非常赞同 Ray Dalio 在《原则》中提到的「头脑极度透明,公开分享想法」。

    让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    作为国内最早一批介绍 Aria2 的人,我曾经写过一篇 Aria2 教程。文章后来被多个网站参考/抄袭,覆盖了 Aria2 某度搜索前三页。在那篇文章的评论区,有好几条留言批评文章逻辑差看不懂的,经常有热心人帮我怼回去。其实,那篇文章的初版真的很糟糕。那篇文章是在大家的反馈下,迭代了三个版本才开始变得完整和逻辑化。这些反馈也是我坚持写博客的原动力。这跟费曼学习法的道理相通,当你写文章帮助其他人时,你也在加深自己对知识的理解。建立 LearnData 不到一个月,但我从中获取的正反馈已超过私有笔记一年的收获。笔记公开化是有百利而无一害。

    输出分享

    其次,网页形式使笔记更容易分享。除了效率工具的心得,我还在 LearnData 上放置了生活技巧、购物评价和说明书。当家人或朋友需要帮助时,可以直接访问网页,无需安装应用程序或折腾账户分享,比如我经常分享的通马桶技巧open in new window 和疏通器说明书。

    生活知识页面样例

    被动消化知识

    如果只是公开分享,LearnData 与笔记软件并无区别,它的优点更在于网页有限的笔记数量。虽然网页可以无限地存放笔记,但打开页面只能看到少量的几十篇内容。一旦笔记堆积过多,你就像触发了整理开关似的,对笔记开始消化重构。这就是网页容量上的无限性和视觉/直觉上的有限性,存储是无限但视觉上只能有很小的一块。这里的直觉指,看一眼界面就能找到所需知识点的效果。

    比如,当我的代码区块笔记存放超过 10 篇时,每次查找代码笔记都需要 10 选 1,知识查找时间也翻倍了。我意识到节点过多,不能让自己将时间花在查询上。因此,我将代码笔记分为 Basic 和 FrontEnd 两块,总结划分的同时,编程知识也再次得到消化。

    而网页与笔记软件的区别也正在于此,LearnData 的主页、侧边栏和导航栏就是能展示的路径,你必须不断对笔记提纯才能提高使用率。否则,如果你只是「积累」笔记而非消化知识,无论使用什么工具和方法,成效都是 0。

    漂亮决定生产力

    另外,网页可以自由调整外观样式,更换为你喜欢的界面。这也是为什么 LearnData 放弃了初版的 docsify 框架,改为复杂得多的 VuePress 框架。docsify 的官方模板太过简单,没有界面设计模块,难以满足知识管理界面必须直观漂亮的要求,而这一点直接决定了生产力,不能让步。

    知识管理/笔记软件将 Markdown 文件作为一个个区块,而网页可以将其视为一体。LearnData 支持多级侧边栏和目录,让阅读和查找变得更加简单。

    LearnData 页面布局

    为什么不用 Obsidian

    @北鸮 提到「脱离 Notion 可以理解,Markdown 很自由,那为啥不用 Obsidian 呢?也有标题,也有标签,也可以有层级,开源软件还有 Logseq 替代」。

    Obsidian 等双链笔记的设计初衷很好,可以让我们自由地在不同知识点间切换,节省搜索和关联的时间。但是,知识点的联系是靠人工打标签来建立的,而不是根据关键词自动建立图谱关系,这与 URL 链接有什么区别?因此,我认为双链笔记并不适合知识库(如果对双链笔记理解有误,欢迎纠正)。

    我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团

    建立知识点联系后,双链笔记可以轻松处理成千上万个文档,按条件整合文本,便于阅读。但是,大多数人常用的知识范围不会超过一百。如果你的个人笔记超过千篇,要么你是科研大佬,要么你没有消化这些笔记,只是在记笔记。

    除了博客,我只有 37 篇笔记,而且按功能划分为 7 个区块。你觉得这点文件,用树状管理方便,还是用双链笔记打一堆标签来得好?即使有时标题里找不到某个关键词,我也可以用全文搜索达到目的。我个人会倾向于简单方便的树状标题管理。

    抛弃知识软件 ≠ 不用

    选择 Markdown 就得卸载知识软件吗?

    抛弃知识软件并不是不用,而是将其视为知识的中转站。知识软件的趋势是 ALL IN ONE,记录全能成了标榜的主打功能。但是,光收集而不应用的知识等于零,只会增加你后续的使用成本。

    对我来说,知识软件是功能清晰的素材库。我会不断清空素材库,将小的知识点融入 LearnData 笔记区,成体系内容则写成博客,以确保 LearnData 成为知识库的终点。

    知识类素材库
    • Logseq 将信息节点化,能按日期整合文本,因此我用它来记录笔记,并定期生成周报和月报回顾。
    • 飞书文档自带侧边目录栏,对长文档优化很好,因此我用它记录工作心得,定期形成工作流程并在公司分享。
    • WonderPen 带多层级标题,当一点头绪方向都没有时,素材就可以直接放这里。
    • Notion 貌似全能,但其可替代性也最高,知识库迁移到 LearnData 后,Notion 仅用来存放涉及个人信息和不方便转移的旧文档。
    • Airtable 表格功能最强,虽然已经被其他软件赶上,但前期存储的大量数据仍然放在这里。
    • SuperMemo 与 Anki 功能类似,可以帮助定期复习需要重复记忆的知识点。

    而对于 Obsidian,我将其视为笔记的备份站。通过 GoodSync,LearnData 笔记发生修改后,相关更新会实时同步到 Obsidian,完成笔记的备份。期待有一天 Obsidian 完善双链功能,帮助笔记自动打上标签,到时备份笔记就能正式使用,我也能无缝切换到新的知识管理应用。

    如果你也想试试……

    如何把博客转换为知识库,建立属于你的 LearnData 知识管理网站?

    首先,确保你有 GitHub 账号,懂 Markdown 和基础 HTML 知识。然后,按照 LearnData 部署教程open in new window完成搭建和配置。如果你的笔记已经用 Markdown 格式编写,只需把文档放在 docs 目录下,就可以建立自己的知识库。

    笔记结构可以参考我的分类。这没有绝对的界限,只要看到自己觉得有价值的知识点,都可以往 LearnData 里添加。但是,不要全文本地化收藏,简单提取用链接引用即可。除少量精品外,网络时代的文章隔几年就会失效,没必要收藏为一篇篇的笔记。当下次需要使用这个知识点时,再考虑整理事宜,否则,长时间用不到的知识,又有什么整理的价值呢。

    • 置顶:日常习惯、健身、阅读;
    • 代码:常用代码的学习和使用笔记;
    • 软件应用:常用应用、Chrome 扩展和相关教程;
    • 页面开发:页面插件和框架生成工具;
    • 网站部署:网站相关的工具和知识收集;
    • Linux 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
    • 系统问题:Windows 系统优化和相关问题;
    • 生活区:说明书、生活记录和小技巧;
    • 博客区:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

    最后

    两个月前,我在 WordPress 博客篇中喊着「md2wordpress 是最后一次博客方案」,但由于 WordPress 与 Markdown 各种不兼容,写完没多久就换到支持原生 Markdown 解析的 VuePress。

    这次我不想再立 Flag 了,只希望能放过自己。每进行一次知识迁移,真是大伤,休息一段时间吧。

    如果你有兴趣尝试 LearnDataopen in new window,欢迎通过链接访问并复制模板尝试。具体的操作方法与常见问答我都写在博客中。如果有进一步的问题或讨论,欢迎在评论区留言。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-09-05-stable_diffusion_ai_painting.html b/posts/2022-09-05-stable_diffusion_ai_painting.html index 54bf43635..db5b5c481 100644 --- a/posts/2022-09-05-stable_diffusion_ai_painting.html +++ b/posts/2022-09-05-stable_diffusion_ai_painting.html @@ -28,8 +28,8 @@ } 零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑 | LearnData-开源笔记 - - + + +

    Docker Desktop cannot start

    Hardware assisted virtualization and data execution protection must be enabled in the BIOS 报错说明电脑没开启虚拟化。

    在开机的时候多按几次 F2DEL 进入 BIOS,然后设置中开启「Intel Virtual Technology」,AMD 则是将「SVM Support」设置为设置为「Enable」的状态;最后点击「F10」保存退出即可。

    docker 命令失败

    The command 'docker' could not be found 说明当前命令行确实 Docker 环境缺失,检查 Docker Desktop 是否启动。

    Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:7860 -> 0.0.0.0:0: listen tcp 0.0.0.0:7860: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 说明端口启用失败。Windows 可使用 net stop winnat 重置端口,Linux 则使用 sudo fuser -k 7860/tcp

    exited with code 137

    通常来说,exited with code 137 意味着内存不足,超出内存限制导致进程被关闭。建议硬件配置最低为 16G 内存,尤其是在使用 auto-cpu 模式时。

    端口访问被拒

    Docker 容器原本运行正常,端口访问突然被拒绝了,显示 Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:7860 -> 0.0.0.0:0: listen tcp 0.0.0.0:7860: bind: An attempt was made to access a socket in a way forbidden by its access permissions

    在 Powershell 中输入 netsh int ipv4 show excludedportrange protocol=tcp 检查是否处于被排除端口范围,然后输入 reg add HKLM\SYSTEM\CurrentControlSet\Services\hns\State /v EnableExcludedPortRange /d 0 /f 开启端口。操作完成后,重启电脑即可解封端口。[11]

    FileNotFoundError

    再次架构容器时报错 FileNotFoundError: [Errno 2] No such file or directory: '/models/model.ckpt',这是架构位置错误导致的。此时,我们需要检查是否通过 WSL 输入的架构命令,并且 Stable Diffusion WebUI Docker 解压路径是否配置正确。

    采样模型

    采样模型是 AI 绘画的核心。2022.09.10 已支持自动下载采样模型,下方列表仅做参考。

    最后

    尽管 Stable Diffusion 目前还不能作为生产力工具,但它使设计变得更加简单,也为普通人开启了 AI 绘画的可能性。建议你亲自体验,实际部署一下,让自己拥有更多的可能性。


    1. Windows Docker 安装open in new window ↩︎

    2. 使用 WSL 在 Windows 上安装 Linuxopen in new window ↩︎

    3. 在 Windows 10 上安装 Hyper-Vopen in new window ↩︎

    4. Setup Stable Diffusion WebUI Dockeropen in new window ↩︎

    5. Stable Diffusion Prompt Book - OpenArtopen in new window ↩︎

    6. 外网爆火的 4 款「你说我画」自动作画工具,我们测了下,有 1 款的确超强open in new window ↩︎

    7. 最时髦的 AI 画画,一文包教包会open in new window ↩︎

    8. Learn Prompting: Weighted Termsopen in new window ↩︎

    9. stable-diffusion Prompt matrixopen in new window ↩︎

    10. Textual Inversionopen in new window ↩︎

    11. Windows 端口访问被拒open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-09-07-extreme_branding_thinking_with_mate50.html b/posts/2022-09-07-extreme_branding_thinking_with_mate50.html index 680658ea4..382ef4d6b 100644 --- a/posts/2022-09-07-extreme_branding_thinking_with_mate50.html +++ b/posts/2022-09-07-extreme_branding_thinking_with_mate50.html @@ -28,8 +28,8 @@ } 「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低? | LearnData-开源笔记 - - + + +
    跳至主要內容

    「华为没电也能打电话」「iPhone 没电也能刷公交卡」,手机品牌是被绑架还是行业底线就是低?

    观察随笔媒体约 1319 字大约 4 分钟...

    华为 Mate50 时隔两年后再次发布,然后就看了一堆标题为「华为 Mate 50 没电也能打电话」的新闻,某度为您找到相关资讯 139 个。看到这标题,我直接傻眼,你们这些媒体是认真的吗?是收了哪边的公关费

    个人观察

    我的主力机是荣耀 20S,用了三年依旧能打,因此我对华为和鸿蒙充满好感,平常的购买也会倾向国产。但是,半路半粉的我看到这个标题,对这款手机的好感直接 -1

    当然,华为发布会上从没说过「没电也能打电话」,官方说法是「在 1% 低电量下智能启动聚能泵,待机可达三小时或者通话 12 分钟,或亮码 10 次,或扫码 4 次。」这个应急功能实际上是不错的,能缓解充电焦虑。历过数次 2% 直接关机后,我很喜欢这种关机前再榨一把的充电技术。

    有种黑的说法是,「只是把电池低电量保护分级罢了,比如,低电量 15% 电池进入保护,那么,后台只需将 85% 的电量重新显示为 100%,即手机显示的 1% 绝不是真实的 1%,小技俩而已。」

    而我对这种想法是不信的,如果真是这样的套壳宣传,随便检测都能发现,对于华为来说完全是得不偿失。

    华为需要极端宣传吗?

    「走极端才能创造话题」是品牌成功和营销的第一步,但这只是第一步。

    在美国打压下,华为已经是民族主义的顶流了,正常宣传就能拥有一大堆的拥趸,不必每天打鸡血造话题,更不需要用震惊体来吸引流量。

    那为什么华为依然用「没电也能打电话」这类极端的宣传方式?

    我猜测是被自媒体绑架了。

    除打包合作外,媒体宣传费用是建立在播放、阅读、互动的基础上。即使是固定价格的打包合作,这次的流量也会决定是否有下次的合作。因此,对自媒体来说,它不在乎观众对品牌的观感是否被消耗,它在乎的是流量,是互动。即使有黑子,那也是互动啊。有了互动,平台会持续给宣传载体进行加权并推流,自媒体的议价能力也持续提高。

    宣传流量图

    华为总被嘲笑有海军,可能有它自身的原因,但这些极端化媒体的绑架也少不了。

    过多的极端宣传,舆论引起的反噬会远超你获得的利益。不是每个人都会仔细查看你的宣传稿,看到上百篇高级写着华为「没电也能打电话」,真有人会以为你有什么黑科技了。

    手机行业的底线

    原本以为只是华为这样,但 @Dean 提供了另一个梗「iPhone 没电也能刷公交卡」,理由是门禁卡等 NFC 设备没电也能使用。这个梗从 2018 开始每年都要吹一波,门禁卡没电,那么黑科技加持的 iPhone 没电自然也能刷公交卡。这乍听蛮像一回事的,网上也有一堆人相信,但苹果官方文档直接打脸,「即使您的 iPhone 需要充电,您或许也能够在设备上使用“快捷模式”卡片、凭证和钥匙。如果将 iPhone 关机,这项功能将不可用。」

    可能事实就像 @VirtualProsperity 和 @弘隐 说的一样,「作为前手机行业营销从业者,很负责的说,几乎任何手机品牌不会被媒体绑架。因为营销的时候媒体只是其中一个环节,但绝非重要到要为媒体去绑架的程度」,「手机行业的营销很多时候是很 LOW 的 LOW 到你不敢想象是真的」。

    我也身处广告行业,面对的甲方多为快消品。快消品购买频次高,因此品牌方把品牌商誉和防黑放在首位,而手机更换需要 1-3 年,等到下次购买顾客已经遗忘了前几年的极端宣传。或许手机品牌正因为这点而肆意妄为,一切宣传以传播效果为先,以眼前销量为主。一次两次还行,多次之后你还会上当?还会购买这类品牌?我不会。然而,手机行业的想法可能真的不一样,底线有点低。

    最后

    如果你是刚起家的自媒体和品牌,尽管去用走极端的宣传方式,毕竟营销不是道德审判,活下去才是第一步。

    但如果你已经有一定的知名度了,请先想清楚,你真的需要「走极端」的垃圾流量吗?真的要赌互联网记忆?

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2022-11-03-ffmpeg_screen_recording.html b/posts/2022-11-03-ffmpeg_screen_recording.html index e8acbbcf4..de55c27d8 100644 --- a/posts/2022-11-03-ffmpeg_screen_recording.html +++ b/posts/2022-11-03-ffmpeg_screen_recording.html @@ -28,8 +28,8 @@ } 抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg | LearnData-开源笔记 - - + + +
    跳至主要內容

    抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg

    工具录屏约 3111 字大约 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 v3.1.2
    + diff --git a/posts/2022-11-18-whisper_ai_subtitles.html b/posts/2022-11-18-whisper_ai_subtitles.html index 7e0f62037..977977d32 100644 --- a/posts/2022-11-18-whisper_ai_subtitles.html +++ b/posts/2022-11-18-whisper_ai_subtitles.html @@ -28,8 +28,8 @@ } 找不到字幕?Whisper 让不懂外语的你也能看懂日剧 | LearnData-开源笔记 - - + + +

    接下来,我会分享如何使用 Whisper 为外语视频自动生成字幕,以日本综艺节目「中森明菜デビュー 40 周年 女神の熱唱!喝采は今も」为例。

    音视频转录

    在文件所在目录下打开终端,运行 whisper jp.mp4 即可执行音视频转录。测试视频名原本为日语,我将其更改为「jp.mp4」,原因是我的系统中只安装了中英语言包,因此使用其他语言或文件名中含有空格的文件会导致出现 Invalid argument 错误,从而导致转录失败。Whisper 的媒体分析环节调用了 FFmpeg,因此支持大多数主流音视频格式。

    whisper 命令

    测试视频时长 90 分钟,我使用了 3080Ti 显卡进行转录,用时 10 分钟。转录过程中,不要进行游戏或直播等占显存较多的行为,否则可能会导致显存不足而无法继续转录。Whisper 对设备的要求不高,但设备的性能会影响转录时长和可使用的转录模型。如果你使用 CPU 进行转录,则需要的时间会增加 5-10 倍。

    转录完成后,Whisper 将生成原生字幕文件,例如,日语视频将被转录为日语字幕,西班牙语视频将得到西班牙语字幕。

    字幕翻译

    通过 Whisper 获得原生字幕后,接着要将其翻译为中文。这一步需借助 SubtitleEdit Online,它支持免费在线翻译字幕,可使用 Google 和 Yandex 两种翻译引擎。[1]

    1. 打开 SubtitleEdit Onlineopen in new window,点击「Subtitle」>「Open...」,选择要导入的字幕文件。
    2. 点击「Auto-translate」,选择翻译引擎,然后在弹出窗口中选择字幕要翻译的语言,并将页面拖动到最下方(非常重要),确定所有文字都被翻译后点击 OK 按钮。
    3. 点击「Subtitle」>「Save/download...」,即可保存翻译好的字幕文件。

    如果你开通了 Google Translate API,还可以使用我的字幕翻译open in new window工具,批量将 .srt 字幕文件进行翻译。除了网页翻译和 ChatGPT API 字幕,本地端的神经机器翻译也是一个好的选择。如果你是 macOS 用户,推荐使用 Argos Translateopen in new window,这是基于 OpenNMT 的开源神经机器翻译。如果你具备一定的编程能力,可以尝试 Opus-MTopen in new window。不管使用哪种方式,都是将字幕以文本方式导出,然后复制到翻译引擎中翻译,即可得到与 Google Translate 不同的翻译结果。

    Whisper 进阶命令

    task

    --task 分为 transcribe(语音转录)和 translate。Whisper 默认使用 --task transcribe 模式,将语音转录为对应的语言字幕。--task translate 是所有语言翻译为英文,目前尚未支持翻译为其他语言。

    language

    --language 是设置语音转录的语种,支持语种范围查看 tokenizer.pyopen in new window,比如指定日语 --language Japanese。如果你没指定语种,Whisper 会截取音频的前 30 秒来判断语种。

    如果指定语种与文件中的语种并不相同,Whisper 会强制翻译,但 10 分钟以上的音视频会出现大量的重复无意义字幕。[2] 假设你把日语视频的转录语言设为汉语,前 8 分钟 Whisper 会正确转录到中文,但 8 分钟后的转录字幕会一直重复,并与实际片段无关。

    model

    --model 指 Whisper 的转录模型,转录效果为 tiny < base < small < medium < large,默认使用 small。添加参数 --model medium--model large 可以切换到更大的模型,但转录时间也会变长。如果你是对英文视频进行转录,则在模型参数上添加后缀 .en,能提升转录速度。

    模型大小单英语模型多语言模型最低显存转录速率
    tiny39 Mtiny.entiny~1 GB~32x
    base74 Mbase.enbase~1 GB~16x
    small244 Msmall.ensmall~2 GB~6x
    medium769 Mmedium.enmedium~5 GB~2x
    large1550 MN/Alarge~10 GB1x

    上方表格是 Whisper 官方提供的数据,但目前的模型实际增大了 50%-100%,要求也相应提高了。因此,该表格仅供参考。

    辅助参数

    • --device 指 whisper 运行算法所用的硬件,默认为 cuda 即显存,或者指定 --device cpu 。特别当你显存不够,又想使用较大模型时,推荐指定 CPU 转录。
    • --temperature temperature 决定了生成模型的贪婪程度,默认为 0。如果 temperature 低,概率最高的词将远高于其他低概率,模型将可能输出最正确的文本,变化很小。如果 temperature 较高,该模型会输出概率较高的其他单词,而不是概率最高的单词,生成的文本将更加多样化,但有更高的可能性出现语法错误和生成无意义的文本。
    • --temperature_increment_on_fallback 当解码失败时,回推时要增加的 temperature,默认为 0.2。
    • --best_of temperature 不为零时的侯选个数,默认为 5。
    • --beam_size temperature 为零时,number of beams in beam search,默认为 5。beam 直译是光束,但没理解具体意思,我简单理解其为侯选数。
    • --patience 用于 beam decoding 的 patience value,as in https://arxiv.org/abs/2204.05424open in new window, 其默认值为 1.0,相当于 conventional beam search(default: None)默认的 simple length normalization(default: None)。
    • --length_penalty optional token length penalty coefficient (alpha) as in https://arxiv.org/abs/1609.08144open in new window, 默认使用 simple length normalization (default: None)
    • --suppress_tokens 逗号分隔的标记 ID 列表,以便在采样过程中进行抑制; 默认为 -1,这会抑制除常见标点符号外的大多数特殊字符的出现。
    • --initial_prompt 可选的文本提示,在命令首行出现,默认为空。
    • --condition_on_previous_text 默认为 True,为下一个窗口提供模型之前的输出作为提示;禁用可能会使不同窗口的文本不一致,但模型变得不容易陷入失败循环。
    • --fp16 是否启用半精度 fp16 进行推理运算,默认为 True,否则为单精度 fp32,运行时间延长。
    • --threads 指定 CPU 运算的线程数,会取代 MKL_NUM_THREADS/OMP_NUM_THREADS (默认:0)。
    • --output_format 用于指定转录后的字幕格式,支持的格式有 txt、vtt、srt、tsv、json 和 all,可以使用 -f 缩写。我通常只需要 srt 格式的文件,所以我将其设置为 -f srt

    幻听参数

    非英语视频的转录有时会出现幻听,即静默片段被识别出语音,或是转录结果与该片段无关。这些问题是由于语气停顿参数引起的。幻听的解决方案是引入 VADopen in new window,但 VAD 对动手能力要求较高。如果你的视频转录出现了严重的幻听,建议尝试调节参数阈值。

    • --no_speech_threshold 无声识别的阈值,默认为 0.6。当 no_speech_threshold 高于阈值且 logprob_threshold 低于预设时,该片段将被标记为静默。对于非英语长视频来说,建议将其调低,否则经常出现大段的重复识别。
    • --logprob_threshold 转录频次的阈值,默认为 -1.0。当 logprob_threshold 低于预设时,将不对该片段进行转录。建议修改为 None 或更低的值。
    • --compression_ratio_threshold 压缩比的阈值,默认为 2.4。当 compression_ratio_threshold 高于预设时,将不对该片段进行转录。

    --no_speech_threshold 0.5 --logprob_threshold None --compression_ratio_threshold 2.2 是我常用的参数,你可以根据视频情况调整。在转录命令后面添加幻听参数即可。转录指令示例:whisper jp.mp4 --language Japanese --model large-v2 -f srt --no_speech_threshold 0.5 --logprob_threshold None --compression_ratio_threshold 2.2。需要注意的是,幻听参数并不适用于每个视频。如果你发现添加参数后的字幕内容大量重复,请将幻听参数移除或将调整幻听参数,比如 whisper jp.mp4 --language Japanese --model large-v2 -f srt --no_speech_threshold 0.1 --logprob_threshold None --compression_ratio_threshold 1.0

    转录成果

    「夜のヒットスタジオ・スペシャル」:

    「中森明菜デビュー 40 周年 女神の熱唱!喝采は今も」:

    上方是我用 Whisper 转录的日语视频,不过哔哩哔哩不支持站外嵌套字幕,查看字幕效果需跳转回 B 站。测试视频中 Whisper 对谈话片段识别不错,但歌曲转录与原意相差甚远。而我特别喜欢中森明菜的歌,所以在转录第二个视频后,特意花了几个小时重新比对歌词。

    但视频发布后,B 站给我推送了明菜歌迷会在一周前发布的带字幕视频。原本我有些沮丧,想着白花工夫了。但我看过对方专业的字幕视频后,心情立马变好了。歌迷会版本的字幕遣词造句都非常讲究,明显是日语精通级别,而我连五十音都没背全,用 10 分钟就能做出能看懂的字幕,质量也没相差巨大,我非常满足。之后,我也可以看没字幕的生肉节目了,不用再傻等字幕组的宠幸。我甚至可以帮中文节目添加字幕,毕竟与声音相比,我们从文字中汲取信息要轻松许多。

    其他工具

    如果你的电脑配置不足,但又想翻译非英语(如日语)的长视频,可以使用 Google Colab 的免费 GPU 运行 N46Whisperopen in new window 来在线转录字幕。转录出的字幕可以在 N46Whisper 中使用 ChatGPT API 进行翻译,也可以通过上文的机器翻译方式进行免费翻译。需要注意的是,在处理日语长视频时可以开启 is_vad_filter,减少幻听的出现。

    faster-whisperopen in new windowwhisperXopen in new window 内置了 VAD,并拥有更快的处理速度。如果你对命令行工具不熟悉,也可以利用 Subs AIopen in new windowBuzzopen in new window 来进行 Whisper 转录。

    不过,目前第三方套壳工具存在各种问题。如果你只是想批量转录,可以使用「whisper + 音视频绝对路径」的方式,来将多个文件按序批量转录出字幕文件。注意,命令行的最后一行需要换行,否则最后一个文件不会自动转录。

    更多

    除了用 Whisper 转录的字幕来看视频和视频剪辑外,还能将来管理音视频。@PlatyHsu 分享的 ATP Podcast Searchopen in new window 启发了我,ATP 用 Whisper 转录给一个做了十年的英文播客做了可搜索的索引。那是否有应用在本地端用字幕管理视频文件?

    ATP Podcast Search 搜索界面

    这个想法在技术上实现起来不难,甚至飞书妙记已经起到类似效果,但它是在线应用,不支持上传字幕,而且仅支持原生字幕搜索。换句话说,上传日语视频,你必须用日语搜索,即使妙记提供了中文翻译查看,你也不能中文搜索。而其他的视频笔记,只有 B 站专属的站内视频笔记和只支持 YouTube 的 ClarityNotesopen in new window

    总体上,还没出现能用字幕/时间戳管理视频的「全视频网站/本地视频」的笔记工具,暂时只能记录下这个想法。笔记软件们继续卷起来,把字幕文件作为数据库索引,通过关键词搜索即可定位到音视频的时间戳,绝对是杀手级功能。

    最后

    今年是 AI 工具的爆发年,多个领域都出现优质的开源工具,极大地提升了我的生活、学习和工作效率。

    在遇到 Whisper 前,我用 YouTube 的实时字幕看在线视频,但它是通过语言实时转录而非整句转录,导致效果远差于 Whisper。我使用飞书妙记管理本地视频,但飞书只支持中日英语,机器翻译较死板。Whisper 解决了两者存在的问题,转录效果更好,支持语言更多。此外,Whisper 是语言直译,所以你对字幕语言有基础认知的话,可以将语言与翻译文本匹配,可以进行语音学习。更重要的是,Whisper 是本地端应用,没有任何在线审查

    然而,与 Whisper 完美的英语转录效果相比,其对非英语视频的转录还有很大的提升空间,期待它的后续更新,也希望字幕组都使用上 Whisper,节省字幕转录时间,加快出片速度。

    本文于「少数派首发open in new window」。


    1. 如何自动翻译字幕:6 个好用的视频字幕翻译工具open in new window ↩︎

    2. For longer audio files (>10 minutes) not in English, Silero VAD (Voice Activity Detector)open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2023-01-26-whiteboard_gtd.html b/posts/2023-01-26-whiteboard_gtd.html index ab34e8970..69eb3807e 100644 --- a/posts/2023-01-26-whiteboard_gtd.html +++ b/posts/2023-01-26-whiteboard_gtd.html @@ -28,8 +28,8 @@ } 为什么我把日常任务放回墙上,而不是手机里? | LearnData-开源笔记 - - + + +
    跳至主要內容

    为什么我把日常任务放回墙上,而不是手机里?

    工具白板GTD约 1458 字大约 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 v3.1.2
    + diff --git a/posts/2023-02-27-chatgpt_shortcuts.html b/posts/2023-02-27-chatgpt_shortcuts.html index ae3e6de7b..b9e823c4c 100644 --- a/posts/2023-02-27-chatgpt_shortcuts.html +++ b/posts/2023-02-27-chatgpt_shortcuts.html @@ -28,8 +28,8 @@ } 为了帮你用好 ChatGPT,我做了一个「咒语库] | LearnData-开源笔记 - - + + +
    跳至主要內容

    为了帮你用好 ChatGPT,我做了一个「咒语库]

    工具AIChatGPT约 2577 字大约 9 分钟...

    最近,关于 ChatGPT 的讨论越来越多,但大多数人仅仅将其视为一款聊天机器人,并从猎奇的角度去测试其人工智能的回答。然而,ChatGPT 不仅仅是一个猎奇的 AI 玩具,未来它将会成为必备生产工具。ChatGPT 之类的 AI 工具将用它巨大的语言知识库,为我们创造更多的价值。

    ChatGPT 的回复质量取决于提示词(即 Prompt)。这通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。为了能让 ChatGPT 成为生产力工具,我花大量时间逐个研究提示词的规则和范例,如 ChatGPT Prompt Examplesopen in new windowAwesome ChatGPT Promptsopen in new windowLearn Promptingopen in new window 等。我筛选出了 163 个 Prompts(提示词),仅记录它们的功能而非内容,这就让我的笔记超过了 5000 字。提示词目录也变得越来越长,即使将浏览器全屏,也无法完整显示。起初,我制作提示词目录是为了方便自己,但每次需要查找提示词时,我不得不依靠记忆。这些笔记反而成为了负担,拖累 ChatGPT 的工作效率。

    为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcut 项目。即使是初学者,你只需打开 ChatGPT Shortcutopen in new window,复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!

    使用说明

    ChatGPT Shortcut 页面默认显示全部的提示词,页面分为标签区、搜索区和提示词展示区。

    标签筛选

    标签区按提示词的领域和功能进行划分,可根据不同场景和需求进行选择。与标签区右上方的「标签筛选规则切换」按钮配合使用,可进行多标签筛选。默认状态为 OR,即选中标签下的所有提示词。切换到 AND 后,将筛选出具备已选中的多个标签的提示词。

    关键词搜索

    关键词搜索范围包括提示词的标题、简介、内容和中文翻译。输入关键词后,提示词展示区将立即展示筛选出的内容。如果已选中标签,则关键词搜索仅限于标签筛选范围内。对于 PC 端,搜索框内容变化后,新的搜索结果会在 800 毫秒后显示。移动端则为即时刷新。

    展示区复制

    通过标签筛选和关键词搜索,点击卡片右上方的「复制」按钮即可获取提示词,将其粘贴到 ChatGPT 中,参考中文提示调整需求文本,即可得到指定领域的回复。如果提示词中的中文备注没有解释清楚,可以点击提示词的绿色标题查看来源网页。

    语言切换

    默认情况下,提示词内容会显示为英文。如果你想查看中文释义,可以点击提示词内容将其切换到中文,再次点击即可切回英文。请注意,语言切换只在文字上点击有效,点击空白区域无效。中文释义为机器翻译,仅供参考。

    中英文切换
    中英文切换

    如果想让提示词默认显示为中文,你可以点击标签区右上方的 CN 按钮。需要注意的是,即使切换到中文翻译,复制按钮也仅针对英文提示词复制。下方会有解释原因。

    热门排序

    现在页面会显示 Prompt 的使用次数,使用次数排名靠前的 Prompt 将会被标记为「favorite」。同时,Prompt 的标签排序也将以热力值为主。热力值将会定期更新。

    常见问题

    为什么提示词用英文?

    ChatGPT Shortcut 是为方便中文母语人士使用 ChatGPT 而创建的,但是提示词却全部是英文。这是因为相较于中文,ChatGPT 对英文的理解更为出色。即使是国内第一个对话式大型语言模型 MOSS,也承认 MOSS 的英文回答水平比中文高,建议使用英文。(MOSS 已不对外开放)

    使用中文提示词可能会得到不错的结果,但是当你再次输入相同的中文提示时,结果可能与之前大相径庭。因为 ChatGPT 对中文的理解每次都不同,所以建议大家在生产力型提示词的输入中使用英文提示词,以保证输出效果。此外,英文提示词带来的回复也很可能是英文的,你可以在提示词结尾添加 respond in Chinese,将回复指定为中文。

    每次都要输入 Promot?

    API 中可以将提示词设为「system prompt」,这样后续就不需要输入提示词了,ChatGPT 会按照 system prompt 来执行操作。

    在网页版 ChatGPT 中,如果没有切换主提示词,只需用引号将后续回复内容框选即可,这样就不需要每次都输入提示词。当回复内容不符合提示词要求时,说明 ChatGPT 已经忘记了提示词,此时需要重新输入提示词以唤醒它。另外,每个对话的链接都是唯一的,你可以将常用的对话保存为书签,以便日后使用。

    中文搜索延迟

    搜索功能基于 Docusaurus 的 showcase,存在 PC 端中文输入法焦点丢失问题。向 Docusaurus 反馈后,对方表示会尝试修复和 FWIW, you should not be using Chinese anyway, since the showcase is not localized。但问题始终没有解决。因此,我将搜索组件分为移动端和 PC 端两类。移动端搜索逻辑保持不变,而屏幕宽度阈值 768px 以上的 PC 端浏览引入 debounce 函数解决中文输入问题。但这在 PC 端产生两个问题:一是中文输入需在 800 毫秒内完成;二是 PC 端搜索刷新从即时变为 800 毫秒延迟。若你有更好的解决方案,欢迎提供反馈。

    输出虚假信息

    ChatGPT 虽然非常强大,但并不是万能的。有时它会输出虚假信息。例如,当我需要将上百条信息录入到 ChatGPT Shortcut 中时,我让 ChatGPT 按指定格式转换数据。但是在转换过程中,我发现其中一些信息被 ChatGPT 误写。例如,在文本中一条标签是 movie critic,而 ChatGPT 将其更改为 film critic。尽管这在文本中不会造成什么影响,但放在代码中会报错。因此,在使用 ChatGPT 时,务必检查其输出内容。

    提示词不好用

    所有提示词均来自互联网,会定期进行更新。虽然我测试过每一条提示词,但实际效果可能因需求而有所偏差。你可以参考页面和 ChatGPT Prompt Examplesopen in new window 进行调整。如果你发现任何错误、有创意的想法或有好的提示词,欢迎反馈和投稿open in new window

    如果你是进行摘要总结,可以使用 GPT 对原有回答进行再次修正,以提高回答的精度。此外,提示词不仅能用于工作生产,更重要的是帮助你开拓思路、发散思维,从多个角度考虑问题,并解决人们在思考时容易忽略的问题。

    为什么执着于 ChatGPT?

    家人看到我每天把大量时间花在 ChatGPT,实际上并不能理解。因为这看起来跟我的工作关系不大。ChatGPT 帮我节省的时间远少于我的投入,帮我写的代码和文章都需要大幅修改,而查找的资料也基本上只是基础知识,而对于具体的问题我还需要去专业网站进行查询。那么,ChatGPT 究竟有什么用呢?等它成熟了再去使用不好吗?

    但是,我们需要明确的是,使用 ChatGPT 等 AI 工具可以提高我们的工作效率和解放我们的时间,让我们可以更专注于创造性的工作和创新性的思考。比如,ChatGPT 在文章修订、语气转换、语音录入、代码解释、创意思维等方面已经成为我不可或缺的工具。虽然 ChatGPT 目前的功能和表现还有待提高和改进,但它毕竟是未来工具的一部分,是我们不断提高自己和适应未来的必要工具。我相信随着时间的推移,ChatGPT 的表现会越来越优秀,让我们的工作更高效,更具有创造性。

    最后

    目前,ChatGPT 已经有 1 亿用户,但这仅仅是 80 亿人口中很小的一部分。无论你身处哪个行业,你使用 ChatGPT 都代表着你在行业前沿。尽管你可能认为这看起来似乎与你的行业无关,但使用它就代表着你比别人更早地迈出了这一步,可以探索更多的可能性。

    我并不期待 ChatGPT Shortcut 成为完美的工具,而是希望它能为大家推开使用 AI 的一道门缝。我希望让更多人了解和使用 ChatGPT,摆脱对其聊天机器人的刻板印象,以提高工作效率。因为我相信,在未来,ChatGPT 和其他 AI 工具将扮演越来越重要的角色,成为我们生产力的强大工具。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2023-03-31-efficient_morning_5am_club.html b/posts/2023-03-31-efficient_morning_5am_club.html index a231b5cd8..711611aa7 100644 --- a/posts/2023-03-31-efficient_morning_5am_club.html +++ b/posts/2023-03-31-efficient_morning_5am_club.html @@ -28,8 +28,8 @@ } 从失眠到高效早晨:我的 5AM Club 计划分享 | LearnData-开源笔记 - - + + +

    下午的疲劳

    高效的学习工作也会带来较大的精神消耗。就像 @Dsmileyi 曾问我的:「会不会因为起来的早并且已经工作了一段时间,导致白天工作的时候感到疲惫,降低效率?」与早晨相比,下午的精力会减少不少。因此,我将 90% 的工作时间放在早上

    在过去,我工作时间超过 8 小时,从早上 9 点一直工作到晚上 9 点,但期间不断受到干扰,导致工作成果不多。现在,每天只有 4-6 小时的全力工作时间,但工作成果相当于之前三天的量。虽然下午效率降低了,但整体而言,这是值得的。

    值得一提的是,在新的作息时间中,休息和娱乐不再让我感到愧疚。到了下午,我会放松一下,可以做家务、锻炼或者娱乐,想做什么就做什么。而以前,如果我在白天工作时间内偷懒摸鱼,我会感到内疚,然后把这种负面情绪带到工作中,给自己的心理造成负担。

    图源:Storyset

    晚上十点睡觉

    如何在晚上十点入睡?这对于很多人来说是一个奢望,尤其是当你已经出现了失眠症状后,更加难以实现。一开始,为了能早睡,我得强迫自己在晚上八点上床,这样才能在晚上十点入睡。然而,绝大多数人都有着自己的工作,很难控制自己的上床时间。

    在执行 5AM Club 计划的过程中,我们无需过于强求精准的作息时间,也不要担心偶尔的早起失败。关键在于逐步养成这个习惯,从而提高生活质量和工作效率。如果你认为自己暂时做不到在晚上十点前入睡,那就将早上五点起床顺延到六点或七点,逐步调整你的生活习惯,直到养成早起的习惯。

    最后

    本文的心流部分设计参考了少数派的《心流管理魔方》栏目,而时间管理部分则受到了《吃掉那只青蛙》的启发。如果你感兴趣,建议完整阅读它们。

    我实施 5AM Club 计划一个月以来,生活和工作效率得到了显著提高。通过早起,我得到了宝贵的属于自己的时间块,用来处理那些对自己来说重要且长期能产生重大影响的任务。同时,我调整了作息时间,优化了睡眠质量。在工作时间安排上,采用番茄工作法,让我保持高效工作状态的同时,确保了充足的休息。不过,睡眠和个人的习惯/体质密切相关,夜型人请慎重执行,随便尝试可能会把自己弄得更混乱。

    虽然 5AM Club 并非人人都适用,但它确实帮助我从失眠问题中走出来,提高了工作和学习效率。我相信,只要你能找到适合自己的方法和节奏,你也可以通过早起和合理安排时间,实现从失眠到高效早晨的转变。希望我的 5AM Club 计划分享对你有所启发,祝你早晨愉快、充满活力!


    1. 研究发现睡眠时间低于六小时会影响学习成绩open in new window ↩︎

    2. 04 保持心流 - 心流管理魔方open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2023-09-05-virtual_positioning.html b/posts/2023-09-05-virtual_positioning.html index 276ffcd5f..e77f8a9d4 100644 --- a/posts/2023-09-05-virtual_positioning.html +++ b/posts/2023-09-05-virtual_positioning.html @@ -28,8 +28,8 @@ } 不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT | LearnData-开源笔记 - - + + +
    跳至主要內容

    不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT

    工具虚拟定位约 677 字大约 2 分钟...

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    虚拟定位

    1. 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

    2. 在模拟器中打开要修改定位的应用,点击应用的定位图标。

    3. 选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

    4. 更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

    常见问题

    无法虚拟定位

    如果你已经按照上述步骤进行设置,但仍然不能虚拟定位,这可能是由于模拟器没有正确获取位置信息。为了验证这一点,你可以在模拟器中的微信应用里,给好友发送实时位置分享,看是否能正确显示。

    手机修改定位

    我曾尝试在手机上使用如 fakegps 这样的工具来修改位置,但只有高德地图更改成功,其他都失败了。据了解,这可能与 Android 10 或更高版本的系统有关。如果你使用的是 Android 9 或更早版本的手机,你或许可以尝试使用旧版本的微信来更改定位。

    关于虚拟签到

    虽然企业微信、钉钉等打卡软件也可用此法签到,但请勿滥用。有记者曾在三家价格分别为 5 元、10 元、20 元的网店购买更改定位服务,结果发现这些商家仅是远程登录客户的微信账号,然后使用特定工具修改定位,操作流程与上文所述类似。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/2023-10-07-clone-voice.html b/posts/2023-10-07-clone-voice.html index e9abb8ebd..d56bd82b2 100644 --- a/posts/2023-10-07-clone-voice.html +++ b/posts/2023-10-07-clone-voice.html @@ -28,8 +28,8 @@ } 别再被同质化的内容淹没!用 AI 克隆技术打造你独特的声音品牌! | LearnData-开源笔记 - - + + +
  • 第 10 步:执行 python preprocess_v2.py --add_auxiliary_data True --languages C

  • 第 11 步:

    • 开始训练:python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs 5000 --drop_speaker_embed True
    • 如果训练过程中断,要继续训练,执行 python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs 10000 --drop_speaker_embed False --cont True
  • 文字生成语音

    微调完成后,将 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 识别结果修改为原文本后,生成的声音产生了显著变化,几乎听不出与原声音的相似性。我们只需要对那些发音明显错误的部分做出修改。例如,「假」和「甲」的发音相同,无需更改;「语」和「乙」之间的差异较大,但由于是个人发音的特点,也无需更改;对于「村」和「寸」这样声调不同的词汇,可以在检查录音后做出相应更改。

    语音克隆的「口音」问题

    这个示例是使用 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 v3.1.2
    + diff --git a/posts/2023-10-29-switch-firmware-updates.html b/posts/2023-10-29-switch-firmware-updates.html index 1db9a523b..b677bea90 100644 --- a/posts/2023-10-29-switch-firmware-updates.html +++ b/posts/2023-10-29-switch-firmware-updates.html @@ -28,8 +28,8 @@ } Switch 升级记录与资源汇编 | LearnData-开源笔记 - - + + +
    跳至主要內容

    Switch 升级记录与资源汇编

    工具games约 1854 字大约 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 v3.1.2
    + diff --git a/posts/2024-01-28-learndata-advanced.html b/posts/2024-01-28-learndata-advanced.html index cd459045c..f3ec9fc10 100644 --- a/posts/2024-01-28-learndata-advanced.html +++ b/posts/2024-01-28-learndata-advanced.html @@ -28,8 +28,8 @@ } LearnData 博客:高效知识管理和进阶应用技巧 | LearnData-开源笔记 - - + + +
    跳至主要內容

    LearnData 博客:高效知识管理和进阶应用技巧

    博客约 1855 字大约 6 分钟...

    本文是 LearnData 博客的进阶篇,基础搭建流程查看主页。

    自从我放弃了 Notion 等传统知识管理工具,转而尝试将博客转化为知识库open in new window以来,我发现不仅知识的复用率得到显著提升,文章的更新频率也有所增加。从 LearnData 的 GitHub 提交记录可以看出,仅在过去三周内,就进行了 11 次提交,并涉及了 47 个文件的更新。

    但随着使用频率的提升,我也逐渐发现了一些效率上的问题。接下来,我将进一步介绍关于知识搜索和管理方面的 LearnData 博客进阶经验。

    本地搜索与网页端搜索的权衡

    LearnData 开源笔记open in new window 的早期,只有 37 篇笔记和一些博客文章。当我开始将笔记主题化,用短篇形式记录具体知识点时,内容数量迅速增长,例如,关于 Docker 容器的部署笔记就超过了 20 篇。

    随着笔记量的增加,传统的全文本搜索方法开始显得力不从心,我越来越难找到需要的文章。因此,我转而采用了 LearnData 博客集成的 Algolia 和 SearchPro 这两款节点搜索工具进行文章的查询和管理。与 VS Code 的全文本搜索相比,节点搜索不仅提高了搜索效率,更使得大量文章的管理和定位变得更加便捷高效。

    左侧为 VS Code 本地搜索,右侧为网站搜索

    尽管我曾尝试利用 Algolia API 实现本地搜索功能,但由于过于复杂的程序结构和不尽如人意的效果,我最终决定专注于网站端的节点搜索,以此高效地定位所需知识点。

    网页查询与本地文件修改的融合

    虽然用网站搜索文章效率极高,但它引出了一个新问题:如何修改找到的网页内容?

    之前,我需要根据网页链接在本地逐一对照文件,才能进行修改,这一流程随着笔记数量的增长变得异常繁琐。我甚至尝试过将笔记同步到双链笔记工具如 Logseq、Obsidian 中进行管理,但这样做既背离了 LearnData 旨在简单、高效的初衷,同时也缺失了网页博客的分享特性,并容易导致文章结构混乱。

    最终,我采取了一种新的方法:通过脚本将网页路径直接转换为本地路径。这样一来,当我在网页端发现需要修改的内容时,只需运行脚本即可快速定位到本地文件,让网页查询与本地文件修改完美融合。

    LearnData 博客页面直接跳转到本地

    如果你安装了 Quicker,可以通过安装 博客定位本地open in new window 动作来实现这一功能。这个脚本不仅适用于 LearnData 项目,同样可以应用于其他静态博客。

    网址链接转换为本地路径的原理如下:

    1. 获取当前网页的网址。
    2. 替换网址中的固定域名 https://newzone.top/ 为空,并将网页路径的 / 转换为本地路径符号 \
    3. .html 为分界,取分割后列表的第一部分。
    4. 在文本开头添加本地项目路径 D:\Backup\Libraries\Documents\GitHub\LearnData\docs\,并在结尾添加 .md
    5. 为解决目录文档路径问题,将 \.md 替换为 \README.md

    VS Code 文件排序

    有时,我们可能需要在海量文章中定位最新的文件。VS Code 虽然默认按文件名排序,不支持自定义排序,但以下方法可以帮你实现按最新修改日期排序,优化你的文件管理效率:

    1. 通过设置修改排序

      • 使用快捷键 Ctrl+, 或通过菜单「文件」>「首选项」>「设置」进入设置。
      • 在设置中搜索 Explorer: Sort Order 并选择 modified 选项,即可使文件按最后修改日期降序排列。
      VS Code 文件排序设置
      VS Code 文件排序设置
    2. 使用 VS Code 扩展

    尽管社区早在 2017 年的 Explorer/Opened Editors Sortingopen in new window 讨论中提出了自定义排序的需求,但由于官方尚未采纳相关解决方案,我们仍需依赖这些小技巧来优化文件管理体验。

    主题笔记的引入

    LearnData 的另一大改变是引入了主题笔记的概念,它允许部分文章同时在博客中更新,并在特定领域的树状栏中展示,打破了传统主侧边栏的限制。

    以文章「飞书迁移记录」为例,它被放在 apps/tutorials/feishu 路径下,在侧边栏中被归类为应用笔记,而不仅仅是博客文章。通过在文章中加入 article 标签,文章内容既能在博客页面展示,也能出现在 RSS 订阅中。

    飞书迁移记录示例
    飞书迁移记录示例

    这种分类方式的优势在于,我可以将新文章有效地归类于树状侧边栏中。同时,article 标签下的文章按 data 排序,时间越新,文章越靠前。因此,只需为笔记添加创建时间 date 标签,文章便会同时出现在 https://newzone.top/article/https://newzone.top/blog.html 以及 RSS 地址 https://newzone.top/rss.xml 下,并且不会干扰原有的排序逻辑。

    结语

    随着 LearnData 博客的持续优化,改变了一些我对双链笔记的看法,它在海量笔记的管理方面优势明显。但我仍然认为,双链笔记并不适合知识库

    这是因为,在大多数情况下,笔记的积累变成了一种简单的堆砌过程,而不是一个持续的修改、整合和消化的过程。真正的知识管理不应该仅仅是对信息的收集和堆积。拿这篇文章来说,初稿早在 2023 年 12 月就已完成。但为了对外分享,我必须将那些只有我自己能理解的内容进行重构和规范化。正是在这个过程中,我对 LearnData 的思考变得更加清晰,并且想出了用脚本一键定位文章的新方法。如果这篇文章仅仅是我的私人笔记,它可能就会永远停留在初稿阶段,我也不会意识到进一步利用它的必要性。

    在今天这个双链笔记看似无所不能的时代,作为坚持博客形式的少数派,我的做法可能会被一些人视为不必要的复杂和折腾。然而,正是用博客管理知识库的方法,让我的个人效率得到了显著的提升。希望我的这些经验和思考,能为同样致力于高效知识管理的朋友们带来一些新的启示和帮助。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/posts/index.html b/posts/index.html index 303914ebb..b5a4aff32 100644 --- a/posts/index.html +++ b/posts/index.html @@ -28,8 +28,8 @@ } Posts | LearnData-开源笔记 - - + + +
    跳至主要內容

    Posts

    约 1 字小于 1 分钟...

    目录

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/rss.xml b/rss.xml index 96da00808..640562590 100644 --- a/rss.xml +++ b/rss.xml @@ -6,8 +6,8 @@ https://newzone.top/ 开源工具、效率方法、心理学探索的自我提升笔记,记录并输出一切能让自己提升的知识。 zh-CN - Sat, 10 Feb 2024 14:26:10 GMT - Sat, 10 Feb 2024 14:26:10 GMT + Thu, 22 Feb 2024 22:01:22 GMT + Thu, 22 Feb 2024 22:01:22 GMT @vuepress/plugin-feed https://validator.w3.org/feed/docs/rss2.html 博客 diff --git a/services/Docker.html b/services/Docker.html index d3ca3cf61..dc567e6dd 100644 --- a/services/Docker.html +++ b/services/Docker.html @@ -28,8 +28,8 @@ } Docker | LearnData-开源笔记 - - + + +

    在站点设置中,绑定你的本地域名 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 功能,宝塔面板也将停止,但不会影响已运行的网站。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/Huginn.html b/services/Huginn.html index 0bac88ae3..244dd825c 100644 --- a/services/Huginn.html +++ b/services/Huginn.html @@ -28,8 +28,8 @@ } Huginn | LearnData-开源笔记 - - + + +

    Freme Explore Agent - SPARQL-数据断点?

    Creates events Receives events Dry runs huginn_freme_enrichment_agentsopen in new window 使用 FREME APIs,其中含有多个 agents,具体查看上方链接。

    The FremeExploreAgent can retrieve description of a resource from a given endpoint. The endpoint can be SPARQL or Linked Data Fragments endpoint. FremeExploreAgent 可以检索给定端点的资源描述。端点可以是 SPARQL 或 Linked Data Fragments 端点。

    The Agent accepts all configuration options of the /e-link/explore endpoint as of September 2016, have a look at the offical documentationopen in new window if you need additional information.

    All Agent configuration options are interpolated using Liquidopen in new window in the context of the received event.

    base_url allows to customize the API server when hosting the FREME services elswhere.

    auth_token can be set to access private filters, datasets, templates or pipelines (depending on the agent).

    outformat requested RDF serialization format of the output (required), CSV is only supported when using a filter.

    resource a URI of the resource which should be described (required).

    endpoint a URL of the endpoint which should be used to retrieve info about the resource.

    endpoint_type the type of the endpoint (required).

    filter allows to post-process the results using a pre-configured SPARQL filter. Check the official documentationopen in new window for details.

    merge set to true to retain the received payload and update it with the extracted result

    result_key when present the emitted Event data will be nested inside the specified key


    Ftpsite Agent

    Creates events Receives events Emits file pointer

    Ftp Site Agent 检查 FTP 站点,并根据目录中新上载的文件创建事件。当接收到事件时,它会在配置的 FTP 服务器上创建文件。

    mode must be present and either read or write, in read mode the agent checks the FTP site for changed files, with write it writes received events to a file on the server.

    Universal options

    Specify a url that represents a directory of an FTP site to watch, and a list of patterns to match against file names.

    Login credentials can be included in url if authentication is required: ftp://username:password@ftp.example.com/path. Liquid formatting is supported as well: ftp://{% credential ftp_credentials %}@ftp.example.com/

    Optionally specify the encoding of the files you want to read/write in force_encoding, by default UTF-8 is used.

    Reading

    Only files with a last modification time later than the after value, if specifed, are emitted as event.

    Writing

    Specify the filename to use in filename, Liquid interpolation is possible to change the name per event.

    Use Liquidopen in new window templating in data to specify which part of the received event should be written.

    This agent only emits a ‘file pointer’, not the data inside the files, the following agents can consume the created events: CsvAgent, PostAgent, ReadFileAgent. Read more about the concept in the wikiopen in new window.


    1. ERROR 2002 (HY000)open in new window ↩︎

    2. rake export hangsopen in new window ↩︎

    3. Huginn failed to restart after installed node and systemdopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/NAS.html b/services/NAS.html index 28f35b7c0..2deeff691 100644 --- a/services/NAS.html +++ b/services/NAS.html @@ -28,8 +28,8 @@ } NAS | LearnData-开源笔记 - - + + +

    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]


    1. 群晖 NAS 使用 Emby+tMM 打造全平台观影畅爽体验(附下载地址)open in new window ↩︎

    2. 如何把群晖 NAS 上的套件搬到另外个硬盘上open in new window ↩︎

    3. 群晖 NAS 跨存储空间移动共享文件夹 (NAS 新增磁盘)open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/TTRSS.html b/services/TTRSS.html index b02ab4fb8..b011f7878 100644 --- a/services/TTRSS.html +++ b/services/TTRSS.html @@ -28,8 +28,8 @@ } Tiny Tiny RSS | LearnData-开源笔记 - - + + +

    请确保替换 ttrss_postgres 为 ttrss 数据库容器的实际名称,而 admin 则为欲重置密码的账户名称。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/alist.html b/services/dockers-on-nas/alist.html index 16e959a5d..f130a287e 100644 --- a/services/dockers-on-nas/alist.html +++ b/services/dockers-on-nas/alist.html @@ -28,8 +28,8 @@ } Alist:聚合网盘 | LearnData-开源笔记 - - + + +

    添加存储

    登录后,点击左侧菜单的「存储」,添加网盘。下方提供了添加驱动所需的几个必备参数说明。

    • 「驱动」表示网盘的挂载方式,例如选择阿里云盘时,请选择「阿里云盘 Open」。
    • 「挂载路径」相当于文件夹名称,你可以自由设置。我分享的是应用,所以挂载路径是 /apps
    • 「缓存过期时间」是存储的有效时间,默认为 30 分钟。如果你希望存储长期有效,可以将其修改为 0。
    • 「根文件夹 ID」指的是在分享网盘中特定文件夹的标识。若要分享整个网盘,请使用 root。
    • 「刷新令牌」是网盘的登录密钥,请按照 Alist 说明文档进行添加。

    元信息

    元信息可以为指定文件夹添加密码,防止网盘恶意访问/分享致帐号被冻结。元信息内的配置仅对访客生效。

    • 密码:访问此路径需要密码。
    • 写入:允许访客新建目录、新文件和上传文件。
    • 隐藏:此路径要隐藏的对象,每行一个正则表达式。
    • 说明:进入该路径时渲染的自述文件,支持 Markdown 内容或 Markdown 链接。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/cors-anywhere.html b/services/dockers-on-nas/cors-anywhere.html index fcadcf6b6..4307274c3 100644 --- a/services/dockers-on-nas/cors-anywhere.html +++ b/services/dockers-on-nas/cors-anywhere.html @@ -28,8 +28,8 @@ } CORS Anywhere:解锁跨域限制 | LearnData-开源笔记 - - + + +

    通过上述步骤,你可以快速部署并开始使用 CORS Anywhere,轻松解锁跨域访问的限制,使前端开发更加灵活和便捷。如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/deeplx.html b/services/dockers-on-nas/deeplx.html index 7f49209e2..53a567c95 100644 --- a/services/dockers-on-nas/deeplx.html +++ b/services/dockers-on-nas/deeplx.html @@ -28,8 +28,8 @@ } DeepLX - 免费翻译接口 | LearnData-开源笔记 - - + + +

    如果你已经注册了 DeepL 的免费接口,建议设置 AUTHKEY。这样,一旦遇到请求频率过快的情况,DeepLX 会自动使用官方的 AuthKey 进行请求,从而加快翻译速度,提高效率。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/docsify.html b/services/dockers-on-nas/docsify.html index dbe9124f6..1e6e68c3f 100644 --- a/services/dockers-on-nas/docsify.html +++ b/services/dockers-on-nas/docsify.html @@ -28,8 +28,8 @@ } Docsify:私密文件服务器 | LearnData-开源笔记 - - + + +

    这个 Docker 配置文件定义了一个服务 docsify

    • volumes 映射了本地的文档目录到容器内,使得容器可以访问并展示这些 Markdown 文件。
    • ports 将容器的 3000 端口映射到本地的 3310 端口,你可以通过访问本地的 3310 端口来查看文档。

    通过以上步骤,我们可以轻松地利用 Docsify 和 Docker 构建一个私密且高效的文件服务器。这不仅简化了我们的工作流程,还提高了文档管理的安全性和便捷性。无论是个人笔记、团队协作文件还是企业内部资料,利用这种方法,你都能享受到快速、安全且易于管理的文档服务。现在,尝试动手实践,为你的文档管理带来一场革新吧!

    如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/emby.html b/services/dockers-on-nas/emby.html index 046c8b35b..ddfba82f0 100644 --- a/services/dockers-on-nas/emby.html +++ b/services/dockers-on-nas/emby.html @@ -28,8 +28,8 @@ } Emby:家庭媒体中心 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/flare.html b/services/dockers-on-nas/flare.html index 202396d7b..612b918ce 100644 --- a/services/dockers-on-nas/flare.html +++ b/services/dockers-on-nas/flare.html @@ -28,8 +28,8 @@ } Flare:快速导航页 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/gitlab.html b/services/dockers-on-nas/gitlab.html index c4abf5b57..ba7964f8f 100644 --- a/services/dockers-on-nas/gitlab.html +++ b/services/dockers-on-nas/gitlab.html @@ -28,8 +28,8 @@ } GitLab:私有化版本控制 | LearnData-开源笔记 - - + + +

    初始配置

    SourceTree、GitHub Desktop 均支持管理 GitLab 项目,操作类似。注意,如果本地已经建好了项目,先不要在 GitLab 网页上建立任何数据,直接上传就好,否则容易报错。

    以下是命令行的初始配置步骤:

    1. 在 GitLab 上创建新仓库

      • 登录到您的 GitLab 实例。
      • 创建一个新的仓库(Project)。在仓库创建页面上,填写必要的信息,例如仓库名称、描述等。
    2. 在本地初始化 Git 仓库

      • 打开终端或命令提示符。
      • 导航到您的项目文件夹:cd 路径到您的项目文件夹
      • 初始化 Git 仓库:git init
      • 添加文件到仓库:git add . (这会添加所有文件,如果只想添加特定文件,可以用git add 文件名
    3. 配置 Git 仓库

      • 设置您的用户信息(如果之前没有设置的话):
        • git config --global user.name "您的名字"
        • git config --global user.email "您的邮箱"
      • 提交您的更改:git commit -m "首次提交"
    4. 将本地仓库关联到 GitLab

      • 获取您在 GitLab 上创建的仓库的 URL。这通常是http://您的NAS地址/用户名/仓库名.git
      • 在终端中关联 GitLab 仓库:git remote add origin 仓库URL
    5. 上传代码到 GitLab

      • 推送代码到 GitLab:git push -u origin master(或者如果您使用的是 main 分支,就是git push -u origin main
      • 初始推送会提示你输入账户密码。
    6. 后续更新

      • 以后当您进行了更多的更改并想要上传这些更改时,您只需要运行git add .git commit -m "更新信息"git push

    常用功能

    比较提交:先进入项目并选择“提交”。接着选择需要比较的提交版本,并点击右侧的“浏览文件”。然后点击顶部的“比较”按钮,接着点击中间的“交换”按钮,再点击“比较”。这样便可将所选提交版本与当前版本进行比较,查看整体修改内容。此功能适用于同一文件多次修改的情况,方便直接查看经过多次修改后,版本的整体变更情况。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/grampsjs.html b/services/dockers-on-nas/grampsjs.html index a2bab61ff..93557e45c 100644 --- a/services/dockers-on-nas/grampsjs.html +++ b/services/dockers-on-nas/grampsjs.html @@ -28,8 +28,8 @@ } Gramps.js:在线家谱 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/grocy.html b/services/dockers-on-nas/grocy.html index 8191721ed..564264d9c 100644 --- a/services/dockers-on-nas/grocy.html +++ b/services/dockers-on-nas/grocy.html @@ -28,8 +28,8 @@ } Grocy:家庭杂货管理 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/homarr.html b/services/dockers-on-nas/homarr.html index c6ce7cb65..d56a54570 100644 --- a/services/dockers-on-nas/homarr.html +++ b/services/dockers-on-nas/homarr.html @@ -28,8 +28,8 @@ } Homarr:本地导航 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/index.html b/services/dockers-on-nas/index.html index 49d74d640..2d3a44d72 100644 --- a/services/dockers-on-nas/index.html +++ b/services/dockers-on-nas/index.html @@ -28,8 +28,8 @@ } NAS 应用集合 | LearnData-开源笔记 - - + + +
    跳至主要內容

    NAS 应用集合

    约 838 字大约 3 分钟...

    网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。awesome-selfhostedopen in new window可查看多种自部署服务。而使用 docker-compose.yml 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 TTRSS docker-compose 的教程open in new window

    操作步骤如下:

    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 为实例,为了确保正常运行,我们可以临时为该文件夹授权“所有人”权限,但建议后续寻求更安全的权限管理策略。

    编号规则

    • 1-10:影视音乐类
    • 11-20:娱乐阅读类
    • 21-30:同步网盘
    • 31-40:文档管理
    • 41-70:空位
    • 71-80:未分类(默认)
    • 81-90: 自动化
    • 91-100:导航
    • 101+:后端
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/memos.html b/services/dockers-on-nas/memos.html index 4152f644b..06777c1c2 100644 --- a/services/dockers-on-nas/memos.html +++ b/services/dockers-on-nas/memos.html @@ -28,8 +28,8 @@ } Memos:碎片化记录 | LearnData-开源笔记 - - + + +

    如果你使用 Obsidian,还可以考虑使用其插件 Obsidian-Memosopen in new window,它与 Memos 功能类似,但笔记将保存在 Obsidian 中。你还可以使用 Memos Sync 插件将 memos 记录同步至 Obsidian。

    flomo 支持将所有笔记导出,并允许通过微信输入内容。flomo Pro 每日会随机选取 12 条符合条件的内容,让你过往的记录发挥更大的价值。

    然而,对于我个人而言,flomo 和 Memos 更适合碎片化记录,无需频繁回顾。除了记录心情类日记之外,有价值的信息可以以知识点的形式保存在思源笔记中,然后通过思源笔记的间隔重复闪卡功能来加强记忆。

    领域标签

    • Inbox(收件箱):我会将所有临时性的,还未消化的内容放置于此,定期来进行归档、整理或者删除。可以当做大脑的缓存,避免记录的时候纠结放在哪里。
    • Area(领域):日常你需要精进的「领域」,比如健康就是一个领域,而跑步则是项目;写作是一个领域,而写一篇公众号文章则是一个项目。
    • Project(项目):是指一个将要发生的独立事件,并且这个事件不是一次性就能完成的,至少需要多个动作才能完成。比如要写一本书,需要整理资料,罗列提纲,撰写内容,联系出版社。类似生活中还有组织一次旅游,录制一期播客等。在执行项目的相关资料
    • Resource(资源):永久笔记,一般来说是兴趣、主题、资产等内容。注意是自己消化过的内容,而非机械的收藏。
    • Marketplace 是最重要研究的领域
    • Sheep、Books 是最重要的资源(Sheep 是指人物,即羔羊)
    • 三醒吾身:日记
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/mt-photos.html b/services/dockers-on-nas/mt-photos.html index 9500bc6a0..52398a8d7 100644 --- a/services/dockers-on-nas/mt-photos.html +++ b/services/dockers-on-nas/mt-photos.html @@ -28,8 +28,8 @@ } MT Photos:分享家庭照片 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/n8n.html b/services/dockers-on-nas/n8n.html index 669343750..0049d7057 100644 --- a/services/dockers-on-nas/n8n.html +++ b/services/dockers-on-nas/n8n.html @@ -28,8 +28,8 @@ } n8n:工作流自动化 | LearnData-开源笔记 - - + + +

    N8N_HOSTN8N_EDITOR_BASE_URL 用于第三方 API 的回调访问。如果你启用了外网调用 n8n 的访问权限,建议开启 Two-factor authentication (2FA),以防止 API 信息泄露。不建议将 N8N_HOST 设为内部域名,否则在后续设置中可能会出现 Bad Request: bad webhook: An HTTPS URL must be provided for webhook 错误。

    节点介绍

    HTTP Request

    HTTP Requestopen in new window 节点允许你使用 REST API 发出 HTTP 请求,从任何应用程序或服务中查询数据。

    在使用过程中,如果遇到网页端连接不稳定的问题,可以在节点设置中的 On Error 选项选择 Continue,并在 Options 中添加超时选项,例如 Timeout 10000 ms。

    IF

    IFopen in new window 节点允许你根据比较操作有条件地分割工作流。注意,布尔值的 true 和 false 需要使用双重花括号 {{}} 包围。

    Github Trigger

    Github Trigger 节点可以通过在 Github 上设置 Webhook 来获得推送通知。

    如果遇到 Workflow could not be activated: A webhook with the identical URL probably exists already. Please delete it manually on Github! 的错误提示,通常是因为在仓库中存在多个相同的 Webhook 地址。你可以进入 repo 仓库,选择 Settings > Code and automation > Webhooks,手动删除重复的 Webhook 地址来解决这个问题。

    使用 Tips

    变量路径

    对于一些复杂的输入变量,你可以直接使用 n8n 自带的工具来复制路径。在 INPUT 区域选择 JSON,点击要选择的参数,然后点击 INPUT 右上角的复制按钮,选择 Copy Parameter Path

    其他操作记录

    Discord OAuth2

    Discord Applicationsopen in new window 中新建应用,然后在 OAuth2 > General > Redirects 中添加回调地址。

    接着,将 CLIENT ID 和 CLIENT SECRET 添加到 n8n 中即可。

    通过上述步骤,你可以灵活地使用 n8n 来构建自动化工作流,实现数据的聚合、管理和分析。希望这些信息能够帮助你高效地使用 n8n,使你的工作和生活更加自动化和便捷。如果你在使用过程中遇到任何问题或有更多的经验分享,请在评论区留言,我们可以一起讨论和解决。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/navidrome.html b/services/dockers-on-nas/navidrome.html index 5536c3e7b..015521a58 100644 --- a/services/dockers-on-nas/navidrome.html +++ b/services/dockers-on-nas/navidrome.html @@ -28,8 +28,8 @@ } Navidrome:开源音乐服务器 | LearnData-开源笔记 - - + + +

    不过,Navidrome 并不提供歌词下载功能。如果你需要下载内置的歌词,可以通过 MusicTagopen in new window 实现。

    对于播放器的选择,推荐使用国产的 音流open in new window 播放器。它当前正处于内测阶段,支持 iOS 和 Android 平台,能够显示下载的内置歌词。

    然而,Navidrome 也有其局限性:它不支持显示多行歌词,搜索功能以专辑为单位,这使得直接搜索特定歌曲可能不会总是准确。另外,Windows 客户端不支持显示歌词功能。因此,我转向使用 Emby 来管理 PC 端音乐。然而,Emby 流媒体播放时偶尔会断播,与之对比,Navidrome 在音乐流播放方面更稳定,并且更适合用于移动端 API。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/nextcloud.html b/services/dockers-on-nas/nextcloud.html index 6f06e880c..135ba6f13 100644 --- a/services/dockers-on-nas/nextcloud.html +++ b/services/dockers-on-nas/nextcloud.html @@ -28,8 +28,8 @@ } Nextcloud:私有云盘 | LearnData-开源笔记 - - + + +

    外部存储

    有时你的文档在其他位置,可以在应用中添加插件 External storage support,这样可以直接编辑 FTP、WebDAV、Nextcloud、SFTP、Amazone S3 或其他对象存储等外部文件。

    安装插件后,进入「管理」>「外部存储」设置目录。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/paperless-ngx.html b/services/dockers-on-nas/paperless-ngx.html index 24d34159f..1090fb37b 100644 --- a/services/dockers-on-nas/paperless-ngx.html +++ b/services/dockers-on-nas/paperless-ngx.html @@ -28,8 +28,8 @@ } Paperless-ngx:全文管理文档 | LearnData-开源笔记 - - + + +

    依次输入 username、email、password。如果出现提示密码较弱,输入 y 继续。之后这些都可以在后台再修改。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/qbittorrent.html b/services/dockers-on-nas/qbittorrent.html index 5405d020a..d9ee63710 100644 --- a/services/dockers-on-nas/qbittorrent.html +++ b/services/dockers-on-nas/qbittorrent.html @@ -28,8 +28,8 @@ } qBittorrent:种子&磁力下载 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/qinglong.html b/services/dockers-on-nas/qinglong.html index 04df1b2cc..51f05705e 100644 --- a/services/dockers-on-nas/qinglong.html +++ b/services/dockers-on-nas/qinglong.html @@ -28,8 +28,8 @@ } 青龙面板:定时任务管理 | LearnData-开源笔记 - - + + +

    配置注意:

    • 在运行脚本之前,请确保已安装所有必要的依赖。
    • 定期运行:0 0 7 * * ? 表示每天 7 点触发。其中第一个数字代表秒,第二个数字代表分钟,第三个数字代表小时,第四个数字代表每月的日期,第五个数字代表月份,第六个数字代表每周的星期几。这些数字之间使用空格分隔。要表示不限制的时间段,可以使用 * 号,要表示定期运行的时间段,可以使用 ? 替代,要表示间隔运行的时间段,可以使用 */数字 替代。如果需要在同一个时间位上设置多个选项,可以使用逗号 , 连接,如果需要设置一个时间段,可以使用短划线 - 连接。对于每天的运行,可以在日期位或星期位使用 ?

    京东 COOKIES

    1. 在无痕模式下打开 https://m.jd.com/open in new window 网站,并登录账户。
    2. 使用浏览器的开发者工具(F12)进入调试模式,选择 "network"(网络)。
    3. 点击页面右上方的「直接访问」,开发者工具中出现 log.gif 开头的记录。点击它,选择「Headers」>「Request headers」,复制出其中的 Cookie 内容。
    4. 在复制出的 Cookies 中查找 pt_key=XXX;pt_pin=xxx; 字段,并将其保存为变量 JD_COOKIE。如果找不到 log.gif 或 getinfo 的记录,则可尝试随意添加一个商品到购物车。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/reader.html b/services/dockers-on-nas/reader.html index d5d95d03d..e696a4937 100644 --- a/services/dockers-on-nas/reader.html +++ b/services/dockers-on-nas/reader.html @@ -28,8 +28,8 @@ } Reader:小说/书籍阅读 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/reverse-proxy.html b/services/dockers-on-nas/reverse-proxy.html index 1a6eeaa99..a8fe7a807 100644 --- a/services/dockers-on-nas/reverse-proxy.html +++ b/services/dockers-on-nas/reverse-proxy.html @@ -28,8 +28,8 @@ } 反向代理:Nginx Proxy Manager | LearnData-开源笔记 - - + + +

    通过上述配置,无论是 Nginx Proxy Manager 还是 Caddy,你都可以轻松地部署和管理你的反向代理服务。这将为你的网络环境提供更高的数据安全性和便捷的访问管理。希望这些信息能帮助你更好地利用反向代理技术,为你的网络环境带来显著的改善。如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/srs-stack.html b/services/dockers-on-nas/srs-stack.html index e6d1f4841..2f6452b98 100644 --- a/services/dockers-on-nas/srs-stack.html +++ b/services/dockers-on-nas/srs-stack.html @@ -28,8 +28,8 @@ } SRS Stack:直播推流 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/stirling-pdf.html b/services/dockers-on-nas/stirling-pdf.html index 1c33481f3..50b42cf78 100644 --- a/services/dockers-on-nas/stirling-pdf.html +++ b/services/dockers-on-nas/stirling-pdf.html @@ -28,8 +28,8 @@ } Stirling-PDF:开源 PDF 处理工具 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/sun-panel.html b/services/dockers-on-nas/sun-panel.html index 6db851013..7f6c8cba4 100644 --- a/services/dockers-on-nas/sun-panel.html +++ b/services/dockers-on-nas/sun-panel.html @@ -28,8 +28,8 @@ } Sun-Panel:简化导航页 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/syncthing.html b/services/dockers-on-nas/syncthing.html index 10f669096..cfdd28380 100644 --- a/services/dockers-on-nas/syncthing.html +++ b/services/dockers-on-nas/syncthing.html @@ -28,8 +28,8 @@ } Syncthing:私人同步盘 | LearnData-开源笔记 - - + + +

    由于我对文件实时同步的需求较小,也不需要版本控制,目前并未使用 Syncthing。相反,我将本地文件按天同步到 NAS,并随后在 Nextcloud 上进行在线文档编辑。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/tachidesk.html b/services/dockers-on-nas/tachidesk.html index e05c78daa..d71ba4f6b 100644 --- a/services/dockers-on-nas/tachidesk.html +++ b/services/dockers-on-nas/tachidesk.html @@ -28,8 +28,8 @@ } Tachidesk:漫画聚合阅读器 | LearnData-开源笔记 - - + + +

    你可以将本地的漫画资源导入到路径 /volume1/docker/tachidesk/local。请注意,导入的漫画需要按文件夹分类,并确保图片按文件名排序。

    点击左侧的 Extensions 按钮,点右上角的 Enabled Languages 选项,将其设置为中文源,然后会在页面底部发现中文漫画源。安装好漫画源扩展后,点击左侧的 Sources 按钮,然后选择不同来源的 BROWSE,即可浏览对应源的在线漫画。在线漫画会下载到 /volume1/docker/tachidesk/downloads 目录。安装各类在线漫画源扩展,以便进行在线搜索、阅读和下载漫画。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/uptime-kuma.html b/services/dockers-on-nas/uptime-kuma.html index e6f4092cc..1f5c49540 100644 --- a/services/dockers-on-nas/uptime-kuma.html +++ b/services/dockers-on-nas/uptime-kuma.html @@ -28,8 +28,8 @@ } Uptime Kuma:轻量运维监控 | LearnData-开源笔记 - - + + +
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/dockers-on-nas/xiaoya.html b/services/dockers-on-nas/xiaoya.html index 3fa40c942..0ee7d3f90 100644 --- a/services/dockers-on-nas/xiaoya.html +++ b/services/dockers-on-nas/xiaoya.html @@ -28,8 +28,8 @@ } 小雅 alist:影视资源合集 | LearnData-开源笔记 - - + + +

    通过上述的配置和步骤,你可以方便地集成和管理来自阿里云盘的丰富资源,并通过 Emby 享受高质量的播放体验。同时,也请留意资源管理和下载的相关问题,并根据实际情况进行调整和优化。希望你能通过小雅 Alist 和 Emby 打造出一个既私密又高效的个人影音库。

    如果你在部署或使用过程中遇到任何问题,欢迎在评论区留言交流,我们可以一起探讨解决方案。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/services/index.html b/services/index.html index f348b8474..43461c829 100644 --- a/services/index.html +++ b/services/index.html @@ -28,8 +28,8 @@ } Services | LearnData-开源笔记 - - + + +
    跳至主要內容

    Services

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/sitemap.xml b/sitemap.xml index 6831dc3f8..34d17c52d 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,3 +1,3 @@ -https://newzone.top/DailyRoutine.html2023-09-08T03:33:22.000Zdailyhttps://newzone.top/Fitness.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/2024-01-29T12:26:51.000Zdailyhttps://newzone.top/blog.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/intro.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2017-04-18-wechat_multi_open.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2017-04-22-rss_feed43_feedex.html2023-05-16T08:12:45.000Zdailyhttps://newzone.top/posts/2017-07-28-office_2016_installer_error.html2022-08-12T16:23:39.000Zdailyhttps://newzone.top/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html2022-11-04T15:29:05.000Zdailyhttps://newzone.top/posts/2017-09-02-forced_shutdown.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/posts/2017-09-03-smb_lan_sharing.html2022-07-25T04:29:03.000Zdailyhttps://newzone.top/posts/2017-10-18-light_cat_e8-c-epon_admin.html2023-01-13T16:05:48.000Zdailyhttps://newzone.top/posts/2017-10-18-light_cat_port_forwarding.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2018-01-19-forget_the_cdn.html2022-07-24T17:51:16.000Zdailyhttps://newzone.top/posts/2018-01-31-hire_a_robot.html2022-07-24T17:51:16.000Zdailyhttps://newzone.top/posts/2018-03-06-no_more_dinner.html2022-07-25T04:29:03.000Zdailyhttps://newzone.top/posts/2018-04-30-baota_deploy_vps.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-01-jekyll_blog_on_github_pages.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-02-jekyll_blog_on_vps.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2018-05-03-jekyll_blog_autodeploy.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-04-audition_cut_mp3.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-15-aria2_a_new_download_tool.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2018-05-24-airtable_noob.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-06-08-baizhuo_gp1700.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-06-10-koolproxy_https.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-06-19-iptv_direckly.html2023-10-11T02:31:57.000Zdailyhttps://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2018-12-28-voice_input_try.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/posts/2019-03-31-openvpn_back_to_home.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2019-04-01-rsshub_noob.html2023-08-09T21:57:45.000Zdailyhttps://newzone.top/posts/2019-08-26-scrcpy_screen_projection.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/posts/2019-10-04-fake_aka_hospital_skin_care_products.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-03-25-rsshub_on_vps.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-09-13-wifi_speed_up.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-09-22-uefi_asus_board.html2022-11-06T15:33:23.000Zdailyhttps://newzone.top/posts/2020-10-25-dpc_watchdog_violation.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-11-01-gym_equipment_throw_away.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-11-27-rime_input.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2020-12-17-weight_log.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2021-01-02-keepass_the_real_lastpassword.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/posts/2021-01-27-blog_jekyll_to_wordpress.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2021-05-31-principles_criticism_and_self-criticism.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html2023-11-12T02:07:50.000Zdailyhttps://newzone.top/posts/2022-01-23-wechat_lucky_money_cover.html2023-05-16T08:12:45.000Zdailyhttps://newzone.top/posts/2022-02-19-microsoft_store_fixed.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/posts/2022-03-09-lenovo_black_card_member.html2022-08-08T15:51:33.000Zdailyhttps://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html2023-04-21T09:30:54.000Zdailyhttps://newzone.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html2024-01-13T07:49:15.000Zdailyhttps://newzone.top/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-04-21-uivision_rpa.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-06-07-blog_md_to_wordpress.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-08-10-new_stuff_shaping_machine.html2023-10-27T19:12:11.000Zdailyhttps://newzone.top/posts/2022-08-22-learndata_blog_to_knowledge_management.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/posts/2022-09-07-extreme_branding_thinking_with_mate50.html2023-10-27T19:12:11.000Zdailyhttps://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-11-18-whisper_ai_subtitles.html2023-10-11T02:31:57.000Zdailyhttps://newzone.top/posts/2023-01-26-whiteboard_gtd.html2023-10-22T11:48:34.000Zdailyhttps://newzone.top/posts/2023-02-27-chatgpt_shortcuts.html2023-05-15T03:06:36.000Zdailyhttps://newzone.top/posts/2023-03-31-efficient_morning_5am_club.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2023-09-05-virtual_positioning.html2023-09-04T22:50:34.000Zdailyhttps://newzone.top/posts/2023-10-07-clone-voice.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/posts/2023-10-29-switch-firmware-updates.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/posts/2024-01-28-learndata-advanced.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/code/AutoHotkey.html2023-11-06T02:43:02.000Zdailyhttps://newzone.top/code/Electron.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/code/HTML.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/code/Javascript.html2023-02-16T19:51:25.000Zdailyhttps://newzone.top/code/Markdown.html2023-04-10T12:29:37.000Zdailyhttps://newzone.top/code/Python.html2023-05-16T08:12:45.000Zdailyhttps://newzone.top/code/2023-12-30T11:57:46.000Zdailyhttps://newzone.top/code/Regex.html2022-08-26T16:15:37.000Zdailyhttps://newzone.top/code/Vue.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/apps/Applist.html2024-01-23T10:09:14.000Zdailyhttps://newzone.top/apps/ChatGPT.html2023-12-11T07:26:19.000Zdailyhttps://newzone.top/apps/Chrome.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/apps/design.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/apps/toolbox.html2023-12-30T11:57:46.000Zdailyhttps://newzone.top/deploy/CloudServices.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/deploy/Cloudflare.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/deploy/DNS.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/deploy/GitHub.html2023-12-08T04:08:55.000Zdailyhttps://newzone.top/deploy/MySQL.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/deploy/Static.html2023-08-09T21:57:45.000Zdailyhttps://newzone.top/deploy/VPS.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/family/Coupon.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/family/Diet.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/family/HomeAutomation.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/family/Life.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/family/Maintenance.html2023-12-19T06:51:15.000Zdailyhttps://newzone.top/family/Medical.html2022-09-29T14:53:05.000Zdailyhttps://newzone.top/family/Shoppinglist.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/services/Docker.html2023-12-05T12:24:10.000Zdailyhttps://newzone.top/services/Huginn.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/services/NAS.html2024-01-23T10:09:14.000Zdailyhttps://newzone.top/services/TTRSS.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/web/Comments.html2023-07-19T22:15:16.000Zdailyhttps://newzone.top/web/VuePress.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/web/docsify.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/windows/NewSystem.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/windows/faq.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/windows/screen.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/apps/devdocs/json-translate.html2024-01-02T14:41:20.000Zdailyhttps://newzone.top/apps/livestreaming/0_live_equipments.html2023-11-06T02:43:02.000Zdailyhttps://newzone.top/apps/livestreaming/1_obs_basic.html2023-12-30T11:57:46.000Zdailyhttps://newzone.top/apps/livestreaming/2_obs_streamfx.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/apps/livestreaming/3_obs_plugins.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/apps/livestreaming/4_live_effects.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/apps/livestreaming/5_live_platforms.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/apps/livestreaming/6_live_positioning.html2023-01-12T21:27:08.000Zdailyhttps://newzone.top/apps/tutorials/QTTabBar.html2024-01-15T19:49:14.000Zdailyhttps://newzone.top/apps/tutorials/feishu.html2024-01-15T19:49:14.000Zdailyhttps://newzone.top/apps/tutorials/logseq.html2023-12-11T07:26:19.000Zdailyhttps://newzone.top/apps/tutorials/obsidian.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/apps/tutorials/power-automate.html2024-01-15T19:49:14.000Zdailyhttps://newzone.top/apps/tutorials/vscode.html2024-01-23T10:09:14.000Zdailyhttps://newzone.top/family/baby/2023-12-18T04:53:57.000Zdailyhttps://newzone.top/family/baby/birthing.html2023-09-16T01:30:53.000Zdailyhttps://newzone.top/family/baby/newborn.html2023-10-06T19:17:35.000Zdailyhttps://newzone.top/family/baby/take-kids-out.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/services/dockers-on-nas/2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/alist.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/cors-anywhere.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/deeplx.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/docsify.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/emby.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/flare.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/gitlab.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/services/dockers-on-nas/grampsjs.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/grocy.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/homarr.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/memos.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/mt-photos.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/n8n.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/navidrome.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/nextcloud.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/paperless-ngx.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/qbittorrent.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/qinglong.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/reader.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/reverse-proxy.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/srs-stack.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/stirling-pdf.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/sun-panel.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/syncthing.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/tachidesk.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/uptime-kuma.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/xiaoya.html2024-01-30T12:19:47.000Zdaily \ No newline at end of file +https://newzone.top/DailyRoutine.html2023-09-08T03:33:22.000Zdailyhttps://newzone.top/Fitness.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/2024-01-29T12:26:51.000Zdailyhttps://newzone.top/blog.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/intro.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/apps/Applist.html2024-01-23T10:09:14.000Zdailyhttps://newzone.top/apps/ChatGPT.html2023-12-11T07:26:19.000Zdailyhttps://newzone.top/apps/Chrome.html2024-02-22T21:57:47.000Zdailyhttps://newzone.top/apps/design.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/apps/toolbox.html2023-12-30T11:57:46.000Zdailyhttps://newzone.top/code/AutoHotkey.html2023-11-06T02:43:02.000Zdailyhttps://newzone.top/code/Electron.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/code/HTML.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/code/Javascript.html2023-02-16T19:51:25.000Zdailyhttps://newzone.top/code/Markdown.html2023-04-10T12:29:37.000Zdailyhttps://newzone.top/code/Python.html2023-05-16T08:12:45.000Zdailyhttps://newzone.top/code/2023-12-30T11:57:46.000Zdailyhttps://newzone.top/code/Regex.html2022-08-26T16:15:37.000Zdailyhttps://newzone.top/code/Vue.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2017-04-18-wechat_multi_open.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2017-04-22-rss_feed43_feedex.html2023-05-16T08:12:45.000Zdailyhttps://newzone.top/posts/2017-07-28-office_2016_installer_error.html2022-08-12T16:23:39.000Zdailyhttps://newzone.top/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html2022-11-04T15:29:05.000Zdailyhttps://newzone.top/posts/2017-09-02-forced_shutdown.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/posts/2017-09-03-smb_lan_sharing.html2022-07-25T04:29:03.000Zdailyhttps://newzone.top/posts/2017-10-18-light_cat_e8-c-epon_admin.html2023-01-13T16:05:48.000Zdailyhttps://newzone.top/posts/2017-10-18-light_cat_port_forwarding.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2018-01-19-forget_the_cdn.html2022-07-24T17:51:16.000Zdailyhttps://newzone.top/posts/2018-01-31-hire_a_robot.html2022-07-24T17:51:16.000Zdailyhttps://newzone.top/posts/2018-03-06-no_more_dinner.html2022-07-25T04:29:03.000Zdailyhttps://newzone.top/posts/2018-04-30-baota_deploy_vps.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-01-jekyll_blog_on_github_pages.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-02-jekyll_blog_on_vps.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2018-05-03-jekyll_blog_autodeploy.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-04-audition_cut_mp3.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-05-15-aria2_a_new_download_tool.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2018-05-24-airtable_noob.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-06-08-baizhuo_gp1700.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-06-10-koolproxy_https.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2018-06-19-iptv_direckly.html2023-10-11T02:31:57.000Zdailyhttps://newzone.top/posts/2018-10-07-huginn_scraping_any_website.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2018-12-28-voice_input_try.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/posts/2019-03-31-openvpn_back_to_home.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2019-04-01-rsshub_noob.html2023-08-09T21:57:45.000Zdailyhttps://newzone.top/posts/2019-08-26-scrcpy_screen_projection.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/posts/2019-10-04-fake_aka_hospital_skin_care_products.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-03-25-rsshub_on_vps.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-09-13-wifi_speed_up.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-09-22-uefi_asus_board.html2022-11-06T15:33:23.000Zdailyhttps://newzone.top/posts/2020-10-25-dpc_watchdog_violation.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-11-01-gym_equipment_throw_away.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2020-11-27-rime_input.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/posts/2020-12-17-weight_log.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2021-01-02-keepass_the_real_lastpassword.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/posts/2021-01-27-blog_jekyll_to_wordpress.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2021-05-31-principles_criticism_and_self-criticism.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html2023-11-12T02:07:50.000Zdailyhttps://newzone.top/posts/2022-01-23-wechat_lucky_money_cover.html2023-05-16T08:12:45.000Zdailyhttps://newzone.top/posts/2022-02-19-microsoft_store_fixed.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/posts/2022-03-09-lenovo_black_card_member.html2022-08-08T15:51:33.000Zdailyhttps://newzone.top/posts/2022-03-17-rss_persistent_link_collection.html2023-04-21T09:30:54.000Zdailyhttps://newzone.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html2024-01-13T07:49:15.000Zdailyhttps://newzone.top/posts/2022-04-20-survivorship_bias_in_shanghai_2022.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-04-21-uivision_rpa.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/posts/2022-05-22-surveillance_video_for_myself.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-06-07-blog_md_to_wordpress.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-08-10-new_stuff_shaping_machine.html2023-10-27T19:12:11.000Zdailyhttps://newzone.top/posts/2022-08-22-learndata_blog_to_knowledge_management.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-09-05-stable_diffusion_ai_painting.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/posts/2022-09-07-extreme_branding_thinking_with_mate50.html2023-10-27T19:12:11.000Zdailyhttps://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2022-11-18-whisper_ai_subtitles.html2023-10-11T02:31:57.000Zdailyhttps://newzone.top/posts/2023-01-26-whiteboard_gtd.html2023-10-22T11:48:34.000Zdailyhttps://newzone.top/posts/2023-02-27-chatgpt_shortcuts.html2023-05-15T03:06:36.000Zdailyhttps://newzone.top/posts/2023-03-31-efficient_morning_5am_club.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/posts/2023-09-05-virtual_positioning.html2023-09-04T22:50:34.000Zdailyhttps://newzone.top/posts/2023-10-07-clone-voice.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/posts/2023-10-29-switch-firmware-updates.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/posts/2024-01-28-learndata-advanced.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/deploy/CloudServices.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/deploy/Cloudflare.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/deploy/DNS.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/deploy/GitHub.html2023-12-08T04:08:55.000Zdailyhttps://newzone.top/deploy/MySQL.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/deploy/Static.html2023-08-09T21:57:45.000Zdailyhttps://newzone.top/deploy/VPS.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/family/Coupon.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/family/Diet.html2023-12-18T04:53:57.000Zdailyhttps://newzone.top/family/HomeAutomation.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/family/Life.html2023-08-05T23:04:54.000Zdailyhttps://newzone.top/family/Maintenance.html2023-12-19T06:51:15.000Zdailyhttps://newzone.top/family/Medical.html2022-09-29T14:53:05.000Zdailyhttps://newzone.top/family/Shoppinglist.html2024-02-06T13:15:26.000Zdailyhttps://newzone.top/services/Docker.html2023-12-05T12:24:10.000Zdailyhttps://newzone.top/services/Huginn.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/services/NAS.html2024-01-23T10:09:14.000Zdailyhttps://newzone.top/services/TTRSS.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/web/Comments.html2024-02-22T21:57:47.000Zdailyhttps://newzone.top/web/VuePress.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/web/docsify.html2023-01-23T14:11:29.000Zdailyhttps://newzone.top/windows/NewSystem.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/windows/faq.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/windows/screen.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/apps/devdocs/json-translate.html2024-01-02T14:41:20.000Zdailyhttps://newzone.top/apps/livestreaming/0_live_equipments.html2023-11-06T02:43:02.000Zdailyhttps://newzone.top/apps/livestreaming/1_obs_basic.html2023-12-30T11:57:46.000Zdailyhttps://newzone.top/apps/livestreaming/2_obs_streamfx.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/apps/livestreaming/3_obs_plugins.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/apps/livestreaming/4_live_effects.html2024-01-11T21:11:02.000Zdailyhttps://newzone.top/apps/livestreaming/5_live_platforms.html2023-04-10T07:06:18.000Zdailyhttps://newzone.top/apps/livestreaming/6_live_positioning.html2023-01-12T21:27:08.000Zdailyhttps://newzone.top/apps/tutorials/QTTabBar.html2024-01-15T19:49:14.000Zdailyhttps://newzone.top/apps/tutorials/feishu.html2024-01-15T19:49:14.000Zdailyhttps://newzone.top/apps/tutorials/logseq.html2023-12-11T07:26:19.000Zdailyhttps://newzone.top/apps/tutorials/obsidian.html2023-11-29T01:58:17.000Zdailyhttps://newzone.top/apps/tutorials/power-automate.html2024-01-15T19:49:14.000Zdailyhttps://newzone.top/apps/tutorials/vscode.html2024-01-23T10:09:14.000Zdailyhttps://newzone.top/family/baby/2023-12-18T04:53:57.000Zdailyhttps://newzone.top/family/baby/birthing.html2023-09-16T01:30:53.000Zdailyhttps://newzone.top/family/baby/hospital.html2024-02-22T21:57:47.000Zdailyhttps://newzone.top/family/baby/newborn.html2023-10-06T19:17:35.000Zdailyhttps://newzone.top/family/baby/take-kids-out.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/services/dockers-on-nas/2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/alist.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/cors-anywhere.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/deeplx.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/docsify.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/emby.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/flare.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/gitlab.html2024-01-29T12:26:51.000Zdailyhttps://newzone.top/services/dockers-on-nas/grampsjs.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/grocy.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/homarr.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/memos.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/mt-photos.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/n8n.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/navidrome.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/nextcloud.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/paperless-ngx.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/qbittorrent.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/qinglong.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/reader.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/reverse-proxy.html2024-01-30T12:19:47.000Zdailyhttps://newzone.top/services/dockers-on-nas/srs-stack.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/stirling-pdf.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/sun-panel.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/syncthing.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/tachidesk.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/uptime-kuma.html2024-01-15T19:15:29.000Zdailyhttps://newzone.top/services/dockers-on-nas/xiaoya.html2024-01-30T12:19:47.000Zdaily \ No newline at end of file diff --git a/star/index.html b/star/index.html index 4328f57dc..b97bd93c9 100644 --- a/star/index.html +++ b/star/index.html @@ -28,8 +28,8 @@ } 星标 | LearnData-开源笔记 - - + + + diff --git a/tag/ai/index.html b/tag/ai/index.html index 8484228f8..796f230cb 100644 --- a/tag/ai/index.html +++ b/tag/ai/index.html @@ -28,8 +28,8 @@ } 标签: AI | LearnData-开源笔记 - - + + + diff --git a/tag/airtable/index.html b/tag/airtable/index.html index 8d9cde6f0..eda21bed3 100644 --- a/tag/airtable/index.html +++ b/tag/airtable/index.html @@ -28,8 +28,8 @@ } 标签: Airtable | LearnData-开源笔记 - - + + + diff --git a/tag/aria2/index.html b/tag/aria2/index.html index 6eb258557..0ea054958 100644 --- a/tag/aria2/index.html +++ b/tag/aria2/index.html @@ -28,8 +28,8 @@ } 标签: Aria2 | LearnData-开源笔记 - - + + + diff --git a/tag/audition/index.html b/tag/audition/index.html index 2a09a3227..1efff31dd 100644 --- a/tag/audition/index.html +++ b/tag/audition/index.html @@ -28,8 +28,8 @@ } 标签: Audition | LearnData-开源笔记 - - + + + diff --git a/tag/blog/index.html b/tag/blog/index.html index 70e776fe3..825ddc212 100644 --- a/tag/blog/index.html +++ b/tag/blog/index.html @@ -28,8 +28,8 @@ } 标签: blog | LearnData-开源笔记 - - + + + diff --git a/tag/cdn/index.html b/tag/cdn/index.html index 144a85ed3..72c60e1e3 100644 --- a/tag/cdn/index.html +++ b/tag/cdn/index.html @@ -28,8 +28,8 @@ } 标签: CDN | LearnData-开源笔记 - - + + + diff --git a/tag/chatgpt/index.html b/tag/chatgpt/index.html index 22186b670..e1511bece 100644 --- a/tag/chatgpt/index.html +++ b/tag/chatgpt/index.html @@ -28,8 +28,8 @@ } 标签: ChatGPT | LearnData-开源笔记 - - + + + diff --git a/tag/docker/index.html b/tag/docker/index.html index 2f6de133d..5203937cb 100644 --- a/tag/docker/index.html +++ b/tag/docker/index.html @@ -28,8 +28,8 @@ } 标签: Docker | LearnData-开源笔记 - - + + + diff --git a/tag/feed43/index.html b/tag/feed43/index.html index 78f9c3a69..605b51c96 100644 --- a/tag/feed43/index.html +++ b/tag/feed43/index.html @@ -28,8 +28,8 @@ } 标签: Feed43 | LearnData-开源笔记 - - + + + diff --git a/tag/feedex/index.html b/tag/feedex/index.html index 2f80ff5bd..fcced5fa3 100644 --- a/tag/feedex/index.html +++ b/tag/feedex/index.html @@ -28,8 +28,8 @@ } 标签: FeedEx | LearnData-开源笔记 - - + + + diff --git a/tag/games/index.html b/tag/games/index.html index ff4de79da..a902f8244 100644 --- a/tag/games/index.html +++ b/tag/games/index.html @@ -28,8 +28,8 @@ } 标签: games | LearnData-开源笔记 - - + + + diff --git a/tag/github/index.html b/tag/github/index.html index 55cac643f..d74016531 100644 --- a/tag/github/index.html +++ b/tag/github/index.html @@ -28,8 +28,8 @@ } 标签: github | LearnData-开源笔记 - - + + + diff --git a/tag/gp1700/index.html b/tag/gp1700/index.html index 335337313..fb897dfaf 100644 --- a/tag/gp1700/index.html +++ b/tag/gp1700/index.html @@ -28,8 +28,8 @@ } 标签: GP1700 | LearnData-开源笔记 - - + + + diff --git a/tag/gtd/index.html b/tag/gtd/index.html index 5c5d20084..9ecbc1752 100644 --- a/tag/gtd/index.html +++ b/tag/gtd/index.html @@ -28,8 +28,8 @@ } 标签: GTD | LearnData-开源笔记 - - + + + diff --git a/tag/huginn/index.html b/tag/huginn/index.html index 2b6a9e91d..1b6ea2eb0 100644 --- a/tag/huginn/index.html +++ b/tag/huginn/index.html @@ -28,8 +28,8 @@ } 标签: Huginn | LearnData-开源笔记 - - + + + diff --git a/tag/index.html b/tag/index.html index 9223907da..1ddc2e4b3 100644 --- a/tag/index.html +++ b/tag/index.html @@ -28,8 +28,8 @@ } 标签 | LearnData-开源笔记 - - + + + diff --git a/tag/iptv/index.html b/tag/iptv/index.html index 9931b1b42..0ea76cd65 100644 --- a/tag/iptv/index.html +++ b/tag/iptv/index.html @@ -28,8 +28,8 @@ } 标签: IPTV | LearnData-开源笔记 - - + + + diff --git a/tag/jekyll/index.html b/tag/jekyll/index.html index 32a178c54..b249aec66 100644 --- a/tag/jekyll/index.html +++ b/tag/jekyll/index.html @@ -28,8 +28,8 @@ } 标签: Jekyll | LearnData-开源笔记 - - + + + diff --git a/tag/keepass/index.html b/tag/keepass/index.html index f791875da..3ad8ba1bb 100644 --- a/tag/keepass/index.html +++ b/tag/keepass/index.html @@ -28,8 +28,8 @@ } 标签: KeePass | LearnData-开源笔记 - - + + + diff --git a/tag/koolproxy/index.html b/tag/koolproxy/index.html index 084f2dd76..231d19c4f 100644 --- a/tag/koolproxy/index.html +++ b/tag/koolproxy/index.html @@ -28,8 +28,8 @@ } 标签: koolproxy | LearnData-开源笔记 - - + + + diff --git a/tag/microsoft-store/index.html b/tag/microsoft-store/index.html index 998a64a0f..41147f4a2 100644 --- a/tag/microsoft-store/index.html +++ b/tag/microsoft-store/index.html @@ -28,8 +28,8 @@ } 标签: Microsoft store | LearnData-开源笔记 - - + + + diff --git a/tag/nas/index.html b/tag/nas/index.html index c36726215..56c0d2822 100644 --- a/tag/nas/index.html +++ b/tag/nas/index.html @@ -28,8 +28,8 @@ } 标签: nas | LearnData-开源笔记 - - + + + diff --git a/tag/obs/index.html b/tag/obs/index.html index 07e2999d5..e7a9e5e1a 100644 --- a/tag/obs/index.html +++ b/tag/obs/index.html @@ -28,8 +28,8 @@ } 标签: OBS | LearnData-开源笔记 - - + + + diff --git a/tag/office/index.html b/tag/office/index.html index e3fedb972..a84ceaece 100644 --- a/tag/office/index.html +++ b/tag/office/index.html @@ -28,8 +28,8 @@ } 标签: office | LearnData-开源笔记 - - + + + diff --git a/tag/onenote/index.html b/tag/onenote/index.html index eb2022016..8084c4de0 100644 --- a/tag/onenote/index.html +++ b/tag/onenote/index.html @@ -28,8 +28,8 @@ } 标签: OneNote | LearnData-开源笔记 - - + + + diff --git a/tag/openvpn/index.html b/tag/openvpn/index.html index 6569bfcd6..21532f7ca 100644 --- a/tag/openvpn/index.html +++ b/tag/openvpn/index.html @@ -28,8 +28,8 @@ } 标签: OpenVPN | LearnData-开源笔记 - - + + + diff --git a/tag/rpa/index.html b/tag/rpa/index.html index 48f1b1ce2..3a486a993 100644 --- a/tag/rpa/index.html +++ b/tag/rpa/index.html @@ -28,8 +28,8 @@ } 标签: RPA | LearnData-开源笔记 - - + + + diff --git a/tag/rss/index.html b/tag/rss/index.html index 55f5a9f0a..91168225f 100644 --- a/tag/rss/index.html +++ b/tag/rss/index.html @@ -28,8 +28,8 @@ } 标签: rss | LearnData-开源笔记 - - + + + diff --git a/tag/rsshub/index.html b/tag/rsshub/index.html index 2520f367c..91bd27579 100644 --- a/tag/rsshub/index.html +++ b/tag/rsshub/index.html @@ -28,8 +28,8 @@ } 标签: RSSHub | LearnData-开源笔记 - - + + + diff --git a/tag/scrcpy/index.html b/tag/scrcpy/index.html index dd2dd9410..6843418b5 100644 --- a/tag/scrcpy/index.html +++ b/tag/scrcpy/index.html @@ -28,8 +28,8 @@ } 标签: scrcpy | LearnData-开源笔记 - - + + + diff --git a/tag/smb/index.html b/tag/smb/index.html index 781c80e13..0052c409d 100644 --- a/tag/smb/index.html +++ b/tag/smb/index.html @@ -28,8 +28,8 @@ } 标签: smb | LearnData-开源笔记 - - + + + diff --git a/tag/stable-diffusion/index.html b/tag/stable-diffusion/index.html index d1b7eb8a8..20e69eb22 100644 --- a/tag/stable-diffusion/index.html +++ b/tag/stable-diffusion/index.html @@ -28,8 +28,8 @@ } 标签: Stable Diffusion | LearnData-开源笔记 - - + + + diff --git a/tag/travis-ci/index.html b/tag/travis-ci/index.html index 7c3a42efb..8f72cd1e3 100644 --- a/tag/travis-ci/index.html +++ b/tag/travis-ci/index.html @@ -28,8 +28,8 @@ } 标签: Travis CI | LearnData-开源笔记 - - + + + diff --git a/tag/ui.vision/index.html b/tag/ui.vision/index.html index dfbe10096..3d8944076 100644 --- a/tag/ui.vision/index.html +++ b/tag/ui.vision/index.html @@ -28,8 +28,8 @@ } 标签: UI.Vision | LearnData-开源笔记 - - + + + diff --git a/tag/vits/index.html b/tag/vits/index.html index aa91aed30..09266988d 100644 --- a/tag/vits/index.html +++ b/tag/vits/index.html @@ -28,8 +28,8 @@ } 标签: VITS | LearnData-开源笔记 - - + + + diff --git a/tag/vuepress/index.html b/tag/vuepress/index.html index e48179e61..579e40888 100644 --- a/tag/vuepress/index.html +++ b/tag/vuepress/index.html @@ -28,8 +28,8 @@ } 标签: VuePress | LearnData-开源笔记 - - + + + diff --git a/tag/whisper/index.html b/tag/whisper/index.html index 1cfe2b461..ffff89fb2 100644 --- a/tag/whisper/index.html +++ b/tag/whisper/index.html @@ -28,8 +28,8 @@ } 标签: Whisper | LearnData-开源笔记 - - + + + diff --git a/tag/wifi/index.html b/tag/wifi/index.html index 7c00d7e02..bdc795de5 100644 --- a/tag/wifi/index.html +++ b/tag/wifi/index.html @@ -28,8 +28,8 @@ } 标签: WIFI | LearnData-开源笔记 - - + + + diff --git a/tag/winget/index.html b/tag/winget/index.html index b19e44860..454263cd8 100644 --- a/tag/winget/index.html +++ b/tag/winget/index.html @@ -28,8 +28,8 @@ } 标签: winget | LearnData-开源笔记 - - + + + diff --git a/tag/winstall/index.html b/tag/winstall/index.html index cf8ace581..142b2b4f3 100644 --- a/tag/winstall/index.html +++ b/tag/winstall/index.html @@ -28,8 +28,8 @@ } 标签: winstall | LearnData-开源笔记 - - + + + diff --git a/tag/wordpress/index.html b/tag/wordpress/index.html index 9c9786ebc..ade13db92 100644 --- a/tag/wordpress/index.html +++ b/tag/wordpress/index.html @@ -28,8 +28,8 @@ } 标签: WordPress | LearnData-开源笔记 - - + + + diff --git "a/tag/\344\270\273\346\235\277/index.html" "b/tag/\344\270\273\346\235\277/index.html" index 4aed50d31..b995aaea4 100644 --- "a/tag/\344\270\273\346\235\277/index.html" +++ "b/tag/\344\270\273\346\235\277/index.html" @@ -28,8 +28,8 @@ } 标签: 主板 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\201\245\350\272\253\345\231\250\346\235\220/index.html" "b/tag/\345\201\245\350\272\253\345\231\250\346\235\220/index.html" index acae64aed..4a0d21de7 100644 --- "a/tag/\345\201\245\350\272\253\345\231\250\346\235\220/index.html" +++ "b/tag/\345\201\245\350\272\253\345\231\250\346\235\220/index.html" @@ -28,8 +28,8 @@ } 标签: 健身器材 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\205\211\347\214\253/index.html" "b/tag/\345\205\211\347\214\253/index.html" index 6c72fb496..e0a20b5e4 100644 --- "a/tag/\345\205\211\347\214\253/index.html" +++ "b/tag/\345\205\211\347\214\253/index.html" @@ -28,8 +28,8 @@ } 标签: 光猫 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\205\263\346\234\272/index.html" "b/tag/\345\205\263\346\234\272/index.html" index 233f1ac69..7d9dc59aa 100644 --- "a/tag/\345\205\263\346\234\272/index.html" +++ "b/tag/\345\205\263\346\234\272/index.html" @@ -28,8 +28,8 @@ } 标签: 关机 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\206\205\347\275\221\347\251\277\351\200\217/index.html" "b/tag/\345\206\205\347\275\221\347\251\277\351\200\217/index.html" index bbea603e3..5f4cea870 100644 --- "a/tag/\345\206\205\347\275\221\347\251\277\351\200\217/index.html" +++ "b/tag/\345\206\205\347\275\221\347\251\277\351\200\217/index.html" @@ -28,8 +28,8 @@ } 标签: 内网穿透 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\207\217\350\202\245/index.html" "b/tag/\345\207\217\350\202\245/index.html" index 2ee9b4355..cd1572afc 100644 --- "a/tag/\345\207\217\350\202\245/index.html" +++ "b/tag/\345\207\217\350\202\245/index.html" @@ -28,8 +28,8 @@ } 标签: 减肥 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\214\226\345\246\206\345\223\201/index.html" "b/tag/\345\214\226\345\246\206\345\223\201/index.html" index 27fe2f8f1..cf96caae5 100644 --- "a/tag/\345\214\226\345\246\206\345\223\201/index.html" +++ "b/tag/\345\214\226\345\246\206\345\223\201/index.html" @@ -28,8 +28,8 @@ } 标签: 化妆品 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\216\237\345\210\231/index.html" "b/tag/\345\216\237\345\210\231/index.html" index f68dc5855..362e90618 100644 --- "a/tag/\345\216\237\345\210\231/index.html" +++ "b/tag/\345\216\237\345\210\231/index.html" @@ -28,8 +28,8 @@ } 标签: 原则 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\243\260\351\237\263\345\205\213\351\232\206/index.html" "b/tag/\345\243\260\351\237\263\345\205\213\351\232\206/index.html" index 1d1659a38..845899906 100644 --- "a/tag/\345\243\260\351\237\263\345\205\213\351\232\206/index.html" +++ "b/tag/\345\243\260\351\237\263\345\205\213\351\232\206/index.html" @@ -28,8 +28,8 @@ } 标签: 声音克隆 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\252\222\344\275\223/index.html" "b/tag/\345\252\222\344\275\223/index.html" index b27e6b718..884152965 100644 --- "a/tag/\345\252\222\344\275\223/index.html" +++ "b/tag/\345\252\222\344\275\223/index.html" @@ -28,8 +28,8 @@ } 标签: 媒体 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\255\227\345\271\225/index.html" "b/tag/\345\255\227\345\271\225/index.html" index a35a7b4f2..fd07a0678 100644 --- "a/tag/\345\255\227\345\271\225/index.html" +++ "b/tag/\345\255\227\345\271\225/index.html" @@ -28,8 +28,8 @@ } 标签: 字幕 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\256\235\345\241\224\351\235\242\346\235\277/index.html" "b/tag/\345\256\235\345\241\224\351\235\242\346\235\277/index.html" index 6c2018e14..d73e2a527 100644 --- "a/tag/\345\256\235\345\241\224\351\235\242\346\235\277/index.html" +++ "b/tag/\345\256\235\345\241\224\351\235\242\346\235\277/index.html" @@ -28,8 +28,8 @@ } 标签: 宝塔面板 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\260\217\347\213\274\346\257\253/index.html" "b/tag/\345\260\217\347\213\274\346\257\253/index.html" index a7915ce22..f5d0f0986 100644 --- "a/tag/\345\260\217\347\213\274\346\257\253/index.html" +++ "b/tag/\345\260\217\347\213\274\346\257\253/index.html" @@ -28,8 +28,8 @@ } 标签: 小狼毫 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\267\245\344\275\234\346\265\201/index.html" "b/tag/\345\267\245\344\275\234\346\265\201/index.html" index 9e3721f6a..85a4f7317 100644 --- "a/tag/\345\267\245\344\275\234\346\265\201/index.html" +++ "b/tag/\345\267\245\344\275\234\346\265\201/index.html" @@ -28,8 +28,8 @@ } 标签: 工作流 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\271\270\345\255\230\350\200\205\345\201\217\345\267\256/index.html" "b/tag/\345\271\270\345\255\230\350\200\205\345\201\217\345\267\256/index.html" index a48e06db3..b7ba69b02 100644 --- "a/tag/\345\271\270\345\255\230\350\200\205\345\201\217\345\267\256/index.html" +++ "b/tag/\345\271\270\345\255\230\350\200\205\345\201\217\345\267\256/index.html" @@ -28,8 +28,8 @@ } 标签: 幸存者偏差 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\273\272\347\253\231/index.html" "b/tag/\345\273\272\347\253\231/index.html" index 7fbf85023..3b1d42116 100644 --- "a/tag/\345\273\272\347\253\231/index.html" +++ "b/tag/\345\273\272\347\253\231/index.html" @@ -28,8 +28,8 @@ } 标签: 建站 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\275\225\345\261\217/index.html" "b/tag/\345\275\225\345\261\217/index.html" index a001832a4..90b45a41c 100644 --- "a/tag/\345\275\225\345\261\217/index.html" +++ "b/tag/\345\275\225\345\261\217/index.html" @@ -28,8 +28,8 @@ } 标签: 录屏 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\276\256\344\277\241/index.html" "b/tag/\345\276\256\344\277\241/index.html" index c4b4c138a..bc6b08987 100644 --- "a/tag/\345\276\256\344\277\241/index.html" +++ "b/tag/\345\276\256\344\277\241/index.html" @@ -28,8 +28,8 @@ } 标签: 微信 | LearnData-开源笔记 - - + + + diff --git "a/tag/\345\276\256\344\277\241\347\272\242\345\214\205/index.html" "b/tag/\345\276\256\344\277\241\347\272\242\345\214\205/index.html" index 39e204088..2659539f6 100644 --- "a/tag/\345\276\256\344\277\241\347\272\242\345\214\205/index.html" +++ "b/tag/\345\276\256\344\277\241\347\272\242\345\214\205/index.html" @@ -28,8 +28,8 @@ } 标签: 微信红包 | LearnData-开源笔记 - - + + + diff --git "a/tag/\346\211\271\350\257\204\344\270\216\350\207\252\346\210\221\346\211\271\350\257\204/index.html" "b/tag/\346\211\271\350\257\204\344\270\216\350\207\252\346\210\221\346\211\271\350\257\204/index.html" index 27eb856ae..e84177198 100644 --- "a/tag/\346\211\271\350\257\204\344\270\216\350\207\252\346\210\221\346\211\271\350\257\204/index.html" +++ "b/tag/\346\211\271\350\257\204\344\270\216\350\207\252\346\210\221\346\211\271\350\257\204/index.html" @@ -28,8 +28,8 @@ } 标签: 批评与自我批评 | LearnData-开源笔记 - - + + + diff --git "a/tag/\346\212\225\345\261\217/index.html" "b/tag/\346\212\225\345\261\217/index.html" index 3e42d857d..257eedeea 100644 --- "a/tag/\346\212\225\345\261\217/index.html" +++ "b/tag/\346\212\225\345\261\217/index.html" @@ -28,8 +28,8 @@ } 标签: 投屏 | LearnData-开源笔记 - - + + + diff --git "a/tag/\346\226\255\350\210\215\347\246\273/index.html" "b/tag/\346\226\255\350\210\215\347\246\273/index.html" index 0808d0a59..3f96bd85d 100644 --- "a/tag/\346\226\255\350\210\215\347\246\273/index.html" +++ "b/tag/\346\226\255\350\210\215\347\246\273/index.html" @@ -28,8 +28,8 @@ } 标签: 断舍离 | LearnData-开源笔记 - - + + + diff --git "a/tag/\346\227\266\351\227\264/index.html" "b/tag/\346\227\266\351\227\264/index.html" index 8701caa1b..d5d0b91cd 100644 --- "a/tag/\346\227\266\351\227\264/index.html" +++ "b/tag/\346\227\266\351\227\264/index.html" @@ -28,8 +28,8 @@ } 标签: 时间 | LearnData-开源笔记 - - + + + diff --git "a/tag/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266/index.html" "b/tag/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266/index.html" index f25b337f5..d6700e253 100644 --- "a/tag/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266/index.html" +++ "b/tag/\346\265\217\350\247\210\345\231\250\346\217\222\344\273\266/index.html" @@ -28,8 +28,8 @@ } 标签: 浏览器插件 | LearnData-开源笔记 - - + + + diff --git "a/tag/\347\226\253\346\203\205/index.html" "b/tag/\347\226\253\346\203\205/index.html" index b1634c238..353503d04 100644 --- "a/tag/\347\226\253\346\203\205/index.html" +++ "b/tag/\347\226\253\346\203\205/index.html" @@ -28,8 +28,8 @@ } 标签: 疫情 | LearnData-开源笔记 - - + + + diff --git "a/tag/\347\231\275\346\235\277/index.html" "b/tag/\347\231\275\346\235\277/index.html" index f416cdf1f..db8ad4c5c 100644 --- "a/tag/\347\231\275\346\235\277/index.html" +++ "b/tag/\347\231\275\346\235\277/index.html" @@ -28,8 +28,8 @@ } 标签: 白板 | LearnData-开源笔记 - - + + + diff --git "a/tag/\347\233\264\346\222\255/index.html" "b/tag/\347\233\264\346\222\255/index.html" index 4e962c084..c8b2488cb 100644 --- "a/tag/\347\233\264\346\222\255/index.html" +++ "b/tag/\347\233\264\346\222\255/index.html" @@ -28,8 +28,8 @@ } 标签: 直播 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\201\224\346\203\263/index.html" "b/tag/\350\201\224\346\203\263/index.html" index fa59c2e2f..97e441b8f 100644 --- "a/tag/\350\201\224\346\203\263/index.html" +++ "b/tag/\350\201\224\346\203\263/index.html" @@ -28,8 +28,8 @@ } 标签: 联想 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\207\252\346\210\221\347\256\241\347\220\206/index.html" "b/tag/\350\207\252\346\210\221\347\256\241\347\220\206/index.html" index 4f3482ee6..f26fbc611 100644 --- "a/tag/\350\207\252\346\210\221\347\256\241\347\220\206/index.html" +++ "b/tag/\350\207\252\346\210\221\347\256\241\347\220\206/index.html" @@ -28,8 +28,8 @@ } 标签: 自我管理 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\223\235\345\261\217/index.html" "b/tag/\350\223\235\345\261\217/index.html" index 8cf640e58..dbd13fbb1 100644 --- "a/tag/\350\223\235\345\261\217/index.html" +++ "b/tag/\350\223\235\345\261\217/index.html" @@ -28,8 +28,8 @@ } 标签: 蓝屏 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\231\232\346\213\237\345\256\232\344\275\215/index.html" "b/tag/\350\231\232\346\213\237\345\256\232\344\275\215/index.html" index ee6c23fbe..b991eeb59 100644 --- "a/tag/\350\231\232\346\213\237\345\256\232\344\275\215/index.html" +++ "b/tag/\350\231\232\346\213\237\345\256\232\344\275\215/index.html" @@ -28,8 +28,8 @@ } 标签: 虚拟定位 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\257\255\351\237\263\350\276\223\345\205\245/index.html" "b/tag/\350\257\255\351\237\263\350\276\223\345\205\245/index.html" index 5897124c7..797e85834 100644 --- "a/tag/\350\257\255\351\237\263\350\276\223\345\205\245/index.html" +++ "b/tag/\350\257\255\351\237\263\350\276\223\345\205\245/index.html" @@ -28,8 +28,8 @@ } 标签: 语音输入 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\276\223\345\205\245\346\263\225/index.html" "b/tag/\350\276\223\345\205\245\346\263\225/index.html" index bcd6337e7..9ebc122d7 100644 --- "a/tag/\350\276\223\345\205\245\346\263\225/index.html" +++ "b/tag/\350\276\223\345\205\245\346\263\225/index.html" @@ -28,8 +28,8 @@ } 标签: 输入法 | LearnData-开源笔记 - - + + + diff --git "a/tag/\350\277\205\351\233\267/index.html" "b/tag/\350\277\205\351\233\267/index.html" index 24f5a933b..3fd7aa173 100644 --- "a/tag/\350\277\205\351\233\267/index.html" +++ "b/tag/\350\277\205\351\233\267/index.html" @@ -28,8 +28,8 @@ } 标签: 迅雷 | LearnData-开源笔记 - - + + + diff --git "a/tag/\351\237\263\351\242\221/index.html" "b/tag/\351\237\263\351\242\221/index.html" index 05648e422..70e0e8613 100644 --- "a/tag/\351\237\263\351\242\221/index.html" +++ "b/tag/\351\237\263\351\242\221/index.html" @@ -28,8 +28,8 @@ } 标签: 音频 | LearnData-开源笔记 - - + + + diff --git a/timeline/index.html b/timeline/index.html index 0b0a82a0d..c278c0723 100644 --- a/timeline/index.html +++ b/timeline/index.html @@ -28,8 +28,8 @@ } 时间轴 | LearnData-开源笔记 - - + + + diff --git a/web/Comments.html b/web/Comments.html index fe3b166bc..1cc500b28 100644 --- a/web/Comments.html +++ b/web/Comments.html @@ -27,9 +27,9 @@ document.documentElement.setAttribute("data-theme", "dark"); } - 评论插件 | LearnData-开源笔记 - - + 评论插件 | LearnData-开源笔记 + + +

    Gitalk 缺点:

    • 每次有新页面时,都需要登录 github 初始化评论区。
    • 域名不能改变,Homepage URL 和 Authorization callback URL 需与你的 Gitalk 页面一致,否则页面会报错,提示初始化,无法登录 github。

    1. Waline 多数据库服务支持open in new window ↩︎

    2. 超 Nice 的评论组件 —— Gitalkopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/web/VuePress.html b/web/VuePress.html index cbb76a8d2..6f4dd98c0 100644 --- a/web/VuePress.html +++ b/web/VuePress.html @@ -28,8 +28,8 @@ } VuePress | LearnData-开源笔记 - - + + +

    自定义主题


    1. chainWebpack 常用配置方式open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/web/docsify.html b/web/docsify.html index c2b29f982..7785479c5 100644 --- a/web/docsify.html +++ b/web/docsify.html @@ -28,8 +28,8 @@ } docsify | LearnData-开源笔记 - - + + +

    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 文件。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/web/index.html b/web/index.html index fc741afd9..ba7c1f970 100644 --- a/web/index.html +++ b/web/index.html @@ -28,8 +28,8 @@ } Web | LearnData-开源笔记 - - + + +
    跳至主要內容

    Web

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/windows/NewSystem.html b/windows/NewSystem.html index 586f7def4..8b0cf0ffc 100644 --- a/windows/NewSystem.html +++ b/windows/NewSystem.html @@ -28,8 +28,8 @@ } 系统重装 | LearnData-开源笔记 - - + + +

    对更新党来说,在后续应用管理可以搭配 winget upgrade 来检查是否有应用更新。也可以使用 winget upgrade --all 来静默升级所有支持 winget 的程序。

    手动安装应用

    应用配置

    • 绿色开机:开机脚本、Keepass、Ditto。开机脚本用 管理员权限启动脚本
    • 配置:RIME、Picgo、Wonderpen、Eagle。
    • Everything 注册右键搜索当前路径;右键清除。
      • win+r, regedit 打开注册表,打开路径 HKEY_CLASSES_ROOT\Directory\Background\shell
      • 新建项,命名随意 ( 即右键菜单显示的文字 ) -「Everything 搜索当前路径」。
      • 右键再次新建项,命名 Command,打开修改右侧默认值为 "D: \Everything\Everything.exe" -path "."
    • 按键更改:
      • Powertoys:将 insert 键改为 backspace。
      • Logitech.Options:将键盘的计算器改为「上一个桌面」;右键菜单改为「下一个桌面」。

    旧资料(已弃用)

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/windows/faq.html b/windows/faq.html index 8d58e4857..0ad856d5d 100644 --- a/windows/faq.html +++ b/windows/faq.html @@ -28,8 +28,8 @@ } Windows | LearnData-开源笔记 - - + + +
    1. Windows 变量路径open in new window ↩︎

    2. Unable to Install ClickOnce Application due to Security Settingsopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/windows/index.html b/windows/index.html index 8508e092e..63d0e56a0 100644 --- a/windows/index.html +++ b/windows/index.html @@ -28,8 +28,8 @@ } Windows | LearnData-开源笔记 - - + + +
    跳至主要內容

    Windows

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    + diff --git a/windows/screen.html b/windows/screen.html index caed1fef8..f70ed1a63 100644 --- a/windows/screen.html +++ b/windows/screen.html @@ -28,8 +28,8 @@ } 显示屏 | LearnData-开源笔记 - - + + +
    跳至主要內容

    显示屏

    约 776 字大约 3 分钟...

    如果你使用多台显示器,屏幕校色是必备流程,这可以确保多屏幕的颜色统一。

    此外,HDR 和低蓝光模式会影响颜色校准,为了保持颜色一致,不建议启用 HDR 和低蓝光模式。

    HDR

    标准色彩与 HDR 不兼容,选择 HDR 就意味着放弃标准色彩,两者是相相矛盾的。

    HDR 代表高动态范围,是一种显示技术,旨在提供更广泛的对比度、更高的亮度水平和更丰富的颜色。启用 HDR 通常会导致对比度、亮度和颜色范围的调整。这可能导致不同屏幕之间的视觉差异,因为每个屏幕可能具有不同的硬件和校准设置。

    低蓝光模式

    低蓝光模式会降低蓝光,通常会导致显示器呈现较暖的颜色。这可能使一些颜色看起来稍微发黄或偏红。

    校色仪器

    校色仪器的唯一功能是校色,不同仪器的主要差异在于校色的精准度,主要品牌有红蜘蛛和爱色丽。校色仪器的使用频率较低,建议租赁使用。以下说明来自租赁卖家,真实性尚未确定。

    • 目前一般选用主流的红蜘蛛 X,支持当下主流屏幕技术,对色彩要求高的用的较多。如果屏幕支持 HDR(HDR1000 以上),建议选择红蜘蛛 X2 Ultra 或爱色丽 Plus。多屏幕颜色统一使用红蜘蛛。
    • 红蜘蛛具有全面的屏幕分析能力,可以测量色域等,而爱色丽没有这些功能。红蜘蛛 X 旗舰版大幅提高了校色精准度,X 系列支持 P3 色域。红蜘蛛 X2 Ultra 增加了对 HDR 的支持。多屏幕颜色统一使用红蜘蛛。红 X2 系列是 2023 年,红 X 是 2019 年,红 5+ 红 5 是 2015 年。
    • 如果是在开启低蓝光模式下进行校色,色彩无法被正确校准。

    校色配置

    在校正之后,请确保备份 ICC 校色配置文件。在 Windows 系统下,校色文件位于 C:\Windows\System32\spool\drivers\color。可以通过系统自带的「颜色管理」设置进行操作。

    1. 下拉选择要设置的显示器,勾选「使用我对此设备的设置」,添加校色文件并将其设为默认配置文件。

      图示
      图示
    2. 点击上方的「高级」选项卡,勾选「使用 Windows 显示器校准」。

      图示
      图示
    3. 如果已经勾选了「使用 Windows 显示器校准」,则无需进行操作。如果无法勾选,处于灰色状态,可以进入左下角的「更改系统默认值」,进入后在同一位置打上勾(无需更改其他设置)。

    完成以上操作后,即可卸载 Spyder 等校色软件。即使系统重装,也只需导入校色配置即可获得标准颜色。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.1.2
    +