[2010-9-5]有关Inception——《盗梦空间》

不得不说,最近看到的几部电影,都是很不错的。

这部《盗梦空间》,去看之前我对于他的期望值不是很高。对于,莱帅哥的演技也没有什么期待。

不过,看完后,就觉得这是一部不错的电影。针对性很强。有很像的逻辑性,哲学和心理学的各种因素融合进去的电影。非常适合20~40岁之间的年轻人去观看。

估计,过一阵子国产的“图腾”道具陀螺就会热卖了。:P

~~~~~~~~~~~~~~~~~~

抛开好看的电影不说。说些题外话:

一则趣闻:

《泰坦尼克号》里莱昂纳多对露西说:If you jump, I jump!《盗梦空间》里莱昂纳多对梅尔说:If you jump, I will not jump with you! ——你看吧,男人成熟后,就不会再相信爱情了这回事了。

还有,就是对于每一级梦境的理解。有人用播放器做了一个很好的解释。大家可以看看:

[2010-8-30]清理数据,轻装前进

拿到Offer有几天了。距离正式上班还有1个多星期。原本是为了给原来的公司的原来的公司的项目(注意,我没敲错,是原来的公司的原来的公司)擦屁股的工作腾出的时间。不过,英明神武的我,外加稀里糊涂的局方人员,把项目内容直接涉及我的部分直接缩小到了1台服务器的工作量。这样的话,就轻松很多了。


上周,周四周五的样子,用了2天时间,慢慢悠悠的迁移了60多个站点的数据。基本上都是没用的废弃的站点。(甚感自己的工作无用)但,总是给他们都迁移完了。从一台Windows 2000 的古老服务器上搬到了一个不是很新的Windows 2003 Server 上,话说这个系统还是我3年前去苏州电信安装的。关于本次的数据迁移项目,局方是在3年前我去苏州的时候就提出来了。如今物是人非了才想起来搞,两边都已经变化的不成样子了。想想都是笑话。


总而言之,今天,周一,来到公司,跟老板交待了关于擦屁股的工作的事情。也把相关的内容仔细认真的发给局方和自己人。基本上算是画上了圆满的句号。

从原来的公司倒闭,Team搬到这个新公司,我大约在这里待了100天的样子。无论好坏,也算是个善终吧。至少我们Team的QQ群的名字当我作为最后一名找到工作的成员后,从“杯具裙裙”改名为“编程小强工作室”了。呵 ^o^

~~~~~~~~~~~~~~华丽的分隔符~~~~~~~~~~~~~~~~

一会下班就要办离职手续了。新公司给配的T410 得还回去了。还有,从原来公司搬到这里来的用了3年的双屏22寸Dell 也要告别了。还是有些不舍的。毕竟东西用久了就会有感情的,而且,环境也顺手了。

但是,无论如何,都要有重新开始。从小白重新出发,因此,还是拍个照片留个纪念吧。没带LX3,借Sub的iPhone拍一张留念。

中国达人秀——一头感动了全中国的“猪”

自从国内开始山寨各种选秀节目,我就很少看国内的类似的娱乐节目了。

偶尔会翻看一下,英国大人和米国的一些选秀节目。

不过这次,无意中在微博上被一个山寨版的中国达人秀感动到了。


他说,他愿意为他老婆装猪;他说,家里穷,他和老婆凌晨三点还在卖鸭脖子;他说,看见老婆在桥洞里唱歌,他很无力;当他被无知无情的所谓评委拒绝之时,他求他们让老婆在舞台上哪怕喊上一声……而当我们听到他妻子歌声的时候,我们都震惊了。

Zend Framework 增加自己的library库

在以前的老版本的Zend Framework(大概是1.5.*)的年代,记得使用自己的类库,只要将对应的库放到项目的library目录下,与Zend Framework 自己Zend目录同级即可。前提是已经将对应的library库加载到系统的include_path中了。

但是,当使用新版本的Zend Framework中,发现才用同样的方法会报错误,报告找不到class。具体的情况是这样的。

我需要将用户身份认证的模块以Controller的Plugin的形式加载入系统中,因此,根据新版Zend Framework的application.ini,要才用如下方法配置frontController的plugin

resources.frontController.plugins.sesssion = Hr_Controller_Plugin_Allow

对应的,在library目录下依次建立Hr/Controller/Plugin 目录,在Plugin目录下建立Allow.php,Allow.php涉及如下内容:

< ?php
class Hr_Controller_Plugin_Allow extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch( Zend_Controller_Request_Abstract $Request )
    {
        $strModuleName = $Reques-->getModuleName() ;
        $strControllerName = $Request->getControllerName() ;
        $strActionName = $Request->getActionName() ;

        $strRule = $strModuleName . $strControllerName . $strActionName ;

        Zend_Debug::dump( $strRule ) ;
    }
}

这里只是简单的将Plugin勾上preDispatch事件,具体的代码大家自己实现,我这里只是想记录问题。

完成上述操作后,我本以为该Plugin就可以实现生效了。

不过测试使就会出现如下错误:

Fatal error: Class 'Hr_Controller_Plugin_Allow' not found in /usr/share/ZendFramework/library/Zend/Application/Resource/Frontcontroller.php on line 111

对应Frontcontroller.php的部分代码:

.....
 96                 case 'plugins':
 97                     foreach ((array) $value as $pluginClass) {
 98                         $stackIndex = null;
 99                         if(is_array($pluginClass)) {
100                             $pluginClass = array_change_key_case($pluginClass, CASE_LOWER);
101                             if(isset($pluginClass['class']))
102                             {
103                                 if(isset($pluginClass['stackindex'])) {
104                                     $stackIndex = $pluginClass['stackindex'];
105                                 }
106
107                                 $pluginClass = $pluginClass['class'];
108                             }
109                         }
110
111                         $plugin = new $pluginClass();
112                         $front->registerPlugin($plugin, $stackIndex);
113                     }
114                     break;
.......

可以看到,是在new $pluginClass(); 报的错误,而且之前的提示也是说明对应的Class没有找到。

可是默认的Project中的index.php里面已经对library目录进行了加载。

......
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));
......

这就只能从Zend自己的加载机制进行考虑。参考了这篇文章( http://www.hardcode.nl/archives_132/article_490-register-plugins-in-zf-applicationini.htm )后,我注意到作者在application配置中增加了一个配置,名为:autoloaderNamespaces

而对应的新版的application.ini中的默认项目中也有 appnamespace = “Application” 的配置

因此,仿照文章我增加了名为:”Hr_”的Autoloader的Namespace配置

......
autoloaderNamespaces[] = "Hr_"
......

增加配置后,项目就会识别Hr_Controller_Plugin_Allow的Class了。


总结:

本次问题的发现,体会到对于Zend的AutoLoader的机制还不是很理解,需要深入分析,多看手册和文档。后续有时间增加对于AutoLoader机制的学习和分析。

制作U盘版的Ubuntu安装盘

今天一个同事要给老迈的T43重装系统。首选了Ubuntu 10.04 考虑到现在Ubuntu优秀的兼容性,对于T43来说,这不失为一个好的选择。

下面的问题就是安装系统了。老迈的T43光驱早就不灵光了,而且,我们手边儿没有刻录机和光盘。而且,感觉为装一个系统,单独就得刻一张盘。总觉得是劳民伤财,而且,外加我们比较懒。

之前做过U盘量产的尝试,不过,针对U盘的主控芯片和Flash有特定的需求,硬件针对性太强。实在不是什么可取的办法。

自从Windows 7 推出了U盘安装工具以来(当然,其实是M$盗用别人的),相应的各种U盘的格式化USB-HDD的工具就应运而生了。

今天问了一下谷歌大神,找到了一个实用而又好用的解决方案——UltraISO的“写入硬盘镜像”功能。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

具体操作步骤如下:


1. 加载Ubuntu10.04的ISO

2. 点击菜单,选择“启动” ->“写入硬盘映像…”


3.在提示菜单中,选择对应U盘和“写入方式”。

4.点击“便捷启动”->“便捷写入”,确认写入

5.开始写入

6.完成写入,调整BIOS,使用USB-HDD启动

~~~~~~~~~~~~~~~~~~~~~~~附录~~~~~~~~~~~~~~~~~~~~~~~~~~

另:

关于写入方式 USB-ZIP, USB-HDD,USB-HDD+ 和 USB-ZIP+ 的区别

USB-HDD

硬盘仿真模式,DOS启动后显示C:盘,HP U盘格式化工具制作的U盘即采用此启动模式。此模式兼容性很高,但对于一些只支持USB-ZIP模式的电脑则无法启动。   

USB-HDD+

增强的USB-HDD模式,DOS启动后显示C:盘,兼容性高于USB-HDD模式。但对仅支持USB-ZIP的电脑无法启动。

USB-ZIP

USB-ZIP(大软盘模式): 启动后U盘的盘符是A;USB-ZIP大容量软盘仿真模式,此模式在一些比较老的电脑上是唯一可选的模式,但对大部分新电脑来说兼容性不好,特别是2GB以上的大容量U盘。FlashBoot制作的USB-ZIP启动U盘即采用此模式。

USB-ZIP+

增强的USB-ZIP模式,支持USB-HDD/USB-ZIP双模式启动(根据电脑的不同, 有些BIOS在DOS启动后可能显示C:盘,有些BIOS在DOS启动后可能显示A:盘),从而达到很高的兼容性。其缺点在于有些支持USB-HDD的电 脑会将此模式的U盘认为是USB-ZIP来启动,从而导致4GB以上大容量U盘的兼容性有所降低。   

USB-CDROM

光盘仿真模式,DOS启动后可以不占盘符,兼容性一般。其优点在于可以像光盘一样进行XP/2003安装。制作时一般需要具体U盘型号/批号所对应的量产工具来制作,对于U3盘网上有通用的量产工具。

[转]程序设计经验

写过程序,调试过代码的人对自己的编程开发精力都有所领悟和理解。今天看到一份总结,很简单,很到位。这里share出来,提醒自己与大家共勉。

1) 程序不会出错,出错的肯定是人;如果程序出错了,那也一定是人的错误.
我时常在编码调试的时候出现这样的一种心理:
出现问题的时候总是认为不是自己的错误,而认为可能是系统的错误.
其实,久经考验的系统出错的概率几乎很小,大多数的情况下出错的肯定是编写代码的人,
所以你的程序出错了一定是自己的问题,有了这个观念会十分有助于早点发现并且改正BUG.

2) 程序就是用规则处理数据,规则包括:算法,数据结构,系统API,协议,语言,设计模式等等.
这句话很浅白,我想很多人一看就能明白,
其实学习编程的过程就是在学习怎么去用规则去处理数据,想想看一路过来学过的课程都是如此:
算法数据结构教会我们在什么情况下应该选取怎样的方式去处理数据,
操作系统教会我们系统如何处理数据
,编译原理教会我们编译器如何处理数据,
网络协议,语言,正则表达式等等的更不必说了.
至今我已经很少去关注什么语言之争的无聊话题.
因为我相信语言也是一种处理数据的工具,没有哪种工具是万能的,只有合适的场合采用合适的工具.
同时,以后再学习一种新的"规则"时,也需要抓住这些重点:这个规则适用的场合,适用的数据,处理数据的方式.

3) Make it work, make it right, make it effective.
我已经忘记了在哪里看见的这句话(请知情者转达一声,谢谢:)(转载话:貌似是出自The Art of UNIX Programming).
中文的意思也很浅白:先让它可以运行,然后让它可以正确的运行,最后再去提高效率.
我想,这应该是编写大部分代码的顺序,这也是把一个问题从简单慢慢的一步一步进行到复杂的过程.
在你的代码没有正确的运行起来之前,暂时别做优化(当然了很显然的优化是可以的),
只有当程序正确的运行起来时,你通过测试或者工具发现了瓶颈所在再去考虑优化.

4) 越早让你的程序投入调试越好.
一般而言,写好一段代码比调试一段代码的时间要少的多,而许多许多的问题也是在你写代码的时候所不能发现的.

文章引自:http://www.cppblog.com/converse/archive/2007/11/21/37107.html

Apache启用性能优化——启用Gzip,JS压缩

在做个项目中,发现人家的JQuery1.4.2-min.js在Firebug中只有不到24KB大小。如下图:

而实际jQuery的官方文件的大小要有70KB的样子。

由于直接通过Firebug查看JS代码,发现对应的min.js代码没有发生任何改动和压缩扰码。(JQuery官方已经进了删除回车,多余空格等优化操作,因此,从压缩代码的角度,再提升这么的压缩比实在不现实),因此,考虑到是浏览器和WebService端进行的压缩处理。

最成熟的Apache的压缩解决方案就是采用mod_deflate 模块的GZip压缩。作为,曾经写过Apache模块的我来说。对于这个Module已经是耳熟能详了。其配置方法也十分简单。

首先要确保自己的Apache已经加载了deflate模块。

[root@localhost ~]# apachectl -M | grep deflate
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 .......
 expires_module (shared)
 deflate_module (shared)
 headers_module (shared)
 ......
Syntax OK
[root@localhost ~]#

如果没有加载,则需要自行编译加载,这个不在本文的论述范围之内,有需要的朋友,请自行询问谷歌大神。

加载mod_deflate.so模块,并进行配置

[root@localhost ~]# vi /etc/httpd/conf/httpd.conf
#Add deflate module for enable GZIP function
LoadModule deflate_module     modules/mod_deflate.so

#Add GZIP config filetype
AddOutputFilterByType DEFLATE text/html text/php text/png text/jpg text/plain text/css text/xml text/javascript

#Set compression level
DeflateCompressionLevel 9

#Hook on output filter
SetOutputFilter DEFLATE
[root@localhost ~]#

重启Apache服务,加载模块

[root@localhost ~]# /etc/init.d/httpd restart

启用压缩后,效果:

MySQL 关于字符集的问题

自4.1以后,增加了对字符集的支持。

之前对Mysql比较了解,刚接触4.1时,感觉Mysql有点多此一举,但后来细想发现,对字符集的支持,虽然对开发者来说,会麻烦一些,但不可否认,是一种进步。对字符集的支持,不仅更加支持多语言,而且,也方便移植。

刚开始使用Mysql4.1,你可能感觉有点不适,下面,简单阐述一下笔者对Mysql4.1字符集的理解,再讲述如何PHP如何适应Mysql的这种变化,希望大家看过这文章后,能够有所收获。

如果你对计算机基础知识不了解,请直接阅读“结论篇”

一.原理篇

Mysql的字符集里有两个概念,一个是“Character set(字符集)”,另一个是“Collations”。

1. Collations

Collations 翻成中文是“校验”,在网页开发的过程中,这个词汇,只在Mysql里使用,主要作用是指导Mysql对字符的比较。

比如, ASCII字符集里,Collations规定了a小于b,a等于a,以及a是否等于A之类的。通常,大家基本可以忽略Collations的存在,因为每个字符集都有一个默认的Collations,通常,使用默认的Collations就可以了。

2.字符集

与这对比的是,字符集是个更广的概念,即使是Windows下普通的文本文件,也渗及到字符集的问题。不同的字符集,规定了不同的字符的编码方式。

一个 character set (字符集)是一组符号和编码。

比如,ASCII字符集,包括的字符有:数字,大小写字母,分号、换行之类的符号,编码方式是用一个7bit表示一个字符(A的编码是65,b的编码是98)。

ASCII只规定了英文字母的编码,非英文语言不能用ASCII编码表示,为此,不同的国家,都为自己的语言做了编码,比如,我们国家,就有GB2312编码。但每个国家之间的编码不同,也存在着一些跨平台的问题,为此,一些国际化标准组织,就制定了一些国际通用的编码,最常用的就是UTF8了。

ASCII只对英文符号和英文字母做了编码,GB2312对英文符号,英文字母,汉字做了编码,UTF8对世界上所有的语言文字做了编码,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。由此可见,UTF8是所含最广字符的字符集,所以,在一些多语言的WEB系统中,一般用UTF8字符集(PHPMyAdmin使用UTF8编码)。

任何文本的存储,都渗及到字符集的概念。包括数据库,也包括普通的文本文件。

主要术语:

字符:汉字,英文字母,标点符号,拉丁文等等。
编码:将字符转换成计算机存储的格式,比如,A用65表示。
字符集:一组字符以及对应的编码方式。

