昨晚又吃饱了撑的,又买了个 SSL 证书,给博客配置上了 HTTPS。

对于博客而言,上 HTTPS 其实并没有什么卵用,纯粹是为了信仰。

准备

PositiveSSL

首先你得买个证书。

namecheap 上 PositiveSSL 证书一年只要 9 美元,人民币不到 60。先别急着激活。

域名邮箱

namecheap 的 SSL 证书需要使用你的域名邮箱进行认证。比如域名是example.com,你就需要有一个[email protected]的邮箱。

这里可以去申请免费的 QQ 企业邮箱。按照里面说的,去你的域名托管商那里修改 MX 记录。比较例外的是,我的 .io 域名,不被 QQ 企业邮箱支持。所以我换了网易企业邮箱。网易的比较坑,MX 记录过了好几个小时才生效。

服务器

接下来在你的服务器端生成你的 key。

openssl req -new -newkey rsa:2048 -nodes -keyout example_com.key -out example_com.csr

上面的名字自己看喜好替换。

这时你会有两个文件:example_com.key是你的私钥,一会配置 Nginx 要用;example_com.csr是给 namecheap 的。

激活

复制example_com.csr里面的内容,到 namecheap 的网站上,到你的管理后台,点击 activate。

图1

写域名的话就是你想保护的域名。然后把刚才的 csr 内容贴到框里。服务器类型选 nginx。

下一步之后选择你刚才开通的[email protected]邮箱。

然后就等着收激活邮件,点击激活链接,把邮件里的 token 提交上去。然后这个证书就激活了。

激活之后,namecheap 会给你域名的管理邮箱,有可能是你自己的邮箱,也有可能是刚才的 admin 的邮箱,看你的选择,发送一封邮件,附件是一个证书 .zip 文件。

配置

把上面的 .zip 文件弄到你的服务器上。unzip 解压之后,把这些文件聚合到一个文件里。

cat www_example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

这儿顺序不能错。相应文件的名字自己替换一下。

接下来我们配置 Nginx。

先把证书什么的丢进去。

1
2
3
mkdir -p /etc/nginx/ssl/example_com/
mv ssl-bundle.crt /etc/nginx/ssl/example_com/
mv example_com.key /etc/nginx/ssl/example_com/

修改博客的 nginx 配置,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
listen 443;
server_name 0x01.io;
ssl on;
ssl_certificate /etc/nginx/ssl/0x01_io/ssl-bundle.crt;
ssl_certificate_key /etc/nginx/ssl/0x01_io/0x01_io.key;
# side note: only use TLS since SSLv2 and SSLv3 have had recent vulnerabilities
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# let the browsers know that we only accept HTTPS
add_header Strict-Transport-Security max-age=2592000;
root /home/maemual/public;
access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 1d;
add_header Pragma public;
add_header Cache-Control "public";
}
location / {
try_files $uri $uri/ /index.html;
}
}
server {
listen 80;
server_name www.0x01.io 0x01.io;
return 301 https://0x01.io$request_uri;
}

然后重新加载配置sudo nginx -s reload

注意你的 443 端口开没开啊。

后续

然后你的网站应该就有了 HTTPS。

注意检查一下是否引用了一些 http 的资源。

短小

函数要短小,不超过20行。三四行说清楚最佳。

if 语句、else 语句、while 语句等,其中代码块应该只有一行,就是个函数调用。

只做一件事

函数应该只做一件事。做好这件事。只做这一件事。

每个函数一个抽象层级

函数的语句都在同一个抽象层级上。

Switch 语句

难免会遇到 Switch 语句,让其只做一件事比较困难。

如果要出现,出现在抽象工厂模式底下,用于创建多态对象。

当然要就事论事,偶尔会破坏这条规则。

使用描述性的名称

取个好名字。

函数越短小、功能越集中,就越便于取个好名字。

别害怕长名称。长而具有描述性的名称,要比短而令人费解的名称好。长而具有描述性的名称,要比描述性的长注释好。

选择描述性的名称能理清你关于模块的设计思路。

命名要保持一致。

函数参数

参数要少。尽量避免三个以上的参数。

惯于通过参数输入数据,通过返回值输出。避免输出参数。

避免向函数传入布尔值。宁愿分成两个函数。

如果函数需要两个、三个或者三个以上的参数,说明其中的一些很有可能需要封装成类了。

无副作用

分隔指令与询问

函数要么做什么事情,要么回答什么事。函数应该修改某对象的状态,或者返回该对象的有关信息。不要二者同时做。

使用异常替代返回错误码

ps: Golang 表示不服。

抽离 Try/Catch 的代码块,另外形成一个函数。

别重复自己

结构化编程

每个函数、函数中的每个代码块都应该只有一个入口、一个出口。

但是对于小函数意义不大。只要函数保持短小,偶尔的 return、break 或者 continue 没有坏处。

避免 goto。

如何写出如上所说的函数

先想写什么就写什么,然后再去打磨。

并不认为一开始就按照规则写函数,没人做的到。

基本思想是变量名、方法名要做的见名知意,做到名字就可以自解释。

名副其实

名字要表达其作用。

单字母的 a、b、c、d 这种变量名当然是要杜绝的。

莫名其妙的一个数字当然也是不好的。用有意义的宏,或者常量来代替。

theList这种变量名,什么意义都没有表达,莫名其妙的名字也是很糟糕的。改成更有意义的如gameBoard这样的名字。

避免误导

