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
[转载]程序员常见的健康问题
再战隼的博客上看到的,正巧这几日正受颈椎病的困扰
真的还算及时,在此提醒下所有战斗在代码一线的斗士们,注意身体,养成锻炼的好习惯!
其实这些问题不仅见于程序员,
我最近在写《Learn Python The Hard Way》的最后几节课,我还要加一课:
我可能不会把这篇博文全部放进该书里,因为有点多。
我的背景和资历
我以前是一等合格美国士兵,并学习过多种武术。
![]()
首先先列一下我学过的武术:忍术(Ninjitsu),合气道(
而且,在部队里我是体能测试优秀,几乎是连续两年满分通过的。
然后,不论我干不干活,我如今一直保持着同样的体重、
有着前述的体魄,
好,写这么多是让你知道我还有点能耐,但是更重要的是,
希望我保健的经验能帮你恢复或保持健康。
程序员的常见健康问题
编程乍一看是个耗人的领域,一方面似乎你没有做很多,
显然建议就是大多人说的饮食,外出活动。
这里要说的程序员们平日的职业病。他们相当明显而且平常,
▲ 腕部疼痛(重复性劳损)
▲ 盯着看移动的打印进度以及其后的句点造成的眼部问题
▲ 姿势不当造成的背部不适,尤其是背下侧,肩上侧。
▲ 肠道和尿道的问题(不能正常大小便)
▲ 摄入太多咖啡因,而且喝水少造成的脱水
▲ 坐姿保持太久,造成男性的痔疮或前列腺问题(我一会再细说)
▲ 光照不足造成维生素D缺乏
▲ 熬夜或者喝咖啡过多导致的睡眠失调
▲ 缺乏伸展导致普遍的僵硬和疼痛
我一直跟这些问题作抗争,因为编程,弹吉他,或者举重时误伤。
普遍原因
一般来说,可以总结成嗜编程为命。你可能想成为个中翘楚,
事实是真正的编程者都是有点傻蛋。他们从来吃不到正点,
所以,在你看到这些问题以及我怎么解决的时候,
腕部疼痛
这个可能是我用心最多的。因为频繁且长时间地编码、拨弦,
你知道,合气道有着绝佳的腕部练习,
这些练习治好了我的所有关节错位和疼痛,
现在如果你有严重的腕道综合征或者其他类型的重复性劳损问题,
你实际想每次伸展运动得到放松。这有点难解释,
记住这一点,怎么做练习则有很多视频:
▲ 翻转手腕 (Youtube的视频,须翻墙)
▲ 扭腕
▲ 手腕外侧弯曲
▲ 手腕内侧弯曲
下面介绍当你坐下来打字的时候怎么去做锻炼(每次都要这样):
1. 首先要热身,将手伸向前方在空中尽可能快速地抓20次。
2. 用你最擅长的,以中速做5至10次。
3. 继续做各项动作,但甩手和甩胳膊,弯曲手腕后到要归位。
4. 千万不要做过头,让你手腕感到损伤。要适度恰好,并放松。那个“
每次敲代码前做这系列动作,每天要做,
还有:在做这些之前先咨询一下医生。你做这些可是自己冒风险,
吉他手更糟糕
在吉他手或贝司手跟前,程序员的重复性劳损可是小菜。
吉他对于手来讲是硬乐器,所以有一点点疼痛你就歇菜了。
我的拇指有了赘骨,其他的指头疼痛难止。我的手腕还耐得住,
我解决这个的唯一办法,而且用了一年半,是做以下的事情:
1. 找把不伤手的吉他。说你啥样吉他都能玩是屁话。
2. 做上面的锻炼,我的指头做得更多。
3. 通过做练习,慢慢开始恢复指头的力度并注意放松。
4. 在弹的时候注意放松,拨弦的时候更轻巧。
5. 避免弯曲,这些曾导致我的手受伤。
6. 变换姿势和演奏风格,不抓紧吉他就能快速移动,
7. 调整吉他高度,让我的肩和手都觉得舒服。
8. 站着,很少长时间坐下,长时间摆一个姿势是很别扭的。
去年做完这些后我的手最终痊愈了,并且感觉良好。
我的手现在是我的命根子,所以不能再打拳了,
眼疲劳
我觉得这对我不是问题,但你最好悠着点。我年轻的时候比20/
在黑暗时期,我们天天还瞅的是CRT显示器,
我想每天两个小时不看电脑。要么我去玩吉他不用费眼力,
这对于你可能有的头痛有助益。
不是把你房间的灯都关掉,只需要合理的照明,
但还是先休息一下吧。
背部问题
我挺走运的,背一直还可以。尽管如此,我相当多时间是坐办公室,
我的问题是背的上半部分,脖子,肩部。我习惯猫在键盘上,
现在选择你的座椅很重要,我喜欢艾伦椅(Aeron),
我的肩部完全处于压/迫状态。
我发现最有效的解决办法是伸展上肢,做俯卧撑。伸展办法很简单,
1. 用一只手抓紧门框,手心朝向你的身体,然后向前挺胸,越过肩位。
2. 用另一只手握紧门框,胳膊交叉在前,手心继续朝里,
3. 两只手都抓住门框,高举过头,稍向后站呈倾斜,然后来回拉伸。(
如果你做了,同时做抡臂,摇摆,你就会觉得好一些。
另外就是做真正的俯卧撑了。我工作的时候并不做这个,
脱水
这个问题不大,我时常有点内疚。我发现我一天狂喝咖啡,
我的建议(我也要多做的)是,
肠道及尿道问题
好吧,接下来的两个问题确实不雅,
你不知道这条提示有多有用,我真希望我年轻的时候知道这句话。
这样的话最后会导致便秘,这将终结你的健康状态。
如果你已经搞砸了,你去弄一些纤维片,待在家里然后吃掉,
然后,你觉得是时候了,拾起身去拥抱上帝吧。我告诉你,
痔疮和前列腺问题
另外一个不上厕所会导致的就是痔疮。我知道够恶心的,
1. 长时间坐着。
2. 举重东西,不用辅助。
3. 该去解决内急的时候不去。
4. 强迫自己去拉屎,实际上不需要。
5. 最糟糕的:坐在厕所里看书。
最后一条就是罪魁祸首。如果你不是必须要大C,可别老泡在那。
确实臭哄哄的,但潜在危害很大。恩,危急情形是血流一地,
是,我是个大笨蛋。你可别学我。为了你的屁屁的健康,
1. 多吃果蔬,至少吃点纤维片。
2. 该解决个人问题时赶紧的!
3. 任何情况下不要压/迫直肠。
还有一个导致前列腺的问题,如果整天坐在屁股上的话。
维生素D不足
维生素D有点怪。的确只能通过晒太阳产生,
还有一些事比如消沉,搞坏的牙齿,
事实上,我觉得一个问题是硅谷里很多刚起步公司提供的餐饮。
不要吃盒饭,在中午去外面吃一顿。好处你自知,
我在温哥华和西雅图的时候有轻微的维生素D缺乏,那儿光照不足,
所以,你趁有太阳的时候出去晒晒。
睡眠失调
我的睡眠时间一向很灵活,跟季节和地域有关。
有时候,我不确定为何在夜里创作音乐或编程倒多产。
不管怎样,早睡晚睡已经把我的睡眠机制搞砸了。
如果你也有睡眠问题,我有一些简单的调适方法助你入睡。
首先,花你的血本买个好床,2000+美元不算多。
有了床,开始练习助睡法,有点自我催眠的意味:
1. 关掉你房内的所有灯光和音响。
2. 躺下,让手放在让你舒服的位置。
3. 缓慢地深呼吸,并想象空气流进身体及逸散出体外的场景。
4. 当你能注意到你的呼吸之时,想象你在看窗外辽阔的太空,
5. 然后伴随呼吸幻想自己漂浮在空中,渐入巨幅的星系,一切星辰,
6. 持续幻想,感觉你的床也在漂浮,直到皆不见。
你或许在四五点睡觉,但不是要出去的话,
如果你有重度失眠,还请咨询医师。但还是试下这招,
刚柔并济
如果浑身不适难于活动,这时就该做下伸展运动。
我想如果你晚上入睡前做5-6个大幅的伸展练习就够了。
伸展身体的时候同样要放松大脑,
我也不知为何,但是精神之松弛对于突发的灵感多有助益。
迈出第一步
上面的内容可能对于你有点多,
下面就是我在敲代码前要干的,或者玩吉他前,
1. 活动身体各关节,只需将腕、臂、颈、臀转摇几下。比如正向五次,
2. 在各部分前做一些腕部练习,摇一下手腕。
3. 将臂举过头顶尽可能高,然后向后伸展尽可能远,
4. 最后,小心地用手扶着头分别向右、左、前、后摇几下。
如果你做这些的话,将避免一些编程会带来的伤害。
然而,如果有特殊问题的话,继续去咨询医疗师,
真希望这些能让你变好,如果没有的话,记下建议,
如果对上述的事情持有疑问,可以给我发邮件,我会给你一些建议。
保重。
作者Zed Shaws是一位作家、软件开发人员、音乐人(
[分享][代码]一个简单的python小程序————使用douban API通过ISBN查询书籍信息
前言
刚学python时做的一个小程序,虽然小,但是也用到了不少内容。具体有以下几个方面:
- 命令行的解析
- 文件的读写
- XML解析
- http连接
- 多线程
短短不到200行的程序就可以做到这些,可以算是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 可以在 Refresh 和 Build Options 中进行配置,我个人觉得auto-build对开发没有实际作用,因此这里就不介绍了。
- Location 填入
简单几步就可以编译共享库了,够简单吧
其他方法
这里还有一种我试验可用的方法,但是配置起来实在麻烦,适合移植已有程序或者开发大型项目时完全定制编译过程中使用。这里只给出出处,有兴趣的同学可以看看。
[译]初次参与开源软件项目的六个忠告
原文链接: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条初次参与开源软件项目的忠告。