Monday, May 04, 2009
(转)patch用法
因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。
学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次学全是不可能的,只能先学习最为常用的,在以后不断实践的过程中逐步的丰富,最终达到比较高的水平。把握的原则是:日有所学,学以致用,用以促学。
首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。
1、diff
--------------------
NAME
diff - find differences between two files
SYNOPSIS
diff [options] from-file to-file
--------------------
简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:
-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。
2、patch
------------------
NAME
patch - apply a diff file to an original
SYNOPSIS
patch [options] [originalfile [patchfile]]
but usually just
patch -pnum <patchfile>
------------------
简单的说,patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:
-p0 选项要从当前目录查找目的文件(夹)
-p1 选项要忽略掉第一层目录,从当前目录开始查找。
************************************************************
在这里以实例说明:
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。
如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。
************************************************************
-E 选项说明如果发现了空文件,那么就删除它
-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)
下面结合具体实例来分析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。
环境:在RedHat 9.0下面以armlinux用户登陆。
目录树如下:
|-- bootloader
|-- debug
|-- images
|-- kernel
|-- program
|-- rootfiles
|-- software
|-- source
|-- sysapps
|-- tmp
`-- tools
下面在program文件夹下面建立patch文件夹作为实验用,然后进入patch文件夹。
一、为单个文件进行补丁操作
1、建立测试文件test0、test1
[armlinux@lqm patch]$ cat >>test0<<EOF
> 111111
> 111111
> 111111
> EOF
[armlinux@lqm patch]$ more test0
111111
111111
111111
[armlinux@lqm patch]$ cat >>test1<<EOF
> 222222
> 111111
> 222222
> 111111
> EOF
[armlinux@lqm patch]$ more test1
222222
111111
222222
111111
2、使用diff创建补丁test1.patch
[armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch
【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】
[armlinux@lqm patch]$ ls
test0 test1 test1.patch
[armlinux@lqm patch]$ more test1.patch
************************************************************
patch文件的结构
补丁头
补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。
块
块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里只是引用的而不需要修改。
************************************************************
***diff命令会在补丁文件中记录这两个文件的首次创建时间,如下***
--- test0 2006-08-18 09:12:01.000000000 +0800
+++ test1 2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
111111
-111111
+222222
111111
[armlinux@lqm patch]$ patch -p0 < test1.patch
patching file test0
[armlinux@lqm patch]$ ls
test0 test1 test1.patch
[armlinux@lqm patch]$ cat test0
222222
111111
222222
111111
3、可以去除补丁,恢复旧版本
[armlinux@lqm patch]$ patch -RE -p0 < test1.patch
patching file test0
[armlinux@lqm patch]$ ls
test0 test1 test1.patch
[armlinux@lqm patch]$ cat test0
111111
111111
111111
二、为多个文件进行补丁操作
1、创建测试文件夹
[armlinux@lqm patch]$ mkdir prj0
[armlinux@lqm patch]$ cp test0 prj0
[armlinux@lqm patch]$ ls
prj0 test0 test1 test1.patch
[armlinux@lqm patch]$ cd prj0/
[armlinux@lqm prj0]$ ls
test0
[armlinux@lqm prj0]$ cat >>prj0name<<EOF
> prj0/prj0name
> EOF
[armlinux@lqm prj0]$ ls
prj0name test0
[armlinux@lqm prj0]$ cat prj0name
prj0/prj0name
[armlinux@lqm prj0]$ cd ..
[armlinux@lqm patch]$ mkdir prj1
[armlinux@lqm patch]$ cp test1 prj1
[armlinux@lqm patch]$ cd prj1
[armlinux@lqm prj1]$ cat >>prj1name<<EOF
> prj1/prj1name
> EOF
[armlinux@lqm prj1]$ cat prj1name
prj1/prj1name
[armlinux@lqm prj1]$ cd ..
2、创建补丁
[armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch
[armlinux@lqm patch]$ more prj1.patch
diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name 2006-08-18 09:25:11.000000000 +0800
+++ prj1/prj0name 1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-prj0/prj0name
diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name 1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name 2006-08-18 09:26:36.000000000 +0800
@@ -0,0 +1,3 @@
+prj1/prj1name
diff -uNr prj0/test0 prj1/test0
--- prj0/test0 2006-08-18 09:23:53.000000000 +0800
+++ prj1/test0 1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
--- prj0/test1 1970-01-01 08:00:00.000000000 +0800
+++ prj1/test1 2006-08-18 09:26:00.000000000 +0800
@@ -0,0 +1,4 @@
+222222
+111111
+222222
+111111
[armlinux@lqm patch]$ ls
prj0 prj1 prj1.patch test0 test1 test1.patch
[armlinux@lqm patch]$ cp prj1.patch ./prj0
[armlinux@lqm patch]$ cd prj0
[armlinux@lqm prj0]$ patch -p1 < prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
[armlinux@lqm prj0]$ ls
prj1name prj1.patch test1
[armlinux@lqm prj0]$ patch -R -p1 < prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
[armlinux@lqm prj0]$ ls
prj0name prj1.patch test0
-------------------
总结一下:
单个文件
diff –uN from-file to-file >to-file.patch
patch –p0 < to-file.patch
patch –RE –p0 < to-file.patch
多个文件
diff –uNr from-docu to-docu >to-docu.patch
patch –p1 < to-docu.patch
patch –R –p1 <to-docu.patch
-------------------
三、应用
为内核打补丁。前面在创建交叉编译工具链时,其中有一步就是为内核打补丁。当时还不是特别了解,现在很清晰了。参考前面的文章《基于ARM+Linux嵌入式开发的开发工具链的建立》。
1、首先是解压,因为发布的补丁文件都是使用gzip压缩的。
$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz
2、然后进入你的内核源代码目录
$cd linux-2.4.21
3、打补丁
$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1
打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:
$find . -name *.rej
如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。
$fine . -name *.rej >reject
然后可以查看reject的内容了。
Friday, May 01, 2009
Sunday, April 26, 2009
实验室出游
爨头沟虽然传说是北京保存最完好的古镇,还什么“小布达拉宫”,但很多人都后悔在那耽误时间了。总个村子就那么三四十来间房子,除了铁将军把门的,都成了旅店餐馆了。而且由于在山口风沙极大,本来坐车到那都十一点多了,大家都饥肠挂肚,很多餐馆都在那煮羊肉,香味四溢,真实活受罪啊。总之,北京的山都是些石头,北京的民居真是又矮又小,和家乡的比,简直象到了小人国似的,真不知道以前的北京人在这么小的房子是怎么过活的。所谓的古镇,也不过就一些破房子,墙上有些历史的题字了。
双龙峡还不错,除了有山之外,还有水,这在北京是很难能可贵的。而且泉水很清很凉,山上植被也还算可以。唯一不爽了,由于上午在那小村耽误了,下午吃完饭,只有两个多小时的游览时间。开始和同学游走,好不容易到了第一个景点--第一瀑布,旁边的游客如此形容之,“远看象小孩尿尿”。瀑布旁有个旋转铁梯可以上山,但随行的两小伙一致决定不上去了。我心有不甘,便干脆一个人上去了,发现还有很长一段路可以走。本来吗,来自就是为了放开尽兴的,人多了,在一起还受到牵制,反而一个人走,随便怎么蹦啊跳的,想走快就快,想停就停,惬意多了。半路上又碰到了余鹏他们三个猛的,组成一支小分队。最终小分队顺利到达终点站,也就是最负盛名的冰瀑。确实挺奇怪的,这种时候,山上竟然结那么多冰。不过,接下来的返途为了赶汽车,四个人一路狂奔,差点腿抽筋。
最后,总算赶上车了,车的很多人知道我们去了冰瀑,都拍着大腿说后悔没有和我们一起走。还是挺中意今天这种活动的,爬爬山活动下筋骨,亲近下大自然,恨不得每个礼拜都来。
回来后,直接去了实验室,看了《阿甘正传》,因为在车上用mp3听录音时发现基本上没听懂,虽然以前看过一遍。总算明白了,为什么有人的qq昵称就一个跑字了。这部片子,很有意义,也很有意思,值得再看几遍。累了,不多说了,得睡了。
爨头村
第一瀑布
Thursday, April 23, 2009
灰色的一天
心烦意乱,回去吃中饭。吃完饭,不知道干什么,午睡吧,睡不着,脑子里始终都是宿舍里另外一个人敲键盘的声音。一个半小时过去,不得不去实验室了,心情跟外面的天一样的灰。骑着车,冷风直往衣服里灌。正想着今天情绪如此低落,不会和哪位司机大哥 发生一些没默契的事吧。不到十秒钟后,疯狂的石头里经典的一幕上演到了我的身上。在这既窄车多的马路上,一辆的士居然正好在我三米之内把门打开了,刹车急拐已经来不急了,硬是被撞下车了。还好,今天车骑得的不是特别快,撞的也不是特别严重,人和车都还不至于去医院,只是因为上午被淋湿而刚换的裤子又要换了,小腿在短时间内恐怕有条一尺来长的伤痕罢了。司机态度还不错,说要给我些钱,没要。
可怜我的车,其实昨天被刮擦过两次了。以后注意了,毕竟北京不是长沙:
(1)骑车时不要听mp3;
(2)心烦意乱时不要骑车;
(3)骑车速度一定要慢!
-------------------------added on 23:30 2009/04/23----------------------
屋漏偏逢连夜雨,一场大雨过后,回来一看,车子没了!
本周损失好惨重,先是买mp3遇奸商,后是电脑挂掉了(害得差点没来得及交社会主义的考试论文),现在没过两天又发生这种事,日子叫人怎么活啊!
回到宿舍,灯泡都坏掉了,老天爷一定是在惩罚我了。
以后要步行去科图了,不过还好,一个月之后,可以选择搬到那边去住,过上清净的日子。
Wednesday, April 22, 2009
(转)mysql慢查询日志
打开mysql的慢查询日志记录
mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢?
其实打开mysql的慢查询日志很简单,只需要在mysql的配置文件里(windows系统是my.ini,linux系统是的[mysqld]下面加上如下代码:
log-slow-queries=/var/lib/mysql/slowquery.loglong_query_time=2
注:
log-slow-queries 设置把日志写在那里,为空的时候,系统会给慢查询日志赋予主机名,并被附加slow.log. /var/lib/mysql/slowquery.log为日志存放的文件的位置,一般这个目录要有mysql的运行帐号的可写权限,一般都将这个目录设置为mysql的数据存放目录
long_query_time=2中的2表示查询超过两秒才记录.
如果设置了参数log-long-format,那么所有没有使用索引的查询也将被记录。在文件my.cnf或my.ini中加入下面这一行可以记录这些查询
这是一个有用的日志。它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用)
# Time: 070927 8:08:52
# User@Host: root[root] @ [192.168.0.20]
# Query_time: 372 Lock_time: 136 Rows_sent: 152 Rows_examined: 263630
select id, name from manager where id in (66,10135);
这是慢查询日志中的一条,用了372秒,锁了136秒,返回152行,一共查了263630行
如果日志内容很多,用眼睛一条一条去看会累死,mysql自带了分析的工具,使用方法如下:
命令行下,进入mysql/bin目录,输入mysqldumpslow –help或--help可以看到这个工具的参数,主要有
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
Parse and summarize the MySQL slow query log. Options are
--verbose verbose
--debug debug
--help write this text to standard output
-v verbose
-d debug
-s ORDER what to sort by (t, at, l, al, r, ar etc), 'at' is default
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup scrīpt)
-s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有
c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。
(转)优化MySQL数据库查询的三个方法
1: 使用索引
MySQL允许对数据库表进行索引,以此能迅速查找记录,而无需一开始就扫描整个表,由此显著地加快查询速度。每个表最多可以做到16个索引,此外 MySQL还支持多列索引及全文检索。 给表添加一个索引非常简单,只需调用一个CREATE INDEX命令并为索引指定它的域即可。
列表A给出了一个例子:
mysql> CREATE INDEX idx_username ON users(username);
Query OK, 1 row affected (0.15 sec)
Records: 1 Duplicates: 0 Warnings: 0
这里,对users表的username域做索引,以确保在WHERE或者HAVING子句中引用这一域的SELECT查询语句运行速度比没有添加索引时要快。通过SHOW INDEX命令可以查看索引已被创建(列表B):
mysql> SHOW INDEX FROM users;
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| users | 1 | idx_username | 1 | username | A | NULL | NULL | NULL | YES | BTREE | |65g站长资讯
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 row in set (0.00 sec)
值得注意的是:索引就像一把双刃剑。对表的每一域做索引通常没有必要,且很可能导致运行速度减慢,因为向表中插入或修改数据时,MySQL不得不每次都为这些额外的工作重新建立索引。另一方面,避免对表的每一域做索引同样不是一个非常好的主意,因为在提高插入记录的速度时,导致查询操作的速度减慢。这就需要找到一个平衡点,比如在设计索引系统时,考虑表的主要功能(数据修复及编辑)不失为一种明智的选择。
2: 使用Explain分析优化查询性能
在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。下面的一个简单例子可以说明(列表C)这一过程:
mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | country | const | PRIMARY | PRIMARY | 3 | const | 1 | Using index |
| 1 | SIMPLE | city | ALL | NULL | NULL | NULL | NULL | 4079 | Using where |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
2 rows in set (0.00 sec)
这里查询是基于两个表连接。EXPLAIN关键字描述了MySQL是如何处理连接这两个表。必须清楚的是,当前设计要求MySQL处理的是 country表中的一条记录以及city表中的整个4019条记录。这就意味着,还可使用其他的优化技巧改进其查询方法。例如,给city表添加如下索引(列表D):
mysql> CREATE INDEX idx_ccode ON city(countrycode);
Query OK, 4079 rows affected (0.15 sec)
Records: 4079 Duplicates: 0 Warnings: 0
现在,当我们重新使用EXPLAIN关键字进行查询时,我们可以看到一个显著的改进(列表E): 列表 E mysql> EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode = country.code AND country.code = 'IND';
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
| 1 | SIMPLE | country | const | PRIMARY | PRIMARY | 3 | const | 1 | Using index |
| 1 | SIMPLE | city | ref | idx_ccode | idx_ccode | 3 | const | 333 | Using where |
+----+-------------+---------+-------+---------------+-----------+---------+-------+------+-------------+
2 rows in set (0.01 sec) 在这个例子中,MySQL现在只需要扫描city表中的333条记录就可产生一个结果集,其扫描记录数几乎减少了90%!自然,数据库资源的查询速度更快,效率更高。
3: 调整内部变量
MySQL是如此的开放,所以可轻松地进一步调整其缺省设置以获得更优的性能及稳定性。需要优化的一些关键变量如下:改变索引缓冲区长度(key_buffer)
一般,该变量控制缓冲区的长度在处理索引表(读/写操作)时使用。MySQL使用手册指出该变量可以不断增加以确保索引表的最佳性能,并推荐使用与系统内存25%的大小作为该变量的值。这是MySQL十分重要的配置变量之一,如果你对优化和提高系统性能有兴趣,可以从改变key_buffer_size变量的值开始。 改变表长(read_buffer_size)
当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。 设定打开表的数目的最大值(table_cache)
该变量控制MySQL在任何时候打开表的最大数目,由此能控制服务器响应输入请求的能力。它跟max_connections变量密切相关,增加table_cache值可使MySQL打开更多的表,就如增加max_connections值可增加连接数一样。当收到大量不同数据库及表的请求时,可以考虑改变这一值的大小。对缓长查询设定一个时间限制(long_query_time)
MySQL带有“慢查询日志”,它会自动地记录所有的在一个特定的时间范围内尚未结束的查询。这个日志对于跟踪那些低效率或者行为不端的查询以及寻找优化对象都非常有用。
long_query_time变量控制这一最大时间限定,以秒为单位。 以上讨论并给出用于分析和优化SQL查询的三种工具的使用方法,以此提高你的应用程序性能。使用它们快乐地优化吧!
(转)MySQL索引分析和优化
一、什么是索引?
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时 MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已 经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
假设我们创建了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL )
然后,我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分:
可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列:
对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的"指针"。因此,如果我们要查找 name等于"Mike"记录的peopleid(SQL命令为"SELECT peopleid FROM people WHERE name=\'Mike\';"),MySQL能够在name的索引中查找"Mike"值,然后直接转到数据文件中相应的行,准确地返回该行的 peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有"name"列的索引,MySQL要扫描数据文件中的所有 记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。
二、索引的类型
MySQL提供多种索引类型供选择:
- 普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:- 创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
- 修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
- 创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
- 唯一性索引
这种索引和前面的"普通索引"基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建:- 创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
- 修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
- 创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
- 主键
主键是一种唯一性索引,但它必须指定为"PRIMARY KEY"。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如"CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); "。但是,我们也可以通过修改表的方式加入主键,例如"ALTER TABLE tablename ADD PRIMARY KEY (列的列表); "。每个表只能有一个主键。 - 全文索引
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。 全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,要了解更多信息,请参见MySQL documentation。
三、单列索引与多列索引
索引可以是单列索引,也可以是多列索引。下面我们通过具体的例子来说明这两种索引的区别。假设有这样一个people表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL AUTO_INCREMENT, firstname CHAR(50) NOT NULL, lastname CHAR(50) NOT NULL, age SMALLINT NOT NULL, townid SMALLINT NOT NULL, PRIMARY KEY (peopleid) );
下面是我们插入到这个people表的数据:
这个数据片段中有四个名字为"Mikes"的人(其中两个姓Sullivans,两个姓McConnells),有两个年龄为17岁的人,还有一个名字与众不同的Joe Smith。
这个表的主要用途是根据指定的用户姓、名以及年龄返回相应的peopleid。例如,我们可能需要查找姓名为 Mike Sullivan、年龄17岁用户的peopleid(SQL命令为SELECT peopleid FROM people WHERE firstname=\'Mike\' AND lastname=\'Sullivan\' AND age=17;)。由于我们不想让MySQL每次执行查询就去扫描整个表,这里需要考虑运用索引。
首先,我们可以考虑在单个列上创建索引,比如firstname、lastname或者age列。如果我们创建 firstname列的索引(ALTER TABLE people ADD INDEX firstname (firstname);),MySQL将通过这个索引迅速把搜索范围限制到那些firstname=\'Mike\'的记录,然后再在这个"中间结果集 "上进行其他条件的搜索:它首先排除那些lastname不等于"Sullivan"的记录,然后排除那些age不等于17的记录。当记录满足所有搜索条 件之后,MySQL就返回最终的搜索结果。
由于建立了firstname列的索引,与执行表的完全扫描相比,MySQL的效率提高了很多,但我们要求 MySQL扫描的记录数量仍旧远远超过了实际所需要的。虽然我们可以删除firstname列上的索引,再创建lastname或者age列的索引,但总 地看来,不论在哪个列上创建索引搜索效率仍旧相似。
为了提高搜索效率,我们需要考虑运用多列索引。如果为firstname、lastname和age这三个列创建一个多列索引,MySQL只需一次检索就能够找出正确的结果!下面是创建这个多列索引的SQL命令:
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录!
那么,如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个 firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果 你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、 lastname、age这三个列上的多列索引。
四、最左前缀
多列索引还有另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引 为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引:
- firstname,lastname,age
- firstname,lastname
- firstname
从另一方面理解,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引:
SELECT peopleid FROM people WHERE firstname=\'Mike\' AND lastname=\'Sullivan\' AND age=\'17\';
SELECT peopleid FROM people WHERE firstname=\'Mike\' AND lastname=\'Sullivan\';
SELECT peopleid FROM people WHERE firstname=\'Mike\'; The following queries cannot use the index at all:
SELECT peopleid FROM people WHERE lastname=\'Sullivan\';
SELECT peopleid FROM people WHERE age=\'17\'; SELECT peopleid FROM people WHERE lastname=\'Sullivan\' AND age=\'17\';
五、选择索引列
在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。请看下面这个查询:
SELECT age ## 不使用索引 FROM people WHERE firstname=\'Mike\' ## 考虑使用索引 AND lastname=\'Sullivan\' ## 考虑使用索引
这个查询与前面的查询略有不同,但仍属于简单查询。由于age是在SELECT部分被引用,MySQL不会用它来限制列选择操作。因此,对于这个查询来说,创建age列的索引没有什么必要。下面是一个更复杂的例子:SELECT people.age, ##不使用索引 town.name ##不使用索引 FROM people LEFT JOIN town ON people.townid=town.townid ##考虑使用索引 WHERE firstname=\'Mike\' ##考虑使用索引 AND lastname=\'Sullivan\' ##考虑使用索引
与前面的例子一样,由于firstname和lastname出现在WHERE子句中,因此这两个列仍旧有创建索引的必要。除此之外,由于town表的townid列出现在join子句中,因此我们需要考虑创建该列的索引。
那么,我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完 全。我们还必须考虑到对列进行比较的操作符类型。MySQL只有对以下操作符才使用索引:<,<=,=,>,& gt;=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例 如,"SELECT peopleid FROM people WHERE firstname LIKE \'Mich%\';"这个查询将使用索引,但"SELECT peopleid FROM people WHERE firstname LIKE \'%ike\';"这个查询不会使用索引。
六、分析索引效率
现在我们已经知道了一些如何选择索引列的知识,但还无法判断哪一个最有效。MySQL提供了一个内建的SQL命令帮助我们完成这个任务,这就是EXPLAIN命令。EXPLAIN命令的一般语法是:EXPLAIN <SQL命令>。你可以在MySQL文档找到有关该命令的更多说明。下面是一个例子:
EXPLAIN SELECT peopleid FROM people WHERE firstname=\'Mike\' AND lastname=\'Sullivan\' AND age=\'17\';
这个命令将返回下面这种分析结果:
| table | type | possible_keys | key | key_len | ref | rows | Extra |
| people | ref | fname_lname_age | fname_lname_age | 102 | const,const,const | 1 | Where used |
下面我们就来看看这个EXPLAIN分析结果的含义。
- table:这是表的名字。
- type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明:
"对于每一种与另一个表中 记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一 种好的连接类型。"
在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。
如果EXPLAIN显示连接类型是"ALL",而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。 - possible_keys:
可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是"firstname")。默认索引名字的含义往往不是很明显。 - Key:
它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。 - key_len:
索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。 - ref:
它显示的是列的名字(或单词"const"),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。 - rows:
MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。 - Extra:
这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL只是提醒我们它将用WHERE子句限制搜索结果集。
七、索引的缺点
到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。
首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。
第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。
【结束语】在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次500000行的表扫描 操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多 信息,请参见MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查询不能在3.22版MySQL上执行。
(转)读博士到现在的总结
我是那种在一个学校一直待到现在,从来没有换地方的人。刚开始本科进入了一所211本科,然后经过四年学习,保送了本校一个说起来还可以的专业。当然相对于通信\计算机等来说,应该是一个夕阳产业。由于专业的差异,也不可能像理论学科\生物\化学等有那么多的SCI论文可发,结合自己学习的经验,谈一下心得。
1.坚定做科研的信心
如果你单纯的为了找个好工作,而选择了读硕士,我说那还是可以的。如果你还是单纯的为了找个好工作,而选择了读博士,我说你开始可能就走上弯路了。在我国,虽然不能说博士就是做科研、做学术的,但至少来说应该还是有一些科研的含金量的。因此一旦选择了读博士,我觉得就要坚定自己的信心,从事科学研究事业,绝对不能丝毫的动摇。自己有段时间就因为找不到好的题目而发愁,当然是在老板没有给出一个好题目的前提下。我们不能责怪怎么这么多的博导不负责任,只能说在中国这样的社会,尤其是现在的发展阶段,你选择读博士,就一定要吃得下苦,付出比常人多得几十倍的努力。因此选择之前要思考好,如果是为了做科研,而读博士,那么请你继续坚定信心,做好自己充分的心理准备,把这条路走下去。否则就不要选择读博士。
2.多查找文献,找好研究方向
我所学的专业,是个非常传统的专业,找出很新的研究方向并不太容易。因此只有广泛的查找文献,多阅读才能找出好的研究方向。从以下几个方面入手:
(1)老板的提示,在提示的前提下,还要自己看文献,看得过程中多思考,不能光看不想,那样看的再多都是徒劳
(2)同行业内其它高校(尤其是你们所学专业属于国家重点学科的学校)老师的研究方向。这时要学会自己去分辨那些老师是真正的牛,那些老师是水货,我想从科研学术的角度来分析的话,当时是找那些发的文章比较牛的了。看看你们行业内,那些老师经常在国际期刊(尤其是你们行业顶尖的期刊,刚开始可以看一些二流的国外期刊)上发文章,尤其是SCI检索的。这是你就应该明白他所研究的才是现在的热点,找一个热点之中自己觉得不错的作为研究方向,相信只要你自己肯下功夫继续做下去,不久的将来你就会在这样的顶尖国际期刊上看到自己的名字。
3.广泛涉猎国际热点研究方法
找到了研究方向,就要看看这个方向都研究到什么地步了。一般来说,再你找研究方向的同时就应该了解到该方向研究到什么地步了。了解完国内牛一些的老师的研究成果的同时,就应该放眼世界了。从不少牛论文的参考文献里,一般都可以找到不少国外同行的研究成果,追根溯源,沿着这些文献去找,继续阅读,看看国外同行是怎么研究的。一般在好的论文最后,除了研究结论外还会提出本文的不足,以及作者下一步准备研究的内容及方法。这时你就可以根据作者的提示,结合自己的想法,去找寻适合自己研究的方法。
4.耐住寂寞,苦苦钻研,终会有所收获
明白了自己研究的方向,又找到了适合的研究方法,下一步就必须耐住寂寞,自己肯下功夫去做。我曾经花了一周时间把一篇SCI文章看明白了,并从头到尾按照作者的思路做了一遍,确实学到了不少。另外加一句,好多国内的期刊文章就不要照他们的做了,我曾经按照一篇国内期刊的方法去做,结果根本做不出他的结果来,重复了好几遍,结果还是和他论文上的不一致。可以排除我做过程中的错误,我想这就是国内和国外科研学术的最大区别吧。因此国外的文章要好好研读,自己把它彻底吃透,可以学到好多知识。在你按照自己方法做的过程中,肯定还会有不少问题,这就需要自己勤于思考,多从不同的角度去想问题出在了哪里。另外一个方法就是去向你的师兄师姐们请教,也可以向国内国外的同行请教,多上与本专业相关的科研论坛。没准一经他们指点就一切都通了。
5.经常锻炼身体,有助于每天保持良好的精神状态
自从去年开始,我坚持每天晚上跑步锻炼一小时,发现第二天精神状态极好。一个好的身体是必须的,经常的锻炼可以维持好的身体,也能提高自己状态,保证第二天的学习效率。
这是我读博士期间到现在的一点体会,希望大家多提意见,谢谢
(转)emerge、eix、equery的基本用法
一、 emerge
1. 安装软件:
# emerge package_name
2. 更新软件并更新它直接依赖的其它软件包:
# emerge -u package_name
3. 更新一个软件并更新它依赖的软件包以及它们依赖的所有软件包, 这里大写的D相当于--deep。
# emerge -uD package_name
4. 软件包卸载:
# emerge -C package_name
5. 软件包搜索(只搜索名字):
# emerge -s key_word
6. 软件包查找(搜索内容):
# emerge -S key_word
7. 将本地软件列表与最新的portage树同步:
# emerge --sync && emerge portage
8. 只下载源码:
# emerge -f package_name
9. 更新系统中的所有软件:
# emerge -uD world
10. 查看一个预装包欲装的包:
# emerge -p package_name
11. 查看预装包总共有哪些 USE :
# emerge -pv package_name
二、eix
安装eix: emerge eix
1. 软件包搜索:
# eix key_word
2. 将本地软件列表与最新的portage树同步:
# eix-sync
三、equery
equery可查看已安装包的信息,安装此工具: emerge gentoolkit
1. 列出所有已安装包:
# equery list 或简写:
# equery l
2. 查看已安装包装了哪些内容:
# equery files package_name 或简写:
# equery f package_name
3. 查看一个程序foo隶属于哪个包:
# equery belongs foo 或简写:
# equery b foo
4. 查看哪些包依赖于package_name:
# equery depends package_name 或简写:
# equery d package_name
5. 查看已安装包abc用了哪些USE:
1. 安装软件:
# emerge package_name
2. 更新软件并更新它直接依赖的其它软件包:
# emerge -u package_name
3. 更新一个软件并更新它依赖的软件包以及它们依赖的所有软件包, 这里大写的D相当于--deep。
# emerge -uD package_name
4. 软件包卸载:
# emerge -C package_name
5. 软件包搜索(只搜索名字):
# emerge -s key_word
6. 软件包查找(搜索内容):
# emerge -S key_word
7. 将本地软件列表与最新的portage树同步:
# emerge --sync && emerge portage
8. 只下载源码:
# emerge -f package_name
9. 更新系统中的所有软件:
# emerge -uD world
10. 查看一个预装包欲装的包:
# emerge -p package_name
11. 查看预装包总共有哪些 USE :
# emerge -pv package_name
二、eix
安装eix: emerge eix
1. 软件包搜索:
# eix key_word
2. 将本地软件列表与最新的portage树同步:
# eix-sync
三、equery
equery可查看已安装包的信息,安装此工具: emerge gentoolkit
1. 列出所有已安装包:
# equery list 或简写:
# equery l
2. 查看已安装包装了哪些内容:
# equery files package_name 或简写:
# equery f package_name
3. 查看一个程序foo隶属于哪个包:
# equery belongs foo 或简写:
# equery b foo
4. 查看哪些包依赖于package_name:
# equery depends package_name 或简写:
# equery d package_name
5. 查看已安装包abc用了哪些USE:
# equery uses package_name 或简写:
# equery u package_name
Tuesday, April 21, 2009
语音课纪念一下
买的mp3还是有效果的,虽然上当的滋味到现在还不好受。
冰冻三尺,非一日之寒。正如刘老师所说,当年为练发音,他花了一个寒假,每天读10个小时英语。以后要坚持下去多听多读!
Monday, April 20, 2009
(转)关于如何在退出SSH后继续执行后台任务
有人问“SSH登陆服务器,在服务器以后台方式运行任务,之后退出SSH,结果放在后台运行的任务也会退出。如何让在后台运行的任务不因SSH的退出而退出?”
这个问题其实有两种情况(与是怎么退出SSH有关),如下:
1. 如果 SSH 上去,执行比如 ./somecommand & 然后 logout(Ctrl-D、和exit也行) 退出,然后再 SSH 上去看,会发现 ./somecommand 运行得好好的;
2. 如果 SSH 上去,执行 ./somecommand & 然后不是 logout退出,而是直接把 SSH 终端窗口关掉(或者类似情况比如像把本地计算机关机之类的),再 SSH 上去看就会发现 ./somecommand 没了。
可以通过以下方式验证:
远程SSH:
这样tail会不断打印输入,然后远程SSH退出,可以发现tail仍然有新的输出产生,表明后台任务没有结束。
通过pstree查看进程树也可以看到:
&后台运行,logout退出前它们的进程树结构如下:
logout主动退出后进程树是这样如下:
所以不主动logout退出直接断开连接会导致后台任务结束,但主动logout退出不会结束后台任务。
Saturday, April 18, 2009
静心
昨天文档写完,工头给的评价是“很好,不错”,自此,苦役兵的生涯终于看到尽头了。下面的任务还是很有技术含量和挑战的。上午看了一上午聚类算法,下午看了看VegaCloud的文档,晚上看了一本小说--路遥的“人生”,是从马云传上看到的,据说深深德影响过过整整一代人。本想从中获得些动力的(也确实很受教育),但其实并没有我想要的答案。
上一次看小说,可能还是初一初二的事吧。看到前一部分,怎么也不能进入角色,就在看童话故事一般,每看一段都会想着这一切都是作者编撰出来的。这就是常年累月和电脑打交道,以至于感性思维越来越退化的结果,悲哀。看到后一部分,终于发觉很早之前看过该电影。小说的高加林,只不过走错了,虽然可恨,但更多的是可悲。在电影中,由于对人物心理的表现不到位,则完全变成了陈世美之类的混帐了。也许在某个人的眼里,我不折不扣的是高加林。但从心底上讲,如果有那么一个巧珍,我是不会选择亚萍的,因为如果这样做了我会后悔。
摘录了一些书中挺有警示意义的话,为记:
“人生的道路虽然漫长,但紧要处常常只有几步,特别是当人年轻的时候。没有一个人的生活道路是笔直的,没有岔道的。有些岔道口,譬如政治上的岔道口,事业上的岔道口,个人生活上的岔道口,你走错一步可以影响人生的一个时期,也可以影响一生。”----柳青
“归根到底,你是咱土里长出来的一棵苗,你的根应该扎在咱的土里啊!你现在是个豆芽菜!根上一点土也没有了,轻飘飘的,不知是上天呀还是入地呀!”----德顺大爷
“他也明知道他眼前升起的是一道虹,但他宁愿让自己把它看作桥。他希望的那种‘桥’本来就不存在;虹是出现了,而且色彩斑斓,但也很快消失了。他现在仍然面对的是自己的现实。”
“作为青年人来说,重要的是正确的对待理想和现实生活。哪怕你的追求是正当的,也不能通过邪门歪道去实现啊!而且一旦摔了跤,反过来会给人造成一种多大的痛苦,甚至毁掉人的一生。”
简简单单的过活吧,胡总曰:
做学问的要耐得住寂寞,抵的住诱惑。
PS:下周二语音测验,明天一定要苦练口语了,拜托!
Tuesday, April 14, 2009
linux下代码比较工具--meld
Monday, April 13, 2009
今天网易的新闻格外感人
2.女子患肝硬化 初恋情人毅然捐肝救助--19年前因误会分手,19年后,不顾重重阻力,捐肝相守。世上之事,有谁知道何时是对是错,还是那两个字,不悔...
3.比尔.盖茨,我有一个新梦想--“我的新梦想是希望能够平等地对待生命,人们消除了偏见,让这个世界变得更加公平。”---有谁还会记得当年那个奸诈阴险,为钱不择手段的暴发户呢?
Tuesday, April 07, 2009
不用心
到这来之后,从第一次被人训,很气愤;第二次英语老师训,很郁闷;现在第三次被老李训,反而很兴奋。
不过他确实指出了我的两个缺点:
一,在实验室做事不用心。其实是一直都对自己不感兴趣的事情很不关心,而实验室一开始来时的激情早已过去了,上周基本上没怎么去过,估计让他很不爽。
二,不善与人交流。
他希望我们要勇于承担责任,独当一面。
ps1:上周,其实都把心思,发在把上个学期做的干啥网移植到google appengine上去了(为此,还经历了在科院的第一个通宵,很爽),网址:my-dreams.appspot.com.所以,这顿训也不算太亏了。不过目前还是有些功能没有完善,如上传照片等,但由于种种原因,目前没心情弄了,但相信我,总会把它继续弄好的,再发布出去。
ps2:给宿舍两小伙看了之后的态度,也确实令我受到打击了。发现我还是不适合做这种大众化的东西的,因为我的想法与很多人(可以说是绝大部分人)根本格格不入。另外,在见识到很多牛人的成果之后,这么个小东西都觉得不好意思拿出手。但不管怎么样,我还是会做下去的。
ps3:沉痛悼念阿桑姐,以后有谁能吟唱出世间之沧桑...
Sunday, April 05, 2009
忍不住想说baidu一下
近日google总算是推出了mp3搜索,不听不知道,一听吓一跳。以前以为beoplayer放的歌已经到了极致了,如今托福于google,总算体会到了什么叫正版音乐了--使用flash播放器播放出来的音质居然比beoplayer还好!
撇开音质不谈,百度mp3在linux下种种不便,n多死链接,n多广告等等,Google mp3的速度,独具特色的按音乐元素来选歌让人体会到了什么叫现代化。
不过百度市场与公关高级总监兼新闻发言人朱光在接受CBSI记者采访时暗示,音乐搜索对百度的意义已非昨夕。他回应称:“百度不靠音乐搜索打天下,我们最好的产品是网页搜索。”
好啊,那就看看百度目前神乎的阿拉丁计划:"阿拉丁计划是新一代搜索引擎。阿拉丁为搜索引擎百度公司推出的一个通用开放平台,它将接口开放给独特信息数据的拥有者,从而解决现有搜索引擎无法抓取和检索的暗网信息。"这个东西据说几年前就已经在规划了,相信现在应该是中心任务了。
关于百度的阿拉丁计划,李一男是这样的解释的:
* 非WEB化信息,非WEB化信息包括PDF、TXT、DOC、论坛信息等各种图文信息,
也包括种格式的图片与视频信息。---原来以为"非web化信息web化",指的是
从海量数据中来挖掘信息最终把它web化呈现在用户面前。其实现在网上的信息已经够多了,这样的解释让人想像一个人在山底下拼命收集一分钱硬币,却忽略山顶上的一座金矿。
* 暗网信息有些来自个人用户,有些来自机构,包括企业、图书馆、研究所、大学、医院、
第三方调研机构等机构,百度平台将给它们提供发布内容的应用接口。通过应用接口的开放,这些机构可以为网民提供各种各样的应用,实现商业模式创新。---这和李总谈中国企业抵御危机的三大法宝之一的“放弃幻想,恐怕有所违背吧?其中涉及的版权,隐私问题,数据安全等等问题,不是现有技术范围内容易解决的事情,但真正的会有多少客户会被吸引过来呢?你这种应用能给他们,能给大家创造多大的价值呢?
* 除提供接口外,百度还可提供服务器、带宽、存储、开发工具等资源。百度还希望通过"阿拉丁”计划整合贴吧、MP3、图片、视频、知道等资源,这些是百度上市之后针对中国用户的需求开发的应用,为百度带来了大量用户。---此举未免抄袭google之嫌了,怪不得有评论家认为所谓的“阿拉丁计划”就是穿了外衣的云计算罢了。
其实,以前的百度贴吧,百度知道,百度mp3,包括百度blog都还是做的不错的,它们也为百度品牌影响力、流量的增长立下过汗马功劳。如果百度的搜索引擎的确能达到一次搜索就能返回用户最关心的一些页面或对用户最有价值的信息的境界,自然无可厚非。但现在的百度给人的感觉未免有些偏离,选了一条又窄又弯的路走。
另外,过于专注,也是对创新能力的一种制约。只有放开束缚,才能有更活跃的创新。只要这种创新能创造价值,就应该值得去鼓励。未来的搜索技术应该是更开放,更多元化的,作为互联网行业国内的翘楚,要想常青下去,仅仅会搜索网页是不够的。
以上纯属个人观点。
Saturday, April 04, 2009
定理2
推论:感情的世界里,从来都没有对与错,只有愿意与不愿意。(引申自仙剑)
丝毫的不愿意终究产生蝴蝶效应。
今天陪鹏哥去看家具城柜子,鹏哥没买柜子,我买回一把没靠背的木凳子,
凳子在的时候人却已不在了...
这是当初对你的一个承诺,可是,不是所有的承诺,我都能再去实现。
你始终是最了解我的人,有时甚至比我自己还了解我自己。不再上qq,就是因为没有脸面再面对你。
Monday, March 30, 2009
纠结
其实,我也好不到哪去,进了实验室就像掉进了一个无底洞,总是有做不完的事情。忙忙碌碌,就象一台机器再不停的转,很少有时间停下来,思考一些东西。每周都在盼周末,希望能在周末把任务完成,然而下一周又开始有更多的任务!课逃的越来越多,自己想做的事也没有着落,英语也还没啥长进。时间就这样一周一周的过去。
你真的以为这就是我想过的生活吗?童年的梦想就像圣诞老人的传说,早已烟消云散。时不我与,在现有的环境下,你能象爱因斯坦,纳什有惊天济世的成就吗--这就是现实,我们必须去面对的东西。我们唯一可做的就是在这种现实下,做最好的自己。现阶段的心愿就是希望以后能让自己的家人过上幸福的生活罢了。
日子过的很快,真的很快。。。
Wednesday, March 25, 2009
在google-appengine上搭建django-1.0环境
在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.
To-do
- Only think things in down the line
- lab:ROCK parallelize
- study:devel into dm
- health:insist on exercise
- data mining course project



