利用X-UA-Compatible定义网页在IE下的兼容状态

这个貌似是随着IE8诞生而出现的东东,具体有什么用呢?不妨先参考一下微软MSDN的 《定义文档兼容性》 这篇文章。说白了X-UA-Compatible就是指定IE8或者以上版本以何种模式渲染网页。

应用场景 ,比如说我们在IE7的情况下设置调整好网页的正确渲染方式,的确,我们的网页在IE7下看起来正常了,但是IE8的出现可能会击毁我们原先美好的设想,那就是IE7下正常,以后版本的IE肯定也正常了,其实不然,微软在发布每一款浏览器时必定会对浏览器做一些调整,往往这些调整会让我们某些定义的布局出现意料外的状况,但是大家可能不想再加班加点的去修改现有的布局来适应新的浏览器,有没有一劳永逸的办法呢?答案就是X-UA-Compatible,有了它,我们的时光可以永远停留在IE7时代,当然,这可能有些不思进取,我还是建议你在下次网站改版时做好IE8、IE9及现有版本IE的兼容工作。

如果你需要让IE8、IE9或更高版本以IE7的兼容方式渲染网页的话,请在头标签定义如下的meta元标签。

<html>
<head>
  <!-- Mimic Internet Explorer 7 -->
  <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" >
  <title>My Web Page</title>
</head>
<body>
  <p>Content goes here.</p>
</body>
</html>

value指定“IE=5”、“IE=7”或“IE=8”可选择相应的兼容性模式。 还可以指定“IE=edge”以告诉 Internet Explorer 8 使用可用的最高级别模式。

但是对于W3C标准比较关注的童鞋可能会发现,定义meta标签的方式可能会导致HTML5标准检测不通过,或者说挨个加meta标签太麻烦,那有什么办法避免呢?其实X-UA-Compatible可以写入HTTP Response Header(HTTP响应头中),对于Apache .htaccess定义如下。

<FilesMatch ".(html|htm|php|aspx|asp)$">
Header set X-UA-Compatible "IE=EmulateIE7"
</FilesMatch>

对于支持ASP.NET的IIS服务器可以在web.config定义如下节点:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
        <add name="X-UA-Compatible" value="IE=EmulateIE7" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

2012年2月6日更新

对于Nginx服务器来说只需要在配置文件中使用add_header指令就可以了,add_header指令可以加在http, server, 或者 location节中:

# 比如如下指令则在header中告知IE始终以当前最先进的方式展示页面
add_header X-UA-Compatible IE=edge,chrome=1;
Posted in:
  • 前端开发与用户体验
  • Web开发及相关
Tagged
  • 浏览器兼容
  • ie浏览器

更改Visual Studio 2010的代码字体设置

前一篇文章 介绍了如何修改Visual Studio默认的主题设置,不过大家可能发现,代码字体没有原来主题上的美观,确实,对于程序员来说,等宽字体是最适合于编程的,微软就给我们提供了一款现成的等宽字体,那就是Consolas,大家可以在微软的网站上 下载安装包 。什么?那上面说是“for Microsoft Visual Studio 2005 or 2008”,不过没关系,其实就是个字体文件,安装完成后就可以在字体列表中找到它,和Visual Studio的版本是没有关系的,对于喜欢绿色版本的童鞋们来说,我在这里提供了提取出的Consolas字体ttf文件[点击进入下载页面],下载解压后只要打开控制面板,拷贝到字体文件夹中就可以了。

做完上面这些,下面将重点介绍如何将字体应用到Visual Studio中去。

首先我们打开VS2010,然后依次选择工具,选项,打开选项配置

Visual Studio选项.png

切换到字体和颜色子配置,然后你就可以选择刚才安装的Consolas字体了,注意这里等宽字体都是以加粗的方式显示的,所以你很容易就能找到它们。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • vs2010
  • 主题与皮肤

更改Visual Studio 2010的主题设置

Visual Studio 2010发布也已经有一段时间了,不过安装后默认的白底的主题长时间看代码可能会感觉眼睛酸痛,况且时间长了我们也希望能够换换口味, studiostyles 这家主题网站则专门给我们提供了不同口味的Visual Studio主题样式,比如评分比较高的 Son of Obsidian 就是一款暗色调背景的主题,安装后将不会感觉到原来自带的那种白底界面的刺眼,可以有效的辅助我们长时间编程。