例如 hp、aix 这种专有名字,最好就不要用来表示自己的变量名。容易产生误导。

accountList 这种带类型的名字,如果真的是 list 类型,还稍微好点,万一不是用 list 实现的,那就会造成误导了。

小写字母 l 和大写字母 O 就不说了,遇到某些字体,和数字 1 和 0 就没法分了。

做有意义的区分

a1、a2 这种不知所云就不说啥了。改成 source 和 destination 就会比较明显了。

不要用废话区分。比如 ProductInfo 和 ProductData,看似名字不一样,但是表达的意思其实基本是一样的。

使用读的出来的名称

genymdhms(生成年月日时分秒)你知道表达什么嘛。换成generationTimestamp呢。

使用可搜索的名称

如果有个变量名叫e,在一大段代码里,怎么找出来所有用到的地方呢?

避免使用编码

变量名不用带上类型了。

反对匈牙利命名法。

不需要使用m_这样的前缀表明是成员变量了。

接口也不需要用I开头

避免思维映射

不应当让读者在脑子里把你的名称翻译成他们熟知的名称。

类名

应该用名词或者名词短语,不应当用动词。

方法名

方法名应该是动词或者动词短语,比如postPaymentdeletePage

别扮可爱

不要卖萌。HolyHandGrenade有人知道是干嘛的么?

不要用不常用的俚语。比如不要用whack来表示kill

每个概念对应一个词

要用get就全都用get,不要fetchretrieveget这种含义相似的词混用。

别用双关语

避免将一个词用于不同的目的。比如很多类都有 add 这个方法,该方法通过增加或者连接两个现存的值来获得新的值。如果有个新的类,有一个方法是将某个元素增加到某个集合中。这时就不要也用 add 了。换个例如 append,insert 的名字。

使用解决方案领域的名称

你的代码只会有别的程序员才读。所以尽管使用领域相关的名称。比如JobQueue

使用源自所涉问题领域的名称

如果不能用自己熟悉的领域的术语来命名,就采用从所涉问题领域而来的名称吧。

添加有意义的语境

变量名最好在一定的语义下。例如firstNamelastNamestreethouseNumbercitystatezipcode在一起的时候,你就很容易明白这表示的是地址。

如果上下文语义不够,可以考虑给变量名加前缀的方法。例如addrFirstName。当然,更好的方案是有一个 Address 的类。

不要添加没用的语义

如果有个应用叫『加油站豪华版』(Gas Station Deluxe),那么给每个类都加一个 GSD 的前缀就是纯属吃饱了撑的。

for friends

hexo 是最近比较流行的一种快速、简洁高效的纯静态博客。回顾自己的博客历程,一开始使用最流行的 Wordpress。后来嫌太庞大,用起来麻烦。后来换了稍微小清新一点的 typecho。不过也就是程序本身小清新一点,但思路依然是老一套。让我讨厌的原因是依赖 MySQL,在我们这种小 vps 机器上,太吃资源了。而且迁移备份部署都比较费事。

hexo 这种纯静态博客好处就是简单。写博客就是写 markdown 文件,备份迁移把这些 markdown 文件备份好就行了。我是直接把博客项目直接扔在了 Dropbox 的目录里。

网上很多教程都是教如何在 Github 或者 Gitcafe 这类 git 托管网站上部署的。教程太多,这里就不赘述。这里介绍一下如何部署在自己的 vps 上。其实更加简单。

安装

首先在本地自己的电脑上装个 hexo,教程见官网,这个就没啥好说的。

建站配置

同样如官网这里这里

本地生成

使用hexo new [layout] <title>创建新的文章之后,就可以用你喜欢的任何编辑器去修改生成的文件了。

写好之后,使用hexo generate命令,简写是hexo g,生成 html。完成之后,在当前目录下会有一个public文件夹,这个就是我们整个博客的内容了。部署用它就行了。

然后就要把这个public文件夹上传到你的 vps 上。具体是用 rsync 还是 WinSCP 等工具,这就各异了。

部署

public目录上传到 vps 上来。我们假设其目录是/home/xxx/public

先装个 Nginx。

1
2
sudo apt-get update
sudo apt-get install nginx

创建 Nginx 配置文件sudo vim /etc/nginx/conf.d/blog.conf。最后的blog.conf文件名随意。

写入我们的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 80;
server_name example.com; # 自己的域名
root /home/xxx/public; # 刚才说的路径
access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
# 这里是针对静态资源文件做个缓存
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 1d;
add_header Pragma public;
add_header Cache-Control "public";
}
# 这里就是把请求转给我们的静态文件了
location / {
try_files $uri $uri/ /index.html;
}
}

保存之后,重新加载 Nginx 配置sudo nginx -s reload

基本的配置就到此 OK 了。可以看到效果了。

以后写新的文章,在本地写完之后,用hexo g生成一下,然后把public目录上传上来就可以了。

需求

内网的服务越来越多,记 IP 地址太烦。

局域网内可以通过域名访问内网的服务,并且可以通外网

背景假设

DNS 所在的服务器的 IP 是192.168.1.1,内网的机器是192.168.2.1,需要分配域名host1.in.example.com;另一个内网机器192.168.3.1,需要分配域名host2.in.example.com

一般情况下,都是配置主、从两个 DNS 服务器的,方式挂掉影响服务。但是由于我比较懒,所以只配置了一个主服务器。如果需要配置从服务器,可以看参考文章,和主服务器配置方法基本相同。

阅读全文 »