RAID 全称 Redundant Array of Independent Disks,独立冗余磁盘阵列,将多块独立物理硬盘按不同方式组合形成一个逻辑硬盘,提供比单盘更高的存储性能和数据备份。RAID 是为了减少数据丢失而发明的一种方法。
至少需要两块物理硬盘,将数据以位或者字节分割,并行地读 / 写到磁盘(英文的术语叫做 stripe),但是没有数据冗余,当其中一块硬盘故障时,所有数据无法恢复。假设有两块物理硬盘前提下,读写速度提高 2 倍,数据安全性降低 2 倍。
RAID 0 不适用于数据安全性高的场合。
RAID 1 至少需要两块物理硬盘实现,通过磁盘数据镜像冗余,在成对的独立磁盘上互为备份,用简单的话讲就是通过冗余一份或多份数据的方式提高数据安全性。原始数据繁忙时,直接从镜像拷贝数据,RAID 1 可以提高读取性能。假设两块物理硬盘前提下,存储空间只能利用 50%,单位成本最高,提供很高的数据安全性和可用性,当其中一块硬盘故障时,可以自动切换到另一块磁盘读写。可以承受单个硬盘故障而不会造成数据丢失。当容错至关重要,而空间和性能不是关键要求时,通常采用 RAID 1。
RAID 1 适用于安全性要求比较高的场合。
至少需要三块物理硬盘,数据条块化分布不同硬盘,使用冗余的单块磁盘存放奇偶校验,当物理盘故障,奇偶盘和数据盘可以重新恢复数据,而如果奇偶盘故障则不影响数据使用。
RAID 3 可对连续数据读写提供很好的性能,但对于随机数据写操作可能成为瓶颈。
至少需要三块物理硬盘,提供热盘实现故障恢复,校验位会分布存放在三块磁盘中;当其中一块故障,则可以恢复数据;如果其中两块损坏,则所有数据都会损坏。
RAID 5 通过奇偶校验位提高了数据安全性,可实现单盘故障后的数据恢复。
RAID10 又被称为 RAID 1+0 或者 RAID 0+1,至少需要四块物理磁盘。RAID 01 则是 1,2 磁盘,3,4 磁盘先组 RAID 0,然后组起的两个 RAID 0 阵列组 RAID 1。 RAID 10 则是先组 RAID 1 然后组 RAID 0。在提供性能的同时提供一定的安全性能。
假设要写入的数据是{A1,A2,A3,……,A8},那么:
+--+--+--+--+--+--+--+--+
+-->|A1|A2|A3|A4|A5|A6|A7|A8|
+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+
|A1|A2|A3|A4|A5|A6|A7|A8|-->| Disk0
+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+
RAID 1 +-->|A1|A2|A3|A4|A5|A6|A7|A8|
+--+--+--+--+--+--+--+--+
Disk1
+--+--+
+-->|A1|A5|
| +--+--+
| Disk0
| +--+--+
+-->|A2|A6|
+--+--+--+--+--+--+--+--+ | +--+--+
|A1|A2|A3|A4|A5|A6|A7|A8|-->| Disk1
+--+--+--+--+--+--+--+--+ | +--+--+
RAID 0 +-->|A3|A7|
| +--+--+
| Disk2
| +--+--+
+-->|A4|A8|
+--+--+
Disk3
+--+--+--+--+
+-->|A1|A3|A5|A7|
| +--+--+--+--+
| Disk0
| +--+--+--+--+
+-->|A1|A3|A5|A7|
+--+--+--+--+--+--+--+--+ | +--+--+--+--+
|A1|A2|A3|A4|A5|A6|A7|A8|-->| Disk1|
+--+--+--+--+--+--+--+--+ | +--+--+--+--+
RAID 10 +-->|A2|A4|A6|A8|
| +--+--+--+--+
| Disk2
| +--+--+--+--+
+-->|A2|A4|A6|A8|
+--+--+--+--+
Disk3
+--+--+------+
+-->|A1|A4|B7->A7|
| +--+--+------+
| Disk0
| +--+--+------+
+-->|A2|A5|Q3->P3|
+--+--+--+--+--+--+--+--+ | +--+--+------+
|A1|A2|A3|A4|A5|A6|A7|A8|-- | Disk1(P3=B7 XOR A7 XOR B8 XOR A8 XOR Q3)
+--+--+--+--+--+--+--+--+ | +--+--+------+
RAID 5 +-->|A3|P2|B8->A8|
| +--+--+------+
| Disk2(P2=A4 XOR A5 XOR A6)
| +--+--+
+-->|P1|A6|
+--+--+
Disk3(P1=A1 XOR A2 XOR A3)
这些转换、计算过程,如果由 CPU 执行硬盘控制器的驱动程序代码完成,就是软RAID;如果由RAID卡上的主控芯片完成,就是硬RAID。
RAID | 最小磁盘数量 | 磁盘利用率 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|---|
RAID 0 | 2 | 100% | 成本低,提高磁盘读写 | 无冗余和修复能力,任何磁盘损坏将丢失所有数据 | 对读写性能要求较高,安全性要求不高的图形工作站 |
RAID 1 | 2 | 50% 或者 min(磁盘 1,磁盘 2) | 冗余备份,数据安全性高 | 成本高,磁盘利用率低 | 数据随机写入,安全性高的数据库服务器 |
RAID 3 | 3 | 2/3 | 专用奇偶校验磁盘冗余备份,数据安全性高 | 成本略高,磁盘利用率低 | 视频编辑,数据库 |
RAID 5 | 3 | 2/3 | 分布奇偶校验信息冗余备份,数据安全性高 | 成本略高,磁盘利用率低 | 金融,数据库等 |
RAID10 | 4 | 50% | 分布奇偶校验信息冗余备份,数据安全性中 | 成本略高,磁盘利用率低 | 日常等 |
最后推荐几个小工具,往往有些时候数据安全性和成本不能同时兼顾,所以当一旦想要使用 RAID,可以先考虑一下自己的需求,然后根据自己需要的容量,以及数据安全性综合考虑。
几个 RAID 容量计算小工具:
在整理之前那篇 [Git 分支管理]1 的时候接触了 git bisect
,用了那么长时间的 git 竟然又出现了一个不曾用过的命令,于是就看了下文档学习下使用。
git bisect
使用二分查找来快速定位出错的 commit,举个例子来说,假设线上正常运行的一个版本,之后进行了大量的开发,提交了成百上千次提交,而导致了线上其中一个小功能的失效。为了定位问题,你可能需要查看过去的提交。
在使用之前你需要知道两个前提,一个是已知的正常运行的版本,一个是出问题的版本,git bisect
会在两个版本之间使用二分查找,然后根据定位的 commit id 创建新的分支,然后在此分支上可以进行检查,是否有问题。
假设这个中间版本依然可以运行,那么通过 git bisect good
命令告诉 git,然后进行剩下一半的查找,以此类推,最终会快速的定位到问题所在 commit。因为每次都把提交历史切为两半,所以非常快,时间复杂度 log(n)
运行 git bisect 的整个过程
git bisect start # 告诉 git 开始二分查找
git bisect good [good-commit-id] # 告诉 git 该版本无问题
git bisect bad [bad-commit-id] # 告诉 git 出问题版本 git bisect bad HEAD
# 此时 git 就会检出中间版本,然后就可以去测试该版本
git bisect good/bad # 此时就会遇到两种可能,有问题或者无问题,使用 good/bad 来告诉 git
# 当找到第一个问题版本后,git 会告诉你 bisect 结束
git bisect reset # 返回到 git bisect 初始的版本
git bisect log # 显示最后一次完全成功的 git bisect 日志
看完整个过程就知道了为什么在 [Git 分支管理]1 那篇文章中要提到这个 bisect 了,因为如果在 master 上的提交每次都 rebase ,而不是使用 merge ,就会让 master 分支非常干净,而 bisect 去查找的时候就不会那么的费力,而如果 master 分支非常多的分叉,查找过程就会非常费力了。
YOURLS 是 Your Own URL Shortener,是一个使用 PHP 编写的,非常强大的短链接平台。
官网地址:http://yourls.org
cp /user/config-sample.php /user/config.php
vim config.php
,根据个人情况进行数据库、管理员账户等配置;/var/www/
等等;yourls 的用户名和密码是以字符串形式存放在配置文件中的,需要在设置时指定。
推荐使用 Docker 安装
可以使用 yourls 目录下的 docker-compose 启动。
基本的配置可以分为三个部分
配置文件在目录下 /user/config.php
/** MySQL 数据库用户名 */
define( 'YOURLS_DB_USER', 'your db user name' );
/** MySQL 数据库密码 */
define( 'YOURLS_DB_PASS', 'your db password' );
/** 用来存储 Yourls 数据的数据库 */
define( 'YOURLS_DB_NAME', 'yourls' );
/** 如果你不是用的标准 hostname 端口,请用'hostname:port'这种格式配置,例如 'localhost:8888' 或者 '127.0.0.1:666' */
define( 'YOURLS_DB_HOST', 'localhost' );
/** MySQL 表前缀字符 */
define( 'YOURLS_DB_PREFIX', 'yourls_' );
/** YOURLS 安装 URL -- 字母小写,并且结尾不带斜线
** 如果你想配置到 "http://sho.rt", 就不要在浏览器中用 "http://www.sho.rt"(反之亦然) */
define( 'YOURLS_SITE', 'https://your-own-domain.com' );
/** 服务器时区 GMT 值,北京时间 +8 */
define( 'YOURLS_HOURS_OFFSET', 8 );
/** YOURLS 语言
** 更改此项设置来使用你优先的语言翻译文件,默认语言为英语
** 翻译文件 (a .mo file) 需要提前放在 /user/language 目录下
** 通过查看 http://yourls.org/translations 获取更多翻译信息 */
define( 'YOURLS_LANG', '' );
/** 允许多个短链接对应同一原链接
** 设置为 true 则表示短链接和原链接一一对应(默认 Yourls 设置)
** 设置为 false 则允许多个短链接对应同一原链接(类似 bit.ly 表现) */
define( 'YOURLS_UNIQUE_URLS', true );
/** Private 表示后台管理需要密码登陆作为默认手段来实现管理
** 设置为 false 意味着对公众开放模式(例如在内网配置或者测试安装)
** 查看 http://yourls.org/privatepublic 获取更多细节 */
define( 'YOURLS_PRIVATE', true );
/** 用来加密 cookies 的一串随机哈希值,并不需要记住这个,要让它尽量长而复杂,可以从 http://yourls.org/cookie 来获取随机哈希值 **/
define( 'YOURLS_COOKIEKEY', 'modify this text with something random' );
/** 登陆管理站点的用户和密码,密码可以是纯文本或者加密的哈希值
** YOURLS 将会自动加密本文件中的纯文本密码
** 查看 http://yourls.org/userpassword 获取更多信息 */
$yourls_user_passwords = array(
'username' => 'password',
// 'username2' => 'password2',
// 你可以利用'login'=>'password'这种格式来添加更多行
);
/** 调试模式,用来输出一些内部信息
** 对于运行中的站点默认是 false,在编码或者获取提交信息时才会启用 */
define( 'YOURLS_DEBUG', false );
/** 链接缩短方式:36 或者 62 **/
define( 'YOURLS_URL_CONVERT', 36 );
/*
* 36: 生成数字和小写字母组成的短链接关键字(例如:13jkm)
* 62: 生成数字大小写混合的短链接关键字(例如:13jKm 或者 13JKm)
* 选择一个来设置,你开始创建连接之后最好别再更改
*/
/**
* 保留关键字(这样子在创建链接时就会屏蔽这些关键字)
* 这里会填上负面、潜在误导性的词语
*/
$yourls_reserved_URL = array(
'porn', 'faggot', 'sex', 'nigger', 'fuck', 'cunt', 'dick',
);
默认情况下如果安装了 yourls,那么 https://sho.rt 根目录是空的,如果不想要展示一个空空的根,可以在根目录下新建 vim index.php
加入以下内容
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://yourdomain.com");
?>
yourls 中的密码可以直接修改 /user/config.php
文件中
<?php
$yourls_user_passwords = array(
'name' => 'md5:71688:0ce4',
);
直接修改后面密码 hash 部分,再下一次启动时 yourls 会自动加密该密码。
如果使用之前我的 Docker 方式安装的,需要在 docker-compose.yml 中设定好密码,这样重新启用 docker-compose 即可。
官方在 GitHub 上总结了非常多的插件,可以根据自己的需求找到想使用的插件。
使用插件的基本流程如下,所有的插件都可以使用这样的方式安装启用:
/user/plugins/插件名/
目录下官方默认插件,允许在短域名中加入 -
短横线,有些时候为了易读性加上字符分割还是非常易识别的。
默认 yourls 的短链接是数字递增的,随机短链接插件将短链接变成随机字符串。
将点击缓存,减少数据库读
YAPCache 是 Ian Barber’s YOURLS APC Cache 插件的 fork 版本,增加了缓存等等功能,不要同时安装这两个版本。
可以修改短域名的模式,比如将 https://sho.rt/abc 变为 https://sho.rt/m/abc 这样的模式,那么可以在 /m/
下显示一个工具栏,不推荐使用,影响用户体验。
在短链接后面添加 .qr
显示二维码
处理 http://sho.rt/https://google.com 这样的链接不指向 admin
在 admin 中可以添加 track 变量,这个插件会添加一些 Google Analysis 的参数 GA campaign info,对于需要大量追踪信息的商家来说很好的插件。
给 stats & admin page 添加 GA 分析,只有当访问 https://gtk.pw/ins+ 这样带 +
号的短链接才会被追踪到 Google Analytics
在将 plugin.php 放到 user/plugin/ganalytics 目录下之后,需要在 config 文件中定义
define(GANALYTICS_ACCOUNT, "UA-XXXXXX-UU");
另一个 GA track
短域名服务或许是兴起于 Twitter 只能写 140 个字开始,因为有限的文字数量,所以必须要非常有效的传递每一个信息,所有不能把文字浪费在长链接上,自从 t.co 开始就源源不断的开始涌现出各种各样的短链接服务,所以应该在什么时候使用这个服务呢,我总结了一下我个人用的几个情况
默认情况下 yourls 使用的是 301 跳转,但是这两个有着一定的区别,可能对于普通用户而言都是跳转,表现出来是一样的,但是对于搜索引擎,或者浏览器等等,他们的处理方式就有区别。
所以对于搜索引擎来说需要考虑是否要保留原始地址,或者是否要用新页面来替换老页面。而浏览器对于 301 跳转会进行缓存。
前段时间关注了一下域名生意,然后自己也是因为腾讯的优惠券买了一个 club 的域名,看了这么多天的域名,而现在顶级域名又原来越多,虽然 .com 域名依然占据着互联网的绝对位置,但随着未来大家对互联网的认识加深,应该会普及开其他通用顶级域名,所以我感觉其实也没有必要屯一些特殊的域名,除非真的能够买到 a.live
, youtube.tv
这样的域名,其他的域名真的已经不重要了,前两年可能还有千万的域名价格成交,这两年都已经听不到了。如果真的有域名的需求,不妨考虑下品牌的名字,能够有 .com 域名最好,不然 youtu.be
不是也挺好。
垃圾腾讯云要不是有优惠券才不会使他。
https://buy.cloud.tencent.com/domain?price=1
这是Google域名的价格,大部分都是非常统一的,续费和转入都非常方便,提供免费的隐私包含和免费的域名邮箱转发
https://support.google.com/domains/answer/6010092?hl=en
另一个比较著名的域名贩卖商
https://www.namecheap.com/domains.aspx#domain_tab_pricing
网址
https://name.com
网址
https://www.namesilo.com/
网站地址
https://tld-list.com/
可以查看一千多个顶级域名在各个网站上的价格。
网站地址
https://www.domcomp.com/
另一个域名比价网站,不管是新购还是renew都可以先上这两个网站看一眼,然后再选择转入到哪一家。
地址
https://ntldstats.com/
该网站上能看到全世界的域名注册量信息,包括注册局信息,顶级域名注册量信息。比如这里 就能看到Google刚开放的 .app
顶级域名的单日注册量。
fm 是密克罗尼西亚国家顶级域名,当然fm也可以是调频广播,fm域名后缀非常适合拿来做广播网站,音乐广播网站。
dianying.fm
douban.fm
lizhi.fm
last.fm
yuedu.fm
987.fm
tingshuo.fm
qingting.fm
360.fm
fm 域名相对较贵,基础年费 60 刀以上
.tv为吐瓦鲁国家及地区顶级域的域名,很容易让人联想到电视,视频等等,因此经常被用来做视频相关的站点。
也是一个国家的顶级域名,不过有些废,因为 pw 啥都沾不上,所以也就便宜。
提高分支管理,就不得不提Vincent Driessen很早之前提出的策略,他提出来几点
下面沿着经典的 master 和 dev 分支模型,讲两点保证 history 干净的方法。
小型 feature,or bug,能够在几小时内解决的 branch,可以使用 squash merge
# under master
git merge --squash private_feature_branch
对于大型分支,大型功能,可能需要花费长时间 working,需要提交数百次commit的分支,那么使用 squash
可能会导致一次提交有成千上万行代码,非常不利于 code review。那么这个时候就需要使用 rebase
的交互模式。可以参考之前的文章 来学习一下rebase基本的使用。
rebase 的交互模式非常强大,可以用来修改过去的提交,分割提交,合并提交,甚至重新排序提交。
# on feature branch
git rebase --interactive master
git rebase -i master
当使用交互式rebase时,会显示一个编辑器,其中包含了一系列的命令和提交,比如下面三次提交,默认都为 pick,表示不修改该 commit,
pick 9c422c5 Fix bug
pick 8821164 Change html
pick 89e9f73 Update
将第二次提交修改为 s
, squash
,并保存
pick 9c422c5 Fix bug
s 8821164 Change html
pick 89e9f73 Update
那么第二次提交就会合并到第一次提交,最下面的提交为最新的提交,从上到下为旧->新,当保存退出时会弹出新的编辑器,可以在该编辑器中,书写新的提交信息,然后保存。
不过需要注意的是,永远不要改写 public 或者 master 已经发布的分支。
这几点都是老生常谈的要点了,经典的分支模型理论上除了 master 和 develop 分支外,其他分支都不应该存在于远程仓库中。当然理论和实际总是有出入的。Vincent Driessen 的分支模型固然合理,但是并不能满足所有的开发需求。
--no-ff
来合并分支,会出现额外的 Merge branch xxx of git@github.com
这样的无意义的 commit 出现,导致 master 线非常杂乱如果考虑所有的开发都在 master 上进行,本地开发者需要经常 git rebase
将 origin/master
上最新内容拉到本地,开发者推荐在本地维护小型的分支,一旦有可使用的代码立即提交到 master 中持续集成,从提交到合并中间可以加上 review 和 test 。
当所有的开发都在 origin/master
上进行时,开发者需要将所有的修改在最新的远程master上惊醒,以保证每次的开发都能够正常被合并而不会产生冲突。保证了这一点就可以避免在大量feature分支合并时产生的 integration hell。
如果使用 Gerrit,或者 Phabricator 等等 code review 工具那么这些集成就更方便了
每一个发布都有自己的 tag,并且有独立于 origin/master
的分支,加入有 hotfix,那就直接添加到 release 分支,并且 cherry-pick 到 master 分支。如果使用固定的 tag 和 分支命名方法,可以使用CI自动针对 tag 发布,整个过程对开发流程透明,开发者甚至可以不关心发布,而只关心 tag,让后面的流程自动在 CI 中执行。
避免大量的无意义的 merge commits 将仓库搞的乱七八糟,只使用 git rebase
或者 git cherry-pick
,rebase 可以让历史提交线非常清晰,这样 git bisect
也能快速的定位到问题。
如果使用了 Gerrit,那就意味着提交了一组 commit 到 origin/master
,你可以使用 cherry-pick 来任意调整 commit 的顺序。
NextCloud 就不多介绍了,把他看成一个 Dropbox 的私人托管版本,相比于将数据交给 Dropbox ,NextCloud 则需要自己负责自己数据的安全。这里记录下使用过程中的一些问题吧。
推荐使用 Docker compose 来安装 熟悉 Docker 的情况下,基本上是一键安装的。
docker-compose up -d
然后享受 NextCloud 带来的极速体验吧。
NextCloud 的日志可以在这里查看:
tail nextcloud/data/nextcloud.log
虽然默认 NextCloud 自带的插件已经非常丰富了,但是有些功能还是需要一些插件才能完成,幸好 NextCloud 的插件库已经非常丰富,直接 admin 后台点击安装即可。我在使用过程中,发现视频,文档都可以预览,而 mp3 文件点击之后竟然直接给下载了,所以找到了 audioplayer 这样一个插件,可以让我在线预览歌曲。
而关于其他的安全的,媒体的很多插件都可以在插件库或者应用库中找到。二步验证的推荐安装。
NextCloud 的权限管理已经非常详细了,公开分享,私密密码分享,过期时间,完全能够满足所有的分享需求,在看使用 Manual 的时候,发现 NextCloud 和 Dropbox 一样可以设置一个公开文件夹,然后别人可以通过该文件夹来给你上传文件,这个也是非常不错的了。
除了 Dropbox 那么良心,所有平台都提供客户端之外,我也只有见到 NextCloud 那么良心提供全平台的同步客户端了。
sudo add-apt-repository ppa:nextcloud-devs/client
sudo apt-get update
sudo apt install nextcloud-client
PPA 中安装,也可以直接下载 AppImage。其他两个平台就直接安装就行。
来最后给大家分享一首歌:https://nc.einverne.info/s/SbN7zYBKiHMeWs5
如果要手动安装,那么就需要依赖一些服务:
MySQL 5.7
sudo apt install php7.2 php7.2-cli php7.2-common php7.2-curl php7.2-fpm php7.2-gd php7.2-zip php7.2-mbstring php7.2-mysql
NextCloud 提供一个监控的地址,可以用来外部监控 NextCloud 运行状态:
http://[ip]:[port]/ocs/v2.php/apps/serverinfo/api/v1/info?format=json
返回信息中包含很多有用信息,比如服务器当前状态,运行的 NextCloud 版本,存储剩余空间,分享数据, web 服务器版本,数据库版本等等。
同类型的工具还有 OwnCloud,Seafile, CloudReve 可以根据自己的偏好选择一个即可。
因为所有的数据都需要自己来保管安全,所以一方面要做到服务器的安全,另一方面也要保证 NextCloud 的安全,到目前为止,我还是依然使用 Dropbox 作为主要个人存储同步,NextCloud 作为 backup。如果你从来没有听说过 Dropbox 那么可以使用我的邀请 https://db.tt/isyvu6ny 来注册,你我都可以多得 500M 空间。对我而言这 500M 的空间远比某盘 1T 的空间要重要的多。如果你认为 Dropbox 仅仅是一个同步盘的话,请参考下这篇 文章,你不仅能够拿 Dropbox 来托管静态文件,甚至可以借用 IFTTT 来完成很多意想不到的事情。
为什么现在这个时机突然关注了 .xyz
这个域名呢,最直接的原因是,疼讯云给了我100元的优惠券,看了一圈续费VPS似乎不太划算,算来算去也只有购买一个域名值得一些,但是看了一圈疼讯提供的顶级域名,.cn
臭名远扬是不会买的,.com
几乎已经注册不到好记的域名了,.info
我自己有了一个einverne.info
再买个似乎也不知道买什么好了,于是 .xyz
这个很显眼的域名成为了我考虑的目标。然后突然想起来字母表公司(对就是那个 alphabet 公司),他的官网是 https://abc.xyz 好记又贴合名字,顿时看到了希望。
关注域名的人应该会经常看到这个词 gTLD, 全称是 generic Top Level Domain,中文是通用顶级域名,通俗的来讲也就是我们经常遇到的 .com
, .net
, .org
等等域名后缀。不同国家有自己的国家顶级域名,比如中国的 .cn
,还有美国的 .us
,还有日本的 .co.jp
等等,不同的行业机构也都有不同的后缀,一般学校教育机构会有 .edu
,政府机构会有 .gov
,军事机构会有 .mil
等等。1
提到 .xyz
域名就不得不提到 Daniel Negari ,在无数的报道中,Negari 因为独到的眼光预先将 .xyz
的通用顶级域名给注册了,所以让 .xyz
变得成为 .com
之后渐渐流行的通用顶级域名。他在采访中说的最多的一句话就是字母表既然以 .xyz
结尾,那么域名也应该如此2。在 Google 重组还没有使用 abc.xyz
域名前,每天有 3000 多注册,而 Google 重组成 Alphabet 之后每天的注册量已经上升到 10000.
很多人追问的一个问题就是 .xyz
域名会不会火,其实面对着越来越多的通用顶级域名,其实原本稀缺的 .com
域名早已经成为了互联网的历史,如果说以前人们还只认识 .com
, .org
那么互联网的使用者是会变的,当足够多的人认可了以顶级域名,那么自然不在会有一个 .com
的域名再能够卖几千万几百万了。
想必看到这里很多人会想问,与其说去买一个 .com
的域名,还不如自己去注册一个顶级域名,其实注册顶级域名是有门槛的, ICANN 每几年都会开放一次注册,比如 .xyz
就需要 $185,000 来获取。如果想要获取自己的 gTLD,那么需要提交一份完整的申请,还有准备好大约 $200,000 美金,当然还要排除掉你想要注册的顶级域名没有人来和你抢。ICANN 有一份简单的说明几乎可以涵盖经常被问到的事情。
Paul Graham (著名初创企业投资人)在他自己的博客 写过关于初创企业命名相关的内容,他说“如果你开始了一个 X 企业,但是你拿不到 X.com,那么你就应该考虑改名字”,这一句话不仅道出了 .com
域名在互联网的地位,也让我们看到了起名对一个企业的重要程度,也才会出现天价的域名购买。
于是我就顺着这个线索,找了一些有意思的企业,找一找他们的名字的由来,Google 自然不比说,于是我先找到了 Trello ,之前 也介绍过的一个看板类应用。在 Quora 上面我找到了这样一篇文章,经历过早期创业的人提到了他们苦恼如何命名自己的产品,从内部代号 Trellis ,到他们雇一名专业起名的人给出 “lasagna” ,到全公司头脑风暴给出各种谐音,日语结合,单词拼凑, Kardboard,Hippolist,Listly,Idealist,经过无数的讨论,他们甚至想要去买 trell.is 域名,但是价格无法接受,最终在没有给注册的 .com
与域名中,他们找到了 trello.com
。那一切讨论就终止了。
还有Amazon 原来叫 Cadabra.com ,但是因为不好记,很快就被淘汰了。后来 Bezos 自己发现了 amazon.com
3。
GitHub Pages 可以用来托管静态网站,而 Jekyll,Gitbook 等等程序都可以生成静态网站,那么如果使用 master 分之托管源码的话, gh-pages
分支就可以用来托管静态网站。而使用 Travis 就可以将每一次 master 分支的提交,自动编译静态站点之后提交到 gh-pages
分支。
既然要使用到 git 的推送,那么必然避不了需要验证,Travis 提供很多验证方式,这里有两种:
加密 TOKEN,需要使用到 GitHub 提供的 Personal API tokens,Token 与 帐号密码 以及 SSH Keys 同样具有 Github 写入能力,因此只要使用 Travis CI 提供的加密工具来加密这个 Token 即可。
Travis CI 会使用一对密钥中的 Public Key 来加密提供的 TOKEN,然后得到的 secure token 可以安全地放在 .travis.yml
文件中,在 Build 的时候 Travis 会使用 Private Key 来解密这个 Secure Token 获取最初提供的 Github Personal Access Token,并使用该 TOKEN 来进行一系列操作。
操作具体步骤:
gem install travis
travis login --github <token>
travis encrypt GH_TOKEN=<token>
,使用 travis encrypt ...
命令会生成加密的字符串,把字符串添加到 .travis.yml
文件中或者使用额外的参数 --add ...
比如 travis encrypt <token> --add deploy.github-token
可以自动添加到 .travis.yml
文件中,会自动在 deploy 下创建 github-token
来存放加密字符串。
更多的 travis
的使用可以 travis -h
来查看。
下面以 Gitbook 使用 Travis 自动编译部署到 GitHub Pages 为例,这里使用到了 Travis 的发布到 GitHub Pages 的功能。
language: node_js
node_js:
- "8"
before_install:
- export TZ='Asia/Shanghai' # 更改时区
# 依赖安装
install:
- npm install gitbook-cli -g
# 安装 gitbook 插件
- gitbook install
# 构建脚本
script:
# 自定义输出目录 gitbook build src dest
# 默认会输出到 _book 目录下
- gitbook build .
# 分支白名单
branches:
only:
- master # 只对 master 分支进行构建
before-deploy:
- git config --local user.name "Ein Verne"
- git config --local user.email "git@einverne.info"
# GitHub Pages 部署
deploy:
provider: pages
skip_cleanup: true
github_token:
secure: <secure token>
# 将下面的目录中内容推送到 gh-pages 分支
local_dir: build
fqdn: $CUSTOM_DOMAIN
name: $GIT_NAME
email: $GIT_EMAIL
on:
branch: master
大概原理就是如此,记住 skip_cleanup: true
这个一定要写上,否则 Travis 在 build 的时候会自动清理掉 repo 中编译生成的内容。
before_install
在安装之前,设置时区install
安装依赖script
执行真正的脚本before_deploy
部署之前做的事情deploy
部署发布内容本地使用命令
travis lint .travis.yml
实例使用可以参考这个例子
Git 本来是一个版本控制工具,多人协作工具,但却爆发出无限的潜能,于是有人开始使用Gitbook来写书,设计师们用Git来管理版本。这篇文章主要就是想要介绍一下 [[GitBook]] 的简单使用。
Gitbook 使用 Markdown 作为书写格式,Git 来做版本控制,结合两者来编排书籍。Gitbook 的安装非常方便,在本地有 Node.js 和 npm 的环境下
npm install gitbook-cli -g
gitbook -V # 检查版本
就能够安装 gitbook 命令。
Gitbook.com 是一个发布 gitbook 编写书籍的在线网站,提供公开和私有的托管服务,和 GitHub 一样,私有的 Gitbook 是需要付费使用的。但是公开的书籍是无上限的,使用在线的 Gitbook 可以让未接触过 Git 和 Markdown 的作者轻松的创建书籍,并且在线的编辑器可以让作者安心的只关心内容,而不必在意排版,并且支持多人协作编写。
gitbook 的使用可以简单的归纳为如下两步:
在使用 gitbook init
之后本地会生成两个文件 README.md
和 SUMMARY.md
,这两个文件都是必须的,一个为本书介绍,一个为本书目录结构。
Gitbook 拥有很多插件来扩展 Gitbook 的功能,比如支持数学公式,支持Google统计,评论等等。插件可以在 https://plugins.gitbook.com/ 找到。
插件安装比较简单,在目录下添加 book.json
文件,填写下面格式
{
"plugins": ["plugins1", "plugins2"],
"pluginsConfig": {
"plugins1": {...}
}
}
注册完插件之后,安装插件 gitbook install
。 插件开发可以参考官方文章
常用插件
alt
或者 title
属性显示在图片下如果不需要使用 Gitbook 自带的插件可以使用 -
来排除
"plugins" : [ "-search" ]
如果想知道更多关于 Gitbook 的使用,以及各种插件,主题的使用,可以具体参考 https://einverne.github.io/gitbook-tutorial
vmstat
是一个收集和报告系统内存,swap,处理器资源的工具,全称是 Virtual Meomory Statistics,虚拟内存统计,Linux 下监控内存经常使用的工具,可以对系统内存,CPU,进程进行监控。
vmstat reports information about processes, memory, paging, block IO, traps, disks and cpu activity.
vmstat
的使用非常简单,直接运行
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 9496 1632720 1179760 4628968 0 0 9 37 55 12 3 1 96 0 0
输出一大串数据,第一行数据 vmstat 会计算从开机到运行命令这一时刻之间记录的平均数据。此后的每一次都是时间间隔内的情况。
vmstat [delay] [count]
第一行会打印平均值,之后每隔 [delay] 的时间,打印一次报告,在打印 [count] 次之后停止。
输出值解释
Procs
r: 显示多少进程在等待 CPU The number of runnable processes (running or waiting for run time).
b: 显示多少进程正在进行不可终端的休眠,等待 IO(The number of processes in uninterruptible sleep)
Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)
Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).
System
in: 每秒中断数量 The number of interrupts per second, including the clock.
cs: 每秒切换上下文次数 The number of context switches per second.
CPU
These are percentages of total CPU time.
us: 执行用户代码的时间 Time spent running non-kernel code. (user time, including nice time)
sy: 执行内核代码的时间 Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
使用 stress
命令进行测试,并对 vmstat
结果进行观察。先用一个终端打开 vmstat
,然后在其他终端输入 stress 响应的命令观察。
使用 4 worker 进行处理任务 sqrt() :
stress -c 4 -t 30
可以立即看到 vmstat 结果中 r
列,立即会显示 >= 4 个任务在进行。
使用 2 个 worker 进行 sync():
stress -i 2 -t 30
立即就能看到 IO 中 bi
和 bo
成倍上涨。
或者使用 -d
选项,读写 HDD
stress -d 2 -t 10
使用 2 个工作 worker 进行 malloc()
和 free()
,占用 4G 内存 20 秒:
stress -m 2 --vm-bytes 256M -t 20
能看到 memory 中 free 下降,另外如果计算机内存比较小,千万慎重,如果要测试一定使用超时机制,否则可能直接卡死系统。
当系统内存不足时,有几种表现: