类库大魔王/missdeer 2018-08-07T13:34:20+00:00 me@minidump.info 试用基于有赞云的个人网站在线收款解决方案 2018-08-07T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/08/try-youzan-pay 老早就注册有赞云了,之前随便玩了一下,感觉可以用,加上自己对web开发并不了解,就放下了。

今天突然心血来潮,用Go折腾了一下,用于demo是很简单的,有赞的文档也还不错,虽然并不了解web开发,但拿别人的代码过来改改问题不大。

主要的工作流程为:

  1. 从web上获取相关信息,比如价格、客户资料等,创建收款二维码
  2. 有赞云返回二维码的id、url及base64编码后的图像信息,程序记录二维码id及用户信息的对应关系,后面有用
  3. web页用js通过websocket获取二维码url或base64编码后的图像信息,并显示
  4. 用户使用微信或支付宝扫一扫二维码进行支付
  5. 扫完二维码后会跳转到有赞的一个页面,点击该页面上的支付按钮,有赞会推送消息到后台设置的回调地址上,状态是WAIT_BUYER_PAY
  6. 用户支付完成后,有赞会再次推送消息,状态是TRADE_SUCCESS
  7. 有赞推送的消息中只包含订单号,程序要通过订单号反查对应的二维码id,再查到用户信息完成一次交易

这个方案的优点是无需公司资质,无需接入支付宝和微信,可使用支付宝和微信扫码支付,支持储蓄卡和信用卡。

缺点是只能在网站上使用,在手机上不能唤起支付宝和微信app。另外据说有赞的风控比较严格,动不动就被冻结资金不能提现,需要找客服解冻。

程序代码在这里,代码很乱,仅供演示。在线demo在这里,可以输入小额金额进行支付体验。

]]>
tinc后续 2018-07-26T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/07/tinc-follow-up 之前用tinc构建了虚拟专网,实现了在不同局域网内的机器通过tinc互相访问,但是遇到一个问题,我想从公司里访问到家里其他没有装tinc的机器,或者从家里其他没有装tinc的机器访问到公司里装了tinc的机器。经过一番简单的设置便可以达到想要的效果。

家里一台HTPC装了tinc,新增IP为192.168.88.3,内网IP为192.168.66.110,家里所有机器网关都指向软路由,假设IP为192.168.66.1,修改相应配置。

修改所有机器上的/etc/tinc/bignet/hosts/shhtpc文件,头部增加一行:

Subnet = 192.168.66.0/24

刷新tinc的配置,要用sudo

sudo tincd -n bignet -kHUP

设置流量转发,修改/etc/sysctl.conf

net.ipv4.ip_forward=1

执行以下命令使其生效:

sudo sysctl -p

修改路由器192.68.66.1上的静态路由:

sudo ip route add 192.168.88.0/24 via 192.168.66.110

至此,家里所有机器的流量先全部流到路由器,路由器发现目标IP地址是192.168.88.0/24范围内的,重路由到HTPC上(192.168.66.110)。

修改公司所有机器上的/etc/tinc/bignet/tinc-up文件,增加一条静态路由:

sudo route add -net 192.168.66.0/24 192.168.88.3 255.255.255.0

即把192.168.66.0/24网段的流量路由到HTPC上。

因为我家里的路由器和HTPC使用的操作系统都是Linux,公司的电脑都是macOS系统,所以增加静态路由使用不同的命令。

至此,公司可以直接访问192.168.66.0/24网段内的所有机器。


tinc装在Windows上只需要装好tap-Windows驱动,设置好虚拟IP和子网掩码,就不需要手动设置路由,但在上面这种情况下,需要另外加一条静态路由,以管理员身份运行cmd.exe,输入命令:

route add 192.168.66.0 mask 255.255.255.0 192.168.88.6 metric 3

命令中192.168.88.6是本机的tinc虚拟IP,我猜改成HTPC的IP应该也可以,没试过。


由于不能控制公司的路由器,所以不能给公司所有主机修改路由设置,如果要从家里访问公司里其他主机,比如访问公司内网的网站,我认为比较简单的方法是修改家中的路由器设置:

  1. 开一个SSH隧道到公司任意一台装了tinc也装了OpenSSH server的机器:

    ssh -D 8089 -f -C -q -N username@192.168.88.4
    

    其中192.168.88.4就是公司某一台装了tinc也装了OpenSSH server的机器。

  2. 装redsocks,并指向SSH隧道开的本地端口:

    ip = 127.0.0.1;
    port = 8089;
    type = socks5;
    

    假设redsocks监听在58096端口上。

  3. 修改iptables防火墙设置:

    -A SS -d 10.0.0.0/8 -p tcp -j REDIRECT --to-ports 58096
    -A SS -d 173.36.0.0/14 -p tcp -j REDIRECT --to-ports 58096
    -A SS -d 172.0.0.0/8 -p tcp -j REDIRECT --to-ports 58096
    -A SS -d 171.68.0.0/14 -p tcp -j REDIRECT --to-ports 58096
    -A SS -d 72.163.0.0/16 -p tcp -j REDIRECT --to-ports 58096
    

    把所有公司内网用到的IP段流量都重定向到58096端口。

  4. 在公司某一台装了tinc的机器上装一个DNS server,在家里把所有公司内网用到的域名都使用该DNS server进行解析,比如dnsmasq设置为:

    server=/.cisco.com/192.168.88.4#35353
    server=/.webex.com/192.168.88.4#35353
    server=/.webexconnect.com/192.168.88.4#35353
    server=/.wbx2.com/192.168.88.4#35353
    

    其中192.168.88.4就是公司某一台装了DNS server的机器,监听在35353端口。

这时,家里所有机器应该都可以访问公司内网的网站,登录收发邮件等等。

我之前并没有使用SSH隧道,而是在公司机器上使用polipo提供http代理,发现它并不能正确代理非http端口的流量请求,而SSH隧道就没这个问题,不知是polipo的限制,还是因为SSH隧道使用socks5协议是会话层协议的缘故。

]]>
使用tinc构建虚拟专网 2018-07-16T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/07/tinc-virtual-private-network 之前写过一篇文章讲如何在家里无缝访问公司网络,用的是frp的方案,但正如使用ngork一样,frp也会莫名其妙地突然不工作,而且几乎没有什么错误信息可供调查。后来知道了有zerotier这个东西,相对来说还是比较稳定的,速度也凑合,免费额度可以在一个网络中添加最多100个设备,但是流量通过别人的服务器总归有点不爽,直到最近知道了tinc这个东西,可用于创建点对点的虚拟专网。

经过近一天的折腾,终于把公司两台iMac,家里一台Linux HTPC,以及Linode东京1一台VPS用tinc连起来了。tinc的安装配置使用都非常简单,只不过网上的资料比较零散,有一些还是错的,其实只要看linode的一篇文章以及tinc的官方文档,基本能解决所有tinc相关问题。

tinc的工作方式依赖于tuntap,现在的Linux发行版基本上都已经带了tuntap驱动,所以直接从官方仓库使用相应的命令安装tinc就能工作。在macOS上则需要自己安装一个tuntaposx驱动,可以通过brew cask install tuntap进行安装,也可以自己从网上下载安装包手动安装,甚至可能直接安装一个tunnelblick都会自动装一个驱动。可以用命令行kextstat |grep -e tun -e tap 看一下是否已经安装成功,如果没有任何输出,则需要自己安装,如果用brew cask或手动安装失败报错,则看一下/Library/Extensions目录是否有tap.kexttun.kext两个目录,如果有,则通过以下命令装载:

sudo kextload /LibraryExtensions/tap.kext
sudo kextload /LibraryExtensions/tun.kext

这时再用kextstat |grep -e tun -e tap看,估计就有输出了,如果还是没有,则到System Preferences-Security & Privacy看看是否被禁止了,若是被禁止了,就强行同意即可。

安装好了tuntap和tinc,就可以开始配置,Linux和macOS下基本是一样的,创建一个目录:

sudo mkdir -p /etc/tinc/netname/hosts

其中netname是自己随意设定的网络名,一旦设定,所有节点都要使用相同名字,之后在tinc的命令行中也要用到。

/etc/tinc/netname目录下创建tinc.conftinc-up/tinc-down,可以参考linode的文章编写。其中所有节点中必须要至少有一个节点是有公网IP(所有其他节点都能访问到)的,其他节点就都连这个节点进行中转,照tinc的理念,其他节点一旦通过中转建立好连接后,会视情况进行点对点直连或仍然继续通过节点中转。可以有多个节点拥有公网IP并进行中转,其他节点也可以配置连接多个中转节点。

tinc-up/tinc-down在Linux下和macOS下的命令也许略有不同,比如我的tinc-up在Linux下是这样的:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 192.168.88.3 dev $INTERFACE
ip route add 192.168.88.0/24 dev $INTERFACE

在macOS下则是这样的:

#!/bin/sh
ifconfig $INTERFACE 192.168.88.5 192.168.88.2 mtu 1500 netmask 255.255.255.0
route add -net 192.168.88.5 192.168.88.2 255.255.255.0

同样tinc-down也要使用平台相应的命令。

然后在/etc/tinc/netname/hosts目录下,创建一个与tinc.conf文件中Name项的值相同的名字的文件,比如Name = node1,则创建文件名为node1node1的内容主要大概是这样:

Address=my.xxx.com   # 公网地址,可以是域名或IP,如果不是中转节点,可以不要这一行
Subnet=192.168.88.2  # 内网地址,可以是一个网段或一个具体IP

再之后,通过命令生成密钥:

sudo tincd -n netname -K4096  

这个命令会生成一个RSA公钥和一个私钥,会询问密钥保存的文件路径,其中要公钥需要添加到hosts文件的末尾,可以直接指定hosts文件路径作为公钥文件路径。

最后,把所有节点上的hosts文件都互相交换,存放一个副本到所有其他节点的/etc/tinc/netname/hosts目录下,就可以运行tinc daemon命令了:

sudo tincd -n netname -D -d 3

第一次运行,可以先加-D参数,让进程放在前台运行,加-d 3打印详细的调试日志以供出问题时查看,要杀掉该进程,不推荐直接使用kill命令,而是提供了相应的方法:

sudo tincd -n netname -k

这时可以通过ifconfig命令查看是否多了一个名字为netname的网络连接,IP则是在tinc-up设置的。还可以互相ping一下对方IP,没什么问题的话,几个机器应该可以当成在同一个网络里互相访问了,可以把-D-d 3参数去掉:

sudo tincd -n netname

还是比较简单的,唯一比较麻烦的是新加一个节点的话,要在所有节点都同步添加一个hosts文件,如果修改了配置,要用命令更新:

sudo tincd -n netname -kHUP

用tinc替换了zerotier体验了一下,感觉不错,要是有个GUI的配置工具以及hosts目录同步功能,就完美了!

]]>
Clang on Windows for Qt 2018-07-10T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/07/clang-on-windows-for-qt 几年前也曾经试图折腾过Clang on Windows,那时候的完成度还不高,只能配合MinGW使用,而且头文件搜索路径还是源代码中硬编码的。

现在完成度已经很高了,Chrome for Windows已经转而使用Clang编译。Clang官方支持2个target,分别配合MinGW和MSVC使用,只要在设置好PATH和target,clang就能自动使用对应的头文件,库文件,链接器等等。

偶然发现Qt 5.11.0已经带了win32-clang-msvc这个mkspec,而5.11.1增加了win32-clang-g++,这意味着在Windows上已经可以使用clang编译Qt程序,并且随意切换target。

Qt官方提供msvc2015和msvc2017编译后的二进制文件下载,可以直接使用从LLVM官网下载的Windows installer,甚至已经在LLVM 7.0的snapshot可以使用。可以编写一个批处理文件来设置环境变量:

set VS140COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\"
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
set PATH=%PATH%;"C:\Tools\LLVM-7.0.0-r336178-win64\bin\";C:\Qt\Tools\QtCreator\bin\;C:\Qt\5.11.1\msvc2015_64\bin\

之后每次只要先执行这个批处理文件,然后执行命令:

qmake -r -spec win32-clang-msvc src.pro
nmake 或 jom

就可以使用clang编译Qt程序了,最终链接的是msvc版本的Qt库。

至于使用MinGW的target,我现在使用msys2的版本。msys2提供编译好的MinGW-w64套件,有提供32位和64位两个版本。Qt也有现成的编译好的文件,分别有32位和64位,静态链接和动态链接共4个版本,有时候静态链接的版本会迟一点发布。使用pacman安装:

pacman -S mingw-w64-i686-qt5 mingw-w64-i686-qt5-static mingw-w64-i686-clang
pacman -S mingw-w64-x86_64-qt5 mingw-w64-x86_64-qt5-static mingw-w64-x86_64-clang

这会下载几GB的东西,安装后可能会占用几十GB的空间。之后如此使用:

PATH=/mingw64/bin:$PATH /mingw64/bin/qmake -r -spec win32-clang-g++ src.pro
PATH=/mingw64/bin:$PATH /mingw64/bin/mingw32-make

至于Qt程序本身,并不会怎么受clang影响,除了可能会要求更规范一点?多数问题然后是MSVC和MinGW套件的区别的问题,在.pro文件中,则使用win32-*g++*win32-*msvc*来区分两种套件即可。

]]>
在家里无缝访问公司网络 2018-04-27T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/04/access-internal-network-seamless 有时候在家里时想访问公司网络,干点活(真是个好员工),主要就是开开内网的网页,连连内网的IM(Cisco Jabber)。本来这个事情只要有一个VPN就可以搞定了,但是!但是我没有权限申请VPN,于是只好另辟蹊径了。

首先,找到一个用于搭建内网隧道的反向代理工具frp,通过它在家里开一个服务端,在公司开客户端,于是家里的机器上就有了一个socks5端口,通过该端口就可访问到公司内网的资源了。于是网络拓扑大体如下图所示:

https://www.umlgen.com/svg/UDfpA2v9B2efpStXvIhEpimhI2nAp5N8ICnBAI_AB2b9pLCeAIfDvULApialJL58piyjICohLAZcvL80Whpyb5I5yioybFpoOeLeY1W8kAJcv3pjt_1qJ_-pERjUB6uDXoWnD80eYKNIdPcRc8oiDTCtCHckgfQN2sPpHdvkAegrHVcb9Qb5o5gT4lE0K24WKo7YwQAPBxQlVpvb8wQ57Y41piYwdlOkUBwlhyB2xEc6_YSxTWCTZAd7CG1PHv2PiO51cP52kAUR9wPQbzIopEHKGnGhm47nVChM5oqJSMamGjRmVCsK5-isF9kp1hyUOnHBTcv-DdS_VWr-A1ecj3pVkFjPPpUoby4X3ejHNLqxQ33pSe7Z2La06lww6WQQkk10HHDo3E3b0eORX0CD50mH8mmHOmmHFrukXzIy560A1G0bkixu

我把服务端放在占美x86小主机上,Banana Pi只负责拨号、路由和X墙

有了隧道,我之前是写了一个pac文件,把公司常用的几个顶级域名全部走代理,浏览器之类能支持pac文件的程序就能工作了,但程序如果不支持pac文件就歇菜了。要实现无缝访问,还需要做几件事。

  • DNS解析。内网资源的域名只有内网的DNS服务能解析,这也可以通过frp解决,在占美x86小主机上开一个非标准端口,比如6001,加上之前说的反向代理,frp客户端侧的配置文件如下:
[common]
server_addr = ip.address.at.home
server_port = 7000

[http_proxy_on_windows]
type = tcp
remote_port = 6001
plugin = http_proxy
use_encryption = true
use_compression = true

[socks5_proxy_on_windows]
type = tcp
remote_port = 6002
plugin = socks5
use_encryption = true
use_compression = true

[dns_proxy_on_windows1]
type = udp
remote_port = 6001
local_ip = dns.server.ip1.at.company
local_port = 53

[dns_proxy_on_windows2]
type = udp
remote_port = 6002
local_ip = dns.server.ip2.at.company
local_port = 53
  • 再通过dnsmasq把那几个内网域名指向该非标准端口就可以了,其他默认的不变:
server=208.67.222.222#5353
server=/.domain1.com/127.0.0.1#6001
server=/.domain2.com/127.0.0.1#6001
server=/.domain3.com/127.0.0.1#6001
server=/.domain4.com/127.0.0.1#6001
server=/.domain5.com/127.0.0.1#6001
server=/.domain6.com/127.0.0.1#6001
  • 分流。本来已经在Banana Pi强制所有海外IP走代理,现在只要把内网资源的IP分流到占美主机上的socks5端口即可。在Banana Pi上编译一个redsocks,redsocks可以把流量导到socks5端口。再修改一下iptables设置:
-A SS -d 127.0.0.0/8 -j RETURN
-A SS -d 192.168.0.0/16 -j RETURN
-A SS -d 169.254.0.0/16 -j RETURN
-A SS -d 224.0.0.0/4 -j RETURN
-A SS -d 240.0.0.0/4 -j RETURN
-A SS -p tcp -d 10.0.0.0/8 -j REDIRECT --to-ports 58096
-A SS -p tcp -d 173.36.0.0/14 -j REDIRECT --to-ports 58096
-A SS -p tcp -d 172.0.0.0/8 -j REDIRECT --to-ports 58096
-A SS -p tcp -d 171.70.124.0/14 -j REDIRECT --to-ports 58096
-A SS -p tcp -d 72.163.0.0/16 -j REDIRECT --to-ports 58096
-A SS -p tcp -j REDIRECT --to-ports 58097

其中58096是redsocks开的端口,58097是统一海外代理。

这些步骤之后,所有从R6300v2走的设备都能享受到正确的DNS解析和TCP分流,不需要pac文件,浏览器、IM都能正常访问到内网资源。

]]>
UMLGen开发踩坑 2018-03-31T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/03/umlgen-develop-memoir 最近这段时间都在写一个叫UMLGen的GUI程序,从名字可以看出,就是一个用来画UML图的工具,与大多数现有的WYSIWYG(所见即所得)的UML画图工具(比如Visio,StarUML等等)不同的是,UMLGen使用代码的形式来描述UML图的呈现,与LaTeX的思想类似,即WYTIWYG(What You Think Is What You Get,所想即所得),我个人认为这种方式特别适合程序员使用。现在可用性已经很好了,主窗口截图如下:

UMLGen main window

程序是用Qt写的,开发过程中还是遇到一些坑,记录一下。

  • QtSvg模块实现的SVG标准有限,不能支持某些SVG,比如下面两张图,使用Firefox或Chrome浏览器查看,一切正常,用QtSvg则惨不忍睹。

math

math error

latex

latex error

除了换个支持完整的SVG库,就只能在这些时候不用SVG,改用PNG了。用PNG格式的问题是后端导出的PNG格式都是带白色背景的,而SVG是无背景透明的,这是我情愿尽量使用SVG格式的原因。

  • 用Scintilla编辑代码,自己写了一个简单的lexer,因为支持了多个后端,于是就有多种语法,所以在一个lexer里要同时支持多种语法,就会有坑,现在暂时也没想实现得多完美,这个留待以后版本改进。

  • Scintilla的Qt port对XPM图片格式支持有问题。XPM文件用文本编辑器打开可以看到是一个const char *[]的变量声明及初始化,但Scintilla的Qt port在register image时接收的参数被改成const char *,于是就对不齐了。

]]>
Qt unzip 2018-02-27T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/02/qt-unzip 最近又要在一个Qt程序中解压缩一些zip文件,以前用过QuaZIP,总觉得如果能不引入一个额外的第三方库会更舒服一些,于是上网搜了一下,还真有办法!

