前天将公司的一台服务器装成了 ubuntu server ,然后就开始部署环境了。自从用上了 Fabric 后将相关的安装脚本写在一起,对于部署来说已经方便很多了。但部署这个环境还是让我费了很大的功夫。

依赖问题和一堆编译参数

安装一个软件的时候依赖比较多,如果用 apt-get 方式安装的还好,自己编译的话就比较惨了,各种依赖问题和一堆的编译参数。编译参数的作用写的也不是很明白,很多时候都需要自己一个个试出来。而且还会遇到一些奇怪的编译失败的情况。可以想像如果没有类似 google 、百度之类的搜索引擎的话,基本上安装工作就无法顺利完成。

Read More

前段时间拿golang写了一个tcp连接代理,后端由python来处理逻辑,中间通信用了zeromq。本来呢我还是挺满意这套方案的,一是golang写的东西稳定性还不错,性能高,用chan实现goroutine间的通信十分方便;二是zeromq来跟后端的python做通信,让python进程来处理逻辑部分,如果逻辑更新只需要重启python就可以实现不断线更新代码;三是zeromq的通信模式很适合做成分布式,不需要自己处理一些仔细问题。但在使用zeromq的过程是对于req/rep模型的服务端死亡后导致客户端一直阻塞的情况没有找到比较好的解决方案,只能使用超时机制。如果能有超时加错误状态的冲突检测功能就好了。

后来在跟卿卿聊天中提到了erlang,原先我也考虑过这个东西,只是一直没去学它,本来打算做为以后改进时使用的一个备用方案留档的。不过现在既然翻出来了就决定好好的学习一下,毕竟这货是专门为了分布式而生的。

先在此挖个坑。。。。。

在自己的 mac 上装了 Erlang R16B02 (erts-5.10.3) ,顺便看了一些相关的资料,越看越觉得这货很好,分布式的能力太强大了。

前段时间翠翠同学问我有没有接触过buildout这个东西,说是用来构建python环境的。我以前从来没有用过这个,之前很长的一段时间里都是用virtualenv来做python环境的隔离,每个项目建一个,防止第三方库的版本问题。不过既然有提到这个东西那么我也去瞧瞧这货是个怎么样的原理,结果找来找去就几篇中文资料介绍这个的,而且讲的都不全部,很多地方都一笔带过,有点看不太明白。官方的文档写的也不咋滴,只好自己硬着头皮去试,最后大致上是理解了一些。

建立buildout.cfg

首先呢buildout是依靠项目目录下的buildout.cfg文件来安装依赖的包和生成相关配置的。先来安装一下zc.buildout吧。

1
pip install zc.buildout

直接在主环境下执行这个安装就行了,用easy_install也可以。

安装完成之后在项目目前中使用 buildout init 命令就可以生成配置文件和相关目录。做版本管理的时候只要把buildout.cfg文件加入git中基本就行了。

Read More

原来我使用的一直是 \\u4e00-\\u9fa5 ,今天在匹配中文标点的时候匹配不上,就查了一下相关资料,原来unicode跟中文有关的范围还有好几个。

字符范围表

1.标准CJK文字

范围:\u3400-\u4DB5,\u4E00-\u9FA5,\u9FA6-\u9FBB,\uF900-\uFA2D,\uFA30-\uFA6A,\uFA70-\uFAD9 说明:一共有好几个范围,除 \u4e00-\u9fa5外 都不是很常用 参考地址:http://www.unicode.org/Public/UNIDATA/Unihan.html

Read More

最近用Titanium Mobile开发点手机端的东西,刚创建应用的时候用的是英文的app名,但现在要弄一个发给同学用秀,以后还得给用掉,如果都用英文名的话对国内的用户太不友好了。

我用的是Alloy这个MVC框架,里面的app配置文件是tiapp.xml,应用的名称就是里面的 <name>appname</name> 这一段。如果直接输入中文在编译的时候是会提示编码错误的。想来这个应该也不会用什么特别的编码估计就是unicode之流,所以在ipython里面像下图所示输入就可以得到 uxxxx 形式的字符串。

image

把上图中 \u4e2d\u6587\u5e94\u7528\u540d 复制出来放到name标签中就正常生成了。

最近因为工作的关系不得不拿起可恶的前端,然后很正常的就被各种兼容问题给坑了。在写一个js效果的时候需要获取 scroll Y轴的位置,然后从网上找了一段js脚本来判断这个,后来发现还是没解决兼容问题,可能那段脚本是比较老的,不适应现在的情况。后来在 http://blog.sina.com.cn/s/blog_6d3183b5010140nr.html 这里找到了一张比较全面的浏览器scroll兼容表。 内容如下:

