December 1st, 2007
Google的服务一向以稳定而著称,但我却看到了gmail在打盹。
刚才打开浏览器,通过Gmail Notifier 插件登录gmail。其实我以前保存了密码,但它却提示我验证失败,于是我输入密码重新登录。一串提示性的文字一闪而过,大意是说我的网速慢之类的。此后本来应该显示熟悉的gmail首页,但是紧接着却出现了白底黑字的javascript代码,还以为是我搞错了,重新打开一个标签登录,依然如此。

具体代码如下(为了便于阅读,我删除了其中的空行):
var BrowserSupport_ = {
IsBrowserSupported : function() {
var agt = navigator.userAgent.toLowerCase();
var is_op = (agt.indexOf("opera") != -1);
var is_ie = (agt.indexOf("msie") != -1) && document.all && !is_op;
var is_ie5 = (agt.indexOf("msie 5") != -1) && document.all && !is_op;
var is_mac = (agt.indexOf("mac") != -1);
var is_gk = (agt.indexOf("gecko") != -1);
var is_sf = (agt.indexOf("safari") != -1);
if (is_ie && !is_op && !is_mac) {
if (agt.indexOf("palmsource") != -1 ||
agt.indexOf("regking") != -1 ||
agt.indexOf("windows ce") != -1 ||
agt.indexOf("j2me") != -1 ||
agt.indexOf("avantgo") != -1 ||
agt.indexOf(" stb") != -1) {
return false;
}
var v = BrowserSupport_.GetFollowingFloat(agt, "msie ");
if (v != null) {
return (v >= 5.5);
}
}
if (is_gk && !is_sf) {
var v = BrowserSupport_.GetFollowingFloat(agt, "rv:");
if (v != null) {
return (v >= 1.4);
} else {
v = BrowserSupport_.GetFollowingFloat(agt, "galeon/");
if (v != null) {
return (v >= 1.3);
}
}
}
if (is_sf) {
if (agt.indexOf("rv:3.14.15.92.65") != -1) {
return false;
}
var v = BrowserSupport_.GetFollowingFloat(agt, "applewebkit/");
if (v != null) {
return (v >= 312);
}
}
if (is_op) {
if (agt.indexOf("sony/com1") != -1) {
return false;
}
var v = BrowserSupport_.GetFollowingFloat(agt, "opera ");
if (v == null) {
v = BrowserSupport_.GetFollowingFloat(agt, "opera/");
}
if (v != null) {
return (v >= 8.0);
}
}
if (agt.indexOf("pda; sony/com2") != -1) {
return true;
}
return false;
},
GetFollowingFloat : function(str, pfx) {
var i = str.indexOf(pfx);
if (i != -1) {
var v = parseFloat(str.substring(i + pfx.length));
if (!isNaN(v)) {
return v;
}
}
return null;
},
tz_path : ';path=/'
};
if (window.location.href.toLowerCase().indexOf('google.com') > 0) {
BrowserSupport_.tz_path += ';domain=.google.com';
}
document.cookie = "TZ=" + (new Date()).getTimezoneOffset() +
BrowserSupport_.tz_path;
var is_browser_supported = BrowserSupport_.IsBrowserSupported();
仔细看了一下页面上的代码,主要是对域名、时区以及浏览器的兼容性做判断的。值得一提的是它还对pda、sony/com2、safari以及opera等客户端作了专门的判断。
用工具查看页面的http信息,如下:
Etag: "hyuaanj8ksp6"
Last-Modified: Fri, 05 Sep 2003 02:11:15 GMT
Content-Type: text/javascript; charset=UTF-8
Cache-Control: private
Expires: Fri, 21 Dec 2007 15:12:16 GMT
Content-Encoding: gzip
Content-Length: 684
Server: GFE/1.3
Date: Sat, 01 Dec 2007 15:12:16 GMT
200 OK
与此同时,我访问了google提供的企业邮局,则显示正常。
Posted in Web服务 | LAMP | No Comments »
November 22nd, 2007
最近碰到一件奇怪的事情,使用gmail收到来自雅虎信箱(yahoo.com.cn)回复的邮件时,标题总是或多或少出现乱码。
于是我注册一个雅虎信箱,分别给gmail和公司邮箱(使用客户端sylpheed收信)发送邮件。如果标题超过20个中文,收到的邮件标题确实会显示部分乱码。有意思的是两者显示乱码的方式还不一样:gmail将第20个中文后的字符显示为乱码;sylpheed则将第21、22个中文显示为乱码。
smtp协议似乎并没有对邮件标题长度做限制,不知雅虎信箱为何对标题的第40个字符这么敏感。
btw,在网上搜了一下,发现雅虎邮箱在年初也曾出现过乱码。
Posted in Web服务 | LAMP | No Comments »
October 30th, 2007
由于使用了退格(backspace)、覆盖(substitute)、垂直方向(vertical tab)的tab等控制字符,很难直接读到mplayer/ffmpeg运行时的信息。其实按字符读取并过滤其中的控制字符,便可以还原其输出信息的“真面目“了。以下是在php中的实现:
< ?php
$src = '/path/to/input.mp3';
$dst = '/path/to/output.flv';
$cmd = '/usr/local/bin/ffmpeg -i "%s" -acodec libmp3lame -f flv -y "%s" 2>&1 ‘;
$cmd = sprintf($cmd, $src, $dst);
$handle = popen($cmd, ‘r’);
while(!feof($handle)) {
// 按字符读取
$charset = fgetc($fd);
// 如果是垂直tab符号
if ($ord($charset) == 13) {
printf(”%sn”, $line);
$line = ‘’;
continue;
}
// 如果是退格或覆盖符号
if (ord($charset) == 10 || ord($charset) == 32) {
continue;
}
$line .= $charset;
}
pclose($handle);
?>
ps: 看不出wordpress有时也很bt, 昨天这篇文章发了半天都返回503错误,后来发现是文章里popen一词导致的,我只好用字符p的html实体p来代替了
Posted in Web服务 | LAMP | 2 Comments »
July 31st, 2007
旧mysql版本为4.0.22,新数据库版本为5.0.37,旧库中使用的字符集为utf8,phpmyadmin版本均为2.9.11,具体过程如下:
先在使用phpmyadmin从虚拟主机mysql4.0.22的数据以sql语句方式导出,然后在本地mysql5.0.37上同样使用phpmyadmin导入,发现有如下地方需要修改
| old |
new |
备注 |
| `type` enum(’原创’,'转载’) NOT NULL default ‘转载’, |
`type` enum(’原创’,'转载’) NOT NULL, |
如果enum的值为英文,则无需修改 |
| ) TYPE=MyISAM AUTO_INCREMENT=185 ; |
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=185 ; |
|
| ) TYPE=HEAP MAX_ROWS=500; |
) TYPE=HEAP MAX_ROWS=500; |
|
Posted in Web服务 | LAMP | No Comments »
July 31st, 2007
不考虑路过的话,我就去过三个:

create your own China map
有点儿对不起观众,不过还好,panrui2006同学补充道,左边那个红颜色是最大的:)
Posted in 个人爱好 | Interest, 生活点滴 | Life | 4 Comments »
July 20th, 2007
房子里的网络总时不稳定,昨天晚上下班后在电脑里看了一会Linux How-to
。谁知晚上就梦见大学里的英语老师啦,大致就是在课堂上老师让英语单词……,明明在睡醒前那一会记忆忧新,可惜现在却怎么也想不清楚啦。
恩,南柯一梦。
Posted in 生活点滴 | Life | No Comments »
June 1st, 2007
自从升级2.6.18内核后,几乎每次启动时都停在这个画面:
cs: IO port probe 0xc00-0xcff: clean
cs: IO port probe 0×820-0×8ff: clean
cs: IO port probe 0×800-0×80f: _
然后就没反应了。
根据LQ论坛的说法,在lilo.conf文件里加上一项:append=”pci=nomsi”。重启,似乎没有效果。google之,发现编译内核时MSI(Message Signaled Interrupts)是PCI support下面的一个选项,“信号中断处理”,《Linux 2.6.19.x 内核编译配置选项简介》的解释是:充许设备通过PCI总线写入内存堆栈产生一个中断而不是使用默认的IRQ中断,建议不选。
感觉就是和这个有关,但是尝试多次,依然失败。继续google之,SLAX用户提供两种方法:
1.启动时加载linux copy2ram nopcmcia noacpi nohotplug等选项
2.修改/etc/pcmcia/config.opts,找到相应端口(0×800-0×80f),删除。
方法1里noacpi选项似乎可以解决启动时卡死的问题,但不加载这个电源管理模块的直接后果就是无法查看笔记本的电池信息、手动按电源关机。根据方法2,删除端口,重启,good! 简直一针见血!
Posted in 黄嘴企鹅|linux | 2 Comments »
May 30th, 2007
php版本while语句处理字符串’0′时的差异
最新碰到一个诡异问题,某些主机上的php4会把字符串’xkai200′处理成’xkai20′,但是在我的php5上显示正常。怀疑是php4和5两个版本在substr或strlen函数处理上的差异,但是仔细翻阅手册并没有发现两个版本的差别。于是怀疑while语句:
< ?php
$str = 'xkai200';
//$str = 'xkai20a';
convert($str);
function convert($str) {
while($str) {
$i++;
$str = substr($str, 1, strlen($str));
echo "<li>$str \t $i</li>\n";
}
}
echo PHP_VERSION;
?>
将’xkai20a’代替’xkai200′,发现原来while条件中如果是字符串’0′,会被当成false对待!
php4.4.2, php4.4.7上发现此问题,php5.5.2则正常。
解决方法:使用while($str != ‘’) 代替 while($str)。
Posted in Web服务 | LAMP | No Comments »
May 22nd, 2007
标题:笔记本电脑上常用的几个内核模块
作者:windrose
来源:http://www.linuxsir.org/bbs/showthread.php?t=194374
笔记本电脑由于节省电力的需要,在设计上对于电源管理非常重视。以前常用的apm是通过bios进行电源管理,而新式的acpi作为apm的后继者,把电源管理的任务交给了操作系统。
以往大家常常会认为笔记本电脑的节能功能在linux中不如在windows中的,但我最近在dell inspiron 700m上安装linux之后,发现其实linux对于acpi的支持已经非常完善了,对于intel处理器的speedstep模式的支持也很好,能做到动态调整cpu的频率。这里介绍一下在2.6.10内核中,我用到的与电源管理和显示系统状态有关的几个内核模块:
- AC
用法: /sbin/modprobe ac
用途:这个模块很简单,就是显示外接交流电源连接的状态。加载这个模块后,在 /proc/acpi/中会新建 ac_adapter/ADPx/目录,其中的state文件内容即是电源连接状态。
- BATTERY
用法: /sbin/modprobe battery
用途:监视电池充放电状态、当前容量等。加载模块后,在/proc/acpi/中建立 battery/BATx/目录,其中的文件内容记录了电池的信息(info文件)、状态(state文件)等。
- THERMAL
用法: /sbin/modprobe thermal
用途: 监视CPU和主板等的温度。加载后,/proc/acpi/目录中建立thermal_zone/THRx/目录,其中的temperature文件中记录了温度值,还有其他的文件定义了在某个温度值系统应该采取的行动等信息。
- BUTTON
用法: /sbin/modprobe button
用途:定义不同按钮对应的系统行为,例如,可以设置按电源键系统关机、合上屏幕系统休眠等。可以指定在这些键的状态发生变化时执行相应的系统命令,具体内容可以参照 /etc/acpi/目录中的脚本,这里就不展开讲了。
- PROCESSOR
用法: /sbin/modprobe processor
用途:显示CPU的信息、状态,并能设置对CPU限速(throttling)。在/proc/acpi/processor/CPUx/目录中的文件有cpu 的信息,也定义了在不同电源供应情况下对应的cpu状态以及对cpu限速的规则。假如cpu支持频率调节,则可以通过一些软件利用有关文件实现这一功能。
- cpufreq
用法: 在 /lib/modules/`uname -r`/kernel/arch/i386/kernel/cpu/cpufreq/目录中有许多针对不同移动CPU进行频率调节的模块,需要根据你的 CPU进行选择,有针对intel的speedstep的,也有针对amd的powernow的,还有针对transmeta的longrun的。我的是迅驰dothan 1.6G,所以我加载 speedstep-centrino 模块: /sbin/modprobe speedstep-centrino,加载之后 /sys/devices/system/cpu/cpu0/cpufreq/里面的文件就是与频率调节有关的。
加载了上述模块之后要通过一些软件才能更方便地监视系统状态和使用模块提供的功能,gkrellm有很多有关的插件,windowmaker也有很多dockapps实现同样的功能。我就是用的dockapps。
Posted in 黄嘴企鹅|linux | No Comments »
November 19th, 2006
不像其他发行版本,本来slackware下面的bash配置文件很简单:shell启动时只认.bash_profile文件。可是我的slackware,不管是.bash_profile还是.bashrc都不生效。
怀疑是此前修改~/权限时的后遗症,ls -l ~/\.bash*查看没有x权限,于是chmod u+x ~/\.bash*、退出后满怀欣喜地查看,依然不奏效。
无奈,只好霸王硬上弓,在/etc/profile里source了一遍:
#Get the aliases and function
if [ -f ~/.bash_profile ];then
. ~/.bash_profile
fi
#User specific environment and startup programs
以防万一,把.bashrc的也加上去了。btw, 感觉linux实在是个好东东,特意添加了黄嘴企鹅分类。
Posted in Web服务 | LAMP, 黄嘴企鹅|linux | 1 Comment »