利用阿里云 OSS 作为 Ghost 的存储空间

Ghost 可以使用自定义存储适配 (Custom storage adapter)来自定义文件存储的方法。事实上,目前有现成的项目可以使用,原版是 MT-Libraries/ghost-oss-store,但是推荐使用 fancyer/ghost-oss-store 这个改进版,它们的差别在于,原版没有重写 read 方法,因此从 OSS 读取文件时无法进行鉴权操作,这样你就必须开启 OSS 的公共读权限才能正常获取文件。新版增加了 read 方法,可以正常进行鉴权操作。

同时,由于这个项目长时间没更新,新版 Ghost 配置方法会有点小的区别。本文按照成文时的最新版本为 2.19

简要步骤如下:

  1. 安装项目到你的 Ghost 。
  2. 配置 OSS,上传 ssl 证书。
  3. 修改 Ghost 配置文件并重启 Ghost。

安装

阅读全文

Ghost 注册多域名 ssh 证书

注册多域名 ssh 证书,主要是为了实现 ghost 博客系统的 oss 存储(利用阿里云 oss 存储 ghost 上传的静态资源),基于一篇文章只讨论一个具体内容的原则,这部分内容将在后面的文章中进行描述。

注册多域名的 ssh 证书

Ghost 是自带了生成 ssh 证书的功能的,不需要用户手动操作,但生成的证书只有一级域名。

服务器为 Ubuntu 16.04,客户端为 Mac OS 终端环境(类似 Linux)。

简要步骤如下:

  1. 将你需要验证的域名全部解析到你的服务器。
  2. 设置 Nginx,使得所有域名的 http 请求都可以访问存放验证文件的文件夹。
  3. 调用 /etc/letsencrypt/acme.sh 生成证书,此方法是 ghost 内部使用的方法,与 ghost 整个系统兼容,因此不用进行额外的配置。
  4. 恢复 N

阅读全文

Python 多进程在 windows 和 unix 之间的差异

我们都知道,在 unix 系统(Linux, Mac OS)中,multiprocessing 模块使用 os.fork 来创建多进程。这个命令会把当前的整个内存空间复制一份,相当于在同一个时间节点分叉成了两个时间线,它们的初始状态是完全相同的,即拥有相同的历史。因此,我们可以在主进程和子进程内访问到相同的变量。

但 Windows 系统却不一样,由于缺少了 os.fork 方法,因此实现方式与 unix 系统有所差异,因此可能与你的预期不相符合。

保证主模块能被安全引入

举一个简单的例子:

# main.py
import multiprocessing
import os

