2018年3月

「hey serve the purpose of changing hydrogen into breathable oxygen, and they’re as necessary here as the air is, on Earth.」

「But I still say……they’re flowers.」

「If you like.」

「Do you sell them?」

「I’m afraid not.」

「But, maybe we could make a deal.」

日常循环 Flower Dance 的时候在评论置顶看见了碗叔中国巡演,从不追星的我竟然有些悸动?

24 日,17点,深圳·雅玛水公园。提前一个小时到达,因为是音乐节,还有其他的歌手在演出,舞台下观众熙熙攘攘。马上就要见到碗叔了,那个戴着帽子的肥胖大叔。: )

即将登场

天渐渐的黑了,现场人也越来越多,灯光把氛围烘托得很棒,碗叔他还带着帽子~

碗叔

讲真来之前我并不知道出了新专辑,直到买周边的时候发现了这个。新专辑 Flower Dance 都出 Pt.2 了,你脱单了吗?<( ̄︶ ̄)>

新专辑《Restory》

话说 Emliy Styer 小姐姐的声音很好听,上场时一句「牛逼」瞬间对这位小姐姐路转粉。

后来啊,天空飘起了小雨,现场依然热情不减。Emily Styer 现场弹奏了一首 Flower Dance,会弹钢琴的女孩子真美。音浪拍打在身上的感觉真的棒极了。 (●゚ω゚●)

最后的最后,一首现场版 Flower Dance 献给大家,由于视频太大了,我已经上传到网易云啦。

移步网易云:Flower Dance - DJ OKAWARI 深圳 2018 后青年音乐节

此文为 造轮子之谷歌镜像站 的衍生。

其实谷歌字体在 2017 年左右就已经解封了,现在解析到的一个北京的 IP 上。对于前端来说,使用谷歌字体再也不用担心加载不出来了。

最早玩博客的时候,谷歌字体是我必屏蔽的(解决不了问题,就解决出问题的代码),到后来我使用过 360 旗下的 http://fonts.useso.com (挂了)也用过 Cat Networks 下的 https://fonts.cat.net,到后来谷歌字体解封,喜大普奔连忙换上 https://fonts.googleapis.com,享受着谷歌给开发者带来的福利。

问题出现在最近,公司的网络防火墙貌似把谷歌字体库给墙了。以上所有字体库全都凉凉(<de;>防火墙:对,不是针对谁,在座的都是辣鸡)。这样带来的问题就是——我特么打开一个带谷歌字体的网页先让我看近半分钟的开场白。我的博客,我刚写的 OpenAPI,无一幸免。

我得做点什么。首先得明白是什么原因,打开终端输入命令 ping fonts.googleapis.com 得到 IP 172.217.24.42(香港,且无法 Ping 通);拔掉网线,连上手机热点终端输入命令 ping fonts.googleapis.com 得到 IP 203.208.50.70(北京,能 Ping 通)。

其实现在问题变得很简单了,公司的网络将谷歌字体库的域名仍解析在国外的服务器上。所以我们只需要将本地的 Hosts 文件手动指向北京的 IP 就好了。Windows 在 C:\Windows\System32\drivers\etc\hosts,Mac / UNIX 在 /etc/hosts 新增一行 203.208.50.70 fonts.googleapis.com 就能解决一半的问题。

然鹅。我就喜欢用复杂的方式来解决简单的问题!脑海中冒出一个有趣的想法——为什么不自己搭建一个谷歌字体镜像呢?

利用 Nginx 进行反向代理,然后用 CDN 做缓存

套路和搭建谷歌镜像站差不多,不过值得注意的是在 fonts.google.com 中得到的 CSS 文件里有 fonts.gstatic.com (北京 IP 为 203.208.51.56,修改 Hosts 文件的话需要新增一行 203.208.51.56 fonts.gstatic.com)的路径,如果 fonts.googleapis.com 被墙了,那么这个肯定也不可幸免。所以需要反向代理两个站点。

搭建这个镜像站也不需要境外服务器,只需要你的服务器能正常访问就行。配置如下:

server
{
    listen 80;
    # listen 443 ssl http2;
    server_name fonts.openapi.link;
  
    # 强制跳转 HTTPS
    #if ($server_port !~ 443){
    #    rewrite ^(/.*)$ https://$host$1 permanent;
    #}
    #HTTP_TO_HTTPS_END
    # HTTPS 证书地址
    # ssl_certificate    /foo/bar.key; 
    # ssl_certificate_key    /foo/bar.pem;
    # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    # ssl_prefer_server_ciphers on;
    # ssl_session_cache shared:SSL:10m;
    # ssl_session_timeout 10m;
    # error_page 497  https://$host$request_uri;
    
    # 用于 fonts.googleapis.com 代理
    location /css {
      sub_filter 'fonts.gstatic.com' 'fonts.openapi.link';
      sub_filter_once off;
      sub_filter_types text/css;
      proxy_pass_header Server;
      proxy_set_header Host fonts.googleapis.com;
      proxy_set_header Accept-Encoding '';
      proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Scheme $scheme;
      proxy_pass https://fonts.googleapis.com;
      proxy_cache cache_one;
      proxy_cache_key $host$request_uri$is_args$args;
      proxy_cache_valid 200 304 301 302 1h;
      expires 365d;
    }
    # 用于 fonts.gstatic.com 代理
    location / 
    {
      proxy_pass_header Server;
      proxy_set_header Host fonts.gstatic.com;
      proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Scheme $scheme;
      proxy_pass https://fonts.gstatic.com;
      proxy_cache cache_one;
      proxy_cache_key $host$request_uri$is_args$args;
      proxy_cache_valid 200 304 301 302 1h;
      expires 365d;
    }
    # 日志
      access_log  /www/wwwlogs/fonts.openapi.link.log;
}

总算折腾完了,配置上 CDN,速度杠杠的。也欢迎使用我的谷歌字体镜像 fonts.openapi.link

嗷~对了!各位看官再等等,我有一个大宝贝给你们介绍一下(掏裤裆)——开放 API:为开发者而生。

后来我想想,我折腾了这么大一圈图什么呢?

进入 vim

命令描述
vim filename打开或新建文件, 并将光标置于第一行首
vim +n filename打开文件,并将光标置于第 n 行首
vim + filename打开文件,并将光标置于最后一行首
vim +/pattern filename打开文件,并将光标置于第一个与 pattern 匹配的串处
vim -r filename在上次正用 vim 编辑时发生系统崩溃,恢复 filename
vim filename….filename打开多个文件,依次编辑

vim 配置

命令描述
all列出所有选项设置情况
term设置终端类型
ignorance在搜索中忽略大小写
list显示制表位 (Ctrl+I) 和行尾标志($)
number显示行号
report显示由面向行的命令修改过的数目
terse显示简短的警告信息
warn在转到别的文件时若没保存当前文件则显示 NO write 信息
nomagic允许在搜索模式中,使用前面不带 “\” 的特殊字符
nowrapscan禁止 vi 在搜索到达文件两端时,又从另一端开始
mesg允许 vi 显示其他用户用 write 写到自己终端上的信息
:set number / set nonumber显示 / 不显示行号
:set ruler /set noruler显示 / 不显示标尺
:set hlsearch高亮显示查找到的单词
:set nohlsearch关闭高亮显示
:syntax on语法高亮
:set nu显示行号
:set tabstop=8设置 tab 大小, 8 为最常用最普遍的设置
:set softtabstop=84:4 个空格, 8: 正常的制表符, 12: 一个制表符 4 个空格, 16: 两个制表符
:set autoindent自动缩进
:set cindentC 语言格式里面的自动缩进

移动光标

