2005年6月22日星期三

从7LOG迁移到Movable Type

  最近以来我在修改7LOG的程序上遇到很多麻烦,其代码改起来不是很好修改,而作者本人似乎也消声觅迹,不见踪影了,连其主页都被干掉了,看着需要添加的功能越来越麻烦,真的想去换到另外一个博客程序Movable Type了。

  为什么要迁移到Movable Type,原因很多。其一,MT是全世界使用最多的BLOG,资源很丰富。其二,MT发布的是静态文件,占用系统资源少,服务器的负荷也小。其三,虽然WORD PRESS也有Permalink仿真静态文件,但并没有降低系统负荷,而且在IIS环境下无法使用REWRITE功能,也并不是所有主机都开放REWRITE功能的。

  从7LOG可以平滑地迁移到Movable Type 3.17版本,并可以保证URL的延续性。当然Movable Type的默认配置下是不能完成的,首先修改LIB/MT/UTIL.PM文件的684行,将"%06d"去掉,修改745行的"cat"可以变更目录名称。使用“Use Old-Style Archive Links”,然后再发布一次看看,是不是产生的文件名称和地址与7LOG的一模一样。感叹:Movable Type的代码写的实在太健壮了,可维护性实在太好了。

  下面是从7LOG转换到Movable Type的SQL语句:

-- 导入文章

INSERT INTO mt_entry(entry_id, ntry_blog_id, entry_status, entry_author_id, entry_allow_comments, entry_allow_pings, entry_convert_breaks, entry_category_id, entry_title, entry_excerpt, entry_text, entry_text_more, entry_to_ping_urls, entry_pinged_urls, entry_keywords, entry_tangent_cache, entry_created_on, entry_modified_on, entry_created_by, entry_modified_by, entry_basename) select id, '1', '2', '1', '1', '0', '__default__', sort,title,'',resume,content,NULL, NULL, NULL,NULL, date,'20050622034340',NULL, NULL,id from blog_topic order by id

-- 导入目录索引

INSERT INTO mt_placement(placement_entry_id, placement_blog_id, placement_category_id, placement_is_primary) select id, '1', sort, '1' from blog_topic order by id

-- 导入评论

INSERT INTO mt_comment(comment_id, comment_blog_id, comment_entry_id, comment_ip, comment_author, comment_email, comment_url, comment_commenter_id, comment_visible, comment_text, comment_created_on, comment_modified_on, comment_created_by, comment_modified_by) select id, '1', topic_id, ip, author, email, '', '', '1', content, date, '20050622061716', NULL, NULL from blog_comment order by id

  最后发布的字体在中文环境下并不是很好看,可以修改styles-site.css文件,将font-size: x-small修改为font-size: 12px。
 

2005年6月18日星期六

彻底杜绝PHP的session cookie错误

  本文讨论的是如何彻底杜绝warning: Cannot add header information - headers already sent in......  这种令人莫明其妙的的错误。

只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它...............

看了PHP手册,回答如下:

消息“Warning: Cannot send session cookie - headers already sent。。。”或者“Cannot add header information - headers already sent。。。”。

函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。请参阅“输出控制函数”。

意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这答案并不令人满意。因为往往程序在其他PHP环境下运行却正常。
 

首先:这错误是怎么产生的呢?让我们来看看PHP是如何处理HTTP header输出和主体输出的。

PHP脚本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。而后继续发送主体数据。从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。

好!那我们来解决它:

笨方法:把错误警告全不显示!
掩耳盗铃之计,具体方法就不说了 ^_^#

解决方案:

1)适用于有权限编辑PHP。INI的人

打开php。ini文件(你应试比我清楚你的php。ini在哪里),找到

output_buffering =改为on或者任何数字。如果是IIS6,请一定改为ON,不然你的PHP效率会奇慢。

2)使用虚拟主机,不能编辑PHP。INI,怎么办?

简单:

在你的空间根目录下建立一个。htaccess文件,内容如下:

AllowOverride All
PHP_FLAG output_buffering On

不幸的情况是:还是不行?全部网页都不能显示啦?

那么,你可以打电话骂一通空间商,然后让他给你把apache的。htaccess AllowOverride打开

3)在PHP文件里解决

ob_start()
启用output buffering机制。 Output buffering支持多层次 -- 例如,可以多次调用 ob_start() 函数。

ob_end_flush()
发送output buffer(输出缓冲)并禁用output buffering机制。

ob_end_clean()
清除output buffer但不发送,并禁用output buffering。

ob_get_contents()
将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。

原理:

output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4。0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为header实际上并没有发送。当全部脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。

2005年6月15日星期三

美女图片在网站上的应用

  网络是制造美女的沃土,美女又是拉动消费的动力,所以网络、美女和经济三者之间的关系相当微妙。一个销售产品的网站,在网站首页放一个美女靓妹,在国外几乎已经成为一种时尚和潮流,大家可以看看全球域名第一大销售商GoDaddy的首页,常年都有一张巨幅的美女图片。在这种绝妙的美女炒作之下,人们往往把眼球集中在美女的形象包装上,并因此而带动产品的销售业绩。

  因此,国内的产品销售网站也可以借鉴国外这一经验,在销售产品的首页放置一个美女图片,靠美女的人气带动公司产品的销售,毕竟看美女的人远比买产品的人要多,看的人多了,自然会有更多人来购买产品。

  说白了,“美女经济”就是“眼球经济”,就是商人们先以美女吸引公众注意力,继而从中获利的手段。这种经济,看上去很美,但不可过于依赖,“美女”只是一种中介,将消费者的注意力转移到产品上的经济活动。更为重要的是产品的质量和价格,一个物美价廉的产品才是真正赢得消费者喜爱的产品。

读书的女人最美丽

2005年6月13日星期一

使用Web标准建站校验及常见错误

  我们使用XHTML+CSS来重新设计我们的网站,如何知道自己制作的页面真的符合web标准?W3C和一些志愿者网站提供了在线校验程序,来帮助我们检查页面是否符合标准,并提供了修正错误的帮助信息。这些校验非常有用,是我调试页面第一步要做的事情。

  1.XHTML校验

  校验网址:http://validator.w3.org/

  校验方式:网址校验、文件上传校验

  校验成功,会显示"This Page Is Valid XHTML 1.0 Transitional!"。

  校验失败,会显示更多校验选项和错误信息。

  一般选择"Show Source"和"Verbose Output"可以帮助你找到错误代码所在行和错误原因。

  XHTML校验常见错误原因对照表

  No DOCTYPE Found! Falling Back to HTML 4.01 Transitional--未定义DOCTYPE。

  No Character Encoding Found! Falling back to UTF-8.--未定义语言编码。

  end tag for "img" omitted, but OMITTAG NO was specified--图片标签没有加"/"关闭。

  an attribute value specification must be an attribute value literal unless SHORTTAG YES is specified--属性值必须加引号。

  element "DIV" undefined---DIV标签不能用大写,要改成小写div。

  required attribute "alt" not specified---图片需要加alt属性。

  required attribute "type" not specified---JS或者CSS调用的标签漏了type属性。

  其中最最常见的错误就是标签的大小写问题了。通常这些错误都是关联的,比如忘记了一个</li>其他<li>标签都会报错,所以不要看到一堆的错误害怕,通常解决了一个错误,其他的错误也都没有了。

  2.CSS2校验

  校验网址:http://jigsaw.w3.org/css-validator/

  校验方式:网址校验、文件上传校验、直接贴入代码校验

  校验成功,会显示"恭喜恭喜,此文档已经通过样式表校验! "。

  校验失败,会显示两类错误:错误和警告。错误表示一定要修正,否则无法通过校验;警告表示有代码不被W3C推荐,建议修改。

  CSS2校验常见错误原因对照表

  (错误)无效数字 : color909090 不是一个 color 值 : 909090 ---十六进制颜色值必须加"#"号,即#909090

  (错误)无效数字 : margin-topUnknown dimension : 6pixels ---pixels不是一个单位值,正确写法6px

  (错误)属性 scrollbar-face-color 不存在 : #eeeeee --- 定义滚动条颜色是非标准的属性

  (错误)值 cursorhand不存在 : hand是非标准属性值,修改为cursor:pointer

  (警告)Line : 0 font-family: 建议你指定一个种类族科作为最后的选择 --W3C建议字体定义的时候,最后以一个类别的字体结束,例如"sans-serif",以保证在不同操作系统下,网页字体都能被显示。

  (警告)Line : 0 can't find the warning message for otherprofile --表示在代码中有非标准属性或值,校验程序无法判断和提供相应的警告信息。

