最近需要将Word文档转为PDF,正好在阿里云的同学做过,于是请教他,他给了一些参考资料,解决了转换的问题。

其中Jacob因为只能用于Windows平台,所以没有尝试。尝试了JODConverter之后,可以转换,效果还不错,暂定使用它。

只是还是存在一点乱码问题,之后再看看怎么解决。

代码博主已经开源,我把它放在了Github上,加上命令行输入,可以见这里,主要使用Apache的common-cli这个库。

之后是在Intellij IDEA导出jar包,参考
Idea 导出 jar包即可。主要步骤如下

1
2
3
4
5
6
7
8
9
10
11
(1)File→Project Structure...→Artifacts→+→jar→From modules with .... → 选择一个要执行的main方法

(2)extract to jar

(3)选择manifest的位置:d:\idea\myproject\src

(4)勾选build on make

(5)build -- make project, (如不行,在此之前,执行下mvn clean)

(6)D:\idea\myproject\out\artifacts\ 寻找jar

参考资料

联系作者

之前同事做微信公众平台的扫描带参数二维码事件时老是提示”该公众号暂时无法提供服务,请稍后再试”, 当时没有得到解决,现在好好看了文档,尝试之后,终于得到解决,记录下来。

被动回复用户消息里看到如下一段话

假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。详见下面说明:

1、(推荐方式)直接回复success

2、直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)

一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:

1、开发者在5秒内未回复任何内容

2、开发者回复了异常数据,比如JSON数据等

1
2

看到这里推荐返回success, 而公司后台的api使用Django-REST-Framework,于是简单返回`return Response("success")`, 但还是一直报错,后来发现代码里写着

def get_renderers(self):
    if self.request.method == 'GET':
        return [TextRenderer()]
    return [XMLRenderer()]
1
于是将它注释掉试试,发现还是不行,默认情况下返回的使JSON字符串,于是将这个函数改为
def get_renderers(self):
    return [TextRenderer()]

```
错误消失了,问题解决。这里使用TextRenderer后,返回的格式是text/plain。

另外还发现一个问题, 生成带参数的二维码一共有两个文档, 文档1文档2, 一个有效期最长可以设置为在二维码生成后的7天,一个有效期最长可以设置为在二维码生成后的30天,真是蛋疼。

联系作者

最近从公司APP分享出去的一篇文章,访问量暴增,而访问计数直接访问的数据库,数据库产生行级锁,许多访问超时。

1
News.objects.filter(pk=self.object.id).update(view_num=F('view_num') + 1)

临时把访问计数去掉。之后找到Redis计数器。在访问文章时,使用incr自增。只是在访问文章列表时,如果对每篇文章都要读一次Redis会影响性能,于是只好做了延时处理,每个一段时间同步到数据库,并进行清零,等想到更好的解决办法再说。

清零时,最好不要使用set key 0这种用法,在多线程情况下会出问题,目前使用incrby key -view_num这种方式, 也就是减去目前Redis中浏览量的方式。

Redis确实是好东西,需要深入学习。

参考资料

联系作者

Django服务器的响应慢了, 想加上缓存。在网上查了之后,发现在queryset级别有3个选择。

  • django-cache-machine
  • johnny-cache
  • django-cachalot

最后选择了django-cachalot, 因为发现这个最靠谱。

安装后发现,目前的版本只支持Django1.8, 而1.2.1版本不支持缓存时间设置,也就是CACHALOT_TIMEOUT设置,而线上服务器的Django正好是1.7版本,于是只好放弃。

联系作者

需要给公司的域名添加HTTPS,决定先给自留地添加HTTPS支持,安装过程中遇到一些问题,记下来。

libbrotli安装

安装libbrotli时,出现Makefile.am:5: Libtool library used but LIBTOOL is undefined,执行yun install libtool安装即可。

/lib/lsb/init-functions: No such file or directory

执行yum provides ‘/lib/lsb/init-functions’ 可以找到哪个包支持。

1
redhat-lsb-core-4.0-7.el6.centos.i686 : LSB base libraries support for CentOS

之后执行yum install redhat-lsb-core-4.0-7.el6.centos.i686即可

安装免费证书

本来想 Let’s Encrypt, 但DNS解析出问题,想切换到外国的DNS,但考虑到公司的域名解析不能切换,所以继续找免费证书。最好找到沃通

参考资料

联系作者

在看Django源码时,知道了Counter,

1
2
3
4
5
6
7
8
9
# Check for duplicate app names.
counts = Counter(
app_config.name for app_config in self.app_configs.values())
duplicates = [
name for name, count in counts.most_common() if count > 1]
if duplicates:
raise ImproperlyConfigured(
"Application names aren't unique, "
"duplicates: %s" % ", ".join(duplicates))

感觉很不错,比用dict统计方便多了,以后需要计数时,就用Counter。看来collections库是个宝库,要好好看看。

联系作者

此前,MySQL的默认引擎是MyISAM, 所以导致数据库里很多表都是MyISAM, 而MyISAM是表级锁,很容易引起性能问题。最近服务又被锁住了,原因依然是MyISAM的表级锁。于是将MyISAM引擎改为InnoDB。

之前运维同事写过一个脚本,直接拿来用就好。
github地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# 将 db_name 下引擎为 MyISAM 的表改为 InnoDB

# 以下变量按需修改
host_name=''
user_name='root' # root 或该用户有 root 同等级权限
password=''
db_name=''

tables=$(mysql -h${host_name} -u${user_name} -p${password} -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='${db_name}' AND ENGINE='MyISAM';")

for table in ${tables}
do
if [ ${table} != 'TABLE_NAME' ]; then # 排除标题
echo ${table}
mysql -h${host_name} -u${user_name} -p${password} -e "ALTER TABLE ${db_name}.${table} ENGINE='InnoDB';"
fi
done

联系作者

之前测试服务器上的Thrift服务每天都报
OperationalError: (2006, ‘MySQL server has gone away’)错误,但正式服务器就不会,在网上找了很久还是没找到解决的办法。

最后在(2006, ‘MySQL server has gone away’) in django1.6 when wait_timeout passed找到如下回答:

If you hit this problem and don’t want to understand what’s going on, don’t reopen this ticket, just do this:

  • RECOMMENDED SOLUTION: close the connection with from django.db import connection; connection.close() when you know that your program is going to be idle for a long time.
  • CRAPPY SOLUTION: increase wait_timeout so it’s longer than the maximum idle time of your program.

In this context, idle time is the time between two successive database queries.

这里说对于这个问题,有两种做法,一种是关闭连接, 另一种是设置wait_timeout大于空闲时间。从这里明白原因,因为测试服务器没人访问,所以会断开连接,而正式服务器一直有人访问,所以不会。

关闭连接的话不想采用,不能每次使用都关闭连接。第二种也不采用。于是只好设置一个crontab任务,定时去访问Thrift服务。

联系作者

国内访问Docker官网镜像很慢,需要修改镜像地址。阿里云的速度不错,注册之后就可以拿到专属加速器地址。

阿里云后台有说明,根据不同系统,版本号,有相应的设置

我的Ubuntu上

1
2
echo "DOCKER_OPTS=\"--registry-mirror=https://xxxxxx.mirror.aliyuncs.com\"" | sudo tee -a /etc/default/docker
sudo service docker restart

其中xxxxxx需要替换成专属加速器。

在我的Mac上,根据Docker for Mac, 参考Preferences 设置, 在Preference->Advanced->registry mirrors里添加专属加速器地址

参考资料:

联系作者