作者存档

python quine

s="s={quote}{content}{quote};print s.format(quote=chr(34), content=s)";print s.format(quote=chr(34), content=s)

一段小脚本,将 MongoDB 中所有 DB 的 Collection 按大小排序。

最近接到的一个遗留项目,数据库用的是 MongoDB,年久(?)失修,磁盘满了运维报怨。

实例里面有多个库,每个库中又有很多 collection
于是想要看看哪个 collection 占用的空间比较大,想 remove 掉一些过期数据。

发现 pymongo 取出 collection 之后,无法像 mongo 客户端一样可以直接用 collection.stats() 的方式获取状态。
于是很郁闷。

登上 mongo 查看了一下:

?View Code JAVASCRIPT
// db.col.stats
function ( scale ){
return this._db.runCommand( { collstats : this._shortName , scale : scale } )
}
 
// db.stats
function (scale){
return this.runCommand( { dbstats : 1 , scale : scale } );
}

这才发现,原来 db.state 和 collection.state 都是通过 mongodb 的内部命令实现的。

所以就有了如下代码:

?View Code PYTHON
from pymongo import Connection
db = Connection(HOST, PORT)</code>
 
print sorted(
    [(
        "%s -&gt; %s" % (dbn, coln),
        db[dbn].command('collstats', coln)['storageSize']
    )
    for dbn in db.database_names()
    for coln in db[dbn].collection_names()
    ],
    key=lambda x:x[1])

PS:这篇日志是 惰性的 Blade 大大两年之后头一次在这个布珞阁更新,大家鼓励他一下吧。

翻墙备忘 从bluehost的虚拟主机上打洞访问twitter及facebook

从前从bluehost上面打洞的时候总是不稳定,有时候能成功,有时候不能成功,后来因为有其他的工具,也就一直没深究。
不过隐隐觉得,是否是访问twitter及facebook的流量太高以至于被bluehost封了?

今天发现在 bluehost 上面 curl twitter.com 能抓会twitter 的首页,也就是说,从bluehost访问twitter是没问题的。
那么为什么打洞之后无法访问呢?
问题一定出在本地的DNS上。

好吧,让我绕过DNS,直接把正确的地址填进hosts文件中好了。

获得某地址对应ip:
bluehost上没给发icmp包的权限,所以ping是不成的,用python的socket模块获取。

?View Code PYTHON
import socket
print socket.gethostbyname('twitter.com')

后来发现直接用shell命令

gethostip twitter.com

就行了

将下面的地址加入/etc/hosts

#twitter
128.242.245.84  twitter.com
128.242.245.125 api.twitter.com
128.242.245.116 www.twitter.com
 
#facebook
66.220.149.25   www.facebook.com
66.220.147.42   login.facebook.com

然后再试试用 bluehost 打的洞,灰常顺畅。

新玩具_1289266510

不错的Js Chart图工具:
http://www.highcharts.com/
还有一个什么来着??
http://raphaeljs.com/

这个配合node.js使用,兼容IE5.5。
http://socket.io

这个其实并非新玩具,Javascript实现的Scheme:
http://tryscheme.sourceforge.net/

另外发现YAML是一种很好的配置文件格式,可以比INI表现更丰富的层次关系和更明确的属性类型。
另外JSON是YAML的一个子集。

祝大家玩得开心,用着舒心~

思维定势

思维定势
2010-10-26 23:36:44

QQ上下了几天连珠,暂时未遇败绩,每天中午胜十局。

不过积分还是负多胜少,输的分可能是年少无知的时候喂给高手的。

发现一个小规律:大多数人的棋路都一成不变。

我想对于一名不知道禁手规则的选手来说,记住棋谱是一件小概率事件。
可是在实际的对局中,在开局不变的条件下,如果我重复上一局的走法,大多数对手通常也会延着棋路重走一次上局中走过的落点。
这说明大多数人对于某个特定的局势,会形成一个定型的策略。
哪怕这个策略是无效甚至致命的。

前些天给大家讲敏捷大会收获的时候,说到了很多在领域中共通的迭代循环,比如空军战术中的OODA循环和SLG中的4E循环以及RTS中的微操作循环,还有敏捷中的迭代……
这些循环的共通之处就是在行动之后尽快的检测其有效性,并且即时进行修正。

对比4E和微操作就知道,大多数RTS高手实际上是一个很好的人肉迭代器。
而大多数普通人对于自己的行为缺乏及时的检测和修正,所以就导致了我发现的小规律:没有受过训练的选手会沿着一个既有的思维定势不加修正地一路狂奔直到输掉比赛。

是不是所有的”定势”策略都是有害的呢?

这涉及到对策略的评估方法和频率。
比如“敏捷”这条策略本身也是一种定势,对于瀑布模型来说有优势,但也需要针对实际情况进行取舍调整。

更明显的,棋类游戏中某些定势是必须记住的。
比如连珠中执黑必胜的花月局和浦月局,以及执黑必输的游星局和彗星局。
再比如用于攻击的“梅花”和用于防守的“八卦”。

对于这类经过推演证明有效的定势,自然要多学多用。

棋谱中归纳的定势和思维中习惯形成的定势,其差别在于是否经过了系统的反省,归纳和总结。

做事的动力

做事的动力
2010-10-22 23:03:28

几个月前,拿到工作用机的时候,尝试在Win下安装QQ未果。
点击安装文件后,反复收到一个未能在某路径下找到QQ点什么什么点msi的文件的错误。
因为经常挂的IM都能用Pidgin登录,平时也不上Windows,更不常上QQ,就把这个问题放下了 ,不用就是了。

前些天某个午休,妹子偶然要求陪她下棋。
切到Win下面才想起来其实还没装上QQ……

……那就把它装上。
错误再次重现,这次看清楚了,那条提示是“未能在Administrator的Local Setttings/Temp下找到某msi文件”……
原来如此。

因为俺的习惯,拿到一台Win机器后首先禁掉了Administrator……所以我用来登录的帐号不是Administrator,所以那个安装文件也就根本木有向那个目录写东西的权限,所以也自然不会在那个目录下发现所需的文件。

找到了问题的根源,解决起来也就轻而易举了。

装上QQ,又发现QQ游戏被屏蔽了,换了几个端口依旧失败……
不过我有VPN……

行吧,问题都解决了~

不过此时妹子已然午睡去鸟
T. T

好吧,这件事给我的启示是:

某件事没作成,很可能是因为没有真正的动力。

Euler-{18,67}

http://projecteuler.net/index.php?section=problems&id=67
典型的动态规划。
原先在手机里写的,
跟机器一起丢了……
补上一个 T^T

?View Code PYTHON
#Python的解
dat_lines =  [ map(int, l.split(' ')) for l in open('triangle.txt').readlines() ]
dat_lines.reverse()
 
for i, l in enumerate(dat_lines):
    if not i:
        continue
    else:
        for ei, ev in enumerate(dat_lines[i]):
            dat_lines[i][ei] += max(dat_lines[i-1][ei], dat_lines[i-1][ei+1])
 
print dat_lines[i][0]
?View Code HASKELL
module Main where
 
acc_l [] (o1:[]) = []
acc_l (c1:cs) (o1:o2:os) = ((max o1 o2) + c1) : acc_l cs (o2:os)
 
main = do 
    lns <- readFile "triangle.txt"
 
    let real_lns = map (\l -> [ read x::Int | x <- words l ]) (lines lns)
 
    --Haskell里头列表项的值是不可变的,用foldr做累加。
    print $ head $ foldr (\nl ol-> acc_l nl ol) (last real_lns) (init real_lns)
 
    return ()

openduckbill对应新版pyinotify补丁。

openduckbill是Google开源的一个小文件同步工具。

其依赖于pyinotify提供文件变化监测。

在Ubuntu10.04下面使用easy_install安装的pyinotify的版本是0.8.9
openduckbill 最后一次更新是在2008年对应的是pyinotify0.7,不过这之后pyinotify代码有了变化,需要在openduckbill中进行相应修改。

欲与pyinotify新版本使用openduckbill-1.0.0.tar.gz 需打入以下patch:

diff -ruN openduckbill-1.0.0/src/daemon.py pdir/src/daemon.py
--- openduckbill-1.0.0/src/daemon.py    2008-02-20 19:41:41.000000000 +0800
+++ pdir/src/daemon.py  2010-10-12 11:49:07.863957042 +0800
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.4
+#!/usr/bin/python
 
 # Copyright 2008 Google Inc.
 # Author : Anoop Chandran 
@@ -334,10 +334,10 @@
 
     avail_events = pyinotify.EventsCodes
     # Events to be monitored.
-    eventsmonitored = (avail_events.IN_CLOSE_WRITE | avail_events.IN_CREATE |
-                       avail_events.IN_DELETE | avail_events.IN_MODIFY |
-                       avail_events.IN_MOVED_FROM | avail_events.IN_MOVED_TO |
-                       avail_events.IN_ATTRIB | avail_events.IN_MOVE_SELF)
+    eventsmonitored = (avail_events.OP_FLAGS['IN_CLOSE_WRITE'] | avail_events.OP_FLAGS['IN_CREATE'] |
+                       avail_events.OP_FLAGS['IN_DELETE'] | avail_events.OP_FLAGS['IN_MODIFY'] |
+                       avail_events.OP_FLAGS['IN_MOVED_FROM'] | avail_events.OP_FLAGS['IN_MOVED_TO'] |
+                       avail_events.OP_FLAGS['IN_ATTRIB'] | avail_events.OP_FLAGS['IN_MOVE_SELF'])
     # Start a event watcher
     event_watcher = pyinotify.WatchManager()
     # Create a event processor
diff -ruN openduckbill-1.0.0/src/openduckbilld.py pdir/src/openduckbilld.py
--- openduckbill-1.0.0/src/openduckbilld.py 2008-02-20 19:41:41.000000000 +0800
+++ pdir/src/openduckbilld.py   2010-10-12 11:49:41.927943049 +0800
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.4
+#!/usr/bin/python
 
 # Copyright 2008 Google Inc.
 # Author : Anoop Chandran

Blade

bladewang这个ID是为了向swordlea前辈致敬,他为我在程序员的职业生涯中树立了第一个榜样。
有一句话说,学习编程的过程就是:寻找大师,追随大师,成为大师。
我一直认为swordlea是我遇到的第一位大师。

李哥是东北最早的Crack之一,C++,C,ASM功底深厚,Windows系统底层的开发经验丰富。

但李哥给我的最大的启发并非是技术上的,而是向我展示了编程和解题的趣味。

比如时常进行的对联大战:

迅雷不及掩耳盗铃之势如破竹篮打水一场空
有目不识泰山北斗之尊古卑今朝有酒今朝醉

上联是李哥出的,估计是出自灵感。
这个联太难了,下联是我用一个脚本从stadict的汉语成语词典里搜出来的……
……

古人云:
不为无聊之事,何以遣有涯之生?

djvu2pdf

djvu格式貌似在很多方面比pdf要强,而且在Ubuntu默认安装的evince直接就能读,所以通常也不许要进行格式转换。
但是在移动设备上面,貌似还是对pdf的支持比较好,恰好有篇paper是djvu的,想利用车上的时间看完喽,于是就有了转换格式的需求。

直接在源里搜djvu,发现了djvulibre-bin这个包。
安装之后,可以通过 djvups 这个命令将 djvu格式的文档转换为ps格式的,之后就可以用ps2pdf得到相应的pdf文件了。

ps2pdf在Ubuntu10.04桌面版上已经默认安装了,如果在系统中木有发现ps2pdf,可以安装 texlive-latex-recommended 这个包。或者 apt-cache search ps2pdf 查找一下所需要安装哪个包。

# djvups
apt-get install djvulibre-bin &&;
 
# ps2pdf
apt-get install texlive-latex-recommended &&;
 
djvups $FDJVU $FPS &&;
 
ps2pdf $FPS $FPDF

PS1:
不知是否参数的关系,我得到的pdf比djvu原文件体积大了8倍。
另外ps2pdf这一步比较耗时间。

PS2:
其实很容易的说,不知为啥上次有这需求的时候没搞定。。。

PS3:
另外大家也可以搜一下 chm2pdf 这个软件,很实用。只是转换时某些书的目录排版会乱掉。不过正文部分还是很完美的 :)