使用wordcloud生成中文词云的汉字编码问题

用python对市长信箱的回复选登进行分析,需要作词云图,选择wordcloud包来实现。

网上很多都介绍了生成中文词云需要指定中文字体的路径,但我在使用中还遇到了utf8编码与unicode编码的转换问题。即utf8编码的字符串需要先转换为unicode编码,然后再送入wordcloud的fit_words方法才能正确显示中文词云。

示例代码如下:

rec=records
for i in range(0,len(records)):
	rec[i]=(unicode(records[i][0]),records[i][1])

tags=dict(rec)
wordcloud=WordCloud(font_path="/Users/wangliangxu/Desktop/SimSun.ttf",width=1200,height=600,max_words=400).fit_words(tags)

ubuntu服务器无法上网问题

服务器搬家后遇到的第二个大问题,三台机器(1台Dell PowerEdge R720,2台R920)都无法上网。分配了新的ip地址后,居然都ping不通网关。
R720最简单,将ufw关掉就解决了。

sudo service ufw stop
sudo ufw disable

但那两台R920,遇到了非常奇怪的问题。之前用ubuntu 14.04安装的时候,网卡是识别为em1的。后来升级为ubuntu 16.04后在之前机房也一直正常上网。搬迁之后使用新地址无法上网,因此直接就认为是网络地址的问题,和网管交涉后他们说没有限制。使用笔记本接入相同网络地址居然是正常的。这说明网络地址是没有问题的。

ufw关停,未解决。 tor关停,未解决。dnsmasq关停,未解决。
狠心重装了一台机器,在安装界面中注意到系统将网卡识别为eno1,但启动后无网络。ifconfig -a后发现网卡识别为em1。重新设置网络地址后,居然还不能上网。

再次搜索,发现网络上有可以在grub中设置网卡地址名称,将其设置为常规的eth0之类的网口,于是试验看看。修改/etc/default/grub
将其中的:

GRUB_CMDLINE_LINUX=””

修改为:

GRUB_CMDLINE_LINUX=”net.ifnames=0 biosdevname=0″

然后更新grub:

sudo update-grub

设置网络地址为eth0,重新启动系统。

这样居然可以解决问题!

小结:看起来应该是这个版本的一个bug,应该是网卡识别的问题。

参考:
https://askubuntu.com/questions/767786/changing-network-interfaces-name-ubuntu-16-04

mdadm中遇到can’t read superblock问题

服务器搬家,重启后遇到了一个大问题,磁盘软阵列无法挂载,遇到了问题:

mdadm can’t read superblock

所有的数据都在这个阵列上,需要快速解决此问题。从md3060e的指示灯上可以看出是有一块磁盘损坏,直接替换为新磁盘也无法解决问题。阵列是raid5,损坏一个磁盘应该是degrade,但应该不影响使用。数据应该是安全的,但需要加载回来。

最终将mdadm知识又温习了一遍,解决方案如下:

1. 定位损坏的磁盘
使用mdadm –examine /dev/sdx命令逐块检查磁盘信息,最终发现/dev/sdg磁盘损坏。
同时在检查磁盘时确认一下该阵列的组成磁盘(即除损坏磁盘后,该阵列还包括哪几块磁盘)。

2. 重新加载磁盘
使用命令:

mdadm –assemble /dev/md0 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdh /dev/sdi /dev/sdk

若提示有问题,可以加入–force –run参数,表示要强行启动。

3. 挂载及后续

mount /dev/md0 /disk1

通过mdadm –detail /dev/md0可以看出,此raid时在degrade状态下,需要补充进来一块磁盘。

mdadm /dev/md0 –add /dev/sdl

这样就可以自动rebuild了。

dell md3060e查看service tag

供应商需要md3060e的service tag,跑一趟机房太麻烦,就尝试看看命令能不能找出来。
进入/opt/dell/ServerHardwareManager/ServerHardwareManagerCLI/bin/目录,使用root账号运行:
./shmcli lpe
这样就能看到对应的service tag。

Window环境下qgis standalone程序开发环境设定

本文假定:
1. 采用qgis官方发布的安装程序(如QGIS-OSGeo4W-2.18.13-1-Setup-x86.exe安装包)
2. 使用默认的安装位置,即C:\Program Files\QGIS 2.18,如指定到其他目录,请修改对应的设定。
3. 假定示例数据目录为D:\QGIS\数据\

第一:设定环境变量
SET OSGEO4W_ROOT=C:\Program Files\QGIS 2.18
SET QGIS_PREFIX=%OSGEO4W_ROOT%\apps\qgis
SET PATH=%QGIS_PREFIX%\bin;%OSGEO4W_ROOT%\bin
SET PYTHONPATH=%QGIS_PREFIX%\python;%OSGEO4W_ROOT%\apps\Python27
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
SET GDAL_DATA=%OSGEO4W_ROOT%\share\gdal

即在cmd下执行上述命令,若路径不一致,请自行修改。

第二:运行一个样例
# -*- coding: utf-8 -*-
import os,os.path,sys

from qgis.gui import *
from qgis.core import *
from PyQt4 import QtGui

app = QtGui.QApplication([])
QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'],True)
QgsApplication.initQgis()

main_win = QtGui.QMainWindow()
frame = QtGui.QFrame(main_win)
main_win.setCentralWidget(frame)
grid_layout = QtGui.QGridLayout(frame)

map_canvas=QgsMapCanvas()
grid_layout.addWidget(map_canvas)
map_canvas.setCanvasColor(QtGui.QColor(255,255,255))
layer=QgsVectorLayer(ur'D:\qgis\数据\bou2_4p.shp','border','ogr')

QgsMapLayerRegistry.instance().addMapLayer(layer)
canvas_layer=QgsMapCanvasLayer(layer)
map_canvas.setLayerSet([canvas_layer])
map_canvas.zoomToFullExtent()

main_win.show()
# Need the following statement if running as a script
app.exec_()

可在前述cmd环境下运行python,将此代码粘贴进来运行。

第三,说明:
layer=QgsVectorLayer(ur'D:\qgis\数据\bou2_4p.shp','border','ogr')
这个语句,如目录名称中不含中文,则路径前的u可以移除。当然,也可以这样写:
layer=QgsVectorLayer(u'D:\\qgis\\数据\\bou2_4p.shp','border','ogr')
同时,建议在python下逐行执行来理解代码。

safari遭遇ssp.fwrd.com弹窗病毒

最近,突然发现safari会随机遭遇弹窗病毒,即会自动跳转几个网站,包括ssp.fwrd.com、ab4hr.com等网站,搜索发现有建议安装malwarebytes软件,尝试了之后,并不能解决问题。还有说reset safari可以解决问题的,也不能解决问题。
最终参考这个网站解决了问题:https://medium.com/@preitsma/how-to-remove-vsearch-adware-and-trovi-search-from-your-mac-osx-4b96555e68ff

具体步骤:
1. 进入~/Library/LaunchDaemons目录,发现是否有异常文件。在我的机器上发现了一个奇怪的文件:

com.apple.nalen.plist

cat这个文件,发现其中指向/Library/nalen文件。
于是将这两个文件都删除:
rm com.apple.nalen.plist
rm /Library/nalen

2. 删除已经运行的nalen文件:

ps aux | grep nalen

找到具体的pid,然后kill掉即可。

ubuntu 14.04升级到16.04遇到”无法计算升级”问题

一台服务器上计划操作系统升级,从ubuntu 14.04升级到16.04。但在do-release-upgrade过程中遇到了”无法计算升级”问题,导致升级程序退出。

网上搜索一圈后,最后在这儿找到答案:https://askubuntu.com/questions/202730/how-to-fix-the-unable-to-calculate-upgrade-issue-when-upgrading-from-12-04-to?answertab=votes

问题的关键,是要去看这个log文件:/var/log/dist-upgrade/main.log
不要被apt.log里一堆Broken误导。

BTW:最终检查问题也是postgresql-9.3-postgis-2.1的问题。

ubuntu临时禁止ipv6

单位的ipv6网络坏掉一段时间了,导致使用ipv6访问网站会链接不上,需要临时禁止掉ipv6网络。
在ubuntu下,加入要禁止eth0的ipv6网络,可以:
sudo su
echo 1 >> /proc/sys/net/ipv6/conf/eth0/disable_ipv6

gitlab升级:从7.8.4到9.4.5

升级gitlab,从7.8.4版本到9.4版本,中间跨越了几个大版本,需要一路升级上来,升级完成后,还需要修改对应的配置文件:
/etc/gitlab/gitlab.rb
将以下内容添加:
external_url 'http://git.westgis.ac.cn'
nginx['listen_port'] = 8000
postgresql['port'] = 5444
unicorn['port'] = 8001

然后重启服务:
sudo gitlab-ctl reconfigure
若发现nginx没有启动,则还需要观测nginx的配置文件是否正确:/var/opt/gitlab/nginx/etc/gitlab-http.conf

之前的升级,参见:gitlab升级

ipad起死回生记

一个老的ipad(ipad 3),很久不用,锁屏密码也忘记了,关键是home键也不灵(事后才发现这个问题)。经过多次密码尝试后,发现ipad已经显示为:ipad已被停用!
尝试通过DFU模式(power键+home键)进行恢复,但是怎么也进不去dfu模式,itunes一直提示要在ipad上响应,但ipad被锁死,无法响应。
于是尝试了一下另一个软件:爱思助手,发现其可以解决这个问题,他可以通过软件进入dfu模式。
最终通过这个方式将ipad重新安装,利用apple id重新激活,再重新还原,可以作为一个新的ipad使用了。