命令描述
k nk上 向上移动 n 行
j nj下 向下移动 n 行
h nh左 向左移动 n 行
l nl右 向右移动 n 行
Space光标右移一个字符
Backspace光标左移一个字符
Enter光标下移一行
w/W光标右移一个字至字首
b/B光标左移一个字至字首
e 或 E光标右移一个字至字尾
)光标移至句尾
(光标移至句首
}光标移至段落开头
{光标移至段落结尾
n$光标移至第 n 行尾
H光标移至屏幕顶行
M光标移至屏幕中间行
L光标移至屏幕最后行
0(注意是数字零)光标移至当前行首
^移动光标到行首第一个非空字符上去
$光标移至当前行尾
gg移到第一行
G移到最后一行
f移动光标到当前行的字符 a 上
F相反
%移动到与制匹配的括号上去(),{},[],<> 等
nG移动到第 n 行上
G到最后一行

屏幕滚动

命令描述
Ctrl+u向文件首翻半屏
Ctrl+d向文件尾翻半屏
Ctrl+f向文件尾翻一屏
Ctrl+b向文件首翻一屏
nz将第 n 行滚至屏幕顶部,不指定 n 时将当前行滚至屏幕顶部

插入文本类

命令描述
i在光标前
I在当前行首
a光标后
A在当前行尾
o在当前行之下新开一行
O在当前行之上新开一行
r替换当前字符
R替换当前字符及其后的字符,直至按 ESC 键
s从当前光标位置处开始,以输入的文本替代指定数目的字符
S删除指定数目的行,并以所输入文本代替之
ncw/nCW修改指定数目的字
nCC修改指定数目的行

删除命令

命令描述
x/X删除一个字符,x 删除光标后的,而 X 删除光标前的
dw删除一个单词 (删除光标位置到下一个单词开始的位置)
dnw删除 n 个单词
dne也可,只是删除到单词尾
do删至行首
d$删至行尾
dd删除一行
ndd删除当前行及其后 n-1 行
dnl向右删除 n 个字母
dnh向左删除 n 个字母
dnj向下删除 n 行, 当前行 + 其上 n 行
dnk向上删除 n 行, 当期行 + 其下 n 行
cnw[word]将 n 个 word 改变为 word
C$改变到行尾
cc改变整行
shift+j删除行尾的换行符,下一行接上来了

复制粘贴

命令描述
p粘贴用 x 或 d 删除的文本
ynw复制 n 个单词
yy复制一行
ynl复制 n 个字符
y$复制当前光标至行尾处
nyy拷贝 n 行

撤销

命令描述
u撤销前一次的操作
shif+u(U)撤销对该行的所有操作

搜索及替换

命令描述
/pattern从光标开始处向文件尾搜索 pattern
?pattern从光标开始处向文件首搜索 pattern
n在同一方向重复上一次搜索命令
N在反方向上重复上一次搜索命令
cw newword替换为 newword
n继续查找
.执行替换
:s/p1/p2/g将当前行中所有 p1 均用 p2 替代, g 表示执行 用 c 表示需要确认
:n1,n2 s/p1/p2/g将第 n1 至 n2 行中所有 p1 均用 p2 替代
:g/p1/s//p2/g将文件中所有 p1 均用 p2 替换
:1,$ s/string1/string2/g在全文中将 string1 替换为 string2

书签

命令描述
m[a-z]在文中做标记,标记号可为 a-z 的 26 个字母
`a移动到标记 a 处

visual 模式

命令描述
v进入 visual 模式
V进入行的 visual 模式
ctrl+v进如块操作模式用 o 和 O 改变选择的边的大小
在所有行插入相同的内容如 include<将光标移到开始插入的位置,按 CTRL+V 进入 VISUAL 模式,选择好模块后按 I(shift+i),后插入要插入的文本,按 [ESC] 完成

行方式命令

命令描述
:n1,n2 co n3 或者 :n1,n2 copy n3将 n1 行到 n2 行之间的内容拷贝到第 n3 行下
:n1,n2 m n3 或者 :n1,n2 move n3将 n1 行到 n2 行之间的内容移至到第 n3 行下
:n1,n2 d将 n1 行到 n2 行之间的内容删除
:n1,n2 w!command将文件中 n1 行至 n2 行的内容作为 command 的输入并执行之
若不指定 n1,n2,则表示将整个文件内容作为 command 的输入

命令描述
q[a-z]开始记录但前开始的操作为宏,名称可为【a-z】,然后用 q 终止录制宏
reg显示当前定义的所有的宏,用 @[a-z] 来在当前光标处执行宏 [a-z]

窗口操作

命令描述
:split分割一个窗口
:split file.c为另一个文件 file.c 分隔窗口
:nsplit file.c为另一个文件 file.c 分隔窗口,并指定其行数
ctrl+w在窗口中切换
:close关闭当前窗口

文件及其他

命令描述
:q退出 vi
:q!不保存文件并退出 vi
:e filename打开文件 filename 进行编辑
:e!放弃修改文件内容,重新载入该文件编辑
:w保存当前文件
:wq存盘退出
:ZZ保存当前文档并退出 VIM
:!command执行 shell 命令 command
:r!command将命令 command 的输出结果放到当前行
:n1,n2 write temp.c
:read file.c将文件 file.c 的内容插入到当前光标所在的下面

常用正则

  • 删除行尾空格::%s/\s+$//g
  • 删除行首多余空格:%s/^\s*// 或者 %s/^ *//
  • 删除沒有內容的空行:%s/^$// 或者 g/^$/d
  • 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
  • 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
  • 清空某一行或多行文本::n1,n2 s/\w//g
  • 给一行或多行首字符添加注释:n1,n2 s/^/#/g
  • 给一行或多行首字符删除注释:n1,n2 s/^#//g