2019-11-10T07:55:42+00:00 me@minidump.info 终于在支付宝上申请ETC并安装激活 2019-11-10T00:00:00+00:00 /2019/11/alipay-etc-apply-activate 国家大力推广不停车支付过路费,虽然我高速跑得不少,但我一直嫌麻烦没去安装ETC,从新闻上看到有些省份已经试行微信支付和支付宝支付了,像上海的虹桥火车站、机场停车场我在支付宝上绑定了车牌后,也可以自动感应支付了,结果到现在也没等到这两家侵入到这边的高速公路收费站,倒是等来了年底普及ETC。

仍然是微信和支付宝,以及银行三方争夺ETC新装用户,由于某个原因我在招行app、建行app、微信、支付宝上多次申请办理ETC,全部以失败告终。最后一次在支付宝上申请失败后,我忍无可忍打开支付宝的客服电话95188,得到比较有用的信息是我的车牌已经申请过ETC,绑定的信息是“浙江邮卡发行”以及一个电话号码。这六字信息语焉不详,电话号码是空号!后来在网上搜索到浙江ETC的官网,那个电话号码大概是以前用过的,现在已经换了号,通过新号码,再电话咨询,得到的信息是具体到银行网点以及经手人的姓名,我终于想起来之前我妈是随口提到过,我家后面一个在邮政储蓄工作的邻居忽悠我妈登记了个信息,送了个电饭锅。让我妈去找邻居注销后,我就一段时间没想起来继续折腾,直到前些天我想到家里妹子有个邮政储蓄的储蓄卡,就叫她去支付申请,仍然失败了。于是我又去附近的邮政储蓄咨询,又让我妈去老家那边的邮政储蓄注销,又找了那个邻居去确认信息,说是早已经注销了。最后我不死心地又用自己的建行卡在支付宝上申请,终于审核通过,兴奋得差点老泪纵横。

第一天提交申请,第二天审核通过,之后就很快了,立即就是制卡和快递发出,第三天就收到了快递包裹。拆开包裹就是一个小盒子设备,一张芯片卡,以及一张简单至极的说明书。

芯片卡

安装激活手册

在网上找了一些文章看如何自己安装和激活,平时车停在地下车库,完全没信号,是无法激活成功的,一直拖到今天。经过一番考虑,把太阳能充电部分露出,其他部分藏在黑色网格后面。在支付宝上点击“开始安装”,然后连续拔插两次芯片卡,小盒子上显示“蓝牙开启”,再在手机上打开蓝牙,最后在支付宝上点击“开始激活”,几秒钟后,环形进度条走满,就显示激活成功,支付宝上“ETC服务”链接变成“我的ETC”,将会显示相关信息,包括卡号,车主姓名,办理方式(也就是绑定的银行卡),以及交易记录。

终于是支付宝上申请ETC并安装激活成功了,就等下次过收费站时实操体验了。

]]>
家狗昨天去世了 2019-11-02T00:00:00+00:00 /2019/11/family-dog-died-yesterday 家狗昨天早上突然去世了。我妈微信上发来视频,开始我还以为是家狗在玩装死,后来马上我妈说家狗就是去田里找她,然后听到它狂叫了几声,等她下去从草丛里好不容易找到它时,就已经伸伸舌头死掉了,整个过程非常快,大概都不到一分钟。

唯一比较确定的应该是中毒死的,舌头两边都黑了。家狗在草丛里嗅来嗅去,不知道是被毒蛇毒虫咬了,还是吃了什么毒草毒药。

我昨天也难过了一天,毕竟是一起生活了很久的,有感情的。像我妈这样朝夕相处的,去哪都会跟着的,得有多伤心啊。像家狗这样长得又萌,又乖巧,又聪明的,真是可惜啊。

]]>
最合理的科学上网姿势(续) 2019-10-08T00:00:00+00:00 /2019/10/surf-internet-properly-2 之前提到科学上网为不同目的IP走不同的线路,导致加了16000多条iptables规则,太大的iptables表将会导致路由器性能下降。

经人提醒 ,可以使用ipset配合缩减iptables表大小,性能会好很多 。于是写了点代码,仍然是根据APNIC 的数据自动生成iptablesipset导入数据 。然后用命令导入:

1
2
3
iptables-restore < rules.v4.latest
ipset destroy
ipset restore -f ipset.txt

截止到现在,路由器上的iptables规则连带正而八经的端口映射、防火墙端口过滤等规则,总共不到80条!

iptables

具体效果没有详细测试,先用一段时间感性体会一下。

]]>
最合理的科学上网姿势 2019-09-27T00:00:00+00:00 /2019/09/surf-internet-properly 前段时间路由器莫名其妙起不来之后,折腾了一下tun2socks,虽然在macOS和Windows上都能勉强工作,但总觉得操作麻烦,有一天我在MBA上用完后没有恢复路由表,第二天家里妹子就告诉我好像网坏掉了(手动狗头。所以最终还是需要在路由器上解决这个问题。

上周某一天我不死心地再次重启那挂掉的路由器,想看看有没有死灰复燃,结果真是令我喜出望外,它居然起来了!然后顺便调整了一下科学上网的姿势,给停用大半年的某机场先续费一个月,它家陆续推出二级(30元/月)和三级(60元/月)的线路后,一级(20元/月)的线路总感觉质量有所下降,不过先凑合用吧,等有钱了再升级。

我写了些代码,用于生成haproxy的配置文件、ss-redir的启动脚本、以及iptables的持久化文件。其中haproxy的配置文件中按线路所属地区分组,比如香港、日本、台湾、新加坡、美国、欧洲分别各自归为一组进行负载均衡,每一组在本地监听一个端口,ss-redir的启动脚本里分为每一组启动一个ss-redir进程通过haproxy的负载均衡连接机场服务器。最后在iptables中,根据APNIC为不同地区的IP指向不同的端口进行分流。

这是我觉得目前比较合理的科学上网姿势,能比较充分地利用机场提供的所有线路。不过这个方案有一些缺陷:

  1. iptables记录数量太大,会大大降低网速。
  2. 上网设备不在本路由器下时没法利用本方案的。

针对这些缺陷,我也想过一些办法,但还没实施:

  1. 优化iptables表,比如bestroutetb 项目,原理这里,但2个算法说明我都没看懂。
  2. 上网设备与路由器之间再建一个虚拟专网,在外时通过虚拟专网连回来,便能享受到路由器的科学上网服务了。以前我用OpenVPN搭过,事实证明是可行的,但OpenVPN的server配置很tricky,我并不能每次都搞好。也可以考虑一下其他的方案。
]]>
折腾博客 2019-09-26T00:00:00+00:00 /2019/09/change-blog-hosting 关于托管

因为用的是Jekyll,所以之前把博客放在github pages上,觉得很省事,而且由于无论是家里还是公司的网络都对海外线路比较友好,所以一直以为博客访问速度不算慢。前些天由于家里的路由器一时半会点不亮,没了全局的科学上网,才发现魔都电信直连github pages的速度已经慢得完全无法忍受。怪不得以前看到一些纯技术的群里有人问怎么从github下载代码快一点,我还觉得有点诧异,因为我觉得并不慢呀。

现在自己有了体会,觉得不能放在github pages了事。鉴于前一段时间用linode东京2的VPS科学上网速度不慢,于是把博客迁移过去了。迁移还需要多做一点事情,包括:

  • 在github上设置webhook,每有push就自动在VPS上pull一下
  • 在VPS上装jekyll,pull完了得自己jekyll build,而这些事github pages完全不需要人工介入
  • 修改dns设置,指向VPS
  • 修改VPS上的web server配置,我用了Caddy,这东东相比nginx 能省一些事,比如自动更新Let’s Encrypt 的证书,自动处理github的webhook等等

干完这些事,我就安心地放任不管了。结果几天后,偶然看了一眼Google Analytics 的数据,发现访问量骤跌,虽然原本也不多,一天20多个IP,现在变成不到5个!这可真是个糟糕的结果。

结论是linode东京2的线路并不好,科学上网速度快大概是因为协议的缘故。

于是我又只好套上Cloudflare 的CDN,虽然仍然有不少地区会访问不了,但是比直连linode东京2好不少了。

关于内容

一直以来把博客当日记用,所以虽然这么多年来积累了不少的篇数,但对其他人来说并没有多少营养价值。反倒是自己偶尔看到多年前写的东西,能把自己感动哭。

现在想想,一方面是由于自己总是折腾些比较小众的东西,并没有多少人会感兴趣,另一方面自己在本职或擅长的方面也并不突出,所以写不出有深度有内涵或让人眼前一亮或让人沉浸回味的东西来。

感觉这是很难改变的状况了,只能继续保持现状了。

关于折腾

很多人(包括我)在做一些事情的时候,往往会对事情本身并不特别关注或感兴趣,反而对事情相关的一些周边事物表现出极大的兴趣并投入相当多的时间和精力,甚至超出原本的事情本身。这就是所谓的“本末倒置”。

比如:

  • 听音乐喜欢折腾音响,甚至关注用的是水电还是火电
  • 摄影喜欢折腾相机和镜头
  • 下棋喜欢摆送棋盘和棋子
  • 用个软件喜欢换皮肤,甚至自己制作各种主题

等等。

而我这里写个博客,产出内容的质量不管,托管换了几处,程序也换过几次,主题也换过几次。最近把主题换成Mediumish ,首页可以为每篇文章加一张展示图片,我就觉得很酷很炫。于是先手动给文章内有图片的文章都加了图片,这两天突然觉得Bing每天发的用于做桌布的图片很养眼,直接拿来给每篇文章加个图片不是刚刚好吗!于是写了个小程序,接受一个http请求,根据请求中附带的路径,先查看一下这个路径的文章内容,如果文章中自己就有一张不小的图片,便返回这个图片,不然则从Bing那里随机选一张图片返回。

所以,不务正业的人,总归能找到不务正业的事做。

]]>
为了舒服地写微信公众号,我写了个文章编辑器 2019-09-17T00:00:00+00:00 /2019/09/a-new-markdown-editor 前段时间突然心血来潮开通了一个微信公众号,虽然至今为止也才写了十几篇文章,但是用了官方文章编辑器和一票第三方文章编辑器后,我决定自己写一个。

于是我罗列了几条必需的需求:

  • 基于Markdown,写技术文够方便简单
  • 能保存/读取文档,可以随时中断/继续写作
  • 能自定义输出样式,满足我时不时想换种审美的需求
  • 能方便地输出可以保持样式地粘贴到微信公众号后台文章编辑器的格式

然后就可以动手了:

  • 用Qt写一个桌面应用,这是我最擅长的领域,其实如果技术上可行,可能一个web应用更合适。不过用Qt写了不排除后面可以通过WebAssembly打包成Web应用的可能。
  • 通过cgo调用Go写的Markdown渲染引擎,简单调研下来发现两个完成度比较高的开源项目:GoldmarkLute ,都支持通过Chroma 实现代码高亮渲染。
  • 通过Qt WebChannel 实现渲染结果预览,这种技术可以达到一种比较平滑的效果,用户体验较好。
  • 输出微信公众号后台文章编辑器可用的样式,关键的技术是将渲染结果以HTML格式放入系统剪贴板,而为了HTML文档能保持完整的样式,需要把CSS都嵌入HTML的style属性中。

总的说来,这个编辑器并没有使用高深的技术,而是几种简单技术的拼凑。关键是细节上还有不少需要仔细调整的会极大地影响到使用体验。

一些界面截图: 主窗口1 主窗口1 主窗口2 主窗口2 主窗口3 主窗口3 偏好设置 偏好设置

]]>
全Go科学上网解决方案 2019-09-13T00:00:00+00:00 /2019/09/fully-go-xx-solution 本来由于使用网关的方式进行科学上网一直工作得比较稳定,所以很久都没折腾科学上网相关的东西了。前不久用了几年的Banana Pi突然连不上了,通过socks5+pac的方式也勉强应付了。今天回到老婆娘家,发现两个月前还工作得好好的树莓派不知道什么时候已经点不亮了。不禁感叹ARM板似乎不太耐操啊,以后还是尽量只用x86的工控机之类的吧。

言归正传,随身携带的笔记本不能科学上网,可是憋坏了我这个重度Google用户,于是一顿操作猛如虎,一套全部使用Go编写开发的程序实现科学上网的解决方案出炉了。分别需要以下程序(都是开源的):

  • v2ray 解决内容传输的问题,暴露一个socks5端口 v2ray
  • tun2socks 解决全局流量劫持并走socks5的问题 tun2socks
  • 魔改版CoreDNS 解决DNS污染,并CDN友好的问题 魔改版CoreDNS
  • chnroutes webui 解决大陆地区网络直连的问题 chnroutes

在macOS系统使用下来效果非常好。

]]>
开了个微信公众号《软件开发谈》 2019-08-30T00:00:00+00:00 /2019/08/new-wechat-mp 前段时间开了一个微信公众号《软件开发谈》,可以通过搜索ID“softwaredevtalk”找到,也可以通过扫描文末二维码找到,主要发些与我本职工作相关的Go、C++、软件工程方面的文章。到目前为止发了十几篇文章都是罗列了些modern C++的新特性:

之后还会有一些继续讲modern C++新特性的文章,然后会有些讲modern C++ good practice的文章,可能会有少量深入底层,比如从汇编角度理解编译器/语言特性的文章。

除此以外,还打算偶尔放些小福利,比如抽奖送某些软件的license,当然不会太多。

可扫描以下二维码关注公众号《软件开发谈》

软件开发谈

]]>
CoreDNS搭建无污染DNS 2019-07-21T00:00:00+00:00 /2019/07/coredns-no-dns-poisoning 我之前整理过在国内搭建无污染DNS的一些方法,github上各种轮子也层出不穷,但基本原理几乎不变。自从半年多前开始用CoreDNS,我觉得可以不用dnsmasq/overture/chinadns这些轮子了,CoreDNS完全符合我的需求:

  • 无污染
  • 国内CDN友好
  • 跨平台,支持多种CPU、操作系统

CoreDNS的来头不小,它的作者是最好的开源DNS package的作者,CoreDNS底层也使用了这个package。大名鼎鼎的k8s使用CoreDNS进行服务发现。CoreDNS基本沿用了Caddy的插件架构,所以CoreDNS的配置文件的语法跟Caddy的配置文件语法相同。

一个最简单的配置文件可以是这样:

1
2
3
4
5
.:53{
    forward . 8.8.8.8
    log
    health
}

将配置保存为文件Corefile,运行命令sudo coredns -conf Corefile,即可在本地同时监听TCP和UDP 53端口,将所有UDP查询请求转发到8.8.8.8再返回,可以通过dig @::1 -p 53 twitter.com进行测试。

但是这个配置文件在国内几乎是没啥用的,原因自然是8.8.8.8乃老大哥重点关注对象,直接访问得到的结果都是二手信息。一个好一点的方案是使用非标准端口,比如:

1
2
3
4
5
.:53{
    forward . 208.67.222.222:443
    log
    health
}

forward插件支持多个上游服务器以实现简单的负载均衡:

1
2
3
4
5
.:53{
    forward . 208.67.222.222:443 208.67.222.222:5353 208.67.220.220:443 208.67.220.220:5353
    log
    health
}

大陆的网络环境非常复杂,UDP非标准端口也只在某些地区某些运营商有用,现在比较好的一个选择是DoT,即DNS over TLS,知名的支持DoT的公共DNS服务有Quad9的9.9.9.9,Google的8.8.8.8以及Cloudflare的1.1.1.1,可以这么使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.:53{
    forward . 127.0.0.1:5301 127.0.0.1:5302 127.0.0.1:5303
    log
    health
}
.:5301 {
   forward . tls://9.9.9.9 {
       tls_servername dns.quad9.net
   }
   cache
}
.:5302 {
    forward . tls://1.1.1.1 tls://1.0.0.1 {
        tls_servername 1dot1dot1dot1.cloudflare-dns.com
    }
    cache
}
.:5303 {
    forward . tls://8.8.8.8 tls://8.8.4.4 {
        tls_servername dns.google
    }
    cache
}

这样除了老大哥把连接reset,基本可以得到正确的DNS解析结果。

另一个问题是国内CDN友好,我一直以来的做法是使用FelixOnMars的大陆区域名列表过滤。这个列表是给dnsmasq用的,经过转换可以给CoreDNS用,这利用了CoreDNS的两个插件来实现,分别是forwardproxy,这两个插件的功能非常相似,都是将DNS解析请求发给上游DNS server,再将结果取回返回给客户端。为了实现分流解析,可以将所有请求都通过forward转发到无污染上游解析,将大陆区域名列表加到异常列表,再把剩下的所有请求(其实就是异常列表中的域名)通过proxy转发到国内(最好是当前ISP的)DNS server,比如:

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
.:53{
    forward . 127.0.0.1:5301 127.0.0.1:5302 127.0.0.1:5303 {
        except www.taobao.com
    }
    proxy . 116.228.111.118 180.168.255.18
    log
    health
}
.:5301 {
   forward . tls://9.9.9.9 {
       tls_servername dns.quad9.net
   }
   cache
}
.:5302 {
    forward . tls://1.1.1.1 tls://1.0.0.1 {
        tls_servername 1dot1dot1dot1.cloudflare-dns.com
    }
    cache
}
.:5303 {
    forward . tls://8.8.8.8 tls://8.8.4.4 {
        tls_servername dns.google
    }
    cache
}

