在 2020 年 4 月 29 日,我代表 Linux 中国社区前往 Ubuntu Release Party 上进行分享
本次分享的主题是 如何围绕 Linux 构建社区,介绍了开发者如何打造自己的社区。
分享的 PPT 如下,你也可以点击上方的链接,到 Google 幻灯片中查看































在 2020 年 4 月 29 日,我代表 Linux 中国社区前往 Ubuntu Release Party 上进行分享
本次分享的主题是 如何围绕 Linux 构建社区,介绍了开发者如何打造自己的社区。
分享的 PPT 如下,你也可以点击上方的链接,到 Google 幻灯片中查看
































Vercel 是我自己非常喜欢的平台,我自己的一些项目都会选择使用 Vercel 来部署。比如 Logoly、EasyWPBook 等等。
主要是其在中国大陆的访问速度是比 Netlify 和 Github Pages 更快。但不得不说的是,Vercel 提供了 Production 环境和 Development 环境,对于项目开发时是非常有用的,当你提交一个 commit 或者是一个 PR 时, Vercel 会自动帮你部署,并将相应的 URL comment 到你的 commit 或 PR 下,你只需要点击相应链接,就可以预览效果,十分方便。
但 Vercel 的 Teams 功能是付费的,对于一些 Organization 来说,你需要付费用 Vercel 成本是比较高的。特别是如果你是一个 OpenSource Project,你大概率入不敷出。在这种情况下,如何才能在 Organization Project 中免费使用 Vercel 呢?我考虑了一个绕过去的方法。
我们之所以无法使用在项目中无法免费使用 Vercel 是 Vercel 的产品策略问题。

而我们被禁用的无法使用官方自建的 Github Apps 来部署,但不意味着我们不可以自己实现这样的逻辑,来实现在组织内项目进行push。
而想要达成这样的效果,需要你具备两个条件
而前者,可以通过 Github 提供的 Action 来完成。后者则可以通过编写代码来完成。不过好在,我在 Github 的 Marketplace 中找到了别人已经写好的 Action ,因此又可以少写一些代码(开心?)。
接下来,看看具体要如何操作。
在进行后续的操作之前, 你需要先安装配置过程中的依赖。
执行如下命令安装 Vercel CLI
npm i -g vercel
为了正常部署,你需要创建一个项目,并将其 push 到 Github。当然,如果你已经创建好了项目,就直接把项目 Clone 到本地就好。
这一步是为了在 Vercel 上创建一个项目,因为 Vercel 不支持通过网页端创建项目,只支持在 CLI 或通过 Git 接入自动创建。
在你的项目根目录,执行命令 vercel 来触发 Vercel 的部署,它会自动上传你的项目到 Vercel 。如果你之前登录过,会看到类似这样的界面,根据其提示进行配置就好。如果你之前没有登录过,你登录后会出现类似的界面。根据提示进行配置。

想要部署一个项目到 Vercel ,你需要知道三样东西
其中,Access Token 你需要从 Vercel 后台的 Tokens 页面获取。

而 Org ID 则可以从你的项目中的 .vercel/project.json 中获取。你会获得类似下面这样的内容,其中的 OrgID 就是你在 Vercel 上的 ID ,而 Project ID 就是对应的项目 ID。
{"orgId":"r359XAnYONVAmiXtdxZ22A2E","projectId":"Qma3GdwoiAfJSsbsSydBgaCDh8LJj6wTWvvqpUwrN6J2F3"}
Code language: JSON / JSON with Comments (json)准备好了这三项以后,就可以进入到下一个环节,配置 Action Secret 了。
Github Action 提供了 Secret 的机制,用来让你保存哪些安全密钥,避免直接写在 Action File 中,出现泄漏的可能。
打开你的项目的 Settings – Secrets 页面

在这里你可以新增 Secret ,你需要新增三个 Secret ,分别是
ORG_ID: 填写你从 .vercel/project.json 中获取到的 orgId;PROJECT_ID:填写你从 .vercel/project.json 中获取到的 projectId;VERCEL_TOKEN:填写你从 Vercel 后台生成的 Token。这样,就配置好了 Secret ,接下来就可以在你的项目中加入 a、Action 配置文件,完成项目的配置。
根据 Github 的规范,你需要将你的 Action 配置文件放置在项目根目录的 .github/workflows/xxx.yml 文件中,其中 xxx 是你的 Action 名,比如叫 vercel.yml 。
这里我使用的是 ngduc 写的 vercel-deploy-action
按照路径创建好 vercel.yml 文件,然后在其中加入如下代码
name: deploy website
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ngduc/vercel-deploy-action@master
with:
vercel-cli: vercel
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.ORG_ID}}
vercel-project-id: ${{ secrets.PROJECT_ID}}
github-token: ${{ secrets.GITHUB_TOKEN }}
粘贴进去以后,将 vercel.yml 添加到 git 控制中,并提交到 Github 上,就可以实现触发 Vercel 了。
虽然 Vercel 本身不能免费提供 Organization 的支持,但是我们可以通过一些小的技巧,绕过其官方的配置。对于一些只是将 Vercel 配置为开发者预览的场景下来说,还是足够的。
但如果你希望将 Vercel 配置为生产环境,那么 Teams Plan 可以提供的更多的权限控制,会是你需要的,买一个,也不贵,是吧?


hexo-generator-podcasts 是我近期开发的一款 Hexo 的播客生成器插件,hexo-generatro-podcast 可以帮助你在你的 Hexo 博客中加入播客的功能,你可以通过简单的配置,在自己的博客中加入播客的配置,轻松上架播客。
不仅如此,如果你需要部署多个播客,也可以直接借助这个插件,在一个站点中部署多个播客,特别适用于一些大型的播客组织,可以在一个站点同事部署多个播客。
如果你感兴趣,不妨去试试看: https://github.com/bestony/hexo-generator-podcasts/
此外,我自己的播客生产力维基,就是使用这个插件构建的。

$this->need("xxx");
// 提供插件的Hook
$this->footer();可以创建 category 、page目录,根据名字自动加载不同的模板
文章为post目录,根据ID自动加载不同的模板
有用的themeFields


define('__TYPECHO_DEBUG__',true);
打开 Debug 模式
define('__TYPECHO_SECURE__', true);强制SSL
define('__TYPECHO_GRAVATAR_PREFIX__', 'https://myavatar.com/avatar');
Avatar 前缀
为什么要看腾讯的视觉设计方案?
体系化的品牌设计对于你做自己的品牌设计有一定的帮助。
都是来自于 Confluence 的模板,供写作参考。
这些模板我提供的都是图片,而非文本,一方面是其内容并非简单的通过一个文本就可以展示。对于真实的使用场景,可能你依然需要使用诸如 Notion、Coda、Evernote 之类的工具来展现。另一方面,这个模板更多是帮助你思考,如果我在做类似的事情的时候,可以加入哪些模板。
此外, Notion 也提供了不少的 Template ,值得你在使用的时候参考。







关键词表






















实际上,Confluence 中还有大量的模板,不过我发现, Confluence 可以免费使用,所以,just register it,and use it。
最近我在开发一个 Hexo 插件,在开发的过程中,遇到了一些小的问题:插件的代码发生了修改,但运行hexo 的时候却没有实时刷新出来。
在对代码进行分析后发现,hexo 的 tag filter 的结果会缓存在数据库中,由于缓存了,所以我使用的 generator ,所以也会被缓存。
在预览前,删除 db.json 即可让 hexo 重新开始生成
为了方便,我在 npm 的 scripts 中加入了一个自定义的配置
{
...
"scripts":{
...
"s": "rm db.json && hexo server"
...
}
...
}
Code language: JavaScript (javascript)
最近在参与 WavPub 的开发,在开发的过程中,需要调整 XML 的结构,因此,需要为一些字段加入 CDATA 的支持。
在阅读了 eduncan911/podcast 中的代码后发现,这个包在生成 XML 的时候,使用的是 Golang 核心库中的 encoding/xml 包,而这个包在使用的时候有一个问题,你可以给其字段加入 ,cdata 来完成加入 cdata 的标签,但问题在于,他的实现是,在你的字段外部加标签,而不是内部加标签。举个例子来说,就是,如果你定义了字段为 xml:”category,cdata” 你得到的会是
<![CDATA[ somecode ]]>
Code language: HTML, XML (xml)而非我们想要的
<category> <![CDATA[ xxx ]]> </category>
Code language: HTML, XML (xml)想要解决这个问题,就需要你在你的字段中实现一层包裹,在其自动生成的 CDATA 外层加入一层 XML ,这样就可以实现我们想要的效果,比如说我上面的效果可以通过定义一个新的 Description 的 Struct 来实现
package podcast
import "encoding/xml"
// Description represents text inputs.
type Description struct {
XMLName xml.Name `xml:"description"`
Text string `xml:",cdata"`
}
Code language: JavaScript (javascript)然后,再在需要的地方,加入相应的引用就好
type Podcast struct {
XMLName xml.Name `xml:"channel"`
...
Description *Description
...
}
Code language: JavaScript (javascript)