Writing blogs in English as much as possible

Recently I have been using stackoverflow and other awesome stuff in github.com, all of  which are in English, though many of them are created or maintained by non native English talented people.Even software blogs are written in English, but the author is French or Other Europe countries. Furthermore a Chinese famous developer pluskid contributes his opensource work in English, making the project international and active. These all encourage me to make my stuff international no matter how tiny it is.A project in English has more possibility to make it spread widely.So I will try to write blog and code in English as much as possible from now on.Well, for something important and valuable will publish both in Chinese and in English :-)

[转载]程序员常见的健康问题

再战隼的博客上看到的,正巧这几日正受颈椎病的困扰 :-( 真的还算及时,在此提醒下所有战斗在代码一线的斗士们,注意身体,养成锻炼的好习惯!

原文链接via战隼的学习探索

其实这些问题不仅见于程序员,其他长期经常坐在电脑前的职场人士(比如:网络编辑、站长等),都会有其中的某些健康问题。希望从事这些行业的朋友,对自己的健康问题,予以重视。以下是全文。

我最近在写《Learn Python The Hard Way》的最后几节课,我还要加一课:关于程序员在其职业生涯中普遍的健康问题。我发现诸多代码人在敲代码的时候好像不在乎他们的身体状况, 很可能是太过于全神贯注。我希望人们可以通过知晓一些与程序员相关的健康问题而获益,并可以避免曾经发生在我身上,而且就我知道也发生在很多人身上的问题。

我可能不会把这篇博文全部放进该书里,因为有点多。但我会写个缩减版。请您惠知喜好,或有我可以引用的附加资源。

我的背景和资历

我以前是一等合格美国士兵,并学习过多种武术。近年来我未像过去学武术一样奋力工作,而是专注于瑜伽、入定和一些简单的活动。我小时候是异常健康的,现在依然如故,这归功于我早已根深蒂固的锻炼习惯。

zed shaw

首先先列一下我学过的武术:忍术(Ninjitsu),合气道(Aikido),柔术(Judo),泰拳(Muay Thai),咏春(Wing Tsung),卡波耶拉(Capoeira),阿尼斯(Arnis),其排序不分先后。我要讲只有泰拳我是连贯学习的,大概有六年时间。其他的用了一到两年时间。我去了很多地方,因此学习之道就是那儿有什么便学什么。

而且,在部队里我是体能测试优秀,几乎是连续两年满分通过的。如没记错,这其中有几乎每天两至四小时的训练,这在部队里不算什么。除此之外,别无他事可做。

然后,不论我干不干活,我如今一直保持着同样的体重、灵敏及力量。所以我无法告诉你怎么减肥。我很可能先天基因就是如此。这意味着你要根据自身情况来调整我的建议。

有着前述的体魄,当我渐老我更喜欢侵略性弱以及更灵活的一些运动。瑜伽是不错的,常被误认为很难。我同样把票投给普拉提(Pilates),游泳,舞蹈等一切对我身体无直接影响的运动。我尤其注意我的手,缘由我也会说到。

好,写这么多是让你知道我还有点能耐,但是更重要的是,在干这些的同时,我是一个职业编程者。在退役后,我平均每天学习八到十六个小时。 我使用盲打而且玩吉他,我还避免了腕道综合征,以及重复性劳损问题。

希望我保健的经验能帮你恢复或保持健康。

程序员的常见健康问题

编程乍一看是个耗人的领域,一方面似乎你没有做很多,另外和很多代码人对待其身体的态度有关。 你要一贯地保持健康,因为身体好时会减少对精神的摩擦损害,而将注意力集中到要事上,而不是你生理上的小毛病。

显然建议就是大多人说的饮食,外出活动。我这里不会教你怎么吃或健身,或者哪种武术。如你对这些感兴趣,找一个职业的来帮助你锻炼。

这里要说的程序员们平日的职业病。他们相当明显而且平常,由于某些原因他们并不在意这些本不该发生的事情:

▲ 腕部疼痛(重复性劳损)

▲ 盯着看移动的打印进度以及其后的句点造成的眼部问题

▲ 姿势不当造成的背部不适,尤其是背下侧,肩上侧。

▲ 肠道和尿道的问题(不能正常大小便)

▲ 摄入太多咖啡因,而且喝水少造成的脱水

▲ 坐姿保持太久,造成男性的痔疮或前列腺问题(我一会再细说)

▲ 光照不足造成维生素D缺乏

▲ 熬夜或者喝咖啡过多导致的睡眠失调

▲ 缺乏伸展导致普遍的僵硬和疼痛

我一直跟这些问题作抗争,因为编程,弹吉他,或者举重时误伤。每当我重获健康的时候,我就知道了此后怎样避免。只有一小部分问题是周期性的。你可能觉得这里的某些问题无关紧要,但请相信我,许多程序员都有这样那样的问题,且原因不一,即使你还没有。

普遍原因

一般来说,可以总结成嗜编程为命。你可能想成为个中翘楚,就像我一样,因此除了生活除了编程别无其他。你不去卫生间,你勇猛地进行10小时连续编程。而且你饮食不规,只神笃“真正的代码人”这一信条。

事实是真正的编程者都是有点傻蛋。他们从来吃不到正点,ML也没有准。跑步从来都气喘吁吁,他们的内脏有一些严重问题,但不是疾病原因。真的,在你精通某件事之前,灭了自己可不是很值。

所以,在你看到这些问题以及我怎么解决的时候,记住这都是为了有一个均衡的生活习惯,而不是沉溺于编码或者其他什么事。相信我你会实实在在地好起来,如果你给你自己减负并且保持健康。

腕部疼痛

这个可能是我用心最多的。因为频繁且长时间地编码、拨弦,我的腕部有着周期性的疼痛。那年我22岁,刚开始职业性地编码。但是我一直有一个合气道的功课,这样我的腕部就会恢复如初。

你知道,合气道有着绝佳的腕部练习,从而让你的腕部变得结实又柔软。他们创造的这些练习可以避免伤害,原本的许多技巧就有扭、撕扯、手臂和肩关节的脱节。

这些练习治好了我的所有关节错位和疼痛,并让我长时间编程且没有任何大问题。我唯一可能出现问题是因为我要把现在的键盘换成新的古怪布局的键盘,但如果我练习一周合气道我就有可以重返代码并依然强健。

现在如果你有严重的腕道综合征或者其他类型的重复性劳损问题,先咨询你的医师再行尝试这里的技巧。如你要做的话,开始时要轻慢,不要让你感到疼。伸展应该不会疼,只会轻度有点不适。如果你感觉疼,是过度拉伸了。.

你实际想每次伸展运动得到放松。这有点难解释,但不是强迫你的关节在某个固定位置,而是先到达一个位置,想一想放松而后再到更远的位置。

记住这一点,怎么做练习则有很多视频:

▲ 翻转手腕 (Youtube的视频,须翻墙)

▲ 扭腕

▲ 手腕外侧弯曲

▲ 手腕内侧弯曲

下面介绍当你坐下来打字的时候怎么去做锻炼(每次都要这样):

1. 首先要热身,将手伸向前方在空中尽可能快速地抓20次。然后甩手,再做手腕单侧弯曲10次,然后换方向弯曲10次。

2. 用你最擅长的,以中速做5至10次。

3. 继续做各项动作,但甩手和甩胳膊,弯曲手腕后到要归位。这些动作会移动手腕中的骨头,甩的时候它们就会归位。

4. 千万不要做过头,让你手腕感到损伤。要适度恰好,并放松。那个“没有付出就没有收获”只会伤害你。

每次敲代码前做这系列动作,每天要做,而且停下来的时候也做一次。用不了多长时间,一段时间的不适之后你的手腕就会开始适应并回到正常,并感到好许多。

还有:在做这些之前先咨询一下医生。你做这些可是自己冒风险,所以自己不小心搞坏了手腕不要来起诉我。 这些是千年武术中的家常便饭,所以我知道它们不会有危险,但各人情况不同。如果你做法不对可能后果严重,如果感到疼痛立即停止并咨询医师。

吉他手更糟糕

在吉他手或贝司手跟前,程序员的重复性劳损可是小菜。这起因是诸多愚蠢的理由,许多著名的音乐家讲一天八小时或十六小时学习法。正因如此,吉他手们糟践自己,最后不能演奏。

吉他对于手来讲是硬乐器,所以有一点点疼痛你就歇菜了。我在学校的时候,像个傻比一样轻信我的老师自己一天练八个小时的琴。我字面理解就是一下子就八个小时,我这样折磨自己一个月然后就崩了。

我的拇指有了赘骨,其他的指头疼痛难止。我的手腕还耐得住,但指头已经不行了。 二逼呵呵的我没有听那句话,任何新的运动需要循序渐进。

我解决这个的唯一办法,而且用了一年半,是做以下的事情:

1. 找把不伤手的吉他。说你啥样吉他都能玩是屁话。去找个最好的不伤你手的吉他。

2. 做上面的锻炼,我的指头做得更多。

3. 通过做练习,慢慢开始恢复指头的力度并注意放松。

4. 在弹的时候注意放松,拨弦的时候更轻巧。

5. 避免弯曲,这些曾导致我的手受伤。

6. 变换姿势和演奏风格,不抓紧吉他就能快速移动,舒服地把拇指压在琴颈背面。

7. 调整吉他高度,让我的肩和手都觉得舒服。

8. 站着,很少长时间坐下,长时间摆一个姿势是很别扭的。

去年做完这些后我的手最终痊愈了,并且感觉良好。我还没有不让我弄伤自己的好习惯。我已经老大不小了,所以这些对我很重要,但这也意味着我不能做那些可能弄伤我手的活计。

我的手现在是我的命根子,所以不能再打拳了,或者其他我还想学习的事情。因为打沙袋我手上已经有多处凹陷了。

眼疲劳

我觉得这对我不是问题,但你最好悠着点。我年轻的时候比20/20还要好,但用了几十年电脑有点偏了,曾经用过眼镜矫正,我用得着的时候一直戴着,没有它们看周围的世界真是恼人的模糊。

在黑暗时期,我们天天还瞅的是CRT显示器,烦人的闪烁已经把一些人的眼睛整垮了。现在的问题是多数LCD屏幕对字体的糟糕渲染。 我想归功于苹果公司的专利,多数LCD屏都不能正常渲染字体。尽管有人认为苹果的字体看起来毛茸茸的,所以对于你的好处将很难说。

我想每天两个小时不看电脑。要么我去玩吉他不用费眼力,要么去公园散步。我可能不是整整两个小时都去这样干,但是加起来要保持两个小时。

这对于你可能有的头痛有助益。多数时候程序员可能会想玩电脑的时候开着灯导致了头痛,但其实是因为体位不对,还有糟糕的字体,饮水不足,而且是跟电脑打持久战。

不是把你房间的灯都关掉,只需要合理的照明,选择适合你液晶屏和室内灯光的色彩方案。 即融合室内照明,液晶屏亮度和字体,以及让你感觉更舒服的色彩方案。

但还是先休息一下吧。

背部问题

 

 

我挺走运的,背一直还可以。尽管如此,我相当多时间是坐办公室,并保持着灵活强健的脊背。

我的问题是背的上半部分,脖子,肩部。我习惯猫在键盘上,所以必须强迫自己坐直。事实是,刚刚敲这段话的时候我就没坐直,才想起矫正一下。

现在选择你的座椅很重要,我喜欢艾伦椅(Aeron),那种硬质小凳子或长凳。现在非常热衷我的40美元的钢琴凳,过去我坐着它弹钢琴的。因为没有后背,凳子会时时逼迫你坐端正 ,并调用我的核心肌肉(肚子和背部)。

我的肩部完全处于压/迫状态。我习惯于在我全神贯注的时候收紧双肩,这样让我的整个背上部感到疼痛,一直蔓延到脖子和头部。当我长时间玩吉他的时候问题更糟。

我发现最有效的解决办法是伸展上肢,做俯卧撑。伸展办法很简单,抓住门框,然后双臂同向或反向拉伸。你觉得身体有点僵硬的时候试试下面这些招数:

1. 用一只手抓紧门框,手心朝向你的身体,然后向前挺胸,越过肩位。

2. 用另一只手握紧门框,胳膊交叉在前,手心继续朝里,然后伸展肩部,使背部得到伸展。

3. 两只手都抓住门框,高举过头,稍向后站呈倾斜,然后来回拉伸。(就像站着做俯卧撑)

如果你做了,同时做抡臂,摇摆,你就会觉得好一些。或许在你开始干活之前加一些腕部伸展。

另外就是做真正的俯卧撑了。我工作的时候并不做这个,因为它会让你很累,难于工作。在睡前我做十次,这十下足以对付胸、背、肩、腕。 不要过快,要慢,注意在做的时候使身体平衡。

脱水

这个问题不大,我时常有点内疚。我发现我一天狂喝咖啡,正因为这样我想我也该喝点水。如果我没有头疼那倒有点不对。脱水的问题很难发觉,直到你发现的时候已经晚了。

我的建议(我也要多做的)是,喝其他非纯净水的饮料时也喝一杯水。同样请勿喝苏打水。它们只是一堆伪糖,让你变胖导致糖尿病,还有它并没有给你产生水。喝纯黑咖啡吧,它们真他妈好,记着再喝些水。

肠道及尿道问题

好吧,接下来的两个问题确实不雅,所以就不提发生在我身上的事了,但我要说这句话:“上厕所的时候他妈赶紧去,别犹豫。

你不知道这条提示有多有用,我真希望我年轻的时候知道这句话。因为我是一个拼命汉从不间断,跳过上厕所,憋相当长时间。 肠道问题就是你的机体不再告诉你你该拉屎了,只是愈积愈多。

这样的话最后会导致便秘,这将终结你的健康状态。对于尿道倒次要,但是你依然可能会有感染和其他令你惊奇的事情。

如果你已经搞砸了,你去弄一些纤维片,待在家里然后吃掉,不要去外面,因为后果很囧的。

然后,你觉得是时候了,拾起身去拥抱上帝吧。我告诉你,在你拉完屎之后你的伟大想法才会自然迸发。

痔疮和前列腺问题

另外一个不上厕所会导致的就是痔疮。我知道够恶心的,我保证只提这一次。但是,许多编程者有这个问题,并羞于启齿,他们并不知道为什么。下面听我一一道来,我做过下述所有事情,但是只得过一两次痔疮:

1. 长时间坐着。

2. 举重东西,不用辅助。

3. 该去解决内急的时候不去。

4. 强迫自己去拉屎,实际上不需要。

5. 最糟糕的:坐在厕所里看书。

最后一条就是罪魁祸首。如果你不是必须要大C,可别老泡在那。这相当于将你整个身体和肠子的重量压进已经泻完的直肠上,并试图挤出来。恶心至极!这导致痔疮因为你的血管中的血压不自然地升高。

确实臭哄哄的,但潜在危害很大。恩,危急情形是血流一地,这时候谁都知道去看大夫。你可能需要手术,但做无妨。我没有做但也差点:有一年我在举重,然后在库房工作,不间断编程,没有用过厕所。

是,我是个大笨蛋。你可别学我。为了你的屁屁的健康,请做以下的事:

1. 多吃果蔬,至少吃点纤维片。

2. 该解决个人问题时赶紧的!

3. 任何情况下不要压/迫直肠。

还有一个导致前列腺的问题,如果整天坐在屁股上的话。站起来转转就可以。如果尿血或者排尿困难,去看医生,否则会更危险。

维生素D不足

维生素D有点怪。的确只能通过晒太阳产生,但你并不必去专门为此去暴露在阳光下。5到30分钟就好,取决于光照的强度。还与你的钙水平和磷缺乏程度有关。但你要是饮食规律,并非只吃些薯片的话,就问题不大。

还有一些事比如消沉,搞坏的牙齿,一些奇怪部位的疼痛比如臂肘的骨头,肌肉痉挛,总体来讲就是跟烂泥一样。同样,如果你觉得不行的话去看医生,正常情况下在日头正盛的时候,去外面溜达半个小时足矣。

事实上,我觉得一个问题是硅谷里很多刚起步公司提供的餐饮。因为你要泡在办公室,经常吃残汤剩饭,而且照明也不好,太阳高照的时候你也不出去晒下。加上你的睡眠习惯你的维生素D状况就糟糕透了。

不要吃盒饭,在中午去外面吃一顿。好处你自知,而且外面的食物好多了。

我在温哥华和西雅图的时候有轻微的维生素D缺乏,那儿光照不足,对于我来说简直要我命。有人能搞定,但是像我这样青年时代在热带岛屿上度过的人,不足的光照确实就是杀手。

所以,你趁有太阳的时候出去晒晒。

睡眠失调

我的睡眠时间一向很灵活,跟季节和地域有关。有时候我如猫头鹰附体,熬夜熬到很晚才睡。最近搬到旧金山后开始早睡,不再晚睡了,最近感觉很好。

有时候,我不确定为何在夜里创作音乐或编程倒多产。我认为在一个疲惫的状态下我的大脑确是在休息的。我还觉得是因为夜里更安静,没有滋扰。

不管怎样,早睡晚睡已经把我的睡眠机制搞砸了。当我渐长我更喜欢早起,我觉得白天更清醒更放松。熬夜后再睡往往觉得自己有遗留反应,而且头疼。

如果你也有睡眠问题,我有一些简单的调适方法助你入睡。需要实践,但很有效。

首先,花你的血本买个好床,2000+美元不算多。我买了2200块的Tempur-Pedic。 的确很值。

有了床,开始练习助睡法,有点自我催眠的意味:

1. 关掉你房内的所有灯光和音响。

2. 躺下,让手放在让你舒服的位置。

3. 缓慢地深呼吸,并想象空气流进身体及逸散出体外的场景。

4. 当你能注意到你的呼吸之时,想象你在看窗外辽阔的太空,悬星满布。

5. 然后伴随呼吸幻想自己漂浮在空中,渐入巨幅的星系,一切星辰,皆伴随你左右。

6. 持续幻想,感觉你的床也在漂浮,直到皆不见。

你或许在四五点睡觉,但不是要出去的话,就幻想自己漂浮直到你真感觉融化了。

如果你有重度失眠,还请咨询医师。但还是试下这招,一天做一到两个小时。练习后绝对会让你入睡。

刚柔并济

如果浑身不适难于活动,这时就该做下伸展运动。当然最好莫过于去瑜伽馆每周做练习,并回家自己练习。如果没有时间,可以买书或在图书馆借N多教程。入门级就可以,你真的不需要太多。

我想如果你晚上入睡前做5-6个大幅的伸展练习就够了。你会觉得相当放松,你的健康状况和自我感觉也会有提升。

伸展身体的时候同样要放松大脑,增长创造性的一大妙法就是做瑜伽或半个小时的伸展运动,然后早晨冲澡。 伴随禅定你就会精神自适并发觉个中未曾体验之奥妙。

我也不知为何,但是精神之松弛对于突发的灵感多有助益。

迈出第一步

上面的内容可能对于你有点多,我当然希望你不会都有这些问题缠身。然而我建议,尽管你可能没有那些毛病,但要避免它们的发生。如果你要开始编码,请采用“编前热身”。

下面就是我在敲代码前要干的,或者玩吉他前,以及我变僵需要休息的时候。

1. 活动身体各关节,只需将腕、臂、颈、臀转摇几下。比如正向五次,然后反向五次。

2. 在各部分前做一些腕部练习,摇一下手腕。

3. 将臂举过头顶尽可能高,然后向后伸展尽可能远,然后伸到身体前面来。

4. 最后,小心地用手扶着头分别向右、左、前、后摇几下。

如果你做这些的话,将避免一些编程会带来的伤害。因为编程并不会大伤体能,避免受伤还是很容易的,因此上述部分就够了。

然而,如果有特殊问题的话,继续去咨询医疗师,如果得到他们允许可以试试我的这些方法。我这儿说的无过激或奇异的方法,只是些基本的练习和一些常识,因此是个医生都会许可的。我告诉你要咨询别人是只是因为我不想吃官司。

真希望这些能让你变好,如果没有的话,记下建议,以防出现这些状况。如果你够好运,连一个问题都不会有,但我觉得是个程序员都有或多或少的问题。

如果对上述的事情持有疑问,可以给我发邮件,我会给你一些建议。

保重。

作者Zed Shaws是一位作家、软件开发人员、音乐人(下文中提到吉他手),于2010年发布《Learn Python The Hard Way》一书,他也是 Mongrel Web 服务器系统的作者之一。

[分享][代码]一个简单的python小程序————使用douban API通过ISBN查询书籍信息

前言

刚学python时做的一个小程序,虽然小,但是也用到了不少内容。具体有以下几个方面:

  • 命令行的解析
  • 文件的读写
  • XML解析
  • http连接
  • 多线程

短短不到200行的程序就可以做到这些,可以算是python的推广广告吧,哈哈

?View Code PYTHON
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# -*- coding=utf-8 -*-
'''
Created on 2011-12-4
 
@author: liuyix
'''
'''
输入文件格式定义:每行一个isbn,可能有重复,错误的
输出格式:
书名--评分--评分人数--作者--出版社等信息--豆瓣链接--书简介--rawxml
 
douban xml:
tags
<id>#{http://www.w3.org/2005/Atom}id
<title>#{http://www.w3.org/2005/Atom}title
<category>#{http://www.w3.org/2005/Atom}category#category有多个attrib
<author>#{http://www.w3.org/2005/Atom}author#注意author还有subelement
<link>#{http://www.w3.org/2005/Atom}link#存在多个link,每个link中的attrib不同,且attrib中的key都是一个
<summary>#{http://www.w3.org/2005/Atom}summary
<attribute>#{http://www.douban.com/xmlns/}attribute#存在多个attribute,每个attribute的attrib[name]不同,且都是一个
<tag>#{http://www.douban.com/xmlns/}tag#存在多个tag,每个tag都有一个dictionary,其中有2个key:name,count
<rating>#{http://schemas.google.com/g/2005}rating#该元素中有一个含有多个key的字典
 
'''
 
import sys,os,httplib,threading,time
import argparse
import xml.etree.ElementTree as ET
 
myapikey=01234567890 #此处换成你的APIKEY
 
def writeFile(file,lock,str):
    lock.acquire()
    try:
        file.write(str)
    finally:
        lock.release()
 
def getISBNList(isbnfile):
    '''
    从string名字中读入ISBN,返回list数组
    version1:不保证有重复数据
    '''
    isbnlist = []
    while True:
        tmp = isbnfile.readline().strip()
        if len(tmp) == 0:
            break
        isbnlist.append(tmp)
        pass
    isbnfile.close()
    return isbnlist
    pass
 
def httpconn(isbn):
    conn = httplib.HTTPSConnection('api.douban.com')
    conn.request('GET', '/book/subject/isbn/%s?apikey='+myapikey % isbn)
    response = conn.getresponse()
    print 'status:%s#reason:%s'  % (response.status,response.reason)
    if str(response.status) != '200':
        print '未查到ISBN为%s' % isbn
        return None
    data = response.read()
    print data #debug输出
    return data
    pass
 
def parseDoubanXml(wfile,wlock,element):
    '''
    从输入的xml.etree.ElementTree.Element对象开始解析XML,解析格式见上
    '''
 
    if element == None:
        return
    root = element
 
    bookitem = ''
    space_sep = '\t'
#    for k in list(root):
#        print k
    #书名
    booktitle = root.findtext('{http://www.w3.org/2005/Atom}title').encode('utf-8')
    #print '书名:%s' % (booktitle)
    bookitem += booktitle + space_sep
 
    #作者
    #print '作者: ',
#    for i in list(root.find('{http://www.w3.org/2005/Atom}author')):
#        #print '%s' % [k.text for k in i.findall('{http://www.w3.org/2005/Atom}name')]
#        print      
    #authors = [k.text for k in root.find('{http://www.w3.org/2005/Atom}author').findall('{http://www.w3.org/2005/Atom}name')]
    #print authors
    bookitem += '['
    author_element = root.find('{http://www.w3.org/2005/Atom}author')
    if author_element != None:
        for i in author_element.findall('{http://www.w3.org/2005/Atom}name'):
            #print i.text,
            bookitem += i.text.encode('utf-8') + ' '
        #print ''
    else:
        bookitem += '未查到'
    bookitem += ']' + space_sep
 
    #评分及人数
    ratingElem = root.find('{http://schemas.google.com/g/2005}rating')
    #print '评分:%s 评价人数: %s' % (ratingElem.attrib['average'],ratingElem.attrib['numRaters'])
    rating = ratingElem.attrib['average']
    numRater = ratingElem.attrib['numRaters']
    ratingInfo = rating + '(' + numRater + ')'
    bookitem += ratingInfo + space_sep
 
    #出版社等一系列信息
#    bookinfos = {}
#    for k in root.findall('{http://www.douban.com/xmlns/}attribute'):
#        bookinfos[k.attrib['name']] = str(k.text.encode('utf-8'))
#        #print '%s:%s' % (k.attrib['name'],k.text)
#        pass
#    for k in bookinfos:
#        print '%s:%s' % (k,bookinfos[k])
    #豆瓣链接
    links = root.findall('{http://www.w3.org/2005/Atom}link')
    for k in links:
        if k.attrib['rel'] == 'alternate':
            #print '豆瓣链接:%s' % (k.attrib['href'])
            doubanLink = k.attrib['href']
            bookitem += doubanLink + space_sep
    #书简介
#    print '简介:'
#    print '%s' % (root.findtext('{http://www.w3.org/2005/Atom}summary'))
    print bookitem
 
    wlock.acquire()
    wfile.write(bookitem + '\n')
    wfile.flush()
    wlock.release()
 
 
def loadXmlfile(filename):
    #得到xml的根节点
 
    #parser = ET.XMLParser(encoding='utf-8')
    #tree = ET.parse(filename,parser=parser)
    tree = ET.parse(filename)    
    parseDoubanXml(tree.getroot())
 
def loadXmlString(wfile,wlock,xmlstr):
    element = ET.fromstring(xmlstr)
    parseDoubanXml(wfile,wlock,element)
 
 
def processQuery(wfile,wlock,isbn):
    data = httpconn(isbn)
    if data != None:
        loadXmlString(wfile,wlock,data)
 
 
if __name__ == '__main__':
    #loadXmlfile('/home/cnliuyix/test.xml')
    #data = httpconn('9787508624136')
    #loadXmlString(data)
 
    parser = argparse.ArgumentParser(description='批量处理ISBN脚本')
    #parser.add_argument()
    parser.add_argument('-f','--file',help='批量的ISBN文本',type=file,required=True,metavar='isbn.txt')
    parser.add_argument('-o','--output',help='输出的文件名',type=argparse.FileType('w'),required=True,metavar='bookinfo.txt')
 
    opts = vars(parser.parse_args())
 
    print opts
    #sys.exit(0)
 
 
    #isbnFile = file('/home/cnliuyix/codes/python/ISBN.txt')
    isbnFile = opts['file']
    #storefile = file('/home/cnliuyix/books.txt','w')
    storeFile = opts['output']
#    if storeFile == None or not isbnFile.exists():
#        print '创建文件失败'
#        sys.exit(-1)
    wlock = threading.Lock()    
    sleeptime  = 2
    isbnList = getISBNList(isbnFile)
    print 'list size:%d' % len(isbnList)
    cnt = 0
    subThreads = []
 
    for i in isbnList:
        cnt += 1
#        if cnt % 10 == 0:
#            print '休息%ds' % sleeptime
#            #time.sleep(sleeptime)
        t = threading.Thread(target=processQuery,args=(storeFile,wlock,i))
        subThreads.append(t)
        t.setDaemon(True)
        t.start()
    for i in subThreads:
        i.join()

Eclipse下配置NDK开发环境小结

分享下最近几周我的一些NDK开发经验和心得。

Eclipse配置NDK环境,主要完成的功能使能调用Android NDK提供的工具链编译用C/C++源代码写好的共享库或者可执行的应用程序。由于我的工作需要的基本是完全native程序的编写,因此这里介绍的方法 更适合编译Android下的本地应用程序或者共享库

本文提供的方法皆非原创,在这里感谢原创作者的分享。

NDK环境配置之前

Eclipse需要事先安装好 CDT ,本文在Ubuntu平台上测试可用。

最简单有效的方法————创建新的Builder

本方法是在Eclipse中调用NDK提供的 ndk-build 命令进行编译。综合这几周的开发,感觉还是这个方法是最靠谱的。因为你只需要编写一个Android.mk,无需考虑依赖关系,同时也最大程度的遵循了google提供的NDK build方法。

具体配置步骤

  • 新建一个C++ Project
  • 进入到这个project的 Propertities 选项中
  • Builders 一栏 –> New –> Program
  • 参考下面这张图进行配置,几个重要的地方:
    • Location 填入 $NDK_HOME /ndk-build 其中 $NDK_BUILD 是NDK安装的根目录
    • Working Directory 填入当前project的位置,可以通过选择 Browse Workspace… 选择
    • 可选步骤: Arguments 中写下需要传给ndk-build的参数
    • 如果要实现 auto-build 可以在 RefreshBuild Options 中进行配置,我个人觉得auto-build对开发没有实际作用,因此这里就不介绍了。

简单几步就可以编译共享库了,够简单吧

其他方法

这里还有一种我试验可用的方法,但是配置起来实在麻烦,适合移植已有程序或者开发大型项目时完全定制编译过程中使用。这里只给出出处,有兴趣的同学可以看看。

[译]初次参与开源软件项目的六个忠告

原文链接:http://grokcode.com/108/6-easy-ways-to-get-started-programming-open-source

开源项目是一种好的释放自己的热情(“geek out”?)和做自己喜爱的事情的方式。有一个自己参与的开源项目可以使你的工作做起来更加快乐和满足,也会使你保持良好的编程水平,也会经常给你带来其他机遇。许多人不知道从何出入手向开源项目贡献自己的力量。以下是接触参与开源项目的六个简单的忠告。

参与到平时使用的开源软件的项目之中(言外之意是不要鲁莽的参与到你不使用或者不了解的开源项目中)

这一条很明显,但是记得不要尝试参与到你不使用或者你一无所知的项目中去。给你平时使用的,你也许愿意投入贡献的开源软件列一张清单。别忘了还有你使用的开源类库、开源模块也可以考虑投入贡献,记得参与到一个有许多开发者使用的开源项目有更多的益处。你使用框架吗、文件转换工具、图形类库或者一般开源软件需要使用的构建工具吗,或者一个新功能?以上这些都是你第一次参与开源项目的首选。

Do What You Love 做你真正感兴趣的部分

记得要找一个你 真正 感兴趣的部分做出你的贡献。比如说你对解析器情有独钟,那么一个编译器项目就不是第一次参与的项目首选。也许可以考虑一个webserver项目或者构建工具项目中的解析配置文件模块。

掌握开源软件中常用的工具

对于每个开源项目,版本控制系统、bug追踪系统、patch提交系统,有自己的代码规范,feature request,问题排查系统(user troubleshooting issues)以及构建工具和开发者讨论社区,这些都会有所差异。因此你应该花些时间学习熟悉这个项目使用的工具。一些常识,例如不该在开发者邮件列表里询问如何使用SVN;不该在用户论坛里提交bug,这些都该知道。认真阅读开发文档,学习使用上述的工具不仅可以节省大家的时间也会提高你所做的贡献被接受的可能。

观察了解项目的人际圈子

除了认真考虑技术,了解项目中的社交圈子也很重要。你该知道哪些人是核心开发人员(core maintainer),这些核心开发者是如何与他人交流的,在开发社区中哪些人更活跃,他们为项目制定了那些规则。对于新的贡献者,有些项目会很开放和热心帮助,而有些项目则不大友好。记得要多在邮件列表、IRC或者其他开发者交流渠道上花时间观察,熟悉项目开发的交流氛围。 也许你认为开发者社区的交流互动不很重要,但是这却是成为一个成功的贡献者还是沮丧的离开的差异所在。回忆器我第一次尝试贡献开源项目时,我想改善一个音乐播放器程序的播放列表格式,因为这个音乐播放器程序在命令行下指定播放列表时,它不支持所有可用的格式。由于我的歌曲文件名字超出了Linux内核支持的命令行参数的字符上限,因此我没有办法将所有的音乐放入播放列表中。于是我在邮件列表中发了封邮件询问开发组他们是否考虑支持新的播放列表格式。于是立即引起了一场争论。当我第二天查看邮件列表时,我看到了上百个回复,一些人表示支持,一些人说现在的已有格式已经很好,还有些人问道这是哪来的新人。于是整个事情由回应问题变成了争论。 我当时犯的错误就是没有足够了解项目的社交圈。查看下邮件列表的存档,你才会发现有些项目只对一小撮核心贡献者开放,而对大多数人尤其是那些连一个bugfix都没提交过的人一点都不理会的。因此这就引出了我要谈到的下一条也是最重要的一条忠告——从小处入手

从小处入手

从小处入手有两方面含义,一是小的贡献,二是规模小的项目。提交一些小的bugfix或者实现一个简单的feature可以帮助你提高社区中的声望,同时也会使你熟悉项目中的提交流程。这两个方面都灰是你的补丁被接受的可能性大大提高。 一个规模小的项目中,你的贡献会更富有成效,因为熟悉提交流程和工具链会更快,你还能和核心开发者有更好的沟通。一个只有一个维护者的项目,提交一个bugfix补丁通常和邮寄一封附有diff文件和问题描述信息的邮件给维护者一样简单。

开始自己的开源项目

开始接触开源项目的一个最简单的方法就是建立自己的开源项目。写一个firefox插件、一个wordpress插件或者一个emacs mode都是不错的想法,既可以快速写就,通常还会赢得不少用户的肯定。 不过在你创建自己的项目之前,记得一定要好好查查,确保你的工作没有人在做。你也许会惊喜的发现有许多项目只需要一点点关注就会使这些项目变得更有价值。

以上就是6条初次参与开源软件项目的忠告。

无觅相关文章插件,快速提升流量