非quirk模式 IE6 7 8 IE9 firefox opera chrome safari
scrollY undefined undefined 正确 正确 正确 正确
pageYOffset undefined 正确 正确 正确 正确 正确
body.scrollTop 0 0 0 0 正确 正确
documentElement.scrollTop 正确 正确 正确 正确 0 0
quirk 模式 IE6 7 8 IE9 firefox opera chrome safari
scrollY undefined undefined 正确 正确 正确 正确
pageYOffset undefined 正确 正确 正确 正确 正确
body.scrollTop 正确 正确 正确 正确 正确 正确
documentElement.scrollTop 0 正确 0 0 0 0

window.pageYOffset 是只读的

根据上面的表写了下面这两个coffeescript函数,测试过IE7-10,firefox,safari,chrome,暂时没发现什么问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 获取滚动条的位置
getScrollY = ->
if window.pageYOffset == undefined
# IE6 7 8
if document.body.scrollTop
# quick模式
document.body.scrollTop
if document.documentElement.scrollTop
# 非quick模式
document.documentElement.scrollTop
else
# 除IE6 7 8以外的所有浏览器
window.pageYOffset

# 设置滚动条的位置
setScrollY = (y) ->
if window.pageYOffset == undefined
# IE6 7 8
# quick模式
document.body.scrollTop = y
# 非quick模式
document.documentElement.scrollTop = y
else
# 除IE6 7 8以外的所有浏览器
document.documentElement.scrollTop = y
document.body.scrollTop = y

通常我在vps备份pgsql都是直接使用pg_dump,但这个工具不支持增量备份,每次都传完整的数据回本地比较花时间。昨天发现了barman这个工具,看介绍好像是可以实现比较方便的备份pgsql,还可以在远程直接备份到本地,增量方面应该是利用了wal归档日志做的。下载过来做个备份实验试试,官方网站是:http://www.pgbarman.org/。

安装barman

首先呢,这个程序是用python写的,所以直接用pip安装吧,依赖部分自己处理一下,psycopg2这个pgsql的驱动需要用到postgresql的dev库。

系统需求

  • Linux/Unix
  • Python 2.6 or 2.7
  • Python modules:
  • argcomplete
  • argh >= 0.21.2
  • psycopg2
  • python-dateutil < 2.0 (since version 2.0 requires python3)
  • distribute (optional)
  • PostgreSQL >= 8.4
  • rsync >= 3.0.4
1
pip install barman

note

根据官方的描述,barman需要使用pgsql9.0以上版本。

尝试同一台机子的备份

按照官方的说明,这玩意是支持远程备份的,但我看了他们的配置似乎要在服务器上通过配置pgsql来直接把每次生成的wal复制到备份机,这个对于我这种没有固定备份机的比较麻烦。所以就先试一下直接在vps进行增量备份,然后再想办法解决其它的事情。

note

准备配置的时候才发现我弄错了,其实应该从官网下载源码的,源码包里面的doc目录下有个barman.conf配置文件需要用到。

把barman.conf放到/etc/barman.conf或着~/.barman.conf都可以。

配置文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
; Barman, Backup and Recovery Manager for PostgreSQL
; http://www.pgbarman.org/ - http://www.2ndQuadrant.com/
;
; Main configuration file

[barman]
; Main directory
barman_home = /var/lib/barman

; System user
barman_user = root

; Log location
log_file = /var/log/barman/barman.log

; Default compression level: possible values are None (default), bzip2, gzip or custom
compression = bzip2

; Pre/post backup hook scripts
;pre_backup_script = env | grep ^BARMAN
;post_backup_script = env | grep ^BARMAN

; Directory of configuration files. Place your sections in separate files with .conf extension
; For example place the 'main' server section in /etc/barman.d/main.conf
;configuration_files_directory = /etc/barman.d

; Minimum number of required backups (redundancy)
;minimum_redundancy = 0

; Global retention policy (REDUNDANCY or RECOVERY WINDOW) - default empty
;retention_policy =

; Global bandwidth limit in KBPS - default 0 (meaning no limit)
;bandwidth_limit = 4000

; 'main' PostgreSQL Server configuration
[main]
; Human readable description
description = "Main PostgreSQL Database"

incoming_wals_directory = /root/bak/incoming/

; SSH options
ssh_command = ssh root@localhost

; PostgreSQL connection string
conninfo = host=localhost user=postgres dbname=pitayacd

; Minimum number of required backups (redundancy)
; minimum_redundancy = 1

; Examples of retention policies

; Retention policy (disabled)
; retention_policy =
; Retention policy (based on redundancy)
; retention_policy = REDUNDANCY 2
; Retention policy (based on recovery window)
; retention_policy = RECOVERY WINDOW OF 4 WEEKS

我这里图省事直接用root用户了。

配置postgresql

需要配置postgresql开启wal归档,打开postgresql.conf文件在里面配置下面的信息。

1
2
3
wal_level = archive
archive_mode = on
archive_command = 'rsync -a %p root@localhost:/root/bak/incoming/%f'

配置ssh-key认证

重启postgresql服务之前还需要对postgresql的运行用户进行ssh认证的配置,配置成无密码认证就行。然后在postgresql的运行用户中执行一下下面的命令,如果能正常连接进去就行。

1
ssh root@localhost

然后重启一下postgresql,这样就启用了归档模式。这个时候看一下/root/bak/incoming文件夹下面是不是有很多文件了,如果没有文件复制过来就需要检查一下是不是哪个步骤弄错了。

执行首次备份

执行备份之前先用barman show-server main来查看一下信息,确定备份信息是否正确。然后就可以执行下面的命令进行备份了。

1
barman backup main

note

我这边刚开始的时候忘了配置postgresql的ssh-key,所以一直不成功,后来配置上去就没问题了。

增量备份

增量备份只需要执行 barman cron 就可以了,它会自动的把wals备份过来。

1
select pg_switch_xlog();

使用这条语句可以强制切换wal归档文件,这样就能输出最近的wal档。

恢复数据库

使用下面的命令恢复

1
barman recover main 20130905T111017 ./test

tip

20130905T111017是备份id,可以用 barman list-backup main 查看

恢复到指定时间的方法

1
barman recover main 20130905T111017 ./test --target-time "2013-09-05 11:15:00.000"

原先看过国人写的F5,当时也就粗略的看了一下,当时也只是看到前端内容修改 的时候自己刷新,而且还是要钱的,所以也就一直没去用。最近一直在弄php的 程序,经常改改然后刷新一下网页,平时可能也没怎么觉得,但今天中午看到 livereload就想下来试试。

安装livereload的浏览器插件

livereload支持 chrome, firefox, safari 和 opera,在官方有插件的下载链 接,插件是免费的。

http://go.livereload.com/extensions

下载python-livereload

官方的livereload是收费的,我们可以使用python-livereload这个开源的实现 代替。

https://github.com/lepture/python-livereload

在页面中添加script

要实现自动刷新页面还需要在页面上添加一段js引用,当插件检测到更改后就会 自动刷新页面。

1
2
<script type="text/javascript"
src="http://127.0.0.1:35729/livereload.js"></script>

运行python-livereload

在程序源码目录里面执行下面的命令,然后就会监视整个目录,一旦有改动就会 刷新页面,在双显示器的情况下效果最佳。

1
livereload

image

tip

默认只有本机打开的浏览器才能自动刷新,如需要在另一台机子上实
现自动刷新需要更改python-livereload的server.py,给里面的 listen参数添加上address=’0.0.0.0’,然后再将嵌入页面中的script 更改过来。

写了一段时间的代码,突然想看看到底有多少行。本来打算用wc去统计一下,但这货输出不详细,而且会把空行和注释全部统计进来。后来找到这个cloc,似乎是用perl写的,相当好用。

1
cloc ./code/

直接这样就可以自动分析了,输出结果会是下面这个样子。

1
2
3
4
5
6
7
8
9
10
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
PHP 100 868 1131 7180
XML 1 2 0 11
DOS Batch 1 6 4 6
HTML 1 1 0 0
-------------------------------------------------------------------------------
SUM: 103 877 1135 7197
-------------------------------------------------------------------------------

最近一直用go写一个项目,本想在mac上用gdb调试一下,但xcode4.6带的gdb版 本还是太低了,不支持go,只好自己安装一个。本以为直接brew install gdb就 完事了,后来发现不是那么回事,还要给gdb制作证书签名。下面是操作步骤:

安装gdb

1
brew install gdb

程序编译完成后在/usr/local/bin/下面建立一个gdb的软链,并且将/usr/bin/ 下面的gdb改名。

制作证书

  1. 打开钥匙串访问
  2. 创建证书

image

  1. 输入名称,并选择类型

image

  1. 输入有效期,一般默认365就好,也就是一年

image

  1. 然后一直直接继续,直到创建画面,选择系统,并创建

image

  1. 选择刚刚生成的gdb-cert证书,并双击

image

  1. 在证书简介中打开信任,并将使用此证书时选择为总是信任

image

对gdb签名

有了刚刚制作的证书后,打开shell,然后执行如下代码:

1
codesign -s gdb-cert /usr/local/bin/gdb

tip

执行这个之前可能要重启计算机

完成以上工作后gdb就可以调试go了,但是每次使用的时候都会提示输入管理员 密码。

使普通用户也可使用gdb

由于之前制作的证书是在系统下面的,所以每次执行gdb都会提示管理员密码,解 决方法也很简单,打开钥匙串访问将系统下面的gdb-cert复制一份放到登录下面 就行。

参考资料