def say_hello():
    pid = os.getpid()
    print('Process %d say: hello

阅读全文

语义化版本 2.0.0

转载自语义化版本-2.0.0,版权归原作者所有。

摘要

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  1. 主版本号:当你做了不兼容的 API 修改,
  2. 次版本号:当你做了向下兼容的功能性新增,
  3. 修订号:当你做了向下兼容的问题修正。

先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

简介

在软件管理的领域里存在着被称作“依赖地狱”的死亡之谷,系统规模越大,加入的包越多,你就越有可能在未来的某一天发现自己已深陷绝望之中。

在依赖高的系统中发布新版本包可能很快会成为噩梦。如果依赖关系过高,可能面临版本控制被锁死的风险(必须对每一个依赖包改版才能完成某次升级)。而如果依赖关系过于松散,又将无法避免版本的混乱(假设兼容于未来的多个版本已超出了合理数量)。当你专案的进展因为版本依赖被锁死或版本混乱变

阅读全文

Python 的包管理利器:pipenv

众所周知,Node 项目自带 npm 包管理机制,能够有条理的处理项目的依赖,在项目移植的时候可以很方便的建立起一致的工作环境。但 python 并没有自带类似的包管理系统。之前对待 python 项目都是采用暴力方法,运行的时候看到哪个包报错就安装哪个包,由于也不是经常把项目移来移去,倒也没有太大影响。但不管怎么说,这种方法毕竟不够规范和优雅,也无法保证工作环境的一致性。

pipenv 就是一个和 npm 类似的包管理机制。简单的讲它有两方面的功能:一是虚拟环境的创建和管理,类似于 virtralenv;二是一个包管理系统,类似于 npm。你可以利用它为每个项目创建不同的虚拟环境,在每个虚拟环境中,你可以使用不同版本的 python 解释器和安装不同的依赖,而不会互相影响。它可以生成 pipfile 和 pip

阅读全文

利用相对单位构建 Vue 项目

这次公司的产品要参加某国际展会,需要为产品做一个 Demo 软件对其进行控制和展示(采用 electron + vue 的架构),这就跟平常的需求不同了。一般来说,响应式适配通常是保持内容元素的大小不变(或变化较小),而改变内容显示区域的大小以显示更多/更少的内容。而在展会上,考虑到观众是从远处观看屏幕,而且内容是固定的,因此合适的解决办法是等比例缩放所有内容,这样在笔记本上进行配置和在大显示器上进行展示时,都能获得较好的显示效果。

要等比例适配 UI,那就需要用到相对单位。在 CSS3 中,新增了许多相对单位,例如 rem, vw, vh, vmin, vmax 等。

目前传统中使用较多的方法是使用 rem,它以根元素字体大小作为单位。如果我们要根据窗口宽度来等比例缩放所有元素,就必须使用一段 js 代码,来动态

阅读全文

简讯:Necessarius - 必要な悪

这两天终于开始了 Ghost 主题的开发,选取了官方一个最精简的主题 Attila 作为基础,主要是有个基本框架。

Ghost 真的是一个值得令人兴奋的博客系统。它采用了模版化的语言进行构建,结构清晰,html 和 js 分离,不仅开发的时候简单快速,运行起来也有很高的效率。同时,它的后台界面也更现代化,可以使用 MarkDown 语言进行写作。

新的主题命名为了 Necessarius,查了一下,好像这并不是一个单词…然后到万网查了下域名,com 和 org 都被注册了… 都是明年到期,我已经设置好提醒事项了,这两个网址都没有在使用,看提示信息,一个是被加拿大的英语使用者注册了,一个是被日本人注册了…希望能够抢到。

目前暂时完成了 Typo 的部分,现在更适合中文阅读了,代码的字体采用了我最喜欢的 SourceCo

阅读全文

为什么编号应该从 0 开始

本文(译文)转载于 Docle の Blog,版权归原作者所有

前言

在我们平时接触使用的大多数编程语言中,编号都是从 0 开始的。接受了这是一个惯例后,很少有人会去想为什么是从 0 开始?如果这是惯例,为什么不是其他的惯例呢?Edsger W. Dijkstra 教授的这个小备忘录也许可以解开我们的疑惑。

原文链接:http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

译文

为了不使用有害的三点(…)表示一个自然数的子序列 2, 3, …, 12,我们有四个惯例:

a) 2 ≤ i < 13

b) 1 < i ≤ 12

c) 2 ≤ i ≤ 12

d) 1 ≤ i ≤ 13

是否有理由让我们更喜欢其中的一个惯例呢?Yes。观察可得

阅读全文

前言

这个变化是关于“个人网站究竟有什么价值”的思考。最后的答案是,它的价值在于记录而非讲述,或者说,它不是给人看的,因为没人真心愿意去看。

因此,删除了原先 wordpress 站的数据,选用了更先进的 Ghost,来进行开发。关键词是 “手帐 & 笔记”。也就是:每天日常活动的简要记录,以及供随时随地查阅的笔记。同时,除了留言板,将不会有任何可以进行互动的元素,例如文章评论。

在最终完成之前,就这么挂着吧。另外,也许永远都不会完成,毕竟这不是件非做不可的事——何况我还得学学 ghost 的主题怎么写的,虽然比 wordpress 那种史前时代的架构简单多了。

阅读全文