Category Archives: z-turn

Linux下HiDPI 4k显示器和普通显示器双显示器设置

经受不住诱惑,败了一个4k显示器,比较经典的 DELL P2415Q,亚马逊价格2799,还算便宜,京东至少也是28xx的价格。顺便吐槽一下亚马逊,越来越不靠谱了,东西不全,以前觉得配送还可以,这次说周末到,也是冲着周末到才这么快下单的,结果周一才到。亚马逊的购物券花完了,以后转京东试试。

要用4k显示器现在都是需要设置HiDPI的,要不然字体太小,根本没法用。参考这篇Arch的wiki,试了几个桌面环境。我当前主力用的Mate环境还不支持HiDPI设置。首先试了Cinnamon,果然支持的很不错,都自动处理好了。可惜的是主题很难看,尤其浏览器里看文字输入框,都是黑黑的一片,输入的文字也不清晰,折腾了半天也没弄好,放弃了。又先后试了Fedora26里带的几个桌面环境,lxde、xfce等,都对HiDPI支持不好。最后不得不尝试gnome,因为自从gnome3之后我就放弃使用gnome了,实在是不习惯。

惊喜的是,gnome3有个gnome-classic模式,使用习惯上基本根gnome2类似,而且对HiDPI支持很好,也是自动都设置好了,字体果然比我之前 1680×1050 的显示器好看多了(用了快8年的显示器,当时还特意买的16:10的)。下一步就是设置双显示器,因为启用了HiDPI之后,非高清的显示器上的图标和文字都变的非常大。现在就想让非高清显示器是正常的DPI,4k显示器才是HiDPI。

正好,Arch的wiki上也有关于多显示器设置这么一节,基本就是使用xrandr命令直接设置两个显示器的位置,然后把非高清显示器用 –scale 参数放大,但实际屏幕还是那么大,所以效果就是图标和文字都变小正常了。但我照着wiki上的信息和其他google来的xrandr命令照猫画虎,怎么也不对,我觉得应该设置正常了的时候,非高清显示器一开始还能正确显示,但过几秒种之后显示器就又黑屏了,很奇怪。折腾了很久,调各种参数也不对,最后想到,我的非高清显示器只有dvi和vga接口,我现在的显卡没有vga口,我用的是vga转hdmi的转接线,是不是这个转换不稳定呢?就把hdmi口拔掉,直接用DVI口,重启再重新设置,副显示器终于不黑屏了……

下面是我的具体环境和命令。Dell 4k显示器分辨率是 3840×2160,作为主显示器,菲利普显示器分辨率是 1680×1050,作为副显示器,在主显示器的左边。命令是

xrandr –output DVI-D-0 –auto –scale 2×2 –output DP-0 –auto –pos 3360×0

–output DVI-D-0: 设置副显示器,各个显示器的名称可以通过 xrandr 命令的输出看到
–auto: 自动设置模式,一般就是最大分辨率
–scale 2×2: 把宽和高都放大两倍,原来是1680×1050,那么放大之后这块屏幕的大小就变成了 3360×2100,这点很重要

–output DP-0:现在开始设置主显示器
–auto: 同上
–pos: 设置显示器位置,因为主显示器在副显示器右边,那主显示器的起始位置就是副显示器的宽度,正常的话是1680,但经过scale之后就是3360了,y轴位置不变还是0

这个设置其实根arch wiki上的很类似,就是那里的例子是主显示器在副显示器的左边,而且没有 –pos 参数(虽然下边例子里也提到了)。没有–pos参数直接用的时候,在我这里主副显示器之间会有重合,也就是有那么一块地方在两个显示器上都显示,说明两个显示器之间的位置关系没设置对,就需要用–pos参数来指定了。

这个thread对我也有一些帮助,帮我更好的理解–pos参数,–fb参数,两个显示器之间的位置关系和那些数值怎么计算等等。到此4k显示器折腾了一天加一个晚上,算是告一段落。有好显示器了是不是要写一些好代码出来啊……

小记socks over stunnel以及msmtp的代理错误

在之前一篇文章”OpenVPN over stunnel配合dnsmasq+dnscrypt实现最佳上网体验“,把OpenVPN流量塞到了stunnel里,但有的时候我只需要一个socks代理,不需要全局VPN,比如浏览器的代理,收发gmail的代理(见”走SOCKS代理收发gmail邮件“)等等。虽然以前用ssh tunnel就能搞定,但现在ssh tunnel已经不稳定了,经常会无响应,所以需要再找一个方法。

之前折腾stunnel的时候搜索到了3proxy这个包,是一个类似squid的代理程序,不过代理的是socks。问题在于配置用户认证等等还是挺麻烦的,尤其是已经折腾完stunnel之后,再折腾用户认证就显得不必要了,因为stunnel需要证书,也就完成了用户认证这一步(自己简单使用的情况下)。更重要的是,3proxy包中还有一个叫做“socks”的程序,用来实现一个SOCKS网关,如果能把流量导入这个网关也就完成了一个不带认证的socks代理。接下来就很自然的想到把socks放入stunnel了。

socks的使用非常简单,用下边的命令就开启了一个只监听本地地址的socks网关,需要注意的是选项和参数之间不能有空格

socks -ilocalhost -p8888 -d
# -i: internal address
# -p: port number
# -d: daemonize

在VPS上运行一下就好了。这里用 -ilocalhost 是只监听本地地址,不对外提供服务,因为本身没有用户认证功能,需要用stunnel把流量转给本地的socks。

接下来配置stunnel。在VPS上配置stunnel服务端

# cat /etc/stunnel/stunnel.conf
debug = 3

; global settings
fips = no
pid =
;compression = zlib

; performance
socket = l:TCP_NODELAY=1

cert = /path/to/stunnel.pem
CAfile = /path/to/st-client.pem
verify = 3

[socks]
accept = 8887
connect = localhost:8888

accept表示监听8887端口接受外来请求,connect表示把接收到的请求转发给本地的8888端口,也就是刚刚起来的socks网关。关于stunnel key的设置可以看我之前的文章(其实也是引用的别人的文章……)。

然后在本机配置stunnel

# cat /etc/stunnel/stunnel
; debug
;foreground = yes
debug = 3

; global settings
fips = no
;compression = zlib
pid =

; performance
socket = l:TCP_NODELAY=1

; auth
cert = /path/to/st-client.pem

[socks]
client = yes
accept = 8888
connect = your.vps.ip:8887

基本上就是多了一个client = yes,说明这是client,监听本地8888端口并转发到VPS的8887端口。

到此就在本机上起了一个socks代理,地址就是 localhost:8888。配合浏览器的代理插件等使用效果更佳:)

不过我在用msmtp代理的时候遇到了问题,邮件怎么也发不出去,一直报错 “proxy failure: unknown error”。搜索了很久也没找到原因,后来clone了msmtp的代码来看,从git log里发现了 1.6.3 版本上有一个commit来修复socks相关的bug(091b31f SOCKS5: do not clobber the status byte reported by the server.),然后看了下Fedora 23自带的msmtp版本是 1.6.2,就自己编译了最新的代码试试。结果证明,果然就是这个bug引起的问题。这个问题困扰我好久了,导致我想发邮件还得起个ssh tunnel,因为不稳定还得赶紧发,发完就关掉。今天终于把这个问题解决了!

OpenVPN over stunnel配合dnsmasq+dnscrypt实现最佳上网体验

(首先还是要唠叨几句,说一下折腾这套东西的前因后果和感受,然后再写具体部署和配置内容。)

随着墙的不断升级,以前的一些方法逐渐不稳定了。我一开始只是用ssh tunnel,这样浏览器配合autoproxy/foxyproxy/switchyomega使用简单方便。后来ssh tunnel被干扰的很不稳定了,经常无响应。而且这个方法也不能用于手机。后来结识了神器shadowsocks,在手机上很欢快的用了一段时间,但最近发现ss也不是那么稳定了,尤其是手机网络,很多时候无法连接,而且iphone上不越狱的话基本无法使用ss(只有一个浏览器样式的应用,不是全局的)。然后就折腾过各种vpn,先是OpenVPN,但也知道这东西用不长久,果然一个月不到就废掉了。也试过l2tp/ipsec等vpn,但速度很慢。最后用了ocserv+openconnect的方案,用了也一个月吧,然后又开始经常连不上,或者连上之后不长时间就无法使用了。

到此,我想得另外想办法了。一开是想的是写个私有协议,其实翻墙这东西就是把自己的数据加密传给国外的代理服务器帮忙转发,结果经过加密再传回来。但自己写毕竟麻烦,虽然已经有人这么做过了。经过搜索发现了stunnel这个好东西,就是干加密转发这件事的。然后在vps上搭了一个squid一个socks服务器,stunnel负责把收到的请求往这两个服务上转发,本地也起一个stunnel监听本地的请求然后发给远端的stunnel。手机的话就用SSLdroid来转发,其实就是手机上的stunnel。这个办法到现在还挺稳定的,就是iphone上没有stunnel类的软件,如果要用就得国内再找个服务器做转发。由此就引出了现在折腾完的这一套东西。(好长的缘由……)

这件事从十月12号开始想,然后搜了搜国内的vps提供商,没什么靠谱的。又看了看阿里云,最便宜的50一个月,对我这个简单的需求来说太贵了。最后想到用自己家里的机器吧,开个DMZ或者端口转发配合动态dns就好了。先试验了DMZ和动态DNS发现能用,就开始找机器了。一开始想用自己的台式机,但常年开机噪音大还不环保。后来想到09年做GSoC的时候折腾过的龙芯盒子,拿来折腾一番终于把龙芯盒子跑起来了。这下东西都全了,开始折腾吧!

在google的过程中想,如果能把OpenVPN流量也用stunnel转发(之前试了转发ocserv的流量,认证能开始,但认证过后就无法连接到服务器,不知道为啥)就方便很多了,手机上又可以用OpenVPN了,不用每个程序设置代理了(而且好多app还不能设置代理)。试了下发现是可行的。搜索的过程中又发现了dnsmasq, dnscrypt, chnroutes, gfwlist2dnsmasq等等各种好东西。最后就形成了现在这个最终的方案。

正文开始!

基本部署

需要国外一台VPS和国内一台机器,简单起见就分别命名remote_server和local_server吧。

基本思路就是,remote_server上运行openvpn server,只监听本地请求(localhost),运行stunnel负责把openvpn的请求转发给本地的openvpn server,同时在local_server上起一个stunnel监听openvpn的连接请求,然后转发给remote_server的stunnel,其实就是把openvpn流量封装到了stunnel里穿墙出去。

然后使用chnroutes项目里得到的国内ip段的路由表,把这些路由加入到openvpn client的配置文件里,这样国内ip不走vpn,国外ip都走vpn,加快国内网站的速度。

最后在local_server上启用dnsmasq负责openvpn的域名解析请求,这样做的好处是:一是避免dns污染,把gfwlist里的域名(通过gfwlist2dnsmasq项目)请求通过dnscrypt转发出去;二是对于国内有cdn的服务可以把地址解析到国内的cdn上,上网会快很多,否则所有dns都在国外解析,很可能返回的cdn地址在国外或者跟你在不同网络(联通/电信)。

配置过程

配置OpenVPN Server

这一步我用的是有人写好的一个脚本,openvpn-install,运行之后根据提示一步步设置就好了,很简单。只是在服务器地址那个地方需要填写local_server的地址,因为最后会自动生成客户端配置文件,但客户端直连的是local_server。然后协议选择tcp,udp不可以,因为stunnel还只能准发tcp协议。最后编辑 /etc/openvpn/server.conf,做如下修改

 - push "dhcp-option DNS xxx.xxx.xxx.xxx"
 + push "dhcp-option DNS your_local_server_address_ip"
 - keepalive 10 120
 + keepalive 30 300

第一个修改是把local_server的ip当作dns推送给client,好使用我们自己的dnsmasq服务。第二个修改是把心跳时间变长30秒一次,并且300秒无心跳才认为断开了连接,这个是因为最后要添加的国内路由表比较大,会用比较长的时间,120不够长,超时之后server会认为连接失败然后重连,其实我们只是在设置路由表……其实也可以在openvpn server端推送路由表,但这样做连接的时间就更长了。

注意这里dns地址必须是ip,如果像我这样用的是动态域名绑定ip的,那么只能写个脚本监控这个ip的变化了……我就把下边这个脚本放在remote_server里的crontab了

#!/bin/bash
if [ `id -u` -ne 0 ]; then
        echo "Need root"
        exit 1
fi

ovpn_conf_file=/etc/openvpn/server.conf
latest_ip=`dig your.localserver.ddns | grep "^your.localserver" | awk '{print $5}'`
current_ip=`grep "push.*dhcp-option" $ovpn_conf_file | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"`

if [ "$latest_ip" != "$current_ip" ]; then
        sed -i -e "s/^push.*dhcp-option.*/push \"dhcp-option DNS $latest_ip\"/" $ovpn_conf_file
        service openvpn restart
fi
exit 0

配置stunnel

remote_server:

debug = 3
fips = no
pid =
socket = l:TCP_NODELAY=1
cert = /path/to/stunnel.pem
CAfile = /path/to/client.pem
verity = 3

[openvpn]
accept = 3333
connect = localhost:4444

基本意思就是监听3333端口,转发给本地4444端口,修改端口为你自己的配置。

local_server:

debug = 3
fips = no
pid =
socket = l:TCP_NODELAY=1
cert = /path/to/client.pem

[openvpn]
client = yes
accept = 4444
connect = remote_server_address:3333

监听本地4444端口,转发到remote_server的3333端口。

关于stunnel的配置和证书的生成,我参考的是这几篇文章
[1] 通过 stunnel 搭建安全高性能的 sockts 代理服务器
[2] 使用dante-server和stunnel搭建socks代理服务器
[3] SSL HOWTO: USING OPENSSL TO GET KEYS INTO PKCS#12 FORMAT.

配置dnsmasq和dnscrypt-proxy

这两个服务都是在local_server上配置的。我用的是debian,安装dnsmasq和dnscrypt-proxy就可以了,但fedora上好像没有dnscrypt这个包,估计要自己编译安装了。

dnsmasq的配置很简单,而且配置文件里的注释说的也很清楚(就是很多……)。其实我就用了这么两行配置

interface=eth0
no-dhcp-interface=eth0
conf-dir=/etc/dnsmasq.d/,*.conf

大意就是在eth0上启用dns服务,不需要dhcp服务,并且包含/etc/dnsmasq.d/目录下的所有conf文件。

然后git clone gfwlist2dnsmasq项目,照着文档生成一份no_ipset的conf文件,然后copy到/etc/dnsmasq.d/目录就完活了。

除了gfwlist2dnsmasq之外,还看了看dnsmasq-china-list这个项目,但自己维护的域名列表gfwlist已经有一份了,而且感觉很全,还是通过gfwlist来生成感觉更好一些。

dnscrypt-proxy的配置也简单,修改配置文件,把端口改成非53,因为53端口dnsmasq已经用了。debian上是 /etc/default/dnscrypt-proxy,如果用的是systemd,还需要修改 /lib/systemd/system/dnscrypt-proxy.socket里的端口设置,然后还需要运行 systemctl daemon-reload才能生效。其他什么配置都不需要修改。

关于dnsmasq和dnscrypt的参考文档
[1] 使用一台Raspberry Pi作为家庭网关, 无障碍翻墙
[2] 使用国外 DNS 造成国内网站访问慢的解决方法
[3] 拒绝 DNS 污染,将 DNSCrypt 部署到 Openwrt 路由器上
[4] VPS 教程系列:Dnsmasq + DNSCrypt + SNI Proxy 顺畅访问 Google 配置教程

客户端配置

我这里客户端只是安卓手机,笔记本/台式机上我不需要全局vpn,浏览器有socks代理就够用了。安卓上装了官方的OpenVPN Connect,发现导入有大量路由设置的配置文件有问题,不是嫌文件太大就是设置路由的时候崩溃。最后我安装了OpenVPN for Android这个app,很好用,推荐!

这里需要配置的就是把第一步设置openvpn server的时候生成的ovpn配置文件更新一下,加入国内不走vpn的路由设置。这里用到了chnroutes这个项目,使用很方便,照着文档生成路由信息列表,然后直接cat追加到ovpn配置文件里就好了。手机客户端上导入这个配置,连接(可能会有点慢,因为路由条目很多)。

路由设置这块儿费了好大的劲儿。一开始想从server推送路由,结果官方openvpn app不支持太多路由条目(反正1000都不支持,而这个路由表有5000+行),换成openvpn for android之后发现推送太慢。但用server推送有个好处是当路由表变化的时候更新方便,在server上再弄一个crontab任务更新就好了。鉴于国内路由信息一般变化不大,就还是在客户端手动设置吧。

另外还试了一个bestroutetb项目里的路由,据项目说是根据chnroutes优化得来的,将路由条目降到了1000+,但我发现这个路由不准确,instagram基本不能用,很多图片刷不出来。所以最后还是用了chnroutes里的路由,因为这个是从APNIC的定义转换而来的。

测试

连接vpn,过程可能会有点慢。连上之后twitter,facebook,instagram都能顺利访问了,开微博看视频也很快,因为是国内的dns解析的地址走的也是国内的路由。这下做到只在必要的时候使用vpn了。

最后说一下,其实这已经不是为了用什么被墙的服务而折腾了,其实我常用的就是twitter,设置个代理完全能用,ss大部分时间也是很好用的。现在是完全就是看墙不爽,我一定要解决这个问题才折腾的。最后照例祝老校长长命百岁!

龙芯盒子上安装debian系统

(这个可得记录一下,折腾死我了)

想在家里弄一个常年开机的服务器,运行一些用于众所周知的原因的服务。然后就想起了几年前折腾过的龙芯盒子。具体来说是福龙盒子,cpu是龙芯2f。

盒子自带的系统有两个,一个是华镭(Rays),一个是Debian。两个系统都很老了,华镭已经停止支持了,网站都打不开了……更别说从源安装软件了。debian好像还是debian 5(lenny),网上找的lenny的源里的东西都不全了,很多软件404 not found,但是还依赖它们(debian官方的源也一样)。所以无法升级无法安装软件,我需要的stunnel虽然能装上,但是运行起来报错(local socket error),我也不知道为什么。

其实盒子里还有另外一个opensuse的系统,是我六年前折腾过的,从opensuse源代码开始交叉编译出来的。试着在这个系统上从源码编译stunnel,结果系统卡在了编译的过程中,什么错也没报,就那么静静的停在那了……自己折腾的系统还是不够稳定啊。

没办法,网上继续找其他系统。先后试了fedora的mips移植版(不支持2f cpu)和debian(debian的wiki里给的kernel也不支持2f……),都以失败告终。最后终于让我找到了社区版龙芯系统的老巢,找到了一份安装说明。剩下的就简单了,照着做吧,有人给做好了系统镜像,比自己折腾debian系统方便多了。我顺便还升级了pmon。

这里可以提一句的是,anheng.com.cn我这里访问很慢,可以从中科大的镜像里下载。装系统的时候会把整个硬盘都重新格式化(我自己做的系统也就这么没了……),root默认的密码一猜就猜出来了,就是loongson。进入系统之后修改源为

deb http://ftp.cn.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.cn.debian.org/debian stable main contrib non-free

升级系统之后我又换成testing了,滚动升级能好一些,怕以后一下跨大版本升级会有问题。

安装配置了下stunnel,很好用!

折腾各种vpn —— 其实这是一篇广告

最近折腾了各种vpn,一开始是OpenVPN,有人写了安装配置脚本,直接运行就好了。但OpenVPN被墙的厉害,只坚持了一个月就挂掉了。后来根据Gris Ge大神的指示又试了l2tp IPSec VPN,但是速度很慢,估计是被干扰的严重。最后搭了ocserv+openconnect/anyconnect,几经周折最后是成功了,而且速度快,推送路由方便,据大神说还坚挺,目前用着还不错。具体搭建过程不说了,网上一大堆。

广告开始:
我用的digitalocean的vps,选的新加坡机房,速度快,配置好价格便宜(相对我以前用的ramhost的vps)。以前用的是384M内存20G空间,8.9刀/月,现在是512M内存20G SSD空间,5刀/月,配置也都很简单。

我的推荐链接,注册就送10刀,够用两个月的(这是本文重点中的重点)。

最后说一句,还是shadowsocks最稳定,不过相对来说有点慢,而且iOS不越狱只能用个浏览器,不太爽。

Fedora 22上guake的双屏幕问题

Fedora22明天应该就要GA了,周末先升级到了f22,整体感觉还不错,比较显著的更改就是由yum转到dnf,但是继续用yum也是可以的。

但每次升级Fedora,都要跟guake的双屏幕问题斗争一番。不是失去焦点回不来就是只能在一个屏幕上显示。这次又是只能在第一次启动guake的屏幕上显示,不跟随鼠标来选择屏幕,虽然在配置里已经勾选了”Appear on mouse display”。曾经一度想过换一个下拉式的terminal,试了tilda和yakuake,还有xfce4-terminal的新drop-down特性(xfce4-terminal –drop-down),但都不能满足我的需求,不是不能全屏就是不能跟随鼠标移动,xfce4-terminal的下拉特性还是实验性质的,全屏之后还会变回原来的样子。最后还是继续折腾guake吧。

经过一番debug发现,选择屏幕的函数set_final_window_rect()在切换屏幕之后根本没有调用到,当然就不能跟随鼠标了。找到函数调用者,发现原来是全屏的影响

        if not self.is_fullscreen:
            window_rect = self.set_final_window_rect()

也就是说,在全屏模式下,不会切换屏幕。这个修改是因为在全屏的时候不需要给terminal发送resize信号,这个信号会导致terminal上的内容重排,有时很烦人。一个小patch去掉全屏判断就解决这个问题了,虽然需要继续忍受resize信号,但也比不能双屏幕好。

user@dhcp-13-216:~/guake$ git diff
diff --git a/src/guake/guake_app.py b/src/guake/guake_app.py
index 9b89c33..b1c4da7 100644
--- a/src/guake/guake_app.py
+++ b/src/guake/guake_app.py
@@ -663,8 +663,7 @@ class Guake(SimpleGladeApp):
         self.hidden = False

         # setting window in all desktops
-        if not self.is_fullscreen:
-            window_rect = self.set_final_window_rect()
+        window_rect = self.set_final_window_rect()
         self.get_widget('window-root').stick()

         # add tab must be called before window.show to avoid a

让firefox显示页面里的小图标

有个问题困扰了我很久,但是我竟然一直都忍过来了。问题就是,firefox打开网页的时候,很多网页里应该是小图标的地方(比如menu前的图标,小箭头之类的)都是一个小方框,然后里边显示四个数字,上下两排,每行两个数字,像是找不到字体的时候出现汉字编码。

之前也google过,可能关键字搜的不对,一直没找到好的解决方法。今天实在不能忍了,再次google,用的关键字是 “firefox webpage no icon”,终于找到了firefox自己的support网页。大意就是,有些网页会把图标当作某种字体来显示,如果你firefox设置的是不让网页使用自己的字体,你机器上又没有这种字体,有不让firefox去下载,那么就只能显示空白了。解决方法也简单,设置firefox让网页可以自己选择字体就好了,然后刷新网页。

我确实够能忍的,一年多的问题终于解决了。

走SOCKS代理收发gmail邮件

自从gmail的smtp server被干掉之后我还没用gmail发过邮件和patch,由于偶尔还是能收到邮件的,也就没仔细折腾。今天要发一个patch,发现果然是发不出去啊。找办法绕道走吧。google被封的完全残废了啊。

我用的是mutt邮件客户端,用fetchmail收邮件,用msmtp发邮件,自己有个vps,那就走ssh隧道吧。只要找到这两个软件走socks代理的方法就行了。

google fetchmail socks proxy,找到了,大意就是用fetchmail的plugin功能,通过socat来转发邮件内容,最后 ~/.fetchmailrc 的内容如下

poll imap.gmail.com
protocol imap service 993
plugin "socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=8888"
user username
password yourpassword
keep ssl
sslcertfile /etc/pki/tls/certs/ca-bundle.crt
mda "/usr/bin/procmail ~/.mutt/procmailrc.gmail"

注意两点,plugin那一句好像要放在考前的地方,我一开始放在了password下边,结果启动fetchmail报错,没细看原因。第二是协议用SOCKS4A,我先用了5,好像是收不到信。总之现在这个配置是能正常收信的。

再google msmtp socks proxy,发现msmtp自带了 proxy_host/proxy_port 功能,赶紧配置了一下,结果不认……最后发现是1.6.2版本才有的,Fedora 21上自带的还是1.4.32版本,那只好自己编译msmtp了。(14年12月才加进来的socks proxy支持。)现在msmtprc配置如下

defaults
logfile ~/.msmtp.log

# Gmail account
account gmail
host smtp.gmail.com
port 587
proxy_host 127.0.0.1
proxy_port 8888
tls on
tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
from yourname@gmail.com
auth on
user yourname@gmail.com
password yourpassword

这样一来,mutt和git send-email又都能正常工作了,只不过要一直开一个ssh tunnel了。(用了shadowsocks,好像和fetchmail/msmtp都结合不好,收发不到邮件。)

网络信息时代,要身手矫健,各种爬墙搭梯子,心里念念不忘老校长,我会一直祝福他老人家的……

Linux下通过mame玩模拟器游戏

其实之前也在Linux下玩过模拟器游戏的,不过用的是xmame,mame的X前端吧。不过随着Debian的升级,不知道什么时候xmame这个包没了,只有mame,其实都差不多了。

首先要有ROM文件,也就是游戏。比如把所有ROM都放在了$HOME/games/roms目录下,那么就配置$HOME/.xmame/xmamerc这个文件(虽然用的是mame,但xmame的配置依然有效……),把rompath变量换成$HOME/games/roms或其他任意你放ROM的目录。然后直接运行mame应该就没什么问题了,能看到游戏列表,进入游戏后按TAB键能够配置键盘的输入。

我还尝试使用手柄,但是一直没配置成功,这里就不细说了。

我以前有一些rom的,比如kof97,1945,合金弹头等等,但是基本上在运行的时候都提示说缺少一些相关的bin文件。网上搜了一下,跟rom的版本也有关系。然后发现了rom hustler,重新下载了kof97,合金弹头5,s1945/s1945ii/s1945iii/gunbird/gunbird2,还有双节龙……其实有很多下载ROM的网站,但至少这几个从rom hustler上下载的游戏在我机器上都能顺利玩起来了。

玩了一晚上拳皇97,找找本科在宿舍和同学一起砸键盘的感觉,只是手指已经生疏,好多招也忘了怎么发了。

Linux下通过键盘快捷键在双屏幕之间切换焦点

在办公室一直在用synergy,在两台电脑之间共享鼠标键盘,而且配置了快捷键能方便的在两台电脑之间切换(文章一文章二文章三)。但是一直没有找到一个好方法能方便快捷的在双屏幕之间切换焦点,必须手离开键盘移动一下鼠标,很不爽……

针对这个问题以前也搜索过,但是没找到什么好方法。这两天不死心继续搜索,发现一个叫做dualscreen-mouse-utils的工具,但是在我的Fedora21系统上却工作不正常。那个mouse-switchscreen一直报错,我不懂X编程,无能为力了……

Opening display :0.0
Window ID is 360002e, focus is 1
Saving /home/eguan/.pointer-0
Moving to screen 1, x = 0, y = 0
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  41 (X_WarpPointer)
  Resource id in failed request:  0x18
  Serial number of failed request:  9
  Current serial number in output stream:  12

继续不死心,man -k mouse了一下,看看能否发现模拟鼠标操作的工具,结果还真发现了一个,xdotool。看了一下manpage,很强大,能够通过命令行输入组合键,移动鼠标,点击鼠标,获取活动窗口,获取鼠标位置等等。于是想了一个不完美,但是能用的方法。

先把鼠标移动到主屏幕某个最大化的窗口的标题栏上,获取鼠标坐标,比如X=760 Y=32,同样把鼠标移动到次屏幕某个最大化的窗口的标题栏上,获取坐标,比如X=2450 Y=15,然后写这样一个脚本

$ cat ~/bin/switch-screen.sh 
#!/usr/bin/bash
if [ "$1" == "-l" ]; then
        xdotool mousemove 760 32
        xdotool click 1
elif [ "$1" == "-r" ]; then
        xdotool mousemove 2450 15
        xdotool click 1
else
        echo "Usage: $0 "
fi

于是用-l参数运行脚本的时候,xdotool把鼠标移动到主屏幕预设的位置,然后点一下鼠标左键,相当于移动鼠标过去并获取了焦点。用-r参数运行的时候同样,只不过移动到次屏幕上获取焦点。

这样做的缺点是,换了屏幕大小和位置这些坐标都得重新获取一个合适的值。不过对我现在来说够用了。接下来就是用xbindkeys配置键盘快捷键。

$ cat ~/.xbindkeysrc 
"$HOME/bin/switch-screen.sh -l"
  Control + 3

"$HOME/bin/switch-screen.sh -r"
  Control + 4
$ xbindkeys # run xbindkeys as daemon

这个配置就是说把ctrl+3绑定到把焦点移动到左边屏幕,ctrl+4绑定到把焦点移动到右边屏幕。到此,在两个电脑之间移动焦点和在两个屏幕之间移动焦点都能通过键盘来完成了,也早就把mutt/irssi扔到screen里,并通过guake呼来唤去,firefox有vimperator插件,这样使用鼠标的机会越来越少了。