先在.pro文件中添加module:

QT += gui-private

然后在.cpp文件中添加头文件引用:

#include <private/qzipreader_p.h>

最后就是解压缩:

QZipReader cZip("archive.zip");
foreach(QZipReader::FileInfo item, cZip.fileInfoList())
{
    if (item.isDir)
    {
        QDir d(item.filePath);
        if (!d.exists())
            d.mkpath(item.filePath);
    }

    if (item.isFile)
    {
        QFile file(item.filePath);
        file.open(QIODevice::WriteOnly | QIODevice::Truncate);
        file.write(cZip.fileData(item.filePath));
        file.close();
    }
}

cZip.close();

大功告成!


用这种方法的缺点是使用了Qt的private实现,会导致二进制不兼容,比如用Qt5.9.1编译链接的程序在Qt5.9.2的环境下可能就不能正常工作了,这个问题可以通过静态链接Qt或者自带对应版本的Qt动态链接库解决。

另外有一个坑需要注意是,由于底层是使用zlibdeflate算法,所以只能解压使用这种算法进行压缩的文件,从WinZip官方网站上的说明来看,WinZip支持多种压缩算法,另一个流行的压缩软件7zip也是如此:

7zip compress methods

如果某个zip文件是通过非deflate算法,比如LZMA算法压缩的,用上面这段代码尝试解压时,就会报出诸如QZip: Unsupported compression method 14 is needed to extract the data之类的错误消息。这个问题就算换成QuaZIP也无解,毕竟QuaZIP底层也是用的zlib

]]>
HAProxy for SS(R) 2018-02-23T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/02/haproxy-for-ss 昨天在喵帕斯tg群里看到一张HAProxy的截图,经过了解,原来是梅林固件自带的,真是不错的想法。

想当初,我为了实现$$的load balance,不惜花费大量的时间和精力,自己用Go写了个客户端,结果后来喵帕斯全面开启多用户单端口,而我的程序在带参数的混淆和协议上实现有问题,于是换回用libev版了。用libev版唯一的缺点就是线路变动(比如偶发性down掉,永久换IP,永久移除等等)时,需要手动去切换一下。虽然喵帕斯同时提供了几十条线路,却压根没发挥作用,如果线路稳定倒也好说,但是昨天发现已经用了好长一段时间的线路突然变得时断时续了,真是纠结啊!

好在现在发现了HAProxy这个方案,立即上手试试。我是在Banana Pi R1上部署的,先从官网下载HAProxy源代码,解压并编译:

wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.4.tar.gz
tar xzvf haproxy-1.8.4.tar.gz
cd haproxy-1.8.4
make linux2628

这样就能得到一个可执行文件haproxy,然后编写一个配置文件:

global 
    daemon  
    maxconn 10240 
    pidfile /home/pi/avege/haproxy.pid 

defaults 
    mode tcp
    balance roundrobin
    timeout connect 10000ms  
    timeout client 50000ms  
    timeout server 50000ms  
    log 127.0.0.1 local0 err

listen admin_stats  
    bind 0.0.0.0:8099
    mode http
    option httplog
    maxconn 10  
    stats refresh 30s
    stats uri /stats  

frontend ssr-in 
    bind *:58543  
    default_backend miaops
	
backend miaops
    option log-health-checks
    default-server inter 15s fall 3 rise 2
    server cn-1 cn-1.node.com:54321 check
    server hk-1 hk-1.node.com:54321 check
    server us-1 us-1.node.com:54321 check
    server tw-1 tw-1.node.com:54321 check
    server ru-1 ru-1.node.com:54321 check
    server jp-1 jp-1.node.com:54321 check

