Friday, October 10, 2008

MIDlet 在索爱手机上安装失败

最近在工作中,发现一部分索爱 (SonyEricsson) 手机,在安装 MIDlet 时发生“Downloading failed”错误。具体情况发生在手机通过 OTA 安装 MIDlet,Jar 文件下载完毕并开始安装后,系统询问是否允许应用程序自动启动,以及是否允许应用程序收发短信,接下来就出现“Downloading failed”。

在出现此问题时,使用的是 Orange France 的 SIM 卡,考虑到 GPRS 漫游可能会带来的问题,我们改用中国移动的 SIM 卡,则安装正常。看来和 SIM 卡有关系。但同时,在索爱手机上无法安装的 Orange France 的 SIM 卡,在其它一些索爱手机以及所有 NOKIA 手机上都能正确安装,所以并不是由 SIM 卡本身 GPRS 漫游引起的。

几个星期以来,一直被这个问题困扰,百思不得其解。今天修改一个关于 PushRegistry 的 bug,突然想起来可能和 PushRegistry 有关,又重新 Google 了一番,发现了索爱官方论坛上的这个帖子:

https://developer.sonyericsson.com/thread/17306

帖子的作者遇到和我们完全一致的问题,而最终的解决办法,由索爱的技术人员给出了答案。

这个无法安装的错误,确实和 PushRegistry 有关系。如果把 JAD 中“MIDlet-Push-*”的属性去掉,则可以正常安装。但导致出问题的最终原因,是手机短信选项设置中存在没有值得空选项,如“Service center”、“Message type”、“Validity period”。SIM 卡通常都会为这些选项自动设置,但如果某一个选项没有设置,成为空值,则会导致上述情况。

我仔细查看了我们有问题的手机,所有手机上的“Validity period”都为空。设置成“Network maximum”后,MIDlet 安装和 PushRegistry 注册就完全正常了。

另外,我们发现有问题的手机包括 K700、K500、W800、S700、K600 等,多为 JP-3、JP-5 平台的手机。

Labels: , , ,

Tuesday, September 23, 2008

MIDlet 在 NOKIA 手机上安装失败

这两天发现一个奇怪的问题,就是 MIDlet 在 NOKIA 6680 上无法安装。在 Jar 下载完成后,会显示“Unable to install. Not enough memory!”而安装之前手机刚刚执行过出厂复位操作,机身空余存储空间约 7MB,因此,安装失败不可能是装不下 MIDlet 的内容而导致的。

经过反复研究,终于发现问题出在 Jad 文件属性 MIDlet-Data-Size 上。这个属性是 MIDlet 用来告诉手机,该应用程序将需要多少 RMS 存储空间。由于 NOKIA 6680 的 RMS 容量,实测有 7128 KB,和机身的空余存储空间相等,也就是说理论上手机能装多少,MIDlet 的 RMS 就能装多少,因此应用程序的 Jad 里头,MIDlet-Data-Size 设置的值是 133072,也就是 128KB。

经过反复修改 Jad 文件里 MIDlet-Data-Size 的值,发现允许的最大值为 65536,也就是 64KB。任何超过这个值的应用程序,在安装时手机都会拒绝。

同样的问题在 NOKIA 6131 上也同样存在。如果有其它手机也有类似问题,以后会随时更新。

Labels: , , ,

Friday, September 05, 2008

测试手机的 User-Agent

由于最近工作中需要得到一些手机的 User-Agent 以及 X-Wap-Profile 两个 HTTP 头的值,于是写了个简单的 PHP 程序,检测 HTTP 头,输出到 Response,然后放到网站上,让手机用 WAP 浏览器打开查看。

开始这个程序只是简单的输出纯文本,结果是 NOKIA、Sony Ericsson 以及 Samsung 手机都能正确读出,而 Motorola 却不行(实际测试过程中用的是 Motorola RAZR V3i),仅显示白页。

后来把程序改成输出标准 WML 页面,HTTP 头的 Content-Type 设置成 application/vnd.wap.xhtml+xml,NOKIA、Sony Ericsson 以及 Samsung 仍然能够正确显示而 Motorola 还是不合作。

最后找到答案,Content-Type 要设置成“text/vnd.wap.wml”,这下 Motorola 终于老实了…… 可是结果中只有 User-Agent,没有 X-Wap-Profile。

另外,在用中国移动的 SIM 卡测试的时候,发现 HTTP 请求中并没有 User-Agent 和 X-Wap-Profile 这两个头,而有个奇怪的
VIA: HTTP/1.1 SCCD-PS-WAP-GW02 (infoX-WISG, Huawei Technologies)
开始以为是手机的问题,但看到“Huawei”字样,觉得很蹊跷,后来换成 Orange France 的 SIM 卡,则一切正常了。

看来拦截 HTTP 请求是中国运营商的“优良传统”啊!

Labels: , , , ,

Tuesday, September 02, 2008

修改 IE 默认 HTML 查看器

众所周知在 Internet Explorer 打开的网页中,点鼠标右键,选“查看源代码”,即可查看所打开的网页的HTML 源代码,但通常系统会用 Notepad 打开,如果要仔细查看源代码内容,Notepad 可能显得不那么方便。修改一下注册表键值,即可用自己顺手的文本编辑器打开。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name]

将 (default) 的值改成编辑器的路径即可,例如用 UltraeEdit,可以写:
"C:\Program Files\UltraEdit\uedit32.exe"

如果没有这个键,按照路径创建即可。

我一直用 EditPlus,要将 EditPlus 关联到 IE,可以直接在设置里打开这个选项。具体的:

Tools / Preference... / General / Use EditPlus in Internet Explorer 5

这个方法应该适用于 Windows 所有的版本,已知在 Windows 98 / Me / 2000 / XP 上有效。

Labels: , , ,

Monday, September 01, 2008

用 Cobertura 测量测试覆盖率

单元测试相信大家都不陌生,测试先行编程(Test-First Programming)和测试驱动也不是什么新概念了。测试改进了代码质量,但这也只是针对实际测试到的那部分代码而言的。您需要有一个工具告诉您程序的哪些部分没有测试到,这样就可以针对这些部分编写测试代码并找出更多 bug。

现在,有 Cobertura (cobertura 在西班牙语是“覆盖”的意思)这个免费的 GPL 工具在 Java 领域来完成这个任务。Cobertura 通过在执行测试时,用额外的语句记录哪些行被测试到、哪些行没有被测试到,通过这种方式来度量字节码,以便对测试进行监视。然后它生成一个 HTML 或者 XML 格式的报告,指出代码中的哪些包、哪些类、哪些方法和哪些行没有测试到。可以针对这些特定的区域编写更多的测试代码,以发现所有隐藏的 bug。

先来看看生成报告的样子吧:

Cobertura 报告示例(点击放大)


可以看到报告列出了每个包的行覆盖率、分支覆盖率以及复杂度。点击进去,可以看到针对这个包里头每个类的报告,进而每行代码的测试情况,以及被测试到的次数。这里是 Cobertura 官方网站上给出的一个报告的 Sample。

在使用上,Cobertura 支持命令行操作,也可以结合到 Ant 任务。当然首先要定义任务:
<property name="cobertura.dir" value="C:/javastuff/cobertura" />

<path id="cobertura.classpath">
<fileset dir="${cobertura.dir}">
<include name="cobertura.jar" />
<include name="lib/**/*.jar" />
</fileset>
</path>

<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

然后,就可以用 cobertura-instrument 任务来统计测试目标:
<delete file="cobertura.ser" />

<cobertura-instrument todir="${instrumented.dir}">
<ignore regex="org.apache.log4j.*" />
<fileset dir="${classes.dir}">
<include name="**/*.class" />
<exclude name="**/*Test.class" />
</fileset>
<fileset dir="${guiclasses.dir}">
<include name="**/*.class" />
<exclude name="**/*Test.class" />
</fileset>
<fileset dir="${jars.dir}">
<include name="my-simple-plugin.jar" />
</fileset>
</cobertura-instrument>

之后,运行 Junit 测试(重要的部分用蓝色标出):
<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
<!--
指定覆盖率统计的数据文件名,以下为默认值
-->
<sysproperty key="net.sourceforge.cobertura.datafile"
file="${basedir}/cobertura.ser" />


<!--
注意 classpath 的顺序:被处理过的 class 路径在为处理的
class 路径之前。这很重要!
-->
<classpath location="${instrumented.dir}" />
<classpath location="${classes.dir}" />

<!--
被处理过的 class 会在 Cobertura 运行时引用 Cobertura
的类库,因此这些类也必须在我们的 classpath 中。
-->
<classpath refid="cobertura_classpath" />

<formatter type="xml" />
<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
<batchtest todir="${reports.xml.dir}" unless="testcase">
<fileset dir="${src.dir}">
<include name="**/*Test.java" />
</fileset>
</batchtest>
</junit>

