当雅虎邮箱再次遇上乱码

最近碰到一件奇怪的事情,使用gmail收到来自雅虎信箱(yahoo.com.cn)回复的邮件时,标题总是或多或少出现乱码。

于是我注册一个雅虎信箱,分别给gmail和公司邮箱(使用客户端sylpheed收信)发送邮件。如果标题超过20个中文,收到的邮件标题确实会显示部分乱码。有意思的是两者显示乱码的方式还不一样:gmail将第20个中文后的字符显示为乱码;sylpheed则将第21、22个中文显示为乱码。

smtp协议似乎并没有对邮件标题长度做限制,不知雅虎信箱为何对标题的第40个字符这么敏感。

btw,在网上搜了一下,发现雅虎邮箱在年初也曾出现过乱码

读取mplayer/ffmpeg运行时的输出信息

由于使用了退格(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("%s\n", $line);
        $line = '';
        continue;
    }

    // 如果是退格或覆盖符号
    if (ord($charset) == 10 || ord($charset) == 32) {
        continue;
    }
    $line .= $charset;
}
pclose($handle);

?>

ps: 看不出wordpress有时也很bt, 昨天这篇文章发了半天都返回503错误,后来发现是文章里&#112open一词导致的,我只好用字符p的html实体&#112;来代替了

mysql数据库迁移备忘(4.0.22 -> 5.0.37)

旧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;

php4、php5版本while语句处理字符串’0’时的差异

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)。

.bash_profile及.bashrc

不像其他发行版本,本来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实在是个好东东,特意添加了黄嘴企鹅分类。

备忘:mount windows分区

换了台电脑,换了个操作系统,连fstab文件都得重新写一遍。

sudo cp /etc/fstab /etc/fstab.bak
sudo vim /etc/fstab

# /etc/fstab: static file system information.
#
#

proc /proc proc defaults 0 0
/dev/sda9 / ext3 defaults,errors=remount-ro 0 1
/dev/sda12 /home ext3 defaults 0 2
/dev/sda10 /usr ext3 defaults 0 2
/dev/sda11 none swap sw 0 0
/dev/hda /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/sda1 /mnt/win_c ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda5 /mnt/win_d ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda6 /mnt/win_e ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda7 /mnt/win_f ntfs ro,uid=1000,iocharset=utf8 0 0
/dev/sda8 /mnt/win_g vfat ro,uid=1000,iocharset=utf8 0 0保存,退出。

sudo mount -a

一整天碰到的一些问题

ol里的li列表元素怎么也显示不出来默认的123效果
原因:li元素被设置成了display: block,应该是display:list-item
发生严重的系统错误,请联系管理员
作为和用户交互的一部分,良好的信息提示应该具备一下特点:1.指明详细信息 2.告诉用户发生错误后能做什么,必要时可以给用户代劳,刷新一下页面 3.语言得体,尽量避免使用“严重”、“系统错误”等字眼,这样会打击用户的积极性
棘手的IE/QQ 页面里rutime错误竟然和css里一个class的名称有关?!
先是怀疑页面中的Flash和qq冲突,进而怀疑javascript,就是没有想到会是css中某个特定class名称的缘故。看来,使用二分法从头到尾排查错误,有时候真的会事半功倍。
一个几条记录的表数据被无意清空后,折腾了半天
总结:1.避免使用小表,杀鸡焉用宰牛刀 2.备份,备份,再备份
经验是最好的老师,google也是最好的老师

Windows XP Professional的默认环境变量

昨天费了半天口舌才表达清楚C:\Documents and Settings\沙漠之周\Application Data这个路径,后来才发现一个%appdata%就可以搞定。

以下是Windows XP Professional的默认环境变量:

变量名 说明
ALLUSERSPROFILE 返回所有用户配置文件位置的本地变量。
APPDATA 返回应用程序在默认情况下存储数据的位置的本地变量。
CD 返回当前目录字符串的本地变量。
CMDCMDLINE 返回用于启动当前 Cmd.exe 程序的确切命令行的本地变量。
CMDEXTVERSION 返回当前命令处理器扩展的版本号的系统变量。
COMPUTERNAME 返回计算机名称的系统变量。
COMSPEC 将精确路径返回给命令外壳可执行文件的系统变量。
DATE 返回当前日期的系统变量。该变量与 date /t 命令使用相同的格式。Cmd.exe 程序生成此变量。有关详细信息,请参阅 Date 命令。
ERRORLEVEL 返回最近使用命令的错误代码的系统变量。非零值通常表示错误。
HOMEDRIVE 返回用户主目录的本地工作站驱动器号的系统变量。此变量是基于在组中为“本地用户”和“组”指定的主目录值设置的。
HOMEPATH 返回用户主目录的完整路径的系统变量。此变量是基于在组中为“本地用户”和“组”指定的主目录值设置的。
HOMESHARE 返回用户共享主目录的网络路径的系统变量。此变量是基于在组中为“本地用户”和“组”指定的主目录值设置的。
LOGONSEVER 本地变量,返回验证当前登录会话的域控制器的名称。
NUMBER_OF_PROCESSORS 指定计算机上安装的处理器数目的系统变量。
OS 返回操作系统名称的系统变量。Windows XP Professional 将操作系统显示为 Microsoft Windows NT。
PATH 指定可执行文件的搜索路径的系统变量。
PATHEXT 系统变量,返回操作系统将其视为可执行文件的文件扩展名的列表。
PROCESSOR_ARCHITECTURE 返回处理器芯片结构的系统变量。值:x86、IA64。
PROCESSOR_IDENTFIER 返回处理器描述的系统变量。
PROCESSOR_LEVEL 返回计算机处理器型号的系统变量。
ROCESSOR_REVISION 返回处理器修订号的系统变量。
PROMPT 返回当前解释程序的命令提示设置的本地变量。由 Cmd.exe 生成。
RANDOM 返回 0 到 32767 之间的随机十进制数的系统变量,由 Cmd.exe 程序生成。
SYSTEMDRIVE 返回包含 Windows 根目录(例如,系统根目录)的驱动器的系统变量。
SYSTEMROOT 返回 Windows 根目录位置的系统变量。
TEMP 或 TMP 系统和用户变量,返回当前登录的用户可以使用的应用程序的默认临时目录。某些应用程序需要使用 TEMP,而其他应用程序需要使用 TMP。
TIME 返回当前时间的系统变量。该变量与 time /t 命令使用相同的格式,并由 Cmd.exe 生成。有关详细信息,请参阅 Time 命令。
USERDOMAIN 返回包含用户帐户的域的名称的本地变量。
USERNAME 返回当前登录用户名的本地变量。
USERPROFILE 返回当前用户配置文件位置的本地变量。
WINDIR 返回操作系统目录位置的系统变量。

See: