2007年11月28日 21:52
今天再次看到有人推荐
FreeCommander,因为是免费的,所以下载来试了试,如果好用的话,就打算用它替换掉我已经习惯了的
TotalCommander。
初步印象如下:
FreeCommander占优之处:
* 内置图像和动画Viewer,可以直接F3看图片。
* 内置Viewer的功能比较强,用起来比较爽。
* 可以指定外部程序进行文件比较。
* 带有Filter,可以直接输入过滤条件来得到想要的文件。
* 内置支持RAR解压。我的TotalCommander也可以,但我不确定是使用了插件还是原生支持。
* 可以为不同格式的文件指定不同的编辑器,按F4的时候会自动选择。
* 有目录树模式和路径栏的快速切换功能,方便目录的快速切换。
* 有按钮可以直接打开“开始菜单”、“控制面板”和Windows常用目录(桌面、我的文档等等)
* 免费
FreeCommander的不足之处:
* 不支持FTP,当然,TotalCommander也不支持SFTP,还不够爽。所以统一使用Filezilla操作也可以忍受。
* “文件夹收藏”功能很难用,基本上让我提不起使用它的兴趣——在TotalCommander里我经常会随手收藏用得比较多的文件夹的,在FC下这个操作太繁琐了。而且似乎对中文目录支持有问题
* 不可直接编辑路径栏跳转路径,需要使用菜单项直接跳转,稍微繁琐了一些。但路径栏的快速切换功能还算比较有特色。
* 不支持Tab页的左右栏拖放。
* 左右栏文件拖放跟F5/F6居然操作习惯不一致!这一点很难忍受,因为我不想每次操作前还得考虑用鼠标还是用键盘。现在我用了鼠标拖放弹出菜单,在一定程度上可以降低误操作可能性。
* 压缩文件内容不可用鼠标拖放。
总的来说两者各有千秋,但FreeCommander感觉还是要稍逊一筹。功能倒未必输,主要还是输在使用的便捷上。目前我会继续尝试习惯FreeCommander,但更希望它的未来版本能在便捷性上多下功夫。
2007年11月26日 13:57
本来听说海内的种种传闻,我放弃了对海内确认信的确认动作。今天彩妃再次邀请我进入海内,于是我拿起放弃了好多天的那个确认信重新确认。还好还能用。
但是进去实际尝试之后,我并没有像当时玩饭否一样觉得一切正在变得有意思起来,相反,我对它的反感越加强烈起来。
我注册的名字叫做“令狐虫”,但是当我加好友的时候,居然被提示说用的不是真名,不能使用XX功能。
我觉得很奇怪,我在网上的身份,向来就是“令狐虫”。别人了解我,认识我,也是认识的是这个“令狐虫”,在网络世界里,令狐虫就是我,我就是令狐虫。我为什么要向大家再次公开我那个并不为人熟悉的所谓真名?
王兴在
和菜头的blog后面留言道:
# 王兴 Says:
11月 17th, 2007 at 0:34 上午
“ 我珍视匿名制给我带来的自由和保护……” 说实在的,这句话令我惊讶。只要一个人用一个固定的网名活动足够长时间,把这个网名和现实中的一个人对应起来就不难。例如说,肯定有不少人知道你身份证上的名字,你的出生年月日,你的相貌,你的电话号码,你的工作单位和职务,你的住址,等等。而只要有一个人把这些信息公布到网上,它基本上就会永远存在于 google里,让所有人都可以随时随地方便的获得(这原本就是google的mission吧)。匿名制真的带来保护吗?
从某种角度来说,这是真的。在网上活动足够长时间之后,我确实会知道一些网上朋友的真实信息。但是,对我而言,这只是一些额外的信息而已,我更重视的,还是“猛禽”、“猎手”之类的网名。对于我而言,猛禽这个名字远远比张XX来得有意义的多,也真实得多。我就算不知道猛禽的真名,猛禽依然是那个猛禽,我依然可以联系到他,看他的blog,知道他做了什么事。我为什么一定要去接受一个对于我而言完全陌生的名字?
在海内,我认识的几个人都使用了真名。这对我而言很陌生。因为,我熟悉的babyfish找不到了,我熟悉的猛禽也找不到了。我要花上很大的力气才能将我熟悉的人物跟那些陌生的名字重新对上号。这样的“真实”,对我而言有什么意义?凭什么我就不能以我的为人所知的网名生存?
所以,我非常非常讨厌海内,非常非常讨厌这种强行剥夺我的权利的做法。希望海内尽早提供自杀功能,我要注销我的账号。
2007年11月22日 13:13
竹联帮与八卦帮近日发生了一件大事,足以让整个江湖掀起波澜……,作为
原竹联帮长老,有责任将此事件昭告天下。现全文转发来自八卦帮的帮主令。
| | |
| | 八卦帮第2007874号帮主令 经八卦帮常委会及竹联帮长老会联合鉴定,八卦帮帮主刺猬与竹联帮帮主小超自八卦四年三月十三日(公元2007年11月19日)正式结婚,送入洞房。 鉴于生米已经煮成熟饭,特此召告天下,全帮上下庆祝八天。 (即日起,“全帮”或“本帮”均同时代表八卦帮和竹联帮) 两位帮主同任本帮帮主一职,不分彼此。
对黑猪帝国等友帮人士发来的贺电贺信,本帮照单全收,欢迎各界友好人士以各种形式道贺。 本帮主令于发布之日起生效。
钦此
 | |
| |
| |
由于事发突然,新的帮玺还没来得及做,暂用原八卦帮的帮玺,特此说明。
另附八卦帮喜报一枚,八卦帮长老
猛禽对此亦有贡献。
2007年11月20日 13:45
最近群里的技术气氛终于开始浓厚起来了,这几天连续讨论
gcc的bug问题以及以此引发的细节专研和回忆若干。
那么我也来写一点技术吧,当然不是gcc的bug这样高深的问题。
我们的结算系统产生的文件都是TXT格式的——这也是绝大部分会员接受的格式。但这次碰巧有一家会员,居然只接受DBF格式——而我们又没有提供,于是就带来了麻烦。
先让另一个开发组帮忙产生了两次——他们的系统是有DBF生成功能的,但想想长期骚扰别人也不是办法,于是就自己动手写了一个。
首先去Google了一下,找到了两个个
Python读写DBF的函数。然后当然就是利用这两个函数来做我们想做的事情了。
#dbfreader和dbfwrite完全照抄Python Cookbook,这里代码从略
#定义字段名
FIELD_NAME = (
'Partid' ,
'clientid' ,
'instrid' ,
'Tradeid' ,
'Tvolume' ,
'Tprice' ,
'tamt' ,
'Ttime' ,
'Direction' ,
'Offsetflag',
'orderid' ,
'userid'
)
#定义字段类型(这个字段类型通过使用dbfreader读取已有的DBF文件得到)
FIELD_SPEC = (
('C', 12, 0),
('C', 12, 0),
('C', 30, 0),
('C', 12, 0),
('C', 20, 0),
('C', 20, 0),
('C', 20, 0),
('C', 8, 0),
('C', 10, 0),
('C', 10, 0),
('C', 12, 0),
('C', 15, 0)
)
if __name__ == '__main__':
# Read a database
if len(sys.argv) == 3:
txtfile = sys.argv[1]
dbffile = sys.argv[2]
else:
help()
sys.exit(0)
inf = open(txtfile, 'rb')
outf = open(dbffile, 'wb')
records = []
for index, line in enumerate(inf):
if index >= RECORD_START_LINE and line.strip() != '':
records.append(line.split()) #line是按字段排列,用空格分开的数据
#写DBF文件
dbfwriter(outf, FIELD_NAME, FIELD_SPEC, records)
print "DBF created success!"
inf.close()
outf.close()
2007年11月16日 19:32
豆瓣一直是我非常欣赏的网站。曾经有一段时间,我每天游荡其上,还贡献了几篇书评,几个回复,还有几个牢骚。
后来因为各种缘故,读的书少了,再加上感觉有了电影音乐什么的让整个网站变得喧闹,也就去得少了。但去得少并不代表不关注,更没有让我降低对它的评价。
后来加入了我去,又加入了9点之类的,都不是我十分感兴趣的东西,也就不太在意。
前两天看到,豆瓣用户数超过了100万。
今天看到,豆瓣改版了,骂声一片。
好奇的去看了一眼,可能是因为用得不多了吧,的确有些不习惯。但我想要的功能还是都能找到,而其他的很多功能,因为一直就没怎么关注,也就不知道改了多少,也不知道带来了多少的不方便。
我觉得改版造成用户抱怨,大多是因为几个原因,第一是改变带来的不适应感,这个过段时间应该就会消除;第二是功能重点改变,让人无所适从。从我看到的情况,两个方面都有人在提。
第一个问题其实很容易解决,作为用户来说,多一点点耐心,作为网站来说,提供一个“使用旧版本界面”的选择就可以了。关键在第二点,通常网站大改版都意味着它的功能侧重点做了一定调整,这种调整很多时候是不可逆的,也是很多人无法接受的。
其实作为一个网站来说,当然它需要发展需要生存,也就免不了要改变。对于网站来说,考虑到生存的问题,一定会让自己的功能有些变化。其实很早的时候,我就曾经跟人讨论过豆瓣的前途问题,但豆瓣后来的发展跟我的想法完全不同,它逐渐从一个评论网站变成了一个SNS网站。这种改变,一定有人无法接受(比如我。我就对那些社会化功能很不感冒,我喜欢以前纯粹的书评豆瓣),也一定有人无比欢迎。这都很正常。但作为我来说,不喜欢归不喜欢,我很理解豆瓣这样的做法,而且我也很欣赏它在改变的时候坚持住了一些在我看来是底线的原则。我不喜欢的部分,最多我就不去用,权当没看到。再了不起,我就离开豆瓣,不再使用它的服务。(当然现在我没觉得需要走到这一步)
但是,作为豆瓣的自愿的免费的用户,豆瓣的改变既没有损害到你们的金钱也不曾伤害到你们的利益,仅仅是一些改变不合自己心意,一方面大吵大嚷骂声不断,恨不得全世界都听到;一方面又整天整天继续留在豆瓣,成为为豆瓣创造价值的一份子,真的有这个必要吗?
我一向不喜欢用这种无谓的方式表明我的存在。真爱它,就提出建议,你觉得为什么不好,问题出在哪里,如果怎么做你觉得会更好;真伤心失望,就头也不回,离开它,任凭它自生自灭。真的伤害到自己,就用法律来反击。这样不是更好吗?吵架,骂人,解决不了任何问题,只能让事情变得更糟。
不过遗憾的是,在某些事情上,我也没有做到这一点。
2007年11月16日 13:22
游戏规则:A.被点到名字的要在自己的空间里写下自己的答案,然后去掉一个你最不喜欢的问题再加上一个你的问题,仍然组成20个问题,列出其他8个需要回答问题的人的名字,还要到这8个人的博客里留言通知对方你被点名了;B.被点名者不得拒绝回答问题。每个个人要在自己的空间里注明是从哪里接到的,并且再传给其他8个人,不得回传。被点到名字的人将会得到大家的祝福,并且所有美好的愿望都会在不久的将来实现。
来源:
纳尼亚的心世界
1. 你认为分手后的男女朋友还能做普通朋友吗?
理论上可以。
2. 你怎么知道自己爱一个人?
我想我爱她,我就爱她。
3. 你最希望从朋友(不包括爱人)那里得到什么?
交朋友不是为了得到什么。
4. 最近最郁闷的事情?
答不完的问题,改不完的bug。
5. 你最想去哪个地方?为什么?
希腊。看看西方文明的发源地。
6. 最受不了自己哪个缺点?
懒。
7. 你觉得男人会选择成就事业还是理想的爱情?
拥有理想的爱情并成就事业。两者似乎并不冲突吧。
8. 最近最快乐的事情是什么?
看着小虫的成长。
9. 你记得父母的生日?
不记得……
10.为何而奋斗?
我奋斗过吗?
11.说出点你爱的人的三个优点。(此题不可删除 )
体贴,信任,爱。
12. 感到郁闷的时候,用什么方式排解不快?
看没营养的娱乐节目。
13.你觉得爱情重要还是家庭重要?
家庭的爱很重要。
14.到目前为止你做过的最疯狂的事是什么?
从6000米高空掉落而不死——你相信吗?我也不信。
15.你现在最想拥有的是什么?
Money, a lot of Money
16.你觉得女生除了吃饭外花男朋友的钱好么?多少是个限?
两个人都觉得没什么的话,那就没什么。否则还是应该尊重一下钱的拥有者的想法。
17.你准备多少岁结婚?
不用准备了,已经结婚了。
18.如果你爱的人不爱你,你该怎么办?
相忘于江湖。
19.你这辈子做过最后悔的事情是什么?
做了就不后悔。
20.童话的世界和现实的世界,你更喜欢哪个?更向往哪个?
喜欢现实,向往童话。
其实早就对这类点名题厌烦了。这次看在美女的面子上再做了一次。不过就不去毒害他人了。到此为止吧,不点名了。
2007年11月13日 20:54
今日Mike出题:
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。求所有蚂蚁都离开木杆的最小时间和最大时间。
在群里手工计算,得最小时间为11,最大时间为24。但无法确证。回家写了一段代码,遍历了所有的可能性,证明上述答案是正确的。
代码如下。
class Ant: #蚂蚁类
def __init__(self, name, pos, dir):
self.name = name
self.pos = pos
self.dir = dir #方向为1或-1以便简化处理
def getNextPosition(self):
#得到该蚂蚁的下一秒位置
self.pos = self.pos + self.dir
def outofrangeCheck(self, length):
#判断蚂蚁是否已经爬出杆
if (self.dir == -1) and (self.pos <= 0):
return True
elif (self.dir == 1) and (self.pos >= length):
return True
else:
return False
def display(self):
#打印蚂蚁信息,辅助函数
return "%s:(%d, %d)" % (self.name, self.pos, self.dir)
def getNextPosition(antList):
#得到一群蚂蚁的下一个位子
for i in range(len(antList)):
antList[i].getNextPosition()
def collisionCheck(antList):
#对一群蚂蚁做碰撞检测,如果碰到,则将他们的方向置反
for i in range(len(antList)):
if i > 0:
if (antList[i].pos == antList[i-1].pos) and (antList[i].dir == -antList[i-1].dir):
antList[i-1].dir = -antList[i-1].dir
antList[i].dir = -antList[i].dir
def outofrangeCheck(length, antList):
#对一群蚂蚁做越界检测,当所有蚂蚁都越界时,返回真,整个事件结束,否则返回假
for ant in antList:
if (not ant.outofrangeCheck(length)):
return False
return True
def outputAntList(antList):
#辅助函数,输出信息
str = ""
for ant in antList:
str += ant.display() + ', '
return str
if __name__ == "__main__":
fp = open('log.txt', 'w')
maxStep = 0
minStep = 9999999
for a in (1, -1):
for b in (1, -1):
for c in (1, -1):
for d in (1, -1):
for e in (1, -1):
#产生蚂蚁的所有场景组合(主要是方向)
antList = [Ant('A', 3, a), Ant('B', 7, b), Ant('C', 11, c), Ant('D', 17, d), Ant('E', 23, e)]
#定义木杆长度
length = 27
fp.write("Status:\n"+outputAntList(antList) + '\n')
print outputAntList(antList)
step = 0
while not (outofrangeCheck(length, antList)):
step += 1
getNextPosition(antList) #移动
collisionCheck(antList) #然后做碰撞检测
fp.write('steps:%d\n' % step)
fp.write('=====================\n\n')
if (step > maxStep):
maxStep = step
if (step < minStep):
minStep = step
print "The MAX step is:", maxStep
print "The MIN step is:", minStep
fp.write("\n\nThe Min step is: %d\n" % minStep)
fp.write("The Max step is: %d\n" % maxStep)
然后说说人工解题的大概思路。
最小时间,这个比较简单,构造一种场景,让所有蚂蚁都以最顺利的路径走完全程,最后走完的蚂蚁所用的时间就是最小时间。最顺利的定义是:1. 所有蚂蚁不碰撞,2, 所有蚂蚁都走最短路程。这种场景比较好设计:A:(3, -1), B:(7, -1), C:(11, -1), D:(17, 1), E:(23, 1), 最后走完的是C,用时11秒。
最大时间,这个其实就是要构造一种场景,让某一只蚂蚁“尽可能久”的留在杆上。但是这个“尽可能久”很难确证,所以我当时也不敢说我构造的场景就一定是正确的。我当时的思路是:1. 让中间的蚂蚁产生尽可能多的碰撞(走回头路,可以延长时间),2. 这种碰撞要尽量晚发生(同样为了延长时间)。因此,我当时构造了这样一种场景:A(3, 1), B:(7, -1), C:(11, 1), D:(17, 1), E:(23, -1), 最后C用时24秒走完。但是通过程序验证发现,这并不是唯一的24秒场景。一个最直观的24秒场景其实是:A(3, 1), B:(7, 1), C(11, 1), D(17, 1), E(23, 1)。但这是巧合还是必然,我现在还没有想通。
2007年11月09日 16:18
今日报销,因格式问题被发回重写数次,一下午而事不能毕。
遂上
饭否牢骚云:
报销实在是世界上最最痛苦之事
不久,猛禽回曰:
@令狐虫 比报销更痛苦的事是不能报销。
拜服不已。
2007年11月08日 13:46
babyfish说:
活着就是胜利
想起了两个佛教的小故事。也许大家都听过,再听一遍吧。
有源律师来问:“和尚修道,还用功否?”
师曰:“用功。”
曰:“如何用功?”
师曰:“饥来吃饭,困来即眠。”
曰:“一切人总如是,同师用功否?”
师曰:“不同。”
曰:“何故不同?”
师曰:“他吃饭时不肯吃饭,百种须索。睡时不肯睡,千般计校,所以不同也。”
律师杜口。
——《慧海禅师参问语录》
坦山禅师与一位僧人云游时,路上遇到一条小河,因为下过雨的关系,小河的水显得比较深。他们正准备过河时,发现一位身着丝绸衣服的年轻姑娘站在一边徘徊不前。显然,她是因为河水较深而犯难了。
“来吧,姑娘。”坦山说着,张开两臂就抱起姑娘过了河。
同行的僧人见此情景,一直闷闷不乐,直到天黑寄宿时才忍不住问坦山:“我们出家人不近女色,如果接近年轻美貌的女子就更危险,你为什么要犯戒呢?”
“噢,你是说过河的那个女子吗?”坦山平静地答道:“我早把她放下了,你怎么还抱着她呢?”
出处未知
2007年11月06日 17:49
今天看到Jessie写的
忙碌与忙碌,深有同感。
忙碌的最大害处,就是让人在无尽的琐事中渐渐迷失自己。在日复一日的忙碌之后,渐渐的仿佛就觉得自己生来如此,忘了当初的豪言壮语,忘了当初的宏伟目标,仿佛在浓雾迷漫的密林中,走一步是一步,看不到将来。
有的时候也会怀念初工作的那段日子,很单纯的就是完成上级分配给自己的任务,没有枝枝蔓蔓,没有节外生枝。生活规律得犹如机器,精确而单调的重复。
但是我会愿意回到从前么?当然不会。
现在的忙碌,是建立在很多事情自主决定的基础之上的,我需要这种自主决定的能力。
在忙碌之余,抽个时间,跳出来,把思路整理一下,然后继续,应该是个不错的主意。
2007年11月05日 15:31
现在好像乱七八糟的聚会开始多起来了。看到猛禽他们都有自己的个人名片,很羡慕。于是抽空也做了一个。下次可以用。
2007年11月02日 23:33
似乎好久没有在blog上写具体的程序开发了。汗自己一个。
今天受人之托写了一个备份Live Spaces blog的小工具。基本思路其实很简单,Live Spaces有一列按月份规整的Archive列表,找到链接之后逐个打开,然后找到每个Entry的前后特征字符串,用正则表达式取出来即可。(需求是只需要正文不需要回复)
动手写了之后,发现了几个问题。
第一个问题是用Python的urllib库连接之后,发现找不到Archive列表 -_-。仔细一对比才发现,原来Live Spaces居然是检查USER Agent的,如果不是通用浏览器,就给出一个比较简化的页面,这个简化页面中不包含Archive列表。还好Python可以伪造User Agent:
import urllib
class MyURLopener(urllib.FancyURLopener):
#伪装成Firefox
version = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8"
urllib._urlopener = MyURLopener()
再使用urllib打开页面,就会被认为是Firefox了。这样就可以得到Archive列表了。
分析Entry时发现,Live Spaces的字符编码很古怪,Blog正文使用的是普通的中文字符(UTF-8编码),但标题却是不可读的UNICODE编码,类似于爱情 这种。找了一下,Python并没有直接转换此类编码的库,不得已只好自己利用HTMLParser写了一个,既然是HTMLParser,顺便就把去除tag和转换转义符的工作也做了。
from HTMLParser import HTMLParser
class MyParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self._content = ""
def handle_data(self, data): #处理正常数据(非tag部分)
self._content += data
def handle_entityref(self, ref): #处理转义符
if ref=='quot':
self._content += '"'
elif ref=='amp':
self._content += '&'
elif ref=='lt':
self._content += '<'
elif ref=='gt':
self._content += '>'
def handle_charref(self, ref): #处理经过编码的文字
num = int(ref)
self._content += unichr(num).encode('utf-8') 将编码文字转化成utf-8字符
def getString(self):
return self._content
def codeToChar(codeStr):
parser = MyParser()
parser.feed(codeStr)
return parser.getString()
def removeTag(str):
parser = MyParser()
parser.feed(str)
return parser.getString()
在需要转换的地方调用codeToChar和removeTag两个函数做处理就可以了。(为什么写两个一模一样的函数?咳咳,因为逻辑上做的事情不一样么……)
折腾完这些之后,感觉差不多了,于是就开始运行。然后检查了几个结果文件,发现绝大部分是对的,但是有个别文件错了,而且错得很奇怪。万分不解的去检查页面源文件,结果发现,在月份归档的页面中,如果某天写了两篇blog,那么只有第一篇有日期,第二篇是没有的!晕倒,这是什么奇怪的逻辑啊……。因为我需要用到这个日期,而且没有日期的话会增加正则表达式的描述难度,所以不得已,只能改变了策略,不使用月份归档页面,而是利用归档页面得到单独的Entry链接,然后根据这个链接进行分析。
结果……,发现写在href中的URL居然也是经过编码的……,狂晕不已……,这是什么后台啊,有必要写这么复杂吗?还好也是&#编码,用上面的函数先处理一下就能用了。
全部搞定之后,终于可以用了。但是因为多get了一次页面,那个速度……,不提了。比越来仅分析月份归档慢了差不多2、3倍。该死的日期阿……
后来居然还碰到打开某些月份的时候页面被reset的情况,感觉好像是撞墙了。一个风花雪月的blog,何必呢,何苦呢。暂时先不管了,跳过去再说。看来改天还得研究一下Python代码里使用Tor的方法……