最后,我们可以用 cobertura-report 任务来输出 HTML 格式或者 XML 格式的报告:
<cobertura-report format="html" destdir="${coveragereport.dir}"
srcdir="${src.dir}" />

也可以有更复杂的要求:
<cobertura-report format="html" destdir="${coveragereport.dir}" >
<fileset dir="${src.dir}">
<include name="**/*.java" />
<exclude name="**/*Stub.java" />
</fileset>
<fileset dir="${guisrc.dir}">
<include name="**/*.java" />
<exclude name="**/*RB.java" />
</fileset>
</cobertura-report>

另外,还可以用 cobertura-check 任务来检查统计出来的覆盖率是否达到预先的期望,如果没有达到则使得整个 Ant 任务失败;以及 cobertura-merge 任务用来合并多个测试的统计数据文件。

要特别注意的是,在这个 Ant 任务中,一定要保证数据文件 cobertura.ser 每次都被更新,并且在 instrument 的任务和后面做 Junit 的过程中,两者的路径一致,否则可能导致在输出的报告中,所有的测试结果都是 100% 或者 0%。

参考资料

Labels: , ,

Tuesday, February 13, 2007

MySQL 的自动断开连接问题

最近发现 MySQL 会自动断开 IDLE 时间超过 8 小时的数据库连接,从而导致一些基于数据库连接的应用程序,特别是 WEB 应用程序出错。

有两个办法可以解决这个问题:

第一个办法是修改 MySQL 的配置参数。这个参数的名称是 wait_timeout,其默认值为 28800(单位秒),刚好就是 8 小时。其意义为关闭一个连接之前在这个连接上等到行动的秒数,也就是说,如果一个连接闲置超过这个选项所设置的秒数,MySQL 会主动断开这个连接。

有实践表明,没有办法把这个值设置成无限大,即永久。因此如果你无法保证你的应用程序必定在设定的秒数内至少有一次操作,那么最好用第二个方法解决这个问题。

第二个办法是如下修改 JDBC 连接的 URL:
jdbc:mysql://hostaddress:3306/schemaname?autoReconnect=true

添加 autoReconnect=true 这个参数,即能解决这个问题。

另外,对于 Java 的应用程序,据说第三方的数据库连接池应用 Proxool 能够对断开的数据库连接发起自动重连,不过我没有用过,有兴趣的朋友可以尝试一下。

Labels: , , ,

Monday, January 08, 2007

不再厌恶中文版 Windows XP

一直很厌恶简体中文版的 Windows XP,而尽可能的用英文版,不是我为了炫耀英文——其实刚开始使用英文版的时候真的有种找不到北的感觉——之所以会厌恶,完全是因为字体!

厌恶 Windows 系统“宋体”的默认西文字体已经有年头了,我是不会在任何场合下使用其对应的西文字体的,只要有可能我就会用 Tahoma 或者 Verdana 来替代。诚然,宋体在 12px 以及 14px 下作为正文字体是非常合适的,也很入眼,但是在比 12px 更小或者比 14px 更大的场合,这款字体就不那么好看了,加上它没有很好的支持 Anti-Aliasing 和 ClearType,因此在 Windows Vista 中才会替换成了以前说过的“微软雅黑”。

通常中文版的 Windows XP 装好后,大部分的字体都可以通过“显示属性”对话框中“外观”选项卡下的“高级”选项对话框来设置。然而,登录界面以及登录后屏幕左下角“开始”按钮上偌大的“开始”两个字,可以说要多难看有多难看。经过一番 Google 和琢磨,现在终于找到办法来将这两处的字体换掉。这样一来,我就可以比价舒服的用中文版的 Windows XP了。以下是修改方法:

修改登录界面字体
登录界面是由 C:\Windows\System32\logonui.exe 来控制的,其所有的内容和资源都被编译打包到这个可执行文件里头。为了能够改变它,我们需要用到 ResHacker 这款小工具(点击这里下载,版本 3.4.0.79,若需更新版本请自行 Google)。

先将 C:\Windows\System32\logonui.exe 文件备份,然后用 ResHacker 打开这个文件,可以看到左边列出了一些可展开的树状目录。打开“String Table”,这个目录下为程序需要用到的字符串。打开第一个名字为“1”的目录,再点击“2052”项,会发现右边的窗口列出了一些字符串,注意到标号为 1, 2 和 3 的文字即是“宋体”,这就是控制字体的地方了。将这三项改成你要设置的字体的名称就可以了,比如“微软雅黑”。注意设置之前一定要确保目标字体存在,建议先到“控制面板”的“字体”管理中确认。设置完了以后,要点击一下右边窗口上访的“Compile Script”按钮。

另外,和“1”目录并列的“4”目录下还有一个“宋体”字符串项,也改成你要的字体吧。修改完成后,选择菜单中“File -> Save”保存,然后退出即可。

注意,通常修改 Windows 的系统文件,人们一般都会建议到安全模式的 DOS 命令方式下去替换,这样可以避免因为文件正在被使用而无法写入,或者修改后导致正在运行的系统出现问题。不过这个 logonui.exe 可以无须这么做,在 Windows 正常运行过程中是可以被写入的,只是被写入后,Windows 会立即报告发现文件被修改为不可识别的版本,并建议用 Windows 安装盘修复。这时取消掉这个建议,并确认使用目前的无法识别版本就可以了。

修改并保存后,立即注销一下,或者用切换用户的命令(快捷键 Win+L)回到登录界面,发现修改已经生效了。以下是我修改后的截图(点击可查看大图)。

修改过字体后的登录界面
ResHacker 不但可以修改 exe 文件中的字符串,还可以修改 Bitmap 图片以及程序中各元素出现的位置坐标等,通过这一点完全可以自定义出截然不同的登录界面来。各位有兴趣可以自行研究。注销和关闭 Windows 的对话框也可以修改,分别对应 Shell32.dll 和 msgina.dll。修改之前记得一定要先把原来的文件备份好,以防出现不测。

修改“开始”按钮字体
“开始”菜单和任务栏所对应的应用程序为 C:\Windows\Explorer.exe,如果要将“开始”这两个字替换成别的内容或者修改别的相关的字符串,可以用上面的办法通过 ResHacker 打开这个文件(记得做好备份)。不过,控制字体的地方却不在这个文件中。要修改“开始”按钮这两个字的字体,需要修改注册表。

打开注册表的
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FontAssoc\Associated DefaultFonts

将 AssocSystemSwiss 改成你需要的字体名称即可。然后退出重新启动系统使得改动生效。

以下是我修改后“开始”按钮的效果:

更改过字体的“开始”按钮

Labels: , , , , ,

Tuesday, December 05, 2006

用微软雅黑代替宋体开启 ClearType UI

用 Microsoft Update 升级到了 Internet Exloporer 7,发现它默认开启了 ClearType,一时之间,觉得两眼昏花,半天才适应。不过由于中文的默认字体仍然是宋体/新宋体,而这个字条不支持 ClearType,因此会发现网页中西文部分是 Anti-Aliasing 的,但是中文部分仍然是默认状态。

其实很早之前就很羡慕 Mac 系统下简明漂亮的细黑中文字体,Windows 系统下的默认宋体的中文字体还算过得去,但是它的西文实在是无法入眼,因此通常我安装了中文版的 Windows 的第一件事情就是把系统界面的字体换成 Tahoma。

现在微软在新的 Windows Vista 中用“微软雅黑”字体代替了原来的宋体/新宋体,以便更好的支持中文的 ClearType 显示。将这个字体安装到 Windows XP 上,也就可以同样利用它实现中文的 ClearType 了。以下是应用前后的对比:

未使用 ClearType

使用 ClearType

使用 ClearType 后的 Google 搜索页

实现方法如下:

安装字体
下载“微软雅黑 (ver 5.00)”,解压后得到 msyh.ttf 和 msyhbd.ttf 两个文件,拷贝到 C:\Windows\Fonts 目录,字体即被安装。

应用在网页上
从 IE 中的菜单选项打开 Tools -> Internet Options -> General -> Apperance -> Fonts 对话框,在左边的 Webpage font 选择框中选 “微软雅黑”即可。Internet Options 对话框同样可以在控制面板中打开。

应用在系统 UI 上
在桌面单击右键,选择“属性 / Properties”,打开第四个标签“Appearance -> Effects...”,在打开的对话框第二个下拉菜单中选 ClearType,然后点 OK;同样是在 “Appearance” 标签,点右下角的“Advanced”,在弹出的对话框中,将 Item 下拉框中的所有项目全部过一遍,将所有可以改变字体的项目的字体改成“微软雅黑”(字号推荐 8pt),然后点 OK 退出即可。

