??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
Struts2真的很强Q它帮我搞定?jin)重复提交或直接讉K提交地址旉到的问题Q呵呵,token万岁?br />
有点不知所语了(jin)Q呵?br />
]]>
2 // 它利用js的一些特性实现私有和公有Q就和applayout.js中定义的名命I间一栗?/span>
3 var module = function() {
4 // U有变量
5 var message = 'Hello, Ext 2 beginner.';
6
7 // 公用变量或函?/span>
8 return {
9 name: 'oxl',
10 init: function() {
11 message += this.name;
12 },
13
14 show: function() {
15 this.other();
16 alert(message);
17 },
18
19 other: function() {
20 alert('Welcome to Ext 2\'s world.');
21 }
22 };
23 }();
]]>
2
3 // 填充囄的本地引?/span>
4 Ext.BLANK_IMAGE_URL = '../ext/resources/images/default/s.gif';
5
6 // x(chng)名字I间Q用于下面的定义?/span>
7 Ext.namespace("myNameSpace");
8
9 // 定义名字I间?/span>
10 // 注意q里Q因为function是立卌行的Q因为最后还有个括号Q,所以myNameSpace.app得到的是q个函数q回的结果?/span>
11 // 因ؓ(f)函数内定义的变量是不能被外部讉K的,利用q种方式可以把变量定义ؓ(f)U有的方式?/span>
12 // 因ؓ(f)q回的是一个对象,所以app得到的结果就是一个对象,所以就可以通过.q算W得到这个返回对象的变量和方法,
13 // q样可以利用这点申明ؓ(f)公用的变量?/span>
14 myNameSpace.app = function() {
15 // U有变量
16 var btn1;
17 var privVar1 = 11;
18
19 // U有函数
20 var btn1Handler = function(button, event) {
21 // q里很y妙,虽然表面上说是私有函数可以访问私有变量,可是q里利用?jin)函数栈的概念?/span>
22 // 卛_数可以访问上一层函数定义的变量Q这里的privVar1是上一层函C定义的变量了(jin)?/span>
23 alert('privVar1=' + privVar1);
24
25 // 因ؓ(f)q里的this指向的window对象Q所以这里的this.btn1Text为undefined.
26 // 当把它赋l一个对象的时候,this指向q个对象Q也是像下的调用一栗?nbsp;
27 alert('this.btn1Text=' + this.btn1Text);
28 };
29
30 // 公共I间
31 return {
32 btn1Text: 'Button 1',
33
34 init: function() {
35 btn1 = new Ext.Button({
36 renderTo: 'btn1-ct',
37 text: this.btn1Text,
38 handler: btn1Handler,
39 scope: this
40 });
41
42 // 调用btn1Handler函数Q这里函数里的this指向的是window
43 btn1Handler();
44 }
45 };
46 }();
47
48 Ext.apply(myNameSpace.app, {
49 btn1Text: "Hello, Ext 2.0",
50
51 // q里所说的重写Ҏ(gu)函数也无法访问私有变量或U有函数Q其实是因ؓ(f)他不在函C下文Q无法访问函C一层定义的变量而已?/span>
52 init: function() {
53 try {
54 btn1 = new Ext.Button({
55 renderTo: 'btn1-ct',
56 text: this.btn1Text,
57 handler: btn1Handler,
58 scope: this
59 });
60 } catch (e) {
61 alert('错误: "' + e.message + '" 发生在行: ' + e.lineNumber);
62 }
63 }
64 });
]]>
我们可以用下面的方式得到它:(x)
2 this.test
因ؓ(f)在顶U范_(d)this指向window对象Q可以这么认为,this指向window作用域?br />
我们定义一个对象:(x)
2 var obj2 = {name: "blogjava", func: function() {alert(this.name);}};
q个时候,obj1和obj2都是window的属性,我们可以通过obj1.name讉Kobj1的name属性(obj2也同P(j)Q通过obj1.func()讉Kobj1的funcҎ(gu)。注意,q里使用this讉K对象的name属性,因ؓ(f)q时func是obj1的方法,所以this指向的是obj1Q所以,this.name其实是obj1.name?br />
我们又可以这样去调用obj1的方法:(x)
q时Q在obj1.func函数中,所有的this都是指向obj2Q与obj1没有M关系Q所以这时this.name其实是obj2.name?br />
ȝQ从上面我们可以q样认ؓ(f)QthisL指向自己的作用域范围Q全局范围中它指向windowQ而在对象中,它指向对象,如果指定一个对象做为它的作用域Q它指向q个对象。在Ext中就用到q样的方式,因ؓ(f)在onReady函数的第二个参数׃用域指定Q估计也是用call方式指定作用域外?br />
]]>
实现FactoryBean接口的beanc,在获取bean时ƈ不是得到q个beancȝ实例Q而是通过q个FactoryBean的getObjectҎ(gu)得到实例Q具体的cd由getObjectTypeҎ(gu)q回。这UFactoryBean?x)被Spring自动(g)ƈq行判断Q而申明时像^时的bean那样x(chng)Q不q在定义property{属性时Q则是对FactoryBean实例q行讄Q而不是对生成的bean讄Q认清这一点很重要。比如说常用的Spring DataSource是一个FactoryBean?br>下面是一个实例:(x)
Configure -> Fdisk and Label
2. write standard label ( to all disks used by vinum )
bsdlabel -w /dev/da1s1
3. edit disk label , modify ?.2BSD?to “vinum?( to all disks used by vinum )
bsdlabel -e /dev/da1s1
4. edit a config as below , saved as xxx.conf
drive d1 device /dev/da1s1a
drive d2 device /dev/da2s1a
drive d3 device /dev/da3s1a
drive d4 device /dev/da4s1a
volume data
plex org raid5 491k
sd drive d1
sd drive d2
sd drive d3
sd drive d4
5. create volume
gvinum create xxx.conf
6. add boot loader config
echo ‘geom_vinum_load=”YES”?>>/boot/loader.conf
7. reboot
8. make sure the gvinum kernel module was loaded , use “kldstat?/p>
Id Refs Address Size Name
1 4 0xc0400000 63070c kernel
2 1 0xc0a31000 fc5c geom_vinum.ko
9. initialize raid
gvinum start data
( Note : “data?must match the volume name in xxx.conf )
10. check if the initialize finished , use ?strong>gvinum list?/p>
State: I xx% => State: up
11. format partition
newfs /dev/gvinum/data
( Note : “data?must match the volume name in xxx.conf )
12. turn on soft updates
tunefs -n enable /dev/gvinum/data
13. mount partition ( ex ; mount to /home )
mount /dev/gvinum/data /home
14. edit /etc/fstab
/dev/gvinum/data /home ufs rw 2 2
(tng) (tng) (tng) 真想好好的休息一下,放松自己的神l! 但是不能Q怎么办? 工作两年?jin),真的是感觉到了(jin)这U辛苦。那怎么才能够改变这U现象呢Q方法,改变我们学习(fn)的方法,q是我最q一直在思考的事情。新技术曾ZIP我们不可能永q跟得上脚步Q所以我们要掌握自己的主动权?
(tng) (tng) W一Q要有好的心(j)态,我们选择?jin)这一行,没有什么可以抱怨的?/p>
(tng) (tng) W二Q经常反省自己,看能不能变得更好?每天都会(x)有收P所以呢Q每天都可以发现自己的不뀂Matrin Folwer_(d)如果Q两q后Q你q是认ؓ(f)两年前的自己已经很优U的话Q那说明你没有进步?
(tng) (tng) W三Q要ȝQ把自己每天的心(j)得都C来,记录自己的脚步?
(tng) (tng) W四Q要ȝQ要做就把它做好。碰到困难更是要q难而上Q这时候才是学?fn)的最好机?x)?/p>
(tng) (tng) W五Q不要有畏惧?j)理Q不要怕做不好。相信自己?/p>
(tng) (tng) W六Q要学会(x)使用文档Q俺的头q一Ҏ(gu)让h佩服Q不?x)的问题Q看文档Q很快就可以搞定Q当?dng)前提是他p实在是高。没有语a障碍?
(tng) (tng) (tng) W七Q就是上面说的,作ؓ(f)E序员,要学好英语。这是很重要?
(tng) (tng) (tng) q有是Q程序员每天该做的事Q好东西?br />
在可以用短数据列的时候就不要用长的。如果你有一个固定长度的CHAR数据列,那么׃要让它的长度出实际需要。如果你在数据列中存储的最长的值有40个字W,׃要定义成CHAR(255)Q而应该定义成CHAR(40)。如果你能够用MEDIUMINT代替BIGINTQ那么你的数据表小一些(盘I(y)/O一些)(j)Q在计算q程中,值的处理速度也快一些。如果数据列被烦(ch)引了(jin)Q那么用较短的值带来的性能提高更加显著。不仅烦(ch)引可以提高查询速度Q而且短的索引g比长的烦(ch)引值处理v来要快一些?/font>
如果你可以选择数据行的存储格式Q那么应该用最适合存储引擎的那U。对于MyISAM数据表,最好用固定长度的数据列代替可变长度的数据列。例如,让所有的字符列用CHARcd代替VARCHARcd。权衡得失,我们?x)发现数据表使用了(jin)更多的盘I间Q但是如果你能够提供额外的空_(d)那么固定长度的数据行被处理的速度比可变长度的数据行要快一些。对于那些被频繁修改的表来说Q这一点尤其突出,因ؓ(f)在那些情况下Q性能更容易受到磁盘碎片的影响?/font>
· 在用可变长度的数据行的时候,׃记录长度不同Q在多次执行删除和更新操作之后,数据表的片要多一些。你必须使用OPTIMIZE TABLE来定期维护其性能。固定长度的数据行没有这个问题?/font>
· 如果出现数据表崩溃的情况Q那么数据行长度固定的表更容易重新构造。用固定长度数据行的时候,每个记录的开始位|都可以被检到Q因些位|都是固定记录长度的倍数Q但是用可变长度数据行的时候就不一定了(jin)。这不是与查询处理的性能相关的问题,但是它一定能够加快数据表的修复速度?/font>
管把MyISAM数据表{换成使用固定长度的数据列可以提高性能Q但是你首先需要考虑下面一些问题:(x)
· 固定长度的数据列速度较快Q但是占用的I间也较大。CHAR(n)列的每个|即是空|(j)通常占n个字W,q是因ؓ(f)把它存储到数据表中的时候,?x)在值的后面dI格。VARCHAR(n)列占有的I间较小Q因为只需要分配必要的字符个数用于存储|加上一两个字节来存储值的长度。因此,在CHAR和VARCHAR列之间进行选择的时候,实际上是旉与空间的Ҏ(gu)。如果速度是主要的考虑因素Q那么就使用CHAR数据列获取固定长度列的性能优势。如果空间很重要Q那么就使用VARCHAR数据列。总而言之,你可以认为固定长度的数据行可以提高性能Q虽然它占用?jin)更大的I间。但是对于某些特D的应用E序Q你可能希望使用两种方式来实现某个数据表Q然后运行测试来军_哪种情况W合应用E序的需求?
· 即愿意使用固定长度cdQ有时候你也没有办法用。例如,长于255个字W的字符串就无法使用固定长度cd?/font>
MEMORY数据表目前都使用固定长度的数据行存储Q因此无Z用CHAR或VARCHAR列都没有关系。两者都是作为CHARcd处理的?/font>
对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列Q所有数据行都用指向数据列值的头指针)(j)Q因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHARq_占用的空间多于VARCHARQ因此用VARCHAR来最化需要处理的数据行的存储总量和磁盘I(y)/O是比较好的?/font>
对于BDB数据表,无论使用固定长度或可变长度的数据列,差别都不大。两U方法你都可用试一下,q行一些实验测试来(g)是否存在明昄差别?/font>
把数据列定义成不能ؓ(f)I(NOT NULLQ。这?x)处理速度更快Q需要的存储更少。它有时候还化了(jin)查询Q因为在某些情况下你不需要检查值的NULL属性?/font>
考虑使用ENUM数据列。如果你拥有的某个数据列的基数很低(包含的不同的值数量有限)(j)Q那么可以考虑把它转换为ENUM列。ENUM值可以被更快地处理,因ؓ(f)它们在内部表Cؓ(f)数倹{?/font>
使用PROCEDURE ANALYSE()。运行PROCEDURE ANALYSE()可以看到数据表中列的情况Q?/font>
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256);
输出的每一列信息都?x)对数据表中的列的数据类型提Z化徏议。第二个例子告诉PROCEDURE ANALYSE()不要为那些包含的值多?6个或?56字节的ENUMcd提出。如果没有这L(fng)限制Q输Z息可能很长;ENUM定义通常很难阅读?/font>
Ҏ(gu)的PROCEDURE ANALYSE()输出信息Q你可能发现Q可以修改自q数据表来利用那些效率更高的数据类型。如果你军_改变某个数据列的cdQ需要用ALTER TABLE语句?
使用OPTIMIZE TABLE来优化那些受到碎片媄(jing)响的数据表。被大量修改的数据表Q特别是那些包含可变长度数据列的表,Ҏ(gu)遭受片的媄(jing)响。碎片很p糕Q因为它?x)导致用于存储数据表的磁盘块形成无用I间Q空z)(j)。随着旉的推U,Z(jin)得到有效的数据行Q你必须d更多的块Q性能׃(x)降低。这?x)出现在M可变长度的数据行上,但是对于BLOB或TEXT数据列尤其突出,因ؓ(f)它们的长度差异太大了(jin)。在正常情况下用OPTIMIZE TABLE?x)防止数据表的性能降低。OPTIMIZE TABLE可以用于MyISAM和BDB数据表,但是defragments只能用于MyISAM数据表。Q何存储引擎中的碎片整理方法都是用mysqldump来{储(dumpQ数据表Q接着使用转储的文件删除ƈ重新建立那些数据表:(x)
% mysqldump --opt db_name tbl_name > dump.sql
% mysql db_name < dump.sql
把数据打包放入BLOB或TEXT数据列。用BLOB或TEXT数据列存储打包(packQ的数据Qƈ在应用程序中q行解包QunpackQ,使你能够在一ơ检索操作中得到需要的M信息Q而不需要进行多ơ检索。它寚w些很隄标准的数据表l构表现的数据值和频繁变化的数据g是有帮助的?/font>
解决q个问题的另一U方法是让那些处理WebH体的应用程序把数据打包成某U数据结构,然后把它插入到单个BLOB或TEXT数据列中。例如,你可以用XML表示调查表回复,把那些XML字符串存储在TEXT数据列中。由于要Ҏ(gu)据进行编码(从数据表中检索数据的时候还需要解码)(j)Q它?x)增加客L(fng)的开销Q但是可以简化数据结构,而且它还消除?jin)那些因为改变?sh)(jin)调查表的内容而必L变数据表l构的需求?/font>
另一斚wQBLOB和TEXTg?x)引赯q一些问题,特别是执行了(jin)大量的删除或更新操作的时候。删除这Ug(x)在数据表中留下很大的"I洞"Q以后填入这?I洞"的记录可能长度不同(前面讨论的OPTIMIZE TABLE提出解决q个问题的一些徏议)(j)?/font>
使用合成的(syntheticQ烦(ch)引。合成的索引列在某些时候是有用的。一U办法是Ҏ(gu)其它的列的内容徏立一个散列|q把q个值存储在单独的数据列中。接下来你就可以通过(g)索散列值找到数据行?jin)。但是,我们要注意这U技术只能用于精匹配的查询Q散列值对于类?lt;?gt;={范围搜索操作符是没有用处的Q。我们可以用MD5()函数生成散列|也可以用SHA1()或CRC32()Q或者用自q应用E序逻辑来计散列倹{请C数值型散列值可以很高效率地存储。同P如果散列法生成的字W串带有NI格Q就不要把它们存储在CHAR或VARCHAR列中Q它们会(x)受到NI格去除的媄(jing)响?/font>
合成的散列烦(ch)引对于那些BLOB或TEXT数据列特别有用。用散列标识W值查扄速度比搜索BLOB列本w的速度快很多?/font>
在不必要的时候避免检索大型的BLOB或TEXT倹{例如,SELECT *查询׃是很好的x(chng)Q除非你能够定作ؓ(f)U束条g的WHERE子句只会(x)扑ֈ所需要的数据行。否则,你可能毫无目的地在网l上传输大量的倹{这也是BLOB或TEXT标识W信息存储在合成的烦(ch)引列中对我们有所帮助的例子。你可以搜烦(ch)索引列,军_那些需要的数据行,然后从合格的数据行中(g)索BLOB或TEXT倹{?/font>
把BLOB或TEXT列分d单独的表中。在某些环境中,如果把这些数据列Ud到第二张数据表中Q可以让你把原数据表中的数据列{换ؓ(f)固定长度的数据行格式Q那么它?yu)是有意义的。这?x)减主表中的碎片,使你得到固定长度数据行的性能优势。它q(sh)你在L据表上运行SELECT *查询的时候不?x)通过|络传输大量的BLOB或TEXT倹{?/font>
高效率地载入数据
在大多数情况下,你所x(chng)的是SELECT查询的优化,因ؓ(f)SELECT查询是最常见的查询类型,而且如何优化它们又不是太单。与此Ş成对比,把数据蝲入数据库的操作就相对直接?jin)。然而,你仍然可以利用某些策略来改善数据载入操作的效率。基本的原理如下所C:(x)
· 扚w载入比单行蝲入的效率高,因ؓ(f)在每条记录被载入后,键缓存(key cacheQ不用刷斎ͼflushQ;可以在这批记录的末尾h键缓存。键~存h的频率减得多Q数据蝲入的速度p快?/font>
· 没有索引的数据表的蝲入速度比有索引的要快一些。如果存在烦(ch)引,不但要把记录d到数据文件中Q还必须修改索引来反映新增的记录?/font>
· 较短的SQL语句比较长的SQL语句快,因ؓ(f)它们所涉及(qing)到服务器端分析过E较?yu),同时通过|络把它们从客户端发送到服务器上的速度也更快?/font>
其中有些因素看v来是ơ要的(其是最后一个)(j)Q但是如果你载入的数据很多,那么即很小的效率差异也?x)导致一定的性能差别。我们可以从前面的一般原理得出几条如何快速蝲入数据的实践l论Q?
· LOAD DATAQ所有Ş式的Q比INSERT效率高,因ؓ(f)它是扚w载入数据行的。服务器只需要分析和解释一条语句,而不是多条语句。同P索引只需要在所有的数据行被处理q之后才hQ而不是每行刷Cơ?/font>
· 不带LOCAL的LOAD DATA比带有LOCAL的LOAD DATA的速度要快。不带LOCAL的时候,文g必须位于服务器上Q而且你必L有FILE权限Q但是服务器却可以直接从盘?sh)读取文件。用LOAD DATA LOCAL的时候,客户端读取文件ƈ通过|络把它发送给服务器,速度慢一些?/font>
· 如果你必M用INSERTQ那么试着使用在一个语句中指定多个数据行的形式Q?/font>
INSERT INTO tbl_name VALUES(...),(...),... ;
在这个语句中指定的数据行多Q效果就好。这?x)减必要的语句数量Qƈ最化索引h的次数。这一条结论看h与前面所讨论?语句短Q执行速度快"相矛盾,但是实际上ƈ不矛盾。这儿所讨论的是同时插入多个数据行的一个INSERT语句所p的开销比功能相同的多个单行INSERT语句的花费的开销要小一些,q且多行语句消耗的索引h开销也少一些?/font>
如果你用mysqldump生成数据库备份文Ӟ那么MySQL 4.1?x)默认地生成多行INSERT语句Q它?x)激z?-opt (优化)选项Q而这个选项?x)激z?-extended-insert选项Q该选项生成多行INSERT语句Q还存在其它一些选项也可以数据被蝲入的时候,转储文g被处理的效率更高。对于MySQL 4.1以前的版本,你可以明地指定--opt?-extended-insert选项?/font>
使用mysqldump的时候要避免使用--complete-insert选项Q它生成的INSERT语句是每个数据行一条语句的Q语句d?x)很长,比多行语句需要的分析操作更多?/font>
· 如果你必M用INSERT语句Q那么在可能的情况下Q对它们q行分组以减烦(ch)引的h。对于事务性的存储引擎Q在单个事务中提交,而不是在自动提交QautocommitQ模式下提交INSERT语句可以实现q样的功能:(x)
START TRANSACTION;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
COMMIT;
对于非事务性的存储引擎Q获取数据表上的写入锁,它被锁定的时候提交INSERT语句Q?/font>
LOCK TABLES tbl_name WRITE;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
INSERT INTO tbl_name ... ;
UNLOCK TABLES;
无论采用哪种Ҏ(gu)Q你得到的好处都是相同的Q烦(ch)引在所有的语句都被执行之后才刷Cơ,而不是每个INSERT语句h一ơ烦(ch)引。后面介l了(jin)在自动提交模式下或数据表没有被锁定的时候发生的情况?/font>
· 对于MyISAM数据表,减少索引h的另外一个策略是使用DELAYED_KEY_WRITE表选项。用这个选项的时候,数据行会(x)像^怸L(fng)卛_入数据文件中Q但是键~存只是偶尔h一ơ,而不是在每次插入操作之后都需要刷新。如果要在服务器上全面地使用延迟索引hQ那么就需要?-delay-key-write选项来启动mysqld。在q种情况下,每个数据表的索引块写入操作都?x)被延迟Q直到这些数据块必须为其它的索引值提供空间、或者执行了(jin)FLUSH TABLES命o(h)、或者数据表被关闭的时候才执行操作?/font>
如果你选择?jin)对MyISAM数据表用gq键写入Q那么不正常的服务器关闭可能?x)引L(fng)(ch)引值的丢失。这不是致命的问题,因ؓ(f)MyISAM索引可以依据数据行来q行修复Q但是如果想让修复过E出玎ͼ你就必须使用--myisam-recover=FORCE选项来启动服务器。这个选项?x)服务器在打开MyISAM数据表的时候检查它们,如果有必要就自动C复它们?/font>
对于复制QreplicationQ从属服务器Q你可能希望使用--delay-key-write=ALL来gq所有的MyISAM数据表烦(ch)引的hQ不在L务器上最初是如何建立它们的?/font>
· 使用压羃的客L(fng)/服务器协议来减少|络上数据传输的数量。对于大多数MySQL客户端来_(d)我们都可以?-compress命o(h)行选项来指定它。通常Q这个选项只是在较慢的|络上用,q是因ؓ(f)压羃操作?x)花费大量的处理器时间?/font>
· 让MySQL替你插入默认倹{也是_(d)无论如何都不要给INSERT语句中那些可以赋予默认值的列指定倹{^均v来,你的语句更短Q减了(jin)通过|络发送到服务器的字符数量。此外,׃语句包含的D?yu),服务器执行的分析和D{换操作也较少?/font>
· 对于MyISAM数据表,如果你必L大量的数据蝲入一个新表,最好徏立不带烦(ch)引的表,载入数据Q然后徏立烦(ch)引,q样的工作次序的速度要快一些。一ơ性地建立索引比每行都更新索引的速度要快一些。对于已l带有烦(ch)引的表,如果预先删除或禁止烦(ch)引,后来再重新徏立或者激zȝ(ch)引,那么数据载入的速度也要快一些。这些策略不能应用于InnoDB或BDB表,它们没有对分ȝ索引建立q程q行优化?/font>
如果你考虑使用删除或禁止烦(ch)引的{略Q把数据载入MyISAM数据表,那么在评估获得的优势的时候,需要考虑整个环境。如果你把少量的数据载入大型的数据表中,那么在没有Q何特D准备工作的情况下,重新建立索引p的时间可能比载入数据的时间还要长?/font>
要删除ƈ且重新徏立烦(ch)引,需要用DROP INDEX和CREATE INDEXQ或者用与索引相关的ALTER TABLE。禁止和Ȁzȝ(ch)引有两种办法Q?
· 你可用用ALTER TABLE的DISABLE KEYS和ENABLE KEYS形式Q?/font>
ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;
q些语句关闭或打开表中非唯一Qnon-uniqueQ烦(ch)引的更新q程?/font>
ALTER TABLE的DISABLE KEYS和ENABLE KEYS子句是烦(ch)引禁止和ȀzL作的推荐Ҏ(gu)Q因为服务器也是q样操作的(如果你用LOAD DATA语句把数据蝲入空的MyISAM表中Q服务器?x)自动地执行q样的优化操作)(j)?/font>
· Myisamchk工具可以执行索引l护。它直接在数据表文g上进行操作,因此使用它的时候,你必L有数据表文g的写入权限?br />使用myisamchk止MyISAM表的索引的方法是Q首先你要确保已l告诉了(jin)服务器让该数据表独立出来Q接着把它Ud到适当的数据库目录中,q运行下面的命o(h)Q?/font>
% myisamchk --keys-used=0 tbl_name
载入数据之后Q重新激zȝ(ch)引:(x)
% myisamchk --recover --quick --keys-used=n tbl_name
其中的n是位掩码QbitmaskQ,它指明了(jin)要激zȝ索引。Bit 0Q第一个位Q与索引1对应。例如,如果某张表拥有三个烦(ch)引,那么n的值应该是7Q二q制?11Q。你也可以?-description选项来检烦(ch)引的数量Q?/font>
% myisamchk --description tbl_name
前面的数据蝲入原则也可以应用于合查询环境(客户端执行多U不同的操作Q。例如,你应该避免在那些频繁被修改(写入Q的数据表上q行长时间的SELECT查询。这?x)引发大量的争用QcontentionQ,D写入操作的性能较差。一个可能的解决办法是,如果你的写入操作主要是INSERT操作Q那么把新记录添加到辅助表中Q接着周期性地把这些记录添加到主表中。如果你必须立即讉Kq些新记录,那么q个{略是不行的Q但是如果你能够承担得v短期内不讉Kq些数据的代P那么使用辅助表可以在两个斚w带来好处。首先,它减了(jin)主表上的SELECT查询争用的问题,因此它们执行得更快。其ơ,把辅助表中的扚w数据载入主表中所p的时间d也比单独载入记录p的时间d要小一些;键缓存只需要在每次扚w载入l束后刷Cơ,而不用每个数据行载入后都h一ơ?
使用q种{略的一个应用是把Web服务器的Web面讉K日志载入MySQL数据库的时候。在q种情况下,保证实体立即q入主表的优先q不高(没有q个必要性)(j)?/font>
如果你在MyISAM表上使用?jin)合的INSERT和SELECT语句Q你可以利用ƈ发性插入操作的优点?jin)。这个特性允许插入和(g)索操作同时进行,而不需要用辅助表。你可以查看"使用q发性插入操?部分?
几个误区
初学者对C#风潮的追赶其实也只是学习(fn)q程中经帔R到的几个误区之一。我用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一U或者几U:(x)
认ؓ(f)计算机技术等于编E技?
有些人即使没有这个想法,在潜意识中也有这L(fng)冲动。让我奇怪的是,许多信息学院的学生也有这L(fng)念头。认机专业是~程专业Q与~程无关的,或者不太相关的评他统l都不管Q极端的学生只要书上没带“编E”两个字他就不看?
其实~程只是计算机技术应用过E中一U复杂性最低的力_Q这是Z么IT业最底层的h是程序员QCODERQ。计机技术包括了(jin)多媒体,计算机网l,人工Q模式识别,理信息pȝ{等q些斚w。编E工作只是在q些具体技术在理论研究或者工E实늚q程中表辄法的q程。编E的Z一定对计算机技术的?jin)解׃定很高。而一个有的现象是,不少大师U的计算机技术研I者是不懂~程的。网上的炒作和现实中良好的工作待遇把~程q种力_秘化了(jin)。其实每一个程序员?j)里都明白,自己q些东西Q学的时候ƈ不比其它专业难,所以自然也不会(x)高档到哪里去?
咬文嚼字的孔已己作风:
我见q一本女生的《计机|络原理》教材,q个女生象小学生一样在书上划满?jin)横杠杠Q笔记做得满满的Q打印出来一定比教材q厚。我不明白的是,象计机|络原理q样的课E有必要做笔讎ͼ我们的应试教育的害?jin)不学生,在上《原理》这一c课E的时候许多学生象学《马列原理》一样逐字背诵记忆。这乃是我见q的最愚蠢的行为。所谓《原理》,x(chng)需要掌握它Z么这样做Q学?fn)whyQ而不是howQ怎样做)(j)。极端认真的学生背下以太|的|线最大长度,数据帧的长度Q每个字D늚意义QIP报头的格式等{,但是忘(sh)(jin)路由的原则,忘(sh)(jin)TCP/IP协议设计的宗旨。M许多?jin)大量的旉把书背得滚瓜烂熟却等于什么也没学?
在学?fn)编E的时候这些学生也是这P他们切的记得C++语法的各个细节。看完了(jin)C++教程后看《Thinking in C++》(实是好书)(j)Q《Inside C++》,《C++ reference》,this C++, that C++……,然后是网上各U各L(fng)关于C++语法的奇闻怺Q然后发现自己又忘(sh)(jin)C++的一些语法,最后回头l恶补…。有个师弟就跟我_(d)(x)“C++ 太难?jin),学?jin)q里忘(sh)(jin)那里Q学?jin)承忘(sh)(jin)模ѝ”我的回{道Q“你不去学就Ҏ(gu)?jin)”。我q没有教坏他Q只是告诉他Q死抠C++的语法就和孔已己炫耀茴香豆的茴字有几U写法一h无意义。你Ҏ(gu)不需要对的C++语法太关?j),动手~程是?jin),有不记得的地方一查MSDNq马搞定。我有个l论是Q实际的开发过E中对程序语法的?jin)解是最微不道的知识。这是ؓ(f)什么我在ؓ(f)同学用BasicQ我以前从没有学q它Q写一个小E序的时候,只花?jin)半个小时看了(jin)看语法Q然后再用半个小时完成了(jin)E序Q而一个小时后我又完全忘记?jin)Basic 的所有关键字?
不顾基础Q盲目追赶时髦技术:(x)
l于点到题目上来?jin)。大多数的h都希望自q东西能够马上跑v来,变成钱。这U想法对一个已l进入职业领域的E序员或者项目经理来说是合理的,而且IT技术进步是如此的快Q不跟进是׃。但是对于初学者来_(d)其是时间充裕的大中专在校生Q,q种x(chng)是另解的。一个ƈ未进入到行业竞争中来的初学者最大的资本便是他有_的时间沉下心(j)来学?fn)基性的东西Q学?fn)why 而不是how。时髦的技术往往Ҏ(gu)掌握Q而且来容易掌握,q是商业利益的驱使,Z(jin)最大化的降低Y件开发的成本。但在IT领域内的现实是q样Q越Ҏ(gu)掌握的东西,学习(fn)的h多Q而且淘汰得越快。每一ơ新的技术出来,都有许多初学者跟q,q些初学者由于缺乏必要的基础而得自己在跟进的过E中p大量的时_(d)而等他学?x)?jin)Q这U技术也快淘C(jin)。基的课E,比方数据l构Q?作系l原理等{虽然不能让你立马就实现一个linuxQ这是许多h嘲笑理论评无用的原因)(j)Q但它们能够显著的减你在学?fn)新技术时学习(fn)曲线的坡度。而且对于许多关键的技术(比方Win32 SDK E序的设计,DDK的编E)(j)来说甚至是不可或~的?/p>
如果你是学生Q或者如果你有充的旉。我你仔l的掌握下面的知识。我的徏议是针对那些希望在IT技术上有所成就的初学者。同时我q列Z(jin)一些书目,q些书应该都q可以在书店买到。说实在的,我在d他h的文章时最大的?j)愿是希望作者列Z个书单?
大学pQ不要觉得好W。我极力推荐q门评是因为没有专业文档的阅读能力是不可想象的。中文的译往往在猴q马月才?x)出来,而现在的许多出版Cֹ脆就直接把E文印刷上厅R学?fn)的?gu)是强q自q原版的教材,开始会(x)看不懂,用多?jin)自然熟l。吃得苦下得狠心(j)l对是Q何行业都需要的品质?
计算Zpȝ构和汇编语言Q关于体pȝ构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书。?0x86汇编语言E序设计教程》(清华大学出版C,黑色面Q杨季文著)(j)。你需要着重学?86后保护模式的E序设计。否则你在学?fn)现代操作系l底层的一些东西的时候会(x)觉得是在看天书?
计算机操作系l原理-我们的开发L在特定的操作pȝ上进行,如果不是Q只有一U可能:(x)你在自己实现一个操作系l。无论如何,操作pȝ原理是必ȝ。这p我们Z个芯片制作外围设备时Q芯片基本的工作时序是必需?jin)解的。这一cM也很多,我没有发现哪一本书非常Z。只是觉得在看完?jin)这些书后如果有I就应该看看《Inside Windows 2000?微Y出版C,我看的是E文版的,中文的书名想必是Windows 2000 技术内q之cd)?
数据l构和算法-q门评能够军_一个hE序设计水^的高?sh),是一门核?j)课E。我首选的是清华版的(朱战立,刘天Ӟ(j)。很多h喜欢买C++版的Q但我觉得没有必要。C++的语法让法实现q程变得复杂多了(jin)Q而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了(jin)C版的书以后再来浏览一下C++的版的书是最好的?
软g工程Q这门课E是到后来p发现它的重要Q虽然刚开始看时就象看马哲一样不知所云。我的徏议是看《实用Y件工E》(黄色Q清华)(j)。不要花太多的时间去记条条框框,看不懂就跌厅R在每次自己完成?jin)一个Y件设计Q务(不管是练?fn)还是工作?j)以后再来回顾回顾Q每ơ都?x)有收获?
Windows E序设计Q《北京大学出版社QPetzold著》我M企图设计Windows E序的h在学?fn)VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在q本书中Q没有C++Q没有GUIQ没有控件。有的就是如何用原始的C语言来完成Windows E序设计。在学完?jin)它以后Q你才会(x)发现VC其实是很Ҏ(gu)学的。千万不要在没有看完q本书以前提前学?fn)VCQ你最好碰都不要碰。我知道的许多名校甚至都已经用它作ؓ(f)教材q行授课。可见其重要?
上面的几门课E我认ؓ(f)是必学的重要评Q如果你惛_Windows E序员)(j)?
对于其它的课E有q样单的选择Ҏ(gu)Q如果你是计机pȝQ请学好你所有的专业基础课。如果不是,请参照计机pȝ评表。如果你发现自己看一本书时无法看下去?jin),L(fng)C的最后,看看它的参考文献,扑ֈ它们q学?fn)它们,再回头看q本书。如果一本书的书名中带有“原理”两个字Q你一定不要去记忆它其中的l节Q你应该以一天至?0늚速度掌握其要领。尽可能多的在计机上实践一U理论或者算法?
你还可以在CSDN上阅d许多书评。这些书评能够帮助你军_M么样的书?
日三省乎?
每天ȝ书太多,Ҏ(gu)让hq失方向。一定要在每天晚上想惌己学?jin)些什么,q有些什么相关的东西需要掌握,自己对什么最感兴,在一本书上花的时间太长还是不够等{。同时也应该多想x(chng)来最有可能出现的应用Q这栯够让你不是追赶技术潮?hu)而是引领技术潮?hu)。同Ӟ努力使用现在已经掌握的技术和理论d作具有一定新意的东西。坚持这样做能够让你真正成ؓ(f)一个Y件“研发者”而不仅仅是一个CODER?
把最多的旉花在学习(fn)?
q是对初学者最后的忠告。把每个星期玩SC或者CS的时间压~到最,不玩它们是最好的。同Ӟ如果你的ASP技术已l能够来钱,甚至有公司请你兼职的话,q就证明你的天䆾能够保证你在努力的学?fn)之后取得更好的收益Q你应该d更复杂的东西。眼光放长远一些,q无论是对谁都是适用的?/p>
---
很有体会(x)Q几q内按着他所说的轨迹学下厅R?/p>
他出生在法国Q父亲是成功的商人。他从小的目标似乎是一个成功的商hQ然而在16岁那q他做出?jin)一个重要的抉择Q他选择学习(fn)理工而放弃了(jin)学习(fn)l商。他知道他的选择是对的,p他父亲劝他的Q工E技术在未来?x)越来越重要Q从工程技术{化ؓ(f)商h是如此的Ҏ(gu)Q然而反之却是相当的难。于是三q时间里Q当同龄的美国h都在玩耍的时候,他在入Grandes EcolesQ据说是法国最好的学校Q而奋战着。他成功?jin),他在法国的Ecole Polytechnique毕业?jin),他甚臌在法国的伞兵里当q中,之后他拿C(jin)Ecole Nationale Superieure rue d'Ulm的理论物理学士学位Q然后拿C(jin)Ecole Polytechnique的物理学博士学位Q他甚至作ؓ(f)讉KU技家在ȝ理工学院的电(sh)子实验室里呆?jin)一D|间。然而他扑ֈ?jin)一份很不错的工作:(x)在法国的 sun公司负责销售。然而就象少q时的想法一P他知道他要做的不是销售,他要做技术和开发,于是l于他来C(jin)谷Q来到这个SUN的SAP实验室,一个无Ch向往的地斏V?/p>
但是现在Q他要离开q里?jin),他知道他是对的,他看C(jin)Internetq速发展,他看C(jin)Open Sourcezd的迅速进展,他想成ؓ(f)Linus Torvalds一L(fng)开源先锋。于是在谷赚了(jin)_生活的钱后,他选择?jin)离开。当时硅L(fng)房h(hun)高得吓hQ于是他问妻子:(x)"我们d儿?"。妻子告诉他Q?"我们回家吧,回我的老家Q?于是1999q他们一起回C(jin)亚特兰大Q在那里他开始他的开源Y件开发生涯?/p>
q个q青人就是Marc FleuryQ就是他一手创Z(jin)JBossQ这个全世界都在使用的开源应用服务器Q是他推动整个Java开源社区的发展Q是他让Open Source变成?jin)专业化的服务,让Open Source变(sh)ؓ(f)?jin)一U可以生存的手段Q是他的号召力和影响力把Hibernate, JGroups, Javassist{一大批的优U的开源Y件招于帐下?/p>
Marc Fleury是一个很有趣的h。他长得有点瘦小Q尤其是跟Bill Burke站在一L(fng)时候,呵呵Q,但是q算׃的外表、充满自信的表现力,C样锐利的眼神让h觉得他是如此_明。尽带着一Ҏ(gu)国口韻IHani说的Q偶听不出来Q,但他的表现力和感染力是无与u比的Q他的每一ơ采访和演讲都充满着Ȁ情和q默Q经常妙语惊人。他也很?x)哗众取宠,在每q的 TheServerSide Symposium上,他和JBoss的员工们都会(x)I一些奇形怪状的衣服,戴奇怪的面具参加。Marc Fleury老是打扮成蝙(rn)蝠侠里的那个恶棍the jokerQ中文版应该是丑吧)(j)的模样出席,惨白的脸、红U的嘴唇、ؕq头发Q蛮吓h的?/p>
Marc Fleury对他的Open Source产业的经营有他非常成功的方式Q尽有时会(x)招h非议Q比如说他那个十元的文档。他对自q定位非常清楚Q他?x)用操作pȝ状况来比ȝ在的应用服务器,在高端的商业应用是UnixQ接下来的Windowsp蚂蚁一栯食着剩下的市(jng)场,q时只有象Linux那样免费的开源操作系l才能与之竞争。在J2EE存在cM的情况,BEA和IBM永远?x)存在,他们高高在上Q然而他们往C一看的时候,C都在蚂蚁Q把所有的杂草都蚕食掉?jin),q就是微软的.netQ不承不承认,它将无所不在Q只有象JBossq样免费开源的东西才能在这个领域展开?net的竞争?/p>
JBoss的另一个成功之处是他的用h和招人方式,吸引?jin)全世界无数优秀的h的加盟。他最喜欢用电(sh)影The Maxtrix里那句经典台词来比喻open sourceQ还记得Neo被Morpheus带救C个小房子里,然后掏出两颗药丸的场景吗Q这是Marc Fleury的改~版Q?If you take the red pill I'll show you how deep the rabbit hole goes. If you take the blue pill you stay in corporate land and you believe whatever you want to believe."Marc Fleuryqtake the red pill来ŞҎ(gu)w到开源Y件开发的?/p>
如今JBoss的M架构设计师Bill Burke是q样被招安过来的。当时Bill Burkeq是在做一个商业应用,C起BEA的东西,在google上搜C(jin)JBossQ发C(jin)一些bugQ修改完后发?jin)个emaillMarc FleuryQMarc Fleury问完Bill的情况后发了(jin)一条只有一句的话的Email:"Do want to take the red pillQ?。于是Bill Burke成?jin)JBoss的一员?/p>
Hibernate的招安自不用_(d)地球人都知道qg事啦Q因为Gavin King觉得JBoss是唯一可以开发开源Y件而靠提供服务的公司。(后来Rod Johnson的interface21其实也是cM的模式)(j)?/p>
其实在hibernate被招安之前没几天q有一个很著名的Y件加盟了(jin)JBossQ那是JGroups。这是一个学院派的开发品,Bela Ban是瑞士苏黎士大学的博士,随后到纽U康奈尔大学d士后时开发了(jin)JGroups。它是当今开发cluster软g或distributed cacheQtangosol cohenernce没用JGroupsQ后来Cameron Purdy和Bela Banq辩Q的实际标准QJBoss在cluster技术一直是建立在JGroups之上的。Bela Ban现在也是JBoss Cache的设计师?/p>
另一个有的学院z品是JavassistQ它是东京理工大学的一个博士Shigeru Chiba毕业设计的品,后来毕业?jin)感觉做了(jin)这么酷的东西不用上太可惜?jin)Q于是就打了(jin)个电(sh)话给Marc FleuryQ于是Javassist加盟了(jin)JBoss。Javassist是JBoss AOP的基Q可以动态用String操作生成代码然后执行。呵呵,感觉挺cool的,反正Bill Burke说用?jin)Javassist后开发AOP太easy?jin)?/p>
现在的Marc Fleury无疑已经处于非常成功的状态。但对于他来_(d)q个旅程才刚刚开始,他的目标是成Z业化的transparent AO middleware开源Y件公司,JBoss公司成个领域的领头。象很多ZP他相信AOP?x)给整个产业带来巨大的?jing)响,而透明的AO中间件将成ؓ(f)中间件市(jng)场的d。Marc FleuryQ期待你的新的成功吧Q?/p>
(tng)
首先,FCKEDITOR的性能是非常好?用户只需很少的时间就可以载入FCKEDITOR所需文g.对于其他在线~辑器来?q几乎是个很难解决的N,因ؓ(f)在开启编辑器旉要装载太多的文g.比如CUTEEDITOR,虽然功能比FCKEDITORq要强大,可是,它本w也够庞大了(jin),至于FREETEXTBOX{?其易用性与FCKEDITOR相比,有差距,可以?FCKEDITOR是一个别具匠?j)的在线~辑?它里面融入了(jin)作者高q面向对象的JAVASCRIPT功力,集易用性与强大的功能与一?
.与编辑器相关的所有图?脚本以及(qing)调用?br />.语言文g
.~辑器的皮肤文g
.工具L(fng)贴图{?/p>
q些导致在服务器和客户端间产生相当的流?如果有许多文件被调用,那么即便每个文g很小.也会(x)让用L(fng)得不耐烦(ch).
?.0版中,开发h员有两种Ҏ(gu)来解册个问?
那就是指定装载顺序和脚本压羃
装蝲序
?.0版开?~辑器按以下步骤装蝲资源:
.基本?是~辑器所在页)以及(qing)装入~辑器的JS脚本
.用来建立~辑器的脚本
.~辑器的语言和皮?
.建立~辑?
.载入预置的编辑文档内?
.从现在开?用户可以阅读和编辑文档了(jin),不过,拖拽支持以及(qing)工具栏都是不可用?br />.载入~辑器引擎脚?br />.建立工具?q且可用
.从现在开?~辑器的所有功能都已经完整
.载入工具栏图?/p>
脚本压羃
在打包Q何新版本?~辑器的JS脚本会(x)q行预处?预处理步骤如?
.U除所有代码注?br />.U除所有无用的I白字符.
.脚本合q成几个文g
使用上面的方?我们可以脚本文件的大小压羃到原来的50%.
压羃?原始的代码仍然存在于一个名为_Source的文件夹?/p>
如何打包?
~辑器已l自带了(jin)打包E序,它位于FCKEDITOR的根文g夹中_PACKAGER文g夹中,名ؓ(f)Fckeditor.Packager.exe,其复制到FCKEDITORҎ(gu)件夹中ƈq行,卛_自动JS脚本打包q压~?br />需要注意的是该E序是一?NETE序,必须安装.NET FRAMEWORK才能使用
惌获取支持?
如果你捐?5000Ƨ元,你就可以获得1q的免费技术支?比较늚?相当于h民币15?不过西欧的费用相当惊?
如何安装?
1.下蝲最新版的FCKEDITOR
2.解压~到你的站点Ҏ(gu)件夹中名为FCKEDITOR的文件夹?名称必须为FCKEDITOR,因ؓ(f)配置文g中已l用此名称来标C出FCKEDITOR的位|?
3.现在,~辑器就可以使用?如果惌查看演示,可以按下面方法访?
http://<your-site>/FCKeditor/_samples/default.html
注意:你可以将FCKEDITOR攄CQ何文件夹,默认情况?其攑օ到FCKEDITOR文gҎ(gu)最为简单的Ҏ(gu).如果你放入的文g夹用别的名U?请修攚w|文件夹中编辑器BasePath参数,如下所C?
oFckeditor.BasePath="/Components/fckeditor/";
另外,FCKEDITOR文g夹中所有以下划U开头的文g夹及(qing)文g,都是可选的,可以安全的从你的发布中删?它们q不是编辑器q行时必需?/p>
如何FCKEDITOR整合q我的页?
׃目前的版本提供的FCKEDITOR仅提供了(jin)JAVASCRIPT式的整合,因此,q里仅讲q如何应用JAVASCRIPT来整合F(tun)CKEDITOR到站点中,当然,其他各种语言的整?你可以参考_samples文g夹中的例子来完成
1,假如~辑器已l安装在你的站点?FCKEDITOR/文g夹下.那么,W一步我们需要做的就是在面的HEADD中攑օSCRIPT标记以引入JAVASCRIPT整合模块.例如:
<script type="text/javascript" src="/fckeditor/fckeditor.js"></script>
其中路径是可更改?/p>
2,现在,FCKEDITORcdl可以用了(jin).有两个方法在面中徏立一个FCKEDITOR~辑?
Ҏ(gu)1:内联方式(使用):在页面的FORM标记内需要插入编辑器的地方置入以下代?
script type="text/javascript">
(tng) (tng) var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;
(tng) oFCKeditor.Create() ;
</script>
Ҏ(gu)2:TEXTAREA标记替换?不徏议?:在页面的ONLOAD事g?d以下代码以替换一个已l存在的TEXTAREA标记
<html>
(tng) <head>
(tng) (tng) (tng) <script type="text/javascript">
(tng) (tng) (tng) (tng) (tng) window.onload = function()
(tng) (tng) (tng) (tng) (tng) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) var oFCKeditor = new FCKeditor( 'MyTextarea' ) ;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) oFCKeditor.ReplaceTextarea() ;
(tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) </script>
(tng) </head>
(tng) <body>
(tng) (tng) (tng) <textarea id="MyTextarea" name="MyTextarea">This is <b>the</b> initial value.</textarea>
(tng) </body>
</html>
3.现在,~辑器可以用了(jin)
FCKEDITORcd?
下面是用来在面中徏立编辑器的FCKEDITORcȝ说明
构造器:
FCKeditor( instanceName[, width, height, toolbarSet, value] )
instanceName:~辑器的唯一名称(相当于ID)
WIDTH:宽度
HEIGHT:高度
toolbarSet:工具条集合的名称
value:~辑器初始化内容
属?
instanceName:~辑器实例名
width:宽度,默认gؓ(f)100%
height:高度,默认值是200
ToolbarSet:工具集名U?参考FCKCONFIG.JS,默认值是Default
value:初始化编辑器的HTML代码,默认gؓ(f)I?br />BasePath:~辑器的\?默认?Fckeditor/文g?注意,量不要使用相对路径.最好能用相对于站点根\径的表示Ҏ(gu),要以/l尾
CheckBrowser:是否在显C编辑器前检查浏览器兼容?默认为true
DisplayErrors:是否昄提示错误,默(sh)ؓ(f)true;
集合:
Config[Key]=value;
q个集合用于更改配置中某一的??br />oFckeditor.Config["DefaultLanguage"]="pt-br";
Ҏ(gu):
Create()
建立q输出编辑器
RepaceTextArea(TextAreaName)
用编辑器来替换对应的文本?/p>
如何配置FCKEDITOR?
FCKEDITOR提供?jin)一套用于定制其外观,Ҏ(gu)及(qing)行ؓ(f)的设|集.主配|文件名为Fckconfig.js
你既可以~辑主配|文?也可以自己定义单独的配置文g.配置文g使用JAVASCRIPT语法.
修改?在徏立编辑器?可以使用以下语法:
var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;
oFCKeditor.Config['CustomConfigurationsPath'] = '/myconfig.js' (tng) ;
oFCKeditor.Create() ;
提醒:当你修改配置?hI浏览器~存?sh)查看效?/p>
配置选项:
AutoDetectLanguage=true/false 自动(g)语a
BaseHref="" 相对链接的基地址
ContentLangDirection="ltr/rtl" 默认文字方向
ContextMenu=字符串数l?右键菜单的内?br />CustomConfigurationsPath="" 自定义配|文件\径和名称
Debug=true/false 是否开启调试功?q样,当调用FCKDebug.Output()??x)在调试H中输出内容
DefaultLanguage="" ~省语言
EditorAreaCss="" ~辑区的样式表文?br />EnableSourceXHTML=true/false 为TRUE?当由可视化界面切换到代码|,把HTML处理成XHTML
EnableXHTML=true/false 是否允许使用XHTML取代HTML
FillEmptyBlocks=true/false 使用q个功能,可以空的块U元素用I格来替?br />FontColors="" 讄昄颜色拑֏器时文字颜色列表
FontFormats="" 讄昄在文字格式列表中的命?br />FontNames="" 字体列表中的字体?br />FontSizes="" 字体大小中的字号列表
ForcePasteAsPlainText=true/false 强制_脓(chung)为纯文本
ForceSimpleAmpersand=true/false 是否不把&W号转换为XML实体
FormatIndentator="" 当在源码格式下羃q代码用的字符
FormatOutput=true/false 当输出内Ҏ(gu)是否自动格式化代?br />FormatSource=true/false 在切换到代码视图时是否自动格式化代码
FullPage=true/false 是否允许~辑整个HTML文g,q是仅允许编辑B(ti)ODY间的内容
GeckoUseSPAN=true/false 是否允许SPAN标记代替B,I,U标记
IeSpellDownloadUrl=""下蝲拼写(g)查器的网址
ImageBrowser=true/false 是否允许览服务器功?br />ImageBrowserURL="" 览服务器时q行的URL
ImageBrowserWindowHeight="" 囑փ览器窗口高?br />ImageBrowserWindowWidth="" 囑փ览器窗口宽?br />LinkBrowser=true/false 是否允许在插入链接时览服务?br />LinkBrowserURL="" 插入链接时浏览服务器的URL
LinkBrowserWindowHeight=""链接目标览器窗口高?br />LinkBrowserWindowWidth=""链接目标览器窗口宽?br />Plugins=object 注册插g
PluginsPath="" 插g文g?br />ShowBorders=true/false 合ƈҎ(gu)
SkinPath="" 皮肤文g夹位|?br />SmileyColumns=12 囄H列?br />SmileyImages=字符数组 囄H中囄文g名数l?br />SmileyPath="" 囄文g夹\?br />SmileyWindowHeight 囄H口高度
SmileyWindowWidth 囄H口宽度
SpellChecker="ieSpell/Spellerpages" 讄拼写(g)查器
StartupFocus=true/false 开启时FOCUS到编辑器
StylesXmlPath="" 讄定义CSS样式列表的XML文g的位|?br />TabSpaces=4 TAB键生的I格字符?br />ToolBarCanCollapse=true/false 是否允许展开/折叠工具?br />ToolbarSets=object 允许使用TOOLBAR集合
ToolbarStartExpanded=true/false 开启是TOOLBAR是否展开
UseBROnCarriageReturn=true/false 当回车时是生BR标记q是P或者DIV标记
如何自定义样式列表呢?
FCKEDITOR的样式工h中提供了(jin)预定义的样式,样式是通过XML文g定义?默认的XML样式文g存在于FCkEditorҎ(gu)件夹下的FckStyls.xml文g?br />q个XML文g的结构分析如?
<?xml version="1.0" encoding="utf-8" ?>
<Styles >
(tng) (tng) (tng) <Style name="My Image" element="img">
(tng) (tng) (tng) (tng) (tng) (tng) (tng) <Attribute name="style" value="padding: 5px" />
(tng) (tng) (tng) (tng) (tng) (tng) (tng) <Attribute name="border" value="2" />
(tng) (tng) (tng) </Style >
(tng) (tng) (tng) <Style name="Italic" element="em" />
(tng) (tng) (tng) <Style name="Title" element="span">
(tng) (tng) (tng) (tng) (tng) (tng) (tng) <Attribute name="class" value="Title" />
(tng) (tng) (tng) </Style >
(tng) (tng) (tng) <Style name="Title H3" element="h3" />
</Styles>
每一个STYLE标记定义一U样?NAME是显C在下拉列表中的样式?ELEMENT属性指定此样式所适用的对?因ؓ(f)FCKEDITOR中的样式是上下文敏感?也就是说,选择不同的对?仅会(x)昄针对q类对象定义的样?/p>
拼写(g)?/p>
FCKEDITOR带了(jin)两种拼写(g)查工?一U是ieSpell,默认情况下用这U?使用q种方式的拼写检?要求客户下蝲q安装iespellq个Y?另外,也提供SpellPager的方式来q行拼写(g)?不过,׃SPELLPAGER是由P(pn)HP~写的服务器端脚?因此,要求你的WEB服务器必L持PHP脚本语言方可
更改拼写(g)查器的方式请参见有关配置文g的详l说?/p>
压羃脚本
Z(jin)提供脚本载入的效?FCKEDITOR采用以下Ҏ(gu)对脚本尽量压~以减少脚本寸:
1,U除掉脚本中的注?br />2.U除掉脚本中所有无意义的空?br />另外,FCKEDITORq提供了(jin)一个专门用于压~脚本的工具以便 你在发布时能减小文g寸,
你可以将_Packager文g夹中的Fckeditor.Packager.exe复制到FCKEDITORҎ(gu)件夹来运行ƈ压羃脚本
本地化FCKEDITOR
如果FCKEDITOR没有提供(zhn)所需要的语言(实际上全有了(jin)),你也可以自行制作新的语言
,你只需要复制出EN.JS,然后在其基础上进行翻?另外,语言名称与对应的脚本文g名必遵循RFC 3066标准,但是,需要小?例如:Portuguess Language对应的脚本文件名必须为pt.js
如果需要针Ҏ(gu)个国家的某种语系,则可以在语系~写后加上横U及(qing)国家~写卛_
在用时,pȝ?x)自动侦客L(fng)语系?qing)国别而运用适当的界面语a.
当徏立一U新的语a?你必d"Edit/lang/fcklanguagemanager.js"中ؓ(f)其徏立一个条?如下所C?
FCKLanguageManager.AvailableLanguages =
{
en : 'English',
pt : 'Portuguese'
}
需要提醒的?文g必须保存?sh)UTF-8格式
如何与服务器端脚本进行交?
h看例子以得到相关内容
另外,在ASP.NET中以以下步骤使用
1.把FCKEDITORM到工L(fng)
2.托拽FCKEDITOR控g到页?br />3.为其指定名称
4.FCKEDITORcȝ所有属性不光可以在代码中?而且可以作ؓ(f)FCKEDITOR控g的属性直接?例如,要改变皮?可以在UI面中指定SkinPath="/fckeditor/editor/skins/office2003"卛_,其实FCKEDITOR的ASP.NET版本可以做得更好,你可以找到FCKEDITOR ASP.NET 2.1的源文g,然后修改该控件的设计,为其暴露更多有用的属?重新~译卛_
5,POSTBACK后的数据,使用FCKEDITOR控g的value属性获?br />6.默认状态下,FCKEDITOR作者ƈ没有提供特定于ASP.NET的文件上传及(qing)文g览?不过,你可以轻易的在FILEMANANGER的ASP.NET文g夹中扑ֈI白的ASP.NET版文件浏览器,加入你自q于浏?上传的代码即?br />7.׃默认状态下,ASP.NET不允许提交含有HTML?qing)JAVASCRIPT的内?因此,你必d使用FCKEDITOR的页面的ValidateRequest设ؓ(f)false.(<%@page validteRequest="false" %>卛_)
SYNOPSIS
(tng) (tng) (tng) (tng) (tng) (tng) #include <string.h>
(tng) (tng) (tng) (tng) (tng) (tng) size_t strlen(const char *s);
DESCRIPTION
(tng) (tng) (tng) (tng) (tng) (tng) The (tng) strlen() (tng) function (tng) calculates (tng) the (tng) length (tng) of (tng) the string s, not
(tng) (tng) (tng) (tng) (tng) (tng) including the terminating `\0' character.
在unix中,d一行时都会(x)在后面加?\n"紧跟一?\0"Q所以strlen往往得不到正的{案。应该是strlen(s) - 1
所以清除换行符的方法是
char test[MAX_LINE];
//....read from stdin
test[strlen(test) - 1] = '\0';
此前QBorland公司已经对外表明Q该公司未来聚焦Y件生命周期管理品,因此Q传l的软g开发工P以及(qing)InterBase数据库都单独对外{让?/p>
Borland公司q未对外透露和哪一家公司达成了(jin)转让意向。不q,媒体分析认ؓ(f)Q两个开发工h有可能的买家是IBM、甲骨文甚至Google公司。不q,IBM和Google公司都对此消息拒l置评,而甲骨文则表CZ们关?j)的是自q软g?/p>
Borland公司是昔日的软g开发工具巨_(d)其Delphi在中国等?jng)场拥有大量用户Q和微Y曄是难分伯仲的Ҏ(gu)。不q,随着微Y.NETq_的推出,以及(qing)开发工具市(jng)场的增长潜力有限QBorland公司已谋生退意。不q,分析人士表示Q这些开发工L(fng)前至拥?50万用P因此q是很有价倹{?br />
---
为Delphi默哀5分钟Q曾l合作过的兄弟?/p>