@ZEAL Blog·厉
WWW Zeal Blog
We stand alone,
TOGETHER.
+ 1 - 0 | §scp拷贝文件失败问题

当在 shell startup script (比如 profile , bashrc)自动执行过程中产生了任何内容输出时, scp / sftp 会把这些 echo 回来的东西认作协议包进行解析,结果自然是无法读懂这些内容,最终导致文件拷贝失败。

如果能够明确知道在自己的 /etc/bashrc 等文件里面哪些语句会产生 echo 的内容的话,可以通过条件判断进行 echo :

if [ $(expr index "$-" i) -ne 0 ]; then
    echo "welcome to interactive shell , Current is"
    date +'%Y-%m-%d %T'
fi

这样只有在真正交互登录的时候才会 echo 信息, scp 的时候自动忽略。

标签 ( 开发/理论 ) :
+ 0 - 0 | §fgetcsv引起basename异常

CentOS 服务器上的 LANG=en_US.UTF-8 ,当php脚本里面使用了 fgetcsv 对某个 GBK 编码的 csv 文件进行解析之后, basename 函数就再也无法正常工作了,每次调用返回的文件名始终为空字符串,该问题甚至会在整个 apache 的 httpd 线程生命周期内存在。 windows 下似乎不会出现这种情况。

解决方法:在用 fgetcsv 处理文件之前先设置 setlocale(LC_ALL,'zh_CN.GBK'); 或者通过 iconv / mb_convert_encoding 等方式将整个 GBK 编码的文件先转化为 utf-8 编码。

理论上来说 fgetcsv 应该只是一个字符串解析的过程,即便输入字符串的编码格式出现问题,最多也就是解析返回的数组乱掉而已,怎么会影响到 basename 函数的正常运作并在线程周期内持续作怪?从 php 的源代码来看似乎也没什么特别的操作,依然困惑中。

标签 ( PHP ) :
+ 0 - 0 | §pcAnywhere文件传输问题

在使用 pcAnywhere File Transfer 进行文件传输时,发现上传新的文件一切正常,如果是覆盖服务器上已有的文件,点了 Transfer 之后整个界面就死掉了。

解决方法:在 Edit -> Preferences 里的 File Transfer 项里面,把 Destination file 缺省的 Verify before overwriting 改为 Always overwrite duplicate files 即可。似乎在缺省的 Verify 状态下应该是会弹出提示信息要求确认,但不知为什么这个提示框没出来,反而整个界面都死掉了。

据同样用 pcAnywhere 的朋友说没发现这个现象,貌似个人RP问题.. OrZ

标签 ( 网络 ) :
+ 0 - 0 | §ERROR 2013 (HY000) of MySQL

当通过 TCP/IP 连接 MySQL 远程主机时,出现 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104

如果是在linux shell命令行中直接打 mysql 命令,能够顺利连上 MySQL,执行查询语句也比较正常,但如果执行 STOP SLAVE; 命令时就随机出现 ERROR 2013 (HY000): Lost connection to MySQL server during query 问题。而如果把操作命令写到脚本文件再去执行该脚本文件的话,则必然出现 Lost connection to MySQL server at 'reading initial communication packet', system error: 111

要是无论通过什么途径远程访问都出现错误可以认为是系统有防火墙之类的限制,但现在这种奇怪的抽筋现象让人百思不得其解。最后找到的解决方法是在 my.cnf 里面的 [mysqld] 段增加一个启动参数

skip-name-resolve

问题消失。但原因还是想不出所以然。

标签 ( 开发/理论 ) :
+ 0 - 0 | §svn post-commit中文转码

svn hooks 目录下缺省的 post-commit 脚本模板通过调用 commit-email.pl 来分析当次提交的内容并根据参数设置把修改信息 email 给项目相关人员。脚本支持使用 -m 参数进行正则过滤,当修改不同目录的内容时可以分别 email 给不同的邮件地址。

不过当项目中存在中文文件名的时候,由于 svn 会把非ascii码字符转义成形如 ?\325 的格式,所以在发出来的 email 里面这些中文都变成了不可读的数字。

要把这些编码转回原来的字符,只需要在 commit-email.pl 脚本处理 email body 信息的地方加上一段转码处理即可。比如在 my @difflines; (行487) 的前面加上:

for (my $i=0; $i<@body; ++$i){
    my @rsa = split( /\?\\/, $body[$i] );
    $body[$i] = "";
    for (my $j=0; $j<@rsa; ++$j) {
        my $val = $rsa[$j];
        $val =~ /(^[0-9]{3})(.*)/;
        if($j > 0 and defined $1 and $1 gt 0){
            #print "\n[".$1 . "," . $2."]";
            $body[$i] .= chr($1) . $2;
        }
        else{
            $body[$i] .= $val;
        }
    }
}

把之前 push 到 @body 变量的所有内容重新进行处理,发现 ?\ 后面跟三个数字就替换为相应的字符。

另外在 post-commit 模板脚本中没有写 commit-email.pl 的绝对路径,需要写上才能正常被调用。

附: 转码的shell实现->>

echo "?\232?\167?\163?\229?\134?\179?\230?\150?\185?\230?\161?\136" | \
awk --re-interval '{print gensub(/?\\([0-9]{1,3})/,"\\1\n","g");}' | \
awk --re-interval '{if($0 ~ /^[0-9]{1,3}$/) {printf("%c",$0)} else {printf("%s",$0)}}'

该示例转出来的对应中文应该是:解决方案

Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | About me | Back To Home | @ZEAL | zbird.com | 沪ICP备05024379号