微软雅黑默认的西文字体还算不错,只是感觉稍欠紧凑,不过比宋体/新宋体的默认西文字体好多了。

调节 ClearType
如果觉得显示的 ClearType 不够清晰,可以到微软网站 ClearType Tuner 在线调整,也可以下载安装 ClearType Tuner 的 Windows XP PowerToy 在控制面板中调整。

关闭 ClearType
如果觉得眼睛仍然无法适应 ClearType,在显示属性的对话设置中还原成 “Standard” 即可。对于 IE7,可以打开 Internet Options -> Advanced 标签,将 Multimedia 下的 “Always use ClearType for HTML” 前的复选框去掉即可在 IE 中关闭 ClearType。

Labels: , , , ,

Wednesday, November 15, 2006

Feeds of Blogger Beta

今天爬 Blogger Beta 的资料,发现 Blogger Beta 除了可以提供整站帖子、整站评论以及分帖子评论的 feed 以外,甚至可以按照单个的 label 来提供 feed,格式如下:
http://beta.blogger.com/feeds/blogID/posts/default/-/labelname

URL 中的 labelname 就是要订阅的 label,注意中间的“-”符号不能少!

另外,把其它的订阅地址的格式也一并写在这里:

订阅整站帖子全文:
http://beta.blogger.com/feeds/blogID/posts/full

订阅整站帖子默认,即按照 Blogger 的 Site Feed 设置选项:
http://beta.blogger.com/feeds/blogID/posts/default

订阅整站评论:
http://beta.blogger.com/feeds/blogID/comments/default

订阅单贴评论:
http://beta.blogger.com/feeds/blogID/postID/comments/default


Update on 2006/11/17:
对于 label 的 Feed,发现如果 labelname 中含有空格,则无法正确获取 Feed 内容,会出现 Blogger 的“We're sorry, but we were unable to complete your request.”报错页面,例如:
http://beta.blogger.com/feeds/blogID/posts/default/-/Knowledge Base

无论中间的空格是否被 urlencode 成 %20,都会出现这个情况。已经向 Blogger GData API 讨论组 提交了这个问题,不过至今仍未有任何回复。

Update on 2007/01/12:
这个问题在 Blogger GData API 的另一个讨论串中被再次提到,并被认定为一个 bug,可以通过这里来追踪。希望这个问题能够早日得到解决。

Labels: , , , ,

Saturday, November 11, 2006

Firefox 的 JavaScript 问题两则

今天发现页面上新加上的左列 Tag 在 Firefox 上显示不正确,在细察之下,发现 Firefox 在 JavaScript / CSS 上和 IE 不同之处:

问题 1. 类似 obj.style.height = imgObj.height 的语句无效。

即将一个 image 对象的高度值赋给另一个对象,用来修改其样式高度,这样做无效。

分析

要理解这个问题,首先要纠正思想上的一个误区。以上这个操作,其实并非是通常编程概念上的将一个 int 值赋给另一个 int 变量。这个语句的操作,实际上是把 imageObj.height 当作一个字符串,作为 obj 这个对象 CSS 中 height 的属性。

之前的一篇帖子说过,Firefox 对 CSS 的理解非常严格,任何表示大小的值,数字后面必须跟上单位,除非是 0。也就是说,height: 20 对于 Firefox 来讲不具有任何意义,必须写成 height: 20px 才会被接受。所以,在 JavaScript 中,为了让对 CSS 的 height 值的设置有效,所赋给的字符串也同样必须是数量加上单位。

解决

以上语句,应该写成:
obj.style.height = imgObj.height + 'px';


问题 2. Firefox 不支持 obj.innerText 属性。

如果把 obj.innerText alert() 出来,显示的值是 undefined

分析

Firefox 支持 innerHTML 属性却不支持 innerText,这一点实在是蹊跷。很多人建议用 innerHTML 来代替需要用 innerText 的场合,但是这显然并不总是适用。我们有时候只是要取得一个 Tag 中的文字信息而不需要 HTML 的标记。

解决

良好的替代办法是用 obj.textContent,这个属性的作用和 innerText 是相同的,名称不同而已。不过为了兼容性,我们还是需要在程序中区分一下当前环境支持哪种。以下方法可以帮助我们区分:
if (document.all) {
obj.innerText = "myText";
}
else {
obj.textContent = "myText";
}

以前我们讲过,Firefox 不支持 document.all 这个 Collection,我们需要用 getElementById() 方法来替代,所以通过判断是否有 document.all,就能区分当前环境。

Labels: , , , ,

Friday, November 10, 2006

升级到 Blogger Beta 后的问题

昨天收到 Blogger 的升级邀请,将我的 Blogger 帐号升级为了新推出的 Blogger Beta。由于升级的过程中,没有对原有模版中的内容进行更新,也没有自动重新重建页面,因此今天在重新修正了模版文件并将整个站点重建。在这个过程中还是发现了一些问题:
  • 模版中的中文内容变成了乱码
  • 在转换到 Blogger Beta 过后,发现原模版中所有的中文内容全部变成了乱码。看来正如 Blogger Beta 的 Known Issues 所说,Blogger Beta 目前仅支持英文

    幸亏模版有备份,阿门……

  • 模版标签 <$BlogOwnerAboutMe$> 失效
  • 发现原有模版中的 <$BlogOwnerAboutMe$> 在构建页面时被替换成了空字符串,也就是说现在在模版上使用这个标签显示不出任何内容。

    不过与此同时,<<$BlogMemberProfile$> 标签输出的内容中仍然正确包含了 About Me 的信息。我想这应该是个 bug,而且已经通过 Blogger 的反馈系统提交了。只是没有回应…… 没有办反,暂时只有用这个标签代替。其输出的内容与我自己写的几乎完全相同,我之所以原来没有用,是因为我不需要 About Me 这几个字,而是用图片替换掉了。现在只好在页面上用 JavaScript 来取掉这几个字。

  • 发布时不再提供 rss.xml 文件
  • 老版本的 Blogger 支持 Atom 0.3 和 RSS 2.0 两种格式的 Feed,在发布时分别对应 FTP 发布根目录下的 atom.xml 和 rss.xml,现在看来仅发布了 atom.xml 而没了 rss.xml。

    与此同时,Atom Feed 的版本升级为 1.0。我是通过 FeedBurner 来发布我的 Feed 地址的。不过,升级过后,通过 Maxthon 无论直接通过 atom.xml 还是 FeedBurner 的地址,都会发生“无法解析 Feed 的格式”错误。除此之外,Google Reader、FireFox 2.0 的订阅都没有问题。看样子这个只能怪 Maxthon 了。
    关于新版的 Site Feed 设置,比较奇怪的一点是 Blogger 除了提供对 Post 的订阅以外,还提供了对所有 Comments 以及单篇 Post 的 Comments 的订阅,然而发布到 FTP 上的所有文件中,和 Site Feed 相关的只有 atom.xml 这么一个文件,所以无从得知如何实现对 Comments 的订阅。或许是要使用 BlogSpot 的用户才有这个功能?

    Update on 2006/11/14:
    Blogger Help 上的一个条目说:RSS 格式的 Feed 只在 Blogger Pro 提供,如果非 Pro 用户想要使用 RSS 格式的 Feed,请使用 FeedBurner

    另外,现在知道了订阅整站 Comment 和分单帖子 Comment 的地址,它们分别是
    http://beta.blogger.com/feeds/blogID/comments/default

    http://beta.blogger.com/feeds/blogID/postID/comments/default

    Update on 2006/11/16:
    似乎 rss.xml 的发布又恢复了。现在发布新帖的时候,发布文件列表中有这个文件。Known Issues for New Bloggers 上面说明了该问题的情况。

  • 无法特别为标签页面定制模版内容
  • 老版本的 Blogger 模版标签中有几个条件标签可以分别对 IndexPage、ItemPage 和 ArchivePage 进行内容的定制,因为这几个页面的元素显然是不同的。现在多了个 Label 页面,不过却没有特别提供一个 LabelPage 的标签来方便模版条件输出。

    之所以提这个功能,是因为它最大的好处是可以在 Label Page 上显示当前这个页面的内容属于哪个 Label,这样不致于让读者产生困惑。现在的 Label Page 和 Index Page 除了帖子不同外,其它格式基本上完全一样。

  • 可能出现读者访问速度非常缓慢且无法发表评论
  • 当然这个不能怪 Blogger。不过最近大多数人都无法访问 beta.blogger.com 这个域名,对升级后的 Blogger 确实会产生很大的影响。

    首先模版中有多处需要引用 beta.blogger.com 站点上的资源,而且这些资源通常写在网页头中。读者必须要等待浏览器判断这些资源访问超时后才会继续显示后面正常的网页内容,看到的现象就是,网页除了窗口标题出现以外,内容全白,大约等半分钟后网页内容出现。即使 CSS 和模版图片全部用自己的,也无法避免需要引用 beta.blogger.com 上的 JavaScript 来实现 Backlinks 以及一些 Post Control 的功能。除非你完全不用这两个功能,则可以基本上避免引用 beta.blogger.com 站点而导致页面打开缓慢。

    另外,众所周知对 Blogger 的帖子发表评论需要连接到 Blogger 站点上发布。这个过程实际上是 Blogger 在收到新的内容后对相关页面的重建过程。Blogger Beta 的 Blog 站点,读者自然要到 beta.blogger.com 上去发表评论,这个站点打不开,所以不能评论。

    虽然我们可以通过在 C:\Windows\System32\Drivers\etc\host 文件中添加
    72.14.219.190 beta.blogger.com

    这样一行内容来实现访问该站点,但是这仅能方便自己而已,你无法要求自己 blog 所有的读者在发表评论之前都这么做。因此,请所有 Blogger 的用户在升级之前三思!

Labels: , , ,

Wednesday, November 08, 2006

让 TortoiseSVN 记住密码

用 TortoiseSVN 维护工程,每天都要输入无数次密码,有时候一次操作就要输入数次密码,实在是烦人。多方搜寻让 TortoiseSVN 记住密码的办法,但是对我目前的情况都无效,我想大概是因为用了 svn+ssh 协议的原因。

不过虽然不能让 TortoiseSVN 记住密码,但是却能够让它自动输入密码,一样可以避免频繁输入密码的麻烦,方法如下:

1. 在 Explorer 右键菜单中:TortoiseSVN -> Settings.
2. 在弹出对话框的左侧面板中选择 Network,在右边界面下方的 SSH Client 中填写:
[TortoiseSVN Install Path]\bin\TortoisePlink.exe -pw [Your Password]

例如,你的 TortoiseSVN 安装在默认目录 C:\Program Files\TortoiseSVN 下,密码为 abc123,那么以上的内容就应该为:
C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe -pw abc123

3. 点击 OK.

然后,以后在进行 SVN 操作的时候,就不再弹出要求输入密码的窗口了。

Labels: ,

Thursday, October 26, 2006

Blogger 网页显示空白的问题

之前一直有朋友声称我的 Blog 访问不了,打开来是空白。这个问题我自己也经常遇到,原因是网页编码被误判成 GB2312,而不是正确的 UTF-8,于是 IE 无法识别,所以显示成空白。这个问题据说在 Firefox 上并不存在,但是为什么会被误判我也一直不清楚。

现在原因应该清楚了,因为在文件头中,声明网页内容编码的那一行标记
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

被放到了 <title> ... </title> 之后,而刚好 title 中有中文,所以 IE 在没有获得指定的编码类型时,用了默认的 GB2312。

解决这个问题还是比较容易:编辑 Blogger 的模版,把“<$BlogMetaData$>”放到“<title><$BlogPageTitle$></title>”的前面,然后重建一下,就不会出现这个问题了。

Labels: , , , ,

Tuesday, September 26, 2006

奇怪的 TP-LINK 无线网卡驱动

由于新买的 ASUS A6Jc 笔记本没有自带无线网卡,于是我另外购买了一块 TP-LINK 的 TL-WN310G 无线网卡。安装以后出现一些问题,现总结如下:

现象
安装完驱动重新启动后,Windows XP 由其特有的欢迎登录界面变成经典的窗口登录模式。切在控制面板“用户设置”中无法改回欢迎界面登录模式,会提示“近期安装的应用程序屏蔽了欢迎界面和快速用户切换。您需要卸载该应用程序来恢复这项特性。以下名称或许能帮助您识别该应用程序:athgina.dll”。

原因
驱动程序安装时会用其自带的 athgina.dll 文件取代 Windows XP 自身的 msgina.dll 并写入注册表从而改变 GINA 的行为。

GINA 的全称为“Graphical Identification and Authentication”——图形化识别和验证。它是几个动态数据库文件,被 winlogon.exe 所调用,为其提供能够对用户身份进行识别和验证的函数,并将用户的帐号和密码反馈给 winlogon.exe。在登录过程中,“欢迎屏幕”和“登录对话框”就是 GINA 显示的。

无线网卡的驱动程序安装自己的动态链接库来控制 GINA,推测可能是为了获取用户登录的用户名密码以便在登录有身份验证的无线网络时使用。

解决办法
如果只是使用不加安全验证的无线网络,实际上是永不到这个动态链接库的。打开注册表,找到键值
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL,其值应该就是 athgina.dll,将其删掉,就可以立即到控制面板里重新设置欢迎登录界面和用户快速切换。实际上,Windows 默认是没有这个键值的,而只要存在这个键值,欢迎登录界面和用户快速切换功能就会被屏蔽,哪怕其值是 Windows 自身的 msgina.dll。

如果需要使用 WPA + PEAP(MSCHAP v2) 安全验证的无线网络,似乎只有放弃 Windows XP 的欢迎登录机界面和用户快速切换功能了。去掉以上键值后,不管是用 Windows 自带的无线忘了连接向导还是 TP-LINK 驱动盘提供的无线网络连接程序都无法正确建立无线连接,而把这个键值重新加上即可。

Update on 2006/10/30:
今天又把笔记本带到公司,注册表中没有 GinaDLL 这一项,但是正常的连接到了公司的无线网络。看来这个东西并不是必要的。

Labels: , ,

Tuesday, November 22, 2005

SQL Server 2000 数据库日志

SQL Server 2000 数据库对数据的事务会记录日志,并且能够根据日志回滚数据库操作,这个想必大家都知道。不过,如果日志变得很大,或者达到了限定的日志文件上限,就会对数据库产生较大的影响。

先来看看 SQL Server 2000 数据库日志文件的两种设定方式。


右下角可以设置日志文件的大小,上面一个选项是可以无限增大,后面一个选项是可以指定一个允许的最大值。数据库在运行过程中,这个日志文件会不断的增大,增大的速度视提供服务的压力而定。当这个文件达到预设的最大值时,任何数据库操作都会失败,会提示“无法写入日志”之类的报错信息;也可以允许这个文件无限增大,不过,当文件大到一定的程度,写入的效率会很低。笔者曾经遇到这个文件涨到 2.5 GB,在查明原因以前,整个系统莫名其妙效率降低很多,最后查到瓶颈在数据库。各种优化手段用上未果,最后发现日志是设置成无限增长的。把日志删除并把日志文件缩减后,问题解决。

因此,无论是让文件无限增长,还是设置文件最大值,都不可避免的遇到日志的删除和缩减问题。要缩减数据库日志,可以用查询分析工具 (SQL Query Analyzer) 运行如下命令:
DUMP TRANSACTION [db_name] WITH NO_LOG

然后如下图用“收缩数据库”(Shrink Database) 工具将删除后留下的空白空间收回。具体的:




然后选择“Files...”:


在“Database file”中选择日志对应的文件,一般是“[db_name]_Log”,“Shrink action”选择的第 4 项,将缩减的值设定为目前允许的最小值,然后点击“OK”即可。

Labels: , ,

Thursday, November 17, 2005

Tomcat 5.5 无法编译 Java 1.5 语法 JSP

Apache Jakarta Tomcat 5.5.x (笔者在 5.5.9 和 5.5.12 下遇到同样问题) 在安装过后,用默认配置,无法自动编译带有 Java 1.5 语法的 JSP,经过多方求证,问题是由其自带的 eclipse 编译器造成的。文档 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jasper-howto.html 中说:
The Java compiler from Eclipse JDT in included as the default compiler. It is an advanced Java compiler which will load all dependencies from the Tomcat class loader, which will help tremendously when compiling on large installations with tens of JARs. On fast servers, this will allow sub-second recompilation cycles for even large JSP pages. This new compiler will be updated to support the Java 5 syntax as soon as possible.

Apache Ant, which was used in previous Tomcat releases, can be used instead instead of the new compiler by simply removing the common/lib/jasper-compiler-jdt.jar file, and placing the ant.jar file from the latest Ant distribution in the common/lib folder. If you do this, you also need to use the "javac" argument to catalina.sh.

由此可见,这个编译器 common/lib/jasper-compiler-jdt.jar 是不支持 Java 5 语法的,而 Apache Ant 工程中的编译器可以替代它解决这个问题,具体方法如下:
  • 将/common/lib/common/lib/jasper-compiler-jdt.jar 删除
  • 将 ant-1.6.x 发布的 ant.jar 拷贝到 /common/lib/
  • 修改 /conf/web.xml 文件,找到并修改如下内容,增加 compilerSourceVM 和 compilerTargetVM 两个设置:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

<init-param>
<param-name>compilerSourceVM</param-name>
<param-value>1.5</param-value>
</init-param>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.5</param-value>
</init-param>

<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

Labels: , , , ,