Monday, March 30, 2009

纠结

前天与鹏哥和树爽碰面了,也聊到一些老同学最近的状况,提到小易说的“人未老,心已累”。虽然他们目前的处境都还算不错,但还是三言两语离不开未来的打算--转行。“在大学里面总是说的是郁闷,工作了总是说的是纠结”,鹏哥如是说。

其实,我也好不到哪去,进了实验室就像掉进了一个无底洞,总是有做不完的事情。忙忙碌碌,就象一台机器再不停的转,很少有时间停下来,思考一些东西。每周都在盼周末,希望能在周末把任务完成,然而下一周又开始有更多的任务!课逃的越来越多,自己想做的事也没有着落,英语也还没啥长进。时间就这样一周一周的过去。

你真的以为这就是我想过的生活吗?童年的梦想就像圣诞老人的传说,早已烟消云散。时不我与,在现有的环境下,你能象爱因斯坦,纳什有惊天济世的成就吗--这就是现实,我们必须去面对的东西。我们唯一可做的就是在这种现实下,做最好的自己。现阶段的心愿就是希望以后能让自己的家人过上幸福的生活罢了。

日子过的很快,真的很快。。。

Wednesday, March 25, 2009

在google-appengine上搭建django-1.0环境

现在成了逃课老油条了。趁着不想去实验室的功夫,把原来的gansha网捣鼓一下,希望能坚持下去把它顺利移植到google-appenegin上并加以改进,以让它重见天日,不枉费上个学期两个月的心血。

在google-appenegin的文档中看到一篇文章介绍 Google App Engine Helper,这是一个模拟在GAE上模拟django环境的开源软件包。svn版本已经开始支持django1.0以上的版本了,支持jango authentication框架和django 测试框架,适合用来在GAE上构建大型的django应用程序。

具体搭建步骤如下:
1.安装GAE和django 1.0.2
2.下载appengine_helper_for_django,并把该目录改名成project目录,删除svn文件
svn co http://google-app-engine-django.googlecode.com/svn/trunk/ \
appengine_helper_for_django
3.为google-appengine建立符号链接
ln -s /home/me/google_appengine /home/me/myproject/.google_appengine
4.复制django源文件(django目录)到project 目录下。如下文件可删除
django/bin
django/contrib/admin
django/contrib/databrowse
5.在project目录下,执行python manage.py runserver.如果没错的话,就会出现以下提示:
It worked!
Congratulations on your first Django-powered page.

Tuesday, March 24, 2009

口语之痛

昨天本来已经够郁闷了,没想到今天会更郁闷。

没想到时隔十二年之后,会再次被老师训顿惨的。上一次,小学四年级,后排同学就向我借个铅笔,老师二话不说,把我们叫到后排面壁思过。这次,我也并非没有做作业,我也不承认我是全班表现最差的一个,本来上周看了发音视频之后,也做了不少工作,希望这节课能挽回颜面,最终结果却比上次还惨--文章还没读完,就被叫坐下了,还被质问是否完成课后作业,说什么要对自己负责。。。无语了

下课之后,径直去了实验室,真想把这破课给退了,真不知道以后在这个课上怎么混下去。还好,有舒老在。经过他老人家点播之后,才明白问题所在。我每次读的时候,速度太快,没有节奏,脑中一片空白。外国佬说英语时,语调很丰富,说起来就让人感到很美。他还给我两点建议:注意意群的停顿和先把一个单词念准确了再去看下一个单词。效果果然不错。

但是,如何才能达到那种舒老那种程度啊?这可不是一朝一夕的事情,下节课又要怎么过啊?

Monday, March 23, 2009

进军hadoop

周末加班,任务完成的不错,李老师特地给我讲了讲以后的发展方向.大体上我们小组有两个选择:hadoop计算平台和分布式服务器平台架构(lvs+nginx+mysql ndb_cluster)。开始想做第二个,因为他说现在这个就整个实验室来说还是空白,而且要最终实现多台服务器的无缝接合,想想还是挺有挑战性的.“不往人多的地方跑”,这是我一贯做事的风格,hadoop的话,现在可以说是整个实验室的研究热点之一,所以不想凑这个热闹。第二原因就是可以重新回到从C++的怀抱,可以避开去学java。

后来,听了余师兄说,搞mysql cluser发不了论文,要想弄这个先还得将mysql翻个底朝天,弄不好将来出去只能做DBA了。这可不是我想干的。(现在、以后再也不和别人提什么以前的想法啊,理想啊,志向啊什么的了,免的再被别人当作神经病!)