最后就是$$连接服务器的地址和端口改成本地HAProxy开的那个端口即可:127.0.0.1:58543

大体上就是这样的,HAProxy会给后端服务器做健康检查,load balance时会跳过down掉的服务器。据我简单的尝试发现,似乎健康检查的参数设置能显著影响$$的效果,现在的设置肯定不是最佳的,但我也没什么经验继续调优。现在的work flow就是这样:

work flow - https://www.plantuml.com/plantuml/svg/UDfjqh5Emp0G1k3TJ-6H3f58M_P2zmuL6-hWsYTYufoZyxc5ZQVXmNWIZgOf8OaKATRt_v5-IzaaDiIv2KgbscDho3GQeuETQU0n-5VK5f211d5bq9t9CmDgfWo3Y3q7U8haWFOnezj6GY1TFintdYjlQuIKT3bVsCOGIH-3iRLIEvcbJTi6RmtxYAcJb2Zu8vpqYvAZlfpLeSigqr9y_xWMWKv0fVGi5cLVwNGfokUnhaHp6kjQbF9ONUGamVVdbpp_8nH_QmiK7SxNHN4Rhswt4EnNNz-NNhVzZ-xk5xqkPtKr_NmzfT_LKqMbDe1EVeiVECc-cG00

可以通过浏览器打开http://haproxy-ip:8099/stats查看HAProxy的运行状况:

HAProxy stats

就这样先试用一段时间看看效果再说。


2.25 update:

不少网站/app会根据你所用的IP来做出一些对应的变化,比如Google会跳转到对应的国别后缀,Telegram在登录时会刷新出对应的电话国际区号,所以HAProxy的配置中一组后端只配置同一国家的线路为好,上面的stats截图中我就只配置了jp的线路。

]]>
家中网络问题一则 2018-02-13T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/02/network-issue-at-home 某天早上起来,发现屋里手机、电脑都上不了网了,照惯例先后重启了一下路由器和WIFI中继,都不管用,感觉问题有点严重了。

屋里的网络拓扑如图所示,略显繁杂:

Network topo at home - https://www.plantuml.com/plantuml/svg/UDfjL4rlsp0ClUjNyBODMDeaGzjBKJHfCQn04nX9W0uOTf1jeYOiIuQa9Cs_7nr_Z6vhNyZtw4VgYSbzYDh7VMMK2YNPMdjTWNKvhdM52qEl5ZAq4RsW2stpewSOqKBqUnHKf6XmwNoEVkFsDdzmtgA7sTNdDRk2ij9Y233xlE316USXDJehrHc6DSQZyoL4LplG4GfNeL9hdXYUjWdyKRVf7GUtb-cT-jlYIstvJOZ9DWIEDpFWIXwIptOklk17VNqaRLYxqVeEgKTTmb4RywtNsYNFPCljaM9MiDukcJGvpARJwQeHR1afYM_iKmv3voy1C7A5nGYryp7qqXiTwXIzFoKqNxBsa3VZpfUjsYB0hrtoSBbUR5acknW-llundHxc_1aRz8hQjmWSvghsxa1SmjEzFFryQYQ3JDSw9KFnrCeItsI14FXIoRw2TwxgbL_8vkuO7Z6Kx3atoBkeqbb15bk1hWfkW2olb36Ozm8hdQt8qf2apfKByjBF3Hfz4dRAKS_SQCeKSpaW9OMpU1raTZLaEl_VV8rl-t3Tnhz9kuhwEbv4MzOwt-dKO6niV4Rh3cuWe6EuQRzEaqcpQ4fk14CzgxeROKXMgD4jloU56qnr2cfy0uBed1qZdRq2V7SumVJMVO2knb1hee1Q9mNGs_cvk3YNR326XoOI7Xf9K3IJyEZmalXeW6JLFVy--H_m7vE5fPG0

