用 Pygments 在 Word 中实现代码高亮

虽然日常都是在写代码,但有的时候,还是需要写一些Word文档。这时候在Word文档中贴代码的时候,就希望能够做到代码高亮。

可以看一下rtf formatter的说明pygmentize -H formatter rtf:

1
2
3
4
5
6
7
Format tokens as RTF markup. This formatter automatically outputs full RTF
documents with color information and other useful stuff. Perfect for Copy and
Paste into Microsoft(R) Word(R) documents.

Please note that ``encoding`` and ``outencoding`` options are ignored.
The RTF format is ASCII natively, but handles unicode characters correctly
thanks to escape sequences.

可以看到,复制出来的是RTF格式的,能够复制、粘贴到Word文档中,并带上语法高亮等特性。

使用时只需要执行如下命令,

1
pygmentize ~/tmp/a-pod.yaml -f rtf | pbcopy

然后在Word等支持RTF格式的软件中粘贴即可。


MySQL解决ONLY_FULL_GROUP_BY的几个方法

问题

employee 示例数据库为例,测试环境用了一条语句:

SELECT * FROM employees GROUP BY gender;

在测试环境运行正常,但是在线上就会有问题,报错如下:

1
2
3
4
5
6
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mse.msc_k8s_cluster.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)

原因

MySQL 在ONLY_FULL_GROUP_BY模式下,有如下约束:

执行了带 GROUP BY 和 ORDER BY的SELECT语句,就需要保证你 SELECT 的列都在 GROUP BY 和 ORDER BY 中。

打个比方,如果有数据如下:

emp_no gender
1 M
2 M

如何恢复Firefox会话中的url

昨天升级到了macOS Catalina 10.15 Beta (19A526h),发现Firefox无法打开了…

不得以,只能看下如何在不打开Firefox的情况下,将会话中打开的url拿出来。

首先,得找到Profile的问题,参考 https://support.mozilla.org/en-US/kb/profiles-where-firefox-stores-user-data 找到位置,将Profile目录下的sessionstore-backups文件夹拷出来。

其中,recovery.jsonlz4文件即为会话的恢复信息,但是这个文件不是标准的lz4压缩文件,得使用特殊的工具来解压,在 https://github.com/avih/dejsonlz4 下载dejsonlz4源码,编译。

通过命令将jsonlz4解压成json:

./dejsonlz4 /path/to/recovery.jsonlz4 /path/to/output/recovery.json

接下来就是探索这个recovery.json的内容了,很简单:

  • jq keys查看这个json文件中的顶级key,比如cat recovery.json | jq keys
  • 查看某一个节点可以通过.来引用,比如jq '.[0].entrys'就是查看第零个元素中的entrys属性

最终,可以通过如下命令输出会话中所有的url:

1
jq -r '.windows[].tabs[].entries[].url' recovery.json 

macOS下使用ZMODEM协议上传/下载文件

有时候,我们ssh登录服务器操作(甚至经过跳板机),然后这个时候,我们想下载、上传一个文件,就必须重启启动一个终端,运行scp命令。这个非常的繁琐,而且要上传、下载的目录也需要自己复制粘贴,有没有办法能够在ssh会话中上传、下载文件呢?

查了下,还真有这么一个协议,叫ZMODEM

原理

下载文件

在服务器上执行sz(Send by ZMODEM),先在终端上输出**B00000000000000,然后客户端在终端发送指令,表示拒绝,还是接收(接收的话,就在客户端运行rz指令与服务端交互)

上传文件

在服务器上执行rz(Receive by ZMODEM),先在终端上输出rz waiting to receive.**B0100000023be50,然后客户端发送指令,表示取消,还是上传(上传的话,在客户端运行sz命令与服务端交互)。

可以看到在上述流程中,对Terminal的要求就是,遇到特殊指令,触发对应的操作(执行本地命令)。

遗憾的是,我一直使用的、macOS自带的Terminal.app不支持这个,所以我只能放弃Terminal.app,使用iTerm2(v3.3.0beta5)了。

如何配置


Firefox无法播放mp4格式的视频(Fedora)

最近又开始用起来Fedora了,昨天发现Firefox没法看视频:

console提示如下:

HTTP “Content-Type” of “video/mp4” is not supported. Load of media resource https://example.com/incorrect\_feedback.mp4 failed.
VIDEOJS: ERROR: (CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) No compatible source was found for this media.

尝试了下fedora-cisco-openh264.repo提供的mozilla-openh264,还是无法播放。

看了下网上的说明,mozilla-openh264这个plugin,是为了在WebRTC会话中解码H.264的。

而网上所说的,安装gstreamer系列的,那是因为Firefox旧版本是使用gstreamer来解码的;新版的Firefox使用了ffmpeg来解码视频。

所以只需要安装compat-ffmpeg28就行了:

sudo dnf install compat-ffmpeg28


Wordpress报错“e.visibility is undefined”

在我的博客上,一直无法用Wordpress的古腾堡编辑器来编辑。

一打开就出现这个页面:

console上报错:“e.visibility is undefined”:

搜了下,发现确实有人提issue:https://github.com/WordPress/gutenberg/issues/12655。但是神奇的是,问题是由nginx配置导致的。

我原来在Nginx中对Wordpress的配置是:

但是看了下,无论是Nginx的官方文档,还是Wordpress的官方文档,都推荐如下配置:

1
2
3
location / {
try_files $uri $uri/ /index.php$is\_args$args;
}

Shadowsocks + simple-obfs + IPv6 [CentOS 7]

Sometimes, the network traffic need to be encrypted and obfuscated. shadowsocks + simple-obfs is a simple solution. shadowsocks is a socks5 proxy, with traffic encryption. all traffic through shadosocks will be encrypted. simple-obfs is used for obfuscate traffic. The upstream traffic encapsulation in HTTP or tls stream. The outer traffic will look like an HTTP session.

Server-side config

Install shadowsocks, simple-obfs

Enable copr and install:

curl https://copr.fedorainfracloud.org/coprs/antonchen/proxy/repo/epel-7/antonchen-proxy-epel-7.repo -o /etc/yum.repos.d/antonchen-proxy-epel-7.repo
dnf install shadowsocks-libev simple-obfs

Config shadowsocks:

# cat /etc/shadowsocks-libev/config.json
{
“server”: [“[::1]“, “127.0.0.1”],
“server_port”: 8888,
“password”: “Password”,
“timeout”: 600,
“method”: “salsa20”,
“fast_open”: true,
“workers”: 2,
“plugin”: “obfs-server”,
“plugin_opts”: “obfs=http;fast-open=true”
}

server with value ["[::1]", "127.0.0.1"] means listen 127.0.0.1 and ::1(localhost in IPv6), not listen all interface. fast_open means use TCP Fast Open, but with plugin, so actually 8888 is listened by obfs_-server, so we add fast-open=true to plugin_opts._ ipv6_first means while proxying DNS request, use IPv6 firstly. When you access google.com via proxy, you will use IPv6. Start it, make it autostart:

systemctl start shadowsocks-libev
systemctl enable shadowsocks-libev

Then,


ssh卡在debug1: SSH2_MSG_KEXINIT sent的解决办法

在公司通过kerberos登录ssh,完全没有问题。但是在家里通过l2tp连接vpn后,就无法登录了。

通过ssh -v查看日志,发现卡在debug1: SSH2_MSG_KEXINIT sent这一步。

查了下,发现是因为mtu设置太大


但是由于系统的网络是NetworkManager管理的,如果需要自动设置mtu,connection的配置中并没有vpn对应的mtu设置。

后来,看了有人使用dispatcher脚本来设置:

创建/etc/NetworkManager/dispatcher.d/vpn-up文件,内容如下

1
2
3
4
5
#!/bin/sh

if [ "$2" = "vpn-up" ]; then
ip link set "$1" mtu 1350
fi

然后vpn连接的时候,就会自动设置mtu了。


Fedora上完美的使用QQ

目前看下来,Linux使用QQ还是Deepin比较好。 CrossOver上的QQ目前不能记住密码,其他还好,比如聊天啥的也是可以的。 Deepin的QQ是目前最好的解决方案。 安装如下:

  • 首先,从百度网盘下载crossover-15_15.0.3-1_all-free.deb 。解压其中的opt/cxoffice/ 到/opt/cxoffice/
  • 其次,从镜像站点下载Deepin的QQ,apps.com.qq.im_8.1.17255deepin11_i386.deb
  • 解压apps.com.qq.im_8.1.17255deepin11_i386.deb 中的opt/cxoffice/support/apps.com.qq.im 到/opt/cxoffice/support/apps.com.qq.im
  • 然后执行/opt/cxoffice/bin/crossover
  • 在CrossOver点击QQ启动即可。

Fedora KDE 25下安装fcitx输入法

首先,安装fcitx之后,只要是接受了GTK_IM_MODULE 、QT_IM_MODULE 、XMODIFIERS 环境变量的程序,都可以使用fcitx输入法了。 但是,即使我在~/.xprofile 里面写了这三个export语句,程序也没法读到这三个环境变量。 后来发现,这里面有两个坑:

  1. Fedora KDE的display manager换成了SDDM,而在SDDM的配置文件中,默认不会执行~/.xprofile 里面的语句。

  2. SDDM问题解决后,发现fcitx依赖的imsettings,会设置这三个变量,所以在~/.xprofile 里面export的变量,其实会被imsettings覆盖。


Robert Lu

关注我的公众号