3
8
2016
2

ssh 会话复用及用户级的 sleep.target

这里看到 ssh 的 Control master 特性之后,就在~/.ssh/config里启用了这个特性:

ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster auto
ControlPersist yes
Compression yes

会话连接复用,对于以交互操作的使用,很不错的!对低延迟的服务器可能只是少了用户认证过程,但对于连接国外服务器,少了 TCP 握手、SSH 握手与认证等来来回回的过程,连接会快非常多的,尤其是对于常用的服务器,比如 GitHub 之类的,提速非常明显。

然后,问题就来了:系统挂起再恢复之后,大部分连接会 stalled,需要手工断开连接。即使配置了超时,它也不一定及时。于是我想,既然 netctl-auto 之类的服务能够在挂起系统时适当处理,那么我是不是也能写一个用户级的 systemd 服务来处理这件事情呢?

于是我按系统级的配置方法弄好了,结果什么也没有发生……后来才明白,只有系统级的 sleep.target,没有用户级的啊。

在 Arch Linux 官方论坛看到有人这么尝试,让系统级的 systemd 调用用户级的 systemd。配置有点不对,但是想法是非常好的!

于是就有了我现在用的方案:

[Unit]
Description=sleep.target of a systemd user session
Before=sleep.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
User=%I
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/bus
RemainAfterExit=yes
ExecStart=/usr/bin/systemctl --user start sleep.target
ExecStop=/usr/bin/systemctl --user stop sleep.target

[Install]
WantedBy=sleep.target

启用(enable)user-sleep@1000.service之后,系统挂起时,就会调用 ID 为 1000 的用户的用户级 systemd,也 reach sleep.target 啦。当然这个用户级的 sleep.target 也得自己写:

[Unit]
Description=Sleep
Documentation=man:systemd.special(7)
DefaultDependencies=no
StopWhenUnneeded=yes

然后就可以让用户级的服务WantedBy=sleep.target啦~

Category: 网络 | Tags: linux ssh systemd
1
10
2016
3

配置 spamassassin 来过滤垃圾邮件

虽然 GMail 的垃圾邮件过滤功能十分强大,误判率很低。但是我另有使用网易的邮件服务的域名邮箱,屡次教它哪些是垃圾邮件却依然不奏效。于是在本地配置一下 spamassassin 好了。

安装。在 Arch Linux 上这样子:

sudo pacman -S spamassassin
sudo sa-update

教学。之前就计划用 spamassassin,所以预先收集了不少垃圾邮件样本。喂给 sa-learn 学习一下:

sa-learn --spam --mbox < ~/.Mail/spam

过滤。编辑 ~/.procmailrc 配置文件,让 procmail 将邮件交给 spamassassin 检查,如果判定为垃圾邮件就放到特定的邮箱中:

:0fw: spamassassin.lock
* < 256000
| /usr/bin/vendor_perl/spamassassin

:0:
* ^X-Spam-Status: Yes
autospam

完成。其实挺简单的。

12
5
2015
21

博客「被入侵」之谜底

2015年9月13日,我的博客流量突然少了很多:

来自百度的访问量下降

因为博客突然被百度标记为「安全联盟提醒您:该页面可能已被非法篡改!」(后边那个峰的流量来源于知乎,与此事件并无关联。)

然而我一直未发现任何异常。我使用了 Google 站长工具,Google 也没说有任何异常。所以我以为这不过是百度又发了什么神经。毕竟它也说,「有一个网友举报」。「安全联盟」那里可以申请解封,但是需要出卖手机号等隐私。更神奇的是,它要求你修正问题,却连是什么问题都不清楚。「安全联盟」的客服表示,这事他们也不清楚。

然而几天前,又有网友报告我的博客跳转到了奇怪的页面。第一次有人报告时我只当用户系统或者网络的问题,虽然我也疑惑,恶意软件或者 ISP 插广告不至于插 CJB 的广告啊。但是对方并没有能力来调查此事。这次总算是遇到了一个会抓包的读者了。于是让报告者 @xuboying 帮忙抓包,这才真相大白。

简单地说,确实有页面在传输过程中被篡改了。至于是不是非法的,就得问「有关部门」了。

事情是这个样子的:我有一篇文章嵌入了 GitHub Gist。而 GitHub Gist 的域名 gist.github.com 被污染,其中一个污染 IP 为 216.234.179.13。这大概是 CJB 的源服务器地址。

本来呢,嵌入 GitHub Gist 的代码是这样子:

<script src="https://gist.github.com/lilydjwg/0bfa6807b88e6d39a995.js"></script>

