Reading view

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

使用 Meilisearch 提升 Halo 网站的搜索体验

原文地址:https://www.lxware.cn/archives/halo-meilisearch

Halo 从 2.0 版本开始支持了全文搜索功能,自带的 Lucene 搜索引擎在轻度使用场景下可以满足需求,但在重度依赖搜索功能的场景下,可能在搜索速度和用户体验上存在不足,这时我们会更推荐使用独立的搜索引擎。

本文将介绍如何使用 https://www.meilisearch.com/ 搜索引擎来提升 Halo 网站的搜索体验。

搭建 Meilisearch 服务

部署 Meilisearch 服务通常有两种方式:你可以选择自行在服务器上托管,或者使用 Meilisearch 官方提供的云服务。

云服务

访问 https://www.meilisearch.com/cloud 注册账号,根据引导创建项目。创建完成后,可以在控制台获取实例地址和 Master Key。

需要特别注意 Meilisearch 云服务的计费方式。

自托管

下面介绍两种常见的部署方式:

使用 Docker Compose 独立编排部署

这种方式适合多个项目需要同时使用一个 Meilisearch 服务的场景。 部署完成后,你可以配置域名和反向代理来暴露服务到公网。

services:
  meilisearch:
    image: getmeili/meilisearch:v1.15
    restart: unless-stopped
    ports:
      - "7700:7700"
    environment:
      - MEILI_ENV=production
// [!code highlight]
      - MEILI_MASTER_KEY=<your-super-secret-master-key-here>
    volumes:
      - meilisearch_data:/meili_data

volumes:
  meilisearch_data:
    driver: local

与 Halo 的 Compose 编排一起部署

结合 使用 Docker Compose 部署 Halo 的示例,将 Meilisearch 服务添加到 docker-compose.yml 文件中。

通过这种方式部署之后,插件设置中的 Meilisearch 服务地址 应该是 http://meilisearch:7700(即服务在同一 Compose 网络下可通过服务名访问)

meilisearch:
  image: getmeili/meilisearch:v1.15
  restart: on-failure:3
  networks:
    - halo_network
  volumes:
    - ./meilisearch-data:/meili_data
  environment:
    - MEILI_ENV=production
// [!code highlight]
    - MEILI_MASTER_KEY=<your-super-secret-master-key-here>
点击查看完整示例
version: "3"

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.21
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      - --halo.external-url=http://localhost:8090/
  halodb:
    image: postgres:15.4
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=openpostgresql
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo
// [!code focus:10]
  meilisearch:
    image: getmeili/meilisearch:v1.15
    restart: on-failure:3
    networks:
      - halo_network
    volumes:
      - ./meilisearch-data:/meili_data
    environment:
      - MEILI_ENV=production
      - MEILI_MASTER_KEY=<your-super-secret-master-key-here>

networks:
  halo_network:

详细的部署方式可以参考 Meilisearch 官方文档:https://www.meilisearch.com/docs/learn/self_hosted/install_meilisearch_locally

安装插件

之前 Halo 社区中已经有人开发了 Meilisearch 插件,但已经不再维护,因此这里我们选择使用 Halo 官方提供的插件。

  1. 下载插件,目前提供以下两种下载方式:

  2. 安装插件,插件安装和更新方式可参考:https://docs.halo.run/user-guide/plugins

配置插件

  1. 进入插件设置,配置 Meilisearch 服务地址Master Key索引名称 可以选择使用默认的 halo 或者自定义(如果你的 Meilisearch 服务会被多个项目使用,建议自定义索引名称)。

  2. 进入插件扩展配置,在 扩展点定义 中选择 搜索引擎,然后选择使用 Meilisearch。

数据概览

配置完插件后,我们可以进入插件的 数据概览 页面,查看 Meilisearch 的索引数据。

在这个页面中,你还可以重建索引或测试搜索功能。

对比

Lucene(默认搜索引擎)与 Meilisearch 的实际对比:

Meilisearch

Lucene(默认)

meilisearch-compare-2.png

通过实际使用可以发现,Meilisearch 的搜索结果更加准确,搜索速度更快,并且支持更灵活的搜索语法,无需用户掌握复杂的搜索表达式即可获得理想的搜索结果。

注意

  1. 如果配置完 Meilisearch 插件之后无法搜索,可以尝试重建一次索引。

  2. 安装 Meilisearch 插件之后仍然需要https://www.halo.run/store/apps/app-DlacW插件,Meilisearch 插件仅仅是提供服务,不会提供 UI。

在 Halo 中导入 Markdown 和 Word 文档

原文地址:https://www.lxware.cn/archives/halo-content-tools

