??xml version="1.0" encoding="utf-8" standalone="yes"?> q离新版本YӞ拒绝当小白鼠Q?br />
==================================================
agent.php是?a target="_blank">“如鹏助手” 提供数据的api面Q默认如鹏助手每10U钟׃向这个页面请求最q?0条新帖和50条新回复。当时开发的时候也考虑q这个功能会不会对网站流量有非常大的消耗,但是当时没有q行U学的计,惛_然的认ؓ不会。但是现在仔l一,50条新帖?0条新回复的信息估计有100KQ那么每分钟h6ơ,假设每天监控15时Q每个月30天,那么一个月的流量就?00K*6*60*15*30=16200000k=16200M=16.2GQ恐怖呀Q!Q网站每月限定流量是45GQ正好是16.2/45=36%Q估和报表中的31%差不多?br />
因ؓ|站量已经标Q因此必M额外的流量才能保证网站正常运行,10G的流量一个月20元,买流量就要买_?0个月的,10个月是200元,本来q部分花Ҏ(gu)可以避免的。当初花几分钟算一下就不至于犯q种错误Q?br />
不要再拍脑袋Q要U学的计!Q!Q!Q!Q!
Z减少如鹏助手量消耗,我做了如下的优化Q?br />
1、agent.php不再传输全部的帖子内容,帖子正文只传输前50个字?br />
2、去掉agent.php传输帖子中的I格{无意义字符?br />
3、因为如鹏网现在发帖量不大,没必要每ơ显C?0条最新脓(chung)Q因此改为只传输10条最新脓(chung)?br />
4、在agent.php头部加入“Ob_Start('ob_gzhandler');”Q也是启用GZip压羃|页Q减网늚量传输?br />
5、降低如鹏助手的h频率Q由10U刷Cơ改?0U刷C?/div>
不要再拍脑袋Q要U学的计!Q!Q!Q!Q!
]]>
=================================================================================================
刚才帮一个同学解决一个在IE8下在如鹏论坛无法发帖的问题。由于如鹏论坛用的Discuzpȝ的验证问{功能对IE8支持有BugQ所以新用户无法发帖。验证问{功能是防止垃圾q告的一个有效手D,但是对IE8、Opera、chrome{非L览器支持有Bug。刚才ؓ了能让这个同学发帖,我就暂时关闭了验证问{功能,但是刚关闭了Q就来了一大堆垃圾q告贴。所以我p紧又把验证问{功能打开了。所以以?font style="color: #000000" color="red">使用IE8、Opera、chrome{非L览器访问如鹏论坛的时候会有这样那L(fng)问题Q现在也没有_֊解决q些问题Q只能满_多数同学的需求了?br />
我以及很多同事都有一个新?fn)惯Q?font color="red">l对不拿新Y件尝?/font>。因为新软g千好万好Q但是经验证明新软g会给我带来麻烦而不是方ѝ当qXP刚推出的时候,我还在上学,很多同学抢着装,我就q是Win2000坚持不动摇,当时大部分Y仉能在Win2000下跑的很好,而很多Y件对XP兼容性不是很好,所以他们一直在跟XP做斗争,我则用着Win2000做着该做的事Q编着该编的代码。碰到问题当时网上介l的Ҏ(gu)都是在Win2000下的解决Ҏ(gu)。这节省了很多时间。毕竟操作系l、电(sh)脑只是工P是要工具Z服务Q不是给你添乱?br />
q有当初IE7推出的时候,很多人尝鲜用IE7Q可是很多网站都对IE7支持有问题,到最后干什么都q不了。而那些用IE6的h则干着该干的事情,一Ҏ(gu)间、精力都没浪贏V?br />
IE8推出来了Q我怿它很好,我相信它比IE6、IE7都好Q比别的览器都好,可是有一点,很多|站用IE8看都有问题,那我用IE8q什么,l自己找那个ȝq什么。有同学?#8220;IE8用v来快”Q由于网站对IE8支持有问题导致你你一个帖子半个小旉发不出去Q节省的那点旉早就费没了?font color="darkred">览器的目的是上|,不是l别人当白鼠?/font>我估计早晚有用IE8的那一天,但是那一天是所有网站都对IE8支持没问题我再用IE8。我不当白鼠?br />
Vista推出来了Q同学们争着用,可是各个软g在Vista上装的都有问题,那不是给自己N事儿吗?竟然q有同学用Windows7QW(xu)in7和IE8现在都是试版,各个软g的兼容程度可惌知Q给自己N个麻烦干什么?{主Y仉支持他们在说吧。有同学说Windows7兼容性可好了Q可是再好有XP好吗Q只要没有的话你有可能q行一个别跑你不能跑的软gQ给自己添那个麻烦干什么。别人在拿着书在q行着代码Q你却在为着开发工具和操作pȝ的兼Ҏ(gu)艰苦奋斗着Q何必活的那么篏呢?br />
我现在从事的银行pȝ软g开发中Q一个新技术推Z后必ȝq其他客戯三q的验证和升U以后才会考虑使用Q就是基于这L(fng)考虑Q毕竟工hlh用的Q不是给人添ȝ的?br />
本文是专门ؓ在校生写的,是看C很多同学把很多精力放到折腾这U各L(fng)新Y件而忽略了正\的学?fn)有感而发Q不是针寚w些有太多旉研究Cѝ有志于改善世界上所有Y件、要解放全hcȝ牛h?/font>
]]>
"^/forum/archiver/((fid|tid)-[\w\-]+\.html)$" => "forum/archiver/index.php?$1",
"^/forum/forum-([0-9]+)-([0-9]+)\.html$" => "forum/forumdisplay.php?fid=$1&page=$2",
"^/forum/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$" => "forum/viewthread.php?tid=$1&extra=page%%53D$3&page=$2",
"^/forum/space-(username|uid)-(.+)\.html$" => "forum/space.php?$1=$2",
"^/forum/tag-(.+)\.html$" => "forum/tag.php?name=$1"
)
q里假设论坛装在forum目录下,如果是装在根目录下则是:
url.rewrite-once = (
"^/archiver/((fid|tid)-[\w\-]+\.html)$" => "archiver/index.php?$1",
"^/forum-([0-9]+)-([0-9]+)\.html$" => "forumdisplay.php?fid=$1&page=$2",
"^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$" => "viewthread.php?tid=$1&extra=page%%53D$3&page=$2",
"^/space-(username|uid)-(.+)\.html$" => "space.php?$1=$2",
"^/tag-(.+)\.html$" => "tag.php?name=$1"
)
2、重启lighttpdQ重启方法:/etc/init.d/lighttpd restart
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !^http://rupeng.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://rupeng.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.rupeng.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.rupeng.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tinyosstudy.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tinyosstudy.com$ [NC]
RewriteRule .*.(jpg|jpeg|gif|png|bmp|rar|zip|exe|pdf|attach|chm)$ http://www.rupeng.com
Chinapub在线购买地址Q?a >http://www.china-pub.com/301651
当当|在U购买地址Q?a >http://product.dangdang.com/product.aspx?product_id=20368319
试读?sh)子版下载?br />
下蝲地址1Q?a href="http://www.tkk7.com/Files/huanzhugege/cxydSQLjd.zip">http://www.tkk7.com/Files/huanzhugege/cxydSQLjd.zip
下蝲地址2Q?http://www.namipan.com/d/2ec1eacc92d2678a38095bef1d19ed938f78831d6f791500
W一本专门ؓE序员编写的数据库图?/p>
MD技术之“U?#8221;Q张合用?#8220;?#8221;Q锻造SQL高可用性数据库应用指南从理论到实践Q凝聚SQLL数据库最前沿的技术要领?/p>
本书特色Q主要介lSQL的语法规则及在实际开发中的应用,q且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异q行了分析;详细讲解数据库对增、删、改、查{SQL的支持ƈl出了相应的SQL应用案例Q透彻分析函数、子查询、表q接、不同DBMS中的SQL语法差异、SQL调优、NULL值处理、事务、开H函数等高技术;通过对实际案例开发过E的详细分析Q读者掌握SQL的综合应用技巧?/p>
内容提要
本书主要介绍SQL以及在实际开发中的应用,q且对SQL在MYSQL、MSSQLServer、Oracle和DB2中的差异性进行了分析。本书分Z部分Q第一部分为基,主要讲解数据库对增删Ҏ(gu){SQL的支持,l出了这些SQL的应用案例;W二部分阶篇Q讲解了函数、子查询、表联接、不同DBMS中SQL语法差异、SQL调优、NULL值处理、事务、开H函数等高技术;W三部分为案例篇Q讲解了前两部分的知识的l合q用。此书适用于学?fn)数据库~程的读者,对于有一定数据库开发经验的读者也有非常大的参考h(hun)倹{?/p>
前言
市面上讲解数现在据库的书都花了很多篇q讲解数据库的备份、授权、调优、修复、监控等内容Q这些内Ҏ(gu)数据库管理员QDBAQ应该掌握的Q而对于程序员来说更需要去掌握的则是SQL语句的用。但是市面上专门讲解SQL语句的书非常,初学者学?fn)数据库开发过E中常常被那些写lDBA的书弄的晕头转向Q无法真正快速的掌握SQL技术;而且q些书中讲解的SQL也常常是针对特定数据库系l的专有实现Q无法很Ҏ(gu)的在其他数据库系l中q行Q读者需要阅d量的书和查阅大量的文档才能掌握不同数据库pȝ的用?/p>
本书是专门写l程序员的,因此没有讲解备䆾、授权、调优、修复、监控等开发h员不兛_的内容,直接从SQL语句入手让读者快速的掌握数据库开发的技能?#8220;面向开发h员,讲解对开发h员最有用的知?#8221;是本书的~写宗旨?/p>
MYSQL、MSSQLServer、Oracle和DB2{都是非常流行的数据库管理系l(DBMSQ,虽然在大部分SQL语法上这些DBMS实现都是一致的Q不q在实现l节以及高语法斚wq些DBMS的实现差异还是非常大的。如果编写能够兼容这些DBMS的SQL语句是开发h员经帔R要面对的问题。本书将帮助读者从Ҏ(gu)上解册个问题?/p>
很多开发h员对于SQL语句的掌握只限于单的SELECT、UPDATE语句Q对于稍微复杂的逻辑l常需要编写程序代码来完成Q这不仅无法发挥数据库的优势Q而且开发出的系l性能非常低,而如果能够用数据库函数、子查询、表联接、开H函数等高的SQLҎ(gu)则可以大大化系l开发的隑ֺQƈ且提高系l的性能。本书将对这些高U特性进行详l的讲解?/p>
本书W??章介l数据库pȝ的基本知识以及基本操作;W?章介lInsert、Delete和Update语句的基本应用;W?章对Select语句q行全面的介l,Ҏ(gu)p匹配、分l、限制数据条数、计字Dc组合查询等高内容q行了重点的讲解Q第5章介l常用的数据库函C及它们在LDBMS中的实现差异Q第6章介l烦引与U束{知识点Q第7?章分别介l表q接、子查询{高U查询技术;W?章对LDBMS的语法差异进行分析,q且l出了解x案;W?0章介l注入漏z攻凅RSQL调优、事务、自动增长字DcNULL值处理、开H函数等高话题Q第11章以一个案例讲解书中知识点在实际开发中的应用?/p>
在此Q我要感谢ؓq本书的诞生l于我帮助的所有h。首先我要感谢CowNew开源团队的朋友们一直以来的无私奉献Q感谢KingChou在开发CowNewSQLq程中的卓越工作Q没有CowNewSQL也就不会有这本书的问世;q要感谢EasyJF的蔡世友Q他一直以来对开源事业的奉献是值得我学?fn)的Q最后我要感谢电(sh)子工业出版社的田康l理Q他的高效工作得本书能够顺利的完成和出版?/p>
如果(zhn)对我的书有M意见和徏议,(zhn)可以给我发送邮Ӟabout521@163.comQ本书相关的后箋资料会发布到CowNew开源团队网站(http://www.cownew.comQ中?/p>
W??数据库入?1
1.1 数据库概q?1
1.1.1 数据库与数据库管理系l?1
1.1.2 数据库能做什?2
1.1.3 L数据库管理系l介l?2
1.2 数据库基概念 5
1.2.1 Catalog 5
1.2.2 表(TableQ?6
1.2.3 列(ColumnQ?7
1.2.4 数据cdQDataTypeQ?8
1.2.5 记录QRecordQ?9
1.2.6 主键QPrimaryKeyQ?9
1.2.7 索引QIndexQ?10
1.2.8 表关?12
1.2.9 数据库的语言——SQL 13
1.2.10 DBA与程序员 14
W??数据表的创徏和管?17
2.1 数据cd 17
2.1.1 整数cd 17
2.1.2 数值类?19
2.1.3 字符相关cd 21
2.1.4 日期旉cd 23
2.1.5 二进制类?24
2.2 通过SQL语句理数据?25
2.2.1 创徏数据?25
2.2.2 定义非空U束 26
2.2.3 定义默认?27
2.2.4 定义主键 27
2.2.5 定义外键 29
2.2.6 修改已有数据?30
2.2.7 删除数据?31
2.2.8 受限操作的变通解x?31
W??数据的增、删、改 33
3.1 数据的插?34
3.1.1 单的INSERT语句 34
3.1.2 化的INSERT语句 36
3.1.3 非空U束Ҏ(gu)据插入的影响 36
3.1.4 主键Ҏ(gu)据插入的影响 37
3.1.5 外键Ҏ(gu)据插入的影响 38
3.2 数据的更?38
3.2.1 单的数据更新 39
3.2.2 带WHERE子句的UPDATE语句 40
3.2.3 非空U束Ҏ(gu)据更新的影响 41
3.2.4 主键Ҏ(gu)据更新的影响 42
3.2.5 外键Ҏ(gu)据更新的影响 42
3.3 数据的删?43
3.3.1 单的数据删除 43
3.3.2 带WHERE子句的DELETE语句 44
W??数据的检?47
4.1 SELECT基本用法 48
4.1.1 单的数据?48
4.1.2 索出需要的?49
4.1.3 列别?51
4.1.4 按条件过?52
4.1.5 数据汇?53
4.1.6 排序 56
4.2 高数据qo 59
4.2.1 通配W过?59
4.2.2 I值检?63
4.2.3 反义q算W?64
4.2.4 多值检?65
4.2.5 范围值检?66
4.2.6 低效?#8220;WHERE 1=1” 68
4.3 数据分组 72
4.3.1 数据分组入门 74
4.3.2 数据分组与聚合函?76
4.3.3 HAVING语句 79
4.4 限制l果集行?81
4.4.1 MySQL 81
4.4.2 MS SQL Server 2000 82
4.4.3 MS SQL Server 2005 83
4.4.4 Oracle 84
4.4.5 DB2 86
4.4.6 数据库分?88
4.5 抑制数据重复 90
4.6 计算字段 91
4.6.1 帔R字段 92
4.6.2 字段间的计算 93
4.6.3 数据处理函数 95
4.6.4 字符串的拼接 97
4.6.5 计算字段的其他用?103
4.7 不从实体表中取的数据 105
4.8 联合l果?107
4.8.1 单的l果集联?108
4.8.2 联合l果集的原则 110
4.8.3 UNION ALL 112
4.8.4 联合l果集应用D?114
W??函数 119
5.1 数学函数 122
5.1.1 求绝对?122
5.1.2 求指?122
5.1.3 求^Ҏ(gu) 123
5.1.4 求随机数 123
5.1.5 舍入到最大整?125
5.1.6 舍入到最整?126
5.1.7 四舍五入 127
5.1.8 求正弦?128
5.1.9 求余弦?129
5.1.10 求反正u?129
5.1.11 求反余u?130
5.1.12 求正切?130
5.1.13 求反正切?131
5.1.14 求两个变量的反正?131
5.1.15 求余?132
5.1.16 求圆周率π?132
5.1.17 弧度制{换ؓ角度?133
5.1.18 角度制{换ؓ弧度?134
5.1.19 求符?134
5.1.20 求整除余?135
5.1.21 求自然对?136
5.1.22 求以10为底的对?136
5.1.23 求幂 137
5.2 字符串函?137
5.2.1 计算字符串长?138
5.2.2 字符串{换ؓ写 138
5.2.3 字符串{换ؓ大写 139
5.2.4 截去字符串左侧空?139
5.2.5 截去字符串右侧空?140
5.2.6 截去字符串两侧的I格 141
5.2.7 取子字符?143
5.2.8 计算子字W串的位|?144
5.2.9 从左侧开始取子字W串 145
5.2.10 从右侧开始取子字W串 146
5.2.11 字符串替?147
5.2.12 得到字符的ASCII?148
5.2.13 得到一个ASCII码数字对应的字符 149
5.2.14 发音匚w?151
5.3 日期旉函数 153
5.3.1 日期、时间、日期时间与旉?153
5.3.2 L数据库系l中日期旉cd的表C方?154
5.3.3 取得当前日期旉 154
5.3.4 日期增减 157
5.3.5 计算日期差额 166
5.3.6 计算一个日期是星期?172
5.3.7 取得日期的指定部?177
5.4 其他函数 183
5.4.1 cd转换 183
5.4.2 I值处?188
5.4.3 CASE函数 191
5.5 各数据库pȝ独有函数 194
5.5.1 MySQL中的独有函数 195
5.5.2 MS SQL Server中的独有函数 202
5.5.3 Oracle中的独有函数 206
W??索引与约?209
6.1 索引 209
6.2 U束 211
6.2.1 非空U束 211
6.2.2 唯一U束 212
6.2.3 CHECKU束 217
6.2.4 主键U束 221
6.2.5 外键U束 224
W??表连?233
7.1 表连接简?236
7.2 内连接(INNER JOINQ?236
7.3 不等D?240
7.4 交叉q接 241
7.5 自连?245
7.6 外部q接 248
7.6.1 左外部连?250
7.6.2 叛_部连?251
7.6.3 全外部连?252
W??子查?255
8.1 子查询入?261
8.1.1 单值子查询 261
8.1.2 列值子查询 263
8.2 SELECT列表中的标量子查?265
8.3 WHERE子句中的标量子查?267
8.4 集合q算W与子查?270
8.4.1 INq算W?270
8.4.2 ANY和SOMEq算W?272
8.4.3 ALLq算W?274
8.4.4 EXISTSq算W?275
8.5 在其他类型SQL语句中的子查询应?277
8.5.1 子查询在INSERT语句中的应用 277
8.5.2 子查询在UPDATE语句中的应用 283
8.5.3 子查询在DELETE语句中的应用 285
W??L数据库的SQL语法差异解决Ҏ(gu) 287
9.1 SQL语法差异分析 287
9.1.1 数据cd的差?287
9.1.2 q算W的差异 288
9.1.3 函数的差?289
9.1.4 常用SQL的差?289
9.1.5 取元数据信息的差?290
9.2 消除差异性的Ҏ(gu) 293
9.2.1 为每U数据库~写不同的SQL语句 293
9.2.2 使用语法交集 294
9.2.3 使用SQL实体对象 294
9.2.4 使用ORM工具 295
9.2.5 使用SQL译?296
9.3 CowNewSQL译?299
9.3.1 CowNewSQL支持的数据类?299
9.3.2 CowNewSQL支持的SQL语法 300
9.3.3 CowNewSQL支持的函?305
9.3.4 CowNewSQL的用方?309
W?0?高话题 313
10.1 SQL注入漏洞攻防 313
10.1.1 SQL注入漏洞原理 313
10.1.2 qo敏感字符 314
10.1.3 使用参数化SQL 315
10.2 SQL调优 316
10.2.1 SQL调优的基本原?317
10.2.2 索引 317
10.2.3 全表扫描和烦引查?318
10.2.4 优化手法 318
10.3 事务 324
10.3.1 事务?324
10.3.2 事务的隔?325
10.3.3 事务的隔ȝ?326
10.3.4 事务的?327
10.4 自动增长字段 327
10.4.1 MySQL中的自动增长字段 327
10.4.2 MS SQL Server中的自动增长字段 328
10.4.3 Oracle中的自动增长字段 329
10.4.4 DB2中的自动增长字段 332
10.5 业务主键与逻辑主键 333
10.6 NULL的学?334
10.6.1 NULL与比较运符 336
10.6.2 NULL和计字D?337
10.6.3 NULL和字W串 338
10.6.4 NULL和函?339
10.6.5 NULL和聚合函?339
10.7 开H函?340
10.7.1 开H函数简?342
10.7.2 PARTITION BY子句 344
10.7.3 ORDER BY子句 346
10.7.4 高开H函?353
10.8 WITH子句与子查询 360
W?1?案例讲解 363
11.1 报表制作 371
11.1.1 昄制单l信?371
11.1.2 昄销售单的详l信?373
11.1.3 计算收益 374
11.1.4 产品销售额l计 378
11.1.5 l计销售记录的份额 379
11.1.6 为采购单分 380
11.1.7 索所有重叠日期销售单 383
11.1.8 为查询编?385
11.1.9 标记所有单内最大销售量 386
11.2 排序 389
11.2.1 非字D|序规?389
11.2.2 随机排序 390
11.3 表间比较 391
11.3.1 索制作过采购单的人制作的销售单 391
11.3.2 索没有制作过采购单的人制作的销售单 392
11.4 表复?394
11.4.1 复制源表的结构ƈ复制表中的数?394
11.4.2 只复制源表的l构 395
11.5 计算字符在字W串中出现的ơ数 396
11.6 去除最高分、最低分 396
11.6.1 去除所有最低、最高?397
11.6.2 只去除一个最低、最高?397
11.7 与日期相关的应用 398
11.7.1 计算销售确认日和制单日之间相差的天?398
11.7.2 计算两张销售单之间的时间间?399
11.7.3 计算销售单制单日期所在年份的天数 401
11.7.4 计算销售单制单日期所在月份的W一天和最后一?402
11.8 l果集{|?403
11.8.1 结果集转置Z?404
11.8.2 把结果集转置为多?406
11.9 递归查询 410
11.9.1 Oracle中的CONNECT BY子句 410
11.9.2 Oracle中的SYS_CONNECT_BY_PATH()函数 414
11.9.3 My SQL Server和DB2中递归查询 415
附录A 常用数据库系l的安装和?417
A.1 DB2的安装和使用 417
A.2 MySQL的安装和使用 429
A.3 Oracle的安装和使用 441
A.4 Microsoft SQL Server的安装和使用 452
/// <summary>
/// 取高?br />
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public static int HIWORD(int i)
{
return i >> 16;
}
3、Visual Studio中代码的x查错能力非常弱,很多的要到编译时才能知道代码是否有错Q而在Eclipse中在~写代码的时候对于有错误的代码和有警告的代码Q比如一些Private成员没有被引用)可以立即清晰的提C出来,开发h员可以立即修Ҏ(gu)错误的代码?/p>
4、Java中默认的Ҏ(gu)都是可以override的除非标注ؓfinalQ而在C#中必L明确声明virtual的才可以override。在Delphi中也是类似的问题Q这应该是Delphi和C#共同的老爹Anders Hejlsberg对于OO的一U理念吧Q也思h家大师的x是正的Q一个方法是否是虚方法必要明确指定。不q对于习(fn)惯了Java中这U实现方式的人来_C#的这U实现方式还是让人感觉一旉以适应的?/p>
5、Visual Studio的编译速度太慢Q点凅R调试?【运行】按钮以后要~译好长一D|间才能启动(不过和Visual Studio6比v来现在的Visual Studio~译速度已经快多了了Q已l接q于Delphi的编译速度了)Q由于Eclipse使用的自q高性能~译器Eclipse CompilerQ而且代码的编译是在编写代码的时候即时进行的Q所以在Eclipse中根本感觉不到编译的旉Q点凅R调试?【运行】按钮以后程序就q行h的?/p>
6?Netcd中一些类设计的不灉|Q比如TreeView的节点的昄的值是通过Text属性赋gȝQ而在Java中的Swing、SWT{图形库中,可以在一个树(wi)节点中挂Mcd的|然后通过个节点定义个性化的RenderQ渲染器Q来军_q些?wi)节?gu)CZ么?/p>
7、Visual Studio的插件体p过于死板,开发v来不像开发Eclipse插g那样灉|便,q可能和Visual Studio插g体系的历史渊源有关系。D例如下:
Q?Q比如要在代码编辑器上增加新Ҏ(gu),在Eclipse中可以通过代码~辑器中提供的大量扩展点来实玎ͼ而在Visual Studio中的代码~辑器中则只提供了很可怜的几个可扩展性。这一Ҏ(gu)Visual Studio插g体系最大的伤Q大大限制了ZVisual Stuio的插件的功能Q相信随着MS对Visual Studio插g体系的逐渐重视Q这一点会慢慢跟上来的?br />
Q?QVisual Studio的插件体pd.Netl合q于紧密Q在Eclipse中可以ؓPython、Ruby、C#、C、ASM{很多语a开发IDEQ提供代码编辑、代码辅助、调试、编译等功能Q,q些语言不必与Java有Q何关p,而在Visual Studio中虽然也可以ZU语a~写IDEQ比如IronPython、J#Q但是这些语a是和.Net集合紧密的,比如要ؓq种语言提供调试功能Q则必须代码编译成MSIL代码Q这对于很多语言来讲是不可能的;
Q?QEclipse中的插g只要在自qplugin.xml文g中配|好可以了Q把那个插g的jar包放到Eclipse中就可以q行Q而Visual Studio中的插g则必首先注册到注册表,调试和部|v来非帔R烦;
Q?QEclipseq行时的配置是保存在Workspace中的.metedata目录下的Q因此在开发插件的时候会把插件的配置信息自动写到Hosth的那个Eclipse的Workspace中,被调试模式启动的Eclipse所做的一些修改不会媄响主EclipseQ而在Visual Studio中虽然可以用Experimental Hive方式q行插g开发,但是׃q些配置是保存在注册表中的,所以被Host启动的Visual Studio实例会污染到主Visual StudioQ每ơ重启IDE都需要运?#8220;Reset the Microsoft Visual Studio 2008 Experimental hive”来进行环境的重置Q且重置耗时非常长,费了大量时_
Q?QVS2008中,如果插g中抛出异常,而又没有捕获的话Q轻则VS2008会显CZ个错误消息框Q重则VS2008会宕掉;而在Eclipse中会插件中未捕获异常显C出来ƈ且输出到日志文g中,方便插g开发者排查插件的Bug?br />
Q?QEclipse中工E相关的Ҏ(gu)是以Nature的方式提供的Q一个Nature通常可以挂接到几乎所有的工程cd中去Q包括用戯定义cdQ而在Visual Studio中工E相关的Ҏ(gu)则是以SubProject的Ş式提供的Q往往只能挂到Visual Studio内置的少数几个工E类型中去(比如CSharpProject、VBProjectQ,q样可扩展性大大降低了?br />
Q?QEclipse中可以用JET来开发非常复杂的代码生成器,而Visual Studio中的代码生成则只能用非常单的代码模板机制Q复杂的逻辑必通过字符串拼接来完成Q?/p>
毕竟接触.Net旉q是非常短,所以有的地方说的可能有错误Q还请园子里的兄弟多指教。最后祝.Net和Java能在怺竞争中快速成长,从而让我们开发h员能够轻松、快乐、快速的开发出产品来,Q)
每一个文法都指定了带有规?子结?和词表语al构。这些符号在q行时被转换成整型的"记号cd"从而可以有效的比较。定义从W号到记L(fng)型的映射的文件对ANTLR和ANTLR生成的分析器来说是基?q䆾文档描述了ANTLR使用和生成的q类文gQ还介绍了用于控制词表的选项?
在分析时Q一个语法分析器文法通过W号在它的词表里引用记号要符合由词法分析器或其他几号生成的Token对象。记L(fng)型储存在记号对象中,每种W号的值是唯一的,分析器比较这些整数来判断记号cd。如果分析器期望下一个记L(fng)型是23Q但发现W一个超前扫描记L(fng)型,LT(1).getType()Q不?3Q这时分析器抛出MismatchedTokenException异常?
一个文法可能有一个导入词表,l常也会有一个导表,用于被其他文法引用。导入的词表从未被修改,通过它可以知道词表的"初始条g"。不要和导入词汇h了?
下面列出了最常见的问?
每个文法有一个记L(fng)理器来管理文法的导出词表。从文法的importVocab选项Q记L(fng)理器?W号/记号cd 的Ş式被预蝲。这个选项强制ANTLRL有如下映关pȝ文gQ?
PLUS=44
没有importVocab选项Q文法的记号理器是I的(E后会看见一个警??
你的文法中的L记号没有预设|它们被按照遇到的序赋倹{例如,在下面的文法中,记号A和B分别??:
class P extends Parser; a : A B ;
词法文g以如下Ş式命名: NameTokenTypes.txt.
因ؓANTLR在分析过E中需要一些特D的记号cdQ用户定义的记号cd必须?后开始?
ANTLR?em>V生成VTokenTypes.txt?em>VTokenTypes.javaQ?em>V是文法的名字或者是exportVocab选项指定的名字。文本文件有点像一个简化的记号理器,保存着ANTLR需要的一些信息,供定义在其他文g中的文法查看其词表信息等{。Java文g是是一个包含了记号cd帔R定义的接口。ANTLR生成的分析器实现了其中的一个接口,获得所需要的记号cd定义?
一个文法的导出词表必须是另一个文法的导入词表或?个文法必d享一个公q导入词表?
设想p.g中有一个语法分析器P:
// yields PTokenTypes.txt class P extends Parser; // options {exportVocab=P;} ---> default! decl : "int" ID ;
l.g中有一个词法分析器L
class L extends Lexer; options { importVocab=P; // reads PTokenTypes.txt } ID : ('a'..'z')+ ;
即L主要是P的词表中的|但ANTLR生成的是LTokenTypes.txt和LTokenTypes?
不同文g中的文法必须׃n同样的记L(fng)型空_使用importVocab选项去预载同L(fng)词表?
如果q些文法在同一个文件中QANTLR会用同样的方法处理它。然而,你可以通过讄它们的导表到同一个文件来使这2个文法共享同一个词表。例如,如果P和L在一个文件中Q你可以q样做:
// yields PTokenTypes.txt class P extends Parser; // options {exportVocab=P;} ---> default! decl : "int" ID ;
class L extends Lexer; options { exportVocab=P; // shares vocab P } ID : ('a'..'z')+ ;
如果你没有ؓL指定词表Q它?yu)会选择׃n文g中导出的W一个词表;在这里,它将׃nP的词表?
// yields PTokenTypes.txt class P extends Parser; decl : "int" ID ;
// shares P's vocab class L extends Lexer; ID : ('a'..'z')+ ;
记号cd映射文g像这P
P // exported token vocab name LITERAL_int="int"=4 ID=5
文法l承父文法的规则Q动作和选项Q但是子文法使用什么词表和记号词表呢?ANTLR对子文法的处理就好像你复制粘贴父文法的所有非重蝲规则到子文法。因此,子文法记L(fng)集合是父文法和子文法的交集。所有的文法都导表所以子文法导出q用一个和父文法不同的词表文g。除非你使用importVocab选项重蝲Q否则子文法导入父文法的词表?
文法Ql承PQ会预先讄好P的词表,好像Q使用?font face="Courier New">importVocab=P选项。例如,下面的文法有2个记L(fng)受?
class P extends Parser; a : A Z ;
子文法Q,最初和父文法有相同的词表,但随后会增加一些符受?
class Q extends P; f : B ;
在上面的情况QQ定义了几个符?B使得Q的词表ؓ{A,B,C}.
一个子文法的词表一般是父文法词表的爉。注意重载规则不影响最初的词表?
如果你的子文法需要父文法未用过的新词法l构Q你或许需要子语法分析器用一个子词法分析器。用importVocab选项指定子词法分析器的词表来重蝲它初始的词表。例如,假设语法分析器P使用词法分析器PL。不用importVocab重蝲QQ的词表将使用P的词表,即PL的词表。如果你惌Q使用另一个词法分析器的记L(fng)型,比如说用QLQ那么做下面的事情:
class Q extends P; options { importVocab=QL; } f : B ;
Q的词表现在和QL的词表相同或者是QL词表的父集?
如果你所有的文法在一个文件中Q你׃用担心ANTLR会最先处理哪一个文法文Ӟ不过你仍要担心ANTLR处理文g中文法的ơ序。如果你试d入一个会被另一个文法导出的词表QANTLR提C它不能dq个文g。下面的文法文g会造成ANTLR出错Q?
class P extends Parser; options { importVocab=L; } a : "int" ID; class L extends Lexer; ID : 'a';
ANTLR在文法文件中q没有发现文法LQ所以它?yu)提CZ能发现LTokenTypes.txt。另一斚wQ如果LTokenTypes.txt存在(比如说在文法文g中还没有P文法的时候ANTLRq行生成?QANTLRؓPdq个文gQ然后在处理L文法的时候覆盖掉它。ANTLR不知道它要处理的文法恰好在一个文件中Q所以它假设是要d从另一个文件生成的词表?
一般的Q如果你惌文法B使用文法A的记L(fng)?无论什么文法类?Q你必须首先对Aq行ANTLR。例如,一个树(wi)文法用到了分析器文法的词表,应该在ANTLR生成了分析器之后再去处理?wi)文法?
例如Q当你想让一个词法分析器和一个语法分析器׃n同一个词表空间的时候,你要做的是L它们攑ֈ同一个文件中Q设|它们的导出词表到同一个空间。如果它们在分开的文件中Q把语法分析器的导入词表选项讄法分析器的导表,除非记号都定义在语法分析器中Q这Ӟ换一下导?导出的关p让词法分析器用语法分析器的导表?
如果你的文法在不同的文g中,你仍惌它们׃n全部或部分记L(fng)_该怎么办。有2U解x案:(1) 让文法导入同L(fng)词表 (2) 让文法承同一个父文法Q该父文法含有记L(fng)间?
W一个方案在下面情况使用Q你?个词法分析器?个语法分析器Q语法分析器必须要处理从Ҏ(gu)上就不同的输入部分。ANTLR 2.6.0发行版examples/java/multiLexer中的例子属于这U情cjavadoc注释和Java代码部分的词法分析和语法分析q程都不一栗javadoc词法分析器有必要识别"*/"中止注释的词法结构,但它一般让Java语法分析器用打开/关闭的记号引用来嵌套q行javadoc语法分析器:
javadoc : JAVADOC_OPEN { DemoJavaDocParser jdocparser = new DemoJavaDocParser(getInputState()); jdocparser.content(); } JAVADOC_CLOSE ;
问题在于Qjavadoc词法分析器定义了JAVADOC_CLOSEQ即也定义了它的记号cd。不q的是Java语法分析器的词表ZJava词法分析器而不是javadoc词法分析器?要让javadoc词法分析器和java词法分析器都可以看到JAVADOC_CLOSE (q且有同L(fng)记号cd)Q?个词法分析器都要导入含有q种记号cd定义的词表。这里有DemoJavaLexer和DemoJavaDocLexer的头部:
class DemoJavaLexer extends Lexer; options { importVocab = Common; } ...
class DemoJavaDocLexer extends Lexer; options { importVocab = Common; } ...
CommonTokenTypes.txt?
Common // name of the vocab JAVADOC_CLOSE=4
׃n词表的第二种Ҏ(gu)在下面情况用,你有1个语法分析器?个不同的词法分析?比如说ؓ不同cd的C)。如果你只想语法分析器空间利用率高,语法分析器必d以访?个词法分析器的词表,L文法不用的结?大概可以用语义断a)。给出CLexerQGCCLexer和MSCLexerQCLexer作ؓ父文法定义出所有记L(fng)集合。例如,如果MSCLexer需?_int32"Q那么在CLexer中定义一个所有词法分析器可见的记L(fng)型:
tokens { INT32; }
在MSCLexer中,你可以给它实际意义的字符?
tokens { INT32="_int32" }
用这U方法,3个词法分析器׃n同一个记L(fng)_允许你用一个语法分析器识别多种C的输入?
Version: $Id: //depot/code/org.antlr/release/antlr-2.7.6/doc/vocab.html#1 $
package com.test;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
public class MyAction implements ActionHandler
{
private static final long serialVersionUID = 1L;
private String message;
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
public void execute(ExecutionContext executionContext) throws Exception
{
System.out.println(message);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.1"
name="simple">
<start-state name="start">
<transition name="to_state" to="first">
<action name="action" class="com.test.MyAction">
<message>Going to the first state!</message>
</action>
</transition>
</start-state>
<state name="first">
<transition name="to_end" to="end">
<action name="action" class="com.test.MyAction">
<message>About to finish!</message>
</action>
</transition>
</state>
<end-state name="end"></end-state>
</process-definition>
package com.test;
import java.io.IOException;
import java.io.InputStream;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class Main
{
public static void main(String[] args) throws IOException
{
InputStream stream = Main.class.getResourceAsStream("processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition
.parseXmlInputStream(stream);
stream.close();
ProcessInstance instance = new ProcessInstance(processDefinition);
while (!instance.hasEnded())
{
instance.signal();
}
}
}
现在我们执行vi LoveLetter。进入以后,按一下键盘上的Insert功能键或者i键可以进入编辑状态,可以插入字符Q再按一下Insert变成复盖模式Q这两种模式的区别很Ҏ(gu)体现Q大家尝试一下就可以了。上下左叛_个方向键可以Ud光标。基本的~辑命o和W(xu)indows里面没有区别。是不是很容易呢Q当你把需要的内容输入完成以后Q我们要保存Q这时候按一下ESC键从~辑模式回到命o模式Q首先输入一个冒?#8220;:”Q也是按住SHIFT键不攑ֆ按分?#8220;;”q样首先输入一?#8220;:”Q然后,输入wQ回车,可以保存我们编辑的内容到LoveLetter文g。现在我们按一下Insert可以l编辑。再按ESCQ输?#8220;:”Q再按w又可以保存。可是现在我们不需要保存,我们惌不保存就退出,怎么做呢Q当我们输入w的时候是write的意思,保存Q那么我们输入q是quit退出的意思。好Q输入qQ回车,vi提示我们刚才q行的修改还没有保存Q所以记住!一旦需要放弃我们的修改Q不能直接用q命o退出,而需要用“q!”命o。输入q!Q好了,退Z?
我们想看看我们刚才编辑的LoveLetter是不是真的保存好了,再vi LoveLetterQokQ看C吧?现在我们惌直接退出,可以只输入“:q”可以了Q不用输入那?#8220;!”因ؓ我们没有修改文g内容。如果我们修改一下这文章,我们在退出的时候可以输?#8220;ESC : wq”可以了。不需要把w和q分成两次输入?
6 linux中可以用amount命oiso文g挂接为目录:mount -t iso9660 -o loop /home/kris/somewhat.iso /mnt/cdrom
7 file 查文件的cd
8 wall write mesg
9 reset 重置l端Q当屏幕发生问题的时候用此方?br>10 env 昄环境变量
11 改变pȝ语言的方式:q行 export LC_ALL="en_US" LANG=en_US 可以改成英文。要想一直输出E?可以?/etc/sysconfig/i18n里修改LANG="en_US. Utf-8"
12 查看本机ipQifconfig -a
13 mount光盘QmountQdevQcdrom QmntQcdromQ然后就可以在/mntQcdrom中看到光盘内容了 。用umount /mnt/cdromo 可以卸蝲光盘。只有卸载光盘以后才能将光盘弹出?br>14 在linux的提C符下输入文件名{的时候,可以输入部分文g名然后按Tab键即可智能补全?br>15 redhat中安装rpm包的Ҏ(gu)Qrpm -i "包\?Q要升包可以rpm -U packagename。包的删除比较容易,使用Q? rpm -e packagenamep够删除自己想要删除的包,不需要知道版本和路径
16 启动卌行vsftpҎ(gu)Q运行ntsysvQ选中列表中的vsftpd卛_?br>17 查看文g内容Qcat 文g?br>18 find / -name "*network*" -print 查找根目录下所有包含network的文?br>find / -iname "*network*" -print 查找根目录下所有包含network的文Ӟ忽略大小?br>19 useradd user1 建立一个用P不过在ؓ用户讑֮密码之前q个用户是不能用的Q设定密码的命o为passwd user1
20 ls的时候文件名旁边如果?#8220;*”P表示它是可执行文Ӟ只要q行“*/文g?#8221;卛_q行?br>21 重启|络service network restart
22 字符界面q入囑Ş界面QstartxQ图形界面返回字W界面:注销卛_?br>23 安装VMWareQ然后虚拟机|络cd选NAT卛_实现L和虚拟机之间的通信Q要q程dlinuxq需要安装telnet服务Qroot默认不能通过telnetd
24 删除非空目录Qrm -rf 目录?
25 解压cpio的方法:cpio -idmv < ***.cpio
26 UE中编辑的shell脚本到unix中运行提C?#8220;h^M: is not an identifier”Q解x法:dtox a.txt >b.txt 转换为unix格式Q或者用UE中的“文g”“转换”“DOS转Unix”功能。第二种更方?br>27 find /usr -name httpd
28 解压some.tgz的方法:首先gunzip some.tgzQ生成some.tarQ然后tar -xvf some.tar解压
29 gcc加入路径的方法:
PATH=$PATH:/usr/gnu/bin/
export PATH
30 sh脚本的变量的赋值等号两边不能有I格
31 sh脚本中命令行之间不能有空行,if语句后的条g前后要有I格
32 判断当前l端cdecho $TERM
33 重新获取ip的方式:/etc/init.d/network restart
34 Linux中录入ESC转义W的Ҏ(gu):首先按下Ctrl+VQ然后按下ESC?br>35 以后台方式运行一个程序,也就是脚本退出、shell退出都不会DE序退?命o后加“&”
36 d自启动的脚本攑֜“/etc/profile”文g中,比如配置Java的环境变量就必须在这个文件中加入Q?br>pathmunge /usr/java/j2re1.4.2_14/bin/ after
JAVA_HOME="/usr/java/j2re1.4.2_14/"
注意JAVA_HOME中的{号两边不能有空|否则JAVA_HOME会被当成命o处理!!!!!!!!!!!!!!!!!!!1
37 如果pȝ出现q修改LANG环境变量卛_。以前批量系l就出现q此问题
39 windows下的trace对应Linux?traceroute ip地址"
40 Linux下用U盘的Ҏ(gu)Q插入U盘,在mnt下创建目录usbQ然后运?#8220;fdisk -l”Q这样会昄所有的讑֤Q因Z般的U盘都是Fat格式的,所以找到格式ؓFAT的硬盘的标识W,比如sdb1Q然后运行mount -t vfat /dev/sdb1 /mnt/usbQ这样就U盘就挂接?mnt/usb下了Q卸载的时候umount /mnt/usb
比如需要指定读写格式的d器就可以如下实现Q?br>class SomeCarder implements IICarder
{
private FormatEnum format;
public void writeCard(String data)
{
if(format==FormatEnum.IBM)
{
.........
}
else...........
}
public String readCard()
{.............
}
public void configure(String configStr)
{
if(configStr.equls("IBM"))
{
format=FormatEnum.IBM
}
else if(configStr.equls("ISO"))
{
format=FormatEnum.ISO
}
}
}
开发h员用的时候只要如下调?br>IICarder c = new SomeCarder();
c.configure("IBM");
print c.readCard();
如果采用配置文g的话更可以把配置参数写到配置文g中,q样可以避免修改代码?/p>