下载后,你将得到扩展名为.vssettings的主题文件,当然直接用Visual Studio打开是不能应用主题的,我们需要先启动VS2010,然后选择工具,设置,导入和导出设置,就像下图所示:

Visual Studio导入和导出设置.png

然后出现如下图所示的向导,我们选择导入选定的环境设置,点击下一步:

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • vs2010
  • 主题与皮肤

使用CSS Reset让网页布局变得轻松

其实作为网页前端设计人员最大的痛苦莫过于各种各样的浏览器,不过浏览器外壳(Shell)还好,糟糕的事情是有各种牌子的浏览器排版内核(Core),这或多或少给我们网页布局带来一定的麻烦,比如说不同的浏览器对于盒子模型的理解偏差。

好吧,我们完全没有比较把大量的时间花费在兼容浏览器上面,而且做到100%的全兼容会有一定的困难,对于CSS不太熟练的设计人员来说,与其耗费大量时间调试写CSS Hack,然后制造出一个极难维护且占带宽的样式文件,还不如将时间节省下来去喝杯咖啡,喝咖啡?开玩笑,那些在不同浏览器下呈现的乱七八糟的布局难道就不管了吗?当然不是这样,其实我们可以借助于CSS Reset(也称CSS重置、CSS重设、CSS清零)。

什么是CSS Reset?简单的来说它主要实现不同浏览器下不同布局模式的统一,这样将大大有利于我们布局跨浏览器的网页。

最经典的CSS Reset莫过于下面这一句了:

* {
  margin: 0;
  padding: 0
}

什么?你也是这么写的?好吧,我以前也一直这么写,但是现在我觉得应该淘汰这种写法了,为什么呢?除了少部分浏览器不支持*通配符外,这种写法带来了另外一个问题 《* { margin: 0; padding: 0; } No Longer Cool》 这篇文章介绍了性能上面有影响,总之我们还是换一种方法吧:-)

现成的CSS Reset有很多,其中 《CSS Tools: Reset CSS》 比较不错,其将所有可能的标签列出来然后Reset样式,从而取代了* { margin: 0; padding: 0; }的写法,另外对于不支持HTML5的标签的老式浏览器,其还将这些HTML5块级(Block)标签重置为display:block。这个CSS Reset的使用方法也非常简单,只要在你写CSS时引用一下这个Reset样式就可以了。

想了解更多的关于CSS Reset的故事,可以参观淘宝UED的 《Reset CSS研究(八卦篇)》

想了解不同CSS Reset的表现,我相信 * { CSS:resetr } 这个网站还是值得参考的。

Posted in:
  • 前端开发与用户体验
  • Web开发及相关
Tagged
  • 浏览器兼容
  • css

VBScript利用WScript.Shell创建快捷方式

有时候利用了COM组件的脚本可以变得很强大,比如我们可以用它实现所有需要编程编译为本机代码(*.EXE)才能实现的功能。今天要介绍的就是如何让VBScript脚本利用WScript.Shell组件在桌面上创建快捷方式。

实现代码:

Option Explicit

Dim wshShell, Shortcut
Dim strDir, strName
strDir = "D:\"
strName = "命令提示符"

Set wshShell = WSH.CreateObject("WScript.Shell")
  Set Shortcut = wshShell.CreateShortcut(strDir &_
    "\" & strName & ".lnk")
    Shortcut.TargetPath = "C:\Windows\System32\cmd.exe"
    Shortcut.WindowStyle = 1
    Shortcut.Hotkey = "CTRL+ALT+U"
    Shortcut.Description = "这是命令提示符程序描述"
    Shortcut.WorkingDirectory = strDir
    Shortcut.Save
  Set Shortcut = Nothing
Set wshShell = Nothing

运行上述代码后,你将会发现D盘的根目录下建立了一个命令提示符的快捷方式,简单解释一下上面的代码,首先strDir保存的是创建快捷方式的目录路径,strName保存的是快捷方式的名称,大家会发现在稍后的代码中,利用了WScript.Shell的CreateShortcut方法创建了以strDir + strName + ".lnk"为参数的快捷方式,注意这里快捷方式都是以lnk为扩展名的,不过单单是利用CreateShortcut方法还不能创建,我们还要进行快捷方式的配置,然后调用Save方法才能真正保存并创建一个快捷方式,大家可以对任意的快捷方式右击,查看其属性,就可以知道是哪些配置了,这里的一些配置有TargetPath指向路径、WindowStyle窗口模式、HotKey快捷热键、Description鼠标放上去出现的描述提示、WorkingDirectory工作路径等等,关于WindowStyle的值,可以参考 《WindowStyle Property》

到这里大家可能会发觉在D盘创建快捷方式貌似意义不大,比如我们想将快捷方式创建到桌面上,那么该怎么办呢?看下面这段代码:

Option Explicit

Dim wshShell, Shortcut
Dim strDir, strName
strName = "命令提示符"

Set wshShell = WSH.CreateObject("WScript.Shell")
  strDir = wshShell.SpecialFolders("Desktop")
  Set Shortcut = wshShell.CreateShortcut(strDir &_
    "\" & strName & ".lnk")
    Shortcut.TargetPath = "C:\Windows\System32\cmd.exe"
    Shortcut.WindowStyle = 1
    Shortcut.Hotkey = "CTRL+ALT+U"
    Shortcut.Description = "这是命令提示符程序描述"
    Shortcut.WorkingDirectory = strDir
    Shortcut.Save
  Set Shortcut = Nothing
Set wshShell = Nothing

恩,是的,我们利用了WScript.Shell的另外一个功能,那就是获得特殊目录路径SpecialFolders,我们这里尝试获取的是桌面的路径位置,然后将其赋值给strDir,然后接下来大家都晓得怎么做吧。

Posted in:
  • VBScript/JavaScript/Python
  • 系统应用程序开发
Tagged
  • wscript
  • vbscript
  • 快捷方式

Word查找替换使用TypeText解决字符串参量过长的错误

在我的这篇 《VBScript/VBA批量替换Word指定的内容》 文章已经介绍了关于使用VBScript或者VBA查找替换Word的问题,但是在实际操作时,会发现查找和要替换的字符串不能超过一定的数量(大概是500个字符),否则会出现“字符串参量过长”的错误。

其实我们可以通过Selection.TypeText的办法避免这个问题,这个办法只适用于模板的替换,比如设置标记符{%TEMPLATE%},然后替换这个标记符为一段很长的文本。

具体的代码也很简单,我们就以之前那篇文章为例,做下改动,新代码如下:

Const wdReplaceAll  = 2
 
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
 
Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")
Set objSelection = objWord.Selection
objWord.Options.ReplaceSelection = True
objSelection.Find.Text = "{%TEMPLATE%}" ' 标记符
objSelection.Find.Forward = True
objSelection.Find.MatchWholeWord = True
objSelection.Find.Execute
objSelection.TypeText "要替换的长文本"

通过TypeText我们就有效的避免了替换长文本时的限制,但是如何查找长文本,目前我还在寻找较好的解决方案。不过解决了长文本的替换就给我们使用查找替换标记符式的Word模板扫清了障碍。

Posted in:
  • VBScript/JavaScript/Python
  • 系统应用程序开发
Tagged
  • vba
  • word
  • vbscript

JavaScript内置parseInt的基数参数问题

最近做的一个基于JavaScript的Word模板生成脚本时遇到的问题,比如时间格式1997.03.08,要将其转变为1997年3月8日,首先大家肯定能想到split(“.”),即根据点将源字符串分割到数组,然后依次提取相应的数组元素,但是03如何变成3呢,也就是说要去掉前导的0,其实我们可以通过转换为数字这个办法解决这个问题,如果是VBScript,那么就直接调用CInt,JavaScript我也想当然的调用了parseInt,就像下面这样:

var src_time = "1997.03.08";
var arr_time = src_time.split(".");
var year = parseInt(arr_time[0]); // 1997
var month = parseInt(arr_time[1]); // 3
var day = parseInt(arr_time[2]); // Uuh, 0?
alert(year + "年" + month + "月" + day + "日");

我们希望输出什么?1997年3月8日?错了,实际输出却是1997年3月0日,为什么是0日,到底做错了什么,我仔细翻阅了parseInt的用法:

parseInt 方法 返回由字符串转换得到的整数。 parseInt(numString, [radix] ) 参数 numString 必选项。要转换为数字的字符串。 radix 可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 ‘0’ 的字符串被当作八进制。所有其它字符串都被当作是十进制的。

其实这个函数有个可选项,也就是radix基数参数,默认省略的话,parseInt将自动判别numString的类型,这点与VBScript的CInt有所不同,parseInt功能相比要强大一些,那么问题就很清楚了,也就是说03和08都被当做是8进制处理了,这对8以内的数没有影响,但是对于包括8以及8以上的数,则错误的解释为0了。

这件事情告诫说明,不熟练使用的函数需要翻阅手册,仔细阅读说明后再使用,不能再想当然的使用,否则会有意想不到的后果。修正后的脚本如下(基数为10,表示十进制):

var src_time = "1997.03.08";
var arr_time = src_time.split(".");
var year = parseInt(arr_time[0], 10); // 1997
var month = parseInt(arr_time[1], 10); // 3
var day = parseInt(arr_time[2], 10); // 8
alert(year + "年" + month + "月" + day + "日");

再回到刚才那个问题,有没有更加方便的办法提取这个时间呢,当然是有的,比如说正则表达式,JS在正则方面支持还是比较好的。

var src_time = "1997.03.08";
var regstr = /^(\d{4})\.0?(\d{1,2})\.0?(\d{1,2})$/;
var arr_time = src_time.match(regstr);
var year = arr_time[1];
var month = arr_time[2];
var day = arr_time[3];
alert(year + "年" + month + "月" + day + "日");
Posted in:
  • 前端开发与用户体验
  • VBScript/JavaScript/Python
  • Web开发及相关
  • 系统应用程序开发
Tagged
  • javascript
  • 类型转换

损坏或丢失System32\Config\System导致系统无法启动

今天去单位本来想去调试外面那个LED显示屏的,不过杯具的是安装LED显示屏驱动的那个电脑开不下来了,开机显示大概如下:

因以下文件的损坏或丢失,Windows无法启动Windows\System32\Config\System你可以通过使用原始启动软盘或CD-ROM来启动Windows安装程序,以便修复这个文件,在第一屏时选择“r”,开始修复。

纠结了,问了同事,他们都说只玩了下游戏,没做别的事,好吧,只能自己解决了。刚才始使用了万能无敌的F8,开机不停按F8后,选择最后一次正确的配置。然后,没有然后了,还是这个错误消息,看来这条路行不通,只有另寻办法。

按照提示,只有找来Windows XP的系统盘,现在装机都弄什么Ghost快速装机,还好我留了张原版的系统盘以便于修复时使用,进入BIOS设置第一启动设备为光驱,重启,放入系统盘,然后出现Press any key...的时候按任意键进入蓝色的安装界面,然后按照提示按了R。

在进入故障修复控制台后,用户名Administrator,输入密码,登录到Windows XP系统,下面该怎么办呢?上网找了下,贴出来,供参考:

(注:我这个系统是装在C盘的)

Del C:\Windows\System32\Config\System
Copy C:\Windows\Repair\System C:\Windows\System32\Config\System

通过先删除损坏的System文件,然后再到Repair\System的备份中拷贝一份完好的过来,这些做完后,重启计算机。更改BIOS设置到硬盘引导启动,然后就可以看到熟悉的画面了。

为了保险起见,建议光盘先留在电脑里,然后正式进入到Windows XP系统后,点击开始,运行,输入 sfc /SCANNOW ,然后系统将会自动校验系统文件的正确性,并通过光盘修复那些损坏的文件。检测修复完成后,再弹出光盘,我们的工作算是告一段落。

单位里的电脑貌似经常要自检磁盘,这样说明电脑运行过程中出现掉电等意外故障,但是单位里也不是经常断电的,初步怀疑是电压不稳的原因,经常这样自检磁盘,修复错误,导致一些软件损坏,最可怕的就像今天那样,系统文件也损坏了。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • windows
  • 系统故障
  • 启动故障

ASP使用AppendChunk将二进制数据存储进数据库

大家知道一般情况下ASP插入一条数据采用的是INSERT INTO语句,先建立ADODB.Connection,然后直接Execute INSERT语句,简单方便,但是有时候我们需要插入二进制到数据库中那该怎么办呢?

首先大家想到的是建立长字符串比如像Access备注那样的数据库字段,然后将二进制进行编码,最后像往常一样INSERT语句插入,至于编码的办法有很多,比如Base64编码,更详细的可以参考这篇文章 《Base24、Base64编码的几种程序实现》 。但是这种办法有其性能和空间上的缺点,特别是对比较大的二进制数据进行处理时,不过一般我们存储到数据库的二进制文件不应该很大,否则会给数据库带来不必要的负担。

可能有读者发现,数据库比如Access有二进制(Binary)这个字段,这说明我们可以不用编码就能把二进制插入到数据库中,如果是这样的话,传统的INSERT INTO明显就不能胜任的,这时后我们就需要ADO的AppendChunk方法。

AppendChunk 说明:将数据追加到大型文本、二进制数据 Field 或 Parameter 对象。 语法:object.AppendChunk Data 参数: object Field 或 Parameter 对象 Data 变体型,包含追加到对象中的数据。

相应的,有AppendChunk将二进制存储进数据库,就有GetChunk将二进制读取出来,MSDN有个VB的例子很好的演示了这两个方法,参见 《AppendChunk and GetChunk Methods Example (VB)》

要使用这两个方法就必须创建ADODB.Recordset记录集,记录集在ASP中扮演很重要的角色,刚开始学习ASP时很多讲解都是和记录集有关的,但是其对于简单的SQL操作还是略显麻烦,所以对于简单的SQL操作,在避免SQL注入攻击的前提下还是直接Execute SQL吧。

最后给出个简单的示例:

<%
' conn变量为打开的ADODB.Connection数据库连接对象
' MyBinaryData 为要存储的二进制数据
Set rs = Server.CreateObject("ADODB.Recordset") 
rs.Open "SELECT * FROM pic where id is null",conn,1,3 
rs.AddNew
rs("img").AppendChunk MyBinaryData 
rs.Update 
rs.Close 
set rs=Nothing
%>
Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • asp
  • 二进制数据
  • adodb

VB/VBS/JS/ASP的StringBuilder实现

Visual Basic版本

vbAccelerator的Steve McMahon给我们提供了一个好用的cStringBuilder类,便于我们实现StringBuilder的功能,据作者讲添加10,000次类似于"http://vbaccelerator.com/"这样字符串,标准VB方式需要34秒,而使用Steve McMahon的cStringBuilder类只需要0.35秒。效率和速度还是相当不错的。

这个类的使用方式及下载可以访问其 项目主页

JavaScript版本

虽然JS不像C#那样自带有StringBuilder方法,但是我们可以变通一下,从而达到StringBuilder的效果,其实我们可以使用内置数组(array),然后将字符串push进array中,然后通过数组的join办法,一次性组合成新字符串。

这里有个 来自CodeProject的示例

// Initializes a new instance
// of the StringBuilder class
// and appends the given value
// if supplied
function StringBuilder(value) {
    this.strings = new Array("");
    this.append(value);
}

// Appends the given value
// to the end of this instance.
StringBuilder.prototype
  .append = function (value) {
    if (value) {
    this.strings.push(value);
    }
}

// Clears the string buffer
StringBuilder.prototype
  .clear = function () {
    this.strings.length = 1;
}

// Converts this instance
// to a String.
StringBuilder.prototype
  .toString = function () {
    return this.strings.join("");
}

另外Ferreri Gabriele在 《Faster JavaScript StringBuilder》 提供了一个据说效率更高的版本,大家也可以看看。

ASP/VBScript版本

其实上面的JS代码是可以直接改写成ASP代码的,好吧,重点不在这里,对于深入研究过ASP的童鞋们来说, 《Improving String Handling Performance in ASP Applications》 这篇文章肯定看过。作者James Musson通过介绍几种字符串操作方式为我们展示了ASP(其实也可以说是VBScript)在字符串操作性能上的差异。很明显,旧式的字符串拼接速度已经远不能满足我们对大批量字符串处理的要求,所以我们需要StringBuilder,James Musson在文章中给出了VB的实现方式,对于ASP/VBScript的实现我们还是看下 《Classic ASP String Builder Class》 这篇文章,核心代码如下:

Posted in:
  • 前端开发与用户体验
  • 网络编程与数据库
  • VBScript/JavaScript/Python
  • Web开发及相关
  • 系统应用程序开发
Tagged
  • stringbuilder
  • 字符串

© Wang Ye / 王 晔. All rights reserved.