当解析到 216.234.179.13 之后,最奇妙的事情发生了:

  1. CJB 使用了自签名、过期、弱密钥的证书。火狐会嫌它太弱而不可覆盖地拒绝,其它主流浏览器也会因为证书问题而报错。小米浏览器会询问用户是否接受有问题的证书(普通用户哪里懂这个啊,估计大都会选择接受吧)。一旦接受,则进入下一步。
  2. 该服务器在访问时会返回一句复合了 HTML 和 JavaScript 的脚本,修改window.location到 CJB 的主页。而引入 GitHub Gist 的方式恰好是 JavaScript 脚本,于是它得到执行,跳转到 CJB 主页去了……(不过现在只会返回空白页了。)

后来百度取消了那个「被非法篡改」的提示,不过权重依然很低,不注意看根本找不到我博客唉。

知道是 GitHub gist 的原因之后就可以很快找到遇到同样问题的人了,比如:

Category: 网络 | Tags: 网络 博客 安全 中国特色
11
22
2015
26

获取 Google Chrome 中打开的标签页的 URL

Google Chrome 把这些信息保存在配置目录下的Current Session文件里了,比如我的位于~/.config/google-chrome/Default/Current Session。这个文件是二进制的,使用 Chromagnon 里的脚本可以解析成文本,然后拿 Vim 编辑编辑就可以得到一行一个链接的文本文件了。这样就可以很容易地把它们在火狐里打开了,比如:

cat links | xargs firefox

这样就把链接们从 Google Chrome 里迁移到了一个单独的火狐窗口中。

我做这个的原因是,最近我的火狐运行微信时会持续占用一个 CPU 核。改用 Google Chrome 来运行微信之后风扇才能安静下来。然而 Google Chrome 的字体渲染我并不喜欢,更重要的是它会不时地崩溃一下。所以我辛辛苦苦「转发」了N个链接到「文件传输助手」,并艰难地(因为这个过程非常卡)将它们一一点开之后,希望能把这些页面转到火狐中来阅读。

暂时手工操作了。以后用得多的话再写自动化脚本。

Category: 网络 | Tags: 微信 Google Chrome 火狐
11
16
2015
23

[译] Vim 的蔓延

译自 Vim Creep。原文为英文,有很棒的朗读版。


开始的时候,一切都很平常。在初入大学的那一年,你试过它一两次,但是 Nano 和 Pico 更加简单——更像你高中时候在 Windows 和 Mac 机器上已经用过的东西。但随着时间的推移,你在大学的计算机科学课程上经历渐渐丰富,你开始注意到一件事:所有真正厉害的程序员——你花了十页代码的作业,他们随便写了四行就解决了;你艰苦奋斗了几个星期才勉强完成的课程项目,他们竟然在一天之内就超额完成了——他们都不用 Nano 或者 Pico。

一天夜里,为了完成一项午夜就要交付的作业,你正熬夜赶工。偶然间越过一位安静的超级程序员的肩膀,你瞟到了他的屏幕。你的眼睛在已经昏暗的计算机实验室里一排排的显示器中闪烁着,满怀敬畏地见证着代码和文字以不可能的方式闪过屏幕。

你疑惑地问:「你是怎么做到的?」

一个简洁的词从他口中吐出,永远地改变了你的生活:「Vim。」

一开始你很沮丧,更不谈工作成效了。你的浏览器历史里满是 Vim 在线文档的记录;你那些使用 Nano 和 Pico 的朋友认为你疯了;用 Emacs 的朋友央求你改变心意;为了查阅方便,你甚至花钱买了一份 Vim 速查表的纸板。经过了数星期的刻苦训练,你还是习惯性地去拿鼠标,然后又停下,意识到你得去网上学习一下完成一些常见的任务的正确方法。你以前可从来没有想过这个。

随着时间的流逝,你挣扎的次数越来越少了。你不太明白发生了什么,但是 Vim 不再阻碍你了。它的好超过了你的预期。它不再仅仅是一个使用键盘快捷键的文本编辑器——它成为了你身体的一部分。不,它成为了作为一名程序员的你的一部分本能。

只用 Vim 来编辑源码似乎大材小用了。你在你家里的所有机器上都安装了 Vim。你用它来输入一切文字,从电子邮件到学术论文。为了能够随身携带,你往U盘里安装了一个移动版的 Vim,并配有精心调整的个性化的 .vimrc 文件。这样,它陪伴着你,使你心安,让你不论在哪里都有一点家的感觉。

Vim 进入了你网上生活的每一部分。不满足于功能贫乏的 ViewSourceWith,你很快学会了 Vimperator,然后又换成 Pentadactyl。你以前只是在互联网上冲浪,而现在,你就是互联网。当你要写一个 iPhone 应用程序的时候,你做的第一件事情是把 XCode 的默认编辑器换成 MacVim。当你的工作是写 .NET 代码,你立即购买了一份 ViEmu for Visual Studio,因为你对免费的替代品——VsVim——的功能并不满意。

一天夜里,你正在你的工位上埋头苦干,完成一个第二天上午就要到期的项目。你对你自己笑了。普通程序员可绝不能在期限之前完成这样的工作。你录制各种宏;你轻轻地敲动手指,移动着整块整块的代码;你用上了一大堆寄存器;你重写着重构着整个组件,却根本不瞅一眼鼠标。你注意到显示器上映出的影像。一位同事正在你身后睁大了眼睛看着。你微微停顿了一下,让他知道你注意到了他的存在。

「你是怎么做到的?」他问道,语气里充满了敬畏。

你微笑了一下,准备说出那个改变了你的一生的词。那个词,如果你的同事也选择追随的话,他会掉进同样的兔子洞,进入一个充满无限可能的无限组合的世界,那些组合产生出他之前只能在最疯狂的梦中见到的极致高效。他让你记起多年以前那个昏暗的计算机实验室里的自己。带着些许兴奋,你轻轻地说出那个词。

「Vim。」

:wq


翻译比阅读难多了喵 0.0

Category: Vim | Tags: vim 文学 译作
11
11
2015
49

使用 RSS 订阅知乎专栏

知乎专栏不提供 RSS,那我自己做一个好了。用法见网站:https://rss.lilydjwg.me/。计划是支持各种我想要使用 RSS 订阅却又不提供的网站。当然目前只支持知乎专栏啦。代码是开源的,欢迎来提交 pull request :-)

2015年11月12日更新:其实我所使用的 RSS 阅读器——InoReader——是支持订阅知乎专栏的……不过我有对其排版做处理的,就是删掉所有的 <br>。知乎专栏的页面有时会有很多 <br>,其页面使用 CSS 隐藏掉了一些 <br>,但是 RSS 阅读器里它们都显示出来了,搞得段落间距很大。

我这个程序打算支持多种多样的来源的。而最初的想法是针对性地做中文乱码的处理,只是现在那些乱码早已消失了。知乎专栏只是开了个头,以后有需要慢慢加别的东西啦。

2016年12月14日更新:支持订阅知乎用户的动态了。

Category: 网络 | Tags: rss 知乎
11
4
2015
23

从 slim 到 lightdm

从一开始使用 Arch Linux,我就选择了 slim 作为登录管理器。因为它轻量嘛,而且配合 Arch Linux 自己做的主题也挺漂亮的:

slim 登录界面

所以即使 slim 不再使用配置文件来指定有哪些桌面环境可用,改用无法指定顺序的 .desktop 文件,我只好告诉 pacman,不要升级 slim 了。

于是就这么用了很久,直到 lightdm 出世,直到 slim 所使用的托管网站关闭、停止开发,我也依然在用 slim。

直到有一天,那是在 systemd 开始使用用户级别的 session D-Bus 之后。我登出了会话,再次登入时,发现整个系统都不好了,因为 DBUS_SESSION_BUS_ADDRESS 环境变量没有被设置,导致程序找不到 session bus 而自动启动了一个。可我用户级别的 systemd 还在旧的 session bus 里呢,联系不上了。当然 tmux 里所使用的 session bus 也开始混乱了(我有让 tmux 从环境里更新各种 window 中的 DBUS_SESSION_BUS_ADDRESS 变量)。

究其原因,是因为 slim 没有正确地处理 sesssion。从 loginctl 及 systemd-cgls 可以看到,重新登录 slim 之后,进程并没有处在新的会话里,而是复用了旧的会话。

systemd 上,会话管理是 pam_systemd 来管理的,同时它会引入 DBUS_SESSION_BUS_ADDRESS 环境变量。PAM 会话是有一个 leader 进程的,它的结束标志着这个会话的结束(当然里边存活的进程还会继续存在)。比如文本终端登录用的 login,每一次登录都是一个新进程。比如 sshd,每个连接都是由单独的子进程来处理,PAM 会话也是那个时候打开的。然而 slim 却是在父进程里打开了 PAM 会话。于是 pam_systemd 一看,这个 session leader 怎么又要打开会话啦?报错:

8月 02 21:54:32 lilyforest slim[669]: pam_systemd(slim:session): Cannot create session: Already running in a session

所以,slim 下,只有第一次登录是正常的……

所以是时候换个跟得上时代的登录管理器了。那就 lightdm + GTK greeter 好了。

这个我以前也用过,不过没怎么配置所以背景一片漆黑,难看死了。这次制作了张背景图,在/etc/lightdm/lightdm-gtk-greeter.conf里配置一下

[greeter]
background=/usr/local/share/pixmaps/background.png

咦?还有头像?那就放一个~/.face好了。什么?lightdm 你没权限读取它?OK,给你权限:

setfacl -m u:lightdm:x ~
setfacl -m u:lightdm:r ~/.face

我的 HOME 目录的权限是 750,别人(other)进不来的,所以要给 lightdm x 权限。

最终的样子就是这样,也挺漂亮的,功能还挺全 :-)

lightdm 登录界面

Category: Linux | Tags: linux X Window systemd X window
10
26
2015
52

使用 Wine 运行 QQ 轻聊版

2021年07月11日更新:轻聊版已经不可用。

截图

Wine QQ 轻聊版 7.5

注:图中的文字方框已经解决。

安装使用

测试过的 Wine 版本为 1.7.52、1.7.54。1.7.53 是坏的。1.6 系列大概跑不起来。

Wine 环境下载地址签名,使用的新 key)。压缩包中安装的是官方完整版的 QQ 轻聊版 7.7(安装文件名 QQ7.7Light.exe)。

文件最后更新于2016年1月29日

  1. 下载文件并解压、找个地方放好(移动之后启动图标会失效)。
  2. 如果系统上没有 simsun.ttc 字体,去网上下一个放到 ~/.fonts 中。或者到解压出来的 Wine 环境里 winetricks fakechinese 也行。
  3. 运行解压出来的目录下边的install-icon.sh脚本来安装启动图标

安装好之后,在你通常找所有已安装的应用程序的地方就可以找到「Wine QQ 轻聊版」的启动图标了。你也可以运行解压出来的目录下边的qq脚本来启动,但必须在那个目录下运行。

在火狐里点击「加入QQ群」之类tencent://协议的链接时,也是可以调用到的哦~不过即使已经登录,也会开启新的 QQ 登录界面。但是不这样又会有更严重的问题,所以凑合着用吧。

其它调整,如使 QQ 无限制地访问文件系统(默认只允许访问 C 盘)、更改一些文件的存放位置、字体选择与渲染选项,请自行修改。想要 Flash 的也请自己 winetricks 安装。

已知问题

  • 记不住密码
  • 密码框需要耐心地点几下才能开始输入
  • 表情图片只有启动后的第一次使用时正常,之后弹出窗口的内容不能正常显示
  • 窗口周围部分的显示不正常(可能和 Awesome 有关)
  • 使用 Windows 内建的移动窗口功能(拖动窗口边框、标题栏)时可能会导致窗口开始避开鼠标指针(可能和 Awesome 有关)
  • 部分群文件下载能够成功,但是界面上看到的进度一直是0字节未完成状态(比较小的文件不受影响)

制作步骤

由于之前的 TM2013 已经很久没更新了,有很多功能都跟不上(比如群公告、语音消息等),所以我又 Wine 了新版本。QQ 轻聊版感觉就是 QQ 标准版去掉了广告,不用付费开通会员来去掉那些干扰广告了。

首先 winetricks 一下:

winetricks sandbox riched20

然后把 Windows 版本设置为Windows 8.1(大于 XP 即可)。不设置安装不上,因为缺少CmRegisterCallback函数。

将 QQ7.5Light.exe 安装文件链接到 C 盘内,安装。

再打开 winecfg,作如下设置:

  • 设置 Windows 版本为 Windows XP
  • 「增加程序设置」,找到 drive_c/Program Files/Common Files/Tencent/QQProtect/Bin/QQProtect.exe 文件,设置其版本为 Windows 8.1(不然会出错)
  • 回到「默认设置」,切换到「函数库」标签,添加「txplatform.exe」「函数库顶替」,并且设置为「禁用」

禁用 TXPlatform.exe 会导致tencent://链接不能在已有的 QQ 里打开。但是启用它会导致登录不了或者退出不了(卡住)的情况。

从 Windows 上复制 iphlpapi.dll,放到 system32 目录,并设置原装优先,以绕过「查找」对话框打开时卡死的问题。

修改system.reg注册表文件,设置 Tahoma 的 FontLink 项(不然部分文字乱码):

[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontLink\\SystemLink] 1420549548 0
"Tahoma"="simsun.ttc,SimSun"

当然你也可以把这里的宋体替换成你想要的任何字体。

另外,这里有人在制作并维护 Wine QQ 精简版。

2015年11月12日更新:更新到 QQ 轻聊版 7.7。旧版用户以 Windows 8.1 版本号来运行 7.7 的安装程序即可更新。

旧的 QQ 轻聊版 7.5 Wine 环境下载地址签名,使用的新 key)。压缩包中安装的是官方完整版的 QQ 轻聊版 7.5(安装文件名 QQ7.5Light.exe)。

2016年3月5日更新:请禁用QQProtectUpd.exe或者将drive_c/Program Files/Common Files/Tencent/QQProtect目录及其下的所有文件设置为只读(chmod -R -w 目录),以免 QQ 自动后台更新之后崩溃。

Category: Linux | Tags: linux windows QQ wine 腾讯
10
10
2015
6

评知乎的「友善度」制度

最近有朋友贴了知乎上关于 wintercn 的「狗日的知乎」项目。我一向不喜欢粗话,但是此处例外。我不讨论 wintercn 的行为本身,而想看看这被众人骂的「友善度」制度是怎么回事。

知乎的「友善度」制度跟某国的一些社会制度有得一拼:这是屁股指挥大脑的又一次胜利。

首先,我们来看,「友善度」制度的目的何在?

作为一个问答论坛网站,知乎上必然会存在相冲突的观点。人非圣贤,这些具有相冲突观点的人必然会吵起来。知乎觉得这样子太不和谐了,于是搞了个「友善度」出来,希望借此来管制这些不「友善」的言论。

你骂人了扣分,说脏话了也扣分,让某人觉得不爽了也扣分。「友善度」太低在知乎上就会被限制了。

张三是一个普通人。有一次跟别人激烈辩论导致表示「友善度」的星星少了不少。他想尽快恢复「友善度」。怎么办呢?答案不是作出优质的回答、让很多人佩服、感激,然后点赞。那是 StackOverflow。知乎的答案是去举报别人。举报这一行为本身是不友善的,所以在 StackOverflow 你踩别人自己也是要掉 rep 的,这样子你在踩的时候就会慎重了。然而那只是墙外的花罢了。在知乎是这样子的:

知乎上的举报战

(图片来源于知乎网友,标注亦为其所加。)

「反正举报失败不扣友善度」,而成功了「友善度」会涨。这就是不要钱的彩票啊,中奖率还挺高的。

于是,张三在知乎四处游荡。看到李四和王五争论起来了呢。不管他们在争论什么,也不管他们的意见如何,看到稍微过激的言论就去举报。反正也没什么损失嘛。

李四很奇怪:好好的讨论怎么就被删掉了呢?但是李四是个友善的人,才不屑于互相打小报告那一套。然而李四因为观点鲜明,得罪了不少小人,最终被知乎禁言啦。他的墓志铭写着:「这是一个高尚的人」。

制度,不仅要看它做了什么,更重要的是它鼓励了什么

更新:知乎也默默地实行「选择性要求登录」策略了。文中引用到的回答不登陆看不到,难怪没有被删除。

Category: 未分类 | Tags: 知乎 中国特色
10
8
2015
12

ES6 好棒!

SegmentFault 的通知页里的链接总是会在新标签页打开。这对于我来说就多了一个需要关闭的标签页——我本可以在最后一条新通知时不打开新标签页的。我习惯由我自己来控制链接在哪里打开,会根据情况选择在后台新标签页打开或者在当前标签页打开。SegmentFault 通知页这样子在前台标签页打开对于我来说除了烦人之外便毫无用处

然而 SegmentFault 改来改去,最终似乎还是决定像很多国内网站那样让我这种用户厌烦。罢了,是时候让油猴出场了。这次尽情使用 ES6 好了=w=

// ==UserScript==
// @name          SegmentFault Enhancement
// @namespace     http://lilydjwg.is-programmer.com/
// @description   SegmentFault Enhancement
// @include       http://segmentfault.com/*
// @include       https://segmentfault.com/*
// ==/UserScript==

// jshint moz:true

if(location.pathname === "/user/notifications"){
  let elements = document.querySelectorAll('section.stream-list__item a[target]');
  for(let el of elements){
    el.removeAttribute('target');
  }
}

虽然不是第一次使用let了,但for...of是第一次使用。这感觉好棒!跟写了好长时间的 C 之后发现表达力强大的 Python 一样!

现在的 ECMAScript 越来越像语法怪异的 Python 了呢 ;-)

PS: 在网页里写上在新标签页打开有安全隐患的。

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com