技术 - webdancer's Blog

scala学习——环境配置

打算学习一下Spark,因为spark使用Scala语言写的,所以先得学习一下相关的知识。由于我以前对java比较了解了,如果你对java不熟悉,所以这篇文档的内容可能不是很适合你。

1.下个Scala编译器

2.选择开发环境IntelliJ+scala插件:当然可以在命令行里面进行语言的学习,但是最好先学习个IDE,这样看源码的时候也方便。对于如何在IntelliJ中使用scala的插件,可以参考:这个简单的scala插件使用的文档。

【注意】:直接使用“run”可能没法运行,配置一下就可以了。

[翻译]POSIX 线程编程

文章原文:POSIX Threads Programming

作者: Blaise Barney, Lawrence Livermore National Laboratory

地址:https://computing.llnl.gov/tutorials/pthreads/#PthreadsAPI

翻译:webdancer(翻译的不好,勿喷,O(∩_∩)O~)

=================================================

  1. 概要
  2. Pthreads总览
  1. 什么是线程?
  2. 什么是Pthreads?
  3. 为什么有Pthreads?
  4. 设计线程程序

继续阅读

生成毕业论文清单的python脚本

快乐的大学生活就要结束了,到了毕业季,大家在兴奋中有充满了伤感,不知道何时才能再度重逢,再像这样一起生活四年是不可能了。我们应该珍惜自己身边的朋友,也许有各种毛病,但是,是人就有毛病,没有的话,那就成神了。

闲话不说了,今天早上整理同学的论文,可能是自己没做好通知,大多数同学的文件名都有问题,非常蛋疼的一个一个的帮同学修改文件名。然后去教务处交上了,但是忘了做论文的清单了,难道又要一个一个的输吗?想了想,用python写个脚本吧。因为我已经手动的帮把文件名都改成了:学号_姓名的格式,刚开始的思路,只是将文件名和学号处理一下,让程序自动的把这学号和姓名写入xls文件;但是还有论文题目,指导老师,这两项还是要一个一个的输,看了看论文,尽管有的同学的首页有问题,但是大多数同学的首页都包含了这四种信息,那就不如直接处理word文件了,把信息提取出来,直接写入xls文件。

程序的思路:

  1. 使用win32com把word转为txt文件;
  2. 读取txt文件,在前30行中搜索姓名,学号,题目,导师信息;
  3. 把提取的信息写入xls文件。

思路比较简单,程序写了一下午,主要是对win32com不熟悉,还有让人窒息的汉字编码问题,耗费了大多数时间。跑了一下,程序的效果还是比较好的,只有几个同学的文档没有按照学校给的模版写,没有抓到信息,其他的都搜到了。

 

# -*- coding: utf-8 -*-
import fnmatch, os, sys, win32com.client  
from tempfile import TemporaryFile
from xlwt import Workbook
# prepare xls file
book = Workbook(encoding='utf-8')
sheet1 = book.add_sheet('Sheet 1')
sheet1.write(0,0,'学号')
sheet1.write(0,1,'姓名')
sheet1.write(0,2,'论文题目')
sheet1.write(0,3,'专业')
sheet1.write(0,4,'指导老师')
sheet1.col(0).width = 5000
sheet1.col(1).width = 5000
sheet1.col(2).width = 10000
sheet1.col(3).width = 5000
sheet1.col(4).width = 5000

# retrive informatio from doc
index=1
wordapp = win32com.client.gencache.EnsureDispatch("Word.Application")  
try:  
      for path, dirs, files in os.walk(sys.argv[1]):  
            for filename in files:  
                  if fnmatch.fnmatch(filename, '*.doc'):
                      filetype=1
                  elif fnmatch.fnmatch(filename, '*.docx'): 
                      filetype=2
                  else:
                      continue
                  doc = os.path.abspath(os.path.join(path, filename))  
                  print "processing %s" % doc  
                  wordapp.Documents.Open(doc)  
                  if filetype==1:
                      docastxt = doc[:-3] + 'txt'  
                  else:
                      docastxt =doc[:-4]+'txt'
                  wordapp.ActiveDocument.SaveAs(docastxt,FileFormat=win32com.client.constants.wdFormatText)  
                  wordapp.ActiveDocument.Close( )  
                  f=open(docastxt,'r')
                  namefound=False
                  numberfound=False
                  titlefound=False
                  adfound=False
                  i=0
                  metadata=[u'prob']*5
                  for line in f:
                      line=unicode(line,'gbk')
                      i=i+1
                      if i>30:
                          break
                      if namefound and numberfound and adfound:
                          break
                      if titlefound:
                          metadata[2]=line.lstrip().rstrip()
                          titlefound=False
                          pass
                      if line.find(u'号')!=-1:
                          metadata[0]=line.split()[-1]
                          namefound=True
                      elif line.find(u'姓')!=-1:
                          metadata[1]=line.split()[-1]
                          numberfound=True
                      elif line.find(u'题目')!=-1:
                          titlefound=True
                      elif line.find(u'师')!=-1:
                          metadata[4]=line.split()[-1]
                          adfound=True
                  metadata[3]=u'计算机科学与技术'        
                  print 'number: %s, name: %s, title: %s,dap: %s, ad: %s'%(metadata[0],metadata[1],metadata[2],metadata[3],metadata[4])
                  for meta in range(5):
                      print index,meta
                      sheet1.write(index,meta,metadata[meta])
                  index+=1
                  f.close()
                  os.remove(docastxt)

      book.save('08_1_auto.xls')
      book.save(TemporaryFile())

finally:  
      # 确保即使有异常发生Word仍能被正常关闭  
      wordapp.Quit( ) 

“代码大全”读后感

“我们的精神品德既非与生俱来,也非逆于天性,...,其发展归因于习惯,...,我们要学的东西都通过实际做的过程学到,...,如果人们建的房子好,他们就成为好的建设者;而造的房子不好时,他们就是差的建设者,...,所以小时候养成怎样的习惯关系很大——正是它会造成天壤之别,或者说就是世上所有差异之源。”       ——亚里士多德

代码大全旧的内容很多,交给了我们许多软件工程中的解决写软件过程中难题的解决办法。因为自己还没有接触过大型的项目,对于其中的一些并没有很强的共鸣,不过我相信在以后的工作中还是很有用的。下面就简单说一下自己的看书感受:

  1. 编程需要经验的传授。就像是武侠小说里面一样,一个大侠要练成绝世武功,要么像张无忌一样,偶然的机会得到了像《九阳真经》这样的武功秘籍,要么像郭靖一样,有洪七公这样的前辈教授。他们无不是从前人那里继承了技能和经验,自己发明一门武功的人真的少之又少,编程和练武也一样,很多良好的编程技巧需要学习,代码大全详细的记录了各种技巧,小到如何定义变量名,大到如何管理一个大型的软件项目,都给出了许多建议,这对我们大学生来说,还是挺有用的,很多东西,老师都没讲过。
  2. 编程是一个渐进的过程。很多时候,我们拿到问题就开始编写代码,这通常并不好。因为一个问题的解决从来都不是那么容易的,而且直接写代码,我们通常需要花费好几倍的时间来调试代码。编程的时候,我们可以先想一下我们要解决的具体问题,首先把问题搞明白,然后再写伪代码,这样我们用自然语言的方式先大体回答了我们要解决的问题(要是在软件工程中,就是一个需求分析,系统设计的过程),然后我们在开始将伪代码转化成代码,这个过程由于前面我们已经解决了很多东西,在这时候我们可以专心写代码。
  3. 编程需要的东西很多,我们需要逐渐积累。就像建筑师,要积累设计经验一样,我们程序员也要注意积累经验。现在由于搜索引擎太好用了,需要的时候可以搜索,对于很多东西缺乏思考。
  4. 编程需要好的编程环境和工具。良好的编程工具会极大的提高编程效率,所以一定要为自己选择一个良好的编程环境。
  5. 这本书是一部大块头,需要的时候翻翻,要一下子消化所有的东西不可能。

 

认识MD5

     MD5是一种安全哈希算法(secure hash algorithm,SHA);SHA是一种加密哈希函数(cryptographic hash function);加密哈希函数是一种哈希函数(hash function); 哈希函数是一种函数。下面我们就看一下这些概念。

1.函数(function)

     学习过离散数学,我们对函数并不陌生。不严格地说,在定义域上上的值x,都有值域上唯一的值y与之对应,这种映射关系成为函数。简单地说,函数可以将一些数值变换到另外一些数值(当然可以使本身)。注:数学上的函数与编程语言的函数还是有些不同,虽然在程序中的函数,给定输入(参数),可以得到输出(返回值)两者的范畴感觉还是不太一样。

2.哈希函数(hash function)

    散列函数是一种从任何一种数据中创建小的数字“指纹”的方法。哈希函数得到的输出成为散列值。哈希函数是一种特殊的函数,当然满足函数的基本性质,即两个不同的散列值对应的输入时不同的。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。不同的输入映射到相同的散列值称“碰撞”。哈希函数如下图所示:

  哈希函数的主要应用有:

  1. 散列表。散列表是一种重要的数据结构,是哈希函数的一个重要应用。使用散列表能够快速的按照关键字查找数据记录。
  2. 加密。一个典型的加密单向函数是“非对称”的,并且由一个高效的散列函数构成。加密算法可以分为两类: 对称加密和非对称加密
  3. 错误校正。使用一个散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。
  4. 语音识别,Rabin-Karp 字符串搜索算法等。

3.加密哈希函数(Cryptographic hash function)

     加密哈希函数是一种哈希函数,其满足哈希函数的基本性质:将一个大数据转为一个固定bit的字符串。其输入和输出分别成为:message(消息)和digest(摘要)。其中一个良好的加密哈希函数要求一下几点:

  1. 有消息容易计算摘要。
  2. 有摘要反向得到消息是不可行的(哈希函数不可逆,单向函数)
  3. 消息改变,摘要一定改变(哈希函数不碰撞)
  4. 两个不同的消息,对应不同的摘要(哈希函数不碰撞)

安全哈希函数如下所示:

应用:

  1. 文件或消息完整性验证。
  2. 文件或数据标识。比如git等代码管理系统使用sha1sum来区分不同内容。

4.安全哈希算法(secure hash algorithm,SHA)

     安全散列算法是一种能计算出一个数位讯息所对应到的,长度固定的字串(又称讯息摘要)的算法。SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由NSA所设计,并由NIST发布;是美国的政府标准。后四者有时并称为SHA-2。

    python的hashlib模块中实现了上述五种SHA算法和更早的md5算法。

image

5.MD5

     MD5即Message-Digest Algorithm 5用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一 ,主流编程语言普遍已有MD5实现。

    MD5是一种安全哈希算法,但是MD5较老,散列长度通常为128位元,随着计算机运算能力提高,找到“碰撞”是可能的。在加密哈希函数中已经说过,一个良好的加密哈希函数应该不碰撞。2004年,王小云证明MD5数字签名算法可以产生碰撞。

   为什么证明产生碰撞,MD5算法就失效了呢?以前不太理解,下面的解释还是比较清楚地。

   根据密码学的定义,如果内容不同的明文,通过散列算法得出的结果(密码学称为信息摘要)相同,就称为发生了“碰撞”。散列算法的用途不是对明文加密,让别人看不懂,而是通过对信息摘要的比对,判断原文是否被篡改。所以说对摘要算法来说,它只要能找到碰撞就足以让它失效,并不需要找到原文。具一个例子, Linux的用户安全机制,只要得到用户密码文件(其中记录了密码的MD5),然后随便生成一个碰撞的原文(不一定要跟原密码相同),就可以用这个密码登录了。

参考:wikipedia

[转]致年轻开发人员的一封信

 我收到了很多年轻开发人员写给我的邮件,希望可以提升自己的编程能力。我肯定不是第一个讨论这个话题的人,所以我不确定还可以说出什么新意。然而,我认为,这里还是有几个重要点,非常值得列出:

  • 要跟其他开发者一起工作。我们正处在科技史上的黄金时期,这是第一次,身处何地,雇主是谁变得不那么重要。只要你的网络带 宽足够,你就可以与身处地球任何位置的另一位开发者搭档共同编写代码。越来越多我认识的资深开发者都在贡献自己的时间分享这样的知识。我朋友Evan Light有“开放办公时间”[2],而且还在开发一个网站帮助 Rubyists[1] 搭档。我也这样做了好一阵了。想要研究FLOSS[3]代码?发邮件给我,我们会把事情安排好。
  • 要读 WikiWiki (有时又叫做 WardsWiki)。这一点非常重要。有时我觉得,在我的学习遇到瓶颈时,我就是通过浏览WikiWiki 而得以学到所有我真正需要的东西的。
  • 要阅读他人编写的代码。为GitHub 喝彩!如果你想以编撰得更好的作品为开始而你又对 Ruby、有所了解,那么就试一试解决Ruby Quiz上的问题。(关于这个话题,Alan Skorkin 写过一篇很全面的文章:《阅读优秀代码是提高开发人员修为的一种捷径》。)
  • Ruby,一种为简单快捷对象导向编程(面向对象程序设计)而创的脚本语言,由日本人松本行弘开发,遵守GPL协议和Ruby License。Ruby的作者认为Ruby > Smalltalk Perl,表示Ruby是一个语法像Smalltalk一样完全面向对象、脚本执行、又有Perl强大的文字处理功能的程序语言。其它特色包括: 运算符重载 自动垃圾回收、在Windows上,载入DLL 巨大的标准库。
  • 加入本地用户组。如果没有这样的群,那就创建一个,然后开始交流。我不在意你是一个多么差劲的菜鸟。要想使你全面了解一个问题,再没有比这更好的方法了。
  • 开一个博客。不要担心自己会成为异类。一些最有用的博客其实主要记录了一个程序员的经验和错误以及他们是如何克服困难。反思是学习的最重要的一部分,而写作则会帮助你反思。并且,在你思考之前,你又会从其他程序员那得到反馈。
  • 我相信你已经听说过这一点了:为一个开源项目提交补丁。
  • 用掷硬币的方式来作决定。正面朝上就选择 Vim,背面朝上就选Emacs。开始学习容易上手的编辑器。这两种中的任何一种都会在你剩余的编程生涯中一直与你同在。强大、灵活的工具能使优秀程序员更加优秀。(编注:看来国外很多程序员都在用Vim或Emacs,Akash Manohar 在《写给即将入行的程序员的一封信》这篇文章中,也是推荐这些工具。)
  • 学习多种编程语言。但首先你得学好一编种程语言。你需要一种可以使你得到灵感并且快速掌握的在一天内迅速地 写出第一个版本的编程语言,从而不用花费大量的时间去学习你会很容易忘记的语言细节。然而,一旦你已经掌握了这门语言,你就要去学习新的语言,来挑战所有 你从之前所学习的语言中学到的假设。要选择风格完全不同的编程语言。我所看过的一本书《七周掌握七门语言》 中就对编程思维模型进行了全面、广泛的概括。(相关阅读:《学习不同编程语言的重要性》)
  • 为你所使用的编程语言和平台建立邮件列表。人们有时会忘记在博客、Hacker News和推特以外还有很多讨论是非常有益的。跟其它场合比起来邮件列表通常是文明而有用的工具。
  • 不要花费太多的时间去为某物找寻“最好”的工具。我过去常常会花费好几天或几个星期,去试着为我即将开始的项目寻找最好的框架,以致我的工作进度停滞不前。不要掉进这个陷阱里。当你已经是个相对有经验的开发人员时,选择那些有很多人在用的语言和框架。在你遇到困难时,知道如何继续下去比选择完美的工具要重要。
  • 寻找练习的机会
  • 当然,还有一点就是:练习、练习、练习。上班时写代码。在家写代码。练习 code katas 。编程与其它技能一样:说到底,它的本质还是练习。

------------------------------------------------------------------------------------------

 编注:Rubyist 是指那些对Ruby的关心程度超过常人的人。
 编注:“开放办公室时间”是美国大学的传统,作法是学校每周开放办公室数小时,学生不需事先预约就能和老师面谈。
 编注:Free/Libre/Open Source Software 免费/自由/开源软件。

译文出处:伯乐在线 - 职场博客 - 程序员
译文链接:http://www.jobbole.com/entry.php/1419
原文:Avdi Grimm  翻译:敏捷翻译 - 张秀君

写给新手程序员的一封信[转贴]

首先,欢迎来到程序员的世界。在这个世界上,不是有很多人想创造软件并解决问题。你是一名hacker,属于那些愿意做一些有挑战性的事情的人。

  “当你不创造东西时,你只会根据自己的感觉而不是能力去看待问题。” – WhyTheLuckyStiff

  对于下面的文字你不必完全接受,所有这些来自一个其貌不扬的程序员。我喜欢把事情做到最好,而不是对原来的东西修修补补。

  仅仅是因为爱好开始做一些创新,这是一个很好的开始!如果你说“我要先学习一下再开始做”那么你永远不会真正开始。每个人都需要从某个地方开始,所以现在打开你的编辑器开始写代码吧。

   下面是一些很重要的建议,虽然有人并不认同,但我保证你看完我的分析以后会站在我这一边。一开始,先不要管算法和数据结构。大多数简单的程序不需要用到 算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后找一些相关的 论文去理解算法并动手编程实践。如果没有现成的函数库(其他程序员提供的可重用代码),你用自己喜欢的编程语言来实现它。

写给新手程序员的一封信

  0. 选择一门好的编程语言,一门你自认为可以用它快速地做出一些有用东西的语言。

   不要选择C语言作为你第一门编程语言。也许选择C语言会给你一种过时的满足感。虽然它比早期的汇编语言提供了更好语法描述,但是今天C(或者C++)不 是能够快速编写软件的语言。毫不偏袒的说,我建议你学习一种动态语言。选择一种你觉得语法(文档)让你使用起来更舒服的编程。为此,你可能需要花费一些时 间来在几种不同的语言之间进行比较。这么做目的不是为了让你感觉更好或者让编程更容易。更快地完成自己的作品并且能够看到成果,才是激励你编程的源动力。 不要选择一门需要某种重量级的IDE(IDE是一种能够帮助你编写并运行代码的工具)才能轻松编程的语言。你所需要的仅仅是一个文本编辑器。(注:原文并 没有标号,是我们加上的,请大家别忘记了哦,我们是从零开始数数的。:) )

  1. 选择一个好的编辑器。

  编辑器对程序员而言,就是像是弓对弓箭手一样重要。这里有一些推荐的编辑器:

  • SublimeText 2 – 如果你刚开始编程,推荐使用SublimeText 2
  • Emacs – 学习曲线陡峭,快捷键复杂。如果你想定制自己的使用习惯,需要学习Emacs Lisp.
  • Vim – 不仅操作简洁而且它默认包含在linux的发行版中,所以深受大家欢迎。我开始使用了2年Emacs。由于Emacs的快捷键操作过于复杂,我的双手开始 经常疼痛,这迫使我转向了Vim阵营。了解Vim的快捷键是非常有必要的。当你在远程的服务器上编辑代码时,你唯一不需要安装的编辑器就是Vim。

  注意!Emacs和Vim可能已经成为成为古董了。但是,它们都具备一些现代编辑器多不具备的功能。

  2. 选择一个你可以从中学到东西的操作系统

   Windows不会教会你任何东西。使用Windows你唯一学会的就是打开一个exe(可执行)文件来安装软件和使用它。可能刚开始的时候你会觉得很 酷,但是长远来看,如果你立志成为一个web开发人员,可能还是要具备基本的linux知识,尤其是当你要发布程序的时候。Linux也允许你根据自己的 要求来定制程序。Macs也很酷,但是我认为你现在经济上还负担不起。

  3. 不要通过复制粘贴来做备份

   一个新手程序员通常会把文件复制粘贴到一个临时目录下面来进行备份。这也许也是他们唯一知道的方法。不要那么做!你需要使用版本控制软件。我强烈推荐使 用Git,它是个目前很流行的版本控制工具,而且使用起来非常简单。对一个Git新手,有一个良好的社区和很多参考资源来学习。(除了Git之外,还有 mercurial, darcs, fossil等等。但是我还是建议从Git开始,我有很多的理由来支持Git,这里就不多费口舌了。)

  4. 知道去哪里寻求帮助

   参加一个和你相关的(你使用编程工具相关的)程序员社区。比如StackOverflow就是程序员的Facebook。那里没有消息状态和回复,取而 代之的是问题和答案。除此之外还要学会使用IRC。IRC是一种老式的聊天室,现在还在被大多数开发人员用来分享技术信息和帮助解决问题。

  5. 培养你的礼仪

   知道什么时候问问题。你遇到的大多数问题都是别人碰到过并且在Internet上能够找到解答的。在IRC或者任何论坛里发问之前,先搜索一下 google(或者blekko)来看看是不是有现成的答案。在IRC上问问题需要有耐心。永远记住,人们只是处于好心来免费帮助你。有时你发问以后需要 几个小时才能有回复。所以,耐心等待。除此之外,记得问问题的时候要礼貌。世界很小,你怎么对待别人,别人就会怎么对待你。

  6. 结交朋友,技术书籍只能教你解决常见的问题(他们说:书是死的)

   当你在捣鼓一些程序或者从程序的作者那里学习,你能学到一些书本上没有的东西。当你散步的时候,请和遇到的朋友打招呼。你肯定不是唯一的程序员。和其他 的程序员一起交朋友一起工作。你会注意到,当一群技术爱好者在一起的时候,不论话题是从什么地方开始,最后总是以技术话题收尾。这是必然的现象。所以你可 以尽情参与。在你的黄金年龄努力编程,我能告诉你的是,我在开始6年前寻找朋友并开始讨论编程,从那时起才学到那些书本和文章不会我的东西。所以我总是 说,我的编程经验有6年,因为只有那个时候开始,我才开始与人交流并开始感觉真正地开始学习编程。

  7. 参加开源项目

   为开源项目编写代码能带来回报。这不仅仅是帮助别人,你留下的代码会被其他人使用或(可能)改进。当别人给你的代码添加功能或者提出修改意见时,也是在 提高你的编程水平。开源软件项目不一定要是一个大工程,编写一个下载youtube视频的小程序也是很有用的。更重要的是,你会惊奇地发现你编写的代码会 成为与他人有效沟通的桥梁。

  最后,若干年之后如果本文的内容曾经对你有一点点的帮助,作为回报请写一封类似的信给希望开始编程并不知如何入手的朋友,有可能的话请纠正本文中过时的内容。

  智者说过,掌握某个东西需要10年或10000个小时,也就是汉语中的“十年磨一剑”,所以不用着急。

  英文原文:An open letter to those who want to start programming

  中文翻译:伯乐在线




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee