全面转移到vim(MacVim)

之前一直用Sublime,原因无它:启动快!当你想打开一个文本文件,可能是个配置文件,也可能是个普通文本文件,又或者一段代码,甚至是一个10M的TXT电子书,最想要的是在2秒内打开它!Sublime完全可以满足这一点:)

几个我算是用过一段时间的文本编辑器器的几个关键我我大致比较了一下:
冷启动速度(启动进程,不打开任何文件)

vim<sublime<vscode<atom
vim最快但sublime也不相上下,大概都是在1.5~2.5秒内,相比之下VSCode就延时比较明显了至少需要3秒,ATOM就不提了,哈哈。

已启动的情况下打开大文件
三者没有特别明显的时间差别,但仍然能感觉到vim最快,奇怪的是感觉vsc的加载速度甚至比sublime还要快。

我的主要用途是:
1. 编辑一般文本文件,但不会做开发、调试之类(习惯IDE工具)
2. 处理TXT小说……哈哈
结合这两个用途而言,其实Sublime完全满足我的需要,但它需要破解又想试试更专业的工具,尝试了一翻之后,真心觉得好用。

有几个重要的经验(针对我的需求,特殊需求的人员就自己去折腾了),反正都是配置~/.vimrc,具体方法不说了,无非就是~/.vimrc(文件)和~/.vim目录(里面含有Color/Plugin等子目录)

对中文和OSX系统来说重要的两个配置

“支持的换行模式
set ffs=unix,dos,mac
“支持的编码格式
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

配置了这个之后打开上述编码(换行)格式的文件就能自动处理,不会有乱码之类的问题。在OSX下默认UTF8,在Sublime中需要安装一个插件来转换编码这个就不需要折腾了。

影响整体效果的配置一,状态栏,一般文本编辑工具都有状态栏显示:)

 

显示文件路径,类型,编码格式,换行格式,文件类型,行,列,当前位置:)够用了。还有些插件可以支持git之类的,我感觉意义不大。代码如下:

“这行很重要,木有这行下面怎么配置都不会显示出来的
set laststatus=2
“正面是状态栏格式代码
set statusline=
set statusline+=%7*\[%n] “buffernr
set statusline+=%1*\ %<%F\ “File+path
set statusline+=%2*\ %y\ “FileType
set statusline+=%3*\ %{”.(&fenc!=”?&fenc:&enc).”} “Encoding
set statusline+=%3*\ %{(&bomb?\”,BOM\”:\”\”)}\ “Encoding2
set statusline+=%4*\ %{&ff}\ “FileFormat (dos/unix..)
set statusline+=%5*\ %{&spelllang}\%{HighlightSearch()}\ “Spellanguage & Highlight on?
set statusline+=%8*\ %=\ row:%l/%L\ (%03p%%)\ “Rownumber/total (%)
set statusline+=%9*\ col:%03c\ “Colnr
set statusline+=%0*\ \ %m%r%w\ %P\ \ “Modified? Readonly? Top/bot.
“前面格式代码中用到的FileFormat函数定义

function! HighlightSearch()
if &hls
return ‘H’
else
return ”
endif
endfunction
“颜色定义

hi User1 guifg=#ffdad8 guibg=#880c0e
hi User2 guifg=#000000 guibg=#F4905C
hi User3 guifg=#292b00 guibg=#f4f597
hi User4 guifg=#112605 guibg=#aefe7B
hi User5 guifg=#051d00 guibg=#7dcc7d
hi User7 guifg=#ffffff guibg=#880c0e gui=bold
hi User8 guifg=#ffffff guibg=#5b7fbb
hi User9 guifg=#ffffff guibg=#810085
hi User0 guifg=#ffffff guibg=#094afe

影响整体效果的配置二就是配色了,随便上Github弄一个放到~/.vim/Color目录下,然后在.vimrc文件中启用这个就行了,我用的是这个(GH上搜索vim color theme 星星最多的):https://github.com/altercation/solarized

 

 

Continue Reading

迁移到GCP

一直是不能忍受DO的蜗牛速度,之前GOOGLE有赠送300$也没怎么用,今天用上!
为了以后备份续费方便用的是最便宜的0.6G RAM,1 shard vCPU,10G Standard Disk方案,同样是5$/mon,但是DO确实配置高一点(之前是500MB RAM现在升级到1G了,而且是25G SSD)。

GCP的好处:
1. 很多机房,很多选择,尤其是有亚洲(台湾,东京,新加坡,孟买,香港(没开通))的机房:
2. 有其它功能可供选择。

延时从接近300ms一下子跳到30ms左右,这种心情是一般人不能理解的。

顺便把一直想干的wordpress数据库清理工作干了,只导入了post,term表,其它全部不要了,手工重新配了thems之类的,保存一个二次的备份。

顺便把ssr,intellijsrv也做成自动启动,不纠结。

Continue Reading

K3C官改固件WOL on WAN折腾记录

为了整黑裙实现WOL on WAN,过年花了好些时间再外加平时研究折腾终于搞定了。

要想WOW先要实现WOL(Wake on LAN),如果局域网测试通不过,就不要做WOL的任何测试了。
WOL的基本要求:
1. 硬件支持,网卡、电源。有说法说DC电源不支持WOL启动,至少我试过一个DC电源+ITX-M65-N55的主板是支持的;
2. 软件配置好,两部分:BIOS/操作系统,各主板及OS不同各不相同,具体只能去上网查,凭经验了。

先说针对WakeOnWAN的关键配置:

步骤一:端口转发
因为目标是唤醒群晖,所以它本身也需要转发5000/5001/6690这些端口。对于WOW而言,端口转发是必须的,也就是说至少要能转发一个端口,但是除非网络有特定的限制,否则其实并不存在所谓的WOL端口,也就是说WOL是与端口无关的,只要路由器可以转发数据包,理论上哪个端口都可以唤醒。比如:群晖就直接用5000端口是可以唤醒的(其它端口测试也是可以唤醒的)。
端口转发另一个注意事项就是:WOL是UDP数据包,所以必须配置UDP或ALL协议的转发。

在端口转发的处理过程中发现了一个我个人感觉很坑爹的问题:DMZ设置。为了下载时方便暴露端口,我将常用的笔记本设置了静态IP+DMZ主机(不是群晖主机),而群晖只是设置了端口转发(理论上也应该如此更安全)。
因为WOW一直不成功,所以就尝试在路由器上用tcpdump抓包,结果发现:K3C持续向某些主机发送IGMP包(ping)(感觉是在判断主机的在线状态,本质就是ARP表中的NUD状态),在配置了端口转发(比如转向192.168.1.9),但目标主机又不在线时,K3C就将这个数据包直接转发到了DMZ主机(没有测试DMZ关闭的情形,也不确定路由器会主动向哪些服务器发起IGMP包)使得WOW失效。
没去细想这一设计是否合理,但这一结果就是:如果不做静态MAC绑定,待唤醒主机是关机状态,端口转发规则其实是无效的。

步骤二:IP/MAC绑定
这一步是关键。因为如果没有IP/MAC的绑定记录,则路由器在收到转发向内网主机(比如我的群晖内网地址是:192.168.1.9)的时候,因为它已经下线在ARP缓存里没有MAC地址,所以路由器也不知道将数据包发往何方。
局域网在任何情况下都可以唤醒的原因是:发送数据包是广播地址,同一LAN内的所有主机都收到了WOL唤醒包,所以不需要特别的绑定。WOW则不同,路由器在收到来自公网的数据包后,不可能将其“广播”到内网上。事实上,操作WOL时如果不选择IP广播(发往192.168.1.255)而是单播只发往待唤醒主机(192.168.1.9),并且发送WOL唤醒包的本地的ARP记录中又不存在192.168.1.9的记录时,结果尚不知道。

这两个配置如果实现,其实就完全可以WOW方式唤醒主机,但是这个K3C却让我折腾了很久。原因是它没有提供方便的IP/MAC绑定功能。

最开始我不是在K3C下试用的,而是在一个水星路由器下(100以内那种最入门款路由器),在路由器上做端口转发+静态MAC绑定,即可。

但是K3C,没有一个“静态MAC绑定”的功能,只有一个DHCP的MAC地址绑定,我以为是一回事,其实完全不是。在走了很多冤枉路,知道这两者的对系统而言并不相同后,尝试执行绑定:

首先的尝试是执行

arp -s 192.168.1.9 mac:add:ress

这一命令没有任何效果,arp命令在k3c上只是纯粹的show arp list,绑定之类的操作好像没有效果。
但我不能排除在别的架构的路由器(固件)上可能是有用的,所以遇到问题还是可以尝试一下。
后面尝试的是IP命令

ip neigh change 192.168.1.9 lladdr mac:add:ress nud permanent dev br-lan
ip neigh add 192.168.1.9 lladdr mac:add:ress nud permanent dev br-lan

