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

wwwsqldesigner:a Visual web-based SQL modelling tool

看到这个的时候很吃惊,最初看到类似功能的时候是在PHPMYADMIN 3上面,想不到现在已经发展到这个地步了,实在让人大吃一“斤”呀。

WWW SQL Designer allows users to create database designs, which can be saved/loaded and exported to SQL scripts. Various databases and languages are supported. Ability to import existing database design.

About

Hi and welcome to WWW SQL Designer! This tool allows you to draw and create database schemas (E-R diagrams) directly in browser, without the need for any external programs (flash). You only need JavaScript enabled. The Designer works perfectly in Mozillas (Firefox, Seamonkey), Internet Explorers (6, 7, 8), Safari and Operas. Konqueror works, but the experience is limited.

Many database features are supported, such as keys, foreign key constraints, comments and indexes. You can either save your design (for further loading & modifications), print it or export as SQL script. It is possible to retrieve (import) schema from existing database.

WWW SQL Designer was created by Ondrej Zara and is built atop the oz.js JavaScript module. It is distributed under GNU GPL license.

网址:http://code.google.com/p/wwwsqldesigner/

我是从:http://parandroid.com/www-sql-designer-open-source-sql-based-web-creation-tools/看来的

它支持很多的数据库功能:

  • 强制外关键字
  • 注解
  • 索引

当数据库图表创建后,你可以:

  • 保存你的数据表设计或稍后修改它们
  • 打印它
  • 作为 SQL脚本导出

它甚至还可以从已存在的数据库中检索出概况图标,支持MySQL, MSSQL, SQLite 和 Web2py。感兴趣的朋友看查看DEMO.

 

 

图片附件:
大小: 18.81 K
尺寸: 430 x 188
浏览: 2319 次
点击打开新窗口浏览全图

Tags: designer, sql, web

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

继续COMET之旅

1日的时候我把IBM开发者网站上关于COMET的文章进行了转摘,然后就又在博客园上又发现了这篇文章 ,看样子好象还没有连载结束,因此我只作一个链接转向。

http://www.cnblogs.com/lzlynn/archive/2009/01/17/1377383.html

看他的文章内容,也是参考了一下IBM的文章哦。他还说要写框架,观望一下。

COMET彗星(一)SERVER PUSH介绍

COMET彗星(二)基于SERVER PUSH的消息传输

COMET彗星(三)构建自己的COMET核心

 

肯定还有第四篇第五篇哦。。。

Tags: http, comet, 框架

ZZ javaeye上的一篇翻译的访谈录:PHP创始人Rasmus Lerdorf 访谈

这是javaeye上的一篇访谈翻译(摘自程序员杂志),里面有一段关于PHP的安全性的话有点意思,用该页面下面的评论来说,搞的就象几个中国哥们在聊天一样。

我是觉得他们就象在一个group里的聊天记录。啥时候我也把QQ群或者MSN群里的聊天记录整理一下,也来个啥啥啥访谈。。。

原文地址:http://www.javaeye.com/news/4143-masters-listening-to-talk-4-php-founder-rasmus-lerdorf-interview-2

原文如下:

《程序员》杂志上连载的《PHP创始人访谈录》 的第二部分。


Chris DiBona : PHP 这个名字代表什么?

Rasmus Lerdorf : PHP是 , 恩 。 Hypertext Preprocessor , 这名字很蠢, 就是 PHP。  Zee v 与 Andi 是97年中加入进来的, 他们当时使用 php/fi, 在用到深度嵌套中碰到了一些问题, 他们都是计算机专业的, 知道如何写解析器 , 不像我是通过 hack 状态机这种方式来实现的 , 我想他们看到我程序的时候,一定对它竟然能工作感到惊奇吧 。

Chris DiBona : 呵呵,竟然可以工作

Rasmus Lerdorf : 他们是自愿做这些工作的, 当时我有点太累了,感觉自己像是在给半个因特网写程序, 人们不是给我发补丁来修补程序,而是。。。

Leo Laporte: 这是我的程序, 把 bug 给改了吧。

Rasmus Lerdorf : 是的 , 改了这个 Bug,  给我写个程序做这个。 我跟他们说做实现这个很容易,只要这么做, 他们说:“ 好吧,这是最麻烦的, 那剩下那些bug呢”

Chris DiBona :赶紧把 bug 修复了吧

Rasmus Lerdorf : 我当时的确很郁闷, 简直要把我掏空了。 当时感觉要么我就快要死了,否则我得把它移交到一个更大的 team 来做 。

Leo Laporte: 等等, 在我们继续谈论前,我觉得这是一个很有趣的话题, 这在开源社区并非罕见的情况吧。这种事情常常发生, 人们在说:“我管理不了这个社区了,我不干了,我简直要疯掉了”, chris 你肯定经历过很多这种情形, 这对于开源社区是不是个问题啊。

Chris DiBona : 是的,实际上我跟Rasmus探讨过这个问题, 每隔五个月,就有人公开在社区挑起这种事端, “天哪,开源项目完蛋了, 有人离开社区了”。 你知道的, 其实有人进入,有人离开这是很正常的。

Leo Laporte:事实上这事最近发生在 Zend Framework 社区了

Chris DiBona :是啊,让我们来谈谈吧,Rasmus

Rasmus Lerdorf : Zend Framework 是一个分离的项目,实话说,我也不是很清楚 ,你得问问他们,我也不清楚原因。

Chris DiBona : 从某一方面来说,实际上对大多数社区而言,某些人悄悄地离开了这也没有什么,尽管我不愿意这么说。

Leo Laporte: 对于用户而言,我们有时候的确不太满意所用的产品。

Rasmus Lerdorf :直到 php 3 ,实际上只有我一个人在做,当某人给我发了个 php 的补丁,我一定会重新写一遍,因为这是我的产品

Leo Laporte: 看来你不擅长移交工作。

Rasmus Lerdorf :我也不清楚开源的理论,当时也没什么开源的东西,我自己也是后来才想清楚了这些。没过多久,我在多伦多大学找了份工作, 建立一个对话访问系统。我想那大概是 97 年吧,哦,是 96年,偶尔我还能收到一些关于 php 的补丁,有些 bug 是我从来没碰到过的, 我碰到些困难, 有个在日本的程序员给我发了一些补丁,非常酷, 还有有一些在日本的朋友帮我做了咨询方面的工作,但是这并不是经常性的。 一年之后我想通了 , 我的确需要鼓励这种贡献,人们提交了 patch, 我不能接管然后自己再重写, 我应该接收它, 放弃控制。给他人以权力随心所欲的做自己想做的事情。对于大多数开源的开发者来说,这很难,即便在现在,开源项目是他们孩子, 他们应该控制它,但是对于长期发展来说, 你应该放手, 让其他贡献者做他们要做的事情 , 你不能做太多限制。

Leo Laporte: 看来,我们作为用户应该更激进一些,呵呵

Rasmus Lerdorf : 这没关系, 你应该意识到这点,这些人大部分也都是在家里做开源开发的,百分之九十的开源开发者不管他们是做什么。他们把孩子哄上床,为开源项目贡献出两个小时,然后 他们打开自己的邮件,发现一大堆愤怒的信息,全都是"这里有 Bug, 另外这里还有 Bug, 这个 bug 使得我们上百万的电子商务操作无法进行" , 但他们只能说:“好吧,我已经在晚上贡献了2个小时, 这确实不是我应该太过在乎的事情(你的上百万电子商务程序)"。 所以说,人们对这些开源项目的开发者应该给予一些尊重。

Leo Laporte: 开源是如此繁荣,我想说你们这些人才是开源社区的源动力,我们所能做的就是给予你们以应得的尊重。

Chris DiBona : 恩, 我发现 Rasmus 的车子有点脏了,呵呵

Leo Laporte: 呵呵,我愿意为他擦洗车子,我欠他的太多了,我在服务器上运行了那么的 php 程序 ,从日志跟踪程序到 drupal .

Rasmus Lerdorf : 你不欠我什么,不欠我任何东西,我们 php 项目现在有 1100个开发人员。

Chris DiBona : 看来你现在已经把移交工作做的很好了

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

Leo Laporte:  1100 个开发者可不是个小数目啊。

Rasmus Lerdorf :是的, 如果你修复了 PHP 项目的一个bug, 发来一个不错的补丁, 那么PHP 社区就非常欢迎你的到来。

Leo Laporte:  我知道Perl 社区老早就说起开发 Perl 6 了, 不知道 PHP 6 的号角是否已经吹响.

Rasmus Lerdorf :我们不太善于做市场方面的工作, 但是 PHP 6 工作的确正在进行了.

Leo Laporte:  跟我们讲点这方面的事情吧

Rasmus Lerdorf :PHP 6 最大的一部分改进在于对 Unicode 的支持. PHP 6 任何一部分代码都是基于 utf16 编码的.

Leo Laporte:  这大概是 PHP 6 大部分被重写的地方之一吧.

Rasmus Lerdorf :是的, Unicode 很艰深, 我跟 200 多名懂得 unicode 的开发者开过一个会, 其中包括一些日本的开发人员,他们工作于 IBM 公司, 知道很多 ICU 项目的东西. ICU 是 IBM 的 Unicode 项目, 当时 ICU 项目并不是很好, 它太大了. 它的代码比 PHP 的源码还大, 差不多有10倍了吧.

Leo Laporte:  等等, 你说什么, ICU 项目的代码量是 PHP 的10倍

Rasmus Lerdorf :它太庞大了, 太让人吃惊了, 而且它不是模块化的, 这意味着你无法从中取出你所需要的部分. 但是现在 ICU 也发展了, 我们可以取出我们需要的部分, 所以如今在 PHP 项目中加入 ICU 支持是可行的, 这使得 PHP 可以在任何地方完全支持 Unicode , 这是 Php 6 最大的改动, 此外的改进还有“命名空间”等其它特点.

Chris DiBona :那其它的库是否也要因此重写以支持 unicode 呢?

Rasmus Lerdorf :你说的是库和扩展吧, 有一些函数是要重写的, 基本上涉及到传递字符串或者操作字符串的函数都需要重新审核一下, 是的,这是很大的工作量. 大概在年底会有一个alpha 的测试版发行, 这个版本只是说: 大家看看,测试一下, 看看你现有的代码中有多少因为采用这个版本而无法运行, 估计大多数 Php 5 的代码都不会有什么问题, 我们并不担心, 或许你马上就可以利用它实现一些 unicode 的有趣功能. 如果你正确使用它, 熟悉这个版本的过程中就不会有太多的麻烦, 不过也有可能出现一些我们没考虑到的问题, 所以我们希望尽早发布测试, 而不是像某些语言一下等上5年.

Leo Laporte:  我在自己的服务器上运行的是 php4, 顺便说一句, 非常感谢你们的工作, 开发了这么好的产品. 像很多人一样, 我使用的是 Php 4

Rasmus Lerdorf :恩, 它的确工作的很好, 如果你没什么必要的话, 也可以不升级...

Chris DiBona :火是很可怕的( 注解: 5(five) 和 fire 英文发音相同)

Leo Laporte:  哈哈, 是的, 我并不怕火, 呵呵, 我只是不想换版本, 因为它现在工作良好, 是吧?

Rasmus Lerdorf :是不应该害怕升级的, 直到我们认为完全可以抛弃这个版本之前, 我们将继续提供 php 4 的安全补丁. 对于大多数产品来说, 在 php 4 上良好运行的程序都应该在 php5 上运行. 最困难的是那些大型的 ISP, 它们有成百的用户, 上千个运行的 PHP 程序, 其中若是有几个程序无法运行, 这对他们来说,的确很可怕, 如果没人抱怨升级的问题, 的确没这个必要冒险去升级版本. 但是 PHP 5 的确有一些很吸引人的功能, 比如简单 XML 处理支持, Soap 扩展, 相当快的 Soap 处理, 如果你程序中要处理 Web 服务, 需要解析大量 XML  那么用 PHP 4 来处理就相当痛苦了, 这是我们分支出 PHP 5 版本的主要关注点.

Leo Laporte:  好吧, 为了支持 PHP 5 我要去重新编译我的 Apache 了, 你们两个继续谈.

Chris DiBona :好啊, 待会见.

Leo Laporte:  Twit.tv 服务器宕机了, 我一会再来.

Chris DiBona :你可以给 Rasmus 写邮件.

Leo Laporte:  你能给我写代码吗?  Rasmus

Chris DiBona :奇怪, Drupal 好像运行 Php 5 没什么问题?

Leo Laporte:  我也不知道为什么我要运行 php4, 好像Drupal 最新版本 5.1.4 重新编译支持 php5 , 如果没有什么特别的原因, 是否应该将程序运行从 PHP 4 转到 PHP 5 呢?

Rasmus Lerdorf :恩 ...

Chris DiBona :会运行更快一些吗?

Rasmus Lerdorf :也许不会那么快吧, 有一些程序会运行的很快, 有一些程序的运行速度和原来差不多, 这取决于你的代码做什么, 如果你的代码恰巧使用了我们做大量工作优化的部分, 那么速度就会很快, 否则就和原来速度差不多.

Leo Laporte:  让我们来谈谈人们常常说的 PHP 的一些问题吧, 有一些人经常抱怨 PHP 的性能问题, 我从来没碰到这些困扰, PHP 的扩展性很好.

Rasmus Lerdorf :你混淆了两个概念, 性能和扩展性没有什么联系。

Leo Laporte:  是吗? 让我们来谈谈这个.

Rasmus Lerdorf :是的, 性能是单一服务器对单一请求的服务有多快; 而扩展性是指你能扩展的宽度, 比如, 如果你有10万个并发访问, 你如何能将它控制在一定的响应时间之下.

Leo Laporte:  我想两者都很重要,但是扩展性更重要一些

Rasmus Lerdorf :是的, 但是从某方面说, 性能也很重要, 你可以更换一个更快的CPU, 但是无法并排放大量的服务器, 如果单一请求的响应延迟是半秒钟, 那么并排放500个服务器, 除非你有大量的访问请求, 否则每个请求的响应时间还是半秒钟. 性能问题跟响应延迟有关, 你可以在单一服务器上服务于更多的请求, 扩展性则更多与架构有关, 你要确定你所做的不要和某个服务器紧密绑定, 我们在 PHP 中做的很多事情都有这么一个概念叫做"share nothing"的架构(不共享任何东西), 就像一个 "PHP 黑箱", 你接受一个php 请求, 然后处理该请求, 任何关于这个请求的东西都在这个请求结束后消失, 没有什么东西可以跨越请求存在的, 你要建立一个这样的系统, 每个请求都是相互独立存在的, 因为每个请求可能来自不同的服务器, 你可能在一个负载均衡程序的后面放了 500 个服务器, 那么程序也能将照常运行. PHP 的 Session 机制默认是保存在本地的 tmp 目录中的, 但是我们提供了一个很简单的机制将 session 保存在数据库中, 所以我们在 php 中做的任何事情都保证它是可扩展的, 这也是为什么yahoo 和 flick 的程序员采用 php 的原因. 因为扩展性是内建在 php 之中的. 有人说 php 是不可扩展的, 是因为他们不了解如何去实现扩展性. 就我而言, 我们没有碰到任何扩展性的问题, 所以你可能看不到我们关于扩展性方面讨论的文章. 但你不能说, PHP 不可扩展仅仅因为我们没有讨论它的可扩展性问题

Leo Laporte:  哈哈

Rasmus Lerdorf :有时候这真让人头疼. 恩, 关于性能的问题, 你能做的事情不多, PHP 像大多数脚本语言一样, 分为两步访问. 首先是将磁盘上的文本编译为 op-code  , 然后将  op-code  传递给执行程序, 这有点像 Java 的字节码. 我们可以把  op-code  放到缓存中, 比如我们已经用了多年的 APC , 还有其它一些产品. 它们将编译好的  op-code  放到共享内存中, 如果第二次请求 php 脚本的时候, 我们将看到, 嗨, 检查一下共享内存,  这是 inode , 我们的共享内存中是否有这个缓存过这个 inode 块, 如果有的话, 我们可以直接执行共享内存的  op-code , 这将会使得代码提速达30至40 倍之多.

Leo Laporte:  这有点类似 python 的 pyc 字节码, 只是你没有在磁盘上保存编译的版本

Rasmus Lerdorf :是的, 因为性能最慢的地方就是读取磁盘.

Leo Laporte:  这并不能节省多少时间, 是吧?

Rasmus Lerdorf :是节省不了多少,   op-code 本身就是很小的文件, 500 字节和1000 字节在文件系统中可能都是占用一个块, 你从大小上节省不了什么. 相反你应该避免这种磁盘操作, 任何这类操作都是挺耗费时间的. 不经过任何拷贝操作, 直接从共享内存中执行代码是最快的. 如果我们修改了磁盘上的代码, 我们需要告诉 APC , 可能需要重新启动 web 服务器.

Leo Laporte:  这么说系统需要足够的内存以运行程序了

Rasmus Lerdorf :所有高性能的网站都会用到缓存的

Leo Laporte:  这么说我们将为运行 PHP 投入更多的内存了.

Chris DiBona :那么 Zend 提供了些什么, 更好的解析器? 他们确实在销售一些性能优化的产品.

Leo Laporte:  他们也有一些缓存的产品吧

Rasmus Lerdorf :一样的, 他们本身也没有  op-code   缓存, 他们也提供这方面的缓存产品, 你可以选择.

Leo Laporte:  你有自己喜欢的缓存产品吗?

Rasmus Lerdorf :我比较喜欢的是 APC , 不是我创建的它, 别人创建的, 我只是帮着他们让其良好运行. 我需要一个缓存得以开始这方面的工作.

Leo Laporte:  习惯上, 如果你运行一个访问量比较大的网站, 通常都会要用到一个缓存系统.

Rasmus Lerdorf :是的,你应该有一个, 你可以从 Zend 公司购买, 或者试一试开源的缓存系统.

Chris DiBona :APC  是什么意思?

Rasmus Lerdorf :Alternative PHP Cache,  PHP 是开源语言, 所以我们需要一个开源的缓存系统, APC 运行的很好.

Leo Laporte:  不错, 我要在我的服务器上实验一下. 谈谈 PHP 的安全性吧, 你对安全性考虑的有多少?

Rasmus Lerdorf :这么多年有很多讨论 PHP 安全性的问题, 我觉得有一些是正常的, 大多数批评对 PHP 是很不公平.

Leo Laporte:  有很多不好的实现

Rasmus Lerdorf :的确有很多很烂的代码, 我们无法把他们都修复了, 有一些错误的确是我们的问题, 我们的程序确实有 bug , 我们会尽量正确地修复它. 但是还有很多是我们无论如何都无法解决的. PHP 比别的语言跟容易出现这种问题, 因为它比其它语言更容易学习, 也就是说越是缺少编程经验的人越容易采用 PHP , 有一些代码的确写的不那么安全, 结构也不好. 而且 PHP 项目的命名也是个问题, 人们总喜欢用 PHP 来命名自己的项目.

Leo Laporte:  是啊, 宝贝, 这可是用PHP写的. 不用其它名字来命名项目了.

Rasmus Lerdorf :呵呵, 我也不知道为什么我们会有这个问题,  别人就不会起 Python Mailman  这样的名字. 其它语言开发的项目不会起名为 Perl XXX, Python XXX, Ruby XXX , 当然 Ruby on rails 是个例外. 你看, 这么多项目都以 PHP 命名, 他们似乎都想打上 PHP 的标签.

Leo Laporte:  Php Myadmin 也是其中之一, 有很多这种方式命名的项目

Rasmus Lerdorf :任何一个关于这些项目的 bug 都会归到 PHP 头上, 如果 Mailman 出现了安全性的问题, 你的第一反应不是 Python 出了什么安全性问题, 至少通过名字关联不会这么想, 你最多只是说:"Mailman 这程序太蠢了", 如果 PHP 的项目出了问题, 他们就会说:"PHP 又出问题了, 这个语言的确不安全, 看看这些问题吧"

Leo Laporte: 你有什么类似 perl 的一些措施限制程序员去做正确的编程吗?

Rasmus Lerdorf : 我们有很多级别的错误报告机制, 你可以打开开关,如果你访问一些未赋值的变量, 就会出现警告等等。

Leo Laporte: 你在 yahoo 工作

Rasmus Lerdorf :  是的

Leo Laporte: 它们用了很多 php 代码,  你可以说说他们都是在什么地方采用 php 开发的。

Rasmus Lerdorf :  几乎所有 yahoo 网站都采用了吧

Leo Laporte: 是吗? 这倒是可以作为 php 扩展性的一个好的典范, 任何人说 php 扩展性不好的,都可以去看看 yahoo . yahoo 的邮件系统也是用 php 写的吧

Rasmus Lerdorf : 老版本的邮件系统不是基于 php 的。

Leo Laporte: apple 的网站是基于 php 的吗?

Rasmus Lerdorf : 说实在的,我也不知道。

Leo Laporte:它们大部分都是基于 javascript

Rasmus Lerdorf :  apple 的网站很多都是基于客户端的技术,我不知道它们有什么地方用到了服务端的技术, 客户端也不是我所关注的技术。

Leo Laporte:我非常喜欢 Yahoo 的邮件系统, 它可是 ajax 技术运用的一个良好示范啊。太感谢你了,Rasmus,给我们提供了这么好的语言, 可以做许多强大的事情。

Chris DiBona :非常方便

Leo Laporte: 1100 名开发人员, php 社区可真是强大啊, 真让人惊奇。

Chris DiBona : Pretty Handy Processor (Chris 开玩笑解释 PHP 命名)

Leo Laporte: 哈哈,你又来了, 不过这个解释我喜欢

Rasmus Lerdorf : 大概是人们讨厌 Perl 吧。

Leo Laporte: 哈哈, 这个理由我接受。

Rasmus Lerdorf : 对不起,对不起,Larry ( Larry 是 Perl 语言的创始人)

Leo Laporte: 我们确实想采访一下 Larry 。

 

Tags: php, 访谈, 摘要, 程序员

基于HTTP长连接的推技术:COMET

之所以再写一次,是因为看到了IBM上的一篇文章,时间也比较早,我在以前也写过一篇简单的文章来进行介绍,不过这篇IBM的写的比较全,而且我以前的写的也仅仅是评论,并没有就COMET的技术进行详细的介绍。

IBM上是这样说的,这只是简单的摘录一段,详细的还是到该页面去看吧,因为IBM的页面说明了有版权限制,而如果要申请复制文章的话,又比较复杂和繁琐,因此,只能这样了:

http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
  1. 传统模式的 Web 系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,譬如:  
  2.   
  3.     * 监控系统:后台硬件热插拔、LED、温度、电压发生变化;  
  4.     * 即时通信系统:其它用户登录、发送信息;  
  5.     * 即时报价系统:后台数据库内容发生变化;  
  6.   
  7. 这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。“服务器推”技术在现实应用中有一些解决方案,本文将这些解决方案分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用 RMI、CORBA 进行远程调用;而另一类则无须浏览器安装任何插件、基于 HTTP 长连接。  
  8.   
  9. 将“服务器推”应用在 Web 程序中,首先考虑的是如何在功能有限的浏览器端接收、处理信息:  
  10.   
  11.    1. 客户端如何接收、处理信息,是否需要使用套接口或是使用远程调用。客户端呈现给用户的是 HTML 页面还是 Java applet 或 Flash 窗口。如果使用套接口和远程调用,怎么和 JavaScript 结合修改 HTML 的显示。  
  12.    2. 客户与服务器端通信的信息格式,采取怎样的出错处理机制。  
  13.    3. 客户端是否需要支持不同类型的浏览器如 IE、Firefox,是否需要同时支持 Windows 和 Linux 平台。  

Tags: comet, html, push