在 Halo 社区中,导入 Markdown 和 Word 文档的需求一直很高,但社区一直缺乏完善的解决方案。其主要原因在于 Markdown 和 Word 的文档格式较为复杂,难以完美支持所有格式特性,且图片资源的处理存在技术难点。

现在,社区中已经有了一个插件可以很好地支持导入 Markdown 和 Word 文档,它就是 https://www.halo.run/store/apps/app-SUvBR。该插件不仅支持导入 Markdown 和 Word 文档,还能够智能处理和导入图片资源,为用户提供了完整的文档迁移解决方案。

安装

可以通过以下两种方式安装插件:

  1. 访问 https://www.halo.run/store/apps/app-SUvBR 页面直接下载

  2. 在 Console 内置的应用市场中搜索 内容助手 进行安装

内容助手插件

导入 Markdown 文档

安装并启用插件后,就可以在 Console 侧边菜单的工具中找到 文章导入 的入口。点击进入后,选择 Markdown 导入 选项卡即可开始导入,如下图:

功能详解

  1. 选择 Markdown 文件:用于选择单个 Markdown 文档,支持 .md 格式文件。

  2. 选择 Markdown 文件夹:用于选择包含 Markdown 文档的文件夹。选择文件夹后,系统会自动扫描其中的所有 Markdown 文档以及图片资源(如有)。

  3. 选择图片文件夹:用于选择 Markdown 文档中引用的图片资源。选择文件夹后,系统会自动扫描其中的所有图片资源并在导入时自动关联。

  4. 转为富文本格式:默认情况下,导入的 Markdown 文档会保持原有的 Markdown 格式。如果勾选此选项,系统会将文档转换为富文本格式,便于后续使用 Halo 的默认编辑器进行编辑。

使用场景

  • 从其他博客平台或写作工具迁移文章内容

  • 导入使用本地 Markdown 编辑器创作的文章

  • 批量导入历史文档和资料

注意事项

  1. 导入 Markdown 文档后,如果需要在 Console 中编辑文章,请确保已经安装了任意一个 Markdown 编辑器插件,否则无法正常打开编辑页面。

  2. 如果 Markdown 文档中引用了本地图片资源,请在导入前选择存放图片的文件夹,否则图片将无法正确上传和关联。

  3. 系统支持自动解析 Front Matter(文档头部的元数据),包括标题、别名(slug)、描述、摘要、分类、标签等信息。

操作示例

选择 Markdown 文件:

选择图片文件夹(如果文档包含本地图片):

点击导入,等待导入完成:

检查文章与图片资源是否导入成功:

导入 Word 文档

进入 文章导入 页面后,选择 Word(.docx)导入 选项卡,如下图:

功能详解

  1. 选择 Word 文档:用于选择单个 Word 文档,支持 .doc.docx 格式。

  2. 选择 Word 文档文件夹:用于批量选择包含 Word 文档的文件夹。

  3. 转为 Markdown 格式:默认情况下,导入的 Word 文档会转换为富文本格式。如果希望后续使用 Markdown 编辑器编辑文章,请勾选此选项将内容转换为 Markdown 格式。

使用场景

  • 将公司内部的 Word 文档转换为博客文章

  • 配合 https://maxkb.cn/ 智能知识库,建立企业知识管理体系

  • 从传统文档工具迁移内容到现代化的管理平台

注意事项

  1. 由于 Word 文档格式的复杂性,系统可能无法完美解析所有内容格式,建议导入后进行适当调整。

  2. 系统支持自动导入 Word 文档中的图片资源,但其他类型的嵌入对象暂不支持。

  3. 图片会上传到与个人中心关联的存储策略,请提前在用户设置中配置相关参数。

操作示例

选择 Word 文档:

点击导入,等待导入完成:

检查文章是否导入成功:

丰富的内容管理功能

除了核心的导入功能,内容助手还提供了丰富的内容管理功能:

格式转换

支持 Markdown 与富文本格式的双向转换,让用户可以根据编辑需求灵活切换文档格式。你可以在文章管理页面点击文章的 ··· 按钮,在转换菜单中选择相应的格式转换选项,也可以在文章编辑页面顶部的编辑器选择框中选择 内容格式转换器 进行转换。

文章导出

支持将文章导出为多种格式,方便内容备份和分享:

  • 以原格式导出:保持文章的原始格式进行导出

  • 转换为 Markdown 并导出:将文章转换为 Markdown 格式后导出

  • 转换为 PDF 并导出:将文章转换为 PDF 格式进行导出

文章克隆

提供文章克隆功能,便于基于现有文章创建相似内容。克隆后的文章会自动在标题后添加"(副本)"标识,并生成新的别名以避免冲突。

以上功能都可以在文章管理页面点击文章的 ··· 按钮找到相应选项。

总结

内容助手插件为 Halo 用户提供了完整的文档导入和内容管理解决方案,有效解决了 Markdown 和 Word 文档的导入难题。插件不仅支持智能处理图片资源,还提供了格式转换、文章导出、文章克隆、内容复制等丰富功能,能够满足大部分用户的内容管理需求。

无论你是从其他平台迁移内容,还是需要批量导入历史文档,内容助手都能为你提供便捷、高效的解决方案。如果你有文档导入或内容格式转换的需求,欢迎尝试使用内容助手插件。

通过 1Panel MCP 自动部署静态网站

原文地址:https://www.lxware.cn/archives/1panel-mcp

引言

随着大语言模型(LLM)技术的快速发展,我们正在见证软件开发领域的一场革命。从 ChatGPT 到 Claude,从 GitHub Copilot 到各种 AI 编程助手,人工智能正在深刻改变着开发者的工作方式。

在这个 AI 驱动的时代,Agent(智能代理)概念应运而生。Agent 不仅能理解自然语言指令,还能执行复杂的任务流程,真正实现了"对话式编程"的愿景。而 MCP(Model Context Protocol)作为连接 AI 模型与外部工具的标准协议,为构建强大的 AI Agent 提供了技术基础。

MCP 的出现解决了一个关键问题:如何让 AI 模型安全、高效地与各种外部系统交互。通过标准化的协议,开发者可以创建各种 MCP 工具,让 AI 助手能够执行文件操作、API 调用、数据库查询等复杂任务。

本文将介绍如何使用 https://github.com/ruibaby/1Panel-mcp 工具,在 AI 编辑器中实现自动将网站项目部署到 1Panel 中。

配置

https://github.com/ruibaby/1Panel-mcp 中只提供了一个工具,即 deploy_website,用于将静态网站项目部署到 1Panel 中,并支持自动创建网站配置。下面将主要介绍在 VSCode 和 Cursor 中如何配置并使用此工具。

VSCode:

打开 VSCode 的配置文件,添加以下配置:

{
  "mcp": {
    "inputs": [],
    "servers": {
      "1panel-mcp": {
        "command": "npx",
        "args": [
          "-y",
          "1panel-mcp"
        ],
        "env": {
// [!code highlight:3]
          "ONEPANEL_API_KEY": "TOSXWBVfcG7dLlD1Gj0DK5D4L9tKz6FF",
          "ONEPANEL_BASE_URL": "http://127.0.0.1:34300/",
          "ONEPANEL_API_VERSION": "v2"
        }
      }
    }
  }
}

配置完成后保存,然后在 Copilot Chat 的界面可以看到 1panel-mcpdeploy_website 工具,即代表配置成功。

Cursor:

打开 Cursor 的设置界面:

然后在 MCP 配置文件中添加以下配置:

{
  "mcpServers": {
    "1panel-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "1panel-mcp"
      ],
      "env": {
// [!code highlight:3]
        "ONEPANEL_API_KEY": "TOSXWBVfcG7dLlD1Gj0DK5D4L9tKz6FF",
        "ONEPANEL_BASE_URL": "http://127.0.0.1:34300/",
        "ONEPANEL_API_VERSION": "v2"
      }
    }
  }
}

然后回到设置界面,可以看到 1panel-mcpdeploy_website 工具,即代表配置成功。

参数说明

  • ONEPANEL_BASE_URL: 1Panel 的 API 地址

  • ONEPANEL_API_KEY: 1Panel 的 API 密钥,可以在 1Panel 控制台设置中获取

  • ONEPANEL_API_VERSION: 1Panel 的 API 版本,可选值为 v1v2,默认值为 v2

使用

配置完成后,我们就可以打开任意的静态网站项目并测试这个 MCP 工具,可以使用以下提示词:

# 将当前项目部署到 1Panel 中,域名为 halocms.net。

需要注意,如果你指定的域名不存在,工具会自动创建一个新网站,并设置指定的域名。

演示

为了方便演示,我创建了一个新的 Vue 项目,并让 AI 帮我部署到 1Panel,以下是完整过程:

部署完成后,我们回到 1Panel 后台就可以看到新创建的网站和上传的文件:

后续我们完善了项目后,也可以让 AI 再次部署:

总结

通过以上演示,我们可以看到,使用 1Panel-mcp 工具,我们可以让 AI 自动将静态网站项目部署到 1Panel 中,并支持自动创建网站配置,大大提高了开发和部署效率。

参考

探讨如何为开源项目提交 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 中回复。

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。这是最方便我们定位问题的信息,有可能在某些情况,我们已经在最新版本修复了此问题,所以当你没有提供这些信息的时候,我们往往会问你软件的版本或者主题的版本。

提供了线上地址

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

总结

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

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

❌