命令中的192.168.1.9是待唤醒主机,mac:add:ress是主机的MAc地址,NUD permanent表示将这条ARP记录的NUD状态设置为永久,dev br-lan表示在哪个网络接口(interface)上执行这个操作。
这两个命令执行后,可以通过ip neigh(此命令显示ip/mac缓存列表)中看到相应的IP的ARP记录显示为permanent(永久)生效。

执行两条命令的原因是:如果192.168.1.9(待唤醒主机)实际在开机状态,那么在ARP缓存记录中会有相应的记录,只是其NUD状态不为permanent,所以先执行ip neigh change操作尝试将状态修改为永久,再尝试添加新的ARP记录,两个命令有一个执行成功即可。
执行完上述命令后,测试WOW成功。

第三个步骤严格来说其实就和WOW无关了:这个命令在重启路由器后就失效了。
首先是尝试在路由器的高级功能的启动脚本(rc.local)中写入如下的命令:

ip neigh change 192.168.1.9 lladdr 00:ff:ff:ff:8b:31 nud permanent dev br-lan
ip neigh add 192.168.1.9 lladdr 00:ff:ff:ff:8b:31 nud permanent dev br-lan
exit 0

重启路由器,没任何效果,加上日志,跟踪了执行过程:

echo “START BIND” >> /var/log/ipbind
echo “DO CHANGE” >> /var/log/ipbind
ip neigh change 192.168.1.9 lladdr 00:ff:ff:ff:8b:31 nud permanent dev br-lan >> /var/log/ipbind >> /var/log/ipbind 2>1&
echo “DO ADD” >> /var/log/ipbind
ip neigh add 192.168.1.9 lladdr 00:ff:ff:ff:8b:31 nud permanent dev br-lan >> /var/log/ipbind /var/log/ipbind
echo “END BIND” >> /var/log/ipbind
exit 0

上述命令中的应该只有一个地方比较难理解就是末尾的”2>1&”,作用是同时将标准输出(stdout)和标准错误输出(stderr)重定向。直接使用>>只是重定向了stdout,错误信息在日志里就看不到了!
通过日志发现错误提示:device br-lan不存在。但是在路由器已经启动完成的情况下通过ifconfig命令是可以看到br-lan接口的,找了半天,用了另外一方法:
将绑定命令写成脚本,保存在/etc目录下(也可以是其它目录,推荐),比如: /etc/bind_ip.sh。注意要通过chmod a+rx bind_ip.sh来授权执行。
上述命令的脚本要稍做修改如下:

#!/bin/sh
echo “SLEEP”
sleep 60
echo “START BIND”
echo “DO CHANGE”
ip neigh change 192.168.1.9 lladdr 00:ff:ff:ff:8b:31 nud permanent dev br-lan 2>1&
echo “DO ADD”
ip neigh add 192.168.1.9 lladdr 00:ff:ff:ff:8b:31 nud permanent dev br-lan 2>1&
echo “END BIND”
exit 0

脚本主要修改是:
#!/bin/sh,虽然是注释但有用,这样确保执行脚本时在bash环境中,否则会提示can’t find applet(不能执行第一个sleep命令)。
sleep 60,休眠60眠,脚本的关键修改就是这个延时操作了。
删除了所有的>> /var/log/ipbind,原来这个功能是将脚本执行的输出写入日志的,但因为之后我们要用nohup命令来后台执行程序,nohup这个应用会再次重定向,所以这里就不用写了(如果写了的话在nohup.out中看不到执行日志和错误输出)。但是要注意保留 2>1&,错误输出挺重要的。

然后在rc.local中添加如下命令(强烈建议使用路由器的Web界面添加,不要用vi,试过一次丢失了rc.local文件):

nohup /etc/bind_ip.sh &
exit 0

这里有两个linux常用的命令或语法nohup和&,执行指定的程序,即使你已经注销。其实在这个脚本中可以不使用这个命令前缀,因为是路由器开机过程应该没有不会有注销信号,不过为了保险加上这个命令。
命令末尾的&表示在后台执行这个程序(前台可以继续执行其它命令或脚本),相当于多线程。这个&才是关键,这意味着系统在接下来的时间里仍按原配置加载系统配置(目的就果发创建接口设备br-lan),在这个过程中bind_ip.sh同步执行的是sleep 60命令,只要路由器在60秒内加载完br-lan设备,再执行后面的绑定就成功了。

 

 

 

 

 

 

 

 

 

Continue Reading