其实"不往人多的地方跑"这个原则并不总是一定正确。以前大家都弄java时,我坚持鄙视之独尊C++,其实java和sun(至少比IBM强,尽管即将被IBM收购)也还是很不错的。上个学期n多人选数据挖掘时,我坚持与之划清界限,现在真正了解了一点之后,发现这动西还是挺有价值的。

hadoop,其实还是有很大发展前景的,引用百度百科的一句话--“这是云计算(Cloud Computing)的初级阶段的实现,是通向未来的桥梁。”虽然大家都在做,但你可以做的比其他人更好。

ps:我已决定,坚持写blog了,不为别的,只为记录自己真实的生活,给日后留下一些痕迹,不管是好也罢,坏也罢(起码现在没有其他任何人知道这个blog^_)。

Wednesday, March 18, 2009

感冒了

只有生病了,才知道身体比什么都重要。
也因为感冒,才不得不放慢自己的生活节奏,停下来思考---我不能再这样折腾下去了!
这么辛苦到底值得吗?
别人都过得很轻松啊,难道到时我发的钱会比他们多吗?
起码到现在还没提发钱的时,都不知道到底有没有发。
为了学东西吗?
这些东西可不是我的志向所在,如果说为了增长见识,现在已经足够多了。
虽然说,通过这些可以逐步熟悉平台,但任务何时能不再层出不穷,还是个未知数。
就像是个泥潭,你越挣扎,就会越陷越深。

我应该更关注自己想做的事情:gansha、gsoc、口语....只有这样才能把命运掌握在自己的手里。

只有在一个人生病时,才会体会什么叫真情,才会去看清一些东西,看透一些东西。四个月了,从一开始,不相信这个结局到现在的自我欺骗,其实从上次见最后一面时,就已看出,一切的一切只不过是我的自作多情而已。你的铁石心肠根本不可能再改变--我不适合你。可我却还在深夜为你心酸,为你流泪。

我这个人真是贱啊,总是这么折磨自己!

Thursday, March 12, 2009

mysql乱码问题之水落石出

问题:本地数据库直接复制了原服务器上的数据文件,包含一个host表,但在本地mysql中,select显示结果总是乱码,而用php调用确可正常显示.而在本地新建的表(utf8),确能在utf8编码环境下的mysql终端显示,却无法在php中正常显示,通过在php中的mysql_connect()后,加入mysql_query("set names utf8")后,可正常显示,但host表又不可显示.

show create database 和show create table显示都是使用utf8编码.
原来服务器上的配置文件:
[mysqld]
character_set_server=ascii
我的机子上的配置文件:
[mysqld]
default-character-set = utf8

原来服务器上:
mysql> show variables like "character%";
+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+

我的机子上:
mysql> show variables like "character%";
+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| 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/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.01 sec)

几个关键的变量含义如下:
(1)character_set_server:The server character set and collation are
used as default values if the database character set and collation
are not specified in CREATE DATABASE statements. They have no other purpose.
(2)character_set_database:The database character set and collation
are used as default values if the table character set and
collation are not specified in CREATE
TABLE statements. The database character set also is used by LOAD DATA INFILE. The character set and collation have no other purposes.
• What character set is the statement in when it leaves the client?
The server takes the character_set_client system variable to be the character set in which statements are sent by the client.
• What character set should the server translate a statement to after receiving it?
For this, the server uses the character_set_connection and collation_connection system variables. It converts
statements sent by the client from character_set_client to character_set_connection (except for string literals
that have an introducer such as _latin1 or _utf8). collation_connection is important for comparisons of literal strings.
For comparisons of strings with column values, collation_connection does not matter because columns have their own col-
lation, which has a higher collation precedence.

• What character set should the server translate to before shipping result sets or error messages back to the client?
The character_set_results system variable indicates the character set in which the server returns query results to the client.
This includes result data such as column values, and result metadata such as column names.
mysql根据以上变量,自动执行的编码转换(注意:此处转换只是按新的编码方式将原文字编码成新字符,并非修改编码):
(1)mysql接收查询语句时,如果有必要的话,自动执行将查询语句从character_set_client转换成character_set_connection编码.
(2)如果是insert语句,如果有必要的话,则还要根据表中定义的编码类型,完成一次转换,存入数据库中.
(3)返回结果时,如果有必要的话,完成表中编码类型向character_set_results编码类型的转换.
此处,"有必要"是指两端的两种编码方式不同.在使用php来和mysql通信的话,character_set_client只是起指示作用,并不一定保证php传过来的查询语句就是该编码.其正确性应由用户来保证.

问题应该是这样的:::
在原来的服务器上:
php发送查询语句(utf8格式)给mysql,
(1)由于character_set_client和character_set_connection都使用的是latin1编码,所以不用转换;
(2)如果是insert语句,由于表中数据为utf8编码,character_set_connection为latin1编码,数据(utf8)经历一次从latin1到utf8的转换,再存入!
(3)返回结果时,由于表中数据为utf8编码,character_set_results为latin1编码,数据(latin1_to_utf8(utf8))再经历一次从utf8->latin1的转换.最终结果还是utf8!
注意:(1)单纯的utf8->latin时,由于utf8"兼容"所有的字符集,故utf8中有些字符可能latin1中没有,这种转换可能导致信息丢失.但latin1->utf8不会.本例(1)中,utf8数据被错误的当成latin1被转换时,也可能出现某些字段无法对应latin1字符集,可能出错,所以虽然以上的方式一般显示的结果是正确的,但我觉得还是有必要将其改正过来.
(2)"For comparisons of strings with column values, collation_connection does not matter because columns have their own col-
lation, which has a higher collation precedence."--说明以上的转换不会影响对列值的匹配.因为列值的匹配有它自己的匹配规则,无论开始被转换成什么乱码,最终都会被转换成和列值同样的编码,再进行匹配(再次强调,编码转换只是改变解析方式,并不改变编码;同样的编码,不同的解析方式,被认为是不匹配的).

在我的机子上:
我机子上的表是复制服务器上的表,所以表里面的数据仍然是latin_to_utf8(utf8)格式的.但我的character set都设成了utf8.所以整个查询过程中,都不会进行编码转换,最终输出的就是latin_to_utf8(utf8)--乱码!无论你将终端界面的字符编码怎么设置,终会是乱码,只不过可能是不同形式的乱码而已.
另外,还有一个值得注意的地方,必须设置相应的collation_database和collation_server,否则在select查询时匹配每个列中的中文时,会显示空集.
原有服务器:
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | gbk_chinese_ci |
| collation_server | gbk_chinese_ci |
+----------------------+-------------------+
通过set @@global. collation_database=utf8_general_ci
set @@global. collation_server=utf8_general_ci,
重新登陆mysql可见,不加@@global.只对当前session有效.
最终在我的机子上:
mysql> show variables like "collation%";
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+

好了,原理都弄清了,解决办法也就浮出水面了:
(1)保持原有mysql变量,set names latin1;
(2)mysqldump -uroot -p --default-character-set=latin1 hcdata host > /mysql/a.sql;
(3)更正环境变量:set names utf8;
(4)备份原有host表alter table host rename host_backup
(5)导入a.sql:进入mysql后,执行命令source /mysql/a.sql
或直接 mysql -uroot -p hcdata </mysql/a.sql

下面这篇文章都以上几个参数做了几个试验,很不错.
http://chenzs19850728.blog.163.com/blog/static/7629609200868104214954/

Wednesday, March 11, 2009

逃课日

本周继续延续上周传统,周三de八节课还是没上,看来周三要成为我的逃课日了!

Monday, March 09, 2009

(转)svn在linux下的使用

转自:http://blog.163.com/kingna_jin/blog/static/32488347200868858899/

1、将文件checkout到本地目录

svn checkout path(path是服务器上的目录)

例如:svn checkout svn://192.168.1.1/pro/domain

简写:svn co

2、往版本库中添加新的文件

svn add file

例如:svn add test.php(添加test.php)

svn add *.php(添加当前目录下所有的php文件)

3、将改动的文件提交到版本库

svn commit -m “LogMessage“ [-N] [–no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)

例如:svn commit -m “add test file for my test“ test.php

简写:svn ci

4、加锁/解锁

svn lock -m “LockMessage“ [–force] PATH

例如:svn lock -m “lock test file“ test.php

svn unlock PATH

5、更新到某个版本

svn update -r m path

例如:

svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。

svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)

svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)

简写:svn up

6、查看文件或者目录状态

1)svn status path(目录下的文件和子目录的状态,正常状态不显示)

【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】

2)svn status -v path(显示文件和子目录状态)

第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。

注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。

简写:svn st

7、删除文件

svn delete path -m “delete test fle“

例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”

或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种

简写:svn (del, remove, rm)

8、查看日志

svn log path

例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化

9、查看文件详细信息

svn info path

例如:svn info test.php

10、比较差异

svn diff path(将修改的文件与基础版本比较)

例如:svn diff test.php

svn diff -r m:n path(对版本m和版本n比较差异)

例如:svn diff -r 200:201 test.php

简写:svn di

11、将两个版本之间的差异合并到当前文件

svn merge -r m:n path

例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

12、SVN 帮助

svn help

svn help ci

——————————————————————————

以上是常用命令,下面写几个不经常用的

——————————————————————————

13、版本库下的文件和目录列表

svn list path

显示path目录下的所有属于版本库的文件和目录

简写:svn ls

14、创建纳入版本控制下的新目录

svn mkdir: 创建纳入版本控制下的新目录。

用法: 1、mkdir PATH…

2、mkdir URL…

创建版本控制的目录。

1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增

调度,以待下一次的提交。

2、每个以URL指定的目录,都会透过立即提交于仓库中创建。

在这两个情况下,所有的中间目录都必须事先存在。

15、恢复本地修改

svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:

用法: revert PATH…

注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复

被删除的目录

16、代码库URL变更

svn switch (sw): 更新工作副本至不同的URL。

用法: 1、switch URL [PATH]

2、switch –relocate FROM TO [PATH…]

1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将

服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的

方法。

2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动

(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用

这个命令更新工作副本与仓库的对应关系。

17、解决冲突

svn resolved: 移除工作副本的目录或文件的“冲突”状态。

用法: resolved PATH…

注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的

相关文件,然后让 PATH 可以再次提交。

18、输出指定文件或URL的内容。

svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。

svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交

added 20094-5:
svn import [path] url:import file or tree into svn

Sunday, March 08, 2009

令人汗颜的牛人

"我把我本科的大好时光花费在图书馆阳光和灰尘交织的角落,书香和汗臭弥漫的书桌。唯一值得自豪的是基本通读完南京大学图书馆 TP312书架(计算机相关理论)的图书。"--令人好生惭愧!

Saturday, March 07, 2009

(转)常用字符集编码详解(ASCII GB2312 GBK GB18030 unicode UTF-8)

转自:http://www.jb51.net/article/16734.htm
ASCII

ASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。
只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。
GB2312
GB2312 是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般 用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。
区 位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计 3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字 是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。
GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
区 位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。
GBK
GBK编码是GB2312编码的超集,向下完全兼容 GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。
GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。
低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。
有 些系统中用0x40-0x7E中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也 存在相应问题。
CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。
GB18030
GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。
GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。
GB18030 的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是 0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。
Windows 中CP936代码页使用0x80来表示欧元符号,而在GB18030编码中没有使用0x80编码位,用其他位置来表示欧元符号。这可以理解为是 GB18030向下兼容性上的一点小问题;也可以理解为0x80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。
unicode
每 一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode。unicode为每个字符提供了 唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。
   Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。
   因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符 是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在 UTF-8和ASCII中,“A”的编码都是0x41.
   UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。
UTF-8
Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显 示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。不过现在很多论坛的插件一般只支持GBK。
---------------------------------------------------------------------------------------------
GB2312->GBK->GB18030

Friday, March 06, 2009

mysql删除root用户后的解决办法

一不小心,把root用户给删除了.结果,登陆时,输入密码总不对,提示:
MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)
不输入密码,反倒可以进去,但少了很多权限,有些数据库看不到.开始还以为谁把我的数据库给删了呢.

解决办法:
1.关闭mysql服务--直接kill.
2.mysqld_safe --user=mysql --skip-grant-tables --skip-networking
3.重新启动mysql服务,并mysql -uroot mysql登陆.
4.添加root用户:INSERT INTO user(host, user, password, select_priv, insert_priv, update_priv,...) VALUES ('localhost', 'root', PASSWORD(‘yourpassword’), 'Y', 'Y','Y'...);

再次重启mysql服务后,就ok了.

(转)mysql常用命令

转自:http://hi.baidu.com/%D4%C6%CB%AF%C1%CB/blog/item/d47057366fd0d1daa2cc2b65.html

1. 连接mysql:
mysqlbinmysql -h主机地址 -u 用户名 -p 用户密码

