Displaying the most recent of 45 posts written by

digitalsatori

ssh 超时断开的解决方法

当用ssh连接*Nix服务器,几分钟没有操作,ssh连接就会被断开。如何才能保持ssh连接不被超时断开呢?有两种方法: 服务器端设置 打开文件 /etc/ssh/sshd_config 找到 ClientAliveInterval 选项, 如果没有的话,添加此选项。如下设置表示每360秒(6分钟)向客户端发送一个是否保持连接的查询信息(该选项默认为0,表示不发送查询信息) ClientAliveInterval 360 客户端设置 打开文件 /etc/ssh/ssh_config 找到 ServerAliveInterval 选项, 如果没有的话,添加此选项。如下设置表示每360秒(6分钟)向服务器端发送一个是否保持连接的查询信息(该选项默认为0,表示不发送查询信息) ServerAliveInterval 360 当你需要连接到多个ssh服务器时,可以使用 客户端设置 的方法,如果你是管理一个ssh服务器,希望所有的ssh客户端不被自动超时断开的话可以使用 服务器端设置 网络书签

深入了解 Generator

原文作者:David Beazley 中文编译:Tony (digitalsatori) 第一部分:Iterators 和 Generators简介 Iteration 枚举 众所周知Python有一个“for”语句 你可以用它来在一组对象上做循环操作 >>> for x in [1, 4, 5, 10]: ... print x, ... 1 4 5 10 >>> 你不仅仅可以对list做循环枚举操作,还可以对很多不同类型的对象做相同的操作 对Dict的枚举 对字典进行循环枚举操作,会得到该字典的keys >>> prices = { 'GOOG' : 490.10, ... 'AAPL' : 145.23, ... 'YHOO' : 21.71 } ... >>> for key in prices: ... print [...]

如何在Open ERP项目开发中使用bzr工具

问题说明 本文是以Open ERP项目开发来介绍bzr工具的使用,文中介绍的方法也适用于其他的软件项目开发。 Open ERP的项目开发使用了 Launchpad 项目管理平台,其代码的版本管理使用的是bzr工具。我们大概已经知道bzr是一个分布式版本控制工具。那么,对于类似Open ERP这样的大型项目,如何才能充分发挥bzr分布式的优势使代码版本历史清晰,协作开发方便呢?本文通过作者对Open ERP的服务器代码管理的实例来介绍一种较好的使用bzr工具的方法。 网络书签

使用SOCKS代理服务器转发bzr通信

创建SSH SOCKS 服务器 我们知道设置SSH SOCKS 代理服务器是很简单的,只要你有一个远端服务器的ssh帐号,使用下面的命令就可以轻易的创建一个套接字代理服务器。 ssh -fND 6666 ssh_user@ssh_server 它的用途是将应用程序的端口请求通过ssh加密通道动态的转发到远端ssh服务器。比如,我们可以设置firefox使用SOCKS5代理服务器并将端口按上面的命令设置为6666, 这样当我们用firefox浏览网页时(也就是对80端口的访问请求)就被转发到远端ssh服务器上作请求了。因为所有的访问请求经过ssh加密通道,所以用来对付墙还是很得心应手的。 bzr 不支持SOCKS代理服务器转发 因为经常要用bzr版本控制工具同步在launchpad上的项目,但是直截访问launchpad的速度实在太慢了。我发现我在国外租用的ssh服务器访问launchpad的速度非常快,而本地访问ssh服务器的速度也还不错,所以,自然就想到了能不能把bzr通信转发到ssh服务器。很不幸的发现bzr并不支持SOCKS代理服务转发。难不成我们只能忍受bzrlp的龟速,Google一通之后,发现了 tsocks tsocks 如何工作 它的基本原理是: 在加载应用程序之前, tsocks 先加载其共享库 该函数库覆写了内核的 connect() 函数 这样当应用程序发送连接请求时,该请求就被转发给了代理服务器(然后通过加密通道转发到了ssh服务器) 所有这些是通过设置环境变量 LD—RELOAD``的值为 ``/usr/lib/libtsocks.so 来实现的,tsocks 本身只是一个简单的shell包装(wrapper)脚本,所有的转发任务都是由上述的函数库完成。 安装好tsocks后,编辑文件 /etc/tsocks.conf 将已有的所有内容都注释掉,添加下面两行内容: server = 127.0.0.1 server_port = 6666 #设置为你的SSH SOCKS服务器开放的端口 就是这么简单,以后我们只要在运行bzr程序前,运行tsocks就可以使用创建好的SSH SOCKS服务器了: tsocks bzr pull lp:xxxx 这下bzr的访问速度还真是大大的提高了, 其实我们可以用tsocks来实现所有不直接支持SOCKS代理服务的程序。 参考文章:http://www.plenz.com/tunnel-everything 网络书签

Thinkpad T61 无法检测到路由器

缘起 我的笔记本电脑(Thinkpad T61 )的无线连接总是感觉有点古怪,经常会在无线网络中找不到自家的那台贝尔金路由器,但是却能搜出一堆邻居的路由器,而同时家里的其他电脑访问贝尔金路由器又毫无问题。这应该说明贝尔金路由器的工作是正常的,可是在找不到原因的情况下重启几次路由器,Thinkpad T61又突然能找到这台路由器了。最近被它折腾的超烦,路由器重启了N遍,这边的笔记本就是检测不到。忍无可忍,决定彻底的查查原因。试了几次之后发现当我把路由器的频段(Channel)设置从 自动 改为11及以下的设置后,笔记本电脑总能检测到路由器。问题是终于解决了,可是不能使用路由器上的自动频段选择有点不爽,因为路由器的自动频段选择可以避开繁忙的频段而使用周围环境中较少使用的频段,这样无线信号的干扰就会少一点。而且T61无法使用11以上的频段的原因也没有找到。于是戟起google大法,一通搜索之后终于让我的好奇心得到了满足。 排错过程 我的笔记本上装的是Ubuntu9.10,所以下面的命令都仅适用于Linux。 下面的这个简单的命令实际上一招就能展示我反复试验得出的结论: 就是T61上无法访问11以上的频段,只是不幸的是俺是后来才知道的: iwlist f 这条命令的结果是显示本机无线可连接的所有频段。在我的电脑上不存在12,13,14这些我的G带宽贝尔金路由器所支持的频段。另外还有一些更高的频段是适用于N带宽路由器的,这里不做讨论。通过搜索了解到,Wifi的IEEE802.11的规范中有regdomain这样的地域规范,就是不同地区所能使用的频段数是不同的。对于G带宽来说美国支持1到11, 欧洲多了12, 13, 而亚洲则另外可以使用14. 所以考虑是不是我的笔记本电脑的无线网卡驱动默认了美国的规范,看能不能改成欧洲或亚洲的。网上介绍了N种办法,因为我的Ubuntu9.10 使用CRDA程序来向内核模块通知domain regulatory的信息(即,地域设置规范),最简单的方法就是: sudo aptitude install iw 安装iw 无线网管理程序,然后在 /etc/rc.local 中添加一行如下代码,并重启电脑: iw reg set CN 就是把地域设置为中国。遗憾的是重启电脑后, iwlist f 仍然没有看到久违的12,13,14频段。 lspci 列出了T61使用的是intel 4965 AGN无线模组。再根据该型号来查,原来这个无线模组可能在硬件中设置了美国区,也就是只能使用1到11的频段。至此,我的调查算基本完成,虽然调查并没有为我提供更好的方案,但总算是头绪清爽了,也或许对其他朋友有帮助。另外,对胆大妄为的兄弟可以提供一个进一步的调查方向,就是无线模组的regdomain是纪录在eeprom里的,是可以被擦写修改的,有兄弟饭吃多了,可以往这个方向上再努把力。 网络书签

对付电信dns劫持的firefox插件

最近被电信的DNS劫持搞得烦不胜烦,动不动就被绑架到114search.118114.cn这个恶心的网址上。今天在firefox的addons网站上闲逛还真让我找到了一个很不错的插件来对付这种绑你没商量的强盗行为。 闲话少叙,这个插件的下载位置在:https://addons.mozilla.org/zh-CN/firefox/addon/11787 注:我直接安装插件碰到了一个错误,是因为软件标明的firefox所需版本号有问题,你如果碰到同样的问题可以下载本文所带的附件,解压后拖到firefox里就可以安装了。 安装后,请到firefox的工具-附加组件下找到该插件并点击“首选项“ 里面已经设置了对一些网址重定向的处理规则,它们无非就是用正则表达式来过滤需要处理的网址,对114search我们设定如下: wola, 你不再被流氓们敲闷棍,拉到恶心的地方去了。对于输入错误的网址也会正确显示DNS error 错误信息了。 又案:DNS劫持已不是什么新鲜的东东了,很多ISP为了广告流量都在做这样严重违反互联网规则的事,包括被网友们推崇的openDNS。关于openDNS和GoogleDNS,请参见这篇好文:http://www.chinaz.com/Webmaster/Club/120Q004632009.html no-redirect插件下载:no-redirect.xpi 网络书签

Python食谱-1.25.在Unix终端上格式化显示HTML文本

原文作者:Brent Burley, Mark Moraes 中文翻译:Tony (digitalsatori) 问题 如何才能在Unix终端上显示HTML文本,使其可以表现粗体和下划线。 解决方案 最简单的方法是编制一个过滤脚本,从标准输入获取HTML然后在标准输出文本和终端控制符。因为本配方针对得唯一对象是Unix, 我们可以通过Unix命令 tput 来获取需要的终端控制符。具体方法是使用Python标准库中os模块中得popen函数来启动tput。 #!/usr/bin/env python import sys, os, htmllib, formatter # use Unix tput to get the escape sequences for bold, underline, reset set_bold = os.popen('tput bold').read( ) set_underline = os.popen('tput smul').read( ) perform_reset = os.popen('tput sgr0').read( ) class TtyFormatter(formatter.AbstractFormatter): ''' a formatter that keeps [...]

Python食谱-1.24.使指定的字符串忽略大小写

原文作者:Dale Strickland-Clark, Peter Cogolo, Mark McMahon 中文翻译:Tony (digitalsatori) 问题 如何才能使某些字符串在比较或查询时能忽略大小写,而在其它操作时能保持其原来的大小写? 解决方法 最佳的方案就是把这样需求的字符串封装在一个如下例所示的字符串的子类中: class iStr(str): """ 忽略大小写字符串类。 除了在比较和搜索时忽略大小写,其它与str的表现完全一样, """ def _ _init_ _(self, *args): self._lowered = str.lower(self) def _ _repr_ _(self): return '%s(%s)' % (type(self)._ _name_ _, str._ _repr_ _(self)) def _ _hash_ _(self): return hash(self._lowered) def lower(self): return self._lowered def _make_case_insensitive(name): ''' 将str中的一个方法改为忽略大小写后封装到iStr中。''' str_meth = [...]

Python食谱-1.23.Unicode数据编码输出到XML或HTML文件

原文作者:David Goodger, Peter Cogolo 中文翻译:Tony (digitalsatori) 问题 要将Uicode文本输出到HTML或是XML应用程序,且只能用较为流行但受限的编码比如:ASCII码,或Latin-1,如何操作? 解决方法 Python 有一个叫 xmlcharrefreplace 的编码出错处理器,它可以将选定编码之外的字符替换为XML数字字符参考(XML numeric characters references): def encode_for_xml(unicode_data, encoding='ascii'): return unicode_data.encode(encoding, 'xmlcharrefreplace') 上述的方法也可以用来处理HTML输出,但是我们希望能用HTML的‘符号实体‘(symbolic entity)。这样的话,我们就要自己定义一个函数并将其注册为编码错误处理函数。弄这么个函数其实并不难,因为Python标准库中已经有一个叫 htmlentitydefs 的模块,其包含了所有的HTML的实体定义。 import codecs from htmlentitydefs import codepoint2name def html_replace(exc): if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): s = [ u'&%s;' % codepoint2name[ord(c)] for c in exc.object[exc.start:exc.end] ] return ''.join(s), exc.end else: raise TypeError("can't [...]

Python食谱-1.22.将Unicode字符打印到标准输出

原文作者:David Ascher 中文翻译:Tony (digitalsatori) 问题 需要将Unicode字符打印到标准输出(比如在Debug时),但是它们不能使用默认的编码,怎么办? 解决方法 使用Python标准库中的 codecs 模块作为编码转换器来封装 sys.stdout (标准输出流)。比如我们的输出是到一个使用ISO-8859-1编码的终端,可以这样来写代码: import codecs, sys sys.stdout = codecs.lookup('iso8859-1')[-1](sys.stdout) 讨论 Unicode字符串处在一个足以容纳全世界所有语言所包含的字符的空间中。幸运的是,作为Unicode的使用者,我们不必了解Unicode字符串的内部表现方式。但是对于象 sys.stdout 这样的文件流,只能处理与特定编码关联的字节。我们可以改变Python的 site 模块来改变文件所使用的默认编码,但是这样的改变会全局影响Python ,使其它使用Python安装时的默认编码的程序出现混乱。(Python的默认标准编码是ASCII)。因此,我们不推荐这类改动。 本配方采用了一个更好的方法:将 sys.stdout 重新绑定到一个接收Unicode输入,以ISO-8859-1(也称为"Latin-1")编码输出的文件流。该方法并不会改变之前的 sys.stdout 的编码。首先我们保存当前的以ASCII为编码的 sys.stdout: >>> old = sys.stdout 然后,我们创建一个无法通过 sys.stdout 直接输出的Unicode字符串: >>> char = u"\N{LATIN SMALL LETTER A WITH DIAERESIS}" >>> print char Traceback (most recent call last): [...]