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显示器折腾了一天加一个晚上,算是告一段落。有好显示器了是不是要写一些好代码出来啊……

Monthly Pic 2016 12


2016年这最后一个月,家附近的小吃摊被拆除了,没地方吃煎饼鸡腿苞米了,对我的饮食影响很大……


年底跳了一个大坑,而且比想象的要大的多。

杂记mutt, GPG和邮件签名

最近由于工作需要,折腾了一阵mutt的多帐号支持和GPG key的签名,和给邮件签名。比较乱,随便记一下吧。

1. mutt的多帐号支持。
这个其实以前一直也在用,只不过是用起两个mutt实例,通过不同配置文件来区分的,比如默认的工作邮箱就直接 mutt 启动,个人的gmail邮箱就做了一个alias

alias mutt-gmail="mutt -y -F ~/.mutt/muttrc.gmail

在 ~/.mutt/muttrc.gmail 中配置好gmail的信息就可以了。

但是这次的情况不太一样,申请了一个 kernel.org 的邮箱,发往这个邮箱的邮件会转发给工作邮箱,所以我想最好能在回复的时候自动判断是发给哪个帐号的,自动用正确的帐号回复。不行的话能方便的用快捷键切换帐号也可以。搜索了一下”mutt multiple account”之类的,找到一些文章,但最后发现还是这篇文章最符合我的口味。大意就是用esc-1, esc-2快捷键,通过设置 “from=<user@domain>” 来选择帐号,同时因为用的是msmtp发送邮件,所以msmtp会自动根据这个域来判断该用哪个帐号发送邮件。同时设置不同的 status_line,来显示不同的帐号信息用来做区分。最后我的设置就是

macro generic "\e1" ":set from=account@company.com\n:set status_format=\"-%r-Company: %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p?Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---\"\n" "Switch to Company account"
macro generic "\e2" ":set from=account@kernel.org\n:set status_format=\"-%r-Kernel.org: %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---\"\n" "Switch to kernel.org account"

这样就方便多了,虽然kernel.org的邮箱可能会很少机会用到……

2. GPG签名
折腾这个也是为了申请kernel.org的帐号,要找一些牛来来背书。如何生成自己的公私钥对等等网上信息很多,就不说了。这里就记一下怎么把别人给你签名过的公钥里的签名和其他签名合并到一起。事情是这样的,我分别找了Dave和Eric给我签名,但他们都是下载的我在keyserver上的公钥,因为是远程认证的,所以他们分别签名&加密之后发给我,我需要把他俩的签名和之前的签名都合并到一起,然后上传到keyserver上,这样这两个新签名就增加上去了。看过了gpg的manpage之后发现其实挺简单的,就是用到一个 import-options 参数

gpg --import --import-options merge-only signature.asc
gpg --send-keys <KEYID>

3. mutt中发送签名的邮件
其实这个相对简单,正常写完邮件之后,在发送之前确认按“y”之前,先按“p”,开启 “pgp-menu”,里边会有选项和提示,是签名还是去掉签名,用哪个key签名等,签好了正常发送就可以了。

4. msmtp中发送签名的邮件
因为我有一个利用msmtp的脚本,用来在命令行下发送邮件。发普通txt邮件没什么问题,只是想给邮件签名再发送的话就得好好研究下这个邮件文件该怎么写了。

正常情况下,发送一个txt邮件,需要先写好一个邮件,包括From/To/Cc等信息,比如

$ cat >email.txt <<EOF
From: someone@somewhere
To: someoneelse@somewhere

This is a test email
EOF
$ msmtp -t <email.txt

这样在配置好msmtp的情况下,用 -t 参数告诉msmtp从stdin里读取收件人信息,直接就这么发出去了。

经过查看用mutt发给自己的带签名的邮件发现,签名信息其实就是一个附件,附在正文之后,只不过类型是”multipart/signed”和”multipart/pgp-signature”。不过仿造了几次带附件的邮件正文之后,发出去的邮件都报签名无法验证,也就是签错了……网上搜了好半天也没找到怎么把一个gpg签名附在一个邮件正文之后,最后还是去查标准吧,也就是RFC3156。里边对邮件哪部分是签名的信息,哪部分是后添加的header信息都做了说明,而且更主要的一点是,被签名的部分必须是 “CRLF” 结尾的,不能是单纯的 “LF” (也就是 \n)结尾,所以需要对正文进行一次 unix2dos 的转换……折腾了10次之后,终于发出了签名正常的邮件。

基本思路是,先把需要签名的正文写到一个临时文件里,然后用 unix2dos 转换格式,然后签名,得到签名信息。然后组装邮件头,模仿正常的签名邮件的格式就好,最后附上签名信息就可以了。把最后组装好的邮件文件写到指定的文件里。一个组装好的邮件文件的例子(里边的^M表示 \r\n,也就是需要签名的正文部分)

From: <from>
To: <to>
Subject: <subject>
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha1;
        protocol="application/pgp-signature"; boundary="x8WrEFNkdXnc"
Content-Disposition: inline


--x8WrEFNkdXnc
Content-Type: text/plain; charset=us-ascii^M
Content-Disposition: inline^M
^M
This is a test^M

--x8WrEFNkdXnc
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQIcBAABAgAGBQJYQ+hsAAoJECZSqilcj+djEUMQAJoDOM6lWX0sebjEZ/fgREAh
va/xKtYl3arD6BGrzuro2OdLrfWH0W+FM+/iNlOcGxmrECGv7QCQAD2okW+jbAes
hpeAlvGYQmS4l67y31nhY6lK5F2Uc2rzOqFOGOWiU4o/XKyueOYWJAdQzBm8hYG4
G042drLfE4Vvf81lReky9ElBoDpLzz+c7ExG2GVOs/4Ry8KabxyjtIPZelfOTNh+
8rZ+RWYHzBO9VLlImVK/z4p8+jutn9Dko6l2YkYnOcoZypChUA+/uFBLtxZe8cup
BJVrPkUaxrq+wik1abRCi97UAPw420EaiY9AjDZXZR7sy1cT9QLQ69BjOS1T4icb
RiEhoIvN4ctBxaN/Jq4mA7J2O2aYto9Kq2fRwLaNtWJwZpOmUFr8fQ9q4hcY/6K/
kiYAjp+L4A8DHXk4mhzaXJP1rJVhDITnnowel1FWirG7gPUCGe1ThGFoaqmrDF3o
PUJ6rmpcHn+sH6ppG5JjeHj3PantLIhzCA0VqQ+HxrlJ/E94G+BmrVo7Rvoj5p0v
omhSNiE7FTrvw6tKeDlyM8G59qCrsJ7ITTSL6oiHbCK8IFw938Jns/QaRnrDaFIo
C3l7zjZXrMqQQqbTeO1+LjeNntD2ggY9YmR83H3g3U5YFAfHdTtON7QUY/XtMQhG
LVKbouYC9D1r3/EULPnm
=fwZa
-----END PGP SIGNATURE-----

--x8WrEFNkdXnc--