2005年6月12日星期日

中国软件人,我为你哭泣

  中国软件业在它发展了20几年后,竟然还是只得到一句“依然稚嫩”的评语。这些人说,政府制定了一系列扶持政策并未改变软件产业积贫积弱的现状,也没有催生出具有国际竞争力的大型软件企业。他们为这样的状况感到悲哀。

  如果一个活了20多岁,胡子拉碴的青年人,还被人家说幼稚,不知道该不该尴尬。在这些人空对空地评价软件发展时,我在暗自为中国软件从业人员哭泣。

  软件业得到政府的扶持,就一定可以发展吗?发展取决于市场、人才、环境、政策等综合因素。扶持,是经济上还是偏向性上?如果是经济上,那和以前对待贫困山区和西部的做法雷同,钱解决不了根本问题。如果是偏向,采购上的简单认同,反而是扼杀。如果采购者不是很认真地对待所采购的软件,只是因为“国产软件”而支持;如果软件企业没有把注意力集中到认真尽力地去提供高质量的软件和服务上,软件业能发展吗?买卖双方大家马马虎虎把合同一验收就完了。这样产品质量怎么会改变?

  有位软件人的比喻相当深刻:软件企业好比一个餐馆,来的食客如果都是凑凑合合的,那这个餐馆师傅的水平绝对提不高如果一两个挑剔的食客也被餐馆老板采用诸如免费、说好话等方式糊弄过去,而不是虚心采纳合理建议,怎么可能改进厨艺?

  然而,改进本身也不容易。改变靠的是人,因为软件产品的好坏大部分是由开发者决定的。可怜我们那些真正有积极性和创造力的软件人,并没有得到重视,高强度加班,流动频繁,没有良好充足的培训......软件人身心疲惫,对企业缺乏归属感。试想,一个在一年内要两次以上集体换血的软件企业,竞争力能强吗?扪心自问,国内有几个企业的软件人,能像在IBM工作的人一样,一待25年?无法留住人才的企业,凭什么来保证软件人的创造激情?

  知识产权的保护也是让软件人痛心的地方,盗版依然猖獗,技术依然不是秘密。金山软件坚持通用软件多年始终做不大,为什么,去问问路边的盗版摊主,他最清楚。虽然说软件发行量到达一定程度,研发成本就会接近零,然而我们的软件人,辛苦所做的东西,比得过几块钱一张光盘的发行速度吗?可怜啊!

  软件业不需要输血,需要的是对人才的重视;软件业不需要同情,需要的是公平竞争;软件业更不需要盲从其他国家的模式,毕竟我们得适合中国国情。倘若不能从根本上改变这一切,中国软件人,我只能为你哭泣。 (原始出处: IT时代周刊 )

2005年6月11日星期六

Windows2000蓝屏死机故障处理

  从理论上讲,纯32位的Windows 2000是不会出现死机的,但是这仅仅是理论上。病毒或硬件和硬件驱动程序不匹配等原因将造成Windows 2000的崩溃,当Windows 2000出现死机时,显示器屏幕将变为蓝色,然后出现STOP故障提示信息。下面我们分别介绍通用的STOP故障处理方法和特殊的STOP故障排除。