大多数情况下,都是R6300v2这个二级路由器不稳定,时不时WIFI连不上了,重启就好了,也遇到过TP-Link的WIFI中继不工作的情况,也是重启就好了。一般情况下我是不愿意重启用于拨号和翻墙的作为一级路由器的Banana Pi R1的,因为翻墙部分的程序有时候在板子起来后并不能自动运行,要ssh登录上去后手工输入命令运行起来,挺嫌麻烦的。这回只好把Banana Pi也重启了一下,结果居然也没用!

最后只能把目标转移到TP-Link千兆交换机上了,重启后问题仍然存在。偶然试了一下把R6300v2的WAN口网线从交换机上拔下,插到Banana Pi上,居然全都能访问网络。在我看来似乎是交换机坏掉了,既然Banana Pi上有4个LAN口,把Raspberry Pi也插到Banana Pi上也不是不能接受。然后我就上班去了,似乎一切正常了。

晚上下班回家,发现用电脑访问不了Raspberry Pi了,但是电脑可以访问Banana Pi,从Banana Pi可以访问到Raspberry Pi。然后发现Raspberry Pi和R6300v2互相不能访问,连ping都ping不通,但两者与Banana Pi却都可以互相访问。无论怎么重启Raspberry Pi(uptime已经达到389天!)和R6300v2都没用。

到SHLUG的微信群里问了一下,没人能说清什么原因。

想来想去,觉得问题似乎就是Banana Pi下的设备数据交换功能出问题了。抱着试试看的想法,把TP-Link交换机又接了回去,只是Raspberry Pi和R6300v2换了其他的网口插在交换机(8口)上,一切竟然全都恢复正常了!看来Banana Pi上的4个LAN口并不像平常的交换机那样呢,有点坑。

]]>
Go微信公众号爬虫踩坑实录(二) 2018-02-06T00:00:00+00:00 类库大魔王/missdeer https://blog.minidump.info/2018/02/go-wxmp-crawler-develop-memoir-2 过去一周仍然花了些时间更新微信公众号爬虫,又踩到些坑,记录一下。

  • 之前是用semaphore来控制并发下载的goroutine数,后来发现这种方法看起来比较粗放,于是改成固定数量的goroutine池,比如固定30或50个goroutine一直跑着只用于下载HTML,固定15个goroutine一直跑着只用于将HTML转换为PDF,前一种goroutine下载完一个HTML后通过channel告诉后一种goroutine开始转换,感觉好多了。
  • 微信公众号文章中常常包含大量的图片,而且不少公众号经过几年的经营,已经发过多达几千的文章,将所有这些文章全部转换为PDF的话,PDF文件的体积可以达到2GB甚至更多,这么大体积的PDF对阅读器来说是一大考验,虽然PDF的保真度很好,但是在kindle之类没有彩色的阅读器上并没多少用处,所以能生成mobi格式是更好的选择。
  • 爬下来的微信公众号文章HTML里有大量无用的HTML/JS/CSS内容,对于kindlegen来说完全无用,所以只需要保留正文<p></p>之间的内容即可。
  • kindle的HTML渲染程序对HTML tag的支持极其有限,所以将多余的各种style等等attribute删除掉即可。
  • 并不是所有的GIF都能提取出多个frame,大概是因为不是动画的缘故?我不确定,这种情况就直接保存即可。
  • 某些GIF格式图片的存在会引起kindlegen程序crash,我没找出来具体规律,把所有GIF格式全部转换成JPG格式即可。
  • 有些文章被屏蔽了,但仍然会在目录中存在,只有在爬取正文内容时才会返回一个错误信息,而且错误信息分好几种,需要统一处理这些情况。
  • 虽然我每次请求都加入了1~5秒不等的延时,但可能仍然过于频繁,周末调试程序时微信就把我的账号封了查看公众号所有历史消息的功能,直到2天后才恢复,大概需要加入更长时间的延迟才行。
  • mobi文件的封面是一张图片,要在图片上用指定的字体写字可以使用github.com/golang/freetype/truetype包,虽然只支持ttf格式的字体,但也足够了。
]]>