手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:http

转+收藏:LINUX书架

在做PHP开发的同时,不可避免的会使用linux。好吧,即使你不精通linux,你怎么着也得会一些常见的命令吧,不说高深的东西,最起码你要会cp,mv,chmod,chown,tar之类的,否则,你连文件都无法移动位置。

国内在02~03年左右,鸟哥的私房菜大概是影响了很多人吧,由于我一直是在win下,所以LINUX接触不多,但也确实听说了这个。这次看到这篇博客,里面介绍了好多的书籍,所以复制了一下(自己也有过LINUX的书籍,被人抢走了。。。。)

来,上菜了。。原文来自:http://www.cnblogs.com/wwang/archive/2011/01/27/1944406.html

入门类

一直认为,在一个系统上学习开发之前,首先需要熟悉这个系统的使用。鉴于天朝的国情,绝大部分人第一个接触的操作系统就是Windows,因此对于这绝大部分人来说,如果要学习Linux开发,学会使用这个系统都是必不可少的一个环节。
现在的Linux初学者是幸福的,随着Linux桌面环境越来越易用,入门一个新的系统是非常容易的事情。虽然命令行对于提高工作效率更加有 效,但我们完全可以把熟悉命令的过程放到日常使用中进行。无论学习什么知识,在实践中学习都是高效而且有趣的。在这个阶段,我们也未必一定需要书籍。现在 很多Linux发行版的Wiki写得都非常详细,在使用某一种发行版时找到相应的Wiki阅读查询就可以了。而且,桌面环境变化太快,关于桌面的介绍类书 籍几乎都没有必要看,这类书籍大多刚一出版就过时了。
那入门类书籍里哪些比较有价值呢?我比较推荐涉及的技术相对比较稳定的书。比如,Linux基本的体系结构和命令一般都是经久不变的,甚至从上古时期的Unix开始就没太多变化,这类书籍讲解的知识也是以后大幅提高我们的生产力的基础。比如《鸟哥的Linux私房菜》,比如《Unix Power Tools》(中译名是“UNIX超级工具”),或者是为Linux+认证考试准备的《Linux+ Study Guide》。当然,这一类书籍其实都不必精读,快速浏览之后作为工具书备查就可以了。

编程类

类Unix系统的编程书籍里,最经典的莫过于简称为APUE的《Advanced Programming in the UNIX Environment》(中 译名是“Unix环境高级编程”),这本书被广大Unix程序员(包括Linux)捧为“圣经”。借用葛大爷的广告词:“这就像进馆子一样,一条街上,哪 家人多我进哪家”。APUE对类Unix系统的编程接口讲解的非常全面详细,对于这本书,我们不仅要精读,还应该放在案头常备。
但是,APUE对于Linux编程初学者似乎稍深了一点,而且很多细节在Linux中并不会用到。讲述Linux编程的书籍里,《Advanced Linux Programming》应该更加适合初学者。不要被书名中的“Advanced”吓到,书里的内容还是很容易理解的。看完这本书再看APUE应该效果会更好。
如果要开发GUI程序,上面两本书就无能为力了。在Linux世界里,最常用的GUI Toolkit是GTK+和QT。
GTK+的书籍并不多,在线文档只适合查阅,并不是一个完整的学习体系。《Foundations of GTK+ Development》是其中很不错的一本书,喜欢GTK+的开发者可以拿来作为入门书籍。
相对来说,QT的书籍就很丰富了,这和QT具有良好的跨平台能力有很大关系,QT的书籍并不只是写给Linux程序员看的,在Windows和MAC OSX下同样可以使用QT开发程序。比较值得一看的QT类书籍有《C++ GUI Programming with QT4》、《Foundations of QT Development》、《The Art of Building QT Applications》,这三本都比较适合QT初学者阅读。另外,《Advanced Qt Programming》会介绍到QT一些比较高级的用法,适合有一定QT基础的读者阅读。

内核类

对于Linux内核或者设备驱动的开发者,最全面最直接的学习资料一定是Linux内核代码及其文档。Linux内核的发布周期很短,相关书籍 的出版完全跟不上脚步。但随着内核代码的日益庞大,学习曲线越来越陡峭,入门者又非常需要书籍来作为指导,这确实是非常矛盾的事情。所幸,很多Linux 内核技术作家也是很勤奋的,经常会更新自己的作品。就像Robert Love,以2.6内核为蓝本的《Linux Kernel Development》已经更新到第三版了。LKD是非常适合内核初学者阅读的一本好书,对它的评价可以引用陈莉君老师的译者序:
相对于 Daniel P. Bovet 和 Marco Cesati 的内核巨著《 Understand the Linux Kernel 》,它少了五分细节,相对于实践经典《 Linux Device Drivers 》,它多了五分说理。可以说,本书填补了 Linux 内核理论和实践之间的鸿沟,“一桥飞架南北,天堑变通途”。
谢谢陈老师,她的译者序帮我引出了另外要谈到的两本经典书籍,对,就是《Understanding the Linux Kernel》和《Linux Device Drivers》。对于这两本书,如果要挑它们的缺点,我只能说,内容有点老,很多知识点都需要更新了,除此之外,我要说的是,是它们把我带上了内核驱动开发这条路上来,当然,还有LKD。
最近,我又发现一本分析Linux内核的优秀书籍,就是《Professional Linux Kernel Architecture》。这本书我目前正在读,写得非常好,而且因为此书相对较新(只是相对,2.6.24内核在现在看来也很老了),没有看过ULK的同学可以直接看这本书。

工具类

工欲善其事,必先利其器。进行Linux开发,相关工具还是需要熟练使用的。比如,GNU Tool Chain、自动构建工具、编辑器、版本控制工具等等。
这里有一本包罗万象的书,叫做《Handbook of Open Source Tools》,书中介绍了各种各样的开源工具,可称之为开源技术的总决式。这本书试图面面俱到,因此并不深入,粗读即可。
GNU Tool Chain参考Redhat的《The GNUPro Toolkit》已经足够了,如果单独把makefile拎出来,还可以参考《Managing Projects with GNU Make》。
自动构建工具可以参考《Autotools》。如果您准备使用cmake,推荐cjacker的《Cmake实践》。《Mastering CMake》据说是cmake的权威书籍,但一直无缘得见啊。
说到编辑器,在Linux里最著名的莫过于Vim和Emacs,关于这两者的背景,可以去看看《为何Emacs和Vim被称为两大神器》。我几乎没用过Emacs,曾经在当当做活动时花9块钱买了一本《学习GNU Emacs》,有这本书作为Emacs的入门我想应该够了。Vim是我经常使用的编辑器之一(另一个是Kate,最初喜欢上Kate的原因之一就是它提供了Vim编辑模式),相关的书籍有两本值得一读:《A Byte of Vim》和《Hacking Vim 7.2》,但是对于初学者,首先跟着Vim自带的vimtutor练习效果会更好。
Linux下的版本控制工具很多,有传统的Subversion,也有现在非常流行分布式工具如Git等。Subversion可以参考这本《Version Control with Subversion》,Git可以参考《Version Control with Git》或者《Git Internals》或者《Pro Git》。

其它

除了以上几个类别,还有一些书籍值得推介。
比如《The Art of Unix Programming》,主要介绍了Unix系统领域中的设计开发哲学、思想文化体系以及社群文化等,覆盖面非常广。书中的一些内容和Revolution OS》有相似之处,大家可以自己印证一下。对于这本书,我们也完全可以把它当做小说或者历史书来看,可以躺在床上看,也可以瘫在沙发上看,或者像怪怪那样坐在马桶上看,总之,不必一定要端坐在书桌前。
Computer Systems: A Programmer's Perspective》 很多人都推荐过,这是一本非常经典的计算机体系方面的教材。CSAPP的内容基础全面,讲解简明扼要,易于理解,仔细读完之后对理清计算机体系结构甚至是 Linux内核都非常有帮助的。虽然中文名被译为《深入理解计算机系统》(这个译名很不贴切),但相比之下,为什么会让人感觉国内的同类教材更加“深奥” 呢?也许,这就是作者功力的差距吧。
注:这里列出的书大多都可以在library.nu上下载到,注册登录之后会有搜索框,用书名搜索即可。

Tags: linux, 鸟哥

参加lamp聚会有感

做技术的难免都会遇到技术分享这个词,其实,它并不难懂也不难理会,只是以前很多人更多喜欢自己独自享受,以防影响到自己的职业。但到了近几年,技术分享这个词越来越被大多人所提及,毕竟你一个人了解的技术也是有限的,在圈内推广或者分享的时候,你虽然把你的经验与他人分享了,别人可能学会了你的东西、技术,但是你也相对的了解了其他的技术细节,这是你一个人的时代无法得到的。
单兵作战的时代早就过去了。现在讲究的是团队作战,当然个人技术很可能会占有主导地位,但你总不是万能的。
就象这次lamp聚会,我更想听的是逍遥冰心:《领域驱动设计简述》和蒙显仁:《LAMP在51座席项目中的应用》,遗憾的是这两位都没有来,相反,我却在我认为意义不大的演讲中获取了很多有用的东西,比如滕振宇:《Check in Dance》,真正让我了解到原来check in,并非那么简单,其实在我们的项目中,使用版本控制的时候,一般情况下,都会差不多半天check一次吧。但滕振宇讲的技续集成、atdd等让我受益匪浅,虽然他用的是c#而并非PHP,但是他的一些工具和他的作法很值得推广,比如红绿灯机制、rabbit之类的(参考一些大公司)。如果是重要项目,甚至有小熊机制(得到小熊的人才能checkin代码)这对于小型公司的人来说确实比较难以遇到。事实上我也一直在小型公司打拼。虽然我一直认为我不是做技术的料。滕振宇让我意识到合理的利用工具,绝对是可以增加工作效率的。但我却还是用不到这些,在小公司,并非以产品为主导的公司,如电子商务,一切都是以开发效率至上的,东西错了可以改(只要不涉及到钱)。所以什么单元测试啥的很多时候是用不到的。虽然小公司也有UserStroy,但效率、效用并不如大公司来的那么彻底。

再谈一下方言的《优秀产品欣赏》,方言给了我们很好的产品介绍,以及对于一个产品的分析,品析了玉溪香烟,对于用户忠诚度、品牌认知度、推广度等进行了简要的介绍(其实上就是在分析一款产品对于用户来说有哪些是可以控制并拿来利用的。)还介绍了MacBook,并坦言在自己公司也推广了4台。事实上我对于MB也是有点想法的,只是闲钱不多,没办法了,忍忍吧。最后他介绍了自己的一个做了两年的产品,看他演示的时候感觉好象不错,但是在线版的说实话,不敢用。真的,在国内,凡是涉及到用户信息的,我还真是不太敢使用,我越来越胆小了。但那款软件,感觉上真不错。最起码他在演示的时候显现出来的功能让我感觉很爽。是类似网页设计的。

其实祁宏:《正则表达式入门》和Ben:《基于 Zend Framework 的 Web 开发实践》都不错,只是这两个东西对我来说已经了解过很多次,所以相对就没有特别的关注。祁宏(并非足球运动员哦)的正则表达式并非他所言讲的只是初级的,到后面的内容已经是一般项目中用不到的内容了。有点深后,反而影响了大家的兴趣,因为他也不可能每一句都讲解的非常详细,反而就觉得不太实用了。举两个实际例子的话,或许会好上很多(比如采集网页啥的。如何写上一些关键代码,可能会更吸引人。),regexbuddy这个工具实在太出名了。验证正则表达式,几乎都会用到吧?Ben的ZF框架介绍的不错,只是时间有点拉长了(注重了细节而没有把如何应用架构列的详细)如果真要介绍ZF的流程性操作,bootstrap可是有的讲了。板爷也说了,真要讲ZF,三天三夜也讲不完啊。说实话,做WEB项目,我还真是很少有看到拿ZF来做的,虽然我也比较推荐(因为有完整的团队在支持而不是那一些个人框架,说不定哪天就不支持了,那才郁闷比如我们现在用的thinksns,那真叫一个郁闷啊。)ZF可拿来说的事还真不少,MVC这块除了V之外,M和C都是让人很头疼的。M吧,一直没有一个完整的model类,全部是通过zend_db_table,zend_db_table_gateway,..table_row等进行CRUD,当然要说select的话,他还提供了一个zend_db_select(这是支持连贯操作的类),对于表关联操作,我记得zend官方也说过,好象没有一个特别完美的方法,连他们自己对于zend_db_table_gateway都不满意,更不用说用户了。。。。C嘛。因为涉及到front_controller,就又显得复杂了一点。真想程序逻辑与business logic完全分开,那真的就要等逍遥冰心:《领域驱动设计简述》了。V。。要么不扩展,如果真扩展了。那些View_Helper类,几乎完全作废。

完事,对于此次分享会我是受益颇多,毕竟有些想法是我以前没有想到的。如果以后还有这种机会我还是想去,当然尽量不要太远的。HOHO。对于滕振宇所提的软件协会的一些探讨会,感觉不错,只是不知道有没有时间去听了。

听说一些老外的分享会也不错,但我这个人有点闷骚,不太喜欢讲。如果用电脑交流或许会更好一点。所以,我更多的只能适合作为一个旁听者而不是演讲者了。再加上,我也应该是属于野路子编程,其间之事,实不足为外人道也。Over

结束前突然想起一位朋友说的我聚会后的博客更新很快。其实,这只是对于听大家分享内容的一点笔记而己。由于我没有带任何笔、纸等 相关用来记忆的东西,在听完分享后,为了防止自己遗忘,总要想个办法记录下来,既是一种记录也是加深自己的印象,对于分享中了解的东西做一点归纳,哪些是自己能够吸收的,哪些是可以听过就忘的,哪些是未来想要了解的。这些,还是很重要的。

本次活动由ThinkInLamp牵头举办,发起人为三马,活动网址:http://blog.thinkinlamp.com/?p=174,本篇我听完分享后的个人感想而已

Tags: lamp, 三马, 聚会, 分享

基本实现 phprpc_client For SAE

Tags: phprpc, sae

JS模拟FLASH效果

JS模拟FLASH的效果,一般也就用在图片的控制上了,否则,还能怎么模拟?其实我说的这个模拟并不是说真的象FLASH,而是利用了一堆图片来模拟GIF的效果。
理论上,用图片模拟GIF是可以达到的,只要利用setTimeout或者setIntval这两个函数中的任意一个,在人的视觉那24帧进行合理的控制,可以让人感觉到它在动的感觉。
当然我没有写过,只是说理论上可行,但事实上,有人这样实现了。不过我个人觉得这样的意义并不是很大,因为要下载N个图片的话如果网速不好,那么很有可能就会出现叉叉这样的情况。不过,如果用在LOGO上,就不一样了:LOGO是一个人头,当鼠标移上去时,眼珠会动,因为LOGO一般不会有人会用鼠标去点击或移动,这样当成一个彩蛋也是很不错的。
以前淘宝的宝字,YAHOO的O,都有这样类似的效果。
原文:http://www.cnblogs.com/ublue2006/archive/2009/01/21/1379242.html
文章摘要如下:

JavaScript代码
  1. var ImageShow=function(options){  
  2.     var self=this;  
  3.       
  4.     this.MyTimeOut=null;    
  5.     this.DeleteTimeOut=function(){  
  6.           if(self.MyTimeOut!=null)  
  7.           clearTimeout(self.MyTimeOut);  
  8.             
  9.        };   
  10.          
  11.     this.NowIndex=0;  
  12.     this.ASC=true;  
  13.     this.errState=false;       
  14.     var Images=[];  
  15.     var TimeSpace=0;      
  16.       
  17.      
  18.       
  19.     if(options.Obj!=null&&options.Images!=null){      
  20.     var Obj=options.Obj;    
  21.     var TempImages=options.Images;     
  22.     if(TempImages.length>=2){  
  23.        var imgType;  
  24.        try {  
  25.           for(var i=0;i<TempImages.length;i++){            
  26.              var imageName=TempImages[i].Image;  
  27.               imgType=imageName.toLowerCase().substring(TempImages[i].Image.length-4);           
  28.               if(imgType==".jpg"||imgType==".gif"||imgType==".bmp"||imgType==".png"||imgType=="jpeg"){  
  29.               Images.push(TempImages[i]);               
  30.               }  
  31.              }  
  32.            }  
  33.           catch(err){}  
  34.     }          
  35.          
  36.        if(options.TimeSpace!=null&&IsNum(options.TimeSpace)==true) TimeSpace=options.TimeSpace;  
  37.        else TimeSpace=10;  
  38.        if(TimeSpace<5)  TimeSpace=5;   
  39.     }  
  40.      this.ChangeImage=function(){   
  41.        
  42.         try{    
  43.           if(Images[self.NowIndex]!=null)  
  44.           {   
  45.            
  46.           if(options.BackGround==true){            
  47.           if(Images[self.NowIndex].Image!=null) Obj.style.backgroundImage="url("+Images[self.NowIndex].Image+")";   
  48.           if(Images[self.NowIndex].Position!=null) Obj.style.backgroundPosition=Images[self.NowIndex].Position;  
  49.           if(Images[self.NowIndex].PositionX!=null)  Obj.style.backgroundPositionX=Images[self.NowIndex].PositionX;  
  50.           if(Images[self.NowIndex].PositionY!=null) Obj.style.backgroundPositionY=Images[self.NowIndex].PositionY;  
  51.           if(Images[self.NowIndex].Repeat!=null&&(Images[self.NowIndex].Repeat=="repeat"||Images[self.NowIndex].Repeat=="no-repeat"||Images[self.NowIndex].Repeat=="repeat-x"||Images[self.NowIndex].Repeat=="repeat-y"))  
  52.           Obj.style.backgroundRepeat=Images[self.NowIndex].Repeat;}           
  53.           if(options.Src==true){           
  54.           if(Images[self.NowIndex].Image!=null) Obj.src=Images[self.NowIndex].Image;  
  55.           if(Images[self.NowIndex].Width!=null&&BlueEffects.IsNum(Images[self.NowIndex].Width)==true) Obj.style.width=Images[self.NowIndex].Width+"px";    
  56.           if(Images[self.NowIndex].Height!=null&&BlueEffects.IsNum(Images[self.NowIndex].Height)==true) Obj.style.height=Images[self.NowIndex].Height+"px";   }          
  57.           if(options.BackGround!=true&&options.Src!=true){  
  58.           if(Images[self.NowIndex].Image!=null) Obj.style.backgroundImage="url("+Images[self.NowIndex].Image+")";   
  59.           if(Images[self.NowIndex].Position!=null) Obj.style.backgroundPosition=Images[self.NowIndex].Position;  
  60.           if(Images[self.NowIndex].PositionX!=null) Obj.style.backgroundPositionX=Images[self.NowIndex].PositionX;  
  61.           if(Images[self.NowIndex].PositionY!=null) Obj.style.backgroundPositionY=Images[self.NowIndex].PositionY;  
  62.           if(Images[self.NowIndex].Repeat!=null&&(Images[self.NowIndex].Repeat=="repeat"||Images[self.NowIndex].Repeat=="no-repeat"||Images[self.NowIndex].Repeat=="repeat-x"||Images[self.NowIndex].Repeat=="repeat-y"))  
  63.           Obj.style.backgroundRepeat=Images[self.NowIndex].Repeat; }  
  64.           }  
  65.           }  
  66.           catch(err)  
  67.           {self.errState=true;}   
  68.                    
  69.           self.MyTimeOut=setTimeout(self.ChangeImage,TimeSpace);  
  70.             
  71.           if(self.ASC==false)  
  72.           {             
  73.               self.NowIndex--;  
  74.               if(self.NowIndex<=-1||self.errState==true) {  
  75.               clearTimeout(self.MyTimeOut);  
  76.               if(options.Stop!=null)try{options.Stop();}catch(err){}  
  77.               }              
  78.           }  
  79.           else if(self.ASC==true)  
  80.           {  
  81.            self.NowIndex++;   
  82.            if(self.NowIndex>=Images.length+1||self.errState==true){  
  83.            clearTimeout(self.MyTimeOut);  
  84.            if(options.Stop!=null)try{options.Stop();}catch(err){}  
  85.            }  
  86.           }  
  87.        }//end this.ChangeImage  
  88.  } //end ImageShow  

控制代码:

JavaScript代码
  1.  var Show1=null;        
  2.   
  3. function MouseOver(Num)  
  4. {         
  5. var Obj=null;  
  6. if(Num==1)  
  7.  Obj=Show1;        
  8.         
  9. Obj.DeleteTimeOut();  
  10. Obj.ASC=true;  
  11. Obj.ChangeImage();          
  12. }  
  13.   
  14. function MouseOut(Num)  
  15. {  
  16. var Obj=null;  
  17. if(Num==1)  
  18.  Obj=Show1;   
  19.        
  20. Obj.DeleteTimeOut();  
  21. Obj.ASC=false;  
  22. Obj.ChangeImage();  
  23. // alert(Show.NowIndex);  
  24. }  
  25.   
  26. function Loaded()  
  27. {  
  28. Show1=new ImageShow({Obj:document.getElementById("ImgArea1"),TimeSpace:50,Images:Images1,BackGround:true});         
  29. MouseOver(1);  
  30. }  

更多的代码我就不贴了,可以到上面的网址去看,我也只是把这些实现的代码理出来了。

Tags: js, flash, effect, gif