通用STOP故障处理
  1.首先使用新版杀毒软件检查计算机上是否有病毒。
  2.如果Windows 2000可以启动,请检查“事件查看器”中的信息,以确定导致故障的设备或驱动程序。启动“事件查看器”的方法是:“开始”“设置”“控制面板”“管理工具”“事件查看器”“系统日志”。
  3.如果不能启动计算机,试着用“安全模式”或“最后一次正确的配置”启动计算机,然后删除或禁用新安装的附加程序或驱动程序。如果用“安全模式”启动不了计算机,可使用修复控制台。修复控制台可以禁用一些服务、重新命名设备驱动程序、检修引导扇区或主引导记录。
  4.拆下新安装的硬件设备(RAM、适配卡、硬盘、调制解调器等等)。
  5.确保已经更新了硬件设备的驱动程序,以及系统有最新的BIOS。
  6.运行由计算机制造商提供的系统诊断工具,尤其是内存检查。
  7.检查Microsoft兼容硬件列表(HCL),确保所有的硬件和驱动程序都与Windows 2000兼容。Hcl.txt在Windows 2000 CD-ROM的Support文件夹中。
  8.在BIOS中禁用内存缓存功能。
  9.重新启动计算机,在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。(注:使用“最后一次正确的配置”的方式启动计算机,计算机的所有设置被重置为最后一次成功启动时的配置。)
  10.如果能够访问Web,请进入http://www.microsoft.com/ntserver/,单击“Support”/“Search Knowledge Base”,在“Type your keywords here”处,输入“stop”和相应的号码(如出现STOP消息“stop:0x0000000A”,可在此输入“stop0x0000000A”),按Enter键,就可以找出所出现的STOP问题的解决方法。

特殊排除

STOP消息 0x0000000A故障(设备已经安装)
通常原因 驱动程序使用了不正常的内存地址。
  1.如果Windows 2000还可以启动,检查“事件查看器”中显示的信息,确定引起问题的设备或驱动程序。
  2.关掉或禁用一些新安装的驱动程序,并删除新安装的附加程序。
  3.拆下一些新安装的硬件(RAM、适配器、硬盘、调制解调器等等)。
  4.确保已经更新了硬件设备的驱动程序,以及系统有最新的BIOS。
  5.运行由计算机制造商提供的系统诊断工具,尤其是内存检查。
  6.检查Microsoft兼容硬件列表(HCL),确保所有的硬件和驱动程序都与Windows 2000兼容。
  7.在BIOS中禁用内存缓存功能。
  8.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。

STOP消息 0x0000000A故障(刚加入新设备时)
通常原因 驱动程序使用了不正常的内存地址。
  1.在安装过程中,屏幕上提示“安装程序正在检查计算机硬件配置”时,按F5,根据提示选择合适的计算机类型。例如,如果计算机是单处理器,请选择“标准PC”。
  2.在BIOS中禁用内存缓存功能。
  3.拆下所有适配卡,并断开所有不是启动计算机所必需的硬件设备,再重新安装Windows 2000。
  4.如果系统配有SCSI适配卡,请向适配卡销售商索取最新的Windows 2000驱动程序,禁用同步协商功能,检查终结头和设备的SCSI ID号。
  5.如果系统配有IDE设备,设IDE端口为Primary。检查IDE设备的Master/Slave/Only设置。除了硬盘,拆下其它所有的IDE设备。
  6.运行由计算机制造商提供的系统诊断工具,尤其是内存检查。
  7.检查Microsoft兼容硬件列表(HCL),确保所有的硬件和驱动程序都与Windows 2000兼容。
  8.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。

STOP消息 0x0000001E故障
  1.检查是否有充分的磁盘空间,尤其是新安装。
  2.禁用STOP消息中显示的驱动程序和所有新安装的驱动程序。
  3.如果所使用的视频驱动程序不是Microsoft提供的,试着切换到标准VGA驱动程序或者由Windows 2000支持的合适的驱动程序。
  4.确保系统有最新的BIOS。
  5.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。

STOP消息 0x00000023和0x00000024故障
通常原因 严重的驱动器碎片、超载的文件I/O、第三方的驱动器镜像软件或者一些防病毒软件出错。
  1.禁用一些防病毒软件或者备份程序,禁用所有碎片整理应用程序。
  2.运行CHKDSK /f 检修硬盘驱动器,然后重新启动计算机。
  3.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。

STOP消息 0x0000002E故障
通常原因 系统内存中的奇偶校验错误。
  1.运行由计算机制造商提供的系统诊断工具,尤其是内存检查。
  2.在BIOS中禁用内存缓存功能。
  3.试着用“安全模式”启动。如果“安全模式”可启动计算机,试着更改为标准VGA驱动程序。如果这不能解决问题,可能须要用另外的视频适配卡。“兼容硬件列表”中列出了兼容的视频适配卡。
  4.确保已经更新了硬件设备的驱动程序,以及系统有最新的BIOS。
  5.拆下一些新安装的硬件(RAM、适配器、硬盘、调制解调器等等)。
  6.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。

STOP消息 0x0000003F故障
通常原因 驱动程序没有被完全清除。
  1.删除一些新安装的软件,包括备份工具或磁盘工具,例如碎片整理和防病毒软件。

STOP消息 0x00000058故障
通常原因 在容错集的主驱动器中发生错误。
  1.用Windows 2000引导软盘,从镜像(第二个)系统驱动器启动计算机。
  2.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。 STOP消息 0x0000007B故障
通常原因 在I/O系统的初始化过程中出现问题(通常是引导驱动器或文件系统)。
  1.检查计算机上是否有病毒。这个STOP消息通常在引导扇区有病毒时出现。
  2.使用“修复控制台”来修复驱动器。
  3.拆下新安装的硬盘驱动器或控制卡。
  4.如果系统配有SCSI适配卡,请向适配卡销售商索取最新的Windows 2000驱动程序,禁用同步协商功能,检查终结头和设备的SCSI ID号。
  5.如果系统配有IDE设备,设IDE端口为Primary。检查IDE设备的Master/Slave/Only设置。除了硬盘,拆下其它所有的IDE设备。
  6.运行CHKDSK。如果Windows 2000不能启动CHKDSK,则必须把硬盘拆下并连接到另一个Windows 2000系统上,然后用CHKDSK命令检查该硬盘。
  7.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。 STOP消息 0x0000007F故障
通常原因 硬件或软件问题;常见的原因是硬件失效。
  1.运行由计算机制造商提供的系统诊断工具,尤其是内存检查。这个STOP消息经常出现在错误或误配内存的情况下。
  2.在BIOS中禁用内存缓存功能。
  3.试着拆下或替换硬件:RAM、控制器、适配器、调制解调器和其它外围设备。
  4.检查Microsoft兼容硬件列表(HCL),确保所有的硬件和驱动程序都与Windows 2000兼容。这个问题可能是由于不兼容的主板引起的。
  5.重新启动计算机。在启动屏幕处,按F8进入“高级启动选项”,然后选择“最后一次正确的配置”。

2005年6月5日星期日

Google工具栏的实用功能

  GOOGLE新版工具栏(3.0 beta)增加了2个有意思的功能。

  一个功能是拼写检查,可以检查录入表单中的拼写错误(有点象WORD了),当表单录入完成后,点击GOOGLE工具栏中的拼写检查按钮,GOOGLE就会连接拼写检查服务器(然后我们就要祈祷拼写检查服务器现在可以连通),就可以实现拼写检查功能。

  另外一个功能是字词翻译器,把鼠标移动到当前页面的某个单词上,GOOGLE会自动将其中文翻译显示出来(金山词霸的生意估计要冷清了)。第一次使用的时候,GOOGLE会先自动去下载字典。目前其支持中文、日文、韩文、法文等七种语言的翻译。

  GOOGLE工具栏下载地址:http://toolbar.google.com/intl/zh-CN/