鼠年最后一天

| | 评论 (2) | TrackBacks (0)

一个人的年夜饭

一个人看春节联欢晚会

一个人的鼠年岁末除夕

一个人在成都过新年

祝福家乡的亲人、朋友春节快乐

牛年是本命年,好好过

用PHP和Javascript实现登陆验证

| | 评论 (0) | TrackBacks (0)

登陆验证应该是Web程序员必须掌握的最基本的东西了,乍看起来似乎很简单,但随着学习相关技术的深入,考虑到安全性,用户体验等方面的要求,其实不简单,下面就以我做的一个小项目(回味乐食品网站)后台登陆页面为例来说明。

简单的登陆页面:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="../css/stylesheet.css" type="text/css" media="screen,print"> <title>回味乐食品厂-用户登录</title> </head> <body> <form name="login" action="" method="post" style="margin-top:80px">
<table align="center">
<tr>
<td>用户名:</td>
<td><input type="text" name="user" id="user"></td> <td class="resetMsg" id="userMsg" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" id="password"></td> <td class="resetMsg" id="psdMsg" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" id="login" value="登陆" align="left" style="width:60" onClick="javascript:return CheckTxt();" /></td> </tr>
</table>
</form> </body> </html>

页面的表单有两个输入框,分别输入用户名和密码,id为"login"的提交按钮在提交时触发Javascript方法CheckTxt()验证用户输入。由于Javascript方法是在客户端实现,所以验证仅限于对输入内容是否为空的判断,为了更好的用户体验,出错提示不采用弹出对话框的方式,而是把提示内容输出到输入框右边的<td>内容框当中(id分别为userMsg和psdMsg)。下面是列出了所有可能的情况和出错时输出的提示:

  1. user为空,password也为空:userMsg和psdMsg分别给出"缺少用户名"和"缺少密码"的提示;
  2. user为空,password不为空:userMsg给出"缺少用户名"的提示,同时psdMsg的提示为空;
  3. user不为空,password为空:userMsg的提示为空,psdMsg给出"缺少密码" 的提示;
  4. user和password均不为空:userMsg和psdMsg的提示都为空。

为了让验证更高效,在程序具体实现的时候要先考虑出错的情况,也就是前面三种,出现错误就立即终止并返回false,这样就不必再往下执行判断了。

Javascript方法CheckTxt():

<script type="text/javascript">
function CheckTxt()
{
var user = document.getElementById("user").value
var password = document.getElementById("password").value
if( user == "") //用户名为空
{
document.getElementById("userMsg").innerHTML ="缺少用户名";
document.getElementById("user").focus();
if(password == "") //用户名为空且密码为空
{
document.getElementById("psdMsg").innerHTML = "缺少密码";
} else //用户名为空,密码不为空
{
document.getElementById("password").value ="";
document.getElementById("psdMsg").innerHTML ="";
}
return false;
} else if(password == "") //用户名不为空,密码为空
{
document.getElementById("userMsg").innerHTML ="";
document.getElementById("psdMsg").innerHTML = "缺少密码";
document.getElementById("password").focus();
return false;
}
else //用户名和密码都不为空
{
return true;
}
}
</script>

上面提到,在出错一旦发生,就需要给出出错提示从方法中返回,再看上面代码,为什么在用户名为空的情况,没有立即返回false,还需要再判断密码是否为空呢?仔细想一下就会清楚,如果在只判断了用户名为空的情况下就立即返回false,那么在用户名和密码都为空的情况下页面只会提示"缺少用户名",不够全面和准确。如果你再仔细看看淘宝网Gmail的登陆页面,就会更明白了。

还要注意的一个细节是在判断为空后应该设置焦点,以方便用户输入。

完成了客户端的验证,下面就要在服务器端进行验证了。为了更准确地给出出错信息,在查询MySQL数据库中的记录时,查询条件可以只指定用户名,这样就能够判断数据库中是否有用户输入的用户,如果没有,就给出"没有此用户"的提示,如果有,则进一步把用户输入密码和数据库中的记录进行对比。为了防止SQL注入攻击,在查询和比对的时候需要用mysql_real_escape_string()方法对表单提交的字段的内容中的特殊字符进行转义。

PHP验证代码清单:

<?php

//处理未登陆时访问此页面的情况
if(is_null($_SESSION['login'])){

//处理表单提交后的情况
if(isset($_POST["user"])){
$user = $_POST["user"];
$password = $_POST["password"];
require("../include/dbconnect.txt");
db_connect();
//用mysql_real_escape_string() 函数对用户输入进行转义,防止SQL注入攻击
$queryUser = "select * from users where user ='" .mysql_real_escape_string($user)."'";
$result = mysql_query($queryUser);
$row = mysql_fetch_array($result);
if(!$row) { //如果用户名不存在
print '<script type="text/javascript">';
print "document.getElementById('userMsg').innerHTML ='用户名不存在'\n";
print "document.getElementById('user').focus()";
print '</script>';
} else { //如果存在,对比数据库中的密码和用户输入的密码(先进行转义 )
if($row["password"] == mysql_real_escape_string($password)) {
if(is_null($_SESSION["url"])) {
print '<script type="text/javascript">';
print 'self.location.href= "index.php"';
print '</script>';
} else { //未登陆的情况下从"其他页面"redirect到此登陆页面, 登陆成功后页面直接跳转到"其他页面",而不是index.php
print '<script type="text/javascript">';
print "self.location.href='".$_SESSION["url"]."'";
print '</script>';
}
$_SESSION["login"] = 1;
} else {
print '<script type="text/javascript">';
print "document.getElementById('psdMsg').innerHTML = '密码不匹配'\n"
print "document.getElementById('user').value ='".$user."'\n";
print "document.getElementById('password').focus()";
print '</script>';
}
}
mysql_close();

}
} else {
print '<script type="text/javascript">';
print "window.onload = function()\n";
print "{";
print "document.getElementById('user').focus()\n";
print "}";
print '</script>';
//登陆后再访问此页面的情况,清除会话$_SESSION['login']
unset($_SESSION['login']);
unset($_SESSION['url']);
}
?>

这个例子是整个网站的一部分,所以以上这段代码有几处需要注意的地方:is_null($_SESSION['login'])是对SESSION变量$_SESSION['login']进行判断,如果用户在未登陆的情况下访问此页面(听着似乎有些矛盾,呵呵),则值为Null。用户在已登录的情况下再访问登陆页面,会清除会话$_SESSION['login']。

另外,在PHP代码中当中调用Javascript需注意如果Javascript代码语句有多行, 在每行结束时要加上\n,而且要被包含在""中,因为''在PHP不能对\n进行转义。

实例在这里:http://www.zhouhongquan.com/projects/hwlsp/admin/login.php

8月8日,北京第29届奥运会开幕式当天,真的有种过年般高兴的感觉,也很期待当晚的开幕式,下午4点多开始就守在电视旁,因为奥运开始前的文艺演出在5点45就开始了,可惜等到接近6点,却没有一个频道直播。

接近晚上8点,开幕式直播开始,介绍领导人的时候镜头中还出现了前任国家主席Jiang Zemin,不过毕竟申奥成功还是在他任内实现的,出席开幕式也是理所当然。声光电构成的特殊的倒计时过程让人印象深刻,特别是加入了中国元素的10-1的倒数。接下来首先让我非常感动的是小女孩林秒可演唱的《歌唱祖国》,这首歌经过"演绎后"的歌唱效果给人一种特别舒服的感觉,情感的舒展更为缓慢和悠远,沁人心扉,在听歌曲和升国旗的过程中,激动的几乎要落泪,和上次纪念5.12地震的默哀仪式时殇痛的流泪不同,这次我心中有种强烈的自豪感,为身为中国人,身为中华民族一份子。

表演的整个前半段突出了中华文化的灿烂和文明,四大发明,击缶、京剧、武术等等都囊括其中,其中又以那副既古代,又现代的"卷轴画"最让我印象深刻,从远古到后面各个历史时期的许多中华文化的代表在极为绚丽和出色的现代声光电效果下一一呈现,但在观看的过程中不知怎的,总觉得场景的表现差了那么一点,切远景的时候角度不是多方位的,而有的场景又只用了近景,看不到长景的画面。后面表现中国现代的部分和前面相比,要稍逊一些,没有特别有代表性的内容。最后李宁手拿火炬往上升和在鸟巢顶部的画卷上奔跑的时候,从画面上看火炬的火焰几度消失和减小到很小的样子,就像要熄灭了一样,看着真叫人揪心,还好后来火焰又燃起,也顺利地点燃了主火炬。另外,李宁在奔跑的过程中曾在中间半段的时候跑在了画卷的前面,应该是一个失误吧。
-------------------------------------------------------------------------------
开幕式结束后看张艺谋在新闻发布会上也谈到说寻找一个中国当代、今天的文化符号几乎很难,所以表现现代的部分并不像前面展现古代的文化一样那么具体。

在中央电视台播放的开幕式幕后的镜头中,李宁在点完火炬下来后说由于风太大,为了不让火炬熄灭,他还在奔跑的时候不断地用手转动,也着实担心了一把。

上网的时候,首先从GoogleReader里看到说还有BBC和NBC版的开幕式直播,画面和CCTV的还不一样,之前我还一直以为其他电视台的信号源都采用的是CCTV的呢。后来又看到天涯上讨论开幕式的导播问题,说很多画面在CCTV当中都没出现(也印证了我那天的感觉),NBC版才真正表现出了开幕式恢宏、绚丽的场景。到底是怎么回事,现在似乎还没有一个非常准确地说法。到今天,才终于把BBC和NBC两个版本的开幕式都下载下来,地址是这里这里,大小分别是2.54G和4.92G,NBC的是高清晰版,但有些遗憾的是由于电脑的配置比较低(特别是CPU),播放的时候声音和画面出现了不同步的现象,但画面效果的确非常好,场面也相当震撼,的确比央视版的要好很多。从我看到的这两个版本的开幕式来看,NBC和BBC在鸟巢内都应该有自己的机位,BOB(BOB是由北京奥组委和国际奥委会所属的奥林匹克广播服务公司共同组建,是一家中外合作经营性质、专事于奥运会电视转播业务的企业,在北京2008年奥运会和残奥会期间,它将负责制作和提供用于为世界各国广播电视台播出的有关奥运会赛事和重要活动的国际电视与广播公共信号,并建设、运营国际广播中心和其他场馆的转播设施,为奥运会转播权持有者提供与转播事项有关的服务等)也应该为他们提供了大部分信号,但肯定也有他们自己编辑的内容,而CCTV版之所以遭到骂声,也就是因为加入了太多"自己"的内容。关于这方面的内容,搜索一下"NBC版开幕式"就会有很多介绍。但要指出的是,论坛中贴出的有些"没看到的画面"很多是用相机在现场静态拍摄的,并非电视直播的画面,NBC和其他除CCTV以外其他电视台的画面中也是没有的。

这两天又报道出了两个造假事件,一个是开幕式当天那29个"脚印"焰火,直播的时候前28个用的是事先就合成和制作好的效果图。第二件是小女孩林妙可的假唱,声音还是另外一个女孩儿。焰火"造假"确有客观原因,而"假唱"确实有些不应该。
在虚拟机上安装好Fedora后,就进入搭建LAMP系统(IBM developerWorks 中国 网站上有关于LAMP的介绍)的核心阶段:安装XAMPP。从apache friends上下载适用于Linux系统的XAMPP的发行版 ,安装过程在网站上有详细介绍 ,很明了,但在安装的过程中还是出现了意外:当使用 /opt/lampp/lampp start 运行XAMPP时,出现如下提示:

cat: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
/bin/sh: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
Starting XAMPP for Linux ...
/bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
/bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
/bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
/bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
/bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
XAMPP for Linux started.
在Firefox中访问http://localhost 的时候也无法看到XAMPP的开始页面,千辛万苦在网上找到遇到同样错误并解决了的方法
 vi /opt/lampp/lampp
