单就个人感情来说,我其实喜欢git。但显然subversion才是更普遍的版本控制管理工具,适合用在团队开发中。
那么,有一个很常见的需求就是把工程师提交的代码,更新到htdocs目录,这时候需要用svn hook,简单做法就是写一个post-commit hook:
svn update /var/htdocs/
但当svn目录越来越大,文件越来越多的时候,svn提交也会越来越慢。因为每一次的提交都会造成整个svn的更新。
Get updates delivered to your reader or your inbox: Entries (RSS) or Receive email updates .
单就个人感情来说,我其实喜欢git。但显然subversion才是更普遍的版本控制管理工具,适合用在团队开发中。
那么,有一个很常见的需求就是把工程师提交的代码,更新到htdocs目录,这时候需要用svn hook,简单做法就是写一个post-commit hook:
svn update /var/htdocs/
但当svn目录越来越大,文件越来越多的时候,svn提交也会越来越慢。因为每一次的提交都会造成整个svn的更新。
一段时间以来,Google的HTTPS都很难连接。由于App Engine的程序发布需要透过HTTPS进行,HTTPS的连接问题造成的直接后果就是程序发布时卡住,死活发布不上去。
解法就是先建立一个tunnel,然后在appcfg.py文件增加:
import socks import socket socket.socket = socks.socksocket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 7070)
广告:欢迎Like Hacker News on Facebook
July 1st, 2011 update:
如果有HTTP代理的话,也可以依据官方的文档进行设置
在内网服务器架了一个SSH Tunnel服务供同事使用,但是经常由于网络原因造成中断,需要不断登录上去重连。
网上找到的方案主要分两种:
没办法,又是自己写了一个脚本,通过nc来监测:
#!/bin/sh
if [ "$1x" != "connectx" ]; then
if [ -z $1 ]; then
echo "Usage: $0 [username@]host[:port]" 2>&1
exit 0
fi
echo -n "Password: "
stty -echo; read pass; stty echo; echo ""
expect -- << EOF
spawn $0 connect $1
while 1 {
expect {
"password:" {
send "$pass\r"
}
"yes/no" {
send "yes\r"
}
"Permission denied" {
puts "Password error."
break
}
}
}
EOF
else
shift
port=`echo $1 | perl -nle 'print /\:(\d+)$/ ? $1 : "22"'`
while [ 1 ]
do ssh -p $port -CN -D 0.0.0.0:7070 $1 target "while nc -zv localhost 7070; do sleep 20; done"
sleep 20
done
fi
登录内网服务器,将这个脚本保存为autossh.sh,打开screen,然后执行:authssh.sh [user@]remote[:port],再输入ssh密码。
正常情况下运行脚本,成功连接服务器之后会监听内网服务器的7070端口。
注意需要安装 expect 以及screen。
感谢老黑和鸟哥发布的《PHP调试指南》(via)。本文是对指南中的《Vim + Xdebug + DBGp》一章的一些补充。
原理上,这种调试方式主要依靠Vim的插件“remote PHP debugger”来实现,该插件实现了一个DBGP服务端。调试的时候Xdebug将会与服务端建立一个连接进行通信,接收服务端的调试指令并返回调试结果。 Read the rest of this entry »
Windows平台 上,MySQLdb官方编译的二进制包貌似最高只支持Python 2.5,按照论坛里的帖子下载了一个非官方编译的版本,但是有两个问题:
>>> import MySQLdb C:\Python26\lib\site-packages\MySQLdb\__init__.py:34: DeprecationWarning: the sets module is deprecated from sets import ImmutableSet
发现个不错的版本,不会有上面的问题:http://www.thescotties.com/mysql-python/test/
12.31更新: 发现一个更全Python Windows扩展收集 - http://www.lfd.uci.edu/~gohlke/pythonlibs/
一时兴起研究起BASE32,其实编码解码都还算简单,按照RFC 4648
编码:
+--first octet--+-second octet--+--third octet--+
|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
+-----------+---+-------+-------+---+-----------+
|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|
+--1.index--+--2.index--+--3.index--+--4.index--+
解码:
1 2 3
01234567 89012345 67890123 45678901 23456789
+--------+--------+--------+--------+--------+
|< 1 >< 2| >< 3 ><|.4 >< 5.|>< 6 ><.|7 >< 8 >|
+--------+--------+--------+--------+--------+
<===> 8th character
<====> 7th character
<===> 6th character
<====> 5th character
<====> 4th character
<===> 3rd character
<====> 2nd character
<===> 1st character
脚本文件 convert.sh:
#!/bin/sh
convert() {
echo -ne "convert $1 ...\n"
file -i $1 | awk -F = '$2 != "utf-8" && $2 != "unknown" {\
print "iconv -f gb2312 -t utf-8 -o '$1'.tmp '$1'"\
}' | sh
[ -f ""$1.tmp"" ] && mv "$1.tmp" $1
}
run() {
for file in `find $1 -type f -name "*.php" | grep -v bbs`
do
convert $file
done
}
run $1
./convert.sh uchome/
最近在瞎想怎么通过xpath去精确抓取文章的正文,跟parselets类似的想法,只不过更简单。
代码设计上采用正则表达式匹配URL,再选择callback handler的方式,主要参考web.py的分发器(Dispatcher)。
#!/bin/env python
import re, sys
# Define parser first.
def baidu(username):
# Business logic
return "Using parser Baidu. and the user's name is: %s." % username
def qzone(uin):
# Business logic
return "Using parser Qzone, and the user's QQ is: %s." % uin
# From web.py
def group(seq, size):#{{{
"""
Returns an iterator over a series of lists of length size from iterable.
>>> list(group([1,2,3,4], 2))
[[1, 2], [3, 4]]
>>> list(group([1,2,3,4,5], 2))
[[1, 2], [3, 4], [5]]
"""
def take(seq, n):
for i in xrange(n):
yield seq.next()
if not hasattr(seq, 'next'):
seq = iter(seq)
while True:
x = list(take(seq, size))
if x:
yield x
else:
break
#}}}
def parser_init(url,mapping):
for pat, what in group(mapping,2):
result = re.compile('^' + pat + '$').match(url)
if result:
return what, [x for x in result.groups()]
return None, None
if __name__ == '__main__':
mapping = (
'http://(?:hi|space).baidu.com/([^/]+)(?:/.*)?','baidu',
'http://(\d+).qzone.qq.com(?:/.*)?','qzone',
)
(func, args) = parser_init(sys.argv[1],mapping)
if func:
callback = func
if func in globals():
callback = globals()[func]
if callable(callback):
print callback(*args)
else:
print 'No parser found.';
当然,这个实现比较老土一些,全部用function的方式回调,没有用类,可以参考web.py去做适当的修改。