Archive for the ‘技术’ Category

linux/macOS下解压中文乱码的zip包

Sunday, December 26th, 2010

从 windows 下压缩的zip包如果文件或者目录名有中文,在典型的 linux 环境(如ubuntu)和 macOS 下按照正常zip解压都会乱码。google一下搜到的答案有两种,一种是hack一下unzip的代码重新编译,还有一种是另外写一个解压的工具代替unzip。

其实这是一个困扰了linuxer很多年的老问题了,能搜到好多人问和答,但至少在半年前(6月份)我遇到的时候,没有让我满意的简单的解决通用的方案。

当时我是,遇到产品的同事给了一个做好的交互原型,输出一个zip包,而基本上公司里其它技术都是用linux或者macOS。参考了搜到的解决方案,用 php 的 zip 扩展来解压,并转换 GBK 为 UTF-8 即可。

存到自己home目录下的bin里面, 比如放到 ~/bin/punzip,然后 chmod +x ~/bin/punzip,以后就可以比较自由的直接调用 punzip foo.zip 来解压了。

依赖了 php 的 zip 扩展,如果执行时提示“php zip extension is needed.”(比如默认macOS就没有加载zip扩展,ubuntu有),需要修改 php.ini 添加 extension=zip.so,具体按照提示中的手册页面做就好。


<?php
/**
 * 解压含有文件名为gbk编码的zip包,到当前目录
 */
if (!extension_loaded('zip')) {
    
printf("php zip extension is needed. See http://www.php.net/manual/en/zip.installation.php\n"$argv[0]);
    die;
}
if (!isset(
$argv[1])) {
    
printf("Usage: php %s filename\n\n"$argv[0]);
    die;
}
$f zip_open($argv[1]);
while (
$e zip_read($f)) {
    
$filesize zip_entry_filesize($e);
    
$filename iconv('GBK''UTF-8'zip_entry_name($e));
    if (!
$filesize) {
        
mkdir($filename); 
        continue;
    } else if (!
zip_entry_open($f$e)) {
        continue;
    }   
    
file_put_contents($filenamezip_entry_read($e$filesize));
    echo 
"$filesize\t$filename\n"
    
zip_entry_close($e);
}   
zip_close($f);


Thrift – 开源多语言RPC框架

Sunday, September 27th, 2009

RPC (wiki) 在大规模的互联网应用后端技术中非常常见,我们熟悉的搜索引擎、门户、网游服务器等,后端实现中都有涉及。主要原理是基于内网 socket 解决多机多模块之间的数据通讯问题。或者可以简单理解为,将单机的进程间通讯 (IPC) (wiki),扩展到多机通讯,解决可扩展性问题。

Thrift 是由 Facebook 开源的一个 RPC 框架,现在已经挂在 apache.org 下了。主要的几个好处:

  1. 支持非常多语言,包括在 WEB 开发中很常用的 PHP,以及最重要的 C++/Python/Java 等 WEB后端常用语言,当然,还包括很 cool 的 Ruby、Erlang。
  2. 完整的 RPC 框架实现,用脚本生成通讯相关的框架代码,开发者只需要集中精力处理好业务逻辑。比如搭建一个 Hello World Service 只需要几分钟。
  3. 拥有被 Facebook、Last.fm 等不少大规模互联网应用验证过的性能和可用性。

在 PRC 通讯方面,其实已经成熟多年。比如百度内部是自己定制的二进制协议,比如C++下使用较多的 ACE 框架。而 Thrift 在最近两年脱颖而出,也的确和其跨语言、方便的代码生成框架、以及适于目前高速发展的互联网应用而出名。另外许多人拿 Thrift 和 google 推动的 Protocol Buffer 比较,有不少文章可以参考

国内从目前的状况看,Thrift 相关的讨论和应用还不太多,这也是我想写出来推荐的原因。

一方面国内的寡头大型互联网企业多数使用自己的协议,没有动力开源,也没有引入的需求。一方面小型互联网公司虽然不少,但规模较大的还很少,大部分公司的业务量,还不太需要 RPC 这类多模块多机的架构去支撑。

另一方面,Thrift 的确系出名门,它的代码实现的很优秀,逻辑层次清楚,易于定制扩展。框架代码生成方便,节省很多通讯方面的开发和调试时间。

最近和几位同事一起,做了对 Thrift 协议传输方面的性能测试和调优,结果还是不错的,用起来也很方便。后面有机会可以把测试过程,以及遇到的一些问题拿出来分享。

单机启动多个MySQL Server

Wednesday, September 23rd, 2009

有时候我们需要在一台服务器启动多个 MySql Server。有一个方法是使用官方的多server管理工具 mysqld_multi ,适合多server运行时的管理,有专用的配置项方便日常管理维护。或者如果不想用 mysqld_multi,我们看看幕后都做了什么,简单的自己动手配置一下。

这篇来讲讲怎么通过自己配置,启动多个mysqld。

无论是发行版包管理工具安装的,还是自己编译安装的,都会默认读取 my.cnf 文件,位置一般是 /etc/my.cnf 、$MYSQL_HOME/my.cnf 等。发行版包管理工具一般只会安装在固定的位置,不方便同时装两个 mysql server。自己编译的话,也不方便临时再 install 到其他位置和读取另外的 my.cnf 文件。

参考 MySQL 官方手册的内容,使用现有的mysql系列可执行程序,在启动server和client时,指定 --defaults-file 参数,即刻达到效果。

1、编辑一个新的 my.cnf 文件用于新的server

sudo cp /etc/my.cnf /etc/my.2.cnf
sudo vim /etc/my.2.cnf

修改配置,防止和原有配置冲突。主要需要修改的有:

  • 端口(port)、socket 文件路径 (socket)、数据文件路径 (datadir);
  • 如果用到 InnoDB(一般都会用到),则要修改 InnoDB 数据文件路径 (innodb_data_home_dir)、InnoDB 日志文件路径 (innodb_log_group_home_dir);
  • 如果用到replication时,还要修改server的唯一id (server-id)、下载到master的binlog的存放路径 (relay-log)等。其他配置修改,则根据具体情况自行调整。

这里注意 datadir 和 InnoDB 的几个dir,根据情况新建目录,并给 mysql 用户读写权限,否则无法启动正常。另外特别注意,需要确保这些路径不和 product 环境下对应配置的路径有冲突,除非你的确希望这样做,这可能会损坏对应路径下的数据文件。

2、初始化DB

sudo /usr/bin/mysql_install_db --defaults-file=/etc/my.2.cnf
sudo cd $datadir
sudo chown mysql:mysql . -R

这里 $datadir 是新配置的 my.cnf 的 datadir 项所配置的路径。注意需要对文件权限变更为 mysql,否则启动server时会出现文件无权限等错误。

3、启动 mysqld

/usr/bin/mysqld_safe --defaults-file=/etc/my.2.cnf &

查看 $datadir/$host.err 观察是否启动成功。

4、启动 client

/usr/bin/mysql --defaults-file=/etc/my.2.cnf -hlocalhost -uroot

这些命令为了方便使用,可以写到shell脚本里。上述步骤只叙述了标题相关内容,在权限、性能等无关方面没有特别说明。另外注意 --defaults-filedefaults 有个 s,之前我自己写漏了,整个参数被忽律掉,总报错。:-)

读《MySQL性能调优与架构设计》

Saturday, September 5th, 2009

《MySQL性能调优与架构设计》(豆瓣链接)(卓越链接)是阿里巴巴的DBA 简朝阳的书。

前段时间读了一下,综合来说还不错,少有的几次读的很畅快的书之一了。作者对MySQL的各部分知识掌握扎实全面,有不少内容是需要深入了解MySQL运行机制后才有的结论。

书分基础、优化、架构三部分。

基础篇
各种介绍,属于初步了解MySQL的程序员和DBA入门需要掌握的基础知识。

性能优化篇
展开讲了MySQL常遇到的各种锁机制、Server参数调优、存储引擎调优、Query优化等等。对MySQL性能调优相关内容有兴趣的话,读起来会比较有兴趣。这里涉及的知识是有一两年经验的LAMP程序员和DBA应当了解的相对高级一些的技巧和内部实现原理。

架构设计篇
展开讲了Replication复制原理、Cluster、大型系统的DB切分方案、监控。其中Cluster因为之前一直生产环境下可行性不高,我不太熟悉。Replication部分是比较基本需要了解的。数据切分虽然篇幅比较长,但介绍的比较泛,可能因为面向DBA有关,在与应用程序的结合上表述不多,实际应用时还有许多细节需要考虑。监控方面值得参考,结合附录Server status和variables参数含义一起理解,是目前不多的对监控介绍比较全面的资料。

此外,有一个小遗憾是第一版笔误和文字错误较多,以及部分内容因为篇幅所限略显不够严谨,虽然这些都不影响这是一本对MySQL爱好者不错的书。好消息是第一次印刷因为卖的好,基本上已经卖完了。作者在blog上更新了勘误表,部分勘误已经交付第二次印刷,新买到的应该会好不少。