找到:export LD_ASSUME_KERNEL=2.2.5
改为:export LD_ASSUME_KERNEL=2.8.0
vi 编辑器有其特殊的使用方法,这里有比较详尽的介绍,就不再赘述。 事实证明,前面的办法还真行,但具体是什么原因就不清楚了。

现在,就可以通过http://localhost 来访问XAMPP的起始页面了,LAMP系统也就搭建成功了

最近开始熟悉LAMP(即Linux-Apache-MySQL-PHP)WEB开发框架,从安装Fedora开始,先从Fedora Project 下载最新的Fedora 9安装DVD的 ISO镜像文件 。为了方便起见,我选择在虚拟机中安装Fedora,最著名的两大虚拟机软件就是微软的Microsoft Virtual PC (最新版2007,另外SP1补丁竟然比主程序的安装文件还略大,微软的补丁真可谓是补到家了,呵呵)和VMware ,其实Virtual PC 最开始并不是微软自己的项目,而是出自一个叫做Connectix的公司,后来微软收购了它 。以前听微软TechNet的课时经常看到讲师在演示操作的时候用到Virtual PC,看着挺不错的,现在轮到自己尝试,发现简单得有些简陋,在创建虚拟机的时候可以选择安装的客户机操作系统(guest operating system)类型,提供的选项都是微软阵营的,有Win98、Win2000、WinXP、Win2003 等,在虚拟的BIOS中选择从光驱启动,把安装光盘放进光驱,或者在Virtual PC的"CD"菜单的"Capture ISO Image"选择要安装的操作系统的ISO文件,按照提示,就和平时在PC上安装系统一样。可惜的是它对Linux 的支持一点也不好,在安装Unbuntu的过程中,我就遇到了显示的问题,后来在网上搜索,看到有很多人也遇到同样的问题,但解决起来似乎不容易,且版本不同也有细微差别,后来还是放弃了,把目光投向VMware。

和Virtual PC 2007不同,VMware Workstation的安装文件就有300多M,最新版的VMware 6.0.4 build:93057,从官方网站也只能下载到试用版的。VMware对Linux的支持不错,在新建虚拟机的过程中有Microsoft Windows、Linux、Novell Netware、Sun Solaris多个选项可供选择,这些大项下面还有许多更为细致的小项可供选择。对虚拟机占用的内存和硬盘空间应根据实际情况做合理设置,我要安装的Fedora 9 由于是最新版的桌面系统,对内存大小和硬盘空间都有比较高的要求,所以我设置的值分别是512M和10G。在虚拟机的属性中把CD-ROM设置为"Using ISO image",选择要安装的操作系统的ISO文件。安装过程比较顺利,即使以前没用过Linux也能够比较轻松的进行,设置的东西不多,按提示来就可以了。

系统安装好了,不过有两个地方让人感觉不太好:每次从Fedora切换回Windows时都要按Ctrl+Alt,比较麻烦;显示分辨率只能设置为800*600,将虚拟机全屏时内容只占据屏幕正中央的大部分,四边还离屏幕周边还有些距离,就像EeePC的屏幕。原本只是因为在安装好的Fedora客户机和宿主机(WinXP SP3)之间无法复制文件而安装VMware Tools,没想到安装好VMware Tools之后上面两个问题都得到解决,的确是意外的惊喜:鼠标在Fedora用户界面和WindowsXP宿主机之间可以自由"出入",在Fedora中在窗口在最大化后所有界面充满了整个屏幕,就像在本机真实安装的一样。

安装VMware Tools的过程我也是在网上搜到的,具体过程如下:

  1. 安装虚拟机的时候网卡设置为本机的物理网卡。
  2. 启动虚拟机,选择VMware Tools的VM菜单的Install VMware Tools选项,注意状态栏的提示。
  3. 选择VMware Tools的VM菜单的Removable Devices子项中的CD-ROM项,点击Edit,在Use ISO image下点击Browse,在打开的对话框中选择VMware程序文件目录下的Linux.iso。
  4. 进入Fedora命令行模式(纯命令行模式我也不知道咋进,我是在用户界面下的终端模式里输入命令的,另:一定要用root身份登陆),输入 mount /dev/cdrom /mnt/cdrom,然后输入 cd/mnt/cdrom。
  5. 打开cdrom文件夹,这时应该可以看到有两个文件,一个是VMwareTools*.rpm(*部分根据VMware的版本不同而有所差异,我用的是VMware 6.0.4 build93057,在这里文件名为VMwareTools-6.0.4-93507.i386.rpm),在终端中输入rpm -ivh VMwareTools*.rpm;还有一个文件是VMwareTools*.tar.gz (和前面的文件名类似),依次输入以下命令 cp VMwareTools*.tar.gz /tmp、 cd /tmp、 tar xzvf VMware-tools*.tar.gz、cd vmware-tools-distrib,打开vmware-tools-distrib文件夹,里面会有一个vmware-install.pl 文件,输入./vmware-install.pl,在接下来安装过程中的提示中一直按回车。
  6. 在 /mnt文件夹下,会发现此时多了一个hgfs的文件夹,表明VMware Tools安装成功了。
  7. 最后一步,设置文件夹共享,VM菜单里进行,选择Setting子项,再选择Options,在窗体的左半部分有一个Shared Folders选项,默认情况下是Disabled,选择Always enabled,在下面的Folders中添加要共享的文件夹目录,这样,客户机(Fedora)和宿主机(WinXP)都可以访问共享目录下的文件了,可以用在Windows中拷贝相应文件到Fedora。最后,用umount /mnt/cdrom卸载光驱。

今天在安装Silverlight和微软拼音输入法2007 的时候,出现安装错误的提示,在安装其他使用Windows Installer服务的程序时候也是如此。打开控制面板的事件查看器,在"应用程序"的出错记录是

"产品: 微软拼音输入法2007 -- 安装程序在安装此软件包时遇到一个错误。这可能表示此软件包有错。错误码是 2203。参数是: C:\WINDOWS\Installer\3deaa.ipi, -2147287035,"

"Product: Microsoft Silverlight -- The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2203. The arguments are: C:\WINDOWS\Installer\442279.ipi, -2147287035, "

可以看到,出错原因的描述是类似的,前面部分说程序遇到错误,可能表示软件包有错,后面解释详细情况:"错误码为xxxx。参数是:C:\WINDOWS\Installer\xxxxx.ipi,-xxxxxxxxxx,"。先来分析,安装文件本身是没有问题的,都是完整的,而Windows Installer服务也是正确安装了的,版本是3.1,服务也在运行状态。在网上G了一下Windows Installer出错的解决办法,但大部分是由于Windows Installer服务本身的问题造成的,出错情况和上面也不一样。搜索"C:\WINDOWS\Installer ipi",终于找到了解决办法 ,作者给出了几种可能的原因:

  1. 当前登录用户的用户环境变量必须包括 TEMP:%USERPROFILE%\Local Settings\Temp 和 TEM:%USERPROFILE%\Local Settings\Temp (其中,%USERPROFILE%是当前登录用户的配置文件路径,如当前登录用户为Admin,则其对应的%USERPROFILE%为C:\Documents and Settings\Admin)
  2. 当前登录用户应该有管理权限,即,当前用户应该属于Administrator或者Power Users用户组。
  3. 确保"计算机名\SYSTEM"用户拥有对"C:\Documents and Settings\<当前登录用户名>\Local Settings\Temp"文件夹的绝对控制权。
  4. 对于某些软件,可能还需要"计算机名\SYSTEM"用户拥有对"C:\Documents and Settings\<当前登录用户名>\Local Settings\Application Data"文件夹的绝对控制权。

经实验,我遇到的问题是上述原因中的第三种造成的,把SYSTEM用户添加到Temp文件夹"属性"-〉"安全"设置里并赋予其完全控制的权限就可以了(必须是NFTS系统才支持文件夹的安全属性)。

前两天遇到一件怪事,由于系统中毒(还是安装了SP3和卡巴斯基杀毒软件的系统,网络真的没有绝对的安全),在卡巴斯基杀完毒后重启进系统,提示"没有找到mfc40u.dll"的错误,标题是"lsass.exe 无法找到组件",lsass.exe是系统运行时的一个重要进程,无法运行的话连系统登陆界面都进不了,点确定后屏幕背景一片黑,只能看到鼠标箭头。手动重启,在开机自检后按F8出现启动高级菜单,选择"最后一次正确的配置",顺利进入系统,但病毒依旧存在,卡巴斯基再次杀毒,重启后又遇到刚才连登陆界面都没出现的状况,没办法,只有重装系统(准确说是还原,之前我做过备份)。 

由于备份的时候就已经把IE7的临时文件夹更改到非系统分区,所以还原后也没有留意它。还原后第一件事情----安装SP3补丁,虽然之前即使安装了补丁也被病毒感染,但肯定的是,如果不安装,更可能被感染。接着把卡巴斯基和其他必备的软件安装好了,一切正常。过了几天,在用Windows自带的磁盘清理工具对系统盘进行清理的时候发现在"要删除的文件:"列表下有"Internet临时文件"和"脱机文件",文件还比较大,临时文件不是已经设置到了非系统盘吗?怎么还会在系统盘中有这么大的文件呢?打开IE7 的"Internet 属性"-》"浏览历史记录"-》"设置"的"Internet临时文件和历史记录设置"对话框,惊奇的发现"当前位置"是"C:\Document and Settings\Admin\Local Settings\Temporary Internet Files"(其中Admin是当前登陆的用户名),这个是系统的默认设置,但我确信在做系统备份之前就把位置改到了E盘,也就是文件应该存放在"E:\Internet 临时文件",而这次系统还原后我也没有对IE的临时文件设置进行过改动,想想真是蹊跷。 

既然临时文件夹现在的位置是默认的,那就改回来吧,在"Internet临时文件和历史记录设置"当中选择移动文件夹,在弹出的窗口中选择E盘,点击确定后系统会注销以更改设置,再次进入系统,再次打开"Internet临时文件和历史记录设置",很奇怪的,发现"当前位置"仍然是默认设置,即"C:\Document and Settings\Admin\Local Settings\Temporary Internet Files",很明显,更改没有起作用,重新以上操作,还是不行,包括注销后重启都没能把位置从默认位置改到E盘。打开E盘,发现"Internet 临时文件"还存在,但是文件夹不是隐藏的。 

从网上搜索到的一些相关信息来判断,可能和系统盘的临时文件夹下面的文件有关,而当前登陆用户是无法删除系统盘的Internet临时文件夹的,最后采取的解决办法就是:先重复上面的操作,把临时文件位置改到"E:\Internet 临时文件",注销后按两次Ctrl+Alt+Del键,出现经典的登陆对话窗口,"用户名"输入计算机管理员Administrator(不同于刚才登陆用的Admin用户),输入密码,现在就可以删除"C:\Document and Settings\Admin\Local Settings\Temporary Internet Files"了,注销Administrator,用Admin登陆,再看现在IE的临时文件存放位置,成功地改为了"E:\Internet 临时文件"。

前段时间花了比较大的精力把存放在Blogger上的日志存档迁移到这个Blog,存档的时间跨度从06年4月到06年底,共大概80篇日志。

最早接触Blog是05年的上半年,当时还在学校,上网不是很方便(学校的网络曾一度中断数学期之久,也没有更多的时间去校外上网),直到那年暑假,借着在外面租房子的朋友那里能上网的便利,对Blog有了更多的了解。那段时间也是Blog刚比较火的时候,我经常看的《电脑爱好者》也有很多关于Blog的介绍,在她的指引下,我在Donews建了第一个Blog(http://blog.donews.com/hongquanzhou),因为那是我就对IT业界比较关注,特别是WEB方面,所以Blog的内容大多都是从IT业界的新闻中发掘出的比较新颖的东西,或新的产品、或比较比较有趣的事情,不一而足。过了一段时间,似乎也没有那么多东西可以让我挖掘的,所以转而翻译一些IT新闻站点的文章,至今还记得那时来源最多的就是Betanewswinbeta,关注的焦点一般都是四巨头--Apple、Yahoo、Microsoft和Google。后来大概是嫌用户名过长(hongquanchow)别人不好记忆,就在Donews又新建了一个Blog http://blog.donews.com/hongquan,很可惜,原来的Blog存档在我删除Blog的时候也随之被删除了。

最开始考虑在Donews开博除了受到杂志介绍的影响,也和那时就已经很有名气的IT Blogger Keso 有些"关系",我第一个真正关注的就是他的Blog,而他的Blog就在Donews。后来,一个更好的Blog服务吸引了我的目光,那就是被Google收购的Blogger,本来Blogger有自己的托管服务,即Blogspot,但我不想用申请的zhouhongquan.cn这个域名做URL的转向,所以就用Blogger自带的FTP发布功能发布到我申请的免费空间上,因为不太稳定和各种原因,期间还换了好几个,后来使用Keso推荐的SiteSled,但接的罢工让我心灰意冷,让我又换回到Blogger自身的Blogspot托管,但还是摆脱不了被GFW阻尼的命运,实在是受不了这个折磨,找了一个Dreamhost的空间,并用MovalbeType建立了独立Blog,但原来Blogger上的存档依然留在Blogger,更换域名后,一直都想把这些存档迁移过来,但对于近80篇,其中有很多还插有图片的日志,要把每篇日志按照现有的规则(日志标题的永久链接名为标题内容对应的英文名,把日志归类,设定关键字、Tag、摘要)重建,确实是比较麻烦的一件事,遂一直拖到现在,直到前段时间在清理多余的网络服务(主要是邮箱)注册信息时,忘记了日志中的图片大多是存放在Flick上的,结果误删了这个存放图片的"多余"的Flickr帐号,可能是因为完全删除还要有段时间吧,日志中的图片都还可以访问,赶紧把所有的日志迁移到了这个Blog,图片也全部存放在Yupoo上。迁移的时候,免不了对格式、标题等进行修改和校正,重温以前的旧文,发现有两个怪异的特点:

  1. 很多日志文章的标题都是问句的形式,有的还加上了问号。
  2. 除以上提到的用问句做标题的日志,很多文章都仅仅是提出问题,并没有给出解决的办法,即使后来弄懂了这个问题。

日志迁移的过程中由于使用的是另外一台机器,IE是6.0版本,发现导航菜单(是自己加上去的)和右边侧栏的Mybloglog Widget 显示不正常,怀疑和MT模板有关,升级到最新的MTP 4.1,升级过程和方法和上次升级到4.01是一样的,升级后发现MT 4.1与前一版本的几点不同:

  1. 后台编辑器把 Publishing、Categories、Feedback等选项放到了右边
  2. Tag 标签云(Tag Cloud)的显示方式和以前有所不同

由于平常要用到的软件比较多,在考虑安装办公软件的时候就选择了免费的WPS Office 2007,和微软Office办公套件安装光盘600多M 的庞大体积相比,WPS的安装文件着实很Mini,仅有23M(其实WPS Office 2007 安装后也要占据110M的空间),但是在使用的过程中,也遇到一个不大不小的问题。

双击.doc、.xls和.ppt文件时,经常会出现“无法找到******”,让你“检查文件名的拼写,并检查文件位置是否正确”,还说“如果你正试图从“文件”菜单中最近使用的文件列表中打开文件,请确认文件未被重命名、移动或删除”,点确定后还会继续提示几次,除了“******”有变化,其余部分是相同的。如下图:

无法找到“E:\Various\Visual”  (点击看大图)

无法找到“E:\Various\C#”点击看大图)

无法找到“E:\Various\2005”点击看大图)

 无法找到“E:\Various\使用详解.doc”点击看大图)

当点完确定不再提示后,文件当然还是未被打开,最开始的时候我还怀疑是不是文件不完整造成的,但后来发现通过菜单“文件”—》“打开”,再选择这些文件,都能够顺利地打开,所以可以排除是文件不完整的原因。

先从提示找找线索,上文当中的4幅截图就是我在双击本地磁盘上"E:\Various\"目录下的“Visual C# 2005 使用详解.doc”这个文件时接连出现的四个提示对话框,让我们仔细看看提示的内容(很遗憾的是之前遇到这个问题很多次却一直没有留意这个),上文提到过,除了“无法找到******”的内容不一样外,其余的内容都是相同的。提示的"E:\Various\Visual"、"E:\Various\C#"、"E:\Various\2005"、"E:\Various\使用详解.doc"这几个目录和文件是不存在的,当然WPS会给出无法找到的提示。再仔细看,原来"Visual"、"C#"、"2005"、"使用详解.doc"正好就是真正文件名的四个部分,而这四部分中间恰好有空格,是否是空格的原因呢?验证一下,把文件名当中的空格去掉,改为“VisualC#2005使用详解.doc”,双击文件,果然能打开了。但是不可能每次碰到这种有空格的文件名都去手动改啊,看来问题还没有从根本上解决。

再来分析,现在可以确认双击打不开就是因为文件名当中有空格引起的,但是即使文件名当中有空格,为什么用文件菜单的打开命令就可以呢?双击和用文件菜单的打开命令有什么区别呢?双击的时候调用的是与文件类型相关联的程序,在我的电脑上,.doc文件默认就是用WPS 文字程序打开的,是否和“文件关联”的设置有关呢?我对文件关联有些了解,曾经在一本电脑杂志上看到过一个文件关联的小技巧,就是可以手动建立任何扩展名所对应的打开方式——通过资源管理器窗口的“工具”—》“文件夹选项”—》“新建”,还可以更改文件类型对应的图标、定义操作等。如下图:

点击看大图)

这种方法在重装系统后某些软件(特别是绿色软件)还能正常使用的情况下非常有用,WPS虽然不是绿色软件,但只要先前是安装在非系统盘,重装系统后不用重新安装程序,程序照样可以使用,找到其中的程序可执行文件"wps.exe"、"et.exe"、"wpp.exe"就可以分别打开文档、表格和演示文稿了。但是在双击.doc、.xls、.ppt文件的时候会弹出“Windows 不能打开此文件”的提示(出现这个对话框就是因为所双击的文件类型还没有在系统中注册),可以使用选择“使用 Web 服务寻找适当的程序(W)”,也可以“从列表中选择适当的程序(S)”,通常选择后者,通过“打开方式”里提供的程序进行选择,如果勾选了“始终使用选择的程序打开这种文件(A)”,下次再双击的时候就可以直接打开了。另外一种方式就是前面提到的直接通过新建的方式手动地编辑文件类型。回到现在的情况,WPS是在系统安装后才安装的,但是仍然可以对.doc、.xls、.ppt的文件类型进行设置,打开“编辑文件类型”设置的“Open”操作的编辑选项,“用于执行操作的应用程序(L)”这一项的设置是""D:\Kingsoft\WPS Office 2005\office6\wps.exe" %1"(不包括最外面的一对引号)

再对比了一下PDF文件类型的设置,发现了问题,pdf的“Open”操作的“用于执行操作的应用程序(L)”这一项在程序位置地址后的%1是有双引号的,而.doc、.xls、.ppt都没有,给%1加上双引号,问题解决!

附:(微软网站上关于文件关联的两篇文章)

  1. SAMPLE: FileAsso.exe 演示如何使用文件关联
  2. 如何在 Windows XP 中更改双击文件时启动的程序

前两天安装了Microsoft Visual Studio 2005 Professional Edition后,这两天发现了一个奇怪的问题—系统的某些选项设置后面多出了“ON”和“OFF”。

首先发现的是在IE属性的“安全”—》“自定义级别”选项里,如下图:

可以看到,“禁用”、“提示”和“允许”这三种选项中的任一个,如果处于被选中的状态,则后面显示为“ON”,而在未选中的情况下后面则显示为“OFF”。而在IE属性的“高级”选项设置里,既有复选框也有单选框,规则和前面的一样,只要选中了那个选项,则后面显示为“ON”,未勾选的则显示为“OFF”。

后来又在“工具”—》“文件夹选项”—》“查看”的设置里看到的同样的情况:

 

不知道安装过VS2005的朋友们有没有遇到同样的问题。

Ads

他们来过

和我聊天

Powered by Movable Type 4.1