2.退出mysql:exit

3. 修改密码:
mysqlbinmysqladmin -uroot -p(oldpassword) password newpassword

4.增加用户:
添加一个用户test1 密码为ABC;让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入

mysql,然后键入以下命令:grant select,insert,update,delete on *.* to test1@"%" Identified
by "abc";

增加一个用户test2密码为abc,让其只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地

主机,即mysql数据库所在的那台主机),这样用户即使用知道test2的密码,也无法从internet上直接访问数据库,只能通过mysql主机上的web页

来访问了。grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

增加一个可以从任何地方连接服务器的一个完全的超级用户
grant all privileges on *.* to
test3@"%" identified by 'password' with grant option;

5.删除授权
revoke select,insert,update,delete om *.* from
test2@localhost ;

--------------------------------------------------------

6.显示数据库
show databases;

7.显示数据库中的表
use dataname;
show tables;

8.显示表的结构
describe tablesname;

9.建库
create database 库名;

10.建表
use dataname;
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '深圳',
year date
); //建表结束
//以下为插入字段
insert into teacher values('','glchengang','深圳一中','1976-10-10');
insert into teacher values('','jack','深圳一中','1975-12-23');

注:在建表中
(1) 将ID设为长度为3的数字字段:int(3),并让它每个记录自动加一: auto_increment,
并不能为空:not null,而且让它成为主字段primary key
(2) 将NAME设为长度为10的字符字段
(3) 将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别
呢,只有等以后的文章再说了。
(4) 将YEAR设为日期字段。
如果你在mysql提示符键入上面的命令也可以,但不方便调试。 你可以将以上命令
原样写入一个文本文件中假设为school.sql,然后复制到c:下,并在DOS状态进入目录
mysql in,然后键入以下命令:
mysql -uroot -p密码 < c:school.sql
如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你
只要将//的注释去掉即可使用)。


11.删除库和删除表
drop dataname;
drop tablename;

12.将表中的记录清空
delete from tablename;

13.显示表中的记录
select * from tablename;

14.表重命名
alter table t1 rename t2


---------------------------------------------------------

15. 备份数据库
mysqlbinmysqldump -h(ip) -uroot -p(password) databasename > database.sql

16. 恢复数据库
mysqlbinmysql -h(ip) -uroot -p(password) databasename <>

17.复制数据库
mysqldump --all-databases > all-databases.sal

18.备份表
mysqlbinmysqldump -h(ip) -uroot -p(password) databasename tablename > tablename.sql

19.恢复表(操作前先把原来的表删除)
mysqlbinmysql -h(ip) -uroot -p(password) databasename tablename <>

----------------------------------------------------------

20.为了改变列a,从INTEGER改为TINYINT NOT NULL(名字一样),
并且改变列b,从CHAR(10)改为CHAR(20),同时重命名它,从b改为c:
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

增加一个新TIMESTAMP列,名为d:
ALTER TABLE t2 ADD d TIMESTAMP;

在列d上增加一个索引,并且使列a为主键:
ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

删除列c:
ALTER TABLE t2 DROP COLUMN c;

增加一个新的AUTO_INCREMENT整数列,命名为c:
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,ADD INDEX (c);
注意,我们索引了c,因为AUTO_INCREMENT柱必须被索引,并且另外我们声明c为NOT NULL,
因为索引了的列不能是NULL

---------------------------------------------------------------

21.数据的导入导出
A。mysqlimport
语法:mysqlbinmysqlimport database tables.txt( 文件名需要与表名相同)
参数:-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息;
-f or --force 不管是否遇到错误,mysqlimport将强制继续插入数据;
-i or --ignore mysqlimport跳过或者忽略那些有相同唯一关键字的行, 导入文件中的数据将被忽略;
-l or -lock-tables 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响;
--fields-enclosed- by= char
  指定文本文件中数据的记录时以什么括起的, 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。
  --fields-terminated- by=char
  指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。您可以用此选项指定数据之间的分隔符。默认的分隔符是跳格符

(Tab)
  --lines-terminated- by=str
  此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字

符串来替代一个单个的字符: 一个新行或者一个回车。
  mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。

--------------------------------------------------------------

22.常用插入、修改、删除语句
插入记录:insert into teacher values('','glchengang','深圳一中','1976-10-10');
修改记录:update mytable set single=′y′ where name=′abccs′;
删除记录:delete from mytable where name=′abc′;

Wednesday, March 04, 2009

当音乐响起来的时候,想哭了

晚上本打算带张碟去看的,好不容易,各位大佬出差去了。尽实验室几天下来,新鲜感一过,剩下的就是身心的疲惫了。现在看到电脑,都有点反胃了,但又不得不坐过去,耳边总是萦绕众大佬的左叮右嘱的余音。今天起床晚了,把没预期逃的和预期逃的课都逃了,在实验室呆了一天,左思右想,这学期自打开学折腾gentoo起,就没有放松过,整天过着魂不守舍的生活,看部电影,应该不算过分吧?

不料,实验室的机子虽有光驱,但无法识别该刻录的DVD,该不会还是cd的吧?算了,幸好还带上了耳机,那就听听歌吧。于是下了mplayer的rpm,无奈无法解决依赖关系。Centos上的repository上的软件就是少哦,这个也没有,那个也没有,一个一个自己去找,然后再编译的话,估计今天晚上就不用回去了。

放mp3不行,用flashplayer总行吧。不料Adobe flashplayer linux上竟不支持X86_64。好不容易刚出了beta版,无奈前几天折腾上的X86版,死活卸不下来。。。

于是,在菜单里看到有Rythmbox音乐播放器,这个应该行吧,导入文件,居然说什么Gstream缺少mp3插件,真搞不懂gnome的人难道不听歌吗,搞个默认的播放器,连mp3,wma都放不了。Repository里没有插件,只好放弃。再考虑xmms,下载源码,编译,缺少qt4,kde等库,幸好Repository里都有,照着装上。居然cofigure时,说configure指定的是kde4.x,但我机子上装的是kd3。好吧,找了找,就把相关文件卸了,再configure,再提示,缺少kde库!耍我啊!自此,几乎崩溃。

最后,都不报什么希望了,下载了mplayer的源码来编译看看,死马当活马医。没想到,一路顺风。。。

(转)rpm一般用法

(转自http://hi.baidu.com/jw06/blog/item/978c4e30b0bb681feac4af22.html)
rpm -qpl xxxxxx.rpm
1.如何安装rpm软件包
rmp软件包的安装可以使用程序rpm来完成。执行下面的命令
rpm -i your-package.rpm
其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。
安装过程中可能出现下面的警告或者提示:
... conflict with ... 可能是要安装的包里有一些文件可能会覆盖现有
的文件,缺省时这样的情况下是无法正确安装的可以用
rpm --force -i 强制安装即可
... is needed by ...
... is not installed ... 此包需要的一些软件你没有安装可以用
rpm --nodeps -i 来忽略此信息
也就是说,rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包
都能安装上,但这种强制安装的软件包不能保证完全发挥功能
2.如何安装.src.rpm软件包
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时
需要进行编译。这类软件包有两种安装方法,
方法一:
1.执行rpm -i your-package.src.rpm
2. cd /usr/src/redhat/SPECS
3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件
4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录
5. ./configure 这一步和编译普通的源码软件一样,可以加上参数
6. make
7. make install
方法二:
1.执行rpm -i you-package.src.rpm
2. cd /usr/src/redhat/SPECS
前两步和方法一相同
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)
在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。
3.如何卸载rpm软件包
使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀.rpm
比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd
不可以是下列格式:
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1
有时会出现一些错误或者警告:
... is needed by ... 这说明这个软件被其他软件需要,不能随便卸载
可以用rpm -e --nodeps强制卸载
4.如何不安装但是获取rpm包中的文件
使用工具rpm2cpio和cpio
rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程
d和make-directory相同,表示根据包中文件原来的路径建立目录
m表示保持文件的更新时间。
5.如何查看与rpm包相关的文件和其他信息
下面所有的例子都假设使用软件包mysql-3.23.54a-11
1.我的系统中安装了那些rpm软件包
rpm -qa 讲列出所有安装过的包
如果要查找所有安装过的包含某个字符串sql的软件包
rpm -qa |grep sql
2.如何获得某个软件包的文件全名
rpm -q mysql 可以获得系统中安装的mysql软件包全名,从中可以获得
当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11
3.一个rpm包中的文件安装到那里去了?
rpm -ql 包名
注意这里的是不包括.rpm后缀的软件包的名称
也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。
如果只是想知道可执行程序放到那里去了,也可以用which,比如
which mysql
4.一个rpm包中包含那些文件
一个没有安装过的软件包,使用rpm -qlp ****.rpm
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm
5.如何获取关于一个软件包的版本,用途等相关信息?
一个没有安装过的软件包,使用rpm -qip ****.rpm
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm
6.某个程序是哪个软件包安装的,或者哪个软件包包含这个程序
rpm -qf `which 程序名` 返回软件包的全名
rpm -qif `which 程序名` 返回软件包的有关信息
rpm -qlf `which 程序名` 返回软件包的文件列表
注意,这里不是引号,而是`,就是键盘左上角的那个键。
也可以使用rpm -qilf,同时输出软件包信息和文件列表

7.某个文件是哪个软件包安装的,或者哪个软件包包含这个文件
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以
用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。
首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
# whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
# rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1
总结:
获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如
i 表示info,获得软件包的信息;
l 表示list,获得文件列表;
a 表示all,在所有包中执行查询;
f 表示file,根据文件进行相关的查询;
p 表示package,根据软件包进行查询
需要的查询条件可以使用grep产生,或者从"` `"中的命令行产生
6.关于rpm软件包的一些相关知识
1.什么是rpm
rpm 即RedHat Package Management,是RedHat的发明之一
2.为什么需要rpm
在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的
程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装,
配置,卸载的自动化问题。为了解决这些问题,RedHat针对自己的系统提出了一个
较好的办法来管理成千上百的软件。这就是RPM管理系统。在系统中安装了rpm管理系统
以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载
3.是不是所有的linux都使用rpm
任何系统都需要包管理系统,因此很多linux都使用rpm系统。但rpm系统是为RH专门
但是TL,Mandrake等系统也都使用rpm。由于rpm的源程序可以在别的系统上进行编译,
所以有可能在别的系统上也使用rpm
除了rpm,其他一些系统也有自己的软件包管理程序,例如debian的deb包,
slakware也都有自己的包管理系统
4.rpm包的文件名为什么那么长
rpm包的文件名中包含了这个软件包的版本信息,操作系统信息,硬件要求等等。
比如mypackage-1.1-2TL.i386.rpm,其中mypackage是在系统中登记的软件包的名字
1.1是软件的版本号,2是发行号,TL表示用于TL操作系统,还可能是RH等。i386表示
用于intel x86平台,还可能是sparc等。
5.软件包文件名中的i386,i686是什么意思
rpm软件包的文件名中,不仅包含了软件名称,版本信息,还包括了适用的硬件架构
的信息。
i386指这个软件包适用于intel 80386以上的x86架构的计算机(AI32)
i686指这个软件包适用于intel 80686以上(奔腾pro以上)的x86架构的计算机(IA32)
noarch指这个软件包于硬件架构无关,可以通用。
i686软件包的程序通常针对CPU进行了优化,所以,向后兼容比较用以,i386的包在
x86机器上都可以用。向前一般不兼容。不过现在的计算机,奔腾pro以下的CPU已经很少
用,通常配置的机器都可以使用i686软件包

6.不同操作系统发行的rpm包可否混用?
对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。
对于以src.rpm发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同
系统下安装。
7.使用rpm时遇到的一些特殊问题
Q 我用rpm -e **.rpm无法删除rpm包
A 包名不要包括rpm,
rpm -e 包名,可以包含版本号等信息,但是不可以有后缀.rpm
Q 在MS的系统下有没有读RPM文件的工具?
A wincmd with rpm plugins.....
Q 是否可以通过ftp安装安装升级rpm包?
A 可以。rpm -ivh ftp://xxxxxxxx/PATH2SomeRPM
Q rpm安装时已有的包版本过高怎么办?
A 有时由于安装的软件包太老,而系统中相关的软件包版本比较新,所以可能需要
安装的包依赖的一些文件会找不到。这时有两种解决办法,
第一是在系统文件中找到和需要的文件功能相同或相似的文件,做一个符号链接到
需要的目录下。
第二是下载安装新版本的软件包。

Tuesday, March 03, 2009

(转)Bash shell 快捷键记录

这篇 Bash Shell Shortcuts 的快捷键总结的非常好。值得学习。下面内容大多数是拷贝粘贴与总结.

CTRL 键相关的快捷键:

Ctrl + a - Jump to the start of the line
Ctrl + b - Move back a char
Ctrl + c - Terminate the command //用的最多了吧?
Ctrl + d - Delete from under the cursor
Ctrl + e - Jump to the end of the line
Ctrl + f - Move forward a char
Ctrl + k - Delete to EOL
Ctrl + l - Clear the screen //清屏,类似 clear 命令
Ctrl + r - Search the history backwards //查找历史命令
Ctrl + R - Search the history backwards with multi occurrence
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
Ctrl + xx - Move between EOL and current cursor position
Ctrl + x @ - Show possible hostname completions
Ctrl + z - Suspend/ Stop the command
补充:
Ctrl + h - 删除当前字符
Ctrl + w - 删除最后输入的单词

ALT 键相关的快捷键:

平时很少用。有些和远程登陆工具冲突。
Alt + < - Move to the first line in the history Alt + > - Move to the last line in the history
Alt + ? - Show current completion list
Alt + * - Insert all possible completions
Alt + / - Attempt to complete filename
Alt + . - Yank last argument to previous command
Alt + b - Move backward
Alt + c - Capitalize the word
Alt + d - Delete word
Alt + f - Move forward
Alt + l - Make word lowercase
Alt + n - Search the history forwards non-incremental
Alt + p - Search the history backwards non-incremental
Alt + r - Recall command
Alt + t - Move words around
Alt + u - Make word uppercase
Alt + back-space - Delete backward from cursor
// SecureCRT 如果没有配置好,这个就很管用了。

其他特定的键绑定:

输入 bind -P 可以查看所有的键盘绑定。这一系列我觉得更为实用。
Here "2T" means Press TAB twice
$ 2T - All available commands(common) //命令行补全,我认为是 Bash 最好用的一点
$ (string)2T - All available commands starting with (string)
$ /2T - Entire directory structure including Hidden one
$ ./2T - Only Sub Dirs inside including Hidden one
$ *2T - Only Sub Dirs inside without Hidden one
$ ~2T - All Present Users on system from "/etc/passwd" //第一次见到,很好用
$ $2T - All Sys variables //写Shell脚本的时候很实用
$ @2T - Entries from "/etc/hosts" //第一次见到
$ =2T - Output like ls or dir //好像还不如 ls 快捷
补充:
Esc + T - 交换光标前面的两个单词

很多来自GNU 的 readline 库。另外一份总结也很好

记忆是所有技术人员的敌人。一次要把所有的都记住是不可能的。针对自己的使用习惯,对少数快捷键反复使用,短期内就会有效果。

你还知道那些好用的快捷键 ? 补充一下 ?

--EOF--

恒乃贵--有感卢师兄与他的gui8.com

今日平日不甚言语的卢师兄兴致勃勃的介绍了他的网站之后,很是惭愧。自己从大一开始,就学做网站,受益于中南的在全国还算不错的网络建设环境,摸爬滚打,经手的网站数十个。虽然也多次尝试过自己建站,但每每有始无终,开头热血沸腾,到后来烧一退,便抛到九霄云外。

反观,卢师兄这个网站,无论从技术上还是美观程度上讲,并不专业(不过内容确实很新颖,很专注),但人家能从大二一直坚持到现在。目前每天能有数千的访问量,甚至还有人投稿,情形好时每月靠广告有七八百大洋入账。

想起了以前的一句老签名---凡事若不能坚持三年,注定无果。以往的不懈努力可能就付之东流了,这也就是你虽然比别人付出多得多,但却收益未必比别人好的原因了。

两年零两个月十天,我需要多久才能忘切。。。

Monday, March 02, 2009

Emacs tips

一些网上不常见,但又很方便的设置,不断增加中...
1.使emacs中剪贴或复制的文字能粘贴到其他程序:
(setq x-select-enable-clipboard t)

2.;scroll other window
(global-set-key (kbd "C-c C-v") 'scroll-other-window)
(global-set-key (kbd "C-c C-b") 'scroll-other-window-down)

很怀念长沙的旧书店

豆瓣上搜教材,忽然看到正好有个人转,查看资料,是长沙的。。。
真的很怀念长沙,成片成片的旧书市场。因为它们的存在,不必为买教材发愁;因为它们的存在,没事的时候,可以去那逛逛,享受淘书的乐趣。。。

来到北京之后,只知道清华有个独峰书院,路远价不低。北大人大的周末书市又尽是些垃圾书,唯有狠心上卓越、当当了。

Insist On

English words
Go to bed at 23:30

About Me

Gtalk:l0he1g at gmail
Location:Beijing,China