Reading view

There are new articles available, click to refresh the page.

copyparty – 免费开源强大的文件服务器,支持 WebDAV、FTP、媒体播放等超多功能

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

copyparty 是一款功能非常丰富的多功能文件服务器,主要用来你电脑、服务器、设备里的文件,并通过、WebDAV、FTP 等方式访问,还支持播放音乐、上传文件、权限设置等功能。

几乎可以在任何有 Python 环境的地方运行,还支持 Docker 托管,以及 系统下的单可执行程序,甚至可以在 中运行。虽然运行很容易,但我不敢说它简单易用。

Portable file server with accelerated resumable uploads, dedup, WebDAV, FTP, TFTP, zeroconf, media indexer, thumbnails++ all in one file, no deps – 9001/copyparty

copyparty 给自己的定位是「便携式文件服务器,具有断点续传、重复数据删除、WebDAV、FTP、TFTP、零配置、媒体索引器、缩略图++,全部集成在一个文件中,无依赖。」

所有的功能集中在一个 .py 文件中,718 KB,直接运行就可以了。Windows 系统有编译好的 .exe 单可执行文件,双击也即开机用。其他平台直接 python copyparty-sfx.py 就行了。

就是文档太啰嗦了…看不下去。

直接运行就可以在浏览器访问 http://127.0.0.1 了,默认会使用 80/443 端口,打开就是这样的:

可以上传、、播放、听歌、看图片…非常纯粹的文件分享。有一种 Alist 的感觉,不过它不支持网盘。

只需要在启动的时候添加一个用户,就能设置权限了,包括只读、文件夹限制等等:

这一行的意思是创建了三个用户:u1/u2/u3,为它们挂载文件夹 music,对 u1/u2 两个用户只读,u3 用户可以写。

但注意有参数后,访问端口就变化了(3923)。

copyparty 默认开启了 WebDAV,只需要在你的 WebDAV 客户端里直接连 http://ip:3923 就行了。

甚至,你可以通过 WebDAV 把这个文件夹映射为 Windows 的网络磁盘,不过 Windows 默认需要 https,改一下注册表就好了。

而 FTP 则需要在启动的时候添加 --ftp 21 参数,用户名密码和上面的设置相同,不设置就支持匿名访问。

ChatGPT 中文语音对话测试心得,头脑风暴、即时口译、冥想教练

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

之前让许多人惊艳的「进阶语音模式」功能,今天开始陆续针对 Plus 与 Team 用户推出。这个模式最大的特色,就是可以用更加自然〔接近于真的跟一个人聊天〕的对话方式,让用户通过语音与 进行交流。

相较于旧版的功能,新的语音交谈过程更加流畅、AI 反应迅速、接话过程几乎没有等待,也能随时打断 AI、插入新话题,除了可以支持多国语言在同一个对话中自由切换外,还能让 AI 模仿或调整各种对话风格等等。

那时候在 推出的官方中,这个 AI 进阶语音不只是更自然流畅而已,他还可以结合看的功能〔摄影镜头〕来回答用户问题,或是在语音中识别出用户的情感而提供对应的回应,这些跟原本拟人化的语音结合在一起,效果确实令人惊艳。

不过目前的「进阶语音模式」功能,似乎还没有当时视频中「完成体」的样子,在我实际的测试中,目前的〔2024/9/25〕的「进阶语音模式」有下面这些特点与限制:

ChatGPT 中文语音对话测试心得,头脑风暴、即时口译、冥想教练

我测试了几个 ChatGPT「进阶语音模式」的情境,下面跟大家「纯心得」,之所以叫做纯心得,就是因为我没有时间录制成视频再剪辑,所以真实过程其实是手机 上的语音对话,但我就用事后图文的结果来说明

首先,我之前就尝试过,利用跟 ChatGPT 进行一来一往的语音对话,一起构思一个企划案、文章草稿,例如,ChatGPT 假装成一个采访者,采访我对某个主题的想法,引导我把想法说出来,最后我就可以把这些内容转换成报告或文章。

旧版本的时候,其实我就已经觉得满好用的,只是那时候 ChatGPT 的每一次回应「要等很久」,所以对话过程相对生硬很多。

但使用新版的「进阶语音」模式,整个对话讨论过程完全不需要等待,AI 几乎都可以立即回应、接话,而当我 AI 说的东西走偏时,我也可以立即打断他,重新拉回主题。

最大的改变就是整个过程会更迅速,更节省时间,而脑中的想法可以更顺畅地说出,更有头脑风暴的感觉。

我喜欢用这种来回对话的方式,把很多想法激发出来。

经过完整的语音讨论后,请 AI 统整前面的讨论,整理成报告、文章的草稿。

不过,最后这一段我用的是文字的指令,当我这样做之后,这个聊天室就不能再进入进阶语音模式了

其实现在有很多 App 可以做类似的事情,无论是真人还是 AI,有一个在线家教,通过语音来教我们学习一些事情。

于是我试试看让 ChatGPT 通过「进阶语音模式」,当一个冥想教练。

首先,我先试试看在对话中让他调整语调。〔毕竟冥想教练的语调应该更缓和、舒服一点〕

然后我请他当一个冥想教练,通过进阶语音模式,引导我进行深呼吸的练习,或是引导我做大脑放松,效果还可以,这看起来也是一个适合 ChatGPT「进阶语音模式」做的事情。

当然,在这种特别需要情感的情况下,AI 的声调听起来还是比真人的语调生硬一点点。

或者,我也请 ChatGPT 通过「进阶语音模式」当一个英文家教,带我练习口说。

相较于旧版本,因为现在对话过程更流畅,所以更有面对面家教的感觉。例如我先跟他说明想要学习的背景,通过讨论,我们决定一起来练习旅行中的英文。接着 AI 提示我可以先练习餐厅中使用的英文,于是他先说几句如何点餐的用语,然后要求我照着念一次,并且会给我即时回馈。

这部分的过程非常顺畅也满有用的,而且可以通过对话随时调整成自己想要学习的内容,比很多固定的英文学习 App 更好用。

我也尝试看看把这样的「进阶语音」当作翻译来使用看看,以后如果有旅行、会议场合,可否帮我更快速、流畅的翻译双方沟通的内容呢?

首先,我进入语音对话后,先做一些设置,请 ChatGPT 充当即时口译的角色,并告诉他听到什么语言时,要口译成什么语言。

然后我说了一段中文,他很顺畅地直接翻译成正确的日文内容,当然,是用说的说出来。

然后我尝试在不同的语言之间切换,ChatGPT 的 AI 语音都可以即时口译成我需要的另一种语言。

而且当使用台语〔闽南语〕沟通时,ChatGPT 的 AI 语音也能听得懂,并且也会用台语回答。

整体来说,昨天初步测试,上述几个应用情境,对我来说就可以生成很大帮助:

使用 ChatGPT Plus 或 Team 版本的用户,值得试试看。

Google NotebookLM 更新:用 AI 研究英文 YouTube,批量获取整理视频、音频内容

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

Google NotebookLM 是一个强大的,可以让我们上传各种不同内容,建立属于自己的 库。通过这个工具,我们可以用自己专属的文件、PPT、网页、文章,让 AI 生成各种新的报告、文案、文章,甚至是客服解答。

这个工具让很多团队和公司都觉得非常实用。比起从别人的数据库中生成内容,直接从自己的专业文件与专属知识中获得 AI 回应,对工作的性来说更有效。

NotebookLM 推出了一个全新的升级,比前阵子推出的生成英文 Podcast 更实用!

现在它可以支持上传「 」,和上传自己的「录音文件」,让你用更多不同的内容建立属于自己的 AI 数据库。AI 会自动分析 YouTube 视频的字幕,并将录音文件转成各种语言的字幕,从而帮助你生成所需的内容。

这次升级带来了许多新的应用可能性,例如:

Google NotebookLM 原本已经支持上传 Google 文件、简报和网址进行分析,而现在更加入了 YouTube 视频和录音文件的支持。无论是中文、英文、日文等多国语言,NotebookLM 都能进行高效的 AI 整理与生成。

接下来,我通过图文介绍,这些新功能的实际使用方式。

打开「 Google NotebookLM 」,建立一个新的笔记本,然后就可以上传各种文件、文件、影音内容。

而在这次更新中,上传的内容增加了「YouTube」与「录音文件」两种选项。

Google NotebookLM 更新:用 AI 研究英文 YouTube,批量获取整理视频、音频内容

上传 YouTube 时,其实就是贴上 YouTube 视频的网址即可。

Google NotebookLM 不支持某些视频,例如没有字幕、不公开、最近才上传的视频,都可能导入失败。

我把自己收集的大量跟「个人知识管理系统」有关的英文 YouTube 视频,全部上传到 Google NotebookLM,立刻整理成「中文」的第二大脑学习笔记内容。

看起来效果还算是精准有效。

也可以把 YouTube 视频,跟其他的文件、网页文章,全部一起上传到同一个数据库。

AI 生成的内容与回答,也会从数据库的不同视频、不同文章多种不同内容,整理出答案,引用不同形式的参考资料。

也就是说,现在文字、视频、声音内容,都可以在 Google NotebookLM 的同一个数据库中进行解析,让 AI 同时分析多种内容形式,生成更有效地回答。

AI 问答时,针对 YouTube 视频,AI 会抓出视频的字幕进行解析与诠释,回答时也会引用视频内容,我们可以看到视频完整的字幕稿,以及跟答案有关的引用部分。

另外这次升级,Google NotebookLM 还推出了一个更实用的更新,就是可以上传录音文件,解析出完整字幕〔中文也支持〕,并进行知识问答或整理

下面是我把一个 40~50 分钟的录音文件上传,解析出的完整字幕内容。

字幕本身不算很完美,但理解内容没问题,更重要的是,这些录音字幕,就可以变成 AI 未来生成我需要的内容的素材。

例如我上传很多次很长时间的会议录音文件,问他会议中的某个重点:

Google NotebookLM 就可以正确的挑出示哪一个会议录音文件的哪一段内容,提供回答,也可以在引用中直接让我跳到该次会议的录音字幕段落!

我也可以汇整一个项目多次的会议录音文件,请 AI 根据会议录音文件撰写报告、文案Google NotebookLM 也表现得还不错。

或者,我之前常常提到,我喜欢用说的把想法讲出来,再看怎么语音转文字,变成报告或文章的草稿。

Google NotebookLM 中,我现在可以更自在地先把想法完成的录音下来,把录音文件上传,让 NotebookLM 整理杂乱想法,引用原文,改写成通顺文章。

Google NotebookLM 的最新升级让它成为学习与工作上的强大工具,特别是支持 YouTube 视频和录音文件的上传与解析!

无论是学习英文视频、整理会议录音,还是将录音内容转换成报告和文章,Google NotebookLM 都能以有效帮助我们处理繁琐的资料,并生成实用的 AI 回应。

通过整合多种语言与多形式内容〔文章、PDF、简报、网页、视频、录音等等〕,Google NotebookLM 这个工具让学习和工作流程变得更聪明,无论你是学生、老师、职场专业人士,还是创作者,NotebookLM 都是一个值得试试看的 AI 助手。

PopPop AI – 免费 AI 音效生成器,文字描述转换为音效神器

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

利用人工智能 技术制作已经不是,之前推荐过 Google MusicFXSuno AIStable Audio 都是 AI 音乐生成器,通过描述词或上传图片即可生成一段音乐,有些素材还能用于商业用途,相较于以往都要付费购买素材授权来说其实更实惠,而且利用机器生成的音乐又更不容易与其他人重复,以独特性来说略胜一筹。

PopPop AI」是一个免费 AI 音效在线生成器,用户输入一段文字描述后就快速生成相对应的音效素材,例如鼓掌声、下雨声、车流声或是餐厅、咖啡店吵杂的环境音,将文字在几秒钟内转换为各种类型的音效,亦可使用于、游戏制作或是各种情境。

PopPop AI 音效生成器没有使用限制,而且不用注册就可以立即使用,和同类型产品很不一样。

除此之外,PopPop AI 免费 AI 音效生成器的上也有提供不少音效示例,搭配上图片更有身历其境的感觉,很难想象这些都是以人工智能生成的音效,未来会不会转为付费服务还不得而知。

Create any sound from text effortlessly with our free online AI sound effect generator – the perfect, user-friendly sound maker for everyone.

进入 PopPop AI 音乐生成器后直接输入描述词,勾选右侧「智能模式」情况下可以使用简单的单词描述声音,该模式会自动修饰并填充相关的声音描述,也能输入中文,例如「交通、噪音、大城市」之类的关键词,按下「Generate」后就会开始生成音效。

PopPop AI – 免费 AI 音效生成器,文字描述转换为音效神器

PopPop AI 需要一段时间处理,过程需要排队,如果有其他人在前面的话就要等待更长时间。

完成后会给出两个选项,分别为 Option 0 和 Option 1,两个都可以试听、下载,略有差异。

点击音效前面的「播放」按钮就能预览播放。

点击后方的「下载」按钮就能获取 WAV 格式音效,没有下载限制,两个都能下载。

不过第一次点击下载时 PopPop AI 会跳出,询问用户是否将网站媒体,按下关闭再点击下载按钮就能获取音效文件。

PopPop AI 首页也有很多生成的音效示例,同时搭配上图片、关键词,想知道 AI 可以生成什么样的音效不妨去试听看看,也能从这里获取一些灵感哦!

Kill the Newsletter! – 免费好用的订阅邮件转 RSS Feed 源工具

DUN.IM BLOG

DUN.IM BLOG

我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。

当想通过 RSS 订阅一些人的文章时,却只提供订阅和邮件订阅(News Letter)。为了解决这个问题,找到了一个 Kill the Newsletter! 服务,它可以替你接收邮件并转化为可供 RSS 阅读器订阅的地址。

Kill the Newsletter! 允许用户将订阅邮件转换为 Atom 订阅源。对于需要的订阅源,也会将确认邮件转换为订阅源条目,只要进入转换的地址,就可以获取并点击确认链接。

暂不支持通过回复邮件来验证订阅,可以尝试联系发布者手动验证,或使用邮件设置转发作为解决方案。

另外,有些 Newsletter 的发布者可能会将 Kill the Newsletter! 的电子邮件地址拉黑,同样需要转发之类的绕过。

由于订阅源包含用户的电子邮件标识符,因此不建议订阅源,以防止他人取消订阅或发送垃圾邮件。

通过以上步骤,你就可以把原本只能通过邮件接收的内容转化为 RSS 订阅,方便在各种 RSS 阅读器中统一管理和阅读。

探讨如何为开源项目提交 issue

此文来自于我在公司内部 Wiki 上的文章,现将其整理并转载到我的博客。

Co-Authors:OD、wan92hen

什么是 GitHub Issue

GitHub 官方文档(https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues )给出的解释是 Use GitHub Issues to track ideas, feedback, tasks, or bugs for work on GitHub.,即通过 GitHub Issues 来跟踪 GitHub 项目相关的想法、反馈、任务及缺陷。从这段描述当中我们可以发现 Issue 不仅代表了 Bug、缺陷,它可以是任何跟项目有关且需要项目维护者知晓的内容,如果将其直译为问题可能会引起歧义,所以接下来我们直接使用 Issue 这个单词来表示它。

另一个值得注意的地方是 GitHub Issues 是一种异步沟通体系。所谓异步,即我提交了一个 Issue 以后,并不意味着立即就能够收到反馈。异步沟通虽然不像同步沟通那样来得直接,但并不代表它不高效。因为不期望能立即收到反馈来进行进一步地沟通,双方都需要尽可能地将信息一次性传达到位,在一定程度上反而可以提高沟通效率。

为什么要提交 Issue

上文中提到了 Issue 所代表的含义,它可能是关于项目的一个新想法,也可能是对于某个特定功能的使用反馈,还有可能是使用过程中碰到的各种各样的 Bug。提交 Issue 的目的自然是让项目维护者知道有这样的一个 Issue 存在。这看起来是一句废话,但实际上不同的 Issue 内容,能够达成这个目的的效果可能千差万别。一个好的 Issue 能够清晰、准确地表达出自己希望传达的信息,项目维护者跟提交者之间不需要再次进行额外的沟通就能够顺利地处理掉这个 Issue。反之一个不好的 Issue 不仅起不到这样的效果,反而可能在你来我往的交互中逐渐跑偏甚至变得火药味十足。

如何提交一个 GitHub Issue

提交一个 Issue 很简单,打开 GitHub 登录下自己的账号,点几下鼠标敲几下键盘就可以提交一个 Issue。但是要提交一个好的 Issue 还是需要一定技巧的。在此之前,建议先阅读下 提问的智慧 这篇文章,虽然是来自英文版的直白翻译,其文化背景、用词风格以及社会环境跟国内有所差异,描绘的场景跟 GitHub Issues 的使用场景也略有区别,但是其中关于提问相关的注意事项还是很值得参考的。这里也借鉴下这篇文章的格式,尝试总结下如何提交一个好的 GitHub Issue。

提交之前

首先,提交一个 Issue 不仅仅是为了请求帮助或者报告问题,也有可能会帮助后续遇到此问题的使用者。从某种意义上来说,这也是对整个开源生态非常具有价值的贡献。所以,不要抱着把问题抛出去等待解决的心理,需要认真对待提交 Issue 这件事,因为你也是一个贡献者。在提交 Issue 前,建议先做以下几件事:

  1. 理清楚你遇到的问题,需要有一定的逻辑性。

  2. 查阅项目文档,搜索是否有相关功能、问题的说明。幸运的话在这个环节我们的问题就可以得到解决,也可能会发现某个功能是设计如此,当然这个情况下我们仍可以提出自己的想法,但相应的措辞就需要有所转变。

  3. 在该项目的 Issues 中搜索有没有类似问题。同样的,如果能够找到类似问题并且在回复列表中看到解决、规避方案,又可以省下我们好多等待时间。如果问题看起来类似,但又不完全一致,可以就在此 Issue 进行回复并说明你遇到的问题。

  4. 在 GitHub 项目之外进行搜索,包括但不限于搜索引擎、内部知识库、项目论坛、交流群等等任何你能想到的地方。如果该项目跟某个其他项目使用了同样的底层库或依赖,有可能类似的问题在其他项目相关资料中可以找到解决方案;如果该项目足够活跃,可能会有用户在其他论坛或博客中分享使用经验或某个问题的解决方案。

  5. Double Check 一下问题确实存在。在项目维护过程中,包括我自己的软件使用经历中,出现过很多因为自己的各种失误而引起的问题,例如某个单词拼写错误、某个功能的前置操作没有完成等等等等。如果这样的 Issue 被提交上来,不仅会浪费双方的时间,还会降低自己在项目维护者心中的可信度,使得后续真正的问题不被重视(参考狼来了的故事)。

  6. 在新版本中尝试验证。

  7. 如果是同时遇到多个不相关的问题,不要提在同一个 Issue 里,可以提交多个 Issue,方便维护者跟踪。

当你真正准备好提交一个问题时,请再次回想下 GitHub Issues 是一个异步沟通系统,假设你只能够发一条消息给项目维护者,你要怎么做才能够让自己的问题得到解决。

提交的内容

一个好的 Issue 标题

  1. 尽可能使用一句话作为标题,但要求直截了当。千万不要直接把问题的详细内容直接写在标题。

  2. 给定一个范围标记,用于缩小这个问题的范围,方便维护者和后续使用者索引。

  3. 仅填写问题简述,不要添加无关内容。

一些案例

Bad

Good

Why

表格渲染异常

编辑器:表格语法渲染异常,在编辑器可以正常渲染,发布后无法渲染

问题描述不够清晰

安装报错

安装站点异常,提示 Internal Server Error

问题描述不够清晰

列表无法渲染

文章列表:后台文章列表渲染空白,可能是src/components/PostList.vue中的 xx 属性为空

问题描述不够清晰

数学公式问题

文章页面:数学公式原样输出,没有经过渲染

问题描述不够清晰

上传附件 bug 提交,请作者看看,谢谢

附件上传:在附件管理中上传附件提示失败,浏览器控制台提示 413 Request Entity Too Large

问题描述不够清晰,包含无关内容

将一个带有 “”接口用例且接口用例里面有环境配置 “” 的接口 导出来,然后 导入另外一个项目,再创建接口用例,配置环境,有时候出现新接口用例使用的是旧的环境,根本原因是 接口导出的竟然把 对应用例的环境 ID给导出来。

接口定义导出再导入到另一个项目时,新导入接口下的用例使用了原项目中的环境

问题描述不够简洁,将详细内容直接写在了标题里

(没有标题)

如果不是有责任维护项目,甚至都不想点进去看内容

问题描述

建议参考以下几点:

  1. 避免使用大量啰嗦的文字来描述,保证干练和逻辑性即可。如果无法描述清楚,可以通过补充复现步骤来辅助。一个好的 Issue 能够恰到好处地给出所需的信息。所谓恰到好处,是指信息不多也不少,刚刚好能够支持项目维护者解决这个问题或者了解这个需求。

  2. 内容仅针对此问题,不要包含遇到的其他问题,其他问题可以另外提交 Issue。

  3. 不要包含与问题无关的话语。

  4. 没有明显的错别字,合理使用标点符号

提供详细的环境信息

一般来说,目前 GitHub 上的项目中都会包含 Issue 模板,会提示让你填写一些环境信息,按照具体要求填写即可。如果没有,也建议根据软件特性提供必要的信息,比如:浏览器类型及版本、服务器版本、使用的设备、使用的数据库版本等。这往往能帮助维护者快速定位某些在特定条件下才会出现的问题。

详细的复现步骤

这一步主要告诉维护者出现这个问题的前因后果或者上下文,因为某些问题是必须在特定的操作下才可能复现的,甚至某些问题可能是某种意义上随机出现的,如果不提供复现步骤,维护者可能会非常难以复现。这也往往增加了来回询问的过程。另外,为了更加直观的描述问题,可以提供步骤截图,GIF 动图,甚至视频(目前 GitHub 已经支持视频)。

提供日志

日志对于维护者排查问题也是至关重要的,提供日志建议参考以下几点:

  1. 对一些敏感信息脱敏处理,某些软件可能会在日志中打印一些敏感信息,建议提供之前检查一遍并手动脱敏。

  2. 仅截取相关的日志,如果不知道哪部分是相关的,建议手动复现一次这个问题并快速去查阅最新打印的日志。

  3. 不仅仅是软件内提供的日志,如果这个项目是基于浏览器运行的,也可以提供一下浏览器控制台打印的日志。

  4. 提供日志的时候请务必使用 Markdown 的代码块(```)语法包裹,否则日志会非常难以查阅。

已经尝试过的解决方式

如果有自己尝试过解决,建议补充一下。因为维护者可能在不知道的情况下也提供出你已经尝试过的解决方式,这无疑增加了来回交流的次数,一定程度地影响效率。

后续跟踪

当你提交完成一个 Issue 之后,项目维护者可能并不会及时回复,这也是异步沟通的一个特点。但请耐心等待回复,不要在短时间内评论催促,有内容需要补充除外。

当你提交的 Issue 收到回复后,GitHub 会向你的邮箱中发送通知,也可以使用 GitHub 内置的通知功能进行跟进。

几个建议:

  1. 如果收到回复,你的邮箱可能会收到 GitHub 的提醒邮件,虽然 GitHub 支持通过邮件回复 Issue,但请千万不要使用邮件回复,因为各个邮件客户端的差异,很可能导致最终的评论混乱,如:https://github.com/halo-dev/halo/issues/1799#issuecomment-1084632899

  2. 与维护者交流的时候不要像使用 IM 即时交流工具一样交流,尽可能一次提供完整的信息。

  3. 如果问题已经解决,一定要及时在 Issue 中告知,必要的时候也可以提供后续的解决方式。

礼仪相关

  1. 不要包含任何的抱怨、吐槽、隐晦等不舒适的话语。即便你说的都对,但可以换一种更加友好的表达方式,仅表述问题,不输出情绪。

  2. 不要要求项目或维护者做任何事。

对于项目管理员或维护者

提供一个贡献者文档

详尽地描述提交 Issue 和 PR 的步骤和要求。

提供 Issue 提交模板

目前 GitHub 已经提供了基于 yaml 描述表单的功能,可以提供更加直观的 Issue 提交表单,并支持表单验证,这能更加规范所有 Issue 的内容。你可以针对项目的特点,列出提交 Issue 所需的信息,如:服务器环境、浏览器版本、所使用的设备等。

相关链接:

跟踪 Issue

  1. 及时排查问题,给 Issue 打上对应的标签。

  2. 不建议将 issue 当做工单使用。

  3. 不要回复之后立马关闭 issue,可以等待提交 issue 的作者回复。

  4. 不要在解决这个 issue 之前就关闭 issue。

  5. 在任何时候,都不建议直接删除 issue 或者 issue 回复。除非十分有必要,比如留下了敏感信息。

  6. 在 Issue 中交流的时候不要像使用 IM 即时交流工具一样交流。

  7. 如果在后续的代码提交中已经修复了此问题,建议在 PR 中关联此 Issue( 可以使用 Fixes #xxx),并在 Issue 中回复。

使用 Eagle 管理各种图片素材

不知道各位有没有遇到过这种问题?

上网冲浪存了好多沙雕梗图,有时候突然感觉其中一张图能派上用场,但想找却怎么也找不到,也不知道当初存哪里去了;

大事小事都喜欢截图,玩游戏截图,看动画片也截图,截了一大堆到头来也不怎么用,乱七八糟的混在一起,删了又感觉怪可惜的;

看到喜欢的图总之先右键保存(话说现在是不是已经不兴说「右键保存」了,「长按保存」可能还更普遍一点,大人时代变啦),久而久之图库越来越大,又分散在硬盘的不同角落,整理起来也愈发力不从心……

啊。没有吗。好吧。🥲

说正经的,如果你也有很多图片需要管理,那么你应该试试 Eagle 这款软件。


为什么呢?

如果单纯依靠文件系统整理(用文件夹分类),缺点还是很明显的:

  • 一张图片只能属于一个分类,除非复制多份;
  • 不能给图片加标签、备注;
  • 浏览切换目录不方便,需要借助其他看图软件;
  • 目录下图片太多容易把 Explorer/Finder 卡住。

使用专业的素材管理软件,可以解决绝大多数的这种问题。

当然了,这种类型的软件不只有 Eagle 一个。但是我只用过 Eagle,所以就不推荐其他的啦。如果有更好的选择,欢迎在评论区告诉我。

eagle-website-screenshot

我目前用到的功能基本上有这些:

  • 分类、标签、备注
  • 按颜色、图片尺寸等筛选
  • 瀑布流浏览
  • 重复图片检查
  • 浏览器扩展拖拽保存网页图片

以我自己的体验来说,比起原来用文件管理的时候,真的舒适了太多。相见恨晚啊!

比如下面是我珍藏的(到处偷来的)小叮当图:

eagle-library-memes

还有这几天在看(吹)《佐贺偶像是传奇》

eagle-library-screenshots

不过有一点遗憾的是,目前在手机上还没有浏览 Eagle 资源库的办法。

Eagle 资源库的目录结构是这样的:

我的图库.library├── images│   ├── KEZAL1JG0RN32.info│   │   ├── IMG_1507.png│   │   ├── IMG_1507_thumbnail.png│   │   └── metadata.json│   ├── KEZAL1JG2YXNI.info│   │   ├── 我太菜了 对不起.jpg│   │   └── metadata.json│   ├── KEZAL1JG34XY6.info│   │   ├── 可恶 你们这些被资本主义毒惑到骨子里的猪.jpg│   │   └── metadata.json│   ├── KEZAL1JG4HFBR.info│   │   ├── illust_71093876_20191005_193032.jpg│   │   ├── illust_71093876_20191005_193032_thumbnail.png│   │   └── metadata.json...

每张图片外面都包了一个文件夹,包括分类、文件夹层级等元信息都存在里面的 metadata.json 中,从外界无法直接浏览(这也是为部分人所诟病的一点)。

而官方似乎也没有出移动端 App 的打算……

一个妥协的办法就是使用 Eagle 的导出功能,导出成正常目录结构,然后放到手机上(可以用 Documents 等应用从电脑自动同步)。

eagle-export-sync

这样算是勉强能看,不过到底还是不方便。

前段时间看到 Eagle 公开了 API,本来想弄个简陋的网页客户端,写了个小 demo,倒是确实能浏览图库了。所以功能实现估计是没什么障碍的,奈何后来犯懒,一直搁置到现在,只能有缘再说了。

最后,Eagle 是收费软件,¥199 两台设备,终身授权,学生有教育优惠。

如果你有图片整理需求的话,去试用一下吧,不会亏的。

使用群晖 Chat 实现多平台内容传递

手机和电脑之间经常要传递文件或者文字,很多人都是用微信或者 QQ 之类的软件,大部分软件体验过后发现群晖 Chat 十分好用!

我使用的是 iPhone,电脑有 Windows 和 Mac OS X,还有备用机是 Android,所以我基本是常规平台都要用,如果要在设备之间传输内容就是个烦恼。

然后呢…我有黑群晖啊,直接用 Chat 在各个平台传输内容,几乎全部平台都有 Chat 客户端,而且就算用不了客户端也可以用网页版,我还有 Yubico,就算在陌生设备也能无密码的登录。

使用的前提是,有群晖 NAS,黑白都可以。然后安装好 Synology Chat Server 套件。手机也要安装好。详情参考我另一篇文章

iOS 上直接通过分享菜单就有 Chat 选项,我一般都是直接分享到『我的空间』就可以。

现在没有什么软件比这个好用了。


通过群晖 Chat 推送通知到 iPhone

push messages to iPhone with synology chat如果你有这样需求,将 Android 短信和来电甚至应用消息推送到 iPhone 上,可以尝试以下使用群晖的 Chat 套件。

设备设置

准备

安装套件

1.先要在国际版的群晖网站下载中心找到你NAS型号的 Synology Chat Server 套件,下载保存好套件文件。

2.打开你 NAS 的页面,然后在桌面打开套件中心。

3.选择手动安装。

4.弹出的窗口找到刚才下载的套件文件选择下一步。

设置机器人

1.打开安装好的 Sunology Chat。

2.在右上角你的头像点击,然后选择『整合』。

3.弹出的菜单选择『机器人』。

4.弹出的窗口点击『+创建』。

5.填写机器人名称和设置以下照片,记得复制好 『传入 URL』。注意:你还没添加机器人之前不要勾选『在聊天机器人列表隐藏』!

6.退出到 Chat 界面,在左边的栏目中『机器人』一栏的右边加号点击并找到刚才新建的机器人点击。这样就成功添加机器人了。

推送内容

推送到机器人的内容可以参照群晖知识中心关于整合的说明

下面我们以文字内容为例,格式是 json

payload={"text": "这里是送内容的文字部分"}

使用 POST 方式推送到建立机器人时候的『传入 URL』。

iPhone 设置

在 AppStore 上搜索 Sunology Chat 并安装,如果国区找不到的话只能用其他区账号安装了。

安装后输入 NAS 地址和端口号或者用 QuickConnect 连接。

Android 手机设置

通过短信转发器 SmsForwarder 推送手机上的消息到 Chat。

先下载好 SmsForwarder 并在 Android 手机上安装,然后打开 App,在发送通道的界面点击右上角加号选择 Webhook

选择 POST,在Webhook Server 填入机器人频道的 URL, 消息模板中填入 payload={"text":"{msg}"} 然后保存。

在转发规则的短信页面右上角加号添加一项,发送通道下拉选择刚添加的通道,然后保存就好了。你也可以点『测试』来测试是否成功。


映泰J4125 自建 NAS

终于要自己买硬件来装 NAS 了!选择低功耗平台,6盘位机箱。

硬件清单 2022-09

硬件价格
全汉 FSP Flex-350G 额定350W电源¥459.00
西部数据红盘Plus 8TB(WD80EFZZ)¥1,225.00
映泰J4125NHU主板¥565.00
金士顿 FURY 8GB DDR4 3200 Beast内存¥185.00
梵隆 6 盘位热插拔机箱¥448.00
佳翼5盘SATA阵列卡m.2 nvme to sata¥199.00
闪迪USB 32G USB3.1 U盘CZ74¥43.90
合计¥3,124.90
上面加个都是供应商低价入的全新有质保的价格,机箱是淘宝梵隆自己的店,电源和 USB 是京东下单,其他就是供应商进货。

系统

现在市面上各个能安装的 NAS 系统都折腾一遍了,综合起来只有 DSM 最好使,主要是手机 APP 最健全,设计也最直观,然后就是想办法安装了。

网上搜了好久都没有针对我这块主板的引导,只能自己编译了,然后在搜索编译 DSM 引导的,发现一篇直观简单的编译教程,照着一顿操作,OK!完美引导,M.2 转接卡也能识别使用,没问题。还是直接在线安装系统的。安装完之后没有任何问题,直接使用。


数据迁移

群晖的 DSM 数据迁移十分简单,就是在新的机器安装一个 Migration Assistant,打开之后选择旧的机器,然后输入旧机器的管理员账号密码,选择迁移那些东西,然后等完成就好了,我选择所有组件都迁移,1.3T 数据用了4个多小时才完成,因为是千兆局域网。

Docker 也完美迁移!

迁移后旧机器会停用所有组件,再登陆上去像是新机器一样,因为迁移到新机器了,所以要停用旧机器的组件才不会和新机器上的冲突。看一眼旧机器的磁盘,数据没删的!好评!

现在是一个 8T 硬盘,过几个月再买多个 8T 组 Raid1,这样就错开硬盘的批次了。其实可以买一个希捷的或者买个红盘Pro,也算是错开了,奈何…穷啊。


NAS 功能使用和玩法

我现在 NAS 主要是做数据备份,然后就是文件分享,平时出去装电脑,本地单位的电脑很多时候都要安装一些特定的软件,我就是用家里 NAS 作为分享服务器,需要时候直接从 NAS 下载。

列一份清单吧

套件

套件说明
Plex影视媒体中心,目前功能最完善,其他都不少问题。
Photos群晖的照片应用,功能也是目前相关应用最完善的。
Chat自建聊天软件,配合群晖的免密登陆在模式电脑需要传文件什么的很舒服
Note Station笔记应用,不是很好用,但是找不到其他满意的自建笔记就将就用
WebDAV在手机电脑外网直连 NAS 文件最方便了
Contacts通讯录,手机基本都支持连接,可以方便设置手机通讯录都存 NAS。
Office这个是群晖 Office 套件,需要 Drive 套件支持,但是格式不能直接打开微软 Office 格式,需要转换格式,但是还是能用的。
Active Backup for Business备份服务器到 NAS,支持整个分区备份,不错,服务器就 10G,就算备份几个版本都可以。
Cloud Sync网盘同步工具,挺满意的,都能同步。
Hyper Backup备份 NAS 文件或者设置等到远端服务器,我把笔记,密码库等文件加密备份到 TeraCLOUD 和 OneDrive 上做一个备份。

Docker

项目说明
finab/bark-server推送消息到 iOS Bark
homeassistant/home-assistant智能家庭中心,暂时只用 Docker 版,但是功能不全,要换其他版本才行
jeessy/ddns-goDDNS,目前最顺手了
meosmemo/memos轻笔记,一个不错的随手记
p3terx/aria2-pro下载工具
vaultwarden/serverBitWarden 的自建服务,我所有密码都用这个保存。
zerotier/zerotier-synology异地组网

硬件选择

电源

Flex-350G

选择台达这电源算是没得选,因为之前想要台达1U 额定 350W 电源,但是到处都没货,然后发现加点儿就买到个全模组的,然后就选择了京东买全汉的 Flex-350G 了。全模组好处是方便,要的线接上,不要的就不接,省点儿空间,毕竟机箱小。但是的 4Pin 接口没防呆,全部都是 CPU 4Pin 接口,我还插错过…

硬盘

red plus

看过希捷和西数,发现希捷寿命相对没西数好而且一直装机都用西数就选西数,红盘要 CMR 就只有红盘 Plus 和 Pro,Plus 便宜一点。就先买个红盘 Plus先。后来我又买多了一个红盘 Plus,组的 Raid1。

主板

j4125

之前看的时候映泰还是只有 J4105,然后最近出了 J4125,那就用 J4125 咯。这块主板有坑的,主要就是没有前置 USB 3.0 接口,主板上的风扇接口是3针不能调速,内存最高支持 8G,插两条 8G 能识别,不过我后来买多条 16G 内存接上去,完全可以识别24G。还有就是,主板说明上说到,当 M.2 接口接有 SATA 协议的时候会禁用一个 SATA 口…也就是说,我加了 M.2 转 SATA 之后主板的 SATA 口只能用一个…

内存

内存呢,就没什么的,平时装机用带马甲的都是这条,就用这条咯。先是买了条8G,后来加一条 16G。

机箱

NAS 6

机箱最开始我是想要买个 3U 或者 2U 的热插拔机柜机箱的,毕竟布局起来方便,能塞进家里的 6U 机柜。后来看到拓普龙的机箱,又想用这类 NAS 机箱,不过拓普龙的机箱硬盘笼背板不好,机箱风扇也不行,买回来还要自己改,然后在 B 站逛就发现又款梵隆的机箱,做工可以,背板也不错。不过外观真的难看…但是这价格没得选,就用吧。这机箱有一个很大的优点点,支持全高 PCI-E。

我心目中最好的 NAS 机箱是宝藏盒。所有我想要的设计,宝藏盒都实现了!不过就是价格太贵了。

SATA 扩展卡

m.2 to sata

因为映泰J4125只有两个 SATA 接口,这肯定是不够用的,所以必须想办法扩展,而主板只有一个 PCI-E 槽,所以就要用 M.2 转 SATA,看了几款,这个时间段只有看到佳翼的这款 M.2 转 SATA 转接卡不错,有外壳,看评论兼容性都不错。这个扩展卡在黑群晖下顺序是反过来的,就是5号口是1,1号口是5…

U盘

随便一个质量好的 U 盘都可以,这个一直用开就直接用这个了。


结语

2022年 618 在京东上群晖的 DS920+ 曾经 3000+ 就能买到,硬件也一样,但是还是贵,我现在加上硬盘都比白裙便宜。心心念念的独立 NAS 现在终于完成了!家庭数据中心完成建立,手机照片直接备份上去,不用愁。


OpenWrt 定时自动释放内存

openwrt automatic memory release因为我的固件可能有内存泄漏,所以想办法定时释放内存。其实就是用 Linux 的方式。

在管理界面 > 系统 > 计划任务,加入下面代码。每天5点和17点自动释放内存。

0 5,17 * * * sync && echo 1 > /proc/sys/vm/drop_caches

树莓派 Zero W 使用微雪电子墨水屏

一直想有一个电子墨水屏作为桌面提示器,显示一些信息提示。没有现成的产品,那么就想自己做一个。

用树莓派 Zero W 外接微雪的三色电子墨水屏制作一个小型的桌面提示器。

直接买微雪 2.13 寸带驱动板三色显示屏,这款直接接上树莓派就可以用了。我买的树莓派 Zero W 没有排针,所以我还买了电烙铁给板子焊上排针。然后接上就屏幕驱动板就可以直接用了。


驱动安装

微雪官网的『RPI使用教程』就有显示屏的驱动和使用方式,照着说明安装就可以了。

驱动方式有 C 和 Python 两种,我不懂 C,只能用 Python,而且 Python 用起来比 C 方便很多。

我买这块显示屏型号是 EPD_2in13bc_test(),安装好驱动和库之后运行对应的文件。

sudo python3 ~/e-Paper/RaspberryPi\&JetsonNano/python/examples/epd_2in13bc_test.py

显示屏测试启动。怎么编程其实在这个文件里全部都给出来了,相当简单。


使用例子

我按着这个文件做了两个例子,一个是直接显示三色图案,一个是获取树莓派的信息再生成图片显示。你可以直接下载我的 Demo 文件然后放到 Python 文件夹对应的文件夹中。

~/e-Paper/RaspberryPi\&JetsonNano/python/

Python 的使用方式就是使用 Image 模块分别引用或者生成两个黑色和黄色两个图层图片再分别刷新。


图片显示

树莓派 Zero W 使用微雪电子墨水屏

想要显示图片的时候注意的是,图片需要拆分黑色通道和黄色通道各一张单色图片,而且刷新时候的逻辑是黑色通道先刷新,黄色通道后刷新,而黄色通道会覆盖黑色通道,所以你需要再黄色通道图片上镂空黑色通道的图案。也就是我文件里的 epd_2in13bc_imgs.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
import os
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
    sys.path.append(libdir)
import logging
from waveshare_epd import epd2in13bc
import time
from PIL import Image,ImageFont,ImageChops
import traceback
logging.basicConfig(level=logging.DEBUG)
try:
    logging.info("epd2in13_V2 Demo")
    epd = epd2in13bc.EPD()
    logging.info("init and Clear")
    # 初始化
    epd.init()
    # 清空屏幕
    epd.Clear()
    logging.info("1.Drawing on the image...")
    # 黑白图,先刷新
    HBlackimage = Image.open(os.path.join(picdir, 'gw_b.bmp'))
    # 黄色部分,后刷新,黄色会覆盖黑色
    HRYimage = Image.open(os.path.join(picdir, 'gw_y.bmp'))
    # 旋转180度,根据自己设备方向调整,90,180,270
    HBlackimage = HBlackimage.transpose(Image.ROTATE_180)
    HRYimage = HRYimage.transpose(Image.ROTATE_180)
    # def display(self, 黑白图像, 黄色图像)
    epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage))
    # 休眠
    time.sleep(2)
        
except IOError as e:
    logging.info(e)
    
except KeyboardInterrupt:    
    logging.info("ctrl + c:")
    epd2in13bc.epdconfig.module_exit()
    exit()

而且两个通道图片的模式必须一样的,例如:我给的 Demo 图片就是两张图片都是灰度模式的就是只有黑白灰的颜色,没有彩色。而一般图片都是 RGB 模式的。

还有就是通过 Image 生成图片的时候也要根据你背景图的色彩模式设置,要不然就会报错了!


信息显示

动态生成黑色文字的时候就需要用运算的方式在黄色通道上删除黑色通道部分的内容了。 我的压缩包中的 epd_2in13bc_demo.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
import os
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
    sys.path.append(libdir)
import logging
from waveshare_epd import epd2in13bc
import time
from PIL import Image, ImageDraw, ImageFont, ImageChops
import traceback
# 获取时间
NowTime = time.strftime('%Y-%m-%d %H:%M:%S',  time.localtime(time.time()));
# 内网 IP
import socket
hostName = socket.gethostname()
def get_host_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip
# 外网 IP, sudo pip3 install requests
import json
import requests
wan_ip = requests.get('https://api.ipify.org/?format=json').json()['ip']
# 输出日志等级
logging.basicConfig(level=logging.DEBUG)
try:
    logging.info("1.read bmp file And Text")
    # 初始化
    epd = epd2in13bc.EPD()
    logging.info("init and Clear")
    epd.init()
    epd.Clear()
    # 载入字体,Zipx 这款字体 12/24/36/40 这几个字号能看,其他的都粗细不一
    # higher = ImageFont.truetype(os.path.join(picdir, 'higher_8.ttf'), 14)
    # zipx12 = ImageFont.truetype(os.path.join(picdir, 'zipx.ttf'), 12)
    # fz14 = ImageFont.truetype(os.path.join(picdir, 'FZXIANGSU14.otf'), 14)
    pxlxxlcond = ImageFont.truetype(os.path.join(picdir, 'pxlxxlcond.ttf'), 20)
    logging.info("1.Drawing on the image...")
    # 下层,黑白图,先刷新(白底黑字)
    HBlackimage = Image.new('1', (epd.height, epd.width), 255)  # 212*104 获取 epd 的尺寸
    drawblack = ImageDraw.Draw(HBlackimage)
    drawblack.text((12, 10), 'Host: '+hostName, font = pxlxxlcond)
    drawblack.text((12, 32), 'LAN: '+get_host_ip(), font = pxlxxlcond)
    drawblack.text((12, 54), 'WAN: '+wan_ip, font = pxlxxlcond)
    drawblack.text((12, 76), NowTime, font = pxlxxlcond)
    # 上层,黄色部分,后刷新,黄色会覆盖黑白色
    # 这个 bmp 图片必须是灰阶的,不能是 RGB 的!
    # 如果图片是 RGB 模式怎上面 Image.new('1' 改为 'RGB'
    HRYimage = Image.open(os.path.join(picdir, 'bg_boxks.bmp'))
    # 文字蒙版裁剪背景图,使用差值运算生成反色图像,然后 invert() 反色为想要的颜色。
    HRYimage = ImageChops.subtract_modulo(HBlackimage, HRYimage)
    HRYimage = ImageChops.invert(HRYimage)
    # 旋转180度,根据自己设备方向调整,90,180,270
    HBlackimage = HBlackimage.transpose(Image.ROTATE_180)
    HRYimage = HRYimage.transpose(Image.ROTATE_180)
    # 创建纯色图像,如果你想全屏幕显示黄色就用纯黑色图像代替 HRYimage
    # 如果只想显示黑白,不显示黄色就用纯白色图像代替 HRYimage
    # Whiteimage = Image.new('1', (epd.height, epd.width), 255)
    # Blackimage = Image.new('1', (epd.height, epd.width), 0)
    
    # def display(self, 黑白图像, 黄色图像)
    epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage))
    # 休眠
    time.sleep(2)
        
except IOError as e:
    logging.info(e)
    
except KeyboardInterrupt:    
    logging.info("ctrl + c:")
    epd2in13bc.epdconfig.module_exit()
    exit()

照着上面的代码修改基本就可以了,然后可以设置成开机启动,每次开机都会显示 IP 信息了。

后面我会在研究更实用的例子。


使用群晖唤醒局域网内其他设备

之前我写了一篇用树莓派唤醒内网设备的文章,现在再写一篇通过群晖唤醒内网设备的。当然还是要你稍微了解 Linux 系统才可以。用的代码和之前文章的一样。

代码目录

首先在群晖套件中心安装 Web Station 和 Node.js v8(v12 的 npm 安装会提示 zlip 有问题的)。通常 Node.js 会在你安装某些应用时候就会装上的,如果没有装你需要先安装一下。

安装好之后打开 File Station 左边的列表应该就会出现一个 Web 文件夹,在文件夹里建一个 node 文件夹作为存放相关代码文件用,并且在 node 文件夹中再新建一个 logs 文件夹存放日志用。

群晖 Web Station 目录

然后修改一下之前树莓派文章的代码,主要是 pm2_config.json 文件改为绝对路径。一般 Web 文件夹绝对路径是 /volume1/web/,其中 volume1 是储存池的目录,如果你装了多个硬盘或者组阵列的话就需要你自己在终端查一下你 Web 文件夹的目录了。

{
    "apps" : [{
        "name"        : "nodewol",
        "script"      : "/volume1/web/node/index.js",
        "cwd"		 :	"/volume1/web/node/",
	"instances"  : "1",
	"log_date_format"  : "YYYY-MM-DD HH:mm Z",
	"log_file"   : "/volume1/web/node/log/wol.log",
	"error_file" : "/volume1/web/node/log/wol-err.log",
	"out_file"   : "/volume1/web/node/log/wol-out.log",
        "watch"      : true
    }]
}

群晖唤醒方式

群晖上不能安装 waleonlan,所以我们需要使用 nodejs 的 wol 包来实现唤醒设备。

/**
 * Post请求执行 shell 命令
 * 只要向这个地址提交 {"mac":"设备 MAC 地址"}
 * kaiyuan Hsie
 * https://boxks.com
 * */

//1. 导入express
var express = require('express');
// 解析器 需要安装 npm install -g body-parser
var bodyParser = require('body-parser');

// WOL 包 npm install wol
var wolfun = require('wol');

// 时间模块
var sd = require('silly-datetime');
var nowTime=sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss');

// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false });

// 创建服务器
var router = express.Router();

router.post("*", urlencodedParser, function (request, response) {
	//
	if (!request.body) {
		response.send("请提交设备 MAC 地址");
	} else {
		var thisMAC = request.body.mac;
		wolfun.wake(thisMAC, function(error, postText){
			if (error !== null) {
				console.log('-wol- exec error: ' + error+' '+nowTime);
				response.send('exec error: ' +error);
			} else {
				console.log("-wol- "+thisMAC+' '+postText+' '+nowTime);
				response.send('已经叫咗电脑开机!');
			}
		});
		  
	}
});

module.exports = router;

安装 PM2

开启群晖 SSH

在群晖控制面板的「终端机和 SNMP」中勾选「打开 SSH」然后应用。

接着打开你电脑上的终端,Windows 上按 Win+R 然后输入 CMD,或者在开始菜单按钮上右键,选择打开 CMD。

终端 SSH 连接

打开只会输入 ssh user@192.168.2.117 这样的命令,其中 192.168.2.117 替换为你群晖的 IP。通常在群晖页面右下角的系统状况可以看到。而 user 替换为你群晖的账号名。然后会提示你输入密码,这个时候你输入任何内容都不会显示出来的,你不用管,直接输入密码只会按 Enter 就好了。

如果你 nodejs 默认是 v12,则先输入 nvm set 8.9.4 切换回 v8 才能正常使用 npm!

然后安装 PM2

npm install pm2 -g

等待安装好只会会直接显示 pm2 的路径的,注意记下来,因为后面我们要用绝对路径来运行 pm2 的。这个路径一般都是在 Node.js 目录下面。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2
or
/volume1/@appstore/Node.js_v8/usr/local/lib/node_modules/pm2/bin/pm2

你可以测试一下运行上传的代码。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 start /volume1/web/node/pm2_config.json

如果没有提示红色错误,直接显示表格运行状态的话就 OK 了。然后现在关掉这个测试。因为我们要用群晖的任务计划让他开机自动启动。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 stop /volume1/web/node/pm2_config.json

设置开机启动

打开群晖的控制面板,选择任务计划,新增>触发的任务>用户定义的脚本。

设置群晖开启启动命令

任务名称随便你填写一个,用户账号选择 root。然后在任务设置页面「用户定义的脚本」上面测试的那段代码,然后按确定。

设置群晖开机启动命令

保存好只会记得勾选刚新建的项目前面的勾,然后右键>运行。这样就完成了。

设置反向代理

在控制面板中的「应用程序门户」里面的「反响代理服务」新增一项。

设置群晖反向代理

描述随便填,协议选择 Https,端口就是你想用来访问的端口,例如 10505(填5位数可以防止和常用端口冲突),勾选「启动 HTTP/2」,下面的「目的地」就是填 node.js 应用的信息,地址就是 127.0.0.1,端口就是应用的端口 5050。然后确定。

这样就可以把 mac 地址通过 post 发给 https://192.168.2.117:10505/wol 这个地址来唤醒局域网内的设备了。

至于 https 证书问题,如果你用群晖的 DDNS 就不需要额外操作,如果你是用自己的域名就需要用 acme 申请Let’s Encrypt证书了。

当然你要在外网访问还要在路由器上设置端口映射。我之前的文章有写,这这里就不重复了。


Manjaro Gnome 安装和配置记录

╭─ryanwang at ryanwang-linux in ~
╰─○ neofetch
██████████████████  ████████   ryanwang@ryanwang-linux 
██████████████████  ████████   ----------------------- 
██████████████████  ████████   OS: Manjaro Linux x86_64 
██████████████████  ████████   Kernel: 5.10.70-1-MANJARO 
████████            ████████   Uptime: 10 hours, 29 mins 
████████  ████████  ████████   Packages: 1394 (pacman) 
████████  ████████  ████████   Shell: zsh 5.8 
████████  ████████  ████████   Resolution: 2560x1440 
████████  ████████  ████████   DE: GNOME 40.5 
████████  ████████  ████████   WM: Mutter 
████████  ████████  ████████   WM Theme: Adwaita-maia-compact-dark 
████████  ████████  ████████   Theme: Adwaita-maia-compact-dark [GTK2/3] 
████████  ████████  ████████   Icons: Papirus-Dark-Maia [GTK2/3] 
████████  ████████  ████████   Terminal: gnome-terminal 
                               CPU: Intel i5-10400 (12) @ 4.300GHz 
                               GPU: Intel CometLake-S GT2 [UHD Graphics 630] 
                               Memory: 12983MiB / 15424MiB

基础设定

检测并更换软件源:

sudo pacman-mirrors -i -c China -m rank

添加 archlinuxcn 的源:

sudo vim /etc/pacman.conf

追加如下配置:

[archlinuxcn]
SigLevel = Optional TrustedOnly
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
sudo pacman -S archlinuxcn-keyring

检查软件包更新:

sudo pacman -Syyu

常用开发工具包:

sudo pacman -S base-devel

常用软件包

常用终端工具:

sudo pacman -S htop vim tree neofetch

社区应用:

yay -S bitwarden spotify visual-studio-code-bin google-chrome github-desktop-bin com.qq.weixin.work.deepin com.qq.weixin.deepin typora telegram-desktop

输入法

最开始使用的是 fcitx5 + fcitx5-rime ,安装下来一切顺利。但是在某些场景下始终无法切换到中文输入法,不知道如何解决,然后换成了 ibus-rime。

sudo pacman -S ibus-rime
sudo vim /etc/profile.d/ibus.sh

写入:

export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"
export XMODIFIERS="@im=ibus"

export XIM="ibus"
export XIM_PROGRAM="ibus"

按理来说,这时候重启或者重新登录即可生效,但是并没有,不仅无法通过快捷键(Super+Space)切换到中文输入法,而且菜单栏右侧也没有切换输入法的菜单项。后来在 @JohnNiang 的帮助下解决了此问题。解决方法:在系统设置里面添加 rime 输入法。如下图:

manjaro-keyboard-settings

rime 的配置目录位置:~/.config/ibus/rime/build

可根据自己的需求对 rime 进行定制化配置。

Terminal 配置

目前最新的 Manjaro 发行版已经默认配置了 zsh,但个人还是希望使用 ohmyzsh。和家里的 macOS 保持一致。

安装 ohmyzsh:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装所需插件:

cd ~/.oh-my-zsh/plugins

git clone https://github.com/zsh-users/zsh-syntax-highlighting

git clone https://github.com/zsh-users/zsh-autosuggestions

修改 .zshrc

ZSH_THEME="fino"

...

plugins=(
	git
	zsh-autosuggestions
	zsh-syntax-highlighting
)

Node.js 环境配置

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

追加下面的配置到 .zshrc

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

安装一个 Node.js 版本

nvm install v14.17.3

Clash

yay -S clash

配置目录位置:~/.config/clash

将 clash 配置文件(config.yaml)放置到此目录,然后启动即可:

nohup clash &

Gnome 插件

https://extensions.gnome.org/extension/2890/tray-icons-reloaded/ https://extensions.gnome.org/extension/1460/vitals/

总结

使用了两三天下来整体还是不错的,暂时还没遇到什么痛点,可能问题最大的还是在中文输入法的体验上吧。之前一直在开发环境使用 Deepin,在使用上没有什么大的问题,但感觉系统整体在 UI 和交互上对于我来说存在较大问题。Deepin 就是属于那种远看界面还不错,但是近看却经不起推敲。个人不是特别建议。而且对于一个小前端开发来说,目前所需要的软件包都可以在官方源或者社区源(aur)找到。所以目前来说,Manjaro 应该是除了 macOS,我最佳的选择。

参考

分享一个教科书式的提问方式

今天,收到一封教科书式的提问邮件。坦率地讲,这还是我第一次收到这种逻辑清晰、信息提供到位的提问。所以非常激动,特意水一篇文来和大家分享一下。

邮件原文

Ryan Wang:

你好,我是刚开始使用Halo的程序员。Halo是我接触过最优秀的作品之一,难以置信能够遇到如此优秀的博客系统,在我第一次了解到它的时候,我就决定用它来搭建一个博客。

在我安装好,顺利运行Halo之后,我迫不及待的尝试了几个主题,最后我觉得Journal非常符合我的个人喜好,同时惊喜的发现原来您也在用这款主题作为自己的主页。但随之而来我在这个主题上遇到了一个小问题。

【问题】

当在移动端显示时,博客主题的div向左偏移了一部分,同时最上方的折叠菜单栏无法正确显示,导致上下的中轴线不一样,页面总是左右滑动。

我尝试了自己调试,但在chrome上调整为手机显示后,却是正常,同时这个问题也不是在所有手机上都有问题,我使用了多款手机,发现个别手机上可以正常显示。

【截图】

以下截图为您和主题作者主页的正常截图,标题可居中显示,同时在下滑后可以显示在在折叠菜单栏。

b5870420fb005448b13521e0cb9bfa15

以下是我的博客异常显示截图,标题不居中,下滑后折叠菜单栏也无法正确显示。

  • 图1的空白处还有一个隐藏的链接,也是链接到我的主页,标题div整体偏左。
  • 图2我将标题div边界显示出来了,确实偏左。
  • 图3下滑后折叠菜单栏没有置顶显示。
  • 图4是在chrome的调试模式下能够正确显示。

af6aa871277596b107d4596d9eccabd8

b5870420fb005448b13521e0cb9bfa15

【资源】

  • Halo版本:v1.1.1
  • Journal主题:当前halo-dev/halo-theme-Journal仓库master最新版本,commit id:2747364e50880d44ae4ac8fcb1513352aa199039
  • 尝试过的浏览器:
    • iphone xs: safari、chrome、微信内置浏览器 [均异常]
    • iPhone xs max: safari [异常]
    • Huawei mate30 pro: 自带浏览器、百度浏览器 [均异常]
    • Huawei p20: chrome [正常]
  • 主页地址:http://xxxx(文章中就不写地址了)

由于我对前端相关技术非常不熟悉,自己调试很久都无法使其正确,特此咨询博主是如何解决的,若博主有时间,可否看下之前是否也遇到过类似问题,或是做过何种修改使其正确显示了。

期待您的回信,十分感谢!!

Your fans:xxxx(文章中就不写名字了)
2020年1月5日

为什么写得好?

邮件格式标准

虽说现在很多人(包括我),在发邮件的时候都不会太刻意在乎邮件格式,但是这种格式我看起来就是舒服,也有了阅读下去的欲望。

有问题简述

可以看到,上面的 【问题】 板块中,他有把问题简写为一小段,并特意标注,这样的话我就有可能能一下子了解问题所在,在我脑子里搜索一下是否有遇到过类似的问题。

有问题详细描述

紧接着 问题简述,随后就是问题的详细描述,附有多张截图。并把所有导致的问题全部描述了一遍。

有自己尝试解决问题

从上面的描述就可以知道,他有在桌面版的 Chrome 中调试过主题,也在多款手机的浏览器中调试过,说明他有尝试通过自己解决问题,比如:是否和浏览器有关?是否和设备有关?都很显而易见。

提供了环境信息

他在最后面提供了 Halo 的版本,主题的版本以及 commit id。这是最方便我们定位问题的信息,有可能在某些情况,我们已经在最新版本修复了此问题,所以当你没有提供这些信息的时候,我们往往会问你软件的版本或者主题的版本。

提供了线上地址

这就不用我多说了,这是最直接了当方便我们调试的信息。

总结

我就希望以后有同学抛出问题的时候,能多附带一些信息,比如详细日志,线上地址等等。真的,不为其他的,就为了不耽搁我们双方的时间,从而更加迅猛的帮你解决问题。某些时候真的不是不想解决你们遇到的问题,而且你们给出的信息实在过少,难以判断,而往往这时候我们又要向你问一些详细情况,这样一去一来不就耽搁时间了吗?

另外,感谢这位朋友愿意提供该邮件供我水这篇文章,我认为比我以前水的一些文章有价值多了,感谢。

Terrace House: Aloha State(无剧透)


这个是Netflix原创剧集,日本本土的真人秀,主打特点就是无剧本,讲述3男3女6人在16年末所度过的36周生活。引用官方介绍:

在这部无剧本的真人秀系列中,全新登场的六位陌生人齐聚美丽的欧胡岛,住进同一个屋檐下,并产生了重重矛盾。

之前也是听别人安利的,就目前来讲,我推荐的这部是Terrace House系列的第二部,讲的是发生在夏威夷的故事。这部剧我好早之前(约一年前)就看过它的介绍了(这部剧当时是上了Netflix首页推荐的),当时看了几分钟觉得无聊就没看了,
到最近我才真正开始看,因为感觉特别有趣,所以花了2-3天的时间就看完了。

Terrace House 系列

第一部是:Terrace House: Boys & Girls in the City (Netflix官方介绍链接

幸运的是第三部(Terrace House: Opening New Doors)在今年1.30号也开播了,不过目前只在Netflix日区才播放,中文字幕怕也是没有的。

简单规则 & 介绍

一共六人(3男3女)入住这间公寓,入住期间你可以去任何你想去的地方,做你想做的嗯事情,比如我临时有事去日本也是没问题的,在入住期间也可以去上班什么的。当你在36周内想提前离开的话,节目组称之为毕业,你也可以提前离开,但是会有新人加入补齐3男3女6人的这个配置。一般都是会提前离开的,有的在这里办完了事就离开,有的为了谈一场轰轰烈烈的恋爱,一般都是带着目的来的。

每集35分钟左右,一集代表他们一周的生活。

Netflix 介绍页面(1MB)

看点 & 个人看法

最大的看点当然是无剧本,也就是观察他们六人的真实生活。但刚开始看的时候我就一直思考他们六人是如何做到在摄像机前面保持他们平常生活的状态,又或者说剧组有什么高超的偷拍技巧?不过只要是你接受了这种设定,看起来就很有意思了,慢慢看着你了解了每个人的个性,毕业时或许也会像里面的6人一样恋恋不舍呢。

有时候第一部的人也会来客串,或者这一部刚毕业的人还会回来看望之类的,也算是十分的温情。

一集35分钟左右,里面会插入几段吐槽,非常有趣。

对我自己来说,我个人对于人际交往关系不太了解,看完以后是颇多收获的,对于为人处世也算是小有收获。

还有一点要说的是,就是这部剧特别贴近生活,好像就像自己在里面一样,比如剧中他们去看电影,看的是《神奇动物在哪里》,都是离我们很近的东西,如果在刚开播的时候就看,就会有种仿佛自己身处其中的感觉。另外要说的是,你甚至可以在twitter上看到里面6人的后续动态之类的,基本每个人都有自己的twitter。

如果你真的要去看的话,我建议最好代入里面的角色,以他们的视角看问题。因为是日语,不是中文,对于我的话我有时候会很难理解里面有的人的所做所为,但是只要你试着将日语转换为自己的语言并且站在他们角度再去看的话,或许就会容易理解多一点了。

我去哪里看

目前第一第二部在Netflix可以观看,常理只要Netflix支持的区都有。

第三部在Netflix日区可看,还在放送中,目前只放了第一PART。

另外没有Netflix的朋友可以去B站@人力字幕zu观看,里面有第二部和第三部以及第二部幕后的采访。

最后,看完这部剧对特林德爾·玲奈立马转粉咯!

补充:这里的第一部指的是从Netflix原创剧集开始的

❌