这里except www.taobao.com表示www.taobao.com这个域名不要通过forward解析,后面可以跟多个域名,于是这些域名会掉到下面的proxy插件进行解析,而116.228.111.118180.168.255.18则是我的ISP提供的DNS服务器,可以得到最好的CDN友好的结果。

这时就可以用上FelixOnMars的大陆区域名列表了,用以下命令可以得到所有域名连接而成的长字符串,放在except标识符后面:

1
2
china=`curl https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf -s | while read line; do awk -F '/' '{print $2}' | grep -v '#' ; done |  paste -sd " " -`
echo "  except $china " >> Corefile

FelixOnMars同时还提供了Google和Apple的域名列表,这在某些地区某些ISP可以得到国内镜像的IP,所以最后可以写一个这样的shell脚本用于生成Corefile:

我把这个脚本放在gist上,并做了个短网址,于是可以这样生成Corefile:

1
curl -s -L git.io/corefile | bash

到此为止,就已经得到国内CDN友好的无污染DNS解析服务了。

我还想得到更多,比如去广告!github上有非常多的列表,包括广告和有害软件等等,CoreDNS官方尚未提供一个block插件,好在已经有一些非官方的实现,比如block,可以用如下的方式使用:

1
2
3
4
5
6
7
8
9
10
11
.:53{
    block https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
    block https://mirror1.malwaredomains.com/files/justdomains
    block https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
    forward . 127.0.0.1:5301 127.0.0.1:5302 127.0.0.1:5303 {
        except www.taobao.com
    }
    proxy . 116.228.111.118 180.168.255.18
    log
    health
}

非常浅显易懂。如果遇到的请求域名是在列表中,则会返回NXDOMAIN

最后一个问题,由于proxy插件和block插件都不是官方内置插件,从CoreDNS官方下载页下载的可执行程序并不包括这两个插件,所以需要自己编译CoreDNS。

编译CoreDNS并不复杂:

1
2
3
git clone https://github.com/coredns/coredns.git
cd coredns
make

CoreDNS使用了go modules机制,所以在make过程中会自动下载依赖的package。其中一些package是放在诸如golang.org/x/的路径下的,所以需要自备梯子,可以全局翻,也可以通过HTTP_PROXY环境变量指定,或者使用国内的一些镜像(如果你信得过的话)通过GOPROXY环境变量指定。

如果要加入以上两个插件,则在make前,要修改plugin.cfg文件,加入以下两行:

1
2
block:github.com/missdeer/block
proxy:github.com/coredns/proxy

make,就会把这两个插件编译进去。如果发现没有编译进去,可以先执行一下go generate coredns.gomake

如果要给其他平台交叉编译CoreDNS,需要先以当前平台为参数make一次,再以目标平台为参数进行make,因为第一次make时会调用go generate跑两个程序,如果不是当前平台的可执行文件是跑不起来的。

最后,我把这个编译过程放到github上了,用appveyor服务编译出各个目标平台的CoreDNS

]]>
双色球技术派app 2019-06-12T00:00:00+00:00 /2019/06/istkani-app 这个app在2014年就上架过,除了一开始送出去一堆兑换码以外,以每月大约不到1个付费用户的速度卖出过几份。后来也就更新过1个版本,后来就懒得更新了,直到2017年10月因长期不更新被下架了。

前些日子把胎动计数器app上架后,突然觉得这个吃灰已久的双色球app也可以继续上架,虽然用户少,但是价格不低呀,蚊子腿也是肉呀,何况我可以在原来的基础上做些改进再上架呀,比如:

  • 全新的用户界面设计,这需要细细打磨,原来的界面真的比较过时
  • 更多的功能,包括走势图表折线图,预测文章,自定义公式,选号历史记录等等
  • 使用新的Qt版本,凭借qtquickcompiler可以获得快得多的运行期性能
  • 支持最新的iOS设备,而且只支持Apple家的系统,目前就只有iOS,以后可以考虑支持tvOS,watchOS以及macOS

现在已经完成了一部分工作,新增功能尚未动工,就慢慢做吧,放些截图:

1234567891011121314

]]>