a. Mysql的字符集

Mysql目前支持多字符集,并且,支持在不同的字符集之间转换(便于移植和支持多语言)。

Mysql 可以设置服务器级字符集数据库级字符集数据表级字符集表列的字符集,实际上,最终使用字符集的地方是存储字符的列,比如,你设置 table1中col1列是字符类型,col1才用到了字符集,如果table1表的col2列是int类型,col2不使用字符集的概念。

服务器级字符集、数据库级字符集、数据表级字符集都是为列的字符集做默认选项的。

Mysql 一定有一个字符集,可以通过启动时加参数指定,也可以编译时指定,也可以在配置文件里指定。Mysql服务器字符集,只是做为数据库级的默认值。创建数据库时,你可以指定字符集,如果没指定,就使用服务器的字符集。同理,创建表时,你可以指定表级的字符集,如果没指定,使用数据库的字符集做为表的字符集。创建列时,你可以指定某列的字符集,如果没指定,就使用表的字符集。

通常情况下,您只需设置服务器级的字符集,其它的数据库级,表级,以及列级的字符集,都继承自服务器级字符集。
由于UTF8是最广的字符集,所以,一般情况下,我们设置Mysql服务器级的字符集为UTF8!

b. 普通文本的字符集问题

任何文本的存储,都存在着字符集的问题,普通文本文件也不例外。

Windows2000+的系统中,打开记事本,“保存为…”对话框,就有一个选项,可以让你选择存储文本的编码方式。

通常情况下,大家都使用Windows2000+的系统,都使用默认的编码,所以,不会碰到字符集的问题。
Windows下,保存文本文件时,可以选择编码方式,但打开文本文件时,都是自动判断编码方式的。网上有一个用Windows2000+的记事本玩移动,联通的笑话,大家可以搜搜,就是因为Windows在打开文本文件时,编码判断错误引起的问题。
因为自动判断编码有时会错误,所以,有的文本文件,规定了如何识别自身所使用的编码。

HTML文件就是一个这样的例子。

HTML是文本文件。存储HTML文件的时候,需要使用一个编码,并且,在HTML文件里,也使用HTML语法,指定了该文件所使用的编码(比如)。如果HTML文件没有指定编码,则浏览器自动识别文件的编码。如果HTML指定了编码,则浏览器使用HTML指定的编码。

通常情况下,HTML文件指定的charset和HTML文件自身的编码是一致的,但也有不一致的情况,如果不一致,就会导致网页乱码(此处乱码,只和文本文件有关,和数据库无关。)使用专门的网页编辑工具(比如Dreamwave),会自动根据网页中的charset值来编码文件。

c. php+mysql的字符集问题

PHP最终生成的是文本文件,但他要取数据库里的文本,或将文本存进数据库。

由于Mysql支持多字符集,默认情况下,Mysql不知道PHP发给他的是什么编码的字符,所以,Mysql要求客户端(PHP)告诉他存取的字符集是什么。

PHP通过设置character_set_client,告诉Mysql,PHP存进数据库的是什么编码方式。
PHP通过设置character_set_results,告诉Mysql,PHP需要取什么样编码的数据。
PHP通过设置character_set_connection,告诉Mysql,PHP查询中的文本,使用什么编码。

MYSQL使用设置的编码方式存储文本。

假设Mysql使用setserver来存储文本,PHP的character_set_client是setclient,PHP的 character_set_results是setresult。那么,Mysql将PHP发来的文本,从setclient编码方式,转换成 setserver编码方式,再存入数据库,如果PHP取文本,Mysql将文本从setserver转换成setresult,再发送给PHP。

PHP文件(最终生成的HTML文件)本身有个编码,如果Mysql传过来的编码,与PHP文件自身的编码不同,那么,整个网页,必然乱码。所以,PHP一般将自己的编码方式,告诉Mysql。

要保证不乱码,就必须将三个编码统一:

一是网页自身的编码;

二是HTML里指定的编码;

三是PHP告诉Mysql的编码(包括character_set_client和character_set_results)。

第一和第二个编码,如果使用DW之类的编辑器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。
第三个编码,需要手工通知Mysql。这步可以通过在PHP里使用mysql_query(“set names characterX”)来实现。


d.字符集的转换问题

如果小字集转换成大字符集,不会丢失数据,但大字集,转换成小字集,可能会丢失数据。

比如,UTF8里有的字符,GB2312不一定有,所以,从UTF8转换到GB2312可能会丢失一些字符。
但有种情况例外,先从GB2312转成UTF8,再从UTF8转成GB2312,这种情况是不会丢数据的,因为,刚开始转换的文本,都是GB2312里的字符,所以,整个过程都是GB2312的字符在转换,不会丢失。

正因为UTF8能容纳世界上的所有字符,所以,数据库一般使用UTF8编码。这使得,任何字符都可以存进UTF8编码的数据库。


e. PHPMyAdmin乱码的问题

PHPMyAdmin支持多国语言,这就必定要求HTML页面使用UTF8编码。
HTML页面使用UTF8编码,这就必定要求PHPMyAdmin连接Mysql时,character_set_client和character_set_results使用UTF8编码。

当前情况下,PHP连接Mysql只能是使用set names(或其它几个语句)来通知Mysql的编码方式,如果没有显式的声明编码方式,都将使用latin1编码。

一般的程序,都没有显式声明 character_set_client变量,所以,都是将gb2312文本,按latin1编码方式存在数据库,PHPMyAdmin再用utf8格式读取,肯定是乱码的。
如果PHP程序按正确的编码存入数据库,肯定是没有问题的。所以,需要修改的不是PHPMyAdmin.(虽然有时修改PHPMyAdmin可以解决乱码问题,但这不是问题的根本)

二.总结篇

上面的讲得有点乱,总结一下:

1.数据库尽量使用utf8存储(修改/etc/my.cnf,在[mysqld]段加上default-character-set=utf8)
(已有的数据库,先转成UTF8格式)

2.PHP 程序在查询数据库之前,执行mysql_query(“set names xxxx”);其中xxxx是你网页的编码(charset=xxxx),如果网页中charset=utf8,则xxxx=utf8,如果网页中 charset=gb2312,则xxxx=gb2312,如果网页中的charset=ipaddr,则xxxx=ipaddr (开个玩笑,没这编码)
几乎所有WEB程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入mysql_query(“set names”)就可以了。

3.PHPMyAdmin不需要做改动。

4.需要注意的是,为保证网页实际编码(Windows保存对话框里的编码)和他声明的编码(charset=?)是一致的,请用DW之类的工具做网页。


三. 补充:实战篇(2010-8-21 1:45:33)


需        求:对应的数据和表均已中文UTF8的编码方式进行存储和取出数据,PHP部分也使用UTF8编码形式操作MySQL中的数据。

当前环境:CentOS 5.4 + Apache 2.2.3 + PHP 5.2.10 +  MySQL 5.0.77 + phpMyAdmin 3.3.5

编码情况:

系统Console: zh_cn.UTF-8

MySQL: latin 1

[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 170
Server version: 5.0.77 Source distribution

Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.

mysql> status ;
--------------
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

Connection id:          170
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.77 Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 2 days 8 hours 27 min 55 sec

Threads: 1  Questions: 1903  Slow queries: 0  Opens: 78  Flush tables: 1  Open tables: 56  Queries per second avg: 0.009
--------------

mysql> show Variables like '%set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| auto_increment_offset    | 1                          |
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
9 rows in set (0.00 sec)

my.cnf设置

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

数据库编码设置 utf8_general_ci ,表中中文字段编码采用模式设置utf8_general_ci未改变。

phpMyAdmin链接编码链接校对集utf8_general_ci,数据通过phpMyAdmin添加。

在phpMyAdmin中显示正常。

PHP环境为Zend Framework 默认配置。数据库链接方式采用PDO_MySQL。配置信息如下:
%webroot%/application/configs/application.ini

resources.db.adapter = "PDO_Mysql"
resources.db.params.dbname = "hr"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = "password"

乱码现象

1. PHP通过Zend Framework MVC框架获取的数据设计中文部分显示为????????

2. 使用系统命令行,访问MySQL,查看对应数据库,中文部分同样显示????????


分析问题

1. phpMyAdmin中显示中文正常。说明,单从Zend Framework这个PHP程序的角度就存在设置问题。

2. MySQL命令行中显示乱码,说明client 和 connect 以及server 等相关的字符集不统一,或者,设置的当前字符集不支持UTF8 中文

解决方法

1. MySQL的默认字符集是latin1 总会出现一些问题,因此,将其默认调整成UTF8。

在[mysqld]的section和[client]的section中增加default-character-set = utf8

重启mysqld服务

[root@localhost ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
default-character-set = utf8

[root@localhost ~]# /etc/init.d/mysqld restart
停止 MySQL:                                               [确定]
启动 MySQL:                                               [确定]
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 2
Server version: 5.0.77 Source distribution

Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.

mysql> status ;
--------------
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.77 Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 13 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 12  Flush tables: 1  Open tables: 6  Queries per second avg: 0.385
--------------

mysql> use hr ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from tabCV ;
+----+---------+--------+-------------+--------------------+-----------+--------------------------+--------------------------+---------------+-----------------------+----------------------------+--------------------------------+-----------------+---------------+
| id | user_id | name   | birth_place | identity_card      | education | graduate_school          | major_class              | graduate_time | work_experience_years | network_optimization_years | cv_comments                    | pay_range_start | pay_range_end |
+----+---------+--------+-------------+--------------------+-----------+--------------------------+--------------------------+---------------+-----------------------+----------------------------+--------------------------------+-----------------+---------------+
|  1 |       1 | 李小明   | 北京        | 110111198401011111 |         2 | 北京信息工程学院         | 计算机科学与技术         | 2006-07-01    |                     4 |                          3 | 简历注释,普拉普拉~~~          |            8000 |         10000 |
+----+---------+--------+-------------+--------------------+-----------+--------------------------+--------------------------+---------------+-----------------------+----------------------------+--------------------------------+-----------------+---------------+
1 row in set (0.00 sec)

mysql> show Variables like '%set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| auto_increment_offset    | 1                          |
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
9 rows in set (0.00 sec)

mysql>

2. Zend Framework中增加MySQL链接的Adapter的编码设置。

编辑application.ini,增加adapter的characterset的设置

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.db.adapter = "PDO_Mysql"
resources.db.params.dbname = "hr"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = "password"
resources.db.params.charset = "utf8"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

以上,通过一个实际的问题,结合上述知识,调整了MySQL的编码中的显示乱码问题。今后遇到类似问题,只要仔细分析慢慢处理,虽然缓解比较多。但是一定是可以处理的。

Linux 下统计文件夹中文件的数量

虽然,很小白。但是,还是那句话,好记性不如烂笔头,卸下来吧。命令还是得常用才行。

方法一:

这里涉及几个命令:

命令1: ls -l === ll 其实不用太多解释,这个是入门命令,当然,还有-R参数。列出子目录和文件

命令2: grep “^-” grep我的理解是GNU正则(GNU regular expression)的缩写,这里是匹配以’-'开头的信息。因为,ll列出来的包括目录是以’d'开头的标示

命令3: wc -l wc命令(word characters)统计文件字符数,参数 -l 是统计行数。因此,通过管道符操作就可以将ll的文件列表的行数转化为文件数


统计当前文件夹下的文件数量,和 包括子文件下的数量

[root@localhost ~]# ll | grep "^-" | wc -l
22
[root@localhost ~]# ll -R | grep "^-" | wc -l
34

方法二:

这里涉及如下两个命令:

命令1: find ./ -type f man中对于’f'参数的解释如下:

-type c
              File is of type c:
              b      block (buffered) special
              c      character (unbuffered) special
              d      directory
              p      named pipe (FIFO)
              f      regular file
              l      symbolic link; this is never true if the -L option or the -follow option is in effect,
                     unless  the symbolic link is broken.  If you want to search for symbolic links when -L
                     is in effect, use -xtype.
              s      socket
              D      door (Solaris)

命令2: wc -l 上面解释了。这里不再陈述

[root@localhost ~]# find ./ -type f | wc -l
34
[root@localhost ~]#


需要注意的是这里命令的区别:

1. find 命令输出结果的速度要比ll的快很多。

2. find 方法是会查找子目录的。与 ll 命令的针对性不太相同。

有图无真相