2005年08月23日
Linux简史


这是一个不应该有的话题,因为最早没有选择,我们只有一台机器,一个系统,程序设计改变了我们的思想。各种为实现业务所开发的语言用到了OS上,unix就是一个很好的例子
这里想说的是,对于一个人来说,用什么系统不是重要的,但是实现业务是基本的,
很多人都片面的受到一些物质困惑,在强大的广告效益下,作出了不是很好的选择,就像我们从小就认为白雪公主就是那个美丽的女子。如果不是他这种类型的就会认为是丑的,同样,没有被接受的OS也会被人排斥。

linux在GNU下得到了飞速的发展,通过internet,我们传播她,他就是一个在虚幻世界出来的恶魔(freeBSD)的兄弟,这次他的对手是windows。和他的兄长相比他的竞争更加复杂化。(bsd与商业unix的之间关系)。
windows是完美的剽窃了apple,让自己从3.1开始不听的发挥自己。走到了longhorn。走到了现在,但是他现在不是在单单的与apple竞争,谁会想到91年出的如同dos的东西会让微软不敢小看,(91年正是微软的3系列的产品)。
可以说linux和windows一同成长。但是linux的关注度没windows的高,最好的解释就是微软的商业模式太完美了,已经不是我们简单的去看一个简单的软件,如果在这个革命的选择,就有很多狂热分子,如同宗教般,对某个不断的执迷,互相唾骂对方,这就如中世纪和圣战一样,最后没有胜利。
人是应用者,操作系统这是一个简单的人机对话的gui,借此完成业务计算。这样看来操作系统只是系统软件,也是为应用程序服务,他已经不是重要的环节。


不管你在这场OS大战中,选择那方,你都会对计算机感兴趣,因为不管是不是自由的狂热,还是铜臭的金钱,计算机技术仍然会推动这个真实世界的前进。

下面是20世纪短短的10年linux的走过
###################################################################
Linux发展大事记(www.blogchina.com)
篇章一:98年前大事列表
1984年Richard Stallman 发起GNU和Free Software Foundation。
1991 年4月 芬兰计算机系研究生Linux Benedict Torvalds开始为一个以后被称为"Linux"的内核而工作。
1991年8月25日Linus 网上发贴,寻找志同道合的合作伙伴。
1991年10月5日Linus Torvalds在新闻组comp.os.minix发表了Linux V0.01,约有一万行代码。
1992年,全世界大约有1000个左右的人使用Linux,并有不少人提供初期的代码上载和评论。
1993年 大约由100多个程序员参与内核代码修改,内核核心由5人组成,V0.99 约有十万行代码。
1993 年12月 Linux 全球用户数约在10万左右。
1994年3月,Linux1.0问世,约有17万行代码。它按完全自由免费的协议发布,源码必须完全公开,之后很快Linux正式采用GPL协议。
1995年 Linux 全球用户数大大超过50万, Linux 已可在Intel, Digital 和Sun SPARC 处理器上运行,Linux Journal 杂志已发行了10万册。内核发展到1.2, 约由25万行代码。
1996年6月 Linux 内核2.0 发布,可支持多个处理器,约由40万行代码。Linux 全球用户数约在350万左右。
1997 在日本、波兰、德国和南斯拉夫有Linux 月刊发行。版本升至2.1,约有代码80万行。  
1997年夏,制作电影《泰坦尼克号》所用的160台Alpha图形工作站中,有105台采用了——Linux操作系统。
篇章二:98年大事列表
一月份
Linux Weekly News 出版,1月22日第一期并不代表LWN以后的发展方向。从那时起Linux世界变得愈来愈复杂了,这真是一种有趣的探险。
Netscape 宣布将在一种自由软件许可协议下,公开其浏览器的源代码。不容置疑,这成了本年度最重大的事件之一,它使很多人看到了Linux和自由软件将会带来什么。
小红帽高级研发实验室成立。在这里,人们为自由软件和Gnome 工程的一个重要部分辛勤工作并得到报偿。RHAD吸引到了象Rasterman和 Mena Quintero.这样的开发人员。
Stampede Linux的发布实际上是在去年的十二月份。Stampede把自己定位在成为高性能的真正的黑客级别Linux发行版。
有消息说轰动一时的电影Titanic 部分是在运行Linux的Alpha机器上制作完成的:人们接受Titanic,也接受每件与它关联的事物,包括Linux。
二月份
Cobalt Qube发布,并且由于其高性能,低价格,以及可爱的外形而成为商业媒体的幸运儿。Cobalt的Linux相关工程全部由David Miller完成。
Linux用户社区获得了InfoWorld的技术支持奖,Red Hat 5.0赢得了操作系统奖项。但人们更为技术支持奖感到震惊,以前每个人都认为Linux没有技术支持。“Linux没有技术支持”的观点被推翻了。
Red Hat声称他们有Linux安装队伍的支持。
Eric Raymond 和他的朋友们提出“开放源码”这个术语,启动opensource.org 网站,开始正式推进Linux 的商业应用。
Linus Torvalds 和 Richard Stallman获得了EFF先驱奖。这一奖项是对他们为电子信息自由所做贡献的认可。奇怪的是,Electronic Frontier Foundation站点上没有提及此事。
Caldera1.2 发布,与基于libc6的Red Hat不同,Caldera基于libc5。
坚信基于专有BIOS 代码的系统不可能自由,人们启动OpenBIOS 项目和相应的站点。
人们为GGI 是否该归入Linux内核争论不休。GGI, 或普通图形化界面,旨在为Linux和其他系统上的视频卡提供更好的界面。GGI 此次没有提出融入内核的要求,这次争论也没有结果,但从此,GGI与内核黑客的交流却增强了。
三月份
Linux 全球用户数约在750万左右,有大约1万程序员参与新闻组讨论,代码测试和修改。
Learning Tree, International 组织增加了Linux 系统管理课程,并在美英两国频繁授课,这样“Linux软件的性能提高极快,它成为一种适合于商业环境的低价、可靠并拥有强大支持的计算平台。”
消费者权益保护人士Ralph Nader倡导大的PC厂商提供非微软的系统,包括预装Linux的系统。
Sun 公司对从Linux向Solaris 升级的客户打3折。
Bruce Perens,曾经是Debian工程的领导者,由于在工程怎样发展上的分歧而彻底辞职不干。
Eric Allman,成立Sendmail, Inc, 这家公司试图在保持sendmail代码公开的情况下,通过销售sendmail支持服务来赚钱。
John Kirch发表"Microsoft Windows NT Server 4.0 和Unix" 一文。这篇文章非常棒,想采用NT 4.0或Unix 的人都该读一读。
四月份
Mozilla源码在网上发布,世界各地的人们争相下载,很快,人们增添了功能强大的加密特性和Qt端口。
Linus被Inter@ctive周刊列为“网上25位无名英雄”之一。 四月份以后,Linus不再无名。
Open Group宣布了新的X window系统的许可协议方针。新版本的X window将用专有许可证,只有付钱购买者才能使用,他们还保留了一些安全补丁。XFree86称他们不能苟同新的许可协议方针,将考虑走自己的路。
美国全国公众广播电台报道了Linux,这是首次Linux在主流非技术媒介上出现。
OReilly 召开首次自由软件高层会议,与会者有Larry Wall, Brian Behlendorf, Linus Torvalds, Guido van Rossum, Eric Allman, Phil Zimmermann, Eric Raymond和 Paul Vixie。
Linux Weekly News(LWN)每日更新专栏开办。尽管LWN 想保持其每周焦点的特色,但每日专栏在访问量上已超出每周时事一栏,同时Linux大事专栏也开办起来。
Linux 3.0发布;Linus 第二个女儿的出生给他带来巨大的欢乐和内核研发的停滞,许多补丁程序都丢失了。有的人开始抱怨Linux内核对Linus的依赖性太强了。
Red Hat宣布商业支持计划,这一计划基于世界范围的支持合作伙伴网,其中 Eklektix, Inc则是Linux Weekly News的发起方。
Avalon Beowulf 集群在Los Alamos 一发布即成为全球最快的计算机系统之一。
Eric S. Raymond在网上发表"Homesteading the Noosphere",表述了他关于开放源码软件如何商业化运作的观点。
五月份

内核黑客Alan Cox 转而为小红帽工作。
Bruce Perens 基于他在Debian的经验,提出一种新的Linux发行版。这一版本从未出现,但其中很多部分后来包含于Linux基础标准(Linux Standard Base)工程中。
C|Net 的异端工程将只采用Linux工作,媒介反响强烈。
太阳微系统加入Linux International。
"Google"搜索引擎出现,它不仅是最好的搜索引擎之一,且是基于Linux,以Linux方面的网页搜索为特色。
Sm@rt Reseller报道说Oracle 和 Informix不打算支持Linux。“事实上,——无论它多么稳定、便宜——很多人怀疑Linux在商业市场上是否能同资金雄厚的Windows NT 和 Solaris竞争”
SuSE 5.2发布。
Corel正式接受Linux, 保证为Netwinder系列产品提供Linux支持。
The Association Francophone des Utilsateurs de Linux et des Logiciels Libres (AFUL) 在法国成立,并很快在法国计算机界颇具影响力。
Linux大型数据库到来。Computer Associates为其Ingres系统,Ardent Software为其O2对象数据库,纷纷表示支持Linux。
Linux Core/Layer工程发布,它是Linux系统标准化的最初探索。
有人提议创立Linux Standard Base (Linux 基础标准)工程。这个提议由多个Linux核心人物在Linux展示会上讨论并付诸实施。Bruce Perens成为该组织的领导人。
Red Hat 5.1 发布并迅速推出一系列更新,这些更新部分归功于Linux 安全检查项目组。
六月份
Gartner集团称自由软件没有希望:这些操作系统在未来两三年内不会成为主流的商务应用平台,也不会得到广泛的第三方应用程序的支持。
Gimp 1.0 不负众望,终于发布了。
稳定内核2.0.34 经历一番坎坷,终于推出。
出于对US出口禁令的焦虑,Beowulf 站点暂时关闭。任何人都可以组建超级电脑了,有些人变得很担心。但很快Beowulf 站点又恢复了正常。
Datapro 调查研究显示在操作系统用户中Linux拥有最高的满意度,它也是唯一一个市场份额增长的操作系统。
Corel 启动 Netwinder 。
Debian 2.0 在多日推迟后进入测试。
Adaptec 改变长期的封闭政策,宣布支持Linux , 并首选Red Hat为合作伙伴,陆陆续续其他发行商也与Adaptec 结合。
汉语 Linux Extension 工程启动,旨在促进Linux的本地化。
IBM 与Apache 队伍达成协议,将销售和支持Apache WEB 服务器。
硅谷 Linux 用户组召开 “1998 伟大的Linux革命”大会,在两个最主要的零售店将微软Windows 98产品发布庆祝会变成了Linux 宣传会。
硅谷 Linux 用户组还不满足,制造了一只标有Windows 98 字样的火箭并点火升空。
英国Linux研发人员大会在曼彻斯特召开。
七月份
Caldera 和Red Hat将合并的消息径走,但是合并没有发生。
KDE 和 GNOME 各自的拥戴者纷纷开始指责对方,Linus介入,指出KDE桌面也是不错的。在这样的情况下,KDE 1.0 发布,而且变得很流行,但不少人很不喜欢Qt库的许可协议。
NC World 杂志停止刊出Nicholas Petreley对Windows NT的猛烈抨击,但这篇文章依旧可从网上获得:该文指出Windows NT 5 (即现在的Windows 2000)是绝对的灾难。
稳定内核2.0.35 发布。
互联网操作系统计数器启动,对数以万计的主机进行统计后,Linux 占有了最大的WEB 服务器市场份额。
LinuxPPC 4.0 发布。
Oracle 宣布支持Linux,并承诺在1998年底推出与Linux兼容产品。这正预示了Linux未来的成功,Oracle的这一宣布引起了社会各界的关注。
几乎在同一天, Informix宣布支持Linux。
SVLUG/Taos "Linux的未来" 座谈会召开,与会的有 Linus 和其他的名人, 这次会后,Intel 开始正式考虑支持Linux。
Linus 出现在福布斯杂志的封面上,该期杂志内有一篇文章对Linux予以高度的评价。从此,越来越多的普通人开始听说Linux。
Mandrake Linux首次发行,该版本从小红帽发展而来,融合了KDE和多语言支持。
Stampede Linux 0.86 发行。
Debian 2.0 发布,而且容量极大,达1500个包共两张光盘。
MkLinux Linux DR3 发布。
Caldera推出面向Linux的 Netware 1.0
八月份
在开放源码协议下,EiffelBase 库推出,这个库原来是采用专有协议的。
小红帽再次向公众强调它的软件安装支持队伍:队伍即将启动,请公众耐心等待。
Bruce Perens, Eric Raymond, Ian Murdock,和 Tim Sailer发起 Open Source Initiative,旨在管理开放源码商标的使用(一个月后 Russ Nelson 和Chip Salzenberg 也加入管理小组)。
Richard Stallman 呼唤为自由软件建立自由文档。
GNOME 0.25 发布,代码名为Drooling Macaque。
原先的Linux基础标准工作陷入僵局,目标上无法一致,Red Hat和Debian于是共同组建Linux兼容标准工程。然后Bruce Perens离开了Linux基础标准组织,在自由软件圈消失了一段时间。
Software in the Public Interest (SPI)组织在大多数原先的核心人员离开的情况下组建新领导班子,包括了Ian Jackson, Martin Schulze, Dale Scheetz 和 Nils Lohner。
Red Hat 发表评论,阐述讨厌Qt许可证的理由,以及为何他们暂时不会在发行版中包含KDE 。
Linux Standards Association (LSA)突然冒出来并宣称为Linux制定真正的标准。LSA 的说法令舆论哗然,当舆论纷纷指出Linux社区讨厌统一标准的束缚,LSA 慢慢消失了。LSA 的价值可能在于促进Linux基础标准工作组织和Linux兼容标准工程组织的联合。
Red Hat 将他们在研发中的版本命名为 RawHide。
LSA组织的创办人Michael McLagan对 Linux 商标的合法性提出质疑,Linux International组织委托律师做出反应,Michael McLagan最后做出让步。
内核 2.1.115 发布,同时,Linus宣布代码将处于停滞期。
九月份
Linux 互联网服务器管理指南工程启动,同时,法语Linux杂志出版。
Stackguard/Immunix 5.1 发布。StackGuard 实际上是gcc的一个版本,用以对抗堆栈溢出攻击; Immunix 则是内建了StackGuard编译器的小红帽版本。
Microsoft的Steve Ballmer 承认他们开始为自由软件的出现感到担忧,建议NT部分源代码对研发人员开放。
SuSE 5.3 英文版发布。
Caldera 分为两家公司: Caldera Systems 在Ransom Love领导下从事 Linux 商务, Caldera Thin Clients负责研发Linux内嵌系统。
由于小部分5.3版本用户反映了安装过程中出现错误,SuSE 停止向国际发售5.3版本。
Uniform Driver Interface (UDI)工程建议Linux研发人员为UDI接口开发驱动程序,但是Linux社区反应冷淡。
SuSE 公布Office 99 套装软件,捆绑了ApplixWare, KDE, 和其他优秀软件。SuSE Office 99 可能与微软的办公套件发生竞争,引起了不少关注。
IBM 宣布对在 Linux运行DB2提供支持。
Sybase 宣布支持 Linux,这一次宣布,意味着Linux已可拥有全系列数据库产品。
Inter@ctive Week报道,戴尔公司向大客户出售预装Linux系统已有一段时间,戴尔小客户很惊讶,因为他们也有同样的需求。
Neomagic 向XFree86项目组提供其视频硬件驱动程序的源码并对外界免费分发。这种视频硬件驱动程序原先是在小红帽的赞助下由Precision Insight开发的,而且源码是封闭的。
Open Group做出让步在开放源码协议下发布X11R6.4 ,从而结束自由软件史上不甚光彩的一页。
Microsoft 在提交美国************会的年度报告中指出Linux是微软的一大威胁,据估计他们这种提法是为了影响微软垄断案的裁决。
加拿大 Linux 用户在全国范围内举办 Installfest 并获极大成功。
十月份
Intel 和 Netscape (作为两家风险投资企业) 宣布小额投资小红帽软件,这一投资将用于在小红帽内部成立企业支持部门。宣布引起了媒体的强烈关注,被视为商业社区认同Linux的信号。
Intel加入Linux International.
网络先驱 Jonathan Postel 逝世。
Linux国际内核包出台,既可提供加密机制,又不与臭名昭著的国家加密产品限令冲突。
GNOME 0.30 发布, LWN 对其发表了评论。
Linuxpower.org 站点启动,这是一个Linux 论文和教学的中心。
Cygnus 在开放源码协议下发布实时内嵌操作系统(eCos)。
Red Hat 在 CDE中发现了安全问题, 迅速将CDE从包中去除。这反映了这样的一个事实:因为CDE 不是开放源码的软件,所以不容易修正错误。
Caldera 1.3 发布,此版本包含了Sybase, KDE, 和StarOffice 4.0, 仍采用libc5,同时Caldera出台Linux系统管理员培训课程。
LinuxToday 出笼提供每日更新的Linux新闻。这是新一轮Linux站点发布潮的开端。
Linus在内核中放了太多补丁,Linux内核问题变得紧张起来。Linus有点生气,休假了一段时间。这次事件说明了内核变得越来越大,不适合再由一个人来领导。但是事情并没有妥善的解决。
bootX 发布使得 PowerPC 用户更为方便了。
Oracle8 for Linux 可供下载了,但是142 MB 绝不是个容易下载的小玩艺。
AFUL 赞助法国Linux安装聚会,聚会非常成功。
Microsoft 引 Linux 为证指出他们没有在操作系统方面垄断,他们的宣布还称Linux只是一个人的研发成果。
Larry Wall 夺得第一届年度自由软件基金会奖。Larry是Perl语言的发明人。
Debian 考虑到Qt许可协议问题,决定将KDE从他们的发行版中剔除。
Novell 宣布与Caldera 合作将 NDS 移植到Linux。
Allaire 宣布 Cold Fusion的未来版本将支持 Linux ,这也是很多人期待已久的。
Compaq 对增值分销商在其硬件上安装Linux提供支持,但没有销售预装Linux系统的计划。
LinuxWorld 网站启动,意味着Linux商业媒介登台。该网站的总编是Nicholas Petreley,在商业媒介一直 是Linux的支持者。
Microsoft 在法国发布反Linux公开信,这是微软FUD 战略的开端。这封公开信臭名昭著,受到强烈的指责,最著名的当推来自AFUL的驳斥。
France Telecom 投资 Cobalt Networks.
墨西哥 ScholarNet 项目出笼,该项目将在140000个学校构建基于Linux的计算机实验室。为推进GNOME 项目进展,项目主要采用GNOME 。
亚特兰大 Linux Showcase取得极大的成功。
Corel 宣布个人版本的 Word Perfect 8 for Linux 将可通过网络免费下载,另外宣布了与小红帽合作一起为Netwinder提供Linux的计划。
Corel 承诺帮助 WINE 的研发,这无疑给 WINE注入了一剂强心剂。
Pacific HiTech 宣布将TurboLinux 深入美国市场。TurboLinux在日本有最大的占有率,现准备进军其他的市场。
www.alphalinux.org站点启动,首次为Alpha 系统提供相关的Linux信息。
AFUL 与法国教育部签约,在法国校园内推行自由软件。
内核黑客 David Miller结婚。
十一月
两个Microsoft关于Linux和开放源码软件的内部备忘录到了 Eric Raymond之手,他及时地予以公开。内部备忘录阐述了Linux强大的一面,各种可能对微软构成的威胁,以及微软准备采取的对策。这无疑在媒介激起了轩然大波。
Extreme Linux 在 Supercomputing 98上一石激起千层浪。
Linux在COMDEX成为了热点,但不是焦点。
在开放源码协议下,Eddie 软件套装发布,这是一套用于构建高性能集群的应用程序。
专有I2O 总线标准公开源代码, 这样,I2O 总线对Linux的支持(这也是Linux迫切需要的)终于实现了。
Red Hat 5.2 发布,这将是6.0发布前最为稳定的一款,6.0将融合2.2的内核。
LinuxPPC 5.0 宣布其实际发布日期将定为1999年1月5日。
Ext2 成为第二个 Linux 月刊杂志。
Informix 和Apropos 在100多个Jay Jacobs 服装店安装Linux机器,Linux开始进军主流商业领域。
Digital Creations 以开放源码协议发布 Principia, Principia 最终将和Bobo 和Aqueduct 一起组成 Zope。颇为有趣的是,发布 Principia并和Bobo及Aqueduct的结合是由Digital Creations的风险投资方提议的。
硅谷茶会欢庆微软学园的成立。
StarOffice 5 for Linux 正式发布,个人应用可免费下载。
Troll Tech 宣布将在开放协议下发布 Qt 2.0。但此开放协议颇受争议,因为它规定软件修改后只能以补丁的形式再分发。所以, QPL 只是名义上的开放源码协议。
稳定内核2.0.36 发布。
OpenBIOS 0.0.1 发布。
Slackware Linux 3.6 发布。
Red Hat 和SuSE 均在COMDEX上宣布技术支持计划,均面向企业级技术支持。
Netscape 购买NewHoo web 目录,并承诺研发其适用的数据库。
十二月份
为了更好的反映网站的目的,摆脱Sun公司商标的影响,Sunsite.unc.edu 站点更名为 MetaLab.unc.edu。这个站点是Linux资源仓库以及Linux文档工程的大本营。
为了破纪录,CLOWN 工程搭建了 550节点的Linux集群。
开放源码商标所有权之争爆发,Eric Raymond和Software in the Public Interest均宣称对 Open Source Initiative 商标的所有权。
Linus 和Tove 成为芬兰独立日庆典的荣誉客人。他们会见了芬兰总统并被与会者评为最有意思的一对。
小红帽的黑客 Eric Troan 结婚。
为了便于新内核源代码的散发,Linux 内核文档镜象系统启动。
在Riley Williams和其他人的帮助下,Linux 内核历史出版。
Mandrake Linux 5.2 发布。
Netscape发布Gecko。 Gecko 是Netscape/Mozilla 研发的拳头产品,是一个更精干,更快,更符合标准的网页编辑器。
适用于PowerPC的Yellow Dog Linux发行版出台。
Corel 与 KDE 研发组结盟,为Netwinder 提供KDE界面。
IBM 发布适用于Linux的文件系统AFS 3.5。
GNOME 1.0 进入代码停滞期,0.99 测试版发布。
Compaq 在GPL协议下为PCI RAID 控制器发布Linux驱动程序。
LibGGI 2.0 测试版发布。
IBM 在开放源码协议下发布一些小软件,象Jikes Java 编译器和 Secure Mailer,同时推出可免费下载的DB2测试版。
Sun 逐渐开放 Java 协议。
Sun 在UltraSparc上支持Linux。
Silicon Graphics 加入 Linux International并宣布在其系统上运行Samba。
KDE 1.1 进入代码停滞期,其测试版发布。
据报道,IBM 曾考虑成为Linux的支持服务提供商,考虑到专利和其引发的法律责任而放弃。
SuSE 6.0 测试版发布。
报道称Apple 将发售预装了Linux的 Power Macintoshes 。
WordPerfect 8 已可供下载。
2.2 稳定内核快发布了。
IDC 称Linux 发售量1998年增长了200%,市场份额增长超过150%。Linux已拥有17%的市场份额,这种增长是任何其他操作系统无法匹敌的。
篇章三:99年大事列表
一月份
内核 2.2 测试版发布,预示世人长久期待的正式稳定内核 2.2即将发布。
Linux 内核文档镜象系统启动,性能卓越,从而解决获取内核源代码的问题。
Joey Hess 发起Debian每周新闻
SSC 发布Michael Hammel所著《Gimp 艺术家指南》
Kernel Traffic 启动,详细总结了有关Linux 内核的讨论。
Tucows 启动LinuxBerg站点,这是一个Linux 软件下载站点。
Samba 2.0发布,它反向工程了微软域名控制协议,使得Linux服务器可以为Windows网络提供完整服务。
Corel将它的NetWinder部门卖给Hardware Computing Canada。
Slackware 网站开始运作。
1月25日,Kernel 2.2.0经两年多的研发正式发布。
惠普和康柏公布将提供基于Linux系统的计划。
TCP捆绑代码被携带后门的版本取代,这证明了开放式代码中也存在后门。但是,很快后门代码就被修补,没有站点受到危害。
Linus 宣布2.2.1几星期内不会发布,结果有人在2.2.0版本中植入可导致系统崩溃的Bug,这促成了2.2.1提早发布。
寻求制造Qt 库的LGPL 克隆的“和谐工程”正式破产。
Loki Entertainment Software 宣布将Civilization: Call To Power游戏移植到Linux.
二月份
Linux 认证如火如荼,SAIR和Linux Professional Institute纷纷发布计划。
Wichert Akkerman 取代Ian Jackson成为Debian 工程的领导人。
Lyx1.0.0 发布。
Dell 开始销售基于Linux 的服务器。
Linuxcare 推出服务计划,创下一夜成名的Linux公司神话。
基于Red Hat 5.2的Linux-Mandrake 5.3 发布。
KDE 1.1 发布。
Samba 2.0.1 和 Samba 2.0.2接连发布,虽然后者并未完全公开代码。
Debian 2.1 的发布计划在3月2日举行。
SuSE 6.0 国际化发行成型。
Glibc 2.1 发布,这样gcc和egcs编辑器工程项目的分歧日益明显。
Burlington制衣厂宣布将在250家店铺的1100多台机器上安装Linux。
IBM 宣布与小红帽建立伙伴关系,以确保小红帽在IBM机器上正确运行。
Bruce Perens 因为“自由软件”定义的分歧从Open Source Initiative 组织辞职。
意大利文本地版Prosa Debian GNU/Linux发布。
SGI发布GLX扩展代码。
3月
第一届LinuxWorld 大会在San Jose 开幕,象征Linux时代的来临。
3月2日,Debian 2.1发布不能如期举行。
在LinuxWorld 媒体发布上,GNOME 1.0 成为大热点。
有消息称Sun 将有条件公布Solaris 的源代码。
Digital Creations提供赞助,Amos Latteier所著《Zope 每周报道》启动。
Troll Tech 公布向Linux移植 Opera 浏览器计划。
Linux Magazine 杂志粉墨登场。
VA Research 和Intel 合作将Linux移植到Intel Merced 处理器,同时Intel 直接注资VA。
Red Hat 启动Linux 门户站点。
VA Research 用100万美元买下Linux.com 域名。
Dell 开始为其Linux系统捆绑Linuxcare 提供的服务 。
IBM、Compaq、Oracle和Novell均宣布投资小红帽。
内核2.2.3发布。
9日,Debian 2.1 发布。
Cendant 宣布在4000个旅馆应用Linux 系统。
Qt 通用许可证1.0版本发布,引起有关源码开放与否的争议。
Corel宣布将发布自己的Linux发行版并将其推向市场。
Apple公司宣布其操作系统非核心部分将采用“开放源码”的模式。
CeBIT 99 在德国开幕,KDE 获得年度软件革新奖,Linux社区获得“焦点”奖,同时SAP宣布其R/3 ERP 系统将支持Linux。
MTI 购买20%Caldera Systems 股票。
VA Research 业务繁忙,将部分生产委托第三方进行。
SAP 注资小红帽。
美丽莎病毒全球肆虐。
向Intel 和PowerPC平台移植的Blackdown JDK 1.2 预发行。
4月份
网景为Mozilla 发行一周年举行庆典。
Jamie Zawinski 认为Mozilla 计划是一个失败,从中退出。
Dell 投资小红帽,开始启动预装小红帽Linux的服务器市场。
Dell 销售的Linux系统包含了Linuxcare 90天技术支持。
Al Gore 的总统竞选站点宣称是“开放源码”的。
TheLinuxStore.com 站点开张,销售低价Linux系统。
Mindcrast 研究报告发布,很快成为争议焦点:这次研究由微软投资并在微软实验室进行,高度评价Windows NT,诋毁Linux,但从中也发现Linux内核确实是存在问题的。很快,内核黑客修正了内核。
FreeS/Wan 1.0发布。
Caldera OpenLinux 2.2 发布,这是第一个基于Linux 2.2的发行版。
Core 宣布其Linux发行版将基于Debian 和 KDE,这大大提升了Debian 项目的知名度。
Linus Torvalds 在春季COMDEX大会上演讲。
SuSE 6.1 发布。
为Linux新手服务的LinuxNewbie.org 发布
egcs 工程委员会成为gcc维护的当家,从此自由软件内部一次不友好的分裂结束。
Python 1.5.2 发布。
KDE 1.1.1 测试版发布。
HP 为 Caldera, TurboLinux, Red Hat 和 SuSE 提供 24×7支持服务。
VA Research 收购Linux Hardware Solutions。
Red Hat 6.0 发布,同样也是基于2.2内核,但与 OpenLinux 2.2相比则滞后了。
UltraSparc 走到了尽头,它的每个功能特性Red Hat 6.0都有。
Cygnus 宣布开放源码 Java编译器,而且,据称,IBM刚向Win32 移植的JVM也将能移植到Linux。
第一次国际操作系统调查结束,140万主机中,31.3%运行Linux。
5月份
Mindcraft 卷土重来,宣布用公开标准重新对NT和Linux进行测试,这次测试,懂得Linux的人均可参与。
Guido van Rossum 和Donald Becker 获得由 Dr. Dobbs Journal颁发的编程精英奖。
wu-ftpd 导致一时间网络安全问题成灾,但很快出现不少补丁程序。
Creative Technologies 发布测试版 SB Live 驱动程序。程序很糟糕,因为没有开放源代码而无法及时修复。
Linus 书写新USB驱动程序并将其植入2.2.7内核。这一点令 UUSBD项目组成员惊讶,同时Linux对USB的支持确实大大增强了。
Definite Linux 6.0 发布。
Tcl 8.1 发布。
KDE 1.1.1 发布。
Rebel.com 成为Hardware Computing Canada的新名, 这家公司购买了Corel的Netwinder部门。
经第九巡回法庭的判决,关于加密算法出口的限制违反美国宪法第一修正案。
内核 2.2.8 推出同时 2.3.0研发开始。
Debian日本项目组推出日文Debian 2.1.
TurboLinux 宣布将提供高性能Linux集群。
Sun Microsystems 宣布Linux 代码可与Solaris x86兼容。
LinuxHQ 最终由 Linux.org购买,并更名为 kernelnotes.org。
两个开放源码交流站点:sourceXchange 和Cosource.com同时开铺,采用不同的办法对开放源码项目组成员进行协调。
OReilly 在网上发布 "Open Sources:来自开源革命的呼声",此书包含来自Eric Raymond, Richard Stallman, Linus Torvalds, Michael Tiemann, Larry Wall, 和Bruce Perens的精华观点。
Stockholm 大学数学研究院授予 Linus Torvalds 荣誉博士学位。
Linux.com 新近开铺。
Pacific HiTech 更名为TurboLinux。
VA Research 更名为 VA Linux Systems。
SGI 宣布向 Linux移植XFS文件系统。
VA Linux Systems 雇用内核黑客 Ted Tso.
Slackware 4.0 发布。
Corels WordPerfect for Linux 下载量突破100万。
LinuxToday发起LinuxPR.com,这是一个专业 Linux相关媒体发布站点。
Havoc Pennington的每周Gnome 研发总结创刊推出。
安全 Linux 发行版计划出台,同时3个相关项目诞生: SecureLinux, Khaos Linux和 Bastille Linux。
Linux-Mandrake 6.0发布。
Linux Counter 在 5月 26日访问量突破10万。
6月份
Red Hat提交IPO申请,发言人Melissa London拒绝就IPO发表评论。
Microsoft 向开放式研发迈出第一步,与ActiveState签约 在Artistic license许可协议下开发 Perl。
LinuxDev.net开铺,带来专为Linux研发人员定制的新闻。
Debian 组织公布新的Logo。
第一届菲律宾Linux 99在Makati城的香格里拉饭店召开。
Linux Professional Institute 宣布企业赞助方,包括Linuxcare,IBM,Macmillan USA, Computing McGraw-Hill, Linux Journal, New Riders Publishing以及 SuSE, Caldera 和 New Wave Technology.
澳大利亚开放源码座谈会在墨尔本召开。
2.2内核出现远程拒绝服务问题,Alan Cox 在数小时内修正了内核。
Carsten "Rasterman" Haitzler 从Red Hat 辞职来到VA Linux Systems。
Sun Microsystems在太阳社区源代码协议下发布高性能集群工具。
Guylhem Aznar接管 Linux 文件系统工程。
由于美国专利商标局不愿意,"Open Source"作为商标的计划搁浅。
VA Linux Systems 从Compaq 雇用了Jon maddogHall。
LinuxPPC 5.0 发布。
PostgreSQL v6.5 发布,其新性能包括高性能锁定机制和热备份。
VA Linux Systems的董事会成员包括 Eric Raymond,Eric Raymond 同时也是开放源码运动的非正式发言人。
Linux Expo 99 巴黎会议召开。
Eric Raymond 在微软做演讲。
VA Linux Systems 从Intel, SGI, Lehman Brothers以及 Sumitomo Corporation获取投资。
Hewlett-Packard 发布一款基于Linux的工作站。
Eric Raymond 出版“超级魔法炉 ”这篇文章是一个系列三篇中的第三篇,第一篇是“教堂和集市 ”
Mindcraft 的基准在Linux专家的同意下执行,NT仍然赢了,但是Linux的问题很快就得以修复。
Andover.net收购Slashdot.net。
TurboLinux 工作站3.6发布。
Apache 软件基金会成立。
Qt 2.0 发布。
LinuxTag 99 在Kaiserslautern大学召开。
Alan Cox发起Linux Portaloo。
Sun 发布 JDK 1.2.2.
IBM 发布自己版本的 、面向Linux的Sun JDK 1.1.6, 其中包含了实时编译技术。
又一Perl 协商会在 Carnegie-Mellon大学召开。
NVidia为它的芯片集发布开放源码驱动程序。
Matrox 为其G400 芯片集发布规格说明。
7月份
Lotus宣布他将把Domino 向Linux移植。
Debian 项目组为9月份发布讨论暂时的冻结。
Midgard 1.1 发布。
澳大利亚Linux 用户协商会在墨尔本召开
Red Hat 公布股票发行计划,Linux研发人员得以IPO价格购买Red Hat 股票。
Oracle 为Linux推出 Oracle8i,在业界激起千层浪。
Caldera 瘦客户端有 Lineo; 重点从 DR-DOS 转向OpenLinux 内嵌版"Embeddix."
Dataquest 预测 Linux 在2003年将占服务区应用销售份额的25%,
Sun/Netscape 联盟成立,Netscape 应用服务器将不再面向Linux。
渥太华 Linux 讨论会召开。
IBM 启动对 Linux的支持服务,从此有关Linux得不到支持服务的历史一去不复返了。
IBM 发布Linux DB2。
VA Linux Systems 启动Linux支持服务。
TurboLinux 宣称在日本其销量超过Windows。
8月份

SGI 发布基于Linux的服务器1400L, 并与Red Hat 建立伙伴关系,大举参与内核研发。
Eric Raymond 推出新版本“大教堂和集市 ”,OReilly 出版。
MandrakeSoft 雇用 KDE黑客David Faure 开发 Koffice 。
Red Hat 发布 GNOME 更新,30%的Red Hat 6.0用户采用了更新。
第二届 LinuxWorld Conference and Expo 在San Jose开幕。
Red Hat股票发行,发行日以每股50美元收盘。
IBM 加入 Trillian 工程,此工程计划将Linux 移植到IA-64 ("Merced", "Itanium")处理器上。
Microsoft 在网上测试 Windows 2000 系统安全性,一天之内就被攻破好几次。
稳定内核 2.2.11 发布, Linus 将2.2 内核工作完全移交给 Alan Cox.
Linus抱怨得不到ISDN补丁,2.4内核将可应用ISDN。
Definite Linux 6.1 发布。
摩托罗拉宣布与Lineo建立伙伴关系,开展Linux内嵌系统的研发、支持和服务。
LWN.net 开辟Linux股票专栏。
Freshmeat.net 收购Andover.net。
RAID 0.90 被融合进2.2.12补丁中,之后出于各种考虑又从中剔除。
Andrea Arcangeli和 Gerhard Wichert宣布Linux在32位Intel系统上支持的内存可达到4G。
Atipa Linux Solutions 为摩托罗拉构建 200个节点 Beowulf 集群,用于半导体建模和研发。
Genetic Programming, Inc发布面向基因编程达1000个节点的 Beowulf 系统。Corel 和Rebel.com 捐赠了一批 NetWinder 系统到联合国发展署。
AXA 创新基金投资 MandrakeSoft。
Red Hat 和Caldera Systems发布“系统不存在2000年 问题”的声明。
SGI 在Linux内核中加入回旋锁定测量代码。
Ted Nelson最终以开放源码的形式向世人发布 Xanadu。
Midgard 1.2 发布
SourceXchange首批发布 RFPs, 均来自HP公司。.
Red Hat 与日本 Itsutsubashi 研究公司断绝关系,宣布推出自己的日语发行板; Itsutsubashi 发布 LASER5 版本,与小红帽公司竞争。
OReilly 开放源码大会在CA的Monterey召开。
新出现的 FTP 安全问题导致网上陷阱重生。
Sun 收购StarDivision并在太阳社区源码协议下推出 StarOffice 。
Cryptix纯粹的太阳公司Java 加密扩展发布。
9月份
SGI 推出图形化研发环境"Jessie"。
Zope 2.0 发布。
首次Linux 股票狂飙, Applix 发行量为原有的两倍, 达到 2700万股。
HPTi 获得向美国政府提供Linux集群的合同,在竞争性极强的政府大项目中,这是Linux的首次大胜利。
Bind 8.2 在发布过程中,系统的一部分没有开放源代码,这曾引起争议,后来解决了。
SCO 在北欧发行的宣传手册上诋毁Linux: "Linux此时不足以满足企业营运、安全的需求,它只是计算机专业学生的玩具而不是一个严肃的操作系统;Linux本质上是一个完全免费的玩艺,没有公司和个人对其负责。”
Proftpd的安全问题使网络变得极为脆弱。
Caldera OpenLinux 2.3 发布。
GNU Privacy Guard (GnuPG) 1.0发布。 GnuPG 是免费的PGP加密程序替代品。
Gateway 开始供应预装Linux的服务器。
Burlington制衣厂向小红帽购买支持服务。.
Red Hat 股价升至$135/股,价位出奇的高。
Caldera Systems 发布"Lizard" 安装器源码。
Pluto Meeting 99 在意大利 Padua开幕,演讲人包括内核黑客 Andrea Arcangeli。
Channel One Gmbh 在德国注册 "Linux" 商标但很快在一片讥讽声中草草收场。
IBM 通过在 Thinkpad 600E 笔记本电脑上安装 Linux 的认证,尽管安装过程非常困难而且安装部件没有全部成功安装。
Debian 2.1r3 发布,仅包含了Bug以及安全补丁。
研发中内核 2.3.18 发布,集成了PCMCIA驱动, 这种驱动原先是单独发布的。
Corel 将对其发行版测试,但是测试协议却违反了GPL 条款。
KDE 1.1.2 发布。
Cobalt Networks 提交IPO申请,筹集大约2300万美元。
Linux 演示在全世界举行。
Ext3 首次发布使得 Linux日志系统成为现实。
Linux-Mandrake 6.1 发布。
Andover.net 提交IPO申请。.
LinuxOne 提交IPO申请,这一次IPO令人惊讶:首先,很少有人听说过LinuxOne,其次,这家公司没有产品,没有收入,没有人担保,仅存在了几个月而已。
Netcraft称英国王室站点是在Linux系统上运行的。
内嵌系统大会在 San Jose开幕,Linux成为焦点。 Cygnus 在会上推出"EL/IX"。
PC Week 提出了向Linux系统进攻的挑战,Linux系统被攻破了,但问题在于第三方CGI程序而不在Linux本身:PC WEEK没有对Linux系统进行更新。
VA Linux Systems 宣布新的专业化服务团队。
Linus Torvalds被Stockholm 大学授予名誉博士。
LinuxWorld Conference and Expo 在东京开幕。
Blackdown将JDK1.2向Linux移植出现突破,稳定版本有望推出。
两个开放源码GPL 电子商务应用程序OpenSales和 Yams发布。
开放源码实践管理高峰会在多伦多举行,此次大会由Minoru Development Corporation提供赞助。
LinuxPPC 1999 Q3 发布。
十月份
Sun Microsystems 宣布将在太阳社区源码协议下开放Solaris 代码。
Microsoft 推出《Linux Myths》全面攻击 Linux。
Ssh 1.1.12 不象以后的版本,是在自由协议下发布的,由此诞生的OpenSSH 项目旨在去除专利算法,研发真正意义上的自由安全的Shell。
Definite Linux 7.0 发布。
SCO投资Linux Mall。
Red Hat Linux 6.1 发布。
TurboLinux 从 Intel, Broadview Associates,和August Capital获得投资,并取得在日本诊所安装20000套系统的合同。
亚特兰大Linux 展会开幕。
LWN 企鹅陈列室建成,现已陈列200多个企鹅像。
VA Linux, OReilly, 和SGI 一起赞助 Debian “盒子”产品。
Bruce (Perens) 2.0 发布。
第二届KDE 研发人员协商会在德国的 Erlangen开幕。
VA Linux Systems 提交IPO计划。
Bob Young新书“红色旋风”由Coriolis出版发行。
Cobalt Networks和Gateway 达成协议, Gateway 成为 Cobalt服务器分销商。
Internet.com收购LinuxToday,协办人Dave Whitinger离开。
十月份GNOME 推出,内含众多修补或更新的程序。
Motorola 投资 Lineo。
Red Hat 和Compaq 签订互惠支持协议。
Wu-ftpd 导致了Linux 系统更多的安全漏洞。
IBM 公布面向Linux JDK 1.1.8的 JVM ,称其性能比在NT下运行为佳。
Sun 预先宣布与 Java 2兼容的面向 Linux的JVM。
FreeGIS 项目宣布,旨在促进更多自由地理信息系统软件的研发和使用。
GRASS GIS 系统在 GPL 条款下发布。
面向Linux内嵌系统的LinuxDevices.com开铺。
十一月份
Corel 与 PC Chips 签订协议,将在2000年随同PC Chips的主板捆绑2000万个Corel Linux发行版。
Linux DVD 研发人员破解了 DVD 加密格式,这证明了DVD 加密格式很糟,封闭源码的加密本身是一个错误。
Ingo Molnar 在2.3 内核中的改进使Linux可以在32位Intel处理器下支持64G内存。
Debian “马铃薯”冻结将延续到11月7日。
Slackware 7 发布,前一个版本号为 4,这个跳跃是为了适应市场的需求。
Creative Technology 在GPL条款下推出SB Live声卡驱动程序。
Red Hat 建立开放源码Red Hat 中心, 这是一个非盈利的组织,旨在基于大众利益出发推进开放源码原则,赞助,支持和从事范围广泛的科研和教育项目。
Linux-India 在IT.COM 99——一个 印度焦点会议中表现突出。
Red Hat 宣布与 Oracle联合推出新款发行版,其中含了Motif。
Microsoft 被美国地方法院裁定为垄断。调查结果显示Linux还未对Microsoft构成威胁。
SGI 发布新内核机制:内核崩溃垃圾分析器。
来自Namesys的研发人员发布新版日志系统Reiserfs,这样Linux拥有了两套日志系统。
Debian “马铃薯”冻结推至 2000年1月15日。启动盘问题是导致推迟的原因。
Kondara 日文MNU/Linux 1.0 发布,此发行版基于 Red Hat的Raw Hide。
Cobalt Networks 上市,很快股价升至$130/股, 几乎是发行价的6倍($22/股),股市强烈看好Linux。
Comdex Linux商展在赌城拉斯维加斯开幕,参观者络绎不绝,其中许多人是首次见识Linux。
Corel 在Comdex Linux商展中首次推出Linux发行版。
Linux Professional Institute 举行首次专业Linux认证测试。
SuSE 6.3 将在十二月面市。
Mozilla Milestone 11 发布,此开放源码浏览器终于有了一点可用性。
OReilly出版《Samba 使用指南》并被Samba项目组采用,此书是在open content license下发行的。
Sybase 宣布对Zope 开发提供支持。
Red Hat 以7亿股价收购 Cygnus,Red Hat 的并购似乎启动了。
VA Linux Systems 将股票发行价定为 $11-13/股。
VA Linux Systems 和SuSE 建立研发伙伴关系。
Supercomputing 99 开幕, Linux 也是会议焦点。
XFree86项目组以荣誉会员身份加入X.org。
Linux 文档工程有了 新的logo, 新网页,新文档和用DocBook 格式工作的能力。
ET-Linux 1.2 由Prosa 发布。
Real-time Linux 2.0 发布。
VA Linux Systems 公布定向配股计划,这样使得Linux研发人员可以用初始价购进VA Linux部分股票。
SuSE 从Intel和Apax Partners获得投资。
Blackdown的JDK 1.2.2 和JDK 1.1.8可望在月中发布。
Sun 招聘支持 Java在 Linux平台上应用的程序员。
Gimp 用户指南第二版发布,网上可以获得,另Coriolis以书籍形式出版。
十二月份
SuSE资助的 ALSA 专业团队成立,旨在研发高级Linux 声音体系。
Andover.net 以$18/股发行, 当时收盘价突破 $60。这被视为Andover.net和OpenIPO的共同胜利。
VA Linux Systems 经两次重新调价,第二天首次发行,发行价 $30/股,股价迅速攀升并突破 $300/股, 当日以$250/股收盘,这是 NASDAQ IPO的新纪录。.
Linux 股热波及了任何与Linux沾边的股票。
Linux 内核2.3.30 发布,内含了对 NUMA 系统的支持。NUMA是大规模多处理器系统应用中的一项重要技术。
Sun 发布面向Linux的Java 2 应用,Sun 在发布中忽略了Blackdown的功绩,造成了很多人的不愉快。
SuSE 6.3 面市。
Zope 2.1.1发布。
Dell 宣布对全线 PowerEdge 服务器提供Linux,同时Dell系统包括了90天Red Hat 技术支持服务。
OReilly 网络开始启动。
Matra Datavision 在开放源码协议下发布CASCADE。 CASCADE 主要用于几何建模; Matra Datavision 宣称为CASCADE花费了7500万,采用的协议与 GPL颇为相似。.
Miguel de Icaza 因为他在GNOME项目中的工作被授予FSF Free Software Award 。
Bastille Linux 1.0.0 发布,旨在推出一个高度安全可靠的发行版。
测试内核2.3.33发布。
Zack Brown发起内核期刊,旨在成为内核信息的权威来源。
Red Hat收购德语发行版Delix。
Debian 2.1r4 发布,修复一些安全以及2000年问题。.
Linux-Mandrake 6.1 经认证无2000年问题。
Storm Linux 2000 发布
KDE 2.0不稳定预览版KRASH发布。
Zope和Mozilla 建立伙伴关系。
HP 旨在提供网络服务,而且服务的寻找、集成和获得无需事先协议的确定,此次先推出E-speak测试版。
Xybernaut 发布耐用稳定的 Linux 系统。
Linuxcare 收购Puffin Group, Prosa,和Cheek Consulting并获得 3250万风险投资。
Caldera, Red Hat, SuSE, 以及TurboLinux 加入 Trillian项目。
Bruce Perens 成为Linux Capital Group总裁,这是一家为刚启动的Linux公司提供风险投资的公司。
Applix 一成立在一周内就收购了 CoSource.com。
巴西立法局立法规定政府机构必须使用开放源码软件。
Red Hat 公布拆股计划。
Eric Raymond 开始撰写《unix 编程艺术》
Sun 从与 European Computer Manufacturers Association (ECMA)合作设立Java标准的工作中退出,拒绝提交关键文档。
Sun 再一次提前宣布基于Linux 的Java 2 的推出, 同时透露正与 Inprise 合作推出JDK 1.2.2。这次举动令Blackdown组织颇为不安。
很快 Blackdown 也宣布推出JDK 1.2.2 RC3,而恰好一年前 Sun的JDK 1.2 面世。
Gimp 1.1 进入最后测试,1.2 稳定版估计在2000年初发行。
Mozilla M12 发布,几乎到达alpha阶段了
Linux-Mandrake 7.0 以测试版的形式发布,内含了一个可由用户配置的安全级别设置工具。
GNUPC.com 启动,他们没有在系统中预装Linux,相反,随系统附上了7种发行版。
Eric Raymond 的 《Unix Programming艺术》正在撰写中,这是一本关于在Unix环境下如何编程的书。
Richard Stallman 号召制裁Amazon.com。
实时Linux 工作室在维也纳启动。
DVD拷贝控制协会对 72 个被告提交指控。被告中有的参加了DVD加密格式反向工程,有的或多或少与DVD格式的破解有关。
1999 Debian GNU/Linux 大事记发布。

2005年07月21日

using System;
using System.IO;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace DevCenter
{
 #region PagingMode enum
 public enum PagingMode
 {
  Cached,
  NonCached
 }
 #endregion
 
 #region PagerStyle enum
 public enum PagerStyle
 {
  NextPrev,
  NumericPages
 }
 #endregion

 #region VirtualRecordCount class
 public class VirtualRecordCount
 {
  public int RecordCount;
  public int PageCount;
  public int RecordsInLastPage;
 }
 #endregion

 #region PageChangedEventArgs class
 public class PageChangedEventArgs : EventArgs
 {
  public int OldPageIndex;
  public int NewPageIndex;
 }
 #endregion

 #region SqlPager Control

 [DefaultProperty("SelectCommand")]
 [DefaultEvent("PageIndexChanged")]
 [ToolboxData("<{0}:SqlPager runat=\"server\" />")]
 public class SqlPager : WebControl, INamingContainer
 {
  #region  PRIVATE DATA MEMBERS
  // ***********************************************************************
  // PRIVATE members
  private PagedDataSource _dataSource;
  private Control _controlToPaginate;
  private string CacheKeyName
  {
   get {return Page.Request.FilePath + "_" + UniqueID + "_Data";}
  }
  private string CurrentPageText = "共&nbsp{2}&nbsp条记录&nbsp–&nbsp第&nbsp{0}&nbsp页&nbsp–&nbsp共&nbsp{1}&nbsp页";
  private string NoPageSelectedText = "";
  private string QueryPageCommandText = "SELECT * FROM " +
   "(SELECT TOP {0} * FROM " +
   "(SELECT TOP {1} * FROM ({2}) AS t0 ORDER BY {3} {4}) AS t1 " +
   "ORDER BY {3} {5}) AS t2 " +
   "ORDER BY {3}";
  private string QueryCountCommandText = "SELECT COUNT(*) FROM ({0}) AS t0";
  // ***********************************************************************
  #endregion

  #region CTOR(s)
  // ***********************************************************************
  // Ctor
  public SqlPager() : base()
  {
   _dataSource = null;
   _controlToPaginate = null;

   PagingMode = PagingMode.Cached;
   PagerStyle = PagerStyle.NextPrev;
   CurrentPageIndex = 0;
   SelectCommand = "";
   ConnectionString = "";
   ItemsPerPage = 10;
   TotalPages = -1;
   TotalRecord = -1;
   CacheDuration = 60;
  }
  // ***********************************************************************
  #endregion

  #region PUBLIC PROGRAMMING INTERFACE
  // ***********************************************************************
  // METHOD ClearCache
  // Removes any data cached for paging
  public void ClearCache()
  {
   if (PagingMode == PagingMode.Cached)
    Page.Cache.Remove(CacheKeyName);
  }
  // ***********************************************************************

  // ***********************************************************************
  // EVENT PageIndexChanged
  // Fires when the pager is about to switch to a new page
  public delegate void PageChangedEventHandler(object sender, PageChangedEventArgs e);
  public event PageChangedEventHandler PageIndexChanged;
  protected virtual void OnPageIndexChanged(PageChangedEventArgs e)
  {
   if (PageIndexChanged != null)
    PageIndexChanged(this, e);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY CacheDuration
  [Description("Gets and sets for how many seconds the data should stay in the cache")]
  public int CacheDuration
  {
   get {return Convert.ToInt32(ViewState["CacheDuration"]);}
   set {ViewState["CacheDuration"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PagingMode
  [Description("Indicates whether the data are retrieved page by page or can be cached")]
  public PagingMode PagingMode
  {
   get {return (PagingMode) ViewState["PagingMode"];}
   set {ViewState["PagingMode"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PagerStyle
  [Description("Indicates the style of the pager's navigation bar")]
  public PagerStyle PagerStyle
  {
   get {return (PagerStyle) ViewState["PagerStyle"];}
   set {ViewState["PagerStyle"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY ControlToPaginate
  [Description("Gets and sets the name of the control to paginate")]
  public string ControlToPaginate
  {
   get {return Convert.ToString(ViewState["ControlToPaginate"]);}
   set {ViewState["ControlToPaginate"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY ItemsPerPage
  [Description("Gets and sets the number of items to display per page")]
  public int ItemsPerPage
  {
   get {return Convert.ToInt32(ViewState["ItemsPerPage"]);}
   set {ViewState["ItemsPerPage"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY CurrentPageIndex
  [Description("Gets and sets the index of the currently displayed page")]
  public int CurrentPageIndex
  {
   get {return Convert.ToInt32(ViewState["CurrentPageIndex"]);}
   set {ViewState["CurrentPageIndex"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY ConnectionString
  [Description("Gets and sets the connection string to access the database")]
  public string ConnectionString
  {
   get {return Convert.ToString(ViewState["ConnectionString"]);}
   set {ViewState["ConnectionString"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY SelectCommand
  [Description("Gets and sets the SQL query to get data")]
  public string SelectCommand
  {
   get {return Convert.ToString(ViewState["SelectCommand"]);}
   set {ViewState["SelectCommand"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY SortField
  [Description("Gets and sets the sort-by field. It is mandatory in NonCached mode.)")]
  public string SortField
  {
   get {return Convert.ToString(ViewState["SortKeyField"]);}
   set {ViewState["SortKeyField"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PageCount
  // Gets the number of displayable pages
  [Browsable(false)]
  public int PageCount
  {
   get {return TotalPages;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY TotalPages
  // Gets and sets the number of pages to display
  protected int TotalPages
  {
   get {return Convert.ToInt32(ViewState["TotalPages"]);}
   set {ViewState["TotalPages"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY TotalPages
  // Gets and sets the number of pages to display
  protected int TotalRecord
  {
   get {return Convert.ToInt32(ViewState["TotalRecord"]);}
   set {ViewState["TotalRecord"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE DataBind
  // Fetches and stores the data
  public override void DataBind()
  {
   // Fires the data binding event
   base.DataBind();

   // Controls must be recreated after data binding
   ChildControlsCreated = false;

   // Ensures the control exists and is a list control
   if (ControlToPaginate == "")
    return;
   _controlToPaginate = Page.FindControl(ControlToPaginate);
   if (_controlToPaginate == null)
    return;
   if (!(_controlToPaginate is BaseDataList || _controlToPaginate is ListControl))
    return;

   // Ensures enough info to connect and query is specified
   if (ConnectionString == "" || SelectCommand == "")
    return;

   // Fetch data
   if (PagingMode == PagingMode.Cached)
    FetchAllData();
   else
   {
    //if (SortField == "")
    // return;
    FetchPageData();
   }

   // Bind data to the buddy control
   BaseDataList baseDataListControl = null;
   ListControl listControl = null;
   if (_controlToPaginate is BaseDataList)
   {
    baseDataListControl = (BaseDataList) _controlToPaginate;
    baseDataListControl.DataSource = _dataSource;
    baseDataListControl.DataBind();
    return;
   }
   if (_controlToPaginate is ListControl)
   {
    listControl = (ListControl) _controlToPaginate;
    listControl.Items.Clear();
    listControl.DataSource = _dataSource;
    listControl.DataBind();
    return;
   }
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE Render
  // Writes the content to be rendered on the client
  protected override void Render(HtmlTextWriter output)
  {
   // If in design-mode ensure that child controls have been created.
   // Child controls are not created at this time in design-mode because
   // there’s no pre-render stage. Do so for composite controls like this
   if (Site != null && Site.DesignMode)
    CreateChildControls();

   base.Render(output);
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE CreateChildControls
  // Outputs the HTML markup for the control
  protected override void CreateChildControls()
  {
   Controls.Clear();
   ClearChildViewState();

   BuildControlHierarchy();
  }
  // ***********************************************************************
  #endregion

  #region PRIVATE HELPER METHODS
  // ***********************************************************************
  // PRIVATE BuildControlHierarchy
  // Control the building of the control’s hierarchy
  private void BuildControlHierarchy()
  {
   // Build the surrounding table (one row, two cells)
   Table t = new Table();
   t.Width = new Unit("100%");
   // Build the table row
   TableRow row = new TableRow();
   t.Rows.Add(row);

   // Build the cell with the page index
   TableCell cellPageDesc = new TableCell();
   cellPageDesc.HorizontalAlign = HorizontalAlign.Left;
   BuildCurrentPage(cellPageDesc);
   row.Cells.Add(cellPageDesc);

   // Build the cell with navigation bar
   TableCell cellNavBar = new TableCell();
   if (PagerStyle == PagerStyle.NextPrev)
    BuildNextPrevUI(cellNavBar);
   else
    BuildNumericPagesUI(cellNavBar);
   cellNavBar.HorizontalAlign = HorizontalAlign.Right;
   row.Cells.Add(cellNavBar);

   // Add the table to the control tree
   Controls.Add(t);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE BuildNextPrevUI
  // Generates the HTML markup for the Next/Prev navigation bar
  private void BuildNextPrevUI(TableCell cell)
  {
   bool isValidPage = (CurrentPageIndex >=0 && CurrentPageIndex <= TotalPages-1);
   bool canMoveBack = (CurrentPageIndex>0);
   bool canMoveForward = (CurrentPageIndex<TotalPages-1);

   // Render the << button
   LinkButton first = new LinkButton();
   first.ID = "First";
   first.CausesValidation = false;
   first.Click += new EventHandler(first_Click);
   first.Text = " 首页 "; 
   first.Enabled = isValidPage && canMoveBack;
   cell.Controls.Add(first);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   // Render the < button
   LinkButton prev = new LinkButton();
   prev.ID = "Prev";
   prev.CausesValidation = false;
   prev.Click += new EventHandler(prev_Click);
   prev.Text = " 上一页 "; 
   prev.Enabled = isValidPage && canMoveBack;
   cell.Controls.Add(prev);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   // Render the > button
   LinkButton next = new LinkButton();
   next.ID = "Next";
   next.CausesValidation = false;
   next.Click += new EventHandler(next_Click);
   next.Text = " 下一页 "; 
   next.Enabled = isValidPage && canMoveForward;
   cell.Controls.Add(next);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   // Render the >> button
   LinkButton last = new LinkButton();
   last.ID = "Last";
   last.CausesValidation = false;
   last.Click += new EventHandler(last_Click);
   last.Text = " 尾页 ";
   last.Enabled = isValidPage && canMoveForward;
   cell.Controls.Add(last);

   // Render a drop-down list 
   DropDownList pageList = new DropDownList();
   pageList.ID = "PageList";
   pageList.AutoPostBack = true;
   pageList.SelectedIndexChanged += new EventHandler(PageList_Click);
   pageList.Font.Name = Font.Name;
   pageList.Font.Size = Font.Size;
   pageList.ForeColor = ForeColor;

   // Embellish the list when there are no pages to list
   if (TotalPages <=0 || CurrentPageIndex == -1)
   {
    pageList.Items.Add("");
    pageList.Enabled = false;
    pageList.SelectedIndex = 0;
   }
   else // Populate the list
   {
    for(int i=1; i<=TotalPages; i++)
    {
     ListItem item = new ListItem(i.ToString(), (i-1).ToString());
     pageList.Items.Add(item);
    }
    pageList.SelectedIndex = CurrentPageIndex;
   }
   cell.Controls.Add(pageList);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE BuildNumericPagesUI
  // Generates the HTML markup for the Numeric Pages button bar
  private void BuildNumericPagesUI(TableCell cell)
  {
   // Render a drop-down list 
   DropDownList pageList = new DropDownList();
   pageList.ID = "PageList";
   pageList.AutoPostBack = true;
   pageList.SelectedIndexChanged += new EventHandler(PageList_Click);
   pageList.Font.Name = Font.Name;
   pageList.Font.Size = Font.Size;
   pageList.ForeColor = ForeColor;

   // Embellish the list when there are no pages to list
   if (TotalPages <=0 || CurrentPageIndex == -1)
   {
    pageList.Items.Add("No pages");
    pageList.Enabled = false;
    pageList.SelectedIndex = 0;
   }
   else // Populate the list
   {
    for(int i=1; i<=TotalPages; i++)
    {
     ListItem item = new ListItem(i.ToString(), (i-1).ToString());
     pageList.Items.Add(item);
    }
    pageList.SelectedIndex = CurrentPageIndex;
   }
   cell.Controls.Add(pageList);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE BuildCurrentPage
  // Generates the HTML markup to describe the current page (0-based)
  private void BuildCurrentPage(TableCell cell)
  {
   // Use a standard template: Page X of Y
   if (CurrentPageIndex <0 || CurrentPageIndex >= TotalPages)
    cell.Text = NoPageSelectedText;
   else
    cell.Text = String.Format(CurrentPageText, (CurrentPageIndex+1), TotalPages, TotalRecord);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE ValidatePageIndex
  // Ensures the CurrentPageIndex is either valid [0,TotalPages) or -1
  private void ValidatePageIndex()
  {
   if (!(CurrentPageIndex >=0 && CurrentPageIndex < TotalPages))
    CurrentPageIndex = -1;
   return;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE FetchAllData
  // Runs the query for all data to be paged and caches the resulting data
  private void FetchAllData()
  {
   // Looks for data in the ASP.NET Cache
   DataTable data;
   data = (DataTable) Page.Cache[CacheKeyName];
    
   if (data == null)
   {
    // Fix SelectCommand with order-by info
    AdjustSelectCommand(true);

    // If data expired or has never been fetched, go to the database
    SqlDataAdapter adapter = new SqlDataAdapter(SelectCommand, ConnectionString);
    data = new DataTable();
    adapter.Fill(data);
    Page.Cache.Insert(CacheKeyName, data, null,
     DateTime.Now.AddSeconds(CacheDuration),
     System.Web.Caching.Cache.NoSlidingExpiration);
   }
  
   // Configures the paged data source component
   if (_dataSource == null)
    _dataSource = new PagedDataSource();
   _dataSource.DataSource = data.DefaultView; // must be IEnumerable!
   _dataSource.AllowPaging = true;
   _dataSource.PageSize = ItemsPerPage;
   TotalPages = _dataSource.PageCount;
   TotalRecord = data.Rows.Count;
   // Ensures the page index is valid
   ValidatePageIndex();
   if (CurrentPageIndex == -1)
   {
    _dataSource = null;
    return;
   }

   // Selects the page to view
   _dataSource.CurrentPageIndex = CurrentPageIndex;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE FetchPageData
  // Runs the query to get only the data that fit into the current page
  private void FetchPageData()
  {
   // Need a validated page index to fetch data.
   // Also need the virtual page count to validate the page index
   AdjustSelectCommand(false);
   VirtualRecordCount countInfo = CalculateVirtualRecordCount();
   TotalRecord = countInfo.RecordCount;
   TotalPages = countInfo.PageCount;
   // Validate the page number (ensures CurrentPageIndex is valid or -1)
   ValidatePageIndex();
   if (CurrentPageIndex == -1)
    return;

   // Prepare and run the command
   SqlCommand cmd = PrepareCommand(countInfo);
   if (cmd == null)
    return;
   SqlDataAdapter adapter = new SqlDataAdapter(cmd);
   DataTable data = new DataTable();
   adapter.Fill(data);

   // Configures the paged data source component
   if (_dataSource == null)
    _dataSource = new PagedDataSource();
   _dataSource.AllowCustomPaging = true;
   _dataSource.AllowPaging = true;
   _dataSource.CurrentPageIndex = 0;
   //_dataSource.PageSize = ItemsPerPage;
   _dataSource.PageSize = data.Rows.Count;
   _dataSource.VirtualCount = countInfo.RecordCount;
   _dataSource.DataSource = data.DefaultView; 
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE AdjustSelectCommand
  // Strips ORDER-BY clauses from SelectCommand and adds a new one based
  // on SortKeyField
  private void AdjustSelectCommand(bool addCustomSortInfo)
  {
   // Truncate where ORDER BY is found
   string temp = SelectCommand.ToLower();
   int pos = temp.IndexOf("order by");
   if (pos > -1)
    SelectCommand = SelectCommand.Substring(0, pos);

   // Add new ORDER BY info if SortKeyField is specified
   if (SortField != "" && addCustomSortInfo)
    SelectCommand += " ORDER BY " + SortField;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE CalculateVirtualRecordCount
  // Calculates record and page count for the specified query
  private VirtualRecordCount CalculateVirtualRecordCount()
  {
   VirtualRecordCount count = new VirtualRecordCount();

   // Calculate the virtual number of records from the query
   count.RecordCount = GetQueryVirtualCount();
   count.RecordsInLastPage = ItemsPerPage;

   // Calculate the correspondent number of pages
   int lastPage = count.RecordCount/ItemsPerPage;
   int remainder = count.RecordCount % ItemsPerPage;
   if (remainder >0)
    lastPage++;
   count.PageCount = lastPage;
   
   // Calculate the number of items in the last page
   if (remainder >0)
    count.RecordsInLastPage = remainder;
   return count;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE PrepareCommand
  // Prepares and returns the command object for the reader-based query
  private SqlCommand PrepareCommand(VirtualRecordCount countInfo)
  {
   // No sort field specified: figure it out
   if (SortField == "")
   {
    // Get metadata for all columns and choose either the primary key
    // or the
    string text = "SET FMTONLY ON;" + SelectCommand + ";SET FMTONLY OFF;";
    SqlDataAdapter adapter = new SqlDataAdapter(text, ConnectionString);
    DataTable t = new DataTable();
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    adapter.Fill(t);
    DataColumn col = null;
    if (t.PrimaryKey.Length >0)
     col = t.PrimaryKey[0];
    else
     col = t.Columns[0];
    SortField = col.ColumnName;
   }

   // Determines how many records are to be retrieved.
   // The last page could require less than other pages
   int recsToRetrieve = ItemsPerPage;
   if (CurrentPageIndex == countInfo.PageCount-1)
    recsToRetrieve = countInfo.RecordsInLastPage;

   string cmdText = String.Format(QueryPageCommandText,
    recsToRetrieve,      // {0} –> page size
    ItemsPerPage*(CurrentPageIndex+1), // {1} –> size * index
    SelectCommand,      // {2} –> base query
    SortField,       // {3} –> key field in the query
    "ASC",        // Default to ascending order
    "DESC");

   SqlConnection conn = new SqlConnection(ConnectionString);
   SqlCommand cmd = new SqlCommand(cmdText, conn);
   return cmd;
  }

  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE GetQueryVirtualCount
  // Run a query to get the record count
  private int GetQueryVirtualCount()
  {
   string cmdText = String.Format(QueryCountCommandText, SelectCommand);
   SqlConnection conn = new SqlConnection(ConnectionString);
   SqlCommand cmd = new SqlCommand(cmdText, conn);

   cmd.Connection.Open();
   int recCount = (int) cmd.ExecuteScalar();
   cmd.Connection.Close();

   return recCount;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE GoToPage
  // Sets the current page index
  private void GoToPage(int pageIndex)
  {
   // Prepares event data
   PageChangedEventArgs e = new PageChangedEventArgs();
   e.OldPageIndex = CurrentPageIndex;
   e.NewPageIndex = pageIndex;

   // Updates the current index
   CurrentPageIndex = pageIndex;

   // Fires the page changed event
   OnPageIndexChanged(e);

   // Binds new data
   DataBind();
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE first_Click
  // Event handler for the << button
  private void first_Click(object sender, EventArgs e)
  {
   GoToPage(0);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE prev_Click
  // Event handler for the < button
  private void prev_Click(object sender, EventArgs e)
  {
   GoToPage(CurrentPageIndex-1);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE next_Click
  // Event handler for the > button
  private void next_Click(object sender, EventArgs e)
  {
   GoToPage(CurrentPageIndex+1);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE last_Click
  // Event handler for the >> button
  private void last_Click(object sender, EventArgs e)
  {
   GoToPage(TotalPages-1);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE PageList_Click
  // Event handler for any page selected from the drop-down page list
  private void PageList_Click(object sender, EventArgs e)
  {
   DropDownList pageList = (DropDownList) sender;
   int pageIndex = Convert.ToInt32(pageList.SelectedItem.Value);
   GoToPage(pageIndex);
  }
  // ***********************************************************************
  #endregion
 }
 #endregion

 #region OraclePager Control

 [DefaultProperty("SelectCommand")]
 [DefaultEvent("PageIndexChanged")]
 [ToolboxData("<{0}:OraclePager runat=\"server\" />")]
 public class OraclePager : WebControl, INamingContainer
 {
  #region  PRIVATE DATA MEMBERS
  // ***********************************************************************
  // PRIVATE members
  private PagedDataSource _dataSource;
  private Control _controlToPaginate;
  private string CacheKeyName
  {
   get {return Page.Request.FilePath + "_" + UniqueID + "_Data";}
  }
  private string CurrentPageText = "共&nbsp{2}&nbsp条记录&nbsp–&nbsp第&nbsp{0}&nbsp页&nbsp–&nbsp共&nbsp{1}&nbsp页";
  private string NoPageSelectedText = "";
  private string QueryPageCommandText = "SELECT * FROM " +
   "(SELECT t0.*,ROWNUM AS count_id FROM " +
   "({2}) t0) t1 " +
   "WHERE count_id BETWEEN {1}-{6}+1 " +
   "AND {1}";
  private string QueryCountCommandText = "SELECT COUNT(*) FROM ({0}) t0";
  // ***********************************************************************
  #endregion

  #region CTOR(s)
  // ***********************************************************************
  // Ctor
  public OraclePager() : base()
  {
   _dataSource = null;
   _controlToPaginate = null;

   PagingMode = PagingMode.Cached;
   PagerStyle = PagerStyle.NextPrev;
   CurrentPageIndex = 0;
   SelectCommand = "";
   ConnectionString = "";
   ItemsPerPage = 10;
   TotalPages = -1;
   TotalRecord = -1;
   CacheDuration = 60;
  }
  // ***********************************************************************
  #endregion

  #region PUBLIC PROGRAMMING INTERFACE
  // ***********************************************************************
  // METHOD ClearCache
  // Removes any data cached for paging
  public void ClearCache()
  {
   if (PagingMode == PagingMode.Cached)
    Page.Cache.Remove(CacheKeyName);
  }
  // ***********************************************************************

  // ***********************************************************************
  // EVENT PageIndexChanged
  // Fires when the pager is about to switch to a new page
  public delegate void PageChangedEventHandler(object sender, PageChangedEventArgs e);
  public event PageChangedEventHandler PageIndexChanged;
  protected virtual void OnPageIndexChanged(PageChangedEventArgs e)
  {
   if (PageIndexChanged != null)
    PageIndexChanged(this, e);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY CacheDuration
  [Description("Gets and sets for how many seconds the data should stay in the cache")]
  public int CacheDuration
  {
   get {return Convert.ToInt32(ViewState["CacheDuration"]);}
   set {ViewState["CacheDuration"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PagingMode
  [Description("Indicates whether the data are retrieved page by page or can be cached")]
  public PagingMode PagingMode
  {
   get {return (PagingMode) ViewState["PagingMode"];}
   set {ViewState["PagingMode"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PagerStyle
  [Description("Indicates the style of the pager's navigation bar")]
  public PagerStyle PagerStyle
  {
   get {return (PagerStyle) ViewState["PagerStyle"];}
   set {ViewState["PagerStyle"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY ControlToPaginate
  [Description("Gets and sets the name of the control to paginate")]
  public string ControlToPaginate
  {
   get {return Convert.ToString(ViewState["ControlToPaginate"]);}
   set {ViewState["ControlToPaginate"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY ItemsPerPage
  [Description("Gets and sets the number of items to display per page")]
  public int ItemsPerPage
  {
   get {return Convert.ToInt32(ViewState["ItemsPerPage"]);}
   set {ViewState["ItemsPerPage"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY CurrentPageIndex
  [Description("Gets and sets the index of the currently displayed page")]
  public int CurrentPageIndex
  {
   get {return Convert.ToInt32(ViewState["CurrentPageIndex"]);}
   set {ViewState["CurrentPageIndex"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY ConnectionString
  [Description("Gets and sets the connection string to access the database")]
  public string ConnectionString
  {
   get {return Convert.ToString(ViewState["ConnectionString"]);}
   set {ViewState["ConnectionString"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY SelectCommand
  [Description("Gets and sets the SQL query to get data")]
  public string SelectCommand
  {
   get {return Convert.ToString(ViewState["SelectCommand"]);}
   set {ViewState["SelectCommand"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY SortField
  [Description("Gets and sets the sort-by field. It is mandatory in NonCached mode.)")]
  public string SortField
  {
   get {return Convert.ToString(ViewState["SortKeyField"]);}
   set {ViewState["SortKeyField"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PageCount
  // Gets the number of displayable pages
  [Browsable(false)]
  public int PageCount
  {
   get {return TotalPages;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY TotalPages
  // Gets and sets the number of pages to display
  protected int TotalPages
  {
   get {return Convert.ToInt32(ViewState["TotalPages"]);}
   set {ViewState["TotalPages"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY TotalPages
  // Gets and sets the number of pages to display
  protected int TotalRecord
  {
   get {return Convert.ToInt32(ViewState["TotalRecord"]);}
   set {ViewState["TotalRecord"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE DataBind
  // Fetches and stores the data
  public override void DataBind()
  {
   // Fires the data binding event
   base.DataBind();

   // Controls must be recreated after data binding
   ChildControlsCreated = false;

   // Ensures the control exists and is a list control
   if (ControlToPaginate == "")
    return;
   _controlToPaginate = Page.FindControl(ControlToPaginate);
   if (_controlToPaginate == null)
    return;
   if (!(_controlToPaginate is BaseDataList || _controlToPaginate is ListControl))
    return;

   // Ensures enough info to connect and query is specified
   if (ConnectionString == "" || SelectCommand == "")
    return;

   // Fetch data
   if (PagingMode == PagingMode.Cached)
    FetchAllData();
   else
   {
    //if (SortField == "")
    // return;
    FetchPageData();
   }

   // Bind data to the buddy control
   BaseDataList baseDataListControl = null;
   ListControl listControl = null;
   if (_controlToPaginate is BaseDataList)
   {
    baseDataListControl = (BaseDataList) _controlToPaginate;
    baseDataListControl.DataSource = _dataSource;
    baseDataListControl.DataBind();
    return;
   }
   if (_controlToPaginate is ListControl)
   {
    listControl = (ListControl) _controlToPaginate;
    listControl.Items.Clear();
    listControl.DataSource = _dataSource;
    listControl.DataBind();
    return;
   }
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE Render
  // Writes the content to be rendered on the client
  protected override void Render(HtmlTextWriter output)
  {
   // If in design-mode ensure that child controls have been created.
   // Child controls are not created at this time in design-mode because
   // there’s no pre-render stage. Do so for composite controls like this
   if (Site != null && Site.DesignMode)
    CreateChildControls();

   base.Render(output);
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE CreateChildControls
  // Outputs the HTML markup for the control
  protected override void CreateChildControls()
  {
   Controls.Clear();
   ClearChildViewState();

   BuildControlHierarchy();
  }
  // ***********************************************************************
  #endregion

  #region PRIVATE HELPER METHODS
  // ***********************************************************************
  // PRIVATE BuildControlHierarchy
  // Control the building of the control’s hierarchy
  private void BuildControlHierarchy()
  {
   // Build the surrounding table (one row, two cells)
   Table t = new Table();
   t.Width = new Unit("100%");
   // Build the table row
   TableRow row = new TableRow();
   t.Rows.Add(row);

   // Build the cell with the page index
   TableCell cellPageDesc = new TableCell();
   cellPageDesc.HorizontalAlign = HorizontalAlign.Left;
   BuildCurrentPage(cellPageDesc);
   row.Cells.Add(cellPageDesc);

   // Build the cell with navigation bar
   TableCell cellNavBar = new TableCell();
   if (PagerStyle == PagerStyle.NextPrev)
    BuildNextPrevUI(cellNavBar);
   else
    BuildNumericPagesUI(cellNavBar);
   cellNavBar.HorizontalAlign = HorizontalAlign.Right;
   row.Cells.Add(cellNavBar);

   // Add the table to the control tree
   Controls.Add(t);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE BuildNextPrevUI
  // Generates the HTML markup for the Next/Prev navigation bar
  private void BuildNextPrevUI(TableCell cell)
  {
   bool isValidPage = (CurrentPageIndex >=0 && CurrentPageIndex <= TotalPages-1);
   bool canMoveBack = (CurrentPageIndex>0);
   bool canMoveForward = (CurrentPageIndex<TotalPages-1);

   // Render the << button
   LinkButton first = new LinkButton();
   first.ID = "First";
   first.Click += new EventHandler(first_Click);
   first.Text = " 首页 "; 
   first.Enabled = isValidPage && canMoveBack;
   cell.Controls.Add(first);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   // Render the < button
   LinkButton prev = new LinkButton();
   prev.ID = "Prev";
   prev.Click += new EventHandler(prev_Click);
   prev.Text = " 上一页 "; 
   prev.Enabled = isValidPage && canMoveBack;
   cell.Controls.Add(prev);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   // Render the > button
   LinkButton next = new LinkButton();
   next.ID = "Next";
   next.Click += new EventHandler(next_Click);
   next.Text = " 下一页 "; 
   next.Enabled = isValidPage && canMoveForward;
   cell.Controls.Add(next);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   // Render the >> button
   LinkButton last = new LinkButton();
   last.ID = "Last";
   last.Click += new EventHandler(last_Click);
   last.Text = " 尾页 ";
   last.Enabled = isValidPage && canMoveForward;
   cell.Controls.Add(last);

   // Render a drop-down list 
   DropDownList pageList = new DropDownList();
   pageList.ID = "PageList";
   pageList.AutoPostBack = true;
   pageList.SelectedIndexChanged += new EventHandler(PageList_Click);
   pageList.Font.Name = Font.Name;
   pageList.Font.Size = Font.Size;
   pageList.ForeColor = ForeColor;

   // Embellish the list when there are no pages to list
   if (TotalPages <=0 || CurrentPageIndex == -1)
   {
    pageList.Items.Add("");
    pageList.Enabled = false;
    pageList.SelectedIndex = 0;
   }
   else // Populate the list
   {
    for(int i=1; i<=TotalPages; i++)
    {
     ListItem item = new ListItem(i.ToString(), (i-1).ToString());
     pageList.Items.Add(item);
    }
    pageList.SelectedIndex = CurrentPageIndex;
   }
   cell.Controls.Add(pageList);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE BuildNumericPagesUI
  // Generates the HTML markup for the Numeric Pages button bar
  private void BuildNumericPagesUI(TableCell cell)
  {
   // Render a drop-down list 
   DropDownList pageList = new DropDownList();
   pageList.ID = "PageList";
   pageList.AutoPostBack = true;
   pageList.SelectedIndexChanged += new EventHandler(PageList_Click);
   pageList.Font.Name = Font.Name;
   pageList.Font.Size = Font.Size;
   pageList.ForeColor = ForeColor;

   // Embellish the list when there are no pages to list
   if (TotalPages <=0 || CurrentPageIndex == -1)
   {
    pageList.Items.Add("No pages");
    pageList.Enabled = false;
    pageList.SelectedIndex = 0;
   }
   else // Populate the list
   {
    for(int i=1; i<=TotalPages; i++)
    {
     ListItem item = new ListItem(i.ToString(), (i-1).ToString());
     pageList.Items.Add(item);
    }
    pageList.SelectedIndex = CurrentPageIndex;
   }
   cell.Controls.Add(pageList);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE BuildCurrentPage
  // Generates the HTML markup to describe the current page (0-based)
  private void BuildCurrentPage(TableCell cell)
  {
   // Use a standard template: Page X of Y
   if (CurrentPageIndex <0 || CurrentPageIndex >= TotalPages)
    cell.Text = NoPageSelectedText;
   else
    cell.Text = String.Format(CurrentPageText, (CurrentPageIndex+1), TotalPages, TotalRecord);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE ValidatePageIndex
  // Ensures the CurrentPageIndex is either valid [0,TotalPages) or -1
  private void ValidatePageIndex()
  {
   if (!(CurrentPageIndex >=0 && CurrentPageIndex < TotalPages))
    CurrentPageIndex = -1;
   return;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE FetchAllData
  // Runs the query for all data to be paged and caches the resulting data
  private void FetchAllData()
  {
   // Looks for data in the ASP.NET Cache
   DataTable data;
   
   data = (DataTable) Page.Cache[CacheKeyName];

   if (data == null)
   {
    // Fix SelectCommand with order-by info
    AdjustSelectCommand(true);

    // If data expired or has never been fetched, go to the database
    OracleDataAdapter adapter = new OracleDataAdapter(SelectCommand, ConnectionString);
    data = new DataTable();
    adapter.Fill(data);
    Page.Cache.Insert(CacheKeyName, data, null,
     DateTime.Now.AddSeconds(CacheDuration),
     System.Web.Caching.Cache.NoSlidingExpiration);
   }
  
   // Configures the paged data source component
   if (_dataSource == null)
    _dataSource = new PagedDataSource();
   _dataSource.DataSource = data.DefaultView; // must be IEnumerable!
   _dataSource.AllowPaging = true;
   _dataSource.PageSize = ItemsPerPage;
   TotalPages = _dataSource.PageCount;
   TotalRecord = data.Rows.Count;
   // Ensures the page index is valid
   ValidatePageIndex();
   if (CurrentPageIndex == -1)
   {
    _dataSource = null;
    return;
   }

   // Selects the page to view
   _dataSource.CurrentPageIndex = CurrentPageIndex;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE FetchPageData
  // Runs the query to get only the data that fit into the current page
  private void FetchPageData()
  {
   // Need a validated page index to fetch data.
   // Also need the virtual page count to validate the page index
   AdjustSelectCommand(false);
   VirtualRecordCount countInfo = CalculateVirtualRecordCount();
   TotalRecord = countInfo.RecordCount;
   TotalPages = countInfo.PageCount;
   // Validate the page number (ensures CurrentPageIndex is valid or -1)
   ValidatePageIndex();
   if (CurrentPageIndex == -1)
    return;

   // Prepare and run the command
   OracleCommand cmd = PrepareCommand(countInfo);
   if (cmd == null)
    return;
   OracleDataAdapter adapter = new OracleDataAdapter(cmd);
   DataTable data = new DataTable();
   adapter.Fill(data);

   // Configures the paged data source component
   if (_dataSource == null)
    _dataSource = new PagedDataSource();
   _dataSource.AllowCustomPaging = true;
   _dataSource.AllowPaging = true;
   _dataSource.CurrentPageIndex = 0;
   //_dataSource.PageSize = ItemsPerPage;
   _dataSource.PageSize = data.Rows.Count;
   _dataSource.VirtualCount = countInfo.RecordCount;
   _dataSource.DataSource = data.DefaultView; 
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE AdjustSelectCommand
  // Strips ORDER-BY clauses from SelectCommand and adds a new one based
  // on SortKeyField
  private void AdjustSelectCommand(bool addCustomSortInfo)
  {
   // Truncate where ORDER BY is found
   string temp = SelectCommand.ToLower();
   int pos = temp.IndexOf("order by");
   if (pos > -1)
        SelectCommand = SelectCommand.Substring(0, pos);

    // Add new ORDER BY info if SortKeyField is specified
    if (SortField != "" && addCustomSortInfo)
     SelectCommand += " ORDER BY " + SortField;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE CalculateVirtualRecordCount
  // Calculates record and page count for the specified query
  private VirtualRecordCount CalculateVirtualRecordCount()
  {
   VirtualRecordCount count = new VirtualRecordCount();

   // Calculate the virtual number of records from the query
   count.RecordCount = GetQueryVirtualCount();
   count.RecordsInLastPage = ItemsPerPage;

   // Calculate the correspondent number of pages
   int lastPage = count.RecordCount/ItemsPerPage;
   int remainder = count.RecordCount % ItemsPerPage;
   if (remainder >0)
    lastPage++;
   count.PageCount = lastPage;
   
   // Calculate the number of items in the last page
   if (remainder >0)
    count.RecordsInLastPage = remainder;
   return count;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE PrepareCommand
  // Prepares and returns the command object for the reader-based query
  private OracleCommand PrepareCommand(VirtualRecordCount countInfo)
  {
   // No sort field specified: figure it out
      if (SortField == "")
      {
//       // Get metadata for all columns and choose either the primary key
//       // or the
//       //string text = "SET FMTONLY ON;" + SelectCommand + ";SET FMTONLY OFF;";
//       string text = "SELECT * FROM (" + SelectCommand + ") WHERE 1=2";
//       OracleDataAdapter adapter = new OracleDataAdapter(text, ConnectionString);
//       DataTable t = new DataTable();
//       adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
//       adapter.Fill(t);
//       DataColumn col = null;
//       if (t.PrimaryKey.Length >0)
//        col = t.PrimaryKey[0];
//       else
//        col = t.Columns[0];
//       SortField = col.ColumnName;
      }

   // Determines how many records are to be retrieved.
   // The last page could require less than other pages
   int recsToRetrieve = ItemsPerPage;
   if (CurrentPageIndex == countInfo.PageCount-1)
    recsToRetrieve = countInfo.RecordsInLastPage;
   
   //为Oracle准备排序内容
   if(SortField != "")
   {
    SelectCommand += "order by " + SortField;
   }
   string cmdText = String.Format(QueryPageCommandText,
    recsToRetrieve,      // {0} –> page size
    ItemsPerPage*(CurrentPageIndex+1), // {1} –> size * index
    SelectCommand,      // {2} –> base query
    SortField,       // {3} –> key field in the query
    "ASC",        // Default to ascending order
    "DESC",
    ItemsPerPage);

   OracleConnection conn = new OracleConnection(ConnectionString);
   OracleCommand cmd = new OracleCommand(cmdText, conn);
   return cmd;
  }

  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE GetQueryVirtualCount
  // Run a query to get the record count
  private int GetQueryVirtualCount()
  {
   string cmdText = String.Format(QueryCountCommandText, SelectCommand);
   OracleConnection conn = new OracleConnection(ConnectionString);
   OracleCommand cmd = new OracleCommand(cmdText, conn);

   cmd.Connection.Open();
   string rec = cmd.ExecuteScalar().ToString();
   int recCount = Convert.ToInt32(rec);
   //   int recCount = Convert.ToInt32(cmd.ExecuteScalar());
   cmd.Connection.Close();

   return recCount;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE GoToPage
  // Sets the current page index
  private void GoToPage(int pageIndex)
  {
   // Prepares event data
   PageChangedEventArgs e = new PageChangedEventArgs();
   e.OldPageIndex = CurrentPageIndex;
   e.NewPageIndex = pageIndex;

   // Updates the current index
   CurrentPageIndex = pageIndex;

   // Fires the page changed event
   OnPageIndexChanged(e);

   // Binds new data
   DataBind();
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE first_Click
  // Event handler for the << button
  private void first_Click(object sender, EventArgs e)
  {
   GoToPage(0);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE prev_Click
  // Event handler for the < button
  private void prev_Click(object sender, EventArgs e)
  {
   GoToPage(CurrentPageIndex-1);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE next_Click
  // Event handler for the > button
  private void next_Click(object sender, EventArgs e)
  {
   GoToPage(CurrentPageIndex+1);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE last_Click
  // Event handler for the >> button
  private void last_Click(object sender, EventArgs e)
  {
   GoToPage(TotalPages-1);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE PageList_Click
  // Event handler for any page selected from the drop-down page list
  private void PageList_Click(object sender, EventArgs e)
  {
   DropDownList pageList = (DropDownList) sender;
   int pageIndex = Convert.ToInt32(pageList.SelectedItem.Value);
   GoToPage(pageIndex);
  }
  // ***********************************************************************
  #endregion
 }
 #endregion
}

2005年06月06日

FLEXlm latest information by CrackZ
Introduction
This document discusses the reversing of 3 FLEXlm protected programs. This essay is a classic example of where 1 vendors choosing not to buy into Macrovisions ‘enhanced security’ aided in the discovery of a very simple (and virtually generic) technique to bypass vendors that had. Throughout this essay I use * Tip * sections to help you through.

Bitplane Imaris v4.0.3 (FLEXlm v9.0.0), v3.2 could be examined for background information.
GerbTool v13.0 (FLEXlm v8.2a).
SDS 2 v6.318 (FLEXlm v8.1a).

* Tip * – Use lmtools.exe, Utilities tab (sometimes shipped with your target application or inside the FLEXlm SDK to identify the version number of the FLEXlm library used). Files with FLEXlm can also be searched with something like UltraEdit for the strings ‘lmgr.lib’ or ‘liblmgr.a’.

I started out on this project with several pieces of background information.

Bitplane Imaris – I knew the vendor keys, seeds and feature names all from v3.1/2 (which used FLEXlm v7.0e) and none of the newer FLEXlm features, I recommend downloading the files from the Bitplane WWW archive here.

GerbTool v13.0 – In my possession was a patch which apparently deprotected the program, initial analysis of the changes confirmed to me that the FLEXlm routines had not been patched, instead higher level checks had been forced.

SDS 2 v6.318 – In my possession was a ‘warez released’ crack and a (presumed invalid) FLEXlm license. I knew from an end-user that SDS had switched to using a new style FLEXlm SIGN= license several versions before.

I started out with Bitplane Imaris, being that I knew the vendor keys, seeds and license file format, hoping this would make it easier to identify everything that was going on. I constructed a dummy license like below (based on the format I knew in the previous version, also assuming the vendor name ‘bitplane’ had not changed, since a daemon of the same name ships still with the program this seems like a good assumption) :

# License for Imaris Bitplane v4.0.3

FEATURE feature_name vendor_name 1.000 permanent uncounted 123456654321 \
HOSTID=ANY

# End license

In the past with Imaris, a fake license had always given a friendly message box complete with the feature name the program desired and the FLEXlm error code, no longer is this the case, instead we are just booted to demo mode. We need to find _lc_checkout().

Finding _lc_checkout()
Finding _lc_checkout() (when you know how) is actually very simple, however I hacked about inside my targets inside SoftICE instead of realising the one place it had to be and would be identified by IDA, lmgr.lib, there we go good developer link in our lmgr.lib and you too can tell everyone where your checkout routine is as well. IDA does a really fantastic job of decompiling lmgr.lib (be sure to select lm_ckout.obj for the object since there are more than 60 packed inside, you can examine the others later if you are so inclined). Inside you find the string reference ‘lm_ckout.c’, this cross references pretty much exactly (right down to the offsets of each part of the routine) with the checkout code found in all 3 of my targets. From here its a short step to identifying the real call doing the work _l_checkout().

* Tip * Note you can generate signatures from lmgr.lib using IDA’s FLAIR tools, however the signatures are not without faults and often miss key functions, _l_sg() will almost certainly be missed due to its similarity to the redundant _l_svk() which GlobeTrotter leave in for obfuscation. I recommend using my ‘lmgr.lib in IDA’ approach.

From here we get the unsurprising version number (4.0) and the feature name ImarisBase as well as a job structure. Looking beneath _l_checkout() (inside the disassembly of lmgr.lib) we can quickly trace down an old friend, _l_sg(). Currently _l_checkout() refuses our fake license with the error -8 (the infamous LM_BADCODE). Using Hiew or any other good hex editor we do a search for F8 FF FF FF (-8 in reverse byte order) to see likely places this is set.

As it turns out we end up with 3 locations; in Imaris these are 5F7282, 5F77D7 & 5F8AE5, the first 2 are referenced inside _l_good_lic_key(), the latter inside _l_ckout_ok(), we could patch these but for now lets have a trace through _l_checkout(), the initial order of events is as follows :

_l_zcp().
_l_getattr().
_l_ckout_borrow().
_lm_start_real() – returns -8 (we’ll trace below here).

So it seems _lm_start_real() is where the real action is at, note also this code snippet :

mov _lm_start$S23038, offset _lm_start_real ; lm_start = lm_start_real

FLEXlm aficionados will remember this convention from the old days of _l_sg(). Next up :

_l_valid_version() – check for valid version.
_l_clear_error() – clears the error from _l_ckout_borrow().
_l_zcp().
_l_next_conf_or_marker().
_l_local_verify_conf().
_l_good_lic_key() – sets the -8 error.

Once again, we get some trivial setup code, configuration verification and then _l_good_lic_key() sets our error.

_l_xor_name(bitplane) – l_xorname(job->vendor, &vc);
_l_sg() – l_sg(job, job->vendor, &vc); (did you know that l_sg means "signature vendor_key5" Wink ).

So our old friend _l_sg() is here, in order to verify whether anything had really changed I decided to apply Nolan Blenders technique of seed recovery.

:005F6F7D lea ecx, [ebp+var_280]
:005F6F83 push ecx <– Vendor code structure
:005F6F84 mov edx, [ebp+arg_0]
:005F6F87 add edx, 30Ch
:005F6F8D push edx <– Vendor name
:005F6F8E mov eax, [ebp+arg_0]
:005F6F91 push eax <– Job structure
:005F6F92 call _l_sg

Before tracing over _l_sg(), be sure to note a copy of the vendor code structure, in my case it was like so, note also that the job structure is probably not filled in :

04 00 00 00 19 59 D5 7A ED A3 2D 80 ED 11 A0 18
97 E1 4B 27 A8 21 6A E2 41 04 58 52 09 00 00 00

After tracing over _l_sg(), we observe the following changes :

Vendor code structure

04 00 00 00 52 EE F9 99 A6 14 01 63 ED 11 A0 18
97 E1 4B 27 A8 21 6A E2 41 04 58 52 09 00 00 00

Job structure

66 00 00 00 EA 00 AA 00 C6 E0 F4 21 93 65 B8 00
00 00 6F 00 00 00 00 00 00 00 00 00 02 00 00 00

Plugging these values into calcseed.exe we successfully derive 0×0A192837 (seed 1) & 0xF0E1D2C3 (seed 2), these match the seeds from the previous version. Generating vendor keys using an updated version of lmkg.exe (courtesy of good friend Nolan Blender or using lmv8gen.exe (found somewhere on my FLEXlm page)) we can generate licenses (note that you’ll need to insert defines for ENCRYPTION_SEED1 & ENCRYPTION_SEED2 or copy them from an older lm_code.h), I also found in later SDK’s LM_SEED’s must also be defined, although they won’t be used if you set LM_STRENGTH appropriately.

Bitplane will now check this license out successfully, this indicates that it does not use any of the new enhanced FLEXlm features even though all of the routines are not compiled out, you can now freely generate licenses for the remainder of the features, accessible from the very convenient license option.

A Snag

FLEXlm couldn’t be this easy?, surely?, lets try the technique above with GerbTool…..As it turns out GerbTool tries to check out 7 features :

gt-fab / gt-dsn / gs-ins / gt-com / gt-vwr / gt-vdb / gt-ce (gt-odb & gt-pad are checked out by ODB2GT.exe & PADS2GT.exe respectively)

I was informed each of these corresponds to an edition type of GerbTool, so only 1 feature should actually be checked out successfully. I’d generated my license for gt-fab and _l_checkout() rejected it with error -8 (LM_BADCODE), the other features failed with -5 (LM_NOFEATURE), no real surprise there, crucially we now know there must therefore be something else beneath _l_checkout() that determines that the license is invalid.

I was pretty confident that the reason the license was rejected was due to the new ECC security, since this has been well implemented (Certicom did their job correctly), there is no hope of finding the real LM_SEED’s. A brute force attack would be 2^96, inpracticle to say the least (and rendered further so by the speed of the authentication code). There are now 2 things to do, first we can probably tease from the FLEXlm library the -8 error (0xFFFFFFF8) and find where its set (like Imaris, a hex editor will do for finding those places in GerbTool), as it turns out there are 6 address candidates, simple testing would quickly find the correct one. Or, secondly, we can just trace on from _l_sg() with GerbTool.

Tracing onwards I simply compared the code flow from Imaris with that of GerbTool, both targets next call _l_ckout_crypt() and code flow differs soon after a call to _real_crypt(), modifying execution at this level produces a null pointer error. With Imaris code flow is directed towards a familiar side-by-side comparison of the real license with the one obtained from the license file, this implies that _real_crypt() and routines below must be deciding whether to perform the old style checkout or the new style authentication. Lets look at the piece of code that controls this (from Imaris) :

_real_crypt()

:005F9AF0 push ebp
:005F9AF1 mov ebp, esp
:005F9AF3 sub esp, 9ACh
:005F9AF9 lea eax, [ebp+var_93C]
:005F9AFF mov [ebp+var_4], eax
:005F9B02 mov [ebp+var_948], 0
:005F9B0C mov [ebp+var_960], 0
:005F9B16 mov [ebp+var_950], 0
:005F9B20 mov [ebp+var_968], 0
:005F9B2A mov ecx, [ebp+arg_4]
:005F9B2D mov edx, [ecx+50h]
:005F9B30 mov [ebp+var_964], edx
:005F9B36 mov eax, [ebp+arg_8]
:005F9B39 mov [ebp+var_944], eax
:005F9B3F mov [ebp+var_96C], 0
:005F9B49 mov [ebp+var_940], 0
:005F9B53 mov ecx, [ebp+arg_0]
:005F9B56 mov edx, [ecx+3FCh] ; Type of license to checkout
:005F9B5C and edx, 100000h
:005F9B62 test edx, edx
:005F9B64 jnz short loc_5F9B72

The value of EDX at 5F9B56 controls which type of license ‘check out’ will be performed, with Imaris the value was 0×1048C0 and with GerbTool 0×48C0, if we now modify this value in a live debugging session, GerbTool will check out using the old style FLEXlm encryption and we’ll be licensed successfully. The next step is to see where the FLEXlm routines set this flag. With a simple bpm we can backtrace our value being set using an ‘or ecx, 100000h’ instruction inside _l_good_lic_key(), this is referenced back from another flag checked just after _l_sg().

:005F6F92 call _l_sg
:005F6F97 add esp, 0Ch
:005F6F9A mov ecx, [ebp+arg_0]
:005F6F9D cmp dword ptr [ecx+51Ch], 0
:005F6FA4 jz loc_5F704A <– if ((job->L_SIGN_LEVEL) && !conf->lc_keylist).

So if we’ve got a 0 here we perform the old checkout, we could now just settle for patching here but lets backtrace yet again. This results in 2 locations that write 1 to our [ecx+51Ch] flag, inside GerbTool these are 6AF454 (at the end of _l_init()) and 6B219C (at the end of _lc_new_job()).

Flag 1

6AF454 – Set to 1 using a static ADD ECX, 1 instruction at 6AF426, this could be patched to ADD ECX, 0 for a 1 byte change however Imaris has the same reference so there must be a variation in code path. By comparing the flow between Imaris and GerbTool, we discover the following ’switching’ code :

:006AF354 mov edx, [ebp+var_5DC]
:006AF35A cmp dword ptr [edx], 0
:006AF35D jz loc_6AF434 ; 0×0 Imaris, 0×10 GerbTool

This is the real switch we have to backtrace and its set deep inside the _l_buf_36() (routine described below), the only way I reliably found to locate where the static value is stored is as follows.

i). Breakpoint the _l_buf_36() routine, do d *(esp+8) to display in the data window the pointer to the vendor code structure, in some instances you may need to pagein this address via SoftICE.

ii). Set a bpm w on [vendor code structure + 3Ch] and monitor writes, anything other than zero should yield the static location of the data being written there (note that you’ll probably get 3 or so breaks on access before finding the right one), once we’ve located the correct place we can make a small patch of the static data.

:00405FB6 mov eax, [edx+3Ch]
:00405FB9 add eax, dword_81C7F8 ; 0×10 static data
:00405FBF mov ecx, [ebp+0Ch]
:00405FC2 mov [ecx+3Ch], eax ; Write flag

Flag 2

6B219C – Set via function call at the start of _lc_new_job(). See following code :

_lc_new_job proc near
:006B20B0 push ebp
:006B20B1 mov ebp, esp
:006B20B3 sub esp, 14h
:006B20B6 mov eax, _l_n36_buf
:006B20BB mov [ebp+arg_4], eax
:006B20BE lea ecx, [ebp+var_10]
:006B20C1 push ecx
:006B20C2 push 0
:006B20C4 push 0
:006B20C6 push 0
:006B20C8 mov edx, [ebp+arg_8]
:006B20CB push edx
:006B20CC lea eax, [ebp+var_C]
:006B20CF push eax
:006B20D0 call [ebp+arg_4] ; _l_n36_buf()

_l_n36_buf dd 401000h

:0040100F mov eax, [ebp+1Ch]
:00401012 mov dword ptr [eax], 1 ; Set flag (we want 0)


This requires a patch, in Imaris this flag is AND’d with 0, GerbTool sets it to 1 & SDS to 2. If we make the necessary changes GerbTool will launch and license successfully. I’ve developed a ‘muster’ which you might care to print and apply to your next FLEXlm target. Lets apply my technique to SDS 2 v6.318. (Please note that this method should not be totally relied upon as a quick substitute to commenting your IDA database using lmgr.lib), the screenshots below are taken from a fully commented .idb.

* Tip * It can be worthwhile loading lm_crstr.obj in IDA to aid commenting of your target idb.

1. Locate _l_sg().

This seems to be trivial by searching for the hex constant 6F7330B8h (unsigned long x = 0×6f7330b8; /*- v8.x */) used at the start of the routine, (note that there are 2 references to this constant and it is the first one you find which is _l_sg(), the other is inside _l_svk() purely for obfuscation). If you feel so inclined you can label dword_161DEC4 as _l_n36_buff.

_l_sg = sub_DBFD0A

2. Locate _l_init().

_l_sg() should have 6 cross references. By quickly examing the code immediately after each call to _l_sg() looking for the check against the default seeds 0×12345678 & 0×87654321 _l_init() can be identified.

:00DCD13E call _l_sg
:00DCD143 add esp, 0Ch
:00DCD146 cmp dword ptr [ebp-27Ch], 87654321h
:00DCD150 jz short loc_DCD15E
:00DCD152 cmp dword ptr [ebp-278h], 12345678h
:00DCD15C jnz short loc_DCD1BB
:00DCD15E
:00DCD15E loc_DCD15E: ; CODE XREF: sub_DCC520+C30j

_l_init() = sub_DCC520

3. Locate _l_good_lic_key().

By examining the other references to _l_sg(), _l_good_lic_key() will be the only reference that calls _l_sg() twice, in my fully commented .idb this is clear to see.



_l_good_lic_key = sub_DBE15D

4. _l_good_lic_key() has 9 xrefs of the form 3 xrefs inside 3 functions, the top most of these in the library is _lm_start_real(), again in a fully commented .idb, this is clear to see.



_lm_start_real() = sub_00DBD112

The only xref to _lm_start_real() should be inside _l_checkout().

_l_checkout() = sub_DBCA0E

From _l_checkout() we can easily deduce _lc_checkout() by finding the reference with lm_ckout.c at the start of the function (the other reference to _l_checkout() is inside _l_reconnect()). _lc_checkout() = sub_DBC940

5. _lc_checkout() has 2 cross references, the 2nd of which is of the form mov dword ptr [reg32+30h], offset _lc_checkout() (this is actually part of _InitLmInterface()), by scrolling up here we can label the routine at [reg32+0Ch] (or the first entry) as _lc_init(), this yields _lc_new_job() which call’s _lc_init() as sub_DC8610 and _l_n36_buf as dd 0E07100h.
6. In a live debugging session we set breakpoints on :

_l_n36_buf = E07100
_l_sg = DBFD3D
_lc_checkout = DBC99D

We construct a dummy license file, like so (note that you probably ought to be able to ascertain the name of the vendor daemon) :

FEATURE somefeature dsndata 1.0 permanent uncounted 0 \
HOSTID=ANY

From the break inside _l_n36_buf() we discover that our 2 bad flags are set at address E07112 & E0D4BD. From the break inside _lc_checkout(), we get the feature name sds2 and the version number 6.318, lets amend the license accordingly.

FEATURE sds2 dsndata 6.318 permanent uncounted 0 \
HOSTID=ANY

* Tip * Most FLEXlm targets vendor daemons don’t use the _l_n36_buf() configuration flags, this can make them an easy way to recover seeds using lmgrd -z daemon_name -c license file, especially if you don’t get a break on _l_sg() in your regular target or _l_checkout() returns EAX=-15.

You should now get a break on _l_sg() and the call to the _l_n36_buff() decoding routine, this should enable you to recover the seeds (0×987AC78F & 0xC8D6382B). Using lmv8gen you can generate vendor keys and now compile lmcrypt.exe. This will enable you to generate a valid license.

* Tip * By leaving your breakpoint on _lc_checkout() active you should be able to recover any other feature names checked out by your target application and thus generate licenses for them.



With SDS 2 the approach I describe above lets _lc_checkout() return 0, however the program crashes unexpectedly afterwards; this was puzzling since the warez released version simply patches sub_DBC940 (what we know to be _lc_checkout() to XOR EAX, EAX / RETN), exactly the same effect as our license. Also the license with the release was evidently generated using the same key information I recovered above (as lmcrypt didn’t change it). SDS 2 appears to be an anomalous case amongst FLEXlm targets, I tried 3 others and couldn’t replicate this behaviour, however its useful to know that we can also use this somehow more ‘brutal technique’ of patching _lc_checkout(). Since there is also integrity checking of the file, patches were also made to static checksum data, this was implemented separately by the developers obviously to prevent file tampering.

Conclusion

I hadn’t really looked at FLEXlm for quite some time and Macrovision are to be commended for finally making a protection which is safe from key generators, however, whilst they continue to support their legacy mistakes, old style FLEXlm licenses can still be generated and the application trivially patched to make the licensing layer accept them, even if my technique was to be broken, it is still far too easy to patch the _lc_checkout() API directly.

Solidedge破解实例

UGFLEX——传奇在继续
作者:macilaci 翻译:上官振宁
需要的工具
Debugger (SICE OllyDbg--非常棒的东东),Wadsm或者IDA,Flexlm SDK 7.2或者更高版本(非必须),一些最近的信息(从Pilgrim Nolan Blender或其他的地方得到)。
目标位置(对付得东东是个CAD软件,叫做Solidedge。)
http://www.ugsolutions.com
http://www.solid-edge.com
正文
经过最初的嗅听之后,发现了读取license文件(selicense.dat)的DLL。也许我们并没有创建License文件,所以License Key也没有,它是这样的:
FEATURE SOLIDEDGECLASSIC sedemon 11.0 permanent uncounted \
123456789ABC HOSTID=ANY ISSUER="I don’t know"
我们的ugflex.dll被jutil.dll替换。还有个MAP文件,格式如下:
Address Publics by Value Rva+Base Lib:Object
0001:00000010 _JSetVACallback@4 5a001010 f auto.obj
0001:00000040 ?IsAutomationEnabled@@YAHXZ 5a001040 f auto.obj
0001:00000050 ?IsLicenceValidForAutomation@@YAHXZ 5a001050 auto.obj

为了与idasym.exe文件一起使用这个MAP文件,将Rva+Base还有Lib:Object列删除。然
后将创建的sym文件与symbol loader一起使用(设断点易如反掌,接着往下看就明白了)

由经验得知,实际上对于License的检查是在LC_CHECKOUT进行的(摘自flexlm手册)

lc_checkout()
SYNTAX status = lc_checkout( job feature version num_lic flag code dup_group )
说明:查出一个或多个具体的feature(不好翻译,姑且用e文)。如果调用lc_checkout()的程序存在,那么check出的license将返回供另一用户使用。
如果将上面函数中的flag设置成LM_CO_WAIT,那么这个程序将等待,一直到达到这个feature需要的license数目。License文件的版本必须等于或高于lc_checkout调用中的version参数。
If the license file is counted that is if the number of users specified on the FEATURE line is non-zero lc_checkout() will request the license from alicense server. If the number of users on the FEATURE line is uncounted it will grant permission based on the contents of the license file onlyŠhostidversion expiration date etc.(感觉没什么用,没翻译)

在5a04cf70 处的_lc_checkout是设断点的好地方!找到了FEATURE名后,就可以按照上面的格式建立自己的license文件了^_^。为了保证正确性,给出所有的FEATURE名:SOLIDEDGECLASSIC SOLIDEDGEADVANCEDPAR SOLIDEDGEXPRESROUTE SOLIDEDGEFEATURERECO SOLIDEDGEXPAND3D
SEWEBPUBLISHER SOLIDEDGEHANDBOOK SOLIDEDGEMANAGER(note:有些feature如expand3d要在别的可执行程序中采用的到,以后再说^_^)
再来看l_good_lic_key函数。_lc_checkout命中三次而_l_good_lic_key只有一次。挺败吧?下面是程序片断:
5A04DA6C loc_5A04DA6C: ;CODE XREF _lm_start_real+343j
5A04DA6C mov edx [ebp+arg_14]
5A04DA6F push edx ; vendorcode 结构(这次有所改进-加密了)
5A04DA70 mov eax [ebp+var_20]
5A04DA73 push eax
5A04DA74 mov ecx [ebp+arg_0] ;我们的license information
5A04DA77 push ecx
5A04DA78 call _l_good_lic_key ;检查license
5A04DA7D add esp 0Ch
5A04DA80 test eax eax
5A04DA82 jnz short loc_5A04DA89 ;这个你应该很熟悉了吧:-)

如果运行part.exe而没有反应,可能是应为你没有运行seiges.exe。part.exe中有些反debug的代码的部分。运行seiges.exe并将eax置成非零,将得到status=OK.但是仅仅有patch并不能让人满意,所以我们接着往下看^_^

5A04E995 add edx 54h
.
.
5A04E99C push eax
5A04E99D call _l_extract_date
.
.
5A04E9B1 push ecx ;我们的vendorcode structure
5A04E9B2 mov edx [ebp+var_CC]
5A04E9B8 push edx ;feature(特征名)
5A04E9B9 mov eax [ebp+arg_4]
5A04E9BC push eax
5A04E9BD mov ecx [ebp+arg_0]
5A04E9C0 push ecx
5A04E9C1 call _l_ckout_crypt

跟踪上面的代码我们发现_l_ckout_crypt做了一些重要的工作。这里只改变了seed的值而没有改变key的值。由于key的值没有改变,我们姑且认为他们已经被解密了,但seed的值仍然隐藏着!继续追踪,_real_crypt出现了(败了,这么个败名字)
5A050B44 mov eax [ebp+arg_0]
5A050B47 push eax
5A050B48 call _real_crypt
5A050B4D add esp 10h

下面是_real_crypt的代码片断:

.
.
5A050ECB push ecx
5A050ECC call _l_getattr ;取得license attributes
.
.
5A05106A push eax
5A05106B call _l_good_bin_date ; date
.
.
5A0510DA mov edx [ebp+arg_0]
5A0510DD push edx
5A0510DE call _move_in_hostid ; 从license文件里获取hostid
.
.
5A051456 push offset aDup_group ; "DUP_GROUP" ;DUP_GROUP=UHD意味着可能的分组为(DUP_USER|DUP_HOST|DUP_DISPLAY)
所以对于用户在一台主机上,另外的对于feature的使用不会销毁另外的licenses. (看不太懂哦:( )

5A05145B mov eax [ebp+arg_4]
5A05145E mov ecx [eax+94h]
5A051464 push ecx
5A051465 call _addi ;把这个加到license中
.
.
5A051855 push ecx
5A051856 call _l_ckout_string_key ;这个怎样?
5A05185B add esp 18h

_l_ckout_string_key值得注意!
5A052902 _l_ckout_string_key proc near ; CODE XREF: _real_crypt+AD1p


5A052902 push ebp
5A052903 mov ebp esp
5A052905 sub esp 1E4h
.
.
.
5A053755 call _our_encrypt2 5A05375A add esp 4
5A05375D jmp short loc_5A05376C
5A05375F ; ΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖ
5A05375F
5A05375F loc_5A05375F: ; CODE XREF: _l_ckout_string_key+E43j
5A05375F ; _l_ckout_string_key+E4Cj
5A05375F push offset byte_5A0C5820
5A053764 call _our_encrypt ;the second encrypt
.
.
.
5A05384B mov ecx [ebp+var_188]
5A053851 add ecx 1
5A053854 mov [ebp+var_188] ecx
5A05385A
5A05385A loc_5A05385A: ; CODE XREF: _l_ckout_string_key+F47j
5A05385A mov edx [ebp+var_188]
5A053860 cmp edx [ebp+var_18C]
5A053866 jge loc_5A0539E0
5A05386C mov eax [ebp+var_188]
5A053872 mov cl [ebp+eax*2+var_168]
5A053879 mov [ebp+var_1CC] cl
5A05387F call ds:__p___mb_cur_max
5A053885 cmp dword ptr [eax] 1
.
.
.
5A0539CB xor eax eax
5A0539CD mov al byte_5A0C5820[edx] ; 最终 – 比较license
5A0539D3 cmp ecx eax
5A0539D5 jz short loc_5A0539DB ;比较下一个byte
5A0539D7 xor eax eax ;错误的key
5A0539D9 jmp short loc_5A053A01
5A0539DB ; ΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖΖ
5A0539DB
5A0539DB loc_5A0539DB: ; CODE XREF: _l_ckout_string_key+10D3j
5A0539DB jmp loc_5A05384B ;loop back

上面的循环与版本7中的有些类似(现在是7.2)。5A0C5820是产生真正的key的地方!这里有必要说明一下key的产生:如果没有license key,我们的license(格式正确)是混乱的,两者好像是通过addi function函数联系到一起的。所以现在程序的任务就是计算vendorseed并在4个vendorkey的帮助下同混乱的license混合(可能是做某种运算^_^)。上面说得工作将在5A0C5820处完成。在5A0C5820处bpm,我们得到:

.
.
5A053334 mov byte_5A0C5820[ecx] al ;here we go
5A05333A jmp short loc_5A0532F9
5A05333C loc_5A05333C: ; CODE XREF: _l_ckout_string_key+A0Dj
5A05333C cmp [ebp+var_188] 0

从5A05333C处开始追踪,我们发现了计算seed的代码:

5A0533EA xor eax ebx ;计算正确的seed
5A0533EC push eax ;入栈
5A0533ED call sub_5A053AD3
5A0533F2 add esp 4
5A0533F5 mov [ebp+seed_one] eax
5A0533FB mov edx [ebp+seed_one]
5A053401 and edx 0FFh
.
.
5A0534C9 add eax 1
5A0534CC mov [ebp+var_10] eax
5A0534CF mov [ebp+seed_one] 3D4DA1D6h ;隐藏seed
.
.
5A053548 push eax ;第二个seed入栈
5A053549 call sub_5A053AD3
5A05354E add esp 4
5A053551 mov [ebp+seed_two] eax
5A053557 mov edx [ebp+seed_two]
.
.
5A053628 mov [ebp+var_10] eax
5A05362B mov [ebp+seed_two] 3D4DA1D6h ;隐藏5A053635 jmp loc_5A053735

将seed隐藏能很好的防止内存dump工具将seed解出来。解seed的过程只能在特定位置并且是运行时才可以!

总结:
LC_CHECKOUT —
|
|
_l_good_lic_key— /*加密的keys*/
|
|
_l_ckout_crypt—/*解密的keys*/
|
|
_real_crypt—
|
|
_l_ckout_string_key—
|
|
5A0533EA /*计算第一个seed*/
|
|
5A053547 /*计算第二个seed*/
|
|
5A0539DB <-
|
|
5A0539CD— /*license比较*/
现在我们可以修改lm_code.h并且编译lmcrypt。使用3D4DA1D6h这样的字节模式,我们在AddInlm.dll中找类似的位置。其实我们只需要LC_CHECKOUT作为feature名。使用其他的模式能得到相应的位置(对于没有flexlm SDK的朋友来说,比较有用):
jutil.dll AddInlm.dll Selicwiz.exe
5A0533EC 046CAEDC 00428C6C
.
5A0539CD 046CB4BD 0042924D

The origin of the above code is the object lm_ckout.obj winthin the lmgr.lib library.(大体意思是上面的代码从那里来的)

|
|
5A0533EA /*计算第一个seed*/
|
5A053547 /*计算第二个seed*/
|
5A0539DB <-
| |
5A0539CD— /*license比较*/

 

Flexlm 介绍—常见EDA软件的license管理

Flexlm 介绍—常见EDA软件的license管理大型工程软件如Ansys、Fluent、Unigraph、ProE等安装需要经过注册程序Flexlm才可以使用,而Flexlm中涉及到很多知识、技巧,也存在许多问题。本篇文章就是针对上述软件安装中的常见问题作一些探讨与解决。
Flexlm 介绍—常见EDA软件的license管理
一、什么是 Flexlm?
Flexlm是由Globetrotter 公司发明的软件加密方法Flexible License Manager。Globetrotter 公司向软件厂商出售相关开发软件,软件厂商把此加密程序集成到自己的软件中。可以锁定机器的硬盘号,网卡号,使用日期,支持加密狗,以保护软件的知识产权。被80%以上的EDA软件公司所采用,是目前最流行的EDA软件加密方法,保护着世界上价值几百亿美元的EDA软件。了解Flexlm可以使我们正确的安装,管理和使用多个EDA软件。
Flexlm所管理的是License文件,所以我们首先要了解License文件的结构,以便于运行Flexlm管理License文件。
二、License文件的结构
License文件由注释行,Server行,Demon行, 以及Feature行构成。
注释行: 当一行的开始是"#"符号时,该行被License Manager(lmgr32xx)认为是注释行,有时候"|"也可以作为注释行的开始。
Server行 :Server行用来标识一台特定的主机,其格式是::
SERVER nodename id port-number
                              TCP端口号,如 1700
                           主机的ID号,Win95/98/NT平台下通常是网卡物理地址    
                     主机的名称,win95/98/NT下可以用ipconfig命令看到
         Server行开头的关键字,标识该行为Server行,不能更改.
例如:SERVER hostname 000012345678 TCP:1700    
Daemon(或Vendor)行:Deamon行是用来标识不同的卖主, 或者说是用来标识不同的软件商吧。其常见格式是:
DAEMON daemon_name daemon_path  
daemon的路径
                      daemon的名字
        Deamon行的关键字,FLEXlm6.0以后的版本也支持用VENDOR
例如:
DAEMON cdslmd c:\cdslic\bin\cdslmd.exe
                               Cadence License Daemon的路径
          Daemon的名字为cdslmd (Cadence License Manager Daemon 的简称)
    Feature行: Feature行是用来对软件特定的功能进行限制的,其常见的格式为:
FEATURE name vendor version expiration_date n Key "Vendor_String" hostID
                           版本号      过期时间                        主机ID,可省略
                   厂商标识                                 厂商定义的字符串
                 Feature名称                    20个字节的密码
      Feature行的关键字                     许可的终端用户个数


例如 FEATURE CADV_256SUPUC_ALL cdslmd 8.000 1-jan-0 9 2884F2781DB8 "J"
                                                                              Vendor string
                                                                     密码
                                                             允许9个终端用户  
                                                         0年1月1日过期,0年表示永久有效
                                                  版本8.0,可以是时间,也可以是版本号.
                                      厂商标识
                      Feature名称 ,即允许开通的功能
详细的FLEXlm文件格式可以参考FLEXlm的End-User-Manual.
又如:
FEATURE maxplus2 alterad 2001.12 25-sep-2002 uncounted E71125CEA376 \HOSTID=GUARD_ID=T000072362
? FEATURE:关键字
? maxplus2: FEATURE名
? alterad:厂商标识
? 2001.12:版本标记
? 25-sep-2002 :2002年9月25日超期,如:是permanent或0,表示永不过期
?  uncounted:使用人数限制
? E71125CEA376:密码
? HOSTID=GUARD_ID=T000072362 :运行机器的特征, 只有检测到存在T000072362的加密狗时,软件才可以使用。这里也可以指定硬盘号,网卡号等等
三、Flexlm License manger工具的安装
一些软件并不需要安装专门工具来管理license,如:MaxplusII等。但更多EDA软件需要专门工具进行管理。安装很多EDA软件的时候, 会有一个安装License Server的选项, 安装完成后会在控制面板中发现一个FLEXlm License Manager的工具.
四、Flexlm License manger工具的使用
点击Flexlm License manger,出现如下窗口中,找到相应lmgrd.exe,并指定license.如果有多个License文件,要用分号隔开。有的EDA软件没有License Server安装选项.但软件本身就自带FLEXlm License Manager, 如Leonado Spectrum程序组下可以找到FLEXlm Manager这个程序,用鼠标点击运行就会出现上面提到的那个管理窗口。Win95/98下还需要在autoexec.bat中加入如下一行:
- SET LM_LICENSE_FILE=c:\flexlm\license.dat
如果有多个License文件,可以用分号隔开,如:
-  SET LM_LICENSE_FILE=c:\flexlm\license1.dat ; d:\altera\license2.dat
Win2000和NT,则需要在系统环境变量中设定这些参数。设置完以后需要重新启动计算机

注意事项
? 不要随意更改系统时间!
- Flexlm加密系统会监测系统文件的时间
? 更改系统时间导致的常见错误信息:
- Flexlm error, system clock has been set back
? 解决方法
- 查找C:\windows\下所有时间不正确的系统文件文件,在正常的系统时间下将其修改保存
- 应用专用文件时间管理软件修改文件时间,我们可以在互联网上下载这类软件,我已经下载了一个这样的软件
- 重装系统
如需了解关于FLEXLM更详细的资料请参考FLEXlm的End-User-Manual或浏览:
http://www.globetrotter.com
设置环境变量
以下都是针对Win95/98以及NT来说的.
    一般说来,License Manager需要在设置一个环境变量才能找到License文件. (有的软件不需要设置环境变量,只需将license文件放置到它的某个目录下面就可以了, 如Active VHDL3.3,只需将license.dat放在它的dat目录下.)
通常环境变量名称是LM_LICENSE_FILE, 大小写无关,Win95/98下的设置方法是在autoexec.bat中加入一行: (不包括下面那些说明)
  SET LM_LICENSE_FILE=c:\flexlm\mylicense.dat
                                  环境变量路径: 该例是License文件的名称及路径
               变量名称
如果有多个License文件,可以用分号隔开,如:
SET LM_LICENSE_FILE=c:\flexlm\license1.dat;d:\flexlm\license2.dat
应用软件的License Manager会自动遍历环境变量指定的所有License文件, 查找它所需要的Feature, 不同License文件路径的先后次序无关, 只有WorkviewOffice7.5比较特殊,必须将它的环境变量放在第一个才能工作,否则它就不工作:
SET LM_LICENSE_FILE=c:\WVO75\license.dat;c:\flexlm\mylicense.dat
除了LM_LICENSE_FILE这个环境变量名称外, 有些软件还使用自己特定的环境变量名称. 安装软件的时候, 安装程序会一般会自动添加这些环境变量. 如Specctra8.0使用CDS_LIC_FILE环境变量名称:
SET CDS_LIC_FILE=c:\cdsLic\license.dat
MentorGraphicsRenoir以及ModelSimEE如果安装的时候选择Mentor Graphics License Manager, 软件会使用MGLS_LICENSE_FILE环境变量:
SET MGLS_LICENSE_FILE=c:\flexlm\license.dat
如果License是由Server提供的, 那么环境变量的路径应该给出Server的名称以及端口, 而非License文件的路径以及名称, 如:
SET LM_LICENSE_FILE=1700@www.myhost.edu.cn
                       让License Manager去www.myhost.edu.cn的1700端口获取License
WinNT下设置环境变量需要在控制面板里面添加, 格式相同.
License文件使用技巧
这次想解决的问题是 — License文件多了怎么办?不知道为什么FLEXlm很流行, 机器里面装得EDA软件多了, 会有若干个License.dat.由于环境变量只是告诉Lmgr(license manager)从哪儿找它所需要的license文件, 所以:
    第一个解决办法是可以将License.dat换个名字,如pwpcb.Lic, cct80.Lic等等,然后用设置多个License文件环境变量的办法将每一个文件的路径添加到环境变量中:
SET LM_LICENSE_FILE=c:\flexlm\pwpcb.Lic;c:\flexlm\cct80.Lic
License文件的名称/后缀可以任意选取,只要保证变量设置正确以及License文件有效即可。
还可以这么做: —- 不推荐使用 :)
只设置一个环境变量设置:    SET LM_LICENSE_FILE=c:\flexlm\license.dat,然后把所有的License文件都copy到FLEXlm目录下, 为了便于区分, 取比较容易记的名字,例如PowerPCB2.1.Lic, ModelSimEE5.2e.Lic, Specctra8.0.Lic,等等,需要用哪个软件的时候, 把相应的License文件copy一份然后改名为license.dat即可。Copy, Rename, Copy, Rename…太麻烦了:(, 于是采用第二种解决办法–合并License.(注:仅用于没有Server Line的License文件,且软件用的环境变量名为LM_LICENSE_FILE)
前面介绍过License文件的格式, License文件的内容不再是陌生的了,可以用文本编辑器打开所有的License文件,把它们的内容统统copy&paste到license.dat里面. 然后只设置一个环境变量:   SET LM_LICENSE_FILE=c:\flexlm\license.dat
FLEXlm Server方式的License应该如下设置:
License.dat文件放在主机中, 主机运行Server提供License服务, 客户端的环境变量设置为 SET LM_LICENSE_FILE=[TCP/IP端口]:[主机名称], 其中端口和主机名称应该和主机的License文件中的Server Line一致, 前面已经简单介绍过, 这里便不再赘述。
启动Server的方式有两种, 一是Dos命令行方式, 二是Windoz的窗口方式
1. Dos 方式
在c:\flexlm目录下可以找到一个Lmgrd.exe文件—License Manager Daemon, 这个Daemon是FLEXlm Server。License.dat文件需要和Daemon文件放在同一个目录下,启动 license server,可在 c:\flexlm 目录下执行:c:\flexlm\lmgrd -app -c ;关闭 license server,可在 c:\flexlm 目录下执行:c:\flexlm\lmutil lmdown:lmutil.exe是License Manager Utility.
2. Windoz的窗口方式
安装某些软件的时候, 会有一个安装License Server的选项, 选中它安装完成后会在控制面板中发现一个FLEXlm License Manager的小工具. 在FLEXlm License Manager Setup的TAB里可以选择Daemon, License文件,以及输出的日志文件; Control的TAB中可以启动/关闭Server以及查看Server状态, 另外几个TAB还提供了一些其它辅助功能。
Windoz下的这个FLEXlm License Manager要比命令行方式的方便一些, 至少它可以浏览以选取Daemon/License文件, 不过有时候发现控制面板里面找不到. 事实上它是一个控制面板的扩展应用程序, 如在PowerPCB目录下可以找到FLEXlm.cpl这个文件, 用鼠标双击它就运行出上面提到的那个管理窗口。没有研究过解决一个主机运行多个Server分别对应不同的软件的问题。
1.设定环境变量(控制面板—>系统–>环境)LM_LICENSE_FILE,多数软件都使用这个变量,这也是冲突根源。但也有一些软件用别的名称,如:
UG———>UGII_LICENSE_FILE=27000@CAD
ESRD——->ESRD5_LICENSE_FILE=F:\ESRD\STRESSCHECK5
以下变量由软件安装时或第一次设定后自动保存在注册表里:
MASTERCAM—–>MCFLEX_LICENSE_FILE=F:\MILL72\LICENSE
COSMOS系列—->BRNI_LICENSE_FILE=F:\COSMOSM\LICENSE\FLEXLM\LICENSE.DAT
MSC系列——->MSC_LICENSE_FILE=F:\MSC\FLEXLM\LICENSES\LICENSE.DAT
MAPLE6——–>MAPLELMG_LICENSE_FILE=F:\MAPLE 6\LICENSE\LICENSE.DAT
注意事项:
1. 没有设好会出现错误如:
I-DEAS:DETECTED LOSS OF COMMUNICATION WITH I-DEAS LICENSE DAEMON.
2. :P RO/E好像不用设定LM_LICENSE_FILE安装自动设<COMPUTER NAME>@7788;
3. LM_LICENSE_FILE变量可设置多个路径如:
F:\FEMAP80\LICENSE.DAT;F:\MARC\security\license.dat;中间用";"格开
4. 若是I-DEAS和别的软件冲突可在\IDEAS\MS7\bin\setup_varbs.cmd中加set LM_LICENSE_FILE=%SDRC_INSTL%\sec\license.dat
5. MASTERCAM7.2B安装后好像应清除LM_LICENSE_FILE设置,软件第一次运行时会让你查找LICENSE.DAT,然后自动保存在注册表里。
6. FEMAP8.0A的LICENSE.DAT应设在路径最前面,否则会出现以下错误INVALID LICENSE INFO,可能是它采用FLEXLM7.1b的原因?
7. :若设定多个LM_LICENSE_FILE路径有问题,可先设一个调试,确定是否是LM_LICENSE_FILE的原因?
8. 在控制面板–>FLEXLM LICENSE MANAGER–>SETUP中设SERVICE NAME,详细可到CAMONLINE(http://go.163.com/~camonline/)查看
9. 若控制面板没有FLEXLM LICENSE MANAGER可从\PTC\FLEXLM\OBJ OR\UG160\UGFLEXLM拷贝一个FLEXLM.CPL到\WINNT\SYSTEM32,当然对FLEXLM7.0可直接用LMTOOLS.EXE,但是其START/STOP SERVER和查询SERVER STATUS不在一组内我感觉不如6.1方便,也可到控制面板–>服务中查询SERVER STATUS,更加直观
10. SERVICE NAME有时要手工设定,这取决于安装时选SERVER或CLIEN,详细可看.NFO文件,SERVICE NAME最好取与软件及版本相关如:I-DEAS8.0,因为软件安装时可能自动取相同的SERVICE NAME
11. 对PTC Pro/E和UG设一个SERVICE NAME就可以了,因为其高版本LICENSE可用于低版本,PTC PRO/E2000i的FLEXLM6.1不用UNINSTALL,可直接用于代替PRO/E2000i2 FLEXLM7.0,对于UG带PACKAGE的license得用UG FLEXlm Licensing选择不同PACKAGE好像最多只能选两个?
12. 对MSC和COSMOS(SRAC)系列可能要合并LICENSE,设一个SERVICE NAME并用最新的LMGRD.EXE及DAEMON(MSC.EXE,SRAC.EXE),对于NASTRAN FOR WIN4.6还要多设一个FEAMAP7
13. 若是对同一软件设多个SERVICE NAME,会使LMGRD.EXE不断调用DAMON,系统会很慢,CPU近100%,应REMOVE一个SERVICE NAME
14. 有些软件不用设SERVICE NAME如:IMAGWARE SURF,ESRD STRESSCHECK,MASTERCAM,MAPLE6直接COPY LICENSE.DAT到安装目录或C:\FEXLM,不知道是何原因?
15. 要查看LICENSE是否正确可STOP SERVER,START SERVER再看Debug.log信息

2005年05月11日

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:八声甘州
【内容】:

有情风、万里卷潮来,无情送潮归。问钱塘江上,西兴浦口,几度斜晖。不用思量今古,俯仰昔人非。谁似东坡老,白首忘机。
记取西湖西畔,正暮山好处,空翠烟霏。算诗人相得,如我与君稀。约他年、东还海道,愿谢公、雅志莫相违。西州路,不应回首,为我沾衣。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:卜算子
【内容】:

缺月挂疏桐,漏断人初静。
谁见幽人独往来?
缥缈孤鸿影。

惊起却回头,有恨无人省。
拣尽寒枝不肯栖,
寂寞沙洲冷。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:卜算子
【内容】:

蜀客到江南,长忆吴山好。吴蜀风流自古同,归去应须早。
还与去年人,共藉西湖草。莫惜尊前仔细看,应是容颜老。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:采桑子
【内容】:

多情多感仍多病。
多景楼中,尊酒相逢,
乐事回头一笑空。

停杯且听琵琶语。
细捻轻扰,醉脸春融,
斜照江天一抹红。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:澄迈驿通潮阁二首
【内容】:

余生欲老南海村,帝遣巫阳召我魂[1]。
杳杳天低鹊没处,青山一发是中原。
【注释】:
[1]:引典。《楚辞-招魂》上说,上帝可怜屈原的灵魂脱离了他的躯壳,叫巫阳(古代女巫名)把他招回。作者被贬海南遇赦,心情愉快,以此自比。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:春日词
【内容】:

春云阴阴雪欲落,
东风和冷惊罗幕。
渐看远水绿生漪,
未放小桃红入萼。
佳人瘦尽雪肤肌,
眉敛春愁知为谁?
深院无人剪刀响,
应将白纻[1]作春衣。
【注释】:

注一:醺布也。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:春宵
【内容】:

春宵一刻值千金,花有清香月有阴.
歌管楼亭声细细,秋千院落夜沉沉.
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:儋耳
【内容】:

霹雳收威暮雨开,独凭栏槛倚崔嵬。
垂天雌霓云端下,快意雄风海上来。
野老已歌丰岁语,除书欲放逐臣回。
残年饱饭东坡老,一壑能专万事灰。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:导引
【内容】:

帝城父老,三岁望尧心。天远玉楼深。龙颜仿佛笙箫远,肠断属车音。离宫春色琐瑶林。云阙海沈沈。遗民犹唱当时曲,秋雁起汾阴。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:导引
【内容】:

经文纬武,十有九年中。遗烈震羌戎。渭桥夹道千君长,犹是建元功。西瞻温洛与神崧。莲宇照琼宫。人间俯仰成今古,流泽自无穷。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:点绛唇
【内容】:

不用悲秋,今年身健还高宴。江村海甸。总作空花观。尚想横汾,兰菊纷相半。楼船远。白云飞乱。空有年年雁。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:点绛唇
【内容】:

红杏飘香,柳含烟翠拖轻缕。水边朱户。尽卷黄昏雨。烛影摇风,一枕伤春绪。归不去。凤楼何处。芳草迷归路。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:点绛唇
【内容】:

我辈情锺,古来谁似龙山宴。而今楚甸。戏马馀飞观。顾谓佳人,不觉秋强半。筝声远。鬓云吹乱。愁入参差雁。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:点绛唇
【内容】:

闲倚胡床,庾公楼外峰千朵。与谁同坐。明月清风我。别乘一来,有唱应须和。还知麽。自从添个。风月平分破。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:点绛唇
【内容】:

月转乌啼,画堂宫徵生离恨。美人愁闷。不管罗衣褪。清泪斑斑,挥断柔肠寸。嗔人问。背灯偷搵。拭尽残妆粉。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:调笑令
【内容】:

渔父。渔父。江上微风细雨。青蓑黄箬裳衣。红酒白鱼暮归。归暮。归暮。长笛一声何处。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:蝶恋花十五首
【内容】:

别酒劝君君一醉。清润潘郎,又是何郎婿。记取钗头新利市。莫将分付东邻子。回首长安佳丽地。三十年前,我是风流帅。为向青楼寻旧事。花枝缺处馀名字。


春事阑珊芳草歇。客里风光,又过清明节。小院黄昏人忆别。落红处处闻啼鴂。咫尺江山分楚越。目断魂销,应是音尘绝。梦破五更心欲折。角声吹落梅花月。


灯火钱塘三五夜。明月如霜,照见人如画。帐底吹笙香吐麝。此般风味应无价。寂寞山城人老也。击鼓吹箫,乍入农桑社。火冷灯稀霜露下。昏昏雪意云垂野。


蝶懒莺慵春过半。花落狂风,小院残红满。午醉未醒红日晚。黄昏帘暮无人卷。云鬓蓬松眉黛浅。总是愁媒,欲诉谁消遣。未信此情难系绊。杨花犹有东风管。


泛泛东风初破五。江柳微黄,万万千千缕。佳气郁葱来绣户。当年江上生奇女。一盏寿觞谁与举。三个明珠,膝上王文度。放尽穷鳞看圉圉。天公为下曼陀雨。


花褪残红青杏小。燕子飞时,绿水人家绕。枝上柳绵吹又少。天涯何处无芳草。墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄。多情却被无情恼。


记得画屏初会遇。好梦惊回,望断高唐路。燕子双飞来又去。纱窗几度春光暮。那日绣帘相见处。低眼佯行,笑整香云缕。敛尽春山羞不语。人前深意难轻诉。


帘外东风交雨霰。帘里佳人,笑语如莺燕。深惜今年正月暖。灯光酒色摇金盏。掺鼓渔阳挝未遍。舞褪琼钗,汗湿香罗软。今夜何人吟古怨。清诗未就冰生砚。


簌簌无风花自亸。寂寞园林,柳老樱桃过。落日多情还照坐。山青一点横云破。路尽河回千转柁。系缆渔村,月暗孤灯火。凭仗飞魂招楚些。我思君处君思我。


一颗樱桃樊素口。不爱黄金,只爱人长久。学画鸦儿犹未就。眉间已作伤春皱。扑蝶西园随伴走。花落花开,渐解相思瘦。破镜重圆人在否。章台折尽青青柳。


雨後春容清更丽。只有离人,幽恨终难洗。北固山前三面水。碧琼梳拥青螺髻。一纸乡书来万里。问我何年,真个成归计。白首送春拼一醉。东风吹破千行泪。


雨霰疏疏经泼火。巷陌秋千。犹未清明过。杏子梢头香蕾破。淡红褪白胭脂涴。苦被多情相折挫。病绪厌厌,浑似年时个。绕遍回廊还独坐。月笼云暗重门锁。


云水萦回溪上路。叠叠青山,环绕溪东注。月白沙汀翘宿鹭。更无一点尘来处。溪叟相看私自语。底事区区,苦要为官去。尊酒不空田百亩。归来分得闲中趣。


自古涟漪佳绝地。绕郭荷花,欲把吴兴比。倦客尘埃何处洗。真君堂下寒泉水。左海门前酤酒市。夜半潮来,月下孤舟起。倾盖相逢拼一醉。双凫飞去人千里。


昨夜秋风来万里。月上屏帏,冷透人衣袂。有客抱衾愁不寐。那堪玉漏长如岁。羁舍留连归计未。梦断魂销,一枕相思泪。衣带渐宽无别意。新书报我添憔悴。



以上苏轼作品《蝶恋花》共15首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:定风波十一首
【内容】:

好睡慵开莫厌迟。自怜冰脸不时宜。偶作小红桃杏色,闲雅,尚馀孤瘦雪霜姿。休把闲心随物态,何事,酒生微晕沁瑶肌。诗老不知梅格在,吟咏,更看绿叶与青枝。


两两轻红半晕腮。依依独为使君回。若道使君无此意。何为。双花不向别人开。但看低昂烟雨里。不已。劝君休诉十分杯。更问尊前狂副使。来岁。花开时节与谁来。


莫怪鸳鸯绣带长。腰轻不胜舞衣裳。薄倖只贪游冶去。何处。垂杨系马恣轻狂。花谢絮飞春又尽。堪恨。断弦尘管伴啼妆。不信归来但自看。怕见。为郎憔悴却羞郎。


千古风流阮步兵。平生游宦爱东平。千里远来还不住。归去。空留风韵照人清。红粉尊前深懊恼。休道。怎生留得许多情。记得明年花絮乱。须看。泛西湖是断肠声。


三月七日沙湖道中遇雨。雨具先去,同行皆狼狈,余独不
觉。已而遂晴,故作此词。

莫听穿林打叶声,何妨吟啸且徐行。
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

料峭春风吹酒醒,微冷,山头斜照却相迎。
回首向来萧瑟处,归去,也无风雨也无晴。


王定国歌儿曰柔奴,姓宇文氏,眉目娟丽,善应对,家世
住京师。定国南迁归,余问柔:广南风土应是不好?柔对
曰:此心安处,便是吾乡。因为缀词云:

常羡人间琢玉郎,
天应乞与点酥娘。
自作清歌传皓齿,
风起,雪飞炎海变清凉。

万里归来年愈少,
微笑,笑时犹带岭梅香。
试问岭南应不好?
却道:此心安处是吾乡。


闲卧藤床观社柳。


与客携壶上翠微。江涵秋影雁初飞。尘世难逢开口笑。年少。菊花须插满头归。酩酊但酬佳节了。云峤。登临不用怨斜晖。古往今来谁不老。多少。牛山何必更沾衣。


雨洗娟娟嫩叶光。风吹细细绿筠香。秀色乱侵书帙晚。帘卷。清阴微过酒尊凉。人画竹身肥拥肿。何用。先生落笔胜萧郎。记得小轩岑寂夜。廊下。月和疏影上东墙。


月满苕溪照夜堂。五星一老斗光芒。十五年间真梦里。何事。长庚对月独凄凉。绿鬓苍颜同一醉。还是。六人吟笑水云乡。宾主谈锋谁得似。看取。曹刘今对两苏张。


子瞻书困点新茶。



以上苏轼作品《定风波》共11首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:洞仙歌
【内容】:

冰肌玉骨,自清凉无汗。
水殿风来暗香满。
绣帘开,一点明月窥人,
人未寝,倚枕钗横鬓乱。

起来携素手,庭户无声,
时见疏星渡河汉。
试问夜如何?夜已三更。
金波淡,玉绳低转。
但屈指西风几时来?
又不道流年暗中偷换。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:洞仙歌
【内容】:

江南腊尽,
早梅花开后, 
分付新春与垂柳。 
细腰肢自有入格风流,
仍更是、骨体清英雅秀。 

永丰坊那畔,
尽日无人,
谁见金丝弄晴画? 
断肠是飞絮时,
绿叶成阴,
无个事、一成消瘦。 
又莫是东风逐君来,
便吹散眉间一点春皱。 
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:翻香令
【内容】:

金炉犹暖麝煤残。惜香更把宝钗翻。重闻处,馀薰在,这一番、气味胜从前。背人偷盖小蓬山。更将沈水暗同然。且图得,氤氲久,为情深、嫌怕断头烟。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:更漏子
【内容】:

水涵空,山照市。西汉二疏乡里。新白发,旧黄金。故人恩意深。海东头,山尽处。自古客槎来去。槎有信,赴秋期。使君行不归。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:归朝欢
【内容】:

我梦扁舟浮震泽。雪浪摇空千顷白。觉来满眼是庐山,倚天无数开青壁。此生长接淅。与君同是江南客。梦中游,觉来清赏,同作飞梭掷。明日西风还挂席。唱我新词泪沾臆。灵均去後楚山空,澧阳兰芷无颜色。君才如梦得。武陵更在西南极。竹枝词,莫摇新唱,谁谓古今隔。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:海棠
【内容】:

东风袅袅泛崇光,香雾空蒙月转廊。
只恐夜深花睡去,故烧高烛照红妆。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:好事近
【内容】:

红粉莫悲啼,俯仰半年离别。看取雪堂坡下,老农夫凄切。明年春水漾桃花,柳岸隘舟楫。从此满城歌吹,看黄州阗咽。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:好事近
【内容】:

湖上雨晴时,秋水半篙初没。朱槛俯窥寒鉴,照衰颜华发。醉中吹堕白纶巾,溪风漾流月。独棹小舟归去,任烟波飘兀。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:好事近
【内容】:

烟外倚危楼,初见远灯明灭。却跨玉虹归去,看洞天星月。当时张范风流在,况一尊浮雪。莫问世间何事,与剑头微吷。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:和子由渑池怀旧
【内容】:

人生到处知何似,应似飞鸿踏雪泥。
泥上偶然留指爪,鸿飞那复计东西。
老僧已死成新塔,坏壁无由见旧题。
往日崎岖还记否,路长人困蹇驴嘶。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:河满子
【内容】:

见说岷峨凄怆,旋闻江汉澄清。但觉秋来归梦好,西南自有长城。东府三人最少,西山八国初平。莫负花溪纵赏,何妨药市微行。拭问当垆人在否,空教是处闻名。唱著子渊新曲,应须分外含情。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:荷华媚
【内容】:

霞苞电荷碧。天然地、别是风流标格。重重青盖下,千娇照水,好红红白白。每怅望、明月清风夜,甚低迷不语,妖邪无力。终须放、船儿去,清香深处住,看伊颜色。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:贺新郎
【内容】:

乳燕飞华屋。 
悄无人、桐阴转午,
晚凉新浴。 
手弄生绡白团扇,
扇手一时似玉。 
渐困倚、孤眠清熟。 
帘外谁来推绣户?
枉教人梦断瑶台曲。 
又却是,
风敲竹。 

石榴半吐红巾蹙。 
待浮花浪蕊都尽,
伴君幽独。 
秾艳一枝细看取,
芳心千重似束。 
又恐被、秋风惊绿。 
若待得君来向此,
花前对酒不忍触。 
共粉泪,
两簌簌。 
【注释】

①瑶台:传说昆仑山仙人所居之处。 曲:深处。
②秋风惊绿:秋风起后,榴花凋谢,剩下的绿叶,禁不住摧残。
③簌簌:纷纷落下的样子。

【评解】

这首《贺新郎》借咏名花佳丽,以抒诗人的感怀,寄意高远,构思奇妙。上片咏佳
人,隐约流露出人物的孤独心境。
下片写石榴,然后将人物与石榴合写,亦花亦人,巧妙新颖。
全词以华美艳丽的形象,婉曲缠绵的情韵,曲折含蓄地表达了诗人的情怀。
苏轼在新旧两派当权时,均不愿随声附和,取媚求进,因而或遭新党排挤,或为旧
党不容。曾两次出任杭州。词中以榴花比托“幽独”的佳人,联系自己的心情和处境,
借咏物曲曲传出自己的心声,手法极为高妙。

【集评】

黄蓼园《蓼园词选》:末四句是花是人,婉曲缠绵,耐人寻味不尽。
俞陛云《唐五代两宋词选释》:此词极写其特立独行之概。以上阕“孤眠”之“孤”
字,下阕“幽独”之“独”字,表明本意。“新浴”及“扇手”,其身之洁白,焉能与
浪蕊浮花为伍,犹屈原不能以皓皓之白,入汶汶之世也。下阕“芳心千重似束”句及
“秋风”句言已深闭退藏,而人犹不恕,极言其忧谗畏讥之意。对花真赏,知有何人,
惟有沾襟之粉泪耳。
沈雄《古今词话》曾记载:苏轼任职杭州时,曾在西湖宴会。群妓毕集,而秀兰迟
到,一府僚为此发怒。东坡即席写《贺新郎》为秀兰解围。
胡仔《苕溪渔隐丛话》:东坡此词,冠绝古今,托意高远,宁为一妓而发耶!
《唐宋词鉴赏集》:词人写作受到生活现象的触发,或从现实中摄取某些现象,这
是可能的,但决不是生活的简单记录。把一首词的内容完全坐实到一个官场的风流故事
上,刻板地句句索隐,这显然是附会之谈,不足凭信。
薛砺若《宋词通论》: 此词写来极纡回缠绵,一往情深。丽而不艳,工而能曲,
毫无刻画斧斫之痕。
唐圭璋《唐宋词简释》:此首不必为官妓秀兰而作,写情景俱高妙。
写花写人,是二实一。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:花影
【内容】:

重重叠叠上瑶台,几度呼童归不开。
刚被太阳收拾去,却教明月送将来。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:华清引
【内容】:

平时十月幸兰汤。玉甃琼梁。五家车马如水,珠玑满路旁。翠华一去掩方床。独留烟树苍苍。至今清夜月,依前过缭墙。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:画堂春
【内容】:

柳花飞处麦摇波。晚湖净鉴新磨。小舟飞棹去如梭。齐唱采菱歌。平野水云溶漾,小楼风日晴和。济南何在暮云多。归去奈愁何。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:怀西湖寄晁美叔同年
【内容】:

西湖天下景,游者无愚贤。
浅深随所得,谁能识其全。
嗟我本狂直,早为世所捐。
独专山水乐,付与宁非天。
三百六十寺,幽寻遂穷年。
所至得其妙,心知口难传。
至今清夜梦,耳目余芳鲜。
君持使者节,风采烁云烟。
清流与碧巘,安肯为君妍。
胡不屏骑从,暂借僧榻眠。
读我壁间诗,清凉洗烦煎。
策杖无道路,直造意所便。
应逢古渔父,苇间自延缘。
问道若有得,买鱼勿论钱。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:浣溪沙四六首
【内容】:

白雪清词出坐间。爱君才器两俱全。异乡风景却依然。可恨相逢能几日,不知重会是何年。茱萸仔细更重看。


半夜银山上积苏。朝来九陌带随车。涛江烟渚一时无。空腹有诗衣有结,湿薪如桂米如珠。冻吟谁伴拈髭须。


惭愧今年二麦丰。千畦细浪舞晴空。化工馀力染夭红。归去山公应倒载,阑街拍手笑儿童。甚时名作锦薰笼。


长记鸣琴子贱堂。朱颜绿发映垂杨。如今秋鬓数茎霜。聚散交游如梦寐,升沈闲事莫思量。仲卿终不避桐乡。


道字娇讹苦未成。未应春阁梦多情。朝来何事绿鬟倾。彩索身轻长趁燕,红窗睡重不闻莺。困人天气近清明。


风卷珠帘自上钩。萧萧乱叶报新秋。独携纤手上高楼。缺月向人舒窈窕,三星当户照绸缪。香生雾縠见纤柔。


风压轻云贴水飞。乍晴池馆燕争泥。沈郎多病不胜衣。沙上不闻鸿雁信,竹间时听鹧鸪啼。此情惟有落花知。


傅粉郎君又粉奴。莫教施粉与施朱。自然冰玉照香酥。有客能为神女赋,凭君送与雪儿书。梦魂东去觅桑榆。


覆块青青麦未苏。江南云叶暗随车。临皋烟景世间无。雨脚半收檐断线,雪林初下瓦疏珠。归来冰颗乱黏须。


花满银塘水漫流。犀槌玉板奏凉州。顺风环佩过秦楼。远汉碧云轻漠漠,今宵人在鹊桥头。一声敲彻绛河秋。


画隼横江喜再游。老鱼跳槛识清讴。流年未肯付东流。黄菊篱边无怅望,白云乡里有温柔。挽回霜鬓莫教休。


几共查梨到雪霜。一经题品便生光。木奴何处避雌黄。北客有来初未识,南金无价喜新尝。含滋嚼句齿牙香。


菊暗荷枯一夜霜。新苞绿叶照林光。竹篱茅舍出青黄。香雾噀人惊半破,清泉流齿怯初尝。吴姬三日手犹香。


料峭东风翠幕惊。云何不饮对公荣。水晶盘莹玉鳞赬。花影莫孤三夜月,朱颜未称五年兄。翰林子墨主人卿。


罗袜空飞洛浦尘。锦袍不见谪仙人。携壶藉草亦天真。玉粉轻黄千岁药,雪花浮动万家春。醉归江路野梅新。


麻叶层层苘叶光,谁家煮茧一村香。
隔篱娇语络丝娘。

垂白杖藜抬醉眼,捋青捣买麨软饥肠。
问言豆叶几时黄。


门外东风雪洒裾。山头回首望三吴。不应弹铗为无鱼。上党从来天下脊,先生元是古之儒。时平不用鲁连书。


缥缈红妆照浅溪。薄云疏雨不成泥。送君何处古台西。废沼夜来秋水满,茂林深处晚莺啼。行人肠断草凄迷。


缥缈危楼紫翠间。良辰乐事古难全。感时怀旧独凄然。璧月琼枝空夜夜,菊花人貌自年年。不知来岁与谁看。


轻汗微微透碧纨。明朝端午浴芳兰。流香涨腻满晴川。彩线轻缠红玉臂,小符斜挂绿云鬟。佳人相见一千年。


倾盖相逢胜白头。故山空复梦松楸。此心安处是菟裘。卖剑买牛吾欲老,乞浆得酒更何求。愿为辞社宴春秋。


入袂轻风不破尘。玉簪犀璧醉佳辰。一番红粉为谁新。团扇只堪题往事,新丝那解系行人。酒阑滋味思残春。


软草平莎过雨新。轻沙走马路无尘。何时收拾耦耕身。日暖桑麻光似泼,风来蒿艾气如薰。使君元是此中人。


山色横侵蘸晕霞。湘川风静吐寒花。远林屋散尚啼鸦。梦到故园多少路,酒醒南望隔天涯。月明千里照平沙。


芍药樱桃两斗新。名园高会送芳辰。洛阳初夏广陵春。红玉半开菩萨面,丹砂浓点柳枝唇。尊前还有个中人。


霜鬓真堪插拒霜。哀弦危柱作伊凉。暂时流转为风光。未遣清尊空北海,莫因长笛赋山阳。金钗玉腕泻鹅黄。


四面垂杨十里荷。问云何处最花多。画楼南畔夕阳和。天气乍凉人寂寞,光阴须得酒消磨。且来花里听笙歌。


簌簌衣巾落枣花,
村南村北响缫车,
牛衣古柳卖黄瓜。

酒困路长惟欲睡,
日高人渴漫思茶,
敲门试问野人家。


桃李溪边驻画轮。鹧鸪声里倒清尊。夕阳虽好近黄昏。香在衣裳妆在臂,水连芳草月连云。几时归去不销魂。


万顷风涛不记苏。雪晴江上麦千车。但令人饱我愁无。翠袖倚风萦柳絮,绛唇得酒烂樱珠。尊前呵手镊霜须。


惟见眉间一点黄。诏书催发羽书忙。从教娇泪洗红妆。上殿云宵生羽翼,论兵齿颊带风霜。归来衫袖有天香。


西塞山边白鹭飞。散花洲外片帆微。桃花流水鳜鱼肥。自庇一身青箬笠,相随到处绿蓑衣。斜风细雨不须归。


细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。


徐邈能中酒圣贤。刘伶席地幕青天。潘郎白璧为谁连。无可奈何新白发,不如归去旧青山。恨无人借买山钱。


旋抹红妆看使君。三三五五棘篱门。相挨踏破蒨罗裙。老幼扶携收麦社,乌鸢翔舞赛神村。道逢醉叟卧黄昏。


学画鸦儿正妙年。阳城下蔡困嫣然。凭君莫唱短因缘。雾帐吹笙香袅袅,霜庭按舞月娟娟。曲终红袖落双缠。


雪颔霜髯不自惊。更将翦采发春荣。羞颜未醉已先赬。莫唱黄鸡并白发,且呼张丈唤殷兄。有人归去欲卿卿。


雪里餐毡例姓苏。使君载酒为回车。天寒酒色转头无。荐士已闻飞鹗表,报恩应不用蛇珠。醉中还许揽桓须。


阳羡姑苏已买田。相逢谁信是前缘。莫教便唱水如天。我作洞霄君作守,白头相对故依然。西湖知有几同年。


一别姑苏已四年。秋风南浦送归船。画帘重见水中仙。霜鬓不须催我老,杏花依旧驻君颜。夜阑相对梦魂间。


一梦江湖费五年。归来风物故依然。相逢一醉是前缘。迁客不应常眊矂,使君为出小婵娟。翠鬟聊著小诗缠。


游蕲水清泉寺,寺临兰溪,溪水西流。

山下兰芽短浸溪,
松间沙路净无泥,
萧萧暮雨子规啼。

谁道人生无再少?
门前流水尚能西!
休将白发唱黄鸡。


照日深红暖见鱼。连溪绿暗晚藏乌。黄童白叟聚睢盱。糜鹿逢人虽未惯,猿揉闻鼓不须呼。归家说与采桑姑。


炙手无人傍屋头。萧萧晚雨脱梧楸。谁怜季子敞貂裘。顾我已无当世望,似君须向古人求。岁寒松柏肯惊秋。


珠桧丝杉冷欲霜。山城歌舞助凄凉。且餐山色饮湖光。共挽朱幡留半日,强揉青蕊作重阳。不知明日为谁黄。


醉梦醺醺晓未苏。门前辘辘使君车。扶头一盏怎生无。废圃寒蔬挑翠羽,小槽春酒冻真珠。清香细细嚼梅须。



以上苏轼作品《浣溪沙》共46首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:惠崇春江晚景
【内容】:

竹外桃花三两枝,春江水暖鸭先知。
篓蒿满地芦芽短,正是河豚欲上时。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:汲江煎茶
【内容】:

活水还须活火煮,自临钓石取深清[1]:
大瓢贮月归春瓮,小杓分江入夜瓶。
雪乳已翻煎处脚[2] ,松风忽作泻时声。
枯肠未易禁三碗[3],坐听荒城长短更。
【注释】:
[1]:指既深又清的江水。
[2]:指茶脚
[3]:反引卢仝之典“(新茶)三碗搜枯肠,…”

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:减字木兰花二八首
【内容】:

春光亭下。流水如今何在也。岁月如梭。白首相看拟奈何。故人重见。世事年来千万变。官况阑珊。惭愧青松守岁寒。


春牛春杖。无限春风来海上。便与春工。染得桃红似肉红。春幡春胜。一阵春风吹酒醒。不似天涯。卷起杨花似雪花。


春庭月午。摇荡香醪光欲舞。步转迥廊。半落梅花婉娩香。轻云薄雾。总是少年行乐处。不似秋光。只与离人照断肠。


海南奇宝。铸出团团如栲栳。曾到崑崙。乞得山头玉女盆。绛州王老。百岁痴顽推不倒。海口如门。一派黄流已电奔。


回风落景。散乱东墙疏竹影。满坐清微。入袖寒泉不湿衣。梦回酒醒。百尺飞澜鸣碧井。雪洒冰麾。散落佳人白玉肌。


江南游女。问我何年归得去。雨细风微。雨足如霜挽纻衣。江亭夜语。喜见京华新样舞。莲步轻飞。迁客今朝始是归。


娇多媚。体柳轻盈千万态。殢主尤宾。敛黛含嚬喜又嗔。徐君乐饮。笑谑从伊情意恁。脸嫩敷红。花倚朱阑裹住风。


空床响琢。花上春禽冰上雹。醉梦尊前。惊起湖风入坐寒。转关镬索。春水流弦霜入拨。月堕更阑。更请宫高奏独弹。


闽溪珍献。过海云帆来似箭。玉座金盘。不贡奇葩四百年。轻红酿白。雅称佳人纤手擘。骨细肌香。恰是当年十八娘。


琵琶绝艺。年纪都来十一二。拨弄么弦。未解将心指下传。主人瞋小。欲向东风先醉倒。已属君家。且更从容等待他。


凭谁妙笔。横扫素缣三百尺。天下应无。此是钱塘湖上图。一般奇绝。云淡天高秋夜月。费尽丹青。只这些儿画不成。


柔和性气。雅称佳名呼懿懿。解舞能讴。绝妙年中有品流。眉长眼细。淡淡梳妆新绾髻。懊恼风情。春著花枝百态生。


神闲意定。万籁收声天地静。玉指冰弦。未动宫商意已传。悲风流水。写处寥寥千古意。归去无眠。一夜馀音在耳边。


双鬟绿坠。娇眼横波眉黛翠。妙舞蹁跹。掌上身轻意态妍。曲穷力困。笑倚人旁香喘喷。老大逢欢。昏眼犹能仔细看。


双龙对起。白甲苍髯烟雨里。疏影微香。下有幽人昼梦长。湖风清软。双鹊飞来争噪晚。翠颭红轻。时下凌宵百尺英。


天然宅院。赛了千千并万万。说与贤知。表德元来是胜之。今来十四。海里猴儿奴子是。要赌休痴。六双骰儿六点儿。


天台旧路。应恨刘郎来又去。别酒频倾。忍听阳关第四声。刘郎未老。怀恋仙乡重得到。只恐因循。不见如今劝酒人。


天真雅丽。容态温柔心性慧。响亮歌喉。遏住行云翠不收。妙词佳曲。啭出新声能断续。重客多情。满劝金卮玉手擎。


惟熊佳梦。释氏老君亲抱送。壮气横秋。未满三朝已食牛。犀钱玉果。利市平分沾四坐。多谢无功。此事如何到得侬。


贤哉令尹。三仕已之无喜愠。我独何人。犹把虚名玷搢绅。不如归去。二顷良田无觅处。归去来兮。待有良田是几时。


晓来风细。不会鹊声来报喜。却羡寒梅。先觉春风一夜来。香笺一纸。写尽回文机上意。欲卷重开。读遍千回与万回。


银铮旋品。不用缠头千尺锦。妙思如泉。一洗闲愁十五年。为公少止。起舞属公公莫起。风里银山。摆撼鱼龙我自闲。


莺初解语。最是一年春好处。微雨如酥。草色遥看近却无。休辞醉倒。花不看开人易老。莫待春回。颠倒红英间绿苔。


玉房金蕊。宜在玉人纤手里。淡月朦胧。更有微微弄袖风。温香熟美。醉慢云鬟垂两耳。多谢春工。不是花红是玉红。


玉觞无味。中有佳人千点泪。学道忘忧。一念还成不自由。如今未见。归去东园花似霰。一语相开。匹似当初本不来。


云鬟倾倒。醉倚阑干风月好。凭仗相扶。误入仙家碧玉壶。连天衰草。下走湖南西去道。一舸姑苏。便逐鸱夷去得无。


云容皓白。破晓玉英纷似织。风力无端。欲学杨花更耐寒。相如未老。梁苑犹能陪俊少。莫惹闲愁。且折江梅上小楼。


郑庄好客。容我尊前先堕帻。落笔生风。籍籍声名不负公。高山白早。莹骨冰肤那解老。从此南徐。良夜清风月满湖。



以上苏轼作品《减字木兰花》共28首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江城子
【内容】:

墨云拖雨过西楼。水东流。晚烟收。柳外残阳,回照动帘钩。今夜巫山真个好,花未落,酒新篘。美人微笑转星眸。月华羞。捧金瓯。歌扇萦风,吹散一春愁。拭问江南诸伴侣,谁似我,醉扬州。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江城子
【内容】:

腻红匀脸衬檀唇。晚妆新。暗伤春。手拈花枝,谁会两眉颦。连理带头双□□,留待与、个中人。淡烟笼月绣帘阴。画堂深。夜沈沈。谁道□□,□系得人心。一自绿窗偷见後,便憔悴、到如今。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江城子
【内容】:

前瞻马耳九仙山。碧连天。晚云闲。城上高台,真个是超然。莫使匆匆云雨散,今夜里,月婵娟。小溪鸥鹭静联拳。去翩翩。点轻烟。人事凄凉,回首便他年。莫忘使君歌笑处,垂柳下,矮槐前。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江城子
【内容】:

十年生死两茫茫。
不思量,自难忘。
千里孤坟,无处话凄凉。[1]
纵使相逢应不识,
尘满面,鬓如霜。

夜来幽梦忽还乡。
小轩窗,正梳妆。
相顾无言,惟有泪千行。
料得年年断肠处,
明月夜,短松冈。
【注释】:
[1]孟启《本事诗·徵异第五》载张姓妻孔氏赠夫诗:“欲知肠断处,明月照孤坟。”

  苏轼十九岁与同郡王弗结婚,嗣后出蜀入仕,夫妻琴瑟调和,甘苦与共。十年后王弗亡故,归葬于家乡的祖莹。这首词是苏轼在密州一次梦见王弗后写的,距王弗之卒又是十年了。生者与死者虽然幽明永隔,感情的纽带却结而不解,始终存在。“不思量,自难忘”两句,看来平常,却出自肺腑,十分诚挚。
  “ 不思量”极似无情,“自难亡”则死生契阔而不尝一日去怀。这种感情深深地埋在心底,怎么也难以消除。读惯了词中常见的那种“一日不思量,也攒眉千度”(柳永)的爱情浓烈的词句,再来读苏轼此词,可以感受到它们写出不同人生阶段的情感类型。前者是青年时代的感情,热烈浪漫,然而容易消退。后者是进入中年后一起担受着一生忧患的正常的夫妻感情,它象日常生活一样,平淡无奇,然而淡而弥永,久而弥笃。苏轼本来欣赏“外枯而中膏,似淡而实美”的艺术风格,这首词表达的感情就是如此,因此才能生死不渝。
  此词还有一个值得注意之处,即这次梦中的夫妻相会,清楚地打上了生死之别的烙樱梦中的王弗“小轩窗,正梳妆”,犹如结缡未久的少妇,形象很美,带出苏轼当年的闺房之乐。但是十年来的人世变故尤其是心理上的创伤在双方都很显然。
  苏轼由于宦海浮沉,南北奔走,“尘满面,鬓如霜”,心情十分苍老。王弗见了苏轼,也是“相顾无言,惟有泪千行”,似乎在倾诉生离死别后的无限哀痛。生活的磨难,对于无意识的梦境,同样起着潜在而深该的影响。末了三句设想亡妻长眠于地下的孤独与哀伤,实际上两心相通,生者对死者的思念更是惓惓不已。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江城子
【内容】:

天涯流落思无穷。
既相逢,却匆匆。
携手佳人,和泪折残红。
为问东风余如许?春纵在,与谁同?

隋堤三月水溶溶。
背归鸿,去吴中。
回首彭城,清泗与淮通。
欲寄相思千点泪,流不到,楚江东。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江城子之三
【内容】:

凤凰山下雨出晴。
水风清,晚霞明。
一朵芙蕖[1],开过尚盈盈。
何处飞来双白鹭?
如有意,慕娉婷。

忽闻江上弄哀筝。
苦含情,遣谁听?
烟敛云收,依约是湘灵。
欲待曲终寻问取,
人不见,数峰青。
【注释】:
[1]芙蕖,荷花。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

翠蛾羞黛怯人看。掩霜纨。泪偷弹。且尽一尊,收泪唱阳关。漫道帝城天样远,天易见,见君难。画堂新拘近孤山。曲阑干。为谁安。飞絮落花,春色属明年。欲棹小舟寻旧事,无处问,水连天。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

凤凰山下雨初晴。水风清。晚霞明。一朵芙蕖,开过尚盈盈。何处飞来双白鹭,如有意,慕娉婷。忽闻江上弄哀筝。苦含情,遣谁听。烟敛云收,依约是湘灵。欲待曲终寻问取,人不见,数峰青。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

黄昏犹是雨纤纤。晓开帘。欲平檐。江阔天低,无处认青帘。孤坐冻吟谁伴我,揩病目,拈衰髯。使君留客醉厌厌。水晶盐。为谁甜。手把梅花,东望忆陶潜。雪似故人人似雪,虽可爱,有人嫌。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

老夫聊发少年狂。左牵黄。右擎苍。锦帽貂裘,千骑卷平冈。为报倾城随太守,亲射虎,看孙郎。酒酣胸胆尚开张。鬓微霜。又何妨。持节云中,何日遣冯唐。会挽雕弓如满月,西北望,射天狼。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

梦中了了醉中醒。只渊明。是前生。走遍人间,依旧却躬耕。昨夜东坡春雨足,乌鹊喜,报新晴。雪堂西畔暗泉鸣。北山倾。小溪横。南望亭丘,孤秀耸曾城。都是斜川当日境,吾老矣,寄馀龄。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

天涯流落思无穷。既相逢。却匆匆。携手佳人,和泪折残红。为问东风馀几许,春纵在,与谁同。隋堤三月水溶溶。背归鸿。去吴中。回首彭城,清泗与淮通。寄我相思千点泪,流不到,楚江东。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

相逢不觉又初寒。对尊前。惜流年。风紧离亭,冰结泪珠圆。雪意留君君不住,从此去,少清欢。转头山下转头看。路漫漫。玉花翻。银海光宽,何处是超然。知道故人相念否,携翠袖,倚朱阑。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:江神子/江城子
【内容】:

玉人家在凤凰山。水云间。掩门关。门外行人,立马看弓弯。十里春风谁指似,斜日映,绣帘斑。多情好事与君还。闵新鳏。拭馀潸。明月空江,香雾著云鬟。陌上花开春尽也,闻旧曲,破朱颜。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:浪淘沙
【内容】:

昨日出东城。拭探春情。墙头红杏暗如倾。槛内群芳芽未吐,早已回春。绮陌敛香尘。雪霁前村。东君用意不辞辛。料想春光先到处,吹绽梅英。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:临江仙十三首
【内容】:

冬夜夜寒冰合井,画堂明月侵帏。青缸明灭照悲啼。青缸挑欲尽,粉泪裛还垂。未尽一尊先掩泪,歌声半带清悲。情声两尽莫相违。欲知肠断处,梁上暗尘飞。


多病休文都瘦损,不堪金带垂腰。望湖楼上暗香飘。和风春弄袖,明月夜闻箫。酒醒梦回清漏永,隐床无限更潮。佳人不见董娇饶。徘徊花上月,空度可怜宵。


诗句端来磨我钝,钝锥不解生鋩。欢颜为我解冰霜。酒阑清梦觉,春草满池塘。应念雪堂坡下老,昔年共采芸香。功成名遂早还乡。回车来过我,乔木拥千章。


谁道东阳都瘦损,凝然点漆精神。瑶林终自隔风尘,试看披鹤氅,仍是谪仙人。省可清言挥玉麈,真须保器全真。风流何似道家纯。不应同蜀客,惟爱卓文君。


四大从来都遍满,此间风水何疑。故应为我发新诗。幽花香涧谷,寒藻舞沦漪。借与玉川生两腋,天仙未必相思。还凭流水送人归。层巅馀落日,草露已沾衣。


忘却成都来十载,因君未免思量。凭将清泪洒江阳。故山知好在,孤客自悲凉。坐上别愁君未见,归来欲断无肠。殷勤且更尽离觞。此身如传舍,何处是吾乡。


我劝髯张归去好,从来自己忘情。尘心消尽道心平。江南与塞北,何处不堪行。俎豆庚桑真过矣,凭君说与南荣。愿闻吴越报丰登。君王如有问,结袜赖王生。


细马远驮双侍女,青巾玉带红靴。溪山好处便为家。谁知巴峡路,却见洛城花。面旋落英飞玉蕊,人间春日初斜。十年不见紫云车。龙丘新洞府,铅鼎养丹砂。


夜饮东坡醒复醉,
归来仿佛已三更。
家童鼻息已雷鸣,
敲门都不应,
倚帐听江声。

长恨此身非我有,
何时忘却营营。
夜阑风静彀纹平,
小舟从此逝,
江海寄余生。


一别都门三改火,天涯踏尽红尘。依然一笑作春温。无波真古井,有节是秋筠。惆怅孤帆连夜发,送行淡月微云。尊前不用翠眉颦。人生如逆旅,我亦是行人。


自古相从休务日,何妨低唱微吟。天垂云重作春阴。坐中人半醉,帘外雪将深。闻道分司狂御史,紫云无路追寻。凄风寒雨是駸駸。问囚长损气,见鹤忽惊心。


尊酒何人怀李白,草堂遥指江东。珠帘十里卷香风。花开又花谢,离恨几千重。轻舸渡江连夜到,一时惊笑衰容。语音犹自带吴侬。夜阑对酒处,依旧梦魂中。


昨夜渡江何处宿,望中疑是秦淮。月明谁起笛中哀。多情王谢女,相逐过江来。云雨未成还又散,思量好事难谐。凭陵急桨两相催。想伊归去後,应似我情怀。



以上苏轼作品《临江仙》共13首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:六月二十日夜渡海
【内容】:

参横斗转欲三更,苦雨终风也解晴。
云散月明谁点缀,天容海色本澄清。
空余鲁叟乘桴意,粗识轩辕奏乐声。
九死南荒吾不恨,兹游奇绝冠平生。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满江红
【内容】:

东武南城,新堤固、涟漪初溢。隐隐遍、长林高阜,卧红堆碧。枝上残花吹尽也,与君更向江头觅。问向前、犹有几多春,三之一。官里事,何时毕。风雨外,无多日。相将泛曲水,满城争出。君不见兰亭修禊事,当时坐上皆豪逸。到如今、修竹满山阴,空陈迹。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满江红
【内容】:

江汉西来,高楼下、蒲萄深碧。犹自带、岷峨云浪,锦江春色。君是南山遗爱守,我为剑外思归客。对此间、风物岂无情,殷勤说。江表传,君休读。狂处士,真堪惜。空洲对鹦鹉,苇花萧瑟。不独笑书生争底事,曹公黄祖俱飘忽。愿使君、还赋谪仙诗,追黄鹤。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满江红
【内容】:

清颍东流,愁目断、孤帆明灭。
宦游处、青山白浪,万重千叠。
孤负当年林下意,对床夜雨听萧瑟。
恨此生、长向别离中,添华发。

一尊酒,黄河侧。无限事,从头说。
相看恍如昨,许多年月。
衣上旧痕馀苦泪,眉间喜气添黄色。
便与君、池上觅残春,花如雪。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满江红
【内容】:

天岂无情,天也解、多情留客。春向暖、朝来底事,尚飘轻雪。君过春来纡组绶,我应归去耽泉石。恐异时、杯酒忽相思,云山隔。浮世事,俱难必。人纵健,头应白。何辞更一醉,此欢难觅。欲向佳人诉离恨,泪珠先已凝双睫。但莫遣、新燕却来时,音书绝。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满江红
【内容】:

忧喜相寻,风雨过、一江春绿。巫峡梦、至今空有,乱山屏簇。何似伯鸾携德耀,箪瓢未足清欢足。渐粲然、光彩照阶庭,生兰玉。幽梦里,传心曲。肠断处,凭他续。文君婿知否,笑君卑辱。君不见周南歌汉广,天教夫子休乔木。便相将、左手抱琴书,云间宿。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满庭芳
【内容】:

归去来兮,吾归何处,万里家在岷峨。百年强半,来日苦无多。坐见黄州再闰,儿童尽、楚语吴歌。山中友,鸡豚社酒,相劝老东坡。云何。当此去,人生底事,来往如梭。待闲看,秋风洛水清波。好在堂前细柳,应念我、莫翦柔柯。仍传语,江南父老,时与晒渔蓑。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满庭芳
【内容】:

三十三年,今谁存者,算只君与长江。凛然苍桧,霜干苦难双。闻道司州古县,云溪上、竹坞松窗。江南岸,不因送子,宁肯过吾邦。摐摐。疏雨过,风林舞破,烟盖云幢。愿持此邀君,一饮空缸。居士先生老矣,真梦里、相对残釭。歌舞断,行人未起,船鼓已逄逄。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满庭芳
【内容】:

蜗角虚名,蝇头微利,算来著甚乾忙。事皆前定,谁弱又谁强。且趁闲身未老,尽放我、些子疏狂。百年里,浑教是醉,三万六千场。思量。能几许,忧愁风雨,一半相妨。又何须,抵死说短论长。幸对清风皓月,苔茵展、云幕高张。江南好,千锺美酒,一曲满庭芳。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:满庭芳
【内容】:

香叆雕盘,寒生冰箸,画堂别是风光。主人情重,开宴出红妆。腻玉圆搓素颈,藕丝嫩、新织仙裳。双歌罢,虚檐转月,馀韵尚悠扬。人间,何处有,司空见惯,应谓寻常。坐中有狂客,恼乱愁肠。报道金钗坠也,十指露、春笋纤长。亲曾见,全胜宋玉,想像赋高唐。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:木兰花令
【内容】:

高平四面开雄垒。三月风光初觉媚。园中桃李使君家,城上亭台游客醉。歌翻杨柳金尊沸。饮散凭阑无限意。云深不见玉关遥,草细山重残照里。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:木兰花令
【内容】:

经旬未识东君信。一夕薰风来解愠。红绡衣薄麦秋寒,绿绮韵低梅雨润。瓜头绿染山光嫩。弄色金桃新傅粉。日高慵卷水晶帘,犹带春醪红玉困。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:木兰花令
【内容】:

霜馀已失长淮阔。空听潺潺清颍咽。佳人犹唱醉翁词,四十三年如电抹。草头秋露流珠滑。三五盈盈还二八。与余同是识翁人,惟有西湖波底月。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:木兰花令
【内容】:

梧桐叶上三更雨。惊破梦魂无觅处。夜凉枕簟已知秋,更听寒蛩促机杼。梦中历历来时路。犹在江亭醉歌舞。尊前必有问君人,为道别来心与绪。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:木兰花令
【内容】:

元宵似是欢游好。何况公庭民讼少。万家游赏上春台,十里神仙迷海岛。平原不似高阳傲。促席雍容陪语笑。坐中有客醉多情,不惜玉山拼醉倒。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:木兰花令
【内容】:

知君仙骨无寒暑。千载相逢犹旦暮。故将别语恼佳人,要看梨花枝上雨。落花已逐回风去。花本无心莺自诉。明朝归路下塘西,不见莺啼花落处。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:南歌子十七首
【内容】:

寸恨谁云短,绵绵岂易裁。半年眉绿未曾开。明月好风闲处、是人猜。春雨消残冻,温风到冷灰。尊前一曲为谁哉。留取曲终一拍、待君来。


带酒冲山雨,和衣睡晚晴。不知钟鼓报天明。梦里栩然蝴蝶、一身轻。老去才都尽,归来计未成。求田问舍笑豪英。自爱湖边沙路、免泥行。


绀绾双蟠髻,云敧小偃巾。轻盈红脸小腰身。叠鼓忽催花拍、斗精神。空阔轻红歇,风和约柳春。蓬山才调最清新。胜似缠头千锦、共藏珍。


古岸开青葑,新渠走碧流。会看光满万家楼。记取他年扶路、入西州。佳节连梅雨,馀生寄叶舟。只将菱角与鸡头。更有月明千顷、一时留。


海上乘槎侣,仙人萼绿华。飞升元不用丹砂。住在潮头来处、渺天涯。雷辊夫差国,云翻海若家。坐中安得弄琴牙。写取馀声归向、水仙夸。


琥珀装腰佩,龙香入领巾。只应飞燕是前身。共看剥葱纤手、舞凝神。柳絮风前转,梅花雪里春。鸳鸯翡翠两争新。但得周郎一顾、胜珠珍。


见说东园好,能消北客愁。虽非吾土且登楼。行尽江南南岸、此淹留。短日明枫缬,清霜暗菊逑。流年回首付东流。凭仗挽回潘鬓、莫教秋。


苒苒中秋过,萧萧两鬓华。寓身化世一尘沙。笑看潮来潮去、了生涯。方士三山路,渔人一叶家。早知身世两聱牙。好伴骑鲸公子、赋雄夸。


日薄花房绽,风和麦浪轻。夜来微雨洗郊坰。正是一年春好、近清明。已改煎茶火,犹调入粥饧。使君高会有馀清。此乐无声无味、最难名。


日出西山雨,无晴又有晴。乱山深处过清明。不见彩绳花板、细腰轻。尽日行桑野,无人与目成。且将新句琢琼英。我是世间闲客、此闲行。


山与歌眉敛,波同醉眼流。游人都上十三楼。不羡竹西歌吹、古扬州。菰黍连昌歜,琼彝倒玉舟。谁家水调唱歌头。声绕碧山飞去、晚云留。


山雨潇潇过,溪桥浏浏清。小园幽榭枕苹汀。门外月华如水、彩舟横。苕岸霜花尽,江湖雪阵平。两山遥指海门青。回首水云何处、觅孤城。


师唱谁家曲,宗风嗣阿谁。借君拍板与门槌。我也逢场作戏、莫相疑。溪女方偷眼,山僧莫眨眉。却愁弥勒下生迟。不见老婆三五、少年时。


卫霍元勋後,韦平外族贤。吹笙只合在缑山。闲驾彩峦归去、趁新年。烘暖烧香阁,轻寒浴佛天。他时一醉画堂前。莫忘故人憔悴、老江边。


笑怕蔷薇罥,行忧宝瑟僵。美人依约在西厢。祗恐暗中迷路、认馀香。午夜风翻幔,三更月到床。簟纹如水玉肌凉。何物与侬归去、有残妆。


欲执河梁手,还升月旦堂。酒阑人散月侵廊。北客明朝归去、雁南翔。窈窕高明玉,风流郑季庄。一时分散水云乡。惟有落花芳草、断人肠。


紫陌寻春去,红尘拂面来。无人不道看花回。惟见石榴新蕊、一枝开。冰簟堆云髻,金尊滟玉醅。绿阴青子莫相催。留取红巾千点、照池台。



以上苏轼作品《南歌子》共17首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:南乡子十七首
【内容】:

冰雪透香肌。姑射仙人不似伊。濯锦江头新样锦,非宜。故著寻常淡薄衣。暖日下重帏。春睡香凝索起迟。曼倩风流缘底事,当时。爱被西真唤作儿。


不到谢公台。明月清风好在哉。旧日髯孙何处去,重来。短李风流更上才。秋色渐摧颓。满院黄英映酒杯。看取桃花春二月,争开。尽是刘郎去後栽。


怅望送春杯。渐老逢春能几回。花满楚城愁远别,伤怀。何况清丝急管催。吟断望乡台。万里归心独上来。景物登临闲始见,徘徊。一寸相思一寸灰。


东武望馀杭。云海天涯两杳茫。何日功成名遂了,还乡。醉笑陪公三万场。不用诉离觞。痛饮从来别有肠。今夜送归灯火冷,河塘。堕泪羊公却姓杨。


寒雀满疏篱。争抱寒柯看玉蕤。忽见客来花下坐,惊飞。蹋散芳英落酒卮。痛饮又能诗。坐客无毡醉不知。花尽酒阑春到也,离离。一点微酸已著枝。


寒玉细凝肤。清歌一曲倒金壶。冶叶倡条遍相识,争如。豆蔻花梢二月初。年少即须臾。芳时偷得醉工夫。罗帐细垂银烛背,欢娱。豁得平生俊气无。


何处倚阑干。弦管高楼月正圆。胡蝶梦中家万里,依然。老去愁来强自宽。明镜借红颜。须著人间比梦间。蜡烛半笼金翡翠,更阑。绣被焚香独自眠。


回首乱山横。不见居人只见城。谁似临平山上塔,亭亭。迎客西来送客行。归路晚风清。一枕初寒梦不成。今夜残灯斜照处,荧荧。秋雨晴时泪不晴。


旌旆满江湖。诏发楼船万舳舻。投笔将军因笑我,迂儒。帕首腰刀是丈夫。粉泪怨离居。喜子垂窗报捷书。试问伏波三万语,何如。一斛明珠换绿珠。


凉簟碧纱厨,一枕清风昼睡馀。
睡听晚衙无一事,徐徐,读尽床头几卷书。

搔首赋归欤,自觉功名懒更疏。
若问使君才与术,何如?占得人间一味愚。


千骑试春游。小雨如酥落便收。能使江东归老客,迟留。白酒无声滑泻油。飞火乱星逑。浅黛横波翠欲流。不似白云乡外冷,温柔。此去淮南第一州。


裙带石榴红。却水殷勤解赠侬。应许逐鸡鸡莫怕,相逢。一点灵犀必暗通。何处遇良工。琢刻天真半欲空。愿作龙香双凤拨,轻拢。长在环儿白雪胸。


天与化工知。赐得衣裳总是绯。每向华堂深处见,怜伊。两个心肠一片儿。自小便相随。绮席歌筵不暂离。苦恨人人分拆破,东西。怎得成双似旧时。


晚景落琼杯。照眼云山翠作堆。认得岷峨春雪浪,初来。万顷蒲萄涨渌醅。暮雨暗阳台。乱洒高楼湿粉腮。一阵东风来卷地,吹回。落照江天一半开。


未倦长卿游。漫舞夭歌烂不收。不是使君能矫世,谁留。教有琼梳脱麝油。香粉镂金球。花艳红笺笔欲流。从此丹唇并皓齿,清柔。唱遍山东一百州。


绣鞅玉环游。灯晃帘疏笑却收。久立香车催欲上,还留。更且檀唇点杏油。花遍六么球。面旋回风带雪流。春入腰肢金缕细,轻柔。种柳应须柳柳州。


雨暗初疑夜,风回忽报晴。淡云斜照著山明。细草软沙溪路、马蹄轻。卯酒醒还困,仙材梦不成。蓝桥何处觅云英。只有多情流水、伴人行。



以上苏轼作品《南乡子》共17首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:念奴娇
【内容】:

凭高眺远,见长空,
万里云无留迹。
桂魄飞来,光射处,
冷浸一天秋碧。
玉宇琼楼,乘鸾来去,
人在清凉国。
江山如画,望中烟树历历。

我醉拍手狂歌,
举杯邀月对,影成三客。
起舞徘徊,风露下,
今夕不知何夕。
便欲乘风,翻然归去,
何用骑鹏翼。
水晶宫里,一声吹断横笛。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:念奴娇.赤壁怀古
【内容】:

大江东去,浪淘尽。千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石崩云,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰!
遥想公瑾当年,小乔初嫁了,雄姿英发,羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人间如梦,一樽还酹江月。
[ 简 析 ]

苏 轼 的 词 , 不 论 内 容 和 形 式 , 都 不 那 么 拘 于 一 格 。 有 时 放 笔 直 书 , 便 成 为 “ 曲子 中 缚 不 住 ” 的 “ 句 读 不 葺 之 诗 ” ; 有 些 从 内 容 看 也 颇 为 平 凡 。 正 如 泥 沙 俱 下 的 长江 大 河 , 不 是 一 道 清 澈 流 水 。 但 正 因 如 此 , 才 能 显 出 江 河 的 宏 大 气 势 。 人 们 可 以 如此 这 般 地 挑 剔 它 , 却 总 是 无 法 否 定 它 。
苏 轼 这 首 《 念 奴 娇 》 , 无 疑 是 宋 词 中 有 数 之 作 。 立 足 点 如 此 之 高 , 写 历 史 人 物又 如 此 精 妙 , 不 但 词 坛 罕 见 , 在 诗 国 也 是 不 可 多 得 的 。

他 一 下 笔 就 高 视 阔 步 , 气 势 沈 雄 : “ 大 江 东 去 , 浪 淘 尽 、 千 古 风 流 人 物 ” ─ ─细 想 万 千 年 来 , 历 史 上 出 现 过 多 少 英 雄 人 物 , 他 们 何 尝 不 煌 赫 一 时 , 俨 然 是 时 代 的骄 子 。 谁 不 赞 叹 他 们 的 豪 杰 风 流 , 谁 不 仰 望 他 们 的 姿 容 风 采 ! 然 而 , “ 长 江 后 浪 推 前 浪 ” , 随着 时 光 的 不 断 流 逝 , 随 着 新 陈 代 谢 的 客 观 规 律 , 如 今 回 头 一 看 , 那 些 “ 风 流 人 物 ”当 年 的 业 绩 , 好 象 给 长 江 浪 花 不 断 淘 洗 , 逐 步 淡 漠 , 逐 步 褪 色 , 终 于 , 变 成 历 史 的陈 迹 了 。

“ 浪 淘 尽 ” ─ ─ 真 是 既 有 形 象 , 更 能 传 神 。 但 更 重 要 的 是 作 者 一 开 头 就 抓 住 历史 发 展 的 规 律 , 高 度 凝 炼 地 写 出 历 史 人 物 在 历 史 长 河 中 所 处 的 地 位 , 真 是 “ 高 屋 建瓴 ” , 先 声 夺 人 。 令 人 不 能 不 惊 叹 。

“ 故 垒 西 边 , 人 道 是 、 三 国 周 郎 赤 壁 ” ─ ─ 上 面 已 泛 指 “ 风 流 人 物 ” , 这 里 就进 一 步 提 出 “ 三 国 周 郎 ” 作 为 一 篇 的 主 脑 , 文 章 就 由 此 生 发 开 去 。

“ 乱 石 崩 云 , 惊 涛 裂 岸 , 卷 起 千 堆 雪 ” ─ ─ 这 是 现 场 写 景 , 必 不 可 少 。 一 句 说, 乱 石 象 崩 坠 的 云 ; 一 句 说 , 惊 涛 象 要 把 堤 岸 撕 裂 ; 由 于 乱 石 和 惊 涛 搏 斗 , 无 数 浪花 卷 成 了 无 数 的 雪 堆 , 忽 起 忽 落 , 此 隐 彼 现 , 蔚 为 壮 观 。

“ 江 山 如 画 , 一 时 多 少 豪 杰 ” ─ ─ “ 如 画 ” 是 从 眼 前 景 色 得 出 的 结 论 。 江 山 如此 秀 美 , 人 物 又 是 一 时 俊 杰 之 士 。 这 长 江 , 这 赤 壁 , 岂 能 不 引 起 人 们 怀 古 的 幽 情 ?于 是 , 由 此 便 逗 引 出 下 面 一 大 段 感 情 的 抒 发 了 。

“ 遥 想 公 瑾 当 年 , 小 乔 初 嫁 了 , 雄 姿 英 发 ” ─ ─ 作 者 在 这 里 单 独 提 出 周 瑜 来 ,作 为 此 地 的 代 表 人 物 , 不 仅 因 为 周 瑜 在 赤 壁 之 战 中 是 关 键 性 人 物 , 更 含 有 艺 术 剪 裁的 需 要 在 内 。

请 看 , 在 “ 公 瑾 当 年 ” 后 面 忽 然 接 上 “ 小 乔 初 嫁 了 ” , 然 后 再 补 上 “ 雄 姿 英 发 ”, 真 象 在 两 座 悬 崖 之 间 , 横 架 一 道 独 木 小 桥 , 是 险 绝 的 事 , 又 是 使 人 叹 绝 的 事 。 说它 险 绝 , 因 为 这 里 原 插 不 上 小 乔 这 个 人 物 , 如 今 硬 插 进 去 , 似 乎 不 大 相 称 。 所 以 确是 十 分 冒 险 的 一 笔 。 说 它 又 使 人 叹 绝 , 因 为 插 上 了 这 个 人 物 , 真 能 把 周 瑜 的 风 流 俊雅 极 有 精 神 地 描 画 出 来 。 从 艺 术 角 度 来 说 , 真 乃 传 神 之 笔 。 那 风 神 摇 之 处 , 决 不 是用 别 的 句 子 能 够 饱 满 地 表 现 的 。

“ 羽 扇 纶 巾 ” ─ ─ 这 四 个 字 , 充 分 显 示 周 瑜 的 风 度 闲 雅 , 是 “ 小 乔 初 嫁 了 ” 的 进 一 步 勾 勒 和 补 充 。

“ 故 国 神 游 , 多 情 应 笑 我 , 早 生 华 发 ” ─ ─ 从 这 里 就 转 入 对 个 人 身 世 的 感 慨 。“ 故 国 神 游 ” , 是 说 三 国 赤 壁 之 战 和 那 些 历 史 人 物 , 引 起 了 自 己 许 多 感 想 ─ ─ 好 象自 己 的 灵 魂 向 远 古 游 历 了 一 番 。 “ 多 情 ” , 是 嘲 笑 自 己 的 自 作 多 情 。 由 于 自 作 多 情, 难 免 要 早 生 华 发 ( 花 白 的 头 发 ) , 所 以 只 好 自 我 嘲 笑 一 番 了 。 在 这 里 , 作 者 对 自己 无 从 建 立 功 业 , 年 纪 又 大 了 ─ ─ 对 比 起 周 瑜 破 曹 时 只 有 三 十 四 岁 , 仍 然 只 在 赤 壁矶 头 怀 古 高 歌 , 不 能 不 很 有 感 慨 了 。

“ 人 间 如 梦 , 一 尊 还 酹 江 月 ” ─ ─ 于 是 只 好 旷 达 一 番 。 反 正 , 过 去 “ 如 梦 ” ,现 在 也 是 “ 如 梦 ” , 还 是 拿 起 酒 杯 , 向 江 上 明 月 浇 奠 , 表 示 对 它 的 敬 意 , 也 就 算 了。 这 里 用 “ 如 梦 ” , 正 好 回 应 开 头 的 “ 浪 淘 尽 ” 。 因 为 风 流 人 物 不 过 是 “ 浪 淘 尽 ”, 人 间 也 不 过 “ 如 梦 ” 。 又 何 必 不 旷 达 , 又 何 必 过 分 执 着 呢 ! 这 是 苏 轼 思 想 上 长 期潜 伏 着 的 、 同 现 实 世 界 表 现 离 心 倾 向 的 一 道 暗 流 。 阶 级 的 局 限 如 此 , 在 他 的 一 生 中, 常 常 无 法 避 免 而 不 时 搏 动 着 。

综 观 整 首 词 , 说 它 很 是 昂 扬 积 极 , 并 不 见 得 ; 可 是 它 却 告 诉 我 们 , 词 这
返 回 诗 词 目 录
个 东 西, 绝 不 是 只 能 在 酒 边 花 间 做 一 名 奴 隶 的 。 这 就 是 一 个 重 大 的 突 破 , 也 是 划 时 代 的 进展 。

词 坛 的 新 天 地 就 是 通 过 这 些 创 作 实 践 , 逐 步 发 展 并 且 扩 大 其 领 域 的 。 苏 轼 这 首《 念 奴 娇 》 , 正 是 一 个 卓 越 的 开 头 。 至 今 为 止 , 仍 然 象 丰 碑 似 地 屹 立 在 中 国 文 学 发展 史 的 大 道 上 。

–引自《诗词赏析》http://www.chinavista.com/culture/letters/poetry/chpoem1.html

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:念奴骄
【内容】:

凭高眺望,见长空万里,云无留迹。
桂魂非飞来光射处,冷浸一天秋碧。
玉宇琼楼。乘鸾来去,人在清凉国。
江山如画,望中烟树历历。

我醉拍手狂歌,举杯邀月,对影成三客。
起舞徘徊风露下,今夕不知何夕。
便欲乘风,翻然归去,何用乘鹏翼?
水晶宫里,一声吹断横笛。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:菩萨蛮二一首
【内容】:

碧纱微露纤纤玉。朱唇渐暖参差竹。越调变新声。龙吟彻骨清。夜来残酒醒。惟觉霜袍冷。不见敛眉人。胭脂觅旧痕。


城隅静女谁人见。先生日夜歌彤管。谁识蔡姬贤。江南顾彦先。先生那久困。汤沐须名郡。惟有谢夫人。从来见拟伦。


翠鬟斜幔云垂耳。耳垂云幔斜鬟翠。春晚睡昏昏。昏昏睡晚春。细花梨雪坠。坠雪梨花细。颦浅念谁人。人谁念浅颦。


风回仙驭云开扇。更阑月堕星河转。枕上梦魂惊。晓檐疏雨零。相逢虽草草。长共天难老。终不羡人间。人间日似年。


画檐初挂弯弯月。孤光未满先忧缺。遥认玉帘钩。天孙梳洗楼。佳人言语好。不顾求新巧。此恨固应知。愿人无别离。


火云凝汗挥珠颗。颗珠挥汗凝云火。琼暖碧纱轻。轻纱碧暖琼。晕腮嫌枕印。印枕嫌腮晕。闲照晚妆残。残妆晚照闲。


峤南江浅红梅小。小梅红浅江南峤。窥我向疏篱。篱疏向我窥。老人行即到。到即行人老。离别惜残枝。枝残惜别离。


井桐双照新妆冷。冷妆新照双桐井。羞对井花愁。愁花井对羞。影孤怜夜永。永夜怜孤影。楼上不宜秋。秋宜不上楼。


娟娟缺月西南落。相思拨断琵琶索。枕泪梦魂中。觉来眉晕重。华堂堆烛泪。长笛吹新水。醉客各西东。应思陈孟公。


柳庭风静人眠昼。昼眠人静风庭柳。香汗薄衫凉。凉衫薄汗香。手红冰碗藕。藕碗冰红手。郎笑藕丝长。长丝藕笑郎。


落花闲院春衫薄。薄衫春院闲花落。迟日恨依依。依依恨日迟。梦回莺舌弄。弄舌莺回梦。邮便问人羞。羞人问便邮。


买田阳羡吾将老。从来只为溪山好。来往一虚舟。聊随物外游。有书仍懒著。水调歌归去。筋力不辞诗。要须风雨时。


秋风湖上萧萧雨。使君欲去还留住。今日漫留君。明朝愁杀人。佳人千点泪。洒向长河水。不用敛双蛾。路人啼更多。


湿云不动溪桥冷。嫩寒初透东风影。桥下水声长。一枝和月香。人怜花似旧。花比人应瘦。莫凭小栏干。夜深花正寒。


天怜豪俊腰金晚。故教月向松江满。清景为淹留。从君都占秋。身闲惟有酒。拭问清游首。帝梦已遥思。匆匆归去时。


涂香莫惜莲承步。长愁罗袜凌波去。只见舞迥风。都无行处踪。偷穿宫样稳。并立双趺困。纤妙说应难。须从掌上看。


绣帘高卷倾城出。灯前潋滟横波溢。皓齿发清歌。春愁入翠蛾。凄音休怨乱。我已先肠断。遗响下清虚。累累一串珠。


雪花飞暖融香颊。颊香融暖飞花雪。欺雪任单衣。衣单任雪欺。别时梅子结。结子梅时别。归不恨开迟。迟开恨不归。


玉环坠耳黄金饰。轻衫罩体香罗碧。缓步困春醪。春融脸上桃。花钿从委地。谁与郎为意。常爱月华清。此时憎月明。


玉笙不受朱唇暖。离声凄咽胸填满。遗痕几千秋。恩留人不留。他年京国酒。泫泪攀枯柳。莫唱短因缘。长安远似天。


玉童西迓浮丘伯。洞天冷落秋萧瑟。不用许飞琼。瑶台空月明。清香凝夜宴。借与韦郎看。莫便向姑苏。扁舟下五湖。



以上苏轼作品《菩萨蛮》共21首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:戚氏
【内容】:

玉龟山。东皇灵媲统群仙。绛阙岧嶢,翠房深迥,倚霏烟。幽闲。志萧然。金城千里锁婵娟。当时穆满巡狩。翠华曾到海西边。风露明霁,鲸波极目,势浮舆盖方圆。正迢迢丽日。玄圃清寂,琼草芊绵。争解绣勒香鞯。鸾辂驻跸,八马戏芝田。瑶池近、画楼隐隐,翠鸟翩翩。肆华筵。间作脆管鸣弦。宛若帝所钧天。稚颜皓齿,绿发方瞳,圆极恬淡高妍。尽倒琼壶酒,献金鼎药,固大椿年。缥缈飞琼妙舞,命双成、奏曲醉留连。云璈韵响泻寒泉。浩歌畅饮,斜月低河汉。渐渐绮霞、天际红深浅。动归思、回首尘寰。烂漫游、玉辇东还。杏花风、数里响鸣鞭。望长安路,依稀柳色,翠点春妍。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:千秋岁
【内容】:

岛边天外。未老身先退。珠泪溅,丹衷碎。声摇苍玉佩。色重黄金带。一万里。斜阳正与长安对。道远谁云会。罪大天能盖。君命重,臣节在。新恩犹可觊。旧学终难改。吾已矣。乘桴且恁浮於海。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:千秋岁
【内容】:

浅霜侵绿。发少仍新沐。冠直缝,巾横幅。美人怜我老,玉手簪黄菊。秋露重,真珠落袖沾馀馥。坐上人如玉。花映花奴肉。蜂蝶乱,飞相逐。明年人纵健,此会应难复。须细看,晚来月上和银烛。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:沁园春
【内容】:

孤馆灯青,野店鸡号,旅枕梦残。渐月华收练,晨霜耿耿,云山摛锦,朝露清清。世路无穷,劳生有限,似此区区长鲜欢。微吟罢,凭征鞍无语,往事千端。当时共客长安。似二陆初来俱少年。有笔头千字,胸中万卷,致君尧舜,此事何难。用舍由时,行藏在我,袖手何妨闲处看。身长健,但优游卒岁,且斗尊前。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:沁园春
【内容】:

情若连环,恨如流水,甚时是休。也不须惊怪,沈郎易瘦,也不须惊怪,潘鬓先愁。总是难禁,许多魔难,奈好事教人不自由。空追想,念前欢杳杳,後会悠悠。凝眸。悔上层楼。谩惹起、新愁与旧愁。向彩笺写遍,相思字了,重重封卷,密寄书邮。料到伊行,时时开看,一看一回和泪收。须知道,□这般病染,两处心头。
这首词托男女之情恨,抒极不平的心曲。正如《赤壁赋》中所言:“渺渺兮予怀,望美人兮天一方。”–引自"语文大观园"http://www.qilunetschool.com.cn/yuwen/

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:青玉案
【内容】:

三年枕上吴中路,
谴黄犬,随君去。
若到松江呼小渡,
莫惊鸳鹭,四桥尽是,
老子经行处。

辋川图上看春暮,
常记高人右丞句。
作个归期天已许。
春衫犹是小蛮针线,
会湿西湖雨。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:清平乐
【内容】:

清淮蜀汴。更在江西岸。红旆到时黄叶乱。霜入梁王故苑。秋原何处携壶。停骖访古踟蹰。双庙遗风尚在,漆园傲吏应无。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:劝金船
【内容】:

无情流水多情客。劝我如曾识。杯行到手休辞却。这公道难得。曲水池上,小字更书年月。还对茂林修竹,似永和节。纤纤素手如霜雪。笑把秋花插。尊前莫怪歌声咽。又还是轻别。此去翱翔,遍赏玉堂金阙。欲问再来何岁,应有华发。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:鹊桥仙
【内容】:

乘槎归去,成都何在,万里江沱汉漾。与君各赋一篇诗,留织女、鸳鸯机上。还将旧曲,重赓新韵,须信吾侪天放。人生何处不儿嬉,看乞巧、朱楼彩舫。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:鹊桥仙
【内容】:

缑山仙子,高情云渺,不学痴牛呆女。凤箫声断月明中,举手谢、时人欲去。客槎曾犯,银河微浪,尚带天风海雨。相逢一醉是前缘,风雨散、飘然何处。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:如梦令
【内容】:

城上层楼叠巘。城下清淮古汴。举手揖吴云,人与暮天俱远。魂断。魂断。後夜松江月满。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:如梦令
【内容】:

手种堂前桃李。无限绿阴青子。帘外百舌儿,惊起五更春睡。居士。居士。莫望小桥流水。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:如梦令
【内容】:

水垢何曾相受。细看两俱无有。寄语揩背人,尽日劳君挥肘。轻手。轻手。居士本来无垢。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:如梦令
【内容】:

为向东坡传语。人在玉堂深处。别後有谁来,雪压小桥无路。归去。归去。江上一犁春雨。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:如梦令
【内容】:

自净方能净彼。我自汗流呀气。寄语澡浴人,且共肉身游戏。但洗。但洗。俯为人间一切。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阮郎归
【内容】:

暗香浮动月黄昏。堂前一树春。东风何事入西邻。儿家常闭门。雪肌冷,玉容真。香腮粉未匀。折花欲寄岭头人。江南日暮云。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阮郎归
【内容】:

歌停檀板舞停鸾。高阳饮兴阑。兽烟喷尽玉壶乾。香分小凤团。雪浪浅,露珠圆。捧瓯春笋寒。绛纱笼下跃金鞍。归时人倚栏。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阮郎归
【内容】:

绿槐高柳咽新蝉。薰风初入弦。碧纱窗下水沈烟。棋声惊昼眠。微雨过,小荷翻。榴花开欲然。玉盆纤手弄清泉。琼珠碎却圆。
【注释】

①蕙风:夏季的东南风。
②玉盆:指荷叶。

【评解】

高柳新蝉,薰风微雨,池荷榴花,琼珠清泉,交织成一幅初夏的美丽图景;抚琴、
下棋、昼眠、嬉水,传达出人物风雅优闲的生活情趣。歇拍二句,写弄水叶面,琼珠碎
而复圆,更觉清新可爱。

【集评】

沈雄《古今词话》:观者叹服其八句状八景。音律一同,殊不散乱,入争宝之。刻
之琬琰,挂于堂室间也。
俞陛云《唐五代两宋词选释》:写闺情而不着妍辞,不作情语,自有一种闲雅之趣。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阮郎归
【内容】:

一年三度过苏台。清尊长是开。佳人相问苦相猜。这回来不来。情未尽,老先催。人生真可咍,他年桃李阿谁栽。刘郎双鬓衰。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:瑞鹧鸪
【内容】:

碧山影里小红旗。侬是江南踏浪儿。拍手欲嘲山简醉,齐声争唱浪婆词。西兴渡口帆初落,渔浦山头日未敧。侬欲送潮歌底曲,尊前还唱使君诗。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:瑞鹧鸪
【内容】:

城头月落尚啼乌。朱舰红船早满湖。鼓吹未容迎五马,水云先已漾双凫。映山黄帽螭头舫,夹岸青烟鹊尾炉。老病逢春只思睡,独求僧榻寄须臾。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:三部乐
【内容】:

美人如月。乍见掩暮云,更增妍绝。算应无恨,安用阴晴圆缺。娇甚空只成愁,待下床又懒,未语先咽。数日不来,落尽一庭红叶。今朝置酒强起,问为谁减动,一分香雪。何事散花却病,维摩无疾。却低眉、惨然不答。唱金缕、一声怨切。堪折便折。且惜取、少年花发。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:上元侍宴
【内容】:

淡月疏星绕建章,仙风吹下御炉香。
侍臣鹄立通明殿,一朵红云捧玉皇。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:少年游
【内容】:

去年相送,馀杭门外,飞雪似杨花。今年春尽,杨花似雪,犹不见还家。对酒卷帘邀明月,风露透窗纱。恰似姮娥怜双燕,分明照、画梁斜。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:少年游
【内容】:

霜降水痕收。浅碧鳞鳞露远洲。酒力渐消风力软,飕飕。破帽多情却恋头。佳节若为酬。但把清尊断送秋。万事到头都是梦,休休。明日黄花蝶也愁。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:少年游
【内容】:

银塘朱槛曲尘波。圆绿卷新荷。兰条荐浴,菖花酿酒,天气尚清和。好将沈醉酬佳节,十分酒、一分歌。狱草烟深,讼庭人悄,无吝宴游过。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:少年游
【内容】:

玉肌铅粉傲秋霜。准拟凤呼凰。伶伦不见,清香未吐,且糠秕吹扬。到处成双君独只,空无数、烂文章。一点香檀,谁能借箸,无复似张良。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:哨遍
【内容】:

睡起画堂,银蒜押帘,珠幕云垂地。初雨歇,洗出碧罗天,正溶溶养花天气。一霎暖风回芳草,荣光浮动,掩皱银塘水。方杏靥匀酥,花鬚吐绣,园林排比红翠。见乳燕捎蝶过繁枝。忽一线炉香逐游丝。昼永人闲,独立斜阳,晚来情味。便乘兴携将佳丽。深入芳菲里。拨胡琴语,轻拢慢拈总ベ利。看紧约罗裙,急趣檀板,霓裳入破惊鸿起。颦月临眉,醉霞横脸,歌声悠扬云际。任满头红雨落花飞。渐鳷鹊楼西玉蟾低。尚徘徊、未尽欢意。君看今古悠悠,浮宦人间世。这些百岁,光阴几日,三万六千而已。醉乡路稳不妨行,但人生、要适情耳。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:哨遍
【内容】:

为米折腰,
因酒弃家,
口体交相累。 
归去来,
谁不遣君归? 
觉从前皆非今是。 
露未晞,
征夫指予归路,
门前笑语喧童稚。
嗟旧菊都荒,
新松暗老,
吾年今已如此! 
但小窗容膝闭柴扉, 
策杖看孤云暮鸿飞, 
云出无心,
鸟倦知返,
本非有意。 

噫! 
归去来兮, 
我今忘我兼忘世。 
亲戚无浪语,
琴书中有真味。 
步翠麓崎岖,
泛溪窈窕,
涓涓暗谷流春水。 
观草木欣荣,
幽人自感,
吾生行且休矣! 
念寓形宇内复几时? 
不自觉皇皇欲何之? 
委吾心、去留谁计? 
神仙知在何处?
富贵非吾志。 
但知临水登山啸咏,
自引壶觞自醉。 
此生天命更何疑? 
且乘流、遇坎还止。 
【注释】:
陶渊明赋归去来,有其词而无其声。余既治东坡,筑雪堂于上。人 俱笑其陋,独鄱阳董毅夫(钺)过而悦之,有卜邻之意。乃取归去来词,稍加檃括,使就声律,以遗毅夫。 使家童歌之,时相从于东坡,释耒而和之,扣牛角而为之节,不亦乐乎?

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:生查子
【内容】:

三度别君来,此别真迟暮。白尽老髭须,明日淮南去。酒罢月随人,泪湿花如雾。後月逐君还,梦绕湖边路。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

高安更过几重山。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

过湖携手屡沾襟。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

唤起离情,慵推孤枕。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

寂寂珠帘蛛网满。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

揭起裙儿,一阵油盐酱醋香。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

拼沈醉、金荷须满。怕年年此际,催归禁篽,侍黄柑宴。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

山头望,波光泼眼。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:失调名
【内容】:

谁教幽梦里,插他花。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:十拍子/破阵子
【内容】:

白酒新开九酝,黄花已过重阳。身外傥来都似梦,醉里无何即是乡。东坡日月长。玉粉旋烹茶乳,金齑新捣橙香。强染霜髭扶翠袖,莫道狂夫不解狂。狂夫老更狂。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:食荔枝
【内容】:

罗浮山下四时春,
芦橘杨梅次第新;
日啖荔枝三百颗,
不辞长作岭南人。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:守岁诗
【内容】:

儿童强不食,相守应欢哗。晨鸡旦勿鸣,更鼓畏添过。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:双荷叶/忆秦娥
【内容】:

双溪月。清光遍照双荷叶。双荷叶。红心未偶,绿衣偷结。背风迎雨流珠滑。轻舟短棹先秋折。先秋折。烟鬟未上,玉杯微缺。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水调歌/水调
【内容】:

我歌月徘徊,我舞影凌乱。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水调歌头
【内容】:

安石在东海,从事鬓惊秋。中年亲友难别,丝竹缓离愁。一旦功成名遂,准拟东还海道,扶病入西州。雅志困轩冕,遗恨寄沧洲。岁云暮,须早计,要褐裘。故乡归去千里,佳处辄迟留。我醉歌时君和,醉倒须君扶我,惟酒可忘忧。一任刘玄德,相对卧高楼。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水调歌头
【内容】:

落日绣帘卷,亭下水连空。
知君为我新作,窗户湿青红。
长记平山堂上,欹枕江南烟雨,杳杳没孤鸿。
认得醉翁语,山色有无中。

一千顷,都镜净,倒碧峰。
忽然浪起,掀舞一叶白头翁。
堪笑兰台公子,未解庄生天籁,刚道有雌雄。
一点浩然气,千里快哉风。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水调歌头
【内容】:

明月几时有,把酒问青天。
不知天上宫阙,今夕是何年?
我欲乘风归去,又恐琼楼玉宇,
高处不胜寒。
起舞弄清影,何似在人间!

转朱阁,低绮户,照无眠。
不应有恨,何事长向别时圆?
人有悲欢离合,月有阴晴圆缺,
此事古难全。
但愿人长久,千里共婵娟
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水龙吟
【内容】:

楚山修竹如云,异材秀出千林表。龙须半翦,凤膺微涨,玉肌匀绕。木落淮南,雨晴云梦,月明风袅。自中郎不见,桓伊去後,知孤负、秋多少。闻道岭南太守,後堂深、绿珠娇小。绮窗学弄,梁州初遍,霓裳未了。嚼徵含宫,泛商流羽,一声云杪。为使君洗尽,蛮风瘴雨,作霜天晓。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水龙吟
【内容】:

古来云海茫茫,道山绛阙知何处。人间自有,赤城居士,龙蟠凤举。清净无为,坐忘遗照,八篇奇语。向玉霄东望,蓬莱暗霭,有云驾、骖风驭。行尽九州四海,笑纷纷、落花飞絮。临江一见,谪仙风采,无言心许。八表神游,浩然相对,酒酣箕踞。待垂天赋就,骑鲸路稳,约相将去。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水龙吟
【内容】:

露寒烟冷蒹葭老,天外征鸿寥唳。银河秋晚,长门灯悄,一声初至。应念潇湘,岸遥人静,水多菰米。□望极平田,徘徊欲下,依前被、风惊起。须信衡阳万里。有谁家、锦书遥寄。万重云外,斜行横阵,才疏又缀。仙掌月明,石头城下,影摇寒水。念征衣未捣,佳人拂杵,有盈盈泪。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水龙吟
【内容】:

似花还似非花,也无人惜从教坠。
抛家傍路,思量却是,无情有思。
萦损柔肠,困酣妖眼,欲开还闭。
梦随风万里,寻郎去处,又还被,莺呼起。

不恨此花飞尽,恨西园,落红难缀。
晓来雨过,遗踪何在? 一池萍碎。
春色三分,二分尘土,一分流水。
细看来,不是杨花,点点是离人泪。
【注释】

①次韵:依照别人的原韵和诗或词。 章质夫:名栥(jié),字质夫,福建蒲城
人,历仕哲宗、徽宗两朝,为苏轼好友,其咏杨花词《水龙吟》是传诵一时的名作。
②“思量”两句:指杨花看似无情,实际却自有其愁思。 思:意思,思绪。
③“困酣”二句:用美女困倦时眼睛欲开还闭之态来形容杨花的忽飘忽坠、时起时
落。

【评解】

这首咏物词,当作于苏轼贬黄州时期。其间,诗人的好友章质夫有咏杨花词《水龙
吟》一首,盛传一时,诗人因依原韵和了这首词寄去,并嘱“不以示人”。词中通过丰
富的想象和独特的艺术构思,运用拟人化手法,把咏物和写人有机地结合在一起,“即
物即人,两不能别”。全词写得声韵谐婉,情调幽怨缠绵。反映了苏词婉约的一面。

【集评】

王国维《人间词话》:东坡杨花词,和韵而似原唱;章质夫词原唱而似和韵。
朱弁《曲洧旧闻》:章质夫杨花词,命意用事,潇洒可喜。东坡和之,若豪放不入
律吕。徐而视之,声韵谐婉,反觉章词有织绣工夫。
魏庆之《诗人玉屑》:章质夫咏杨花词,东坡和之,晁叔用以为:
“东坡如王嫱、西施,净洗脚面,与天下妇人斗好,质夫岂可比哉!”是则然也。
余以为质夫词中所谓“傍珠帘散漫,垂垂欲下,依前被风扶起”,亦可谓曲尽杨花妙处,
东坡所和虽高,恐未能及,诗人议论不公如此。
唐圭璋等《唐宋词选注》:本词是和作。咏物拟人,缠绵多态。词中刻画了一个思
妇的形象。萦损柔肠,困酣娇眼,随风万里,寻郎去处,是写杨花,亦是写思妇,可说
是遗貌而得其神。而杨花飞尽化作“离人泪”,更生动地写出她候人不归所产生的幽怨。
能以杨花喻人,在对杨花的描写过程中,完成对人物形象的塑造。这比章质夫的闺怨词
要高一层。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水龙吟
【内容】:

小沟东接长江,柳堤苇岸连云际。烟村潇洒,人闲一哄,渔樵早市。永昼端居,寸阴虚度,了成何事。但丝莼玉藕,珠粳锦鲤,相留恋,又经岁。因念浮丘旧侣,惯瑶池、羽觞沈醉。青鸾歌舞,铢衣摇曳,壶中天地。飘堕人间,步虚声断,寒露风细。抱素琴,独向银蟾影里,此怀难寄。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:水龙吟
【内容】:

小舟横截春江,卧看翠壁红楼起。云间笑语,使君高会,佳人半醉。危柱哀弦,艳歌馀响,绕云萦水。念故人老大,风流未减,独回首、烟波里。推枕惘然不见,但空江、月明千里。五湖闻道,扁舟归去,仍携西子。云梦南州,武昌南岸,昔游应记。料多情梦里,端来见我,也参差是。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:苏幕遮
【内容】:

暑笼晴,风解愠。雨後馀清,暗袭衣裾润。一局选仙逃暑困。笑指尊前、谁向青霄近。整金盆,轮玉笋。凤驾鸾车,谁敢争先进。重五休言升最紧。纵有碧油,到了输堂印。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:诉衷情
【内容】:

钱塘风景古来奇。太守例能诗。先驱负弩何在,心已誓江西。花尽後,叶飞时。雨凄凄。若为情绪,更问新官,向旧官啼。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:诉衷情
【内容】:

小莲初上琵琶弦。弹破碧云天。分明绣阁幽恨,都向曲中传。肤莹玉,鬓梳蝉。绮窗前。素蛾今夜,故故随人,似斗婵娟。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:踏青游
【内容】:

□火初晴,绿遍禁池芳草。斗锦绣、火城驰道。踏青游,拾翠惜,袜罗弓小。莲步袅。腰支佩兰轻妙。行过上林春好。今困天涯,何限旧情相恼。念摇落、玉京寒早。任刘郎、目断蓬山难到。仙梦杳。良宵又过了。楼台万家清晓。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:踏莎行
【内容】:

山秀芙蓉,溪明罨画。真游洞穴沧波下。临风慨想斩蛟灵,长桥千载犹横跨。解佩投簪,求田问舍。黄鸡白酒渔樵社。元龙非复少时豪,耳根洗尽功名话。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:踏莎行
【内容】:

这个秃奴,修行忒煞。云山顶上空持戒。一从迷恋玉楼人,鹑衣百结浑无奈。毒手伤人,花容粉碎。空空色色今何在。臂间刺道苦相思,这回还了相思债。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:桃源忆故人
【内容】:

华胥梦断人何处。听得莺啼红树。几点蔷薇香雨。寂寞闲庭户。暖风不解留花住。片片著人无数。楼上望春归去。芳草迷归路。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:题西林壁
【内容】:

横看成岭侧成峰,远近高低各不同。
不识庐山真面目,只缘身在此山中。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:殢人娇
【内容】:

白发苍颜,正是维摩境界。空方丈、散花何碍。朱唇箸点,更髻鬟生彩。这些个,千生万生只在。好事心肠,著人情态。闲窗下、敛云凝黛。明朝端午,待学纫兰为佩。寻一首好诗,要书裙带。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:殢人娇
【内容】:

别驾来时,灯火荧煌无数。向青琐、隙中偷覰。元来便是,共采鸾仙侣。方见了,管须低声说与。百子流苏,千枝宝炬。人间有、洞房烟雾。春来何事,故抛人别处。坐望断,楼中远山归路。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:殢人娇
【内容】:

满院桃花,尽是刘郎未见。於中更、一枝纤软。仙家日月,笑人间春晚。浓睡起,惊飞乱红千片。密意难传,羞容易变。平白地、为伊肠断。问君终日,怎安排心眼。须信道,司空自来见惯。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:天仙子
【内容】:

走马探花花发未。人与化工俱不易。千回来绕百回看,蜂作婢。莺为使。谷雨清明空屈指。白发卢郎情未已。一夜翦刀收玉蕊。尊前还对断肠红,人有泪。花无意。明日酒醒应满地。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:望湖楼醉书五绝
【内容】:

黑云翻墨未遮山,
白雨跳珠乱入船。
卷地风来忽吹散,
望湖楼下水如天。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:望江南
【内容】:

春未老,
风细柳斜斜。 
试上超然台上看,
半壕春水一城花, 
烟雨暗千家。 

寒食后,
酒醒却咨嗟。 
休对故人思故国,
且将新火试新茶, 
诗酒趁年华。 
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:望江南/忆江南
【内容】:

春已老,春服几时成。曲水浪低蕉叶稳,舞雩风软纻罗轻。酣咏乐升平。微雨过,何处不催耕。百舌无言桃李尽,柘林深处鹁鸪鸣。春色属芜菁。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:乌夜啼
【内容】:

莫怪归心甚速,西湖自有蛾眉。若见故人须细说,白发倍当时。小郑非常强记,二南依旧能诗。更有鲈鱼堪切脍,儿辈莫教知。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:西江月十五首
【内容】:

碧雾轻笼两凤,寒烟淡拂双鸦。为谁流睇不归家。错认门前过马。有意偷回笑眼,无言强整衣纱。刘郎一见武陵花。从此春心荡也。


别梦已随流水,泪巾犹裛香泉。相如依旧是臞仙。人在瑶台阆苑。花雾萦风缥缈,歌珠滴水清圆。蛾眉新作十分妍。走马归来便面。


点点楼头细雨,重重江外平湖。当年戏马会东徐,今日凄凉南浦。莫恨黄花未吐,且教红粉相扶。酒阑不必看茱萸,俯仰人间今古。


公子眼花乱发,老夫鼻观先通。领巾飘下瑞香风。惊起谪仙春梦。后土祠中玉蕊,蓬莱殿後鞓红。此花清绝更纤秾。把酒何人心动。


怪此花枝怨泣,托君诗句名通。凭将草木记吴风。继取相如云梦。点笔袖沾醉墨,谤花面有惭红。知君却是为情秾。怕见此花撩动。


龙焙今年绝品,谷帘自古珍泉。雪芽双井散神仙。苗裔来从北苑。汤发云腴酽白,盏浮花乳轻圆。人间谁敢更争妍。斗取红窗粉面。


马趁香微路远,沙笼月淡烟斜。渡波清彻映妍华。倒绿枝寒凤挂。挂凤寒枝绿倒,华妍映彻清波。渡斜烟淡月笼沙。远路微香趁马。


莫叹平原落落,且应去鲁迟迟。与君各记少年时。须信人生如寄。白发千茎相送,深杯百罚休辞。拍浮何用酒为池。我已为君德醉。


三过平山堂下,半生弹指声中。十年不见老仙翁。壁上龙蛇飞动。欲吊文章太守,仍歌杨柳春风。休言万事转头空。未转头时皆梦。


世事一场大梦,人生几度秋凉。夜来风叶已鸣廊。看取眉头鬓上。酒贱常愁客少,月明多被云妨。中秋谁与共孤光。把盏凄然北望。


闻道双衔凤带,不妨单著鲛绡。夜香知与阿谁烧。怅望水沈烟袅。云鬓风前绿卷,玉颜醉里红潮。莫教空度可怜宵。月与佳人共僚。


小院朱阑几曲,重城画鼓三通。更看微月转光风。归去香云入梦。翠袖争浮大白,皂罗半插斜红。灯花零落酒花秾。妙语一时飞动。


玉骨那愁瘴雾,冰姿自有仙风。海仙时遣探芳丛。倒挂绿毛么凤。素面翻嫌粉涴,洗妆不褪唇红。高情已逐晓云空。不与梨花同梦。


照野弥弥浅浪,横空暧暧微霄。障泥未解玉骢骄。我欲醉眠芳草。可惜一溪明月,莫教踏破琼瑶。解鞍敧枕绿杨桥。杜宇一声春晓。


昨夜扁舟京口,今朝马首长安。旧官何物与新官。只有湖山公案。此景百年几变,个中下语千难。使君才气卷波澜。与把新诗判断。



以上苏轼作品《西江月》共15首
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

北望平川。野水荒湾。共寻春、飞步孱颜。和风弄袖,香雾萦鬟。正酒酣时,人语笑,白云间。飞鸿落照,相将归去,澹娟娟、玉宇清闲。何人无事,宴坐空山。望长桥上,灯火乱,使君还。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

绮席才终。欢意犹浓。酒阑时、高兴无穷。共夸君赐,初拆臣封。看分香饼,黄金缕,密云龙。斗赢一水,功敌千锺。觉凉生、两腋清风。暂留红袖,少却纱笼。放笙歌散,庭馆静,略从容。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

清夜无尘,月色如银。
酒斟时,须满十分。
浮名浮利,虚苦劳神。
叹隙中驹,石中火,梦中身。

虽抱文章,开口谁亲。
且陶陶,乐尽天真。
几时归去,作个闲人。
对一长琴,一壶酒,一溪云。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

三入承明。四至九卿。问书生、何辱何荣。金张七叶,纨绮貂缨。无汗马事,不献赋,不明经。成都卜肆,寂莫君平。郑子真、岩谷躬耕。寒灰炙手,人重人轻。除竺乾学,得无念,得无名。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

携手江村。梅雪飘裙。情何限、处处消魂。故人不见,旧曲重闻。向望湖楼,孤山寺,涌金门。寻常行处,题诗千首,绣罗衫、与拂红尘。别来相忆,知是何人。有湖中月,江边柳,陇头云。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

一叶舟轻,双桨鸿惊。
水天清、影湛波平。
鱼翻藻鉴,鹭点烟汀。
过沙溪急,霜溪冷,月溪明。

重重似画,曲曲如屏。
算当年、虚老严陵。[1]
君臣一梦,今古空名。
但远山长,云山乱,晓山青。
【注释】:
[1]:东汉初年的严子陵,帮助刘秀打下天下之后,隐居不仕,垂钓富春江上。后人多言其“钓名”。
本词将水上行舟的“静美”,和时空变化的“动美”结合的十分完美。语言清丽浅显,意境广渺深邃。全诗有一种“淡淡的哀伤”,具有东坡一贯的“人生如梦”思想。

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:行香子
【内容】:

昨夜霜风。先入梧桐。浑无处、回避衰容。问公何事,不语书空。但一回醉,一回病,一回慵。朝来庭下,光阴如箭,似无言、有意伤侬。都将万事,付与千锺。任酒花白,眼花乱,烛花红。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阳关曲
【内容】:

济南春好雪初晴。才到龙山马足轻。使君莫忘霅溪女,还作阳关肠断声。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阳关曲
【内容】:

暮云收尽溢清寒。银汗无声转玉盘。此声此夜不长好,明月明年何处看。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:阳关曲
【内容】:

受降城下紫髯郎。戏马台南旧战场。恨君不取契丹首,金甲牙旗归故乡。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:瑶池燕
【内容】:

飞花成阵。春心困。寸寸。别肠多少愁闷。无人问。偷啼自搵。残妆粉。抱瑶琴、寻出新韵。玉纤趁。南风来解幽愠。低云鬟、眉峰敛晕。娇和恨。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:谒金门
【内容】:

今夜雨。断送一年残暑。坐听潮声来别浦。明朝何处去。孤负金尊绿醑。来岁今宵圆否。酒醒梦回愁几许。夜阑还独语。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:谒金门
【内容】:

秋池阁。风傍晓庭帘幕。霜叶未衰吹未落。半惊鸦喜鹊。自笑浮名情薄。似与世人疏略。一片懒心双懒脚。好教闲处著。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:谒金门
【内容】:

秋帷里。长漏伴人无寐。低玉枕凉轻绣被。一番秋气味。晓色又侵窗纸。窗外鸡声初起。声断几声还到耳。已明声未已。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:一丛花
【内容】:

今年春浅腊侵年。冰雪破春妍。东风有信无人见,露微意、柳际花边。寒夜纵长,孤衾易暖,钟鼓渐清圆。朝来初日半含山。楼阁淡疏烟。游人便作寻芳计,小桃杏、应已争先。衰病少情,疏慵自放,惟爱日高眠。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:一斛珠
【内容】:

洛城春晚。垂杨乱掩红楼半。小池轻浪纹如篆。烛下花前,曾醉离歌宴。自惜风流云雨散。关山有限情无限。待君重见寻芳伴。为说相思、目断西楼燕。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:饮湖上,初晴后雨
【内容】:

水光潋滟晴方好,山色空蒙雨亦奇。
欲把西湖比西子,淡妆浓抹总相宜。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:永遇乐
【内容】:

长忆别时,景疏楼上,明月如水。美酒清歌,留连不住,月随人千里。别来三度,孤光又满,冷落共谁同醉。卷珠帘,凄然顾影,共伊到明无寐。今朝有客,来从淮上,能道使君深意。凭仗清淮,分明到海,中有相思泪。而今何在,西垣清禁,夜永露华侵被。此时看,回廊晓月,也应暗记。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:永遇乐
【内容】:

明月如霜,好风如水,清景无限。曲港跳鱼,圆荷泻露,寂寞无人见。紞如三鼓,铿然一叶,黯黯梦云惊断。夜茫茫,重寻无处,觉来小园行遍。天涯倦客,山中归路,望断故园心眼。燕子楼空,佳人何在,空锁楼中燕。古今如梦,何曾梦觉,但有旧欢新怨。异时对,黄楼夜景,为余浩叹。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔父/渔歌子
【内容】:

渔父笑,轻鸥举。漠漠一江风雨。江边骑马是官人,借我孤舟南渡。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔父/渔歌子
【内容】:

渔父醒,春江午。梦断落花飞絮。酒醒还醉醉还醒,一笑人间今古。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔父/渔歌子
【内容】:

渔父饮,谁家去。鱼蟹一时分付。酒无多少醉为期,彼此不论钱数。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔父/渔歌子
【内容】:

渔父醉,蓑衣舞。醉里却寻归路。轻舟短棹任斜横,醒後不知何处。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔家傲
【内容】:

皎皎牵牛河汉女。盈盈临水无由语。望断碧云空日暮。无寻处。梦回芳草生春浦。鸟散馀花纷似雨。汀洲苹老香风度。明月多情来照户。但揽取。清光长送人归去。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔家傲
【内容】:

临水纵横回晚鞚。归来转觉情怀动。梅笛烟中闻几弄。秋阴重。西山雪淡云凝冻。美酒一杯谁与共。尊前舞雪狂歌送。腰跨金鱼旌旆拥。将何用。只堪妆点浮生梦。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔家傲
【内容】:

千古龙蟠并虎踞。从公一吊兴亡处。渺渺斜风吹细雨。芳草渡。江南父老留公住。公驾飞车凌彩雾。红鸾骖乘青鸾驭。却讶此洲名白鹭。非吾侣。翩然欲下还飞去。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔家傲
【内容】:

送客归来灯火尽。西楼淡月凉生晕。明日潮来无定准。潮来稳。舟横渡口重城近。江水似知孤客恨。南风为解佳人愠。莫学时流轻久困。频寄问。钱塘江上须忠信。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔家傲
【内容】:

些小白须何用染。几人得见星星点。作郡浮光虽似箭。君莫厌。也应胜我三年贬。我欲自嗟还不敢。向来三郡宁非忝。婚嫁事稀年冉冉。知有渐。千钧重担从头减。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:渔家傲
【内容】:

一曲阳关情几许,知君欲向秦川去。
白马皂貂留不住。
回首处,孤城不见天霖雾。

到日长安花似雨,故关杨柳初飞絮。
渐见靴刀迎夹路。
谁得似,风流膝上王文度。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

冰肌自是生来瘦。那更分飞後。日长帘暮望黄昏。及至黄昏时候、转销魂。君还知道相思苦。怎忍抛奴去。不辞迢递过关山。只恐别郎容易、见郎难。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

波声拍枕长淮晓。隙月窥人小。无情汴水自东流。只载一船离恨、向西州。竹溪花浦曾同醉。酒味多於泪。谁教风鉴在尘埃。酝造一场烦恼、送人来。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

持杯遥劝天边月。愿月圆无缺。持杯复更劝花枝。且愿花枝长在、莫离披。持杯月下花前醉。休问荣枯事。此欢能有几人知。对酒逢花不饮、待何时。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

定场贺老今何在。几度新声改。怨声坐使旧声阑。俗耳只知繁手、不须弹。断弦拭问谁能晓。七岁文姬小。拭教弹作辊雷声。应有开元遗老、泪纵横。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

归心正似三春草。拭著莱衣小。橘怀几日向翁开。怀祖已瞋文度、不归来。禅心已断人间爱。只有平交在。笑论瓜葛一枰同。看取灵光新赋、有家风。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

湖山信是东南美,一望弥千里。
使君能得几回来?便使尊前醉倒且徘徊。

沙河塘里灯初上,水调谁家唱。
夜阑风静欲归时,惟有一江明月碧琉璃。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:虞美人
【内容】:

深深庭院清明过。桃李初红破。柳丝搭在玉阑干。帘外潇潇微雨、做轻寒。晚晴台榭增明媚。已拼花前醉。更阑人静月侵廊。独自行来行去、好思量。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:雨中花/夜行船
【内容】:

今岁花时深院,尽日东风,荡扬茶烟。但有绿苔芳草,柳絮榆钱。闻道城西,长廊古寺,甲第名园。有国艳带酒,天香染袂,为我留连。清明过了,残红无处,对此泪洒尊前。秋向晚,一枝何事,向我依然。高会聊追短景,清商不暇馀妍。不如留取,十分春态,付与明年。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:雨中花慢
【内容】:

嫩脸羞蛾,因甚化作行云,却返巫阳。但有寒灯孤枕,皓月空床。长记当初,乍谐云雨,便学鸾凰。又岂料、正好三春桃李,一夜风霜。丹青□画,无言无笑,看了漫结愁肠。襟袖上,犹存残黛,渐减馀香。一自醉中忘了,奈何酒後思量。算应付你,枕前珠泪,万点千行。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:雨中花慢
【内容】:

邃院重帘何处,惹得多情,愁对风光。睡起酒阑花谢,蝶乱蜂忙。今夜何人,吹笙北岭,待月西厢。空怅望处,一株红杏,斜倚低墙。羞颜易变,傍人先觉,到处被著猜防。谁信道,些儿恩爱,无限凄凉。好事若无间阻,幽欢却是寻常。一般滋味,就中香美,除是偷尝。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:皂罗特髻
【内容】:

采菱拾翠,算似此佳名,阿谁消得。采菱拾翠,称使君知客。千金买、采菱拾翠,更罗裙、满把珍珠结。采菱拾翠,正髻鬟初合。真个、采菱拾翠,但深怜轻拍。一双手、采菱拾翠,绣衾下、抱著俱香滑。采菱拾翠,待到京寻觅。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:赠刘景文
【内容】:

荷尽已无擎雨盖,菊残犹有傲霜枝。
一年好景君须记,最是橙黄橘绿时。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:占春芳
【内容】:

红杏了,夭桃尽,独自占春芳。不比人间兰麝,自然透骨生香。对酒莫相忘。似佳人、兼合明光。只忧长笛吹花落,除是宁王。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:昭君怨
【内容】:

谁作桓伊三弄。惊破绿窗幽梦。新月与愁烟。满江天。欲去又还不去。明日落花飞絮。飞絮送行舟。水东流。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:鹧鸪天
【内容】:

林断山明竹隐墙, 
乱蝉衰草小池塘。 
翻空白鸟时时见,
照水红蕖细细香。 

村舍外,
古城旁, 
杖藜徐步转斜阳。 
殷勤昨夜三更雨,
又得浮生一日凉。 
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:鹧鸪天
【内容】:

罗带双垂画不成。殢人娇态最轻盈。酥胸斜抱天边月,玉手轻弹水面冰。无限事,许多情。四弦丝竹苦丁宁。饶君拨尽相思调,待听梧桐叶落声。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:鹧鸪天
【内容】:

笑拈红梅亸翠翘。扬州十里最妖饶。夜来绮席亲曾见,撮得精神滴滴娇。娇後眼,舞时腰。刘郎几度欲魂消。明朝酒醒知何处,肠断云间紫玉箫。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:中秋月
【内容】:

暮云收尽溢清寒,银汉无声转玉盘。
此生此夜不长好,明月明年何处看。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:祝英台近
【内容】:

挂轻帆,飞急桨,还过钓台路。酒病无聊,敧枕听鸣橹。断肠簇簇云山,重重烟树,回首望、孤城何处。闲离阻。谁念萦损襄王,何曾梦云雨。旧恨前欢,心事两无据。要知欲见无由,痴心犹自,倩人道、一声传语。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:醉落魄/一斛珠
【内容】:

苍颜华发。故山归计何时决。旧交新贵音书绝。惟有佳人,犹作殷勤别。离亭欲去歌声咽。潇潇细雨凉吹颊。泪珠不用罗巾裛。弹在罗衣,图得见时说。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:醉落魄/一斛珠
【内容】:

分携如昨。人生到处萍飘泊。偶然相聚还离索。多病多愁,须信从来错。尊前一笑休辞却。天涯同是伤沦落。故山犹负平生约。西望峨嵋,长羡归飞鹤。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:醉落魄/一斛珠
【内容】:

轻云微月。二更酒醒船初发。孤城回望苍烟合。公子佳人,不记归时节。巾偏扇坠藤床滑。觉来幽梦无人说。此生飘荡何时歇。家在西南,长作东南别。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:醉落魄/一斛珠
【内容】:

醉醒醒醉。凭君会取这滋味。浓斟琥珀香浮蚁。一到愁肠,别有阳春意。须将幕席为天地。歌前起舞花前睡。从他落魄陶陶里。犹胜醒醒,惹得闲憔悴。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:醉蓬莱
【内容】:

笑劳生一梦,羁旅三年,又还重九。华发萧萧,对荒园搔首。赖有多情,好饮无事,似古人贤守。岁岁登高,年年落帽,物华依旧。此会应须烂醉,仍把紫菊茱萸,细看重嗅。摇落霜风,有手栽双柳。来岁今朝,为我西顾,酹羽觞江口。会与州人,饮公遗爱,一江醇酎。
【注释】:

第一首 | 上一首 |  下一首 | 最后一首

第一首 | 上一首 |  下一首 | 最后一首

【年代】:宋
【作者】:苏轼
【作品】:醉翁操
【内容】:

琅然。清圜。谁弹。响空山。无言。惟翁醉中知其天。月明风露娟娟。人未眠。荷蒉过山前。曰有心也哉此贤。醉翁啸咏,声和流泉。醉翁去後,空有朝吟夜怨。山有时而童巅。水有时而回川。思翁无岁年。翁今为飞仙。此意在人间。拭听徽外三两弦。
2005年04月25日

菜鸟进阶之城堡篇(转贴)

菜鸟进阶之城堡篇(一)  




帝国进行到漫长的城堡时代以后,无论是经济、军事都与封建有了非常大的变化,兵种威力也有大幅度的增强,而且出现了攻城武器、城堡等有可能改变战局的东西,帝国里多个民族在城堡时代已经开始慢慢显露出他的特色出来。  


如果细细的讲解的话,估计三天三夜也说不完,我在这里分析的城堡时代特点,主要是建立在匈奴、单条的基础上说的,而其他的民族我在这里就不做太多的讲解了。


城堡与封建最大的区别,就是能够开TC了,但是TC开的多少,在把握上,很多人掌握不好,为什么会这样呢?这就是我经常说的打局没有思路。如果你能理解了城堡的特点,你就知道在这个阶段你应该干什么,用什么兵种,强化军事还是以经济为主。下面我将从几个方面来分析,帮助大家对城堡时代有一个更深刻的理解。

一。一般说来,我把城堡时代从时间上分为三个阶段:
第一阶段我称之为骚扰期,这一阶段里,双方的骑士、长枪都不是太多,防守不是太严密,如果有优秀的操作能力,分兵骚扰的话,在这一阶段甚至可以给与敌人致命性的打击;而且,这一阶段由于敌人很有可能出去开TC,少量在外游荡的骑士非常有可能发现不受保护的农民。
在这一阶段里,一个骑士换一个农民已经是够本了的,即使杀不到农民,让敌人一段时间不能工作,即使双方农民总数相差不大,经济的差距也会拉大;为以后打下坚实的基础。

第二阶段是疯狂boom的阶段,由于军事力量与对手达到相对的均衡,关键部位基本上都已经有TC、长枪的保护,简单的骚扰、少量的骑士已经占不到太大的便宜了,而这时的重点应该放在家里,按照自己的思路爆兵,努力boom,这个时期将为以后的发展打下坚实的基础。

第三个阶段是城堡后期,这个时期的变化主要是要么没有爆满人口抢先升级帝王,要么就是城堡后期的强攻。

使用匈奴这个民族,城堡时期将是他力量最大的时期,骑士毕竟是城堡时代威力最大的兵种,马房的加速、没有了房子的压力、便宜的骑射、全部的城堡科技使得匈奴这个进攻性的民族的优势达到了极致。

二。城堡的常用兵种—-主力兵种
所谓主力兵种,顾名思义,就是军事构成中数量最多的兵种;一个人的主力兵种一般最多只有两个,其他的叫辅助兵种;主力兵种的选择至关重要,它决定了你的经济调整的思路和方向。而主流打法中,能够作为匈奴的主力兵种的只有三个:

1。骑士。骑士应用的好坏,将是一个选手城堡力量好坏的最大的依据;骑士这个兵种无可置疑是城堡时代的最厉害的兵种,单兵作战能力极强,即使没有血统,也没有任何一个其他兵种能够匹敌。而骑士的用处在城堡初期的骚扰作用更是无可替代的,而且在城堡中后期,保持一定数量的骑士对付骑射、散兵、攻城武器,也是防守的必然。但是由于对黄金的依赖太大,越到后期,他的作用就越来越不明显了。
骑士最关键的科技当然是血统,然后是一级攻防;如果使用骑士作为主力的话,驯马术、二级攻防也是做主力攻击之前必升的科技。

2。长枪。可以说长枪是城堡阶段的最优秀的兵种也不为过,生产速度快,只用木粮,价格便宜,对骑士、骑射攻击的加成,使得他不但在骑士面前毫不逊色,就是在数量不多的骑射面前也是所向披靡。由于匈奴没有了顶级的劲弩,城堡阶段弩手出现的几率很小,没有了这个天敌,更使得长枪的应用在常见的匈奴对战中发挥到极致。可以毫不夸张地说,不但防守打法的主力兵种必然有长枪的位置,即使进攻打法,基本上双方军事力量均势、尤其是落后的状况下,一定是长枪为主力之一发起的进攻。
长枪最重要的科技是一级防守、二级防守、速度。

3。骑射。骑射的应用主要是匈奴和蒙古两个民族。而匈奴便宜的价格,快速的机动性是使用骑射的最大原因。配合骑射作战的骑士,是经济占了上风的一方几乎必然的进攻选择;良好的机动性,使得强大的骑射+骑士的军事组合,能够很轻易的对任何一个地方发起毁灭性的攻击。而后期的骚扰,使用骑射要比使用骑士好用得多,少量的长枪对于骑射来说,根本没有任何力量。但是骑射对于黄金的要求同样很高,而且要求的控制力很高,没有了控制的骑射很容易死在tc、骑士、长枪的攻击下。
骑射作为远程攻击系的兵种之一,当然射程是最重要的,一级攻击、二级攻击没有升级之前,骑射的威力很小;作为主力的骑射,必升科技应该是指环,没有指环的骑射攻击成功率很低的。而相对便宜的一级、二级防守,主要是为了能够保证在tc、城堡的攻击下多活几天,能够保证骑射面对骑士军团的攻击下,能够幸存下来。

菜鸟进阶之城堡篇(二)  




三。城堡时代的典型打法,及主力兵种的选择:  

1。主力纯马,也就是马爆。马爆是城堡时代的典型打法,可以说所有的菜鸟、高手都自觉不自觉的学习过马爆,甚至直到现在还有专门的不允许出枪的马爆局游戏规则。不过,打玩了封快以后的马爆,他的经济特点、应用场合可是说大多数的菜鸟选手都并不清楚。因此,我们经常看到落后局势下依然爆马防守现象出现。
目的:骚扰敌人,一匹骑士最少换取对方一个农民的生命,疯狂的骚扰,直至对方破产或者满地都是长枪、骑士结束。

应用场合:比对手早到城堡经济相差不多,或者比对手晚到城堡但是经济比对手好很多;注意,比对手晚到城堡经济封建经济遭受过重创的,同样也会使用骑士骚扰,但是这时重点在防守而不是马爆;

使用宗旨:打马爆的意义在于骚扰敌人,破坏经济,最后达到敌人所有的资源点都有我们的骑士在攻击,直至敌人崩溃;或者敌人四处充满了长枪的防守。

使用方法:首先把骑士的聚集点放在对手黄金上,第一匹马在你的控制下,开始攻击第一攻击点黄金,这里肯定是敌人重兵布防的地带,没问题马上带着追兵去下一个攻击点,如果敌人没有追你,那么马上停下来攻击附近的农民;第二波马过来,同样操作,没有敌人的话,攻击黄金,有追兵,则开始攻击其他地方;对方死守黄金的话,把骑士的聚集点放在对方木头上;注意,哪怕是对手很少的长矛、长枪防守,也不要攻击它,去绕开他,打农民是第一重要的事情;

这时候,人的心理要非常的冷静而且疯狂;冷静是你要发现敌人周围所有的木头、黄金、石头,这些都是你的攻击目标,一个地方有防守马上换地攻击,将此地的防守带走,下一波马再次攻击此地;冷静也是指,不停的拉开,再次攻击,拉开,再次攻击,如果有少量长毛、长枪防守你能打过,那也只有当地有农民的情况下,才能停留;疯狂,就是指不要怕TC的箭,不要怕少量的长矛,只要有农民停留,就把她砍死!!

操作的技巧之一,善用F键,敌人追来了,用F分成两队,如果敌人追击其中一队,那么另一队就可以开始砍附近的农民了,被追击的一队还可以继续用F分开,拉开敌人的防守兵力。

如果一两分钟之内,敌人依然无法组织起有效的防守,那么恭喜你,你可以真正的马爆了,这时候最多开两个TC,如果已经压制住对手,甚至可以单TC,减小出农造成的粮食压力,再增加一到两个马房,保持四到五个马房出马,开辟第二个金矿,大量种田、采金;全部兵力继续骚扰对手,这样的话,对手只有两个下场,第一被马爆活活打死,第二经济受到极大的影响,农民死伤惨重,这是可能分数相差不大,但是当你停兵开始boom的时候,分数差距就会急剧增大。

极具针对性地经济调整,全力的采金、种田,不开TC,会使你的军事力量得到急速的膨胀,在对手没有过多长枪的情况下,会使封建时已经领先的形势迅速转化为胜势。甚至封建持平,双方均势,也有可能在简单的F操作、一拉一攻操作下,使的操作不是太好的对手瞬间崩溃。

2。骑射+骑士组合;
在一段时间的骚扰之后,双方转为均势,或者自己占了上风;有很多人选择骑射+骑士的组合,因为这个组合是城堡时代,相同数量之下最具攻击力和机动性的军事组合。
同样是这种组合,防守打法和进攻打法却不尽相同。

进攻打法是强调军事的打法,在这种情况下,这一主力组合必须要求采集两块黄金才能满足持续不断的黄金需要。BOOM的速度将有可能比不上对手的速度,但是,在领先经济的情况下,这种组合已经足够给与敌人致命一击了。但是依据对方长枪的数量,骑射的数量要有一定的保证,基本上都是骑射压阵,如果足以让对方长枪逼退三舍得话,骑士直接砍TC就可以了。

防守打法是强调经济的打法,保持一定数量的长枪,但是防守力量主要是骑士+骑射在关键地带的防守加上TC,能够顶住敌人的骚扰;开始BOOM,这是采集资源以木头和石头为主,第二块黄金可以稍微晚一点再采集。但是由于兵力过少,极有可能需要建立城堡或者升级好长枪,保留一定数量的木头,防守对方的马爆、长枪爆的打法。这种打法主要是希望尽快过渡到帝王时代,但是城堡后期尤其要注意安全,一旦敌人爆兵,要有所防备。

3。骑士+长枪组合:
少量的骑士配以数量众多的长枪,可以说是阵地战中最富攻击力的打法。由于主力兵种要求的仅仅是木粮,经济控制上相当简单,有一块石头、一块金子,其他的TC聚集点全部放在木头上,控制所有的TC附近都种田,分散主TC的农田数量,对于防守来说有相当的好处。

这种主力组合,基本上适用于各种情况,不过对方不是匈奴喜欢使用弩手的慎用,对方骑射主力的,一定要保证至少数量相当的骑士才可能进攻有效;

从爆兵的感觉来讲有两种,一种是封建落后的打法,如果从升级到城堡开始,两个兵营持续不断的出长枪的话,一般不会给经济造成什么压力,而且能有效制止对方马爆对自己造成的伤害;从一开始就努力boom,骑士只需双马房减小经济压力,长枪为主,防守为主,一段时间的boom以后,人口将近120,长枪二三十个,一般有5、6个TC。开始升级长枪的所有科技,再加三到四个兵营出枪,保持一定数量的木头,不要都用来种田了,前线连开两个工程武器场,再开两三个兵营,把这时应该有四五十个的长枪全部拉出来进攻,如果对手不小心防守的话,落后一千分都有可能扳回来的。

长枪的使用可以说是最简单的兵种了,数量众多的长枪根本不用太多的控制,只需控制骑士把对方的骑射赶走,长枪+冲车推得相当的快的。而前方继续不断的出长枪,保持骑士的数量即可。

第二种感觉就是马爆结束,对对手的经济造成了一定的伤害,这是你的主力是骑士为主,这时由于过多的骚扰,造成军事力量的不如对手是非常有可能的,前面我说过,这时很有可能是你的农民大大超过对手,你这是最大的目的就是要保持经济的优势。出产长枪,盖TC进行BOOM、防守,等你稳定下来,经济优势转化到军事的优势上,骑士和长枪的组合会轻而易举的拿下对手。

防守长枪的进攻,批量骑射在有效的控制下,一进一退就会消耗长枪的数量;还有长枪的进攻,最好是在地形开阔的地方进行,这样的地形,骑射躲藏的机会会小很多;而且爆兵打法的关键就在数量,管你克制不克制,我就是要淹死你,这是爆兵应用的精髓所在,同样也适用于长枪打法。

这里,我一共介绍了三种主力兵种的组合,但是帝国的城堡变化远不止这些,还有相当多的小技巧数不胜数。但是从军事上来说,主流打法绝对超不出这个范围之外,可以说90%以上的对局都是这三种组合的变化。
如果,你能细细的看完上面的文章,看看录像领会在什么情况下应该是用什么组合,在对局中你会第一感觉当前形势下该做什么兵种,然后,再根据兵种的特性来调整经济,或是及早开第二块黄金,或是打定主意防守不做兵但是保留做兵的变化和准备工作;这样,你就知道了城堡原来就是这么简单。
知道了道理所在,有意识的控制下,你的经济有针对性,进攻、防守都会感觉如此的得心应手,这,就是帝国的乐趣所在。

2005年04月13日

使用NIS和NFS管理UNIX网络  

Matthew(黑夜编码人) <matthew@cnfug.org>

我想大多数的UNIX网络管理员或多或少的都有过类似于这样的麻烦:一个用户要在多台不同的UNIX系统上工作,要在不同的UNIX上登录,保存他们的文档等,而管理员就要在每一台UNIX系统上为他建立帐号,设置密码,设置组信息,建立目录,以便他能在所有的机器上正常工作。同时还要建立一台FTP服务器,每次用户必须将它的文件保存在这台FTP服务器上,然后当他登录到另外一台UNIX系统上的时候再从FTP服务器上取回他所需要的文件。这样不但麻烦,而且管理起来非常不便,因为一旦某天某个员工离职了,管理就要到每一台UNIX系统上去删除他的帐号和文件,来保证他不能在那些机器上登录。而且对于一些系统信息的管理也非常不便,比如每台机器上的hosts文件,你必须要在每台机器上建立一份相同hosts文件,以保证所有的机器的机器名和IP地址的对应都是正确的。可一但某天有哪台机器需要更改IP地址,这时管理员又只有为每一台UNIX机器更改它的hosts文件。

从上面的这些问题我们可以看到其实我们所更改的这些东西大部分都是完全相同的,相同的帐号,相同的目录和相同的hosts文件,如果机器少还没有什么,一旦你管理的机器超过200台,那么可能你这一整天的时间都会花在做这些重复的事上面。

也许你要问,那么那些大网络的UNIX管理员们是使用什么方法来解决这些问题的呢?当然他们不可能是为每一台机器更改这些设置,他们使用的就是今天我们要介绍的NIS和NFS服务。

下面我们就向你介绍在FreeBSD中建立NIS和NFS服务的思路及方法。
(注:下面为我们的实验环境)
cat.mydomain.nis OpenBSD3.3 NIS和NFS客户端
dog.mydomain.nis FreeBSD4.8 NIS主服务器和NFS服务器 (保存网络中所有用户的帐号信息,组信息和用户文件)
bee.mydomain.nis FreeBSD4.5 NIS辅服务器


1、使用NIS共享系统信息
NIS是Sun Microsystem开发的用于在UNIX系统间共享用户数据、组数据、主机数据、协议等数据的服务系统,它最早被命名为Yello Page,后来由于商标冲突被Sun重新命名为NIS,但很是有很多地方以YP来称乎它。由于NIS的出现对UNIX网络管理起到很大的推进,所以现在几乎所有的UNIX系统都对它提供了支持。当然FreeBSD系统也不例外,FreeBSD当前提供的主要是NIS v2,同时也提供了对NIS v1的兼容支持。
我们可以看到,如果一个用户要在多台UNIX系统上工作,他们大都使用相同的用户名、属于相同的组、使用相同的密码。那么我们可以将这些信息存放在一台机器上来统一进行管理,其它机器都从这台机器上来获得这些信息,一但要更改某个用户的信息,管理员就只需要在存放这些信息的机器上进行更改,其它机器就自动的收到更改后的信息,而不再需要管理员一一的进行设置了,这就是NIS工作的基本方式。
NIS使用域来管理那些需要共享的信息,这些信息就够成了NIS数据库,所有拥有相同域名的机器就可以共同使用所在域名的数据库。这些数据库被存放在一台机器上,这台机器就是NIS的主服务器,其它机器就都通过它来查询NIS数据库,但有时为了稳定性的考虑,也可以建立一台或多台NIS辅服务器,它们保持与NIS主服务器的数据同步,当主服务器出现故障时承担主服务器的任务。
下面就让我们来看看,如何在FreeBSD中建立NIS主服务器。

首先,因为NIS是基于域来管理的,所以就要为服务器设定域名,你可以通过domainname来查看你现在的域名(注意:这里的域名与DNS的域名没有任何关系,它只起来将一个网络划分为几个部分的作用,因而它可以为任何值,当然你也可以将它设置成你的DNS域名):

dog# domainname
mydomain.nis

如果上面显示为空,则表明你还没有设置你的域名,你同样可以通过domainname来设置和更改你的域名:

dog# domainname mydomain.nis

域名设置好以后,就开始进入后面的工作。
默认情况下,FreeBSD将每个域的NIS数据库存放在/var/yp/yourdomainname下面,你需要将你要共享的信息如master.passwd复制到/var/yp下面,这里需要提醒的是,因为FreeBSD默认使用MD5来加密用户口令,因而,如果你是在一个有多种UNIX系统的网络中,而且某些UNIX不支持MD5加密的话,你就需要更改你的密码加密方式为这些UNIX都支持的加密方法(如DES),否则用户将无法在那些机器上登录。
更改FreeBSD默认加密方式的方法如下:

dog# vi /etc/login.conf

然后编辑用户所在的类(通过如果没有指定的话就是default类),在其后加入:passwd_format=des:\(其中des代表DES加密,md5代表MD5加密,blf代表Blowfish加密),例如:

default:\
:passwd_format=des:\
:datasize=infinity:\

保存退出后,需要使用使用cap_mkdb来生成BD(Berkeley Database)格式的数据库文件:

dog# cap_mkdb /etc/login.conf

这样便会在/etc目录下更新(或生成)login.conf.db文件。
现在我们只是更改了密码的默认加密方式,而真正的密码还没有改变,因而需要使用passwd命令来更改每一个需要共享出来的用户的口令,然后将master.passwd复制到/var/yp目录下,为了安全应该更改一下master.passwd文件的权限:

dog# cp /etc/master.passwd /var/yp/master.passwd
dog# chmod 0600 /var/yp/master.passwd

同样考虑到安全的因素,最好删除那些你不需要和不应该共享的用户(比如:root用户和系统默认用户bin,daemon等)
现在我们就可以初始化我们的NIS主服务器了,初始化使用ypinit(8)命令:

dog# cd /var/yp
dog# ypinit -m mydomain.nis

这里-m表示生成主服务器,而mydomain.nis是你的域名。
在初始化过程中,你会被提及一些问题:

Do you want this procedure to quit on non-fatal errors? [y/n: n] 直接选择n

然后就是设置NIS服务器的名字,包括主服务器和辅服务器,因为这里我们只有一台主服务器,因而直接按Ctrl-D退出,如果你打算再建几台辅服务器的的话就输你的NIS辅服务器的名字。然后会显示你的服务器信息:

The current list of NIS servers looks like this:

dog.mattcell.com

Is this correct? [y/n: y] 如果没有错误的话,就选择y

接下来就开始进入初始化过程,这个过程中会产生一些出错信息,不过不用理它,这是因为你的NIS服务进程(ypserv)还没有启动的原因造成的。完成后会提示:

dog.mattcell.com has been setup as an YP master server without any errors.

这表示你的NIS主服务器已经初化完成。
现在要需要启动我们的NIS守护进程:ypserv(8)了,因为ypserv使用了RPC服务,所以需要先运行portmap(8)来使用它的RPC服务,同时如果用户需要在客户机上更改密码的话,我们就需要在NIS服务器上运行rpc.yppasswdd(8)守护进程:

dog# portmap
dog# ypserv
dog# rpc.yppasswdd

为了让这些命令在系统启动的时候就自动启动,这需要在/etc/rc.conf中加入以下设置:

portmap_enable="YES"
nisdomainname="mydomain.nis"
nis_server_enable="YES"
nis_yppasswdd_enable="YES"

现在我们的NIS主服务器就已经跑起来了,你可以通过以下命令来测试它的工作情况:

dog# ypbind                            启动NIS客户端支持程序
dog# ypcat passwd                 查询NIS服务器上的/etc/passwd信息
dog# ypcat master.passwd      查询NIS服务器上的/etc/master.passwd信息
dog# ypcat group                    查询NIS服务器上的/etc/group信息
dog# ypcat hosts                     查询NIS服务器上的/etc/hosts信息
dog# ypcat networks               查询NIS服务器上的/etc/networks信息
dog# ypcat netgroup               查询NIS服务器上的/etc/netgroup信息
dog# ypcat services                查询NIS服务器上的/etc/services信息
dog# ypcat protocols               查询NIS服务器上的/etc/protocols信息
dog# ypcat ypservers              查询NIS服务器信息
dog# killall -9 ypbind                关闭NIS客户端支持程序

下面我们来看看如何从客户端共享这些信息。

首先要保证客户端的NIS域名与NIS服务器的域名要一致。因为在客户端要对NIS服务器上的信息进行查询,所以需要在客户端启动一个守护进程ypbind(8)来提供对NIS的支持,同样,ypbind也使用RPC服务,所以需要在运行它之前运行portmap(8)进程:

cat# domainname mydomain.nis
cat# portmap
cat# ypbind

这里cat这台机器就会向网络上发出一个广播,来寻找NIS主服务器。同样,你也可以将这些信息加入rc.conf中让它们自动运行:

nisdomainname="mydomain.nis"
portmap_enable="YES"
nis_client_enable="YES"
nis_client_flags="-S mydomain.nis, dog.mydomain.nis, bee.mydomain.nis"

这里nis_client_flags是设置NIS域名为mydomain.nis,以及设置NIS服务器列表:dog.mydomain.nis, bee.domain.nis,这样对那些远程的用户有帮助,因为这种情况下如果依靠ypbind使用广播来查找服务器的话比较困难。
下面就需要设置系统使用NIS来接受用户信息,这需要在/etc/master.passwd的最后加入:

+:::::::::

这样,如果一个用户在该台机器(cat.mydomain.nis)这台机器上登录,login将先查找本地是否有该用户的帐号信息,如果有就使用本地信息,如果没有的话就通过NIS来获取。
同样的方法,如果要共享group信息,就需要在/etc/group最后一行加入:

+:*::

也可以共享NIS服务器上的hosts信息,这需要在/etc/host.conf中增加nis查询选项:

# $FreeBSD: src/etc/host.conf
# First try the /etc/hosts file
hosts
# Second use YP/NIS
nis
# Now try the DNS
bind

这样当你试图查询一台机器的IP地址的时候,系统将先在/etc/hosts中寻找相就的记录,如果没有找到就通过NIS来查询NIS主服务器上的hosts文件,如果还没有找到就使用DNS来查找。
(注意:/etc/host.conf在FreeBSD5.0之后已经使用/etc/nsswitch.conf来代替了)
现在你就可以使用dog.mydomain.nis服务器上的帐号来登录cat.mydomain.nis这台机器了:

FreeBSD (i386) <Power to Server :p>
Login: matthew
Passwd:

注意,因为我们在cat.mydomain.nis上没有为matthew这个用户建立HOME目录,所以这时会提示没有找到HOME目录,不必理会它,因为我们将在后面解决这个问题。

如果在客户端想更改你在NIS服务器上的口令,你可以使用yppasswd(1)来更改(需要服务器上运行rpc.yppasswdd守护进程):

matthew@cat$ yppasswd
Changing NIS passwd for matthew on dog.mydomain.nis.
Old Password:
New Password:
Retype new passwd: NIS password has been changed on dog.mydomain.nis.

下面让我们来看看如何改新NIS服务器上的NIS数据库

如果我们更改了NIS服务器上的某些数据(如:增加了用户,增加了组等。注意:更改了master.passwd后必须将/etc/master.passwd再次复制到/var/yp目录下,将删除不必要的用户)后,NIS客户端并不能立即使用更改的数据,因为NIS数据库是存放在/var/yp/yourdomainname下面的,所以我们需要更新NIS数据库:

dog# cd /var/yp
dog# make

这时make就会根据Makefile自动更新NIS数据库,注意,因为NIS数据库是实时查询,所以我们不需要重新启动ypserv守护进程。

建立NIS辅服务器
如果你担心你的NIS主服务器工作会为稳定而造成用户无法登录,那么你可以再建立一台或数台NIS辅服务器,它的建立方法就比较简单了。
首先还是进行初始化,不过因为它的NIS数据库直接从主服务器上取得,所以就直接在你要作为辅服务器的机器上执行:

bee# cd /var/yp
bee# ypinit -s dog.mydomain.ns mydomain.nis

其中-s指定NIS主服务器的名字,后面的mydomain.nis表示要初始化的NIS域名(即辅服务器的NIS域名)。
然后再修改辅服务器上的/etc/rc.conf以便NIS服务能够自动运行,同时为了当主服务器上的数据在发生变更的时候,辅服务器能够自动保持同步,就需要启动NIS同步进程rpc.ypxfrd:

portmap_enable="YES"
nisdomainname="mydomain.nis"
nis_server_enable="YES"
nis_yppasswd_enable="YES"
nis_ypxfrd_enable="YES"

同时为了支持同步数据传送,需要在主服务器上更改一点设置,因为主服务器默认情况下的设置只考虑了一台NIS服务器的情况。
我们需要将/var/yp/Makefile中的NOPUSH = "True"注释掉:
# NOPUSH = "True"
如果你在之前初始化主服务器的时候没有准备安装辅服务器,所以没有输入辅服务器的名字,而你现在又要使用辅服务器,那么你可以通过以下方法来增加你的辅服务器:

dog# cd /var/yp
dog# vi ypservers

加入你的辅服务器名,这里我们的辅服务器名为bee.mydomain.nis:

dog.mydomain.nis dog.mydomain.nis
bee.mydomain.nis bee.mydomain.nis

现在你的辅服务器在每次主服务器更新之后就会自动保证数据同步了。

NIS的高级设置
上面的例子中,我们是允许所有的NIS主服务器上的用户在NIS客户端(这时为cat)上登录,那么我们可不可以只允许某些用户登录,或者不允许某些用户呢?
答案是肯定的,当我们要允许某个用户登录的时候,可以在master.passwd中加入如下内容:

+matthew:::::::::

这表示允许(+)NIS服务器上的matthew在这台机器上登录,如果+号后面没有指定用户名的话系统就默认允许所有的用户登录,这就是我们上面的那种情况。
如果要禁止某个用户登录:

-badman:::::::::

这就表示禁止(-)NIS服务器上的badman在这台机器上登录,注意,因为系统处理master.passwd的时候是从第一行开始匹配的,一但某行匹配了,就不是对后面的行进行处理了,所以如果你要禁止某些用户登录而允许其它所有的用户登录就一定要将-user:::::::::写在+:::::::::之前,否则该用户还是可以登录系统:

-badman:::::::::
-hacker:::::::::
+:::::::::

上面的设置就使得除NIS服务器上的badman和hacker不能在这些机器登录外,其它的用户都可以登录。
还有一钟情况就是,我只允许某些用户登录我的系统,不允许其它用户登录,但又要保证用户信息与NIS服务器上的服务信息一至,以便使用id等使用的时候能正确的显示出用户的用户名和组名,这也可以使用以下方法来实现,在客户机的/etc/master.passwd后面加入:

+matthew:::::::::
+guest::::::::/home/ftp:
+:::::::::/sbin/nologin

上面的设置使得matthew可以在这台机器上登录,guest也可以登录,但其HOME目录将被到/home/ftp下,而其它用户的shell都被改成/sbin/nologin,所以其它用户都不能登录,但同时又使得这些用户的信息可以与NIS服务器同步。


2、使用NFS共享目录
NFS同样是由Sun Microsystem开发一用于UNIX系统之间共享文件的网络服务系统,与NIS一样,它也得到大多数的UNIX系统的支持。
在文章最开始的时候,我们提到用户需要每次都从FTP下载文件的问题,现在我们就可以用NFS来解决这个问题了,我们可以将某台机器的某个文件(文件夹)共享出来供其它机器使用。

在上面讲NIS的时候我们注意到,当我们使用NIS主服务器上的用户登录到其它UNIX机器的时候会被提示找不到用户的HOME目录,那么我们就利用NFS来将NIS主服务器上的/home目录共享出来,然后在每个UNIX客户端将其mount到本机的/home上,这样就可以解决找不到用户HOME目录问题了,并且无论用户在哪台机器登录,都可以直接进入自己的工作环境,使用自己的文件。
下面就让我们来实施具体的工作。
首先根man nfsd我们可以知道nfsd(8)只是处理NFS协议,真正的远程mount(共享)功能是由mountd(8)来完成的,而mountd是通过/etc/exports来设置共享目录的。exports(5)里的每一行表示第一个共享设置,第一行中都有以下三个部分:
第一部分是设置要共享出去的目录或目录列表,当要共享多个目录的时候使用空格分隔每个目录。
第二部分是共享参数,比如设置只读共享,对帐号的映射等。
第三部分是设置可以访问该共享的主机或主机列表,多个主机使用空格分隔。
我们就以共享NIS服务器(dog.mydomain.nis)上的/home目录为例,向大家说明exports的配制方法:

dog# cat /etc/exports
/home -maproot=daemon -network 192.168.7.0 -mask 255.255.255.0

其中/home为我们要共享出来的目录,-maproot=daemon是共享参数,表示当本地UNIX系统使用远程的/home目录时,将本地的root帐号的uid映射为远程机器上的daemon,gid映射为空,也就是说当我们以root身份访问dog上的/home目录时,我们的身份会被转换成远程主机dog上的daemon的身份。后面的-netmask=192.168.7.0 -mask=255.255.255.0设置可能访问该些共享资源的主机为192.168.7.0/255.255.255.0这个子网内的所有机器。
还有很多共享参数可以设置,比较有用的有:-mapall=将所有的本地帐号映射为远程主机上的某个指定帐号,-ro以只读共享该文件夹(默认为可读写)其它参数你可以通过man exports得到,这里就一一列举了。
现在我们的共享资源已经通过/etc/exports设置好了,接下来就是启动NFS守户进程nfsd和远程共享进程mountd了,由于NFS同NIS一样也使用RPC,所以要在启动NFS之前行启动portmap进程:

dog# portmap 如果已经启动就不再需要这一步了
dog# nfsd -n 5
dog# mountd
其中nfsd -n 5中的-n参数是指定同时建立多少个服务副本,可能选择4-6,这有助于提供NFS系统性能,但也不过太高,否则会占用大量资源。现在NFS就已经启动成功了,你可以通过showmount(8)来查询你的共享资源:
dog# showmount -e localhost
/home 192.168.7.0

这表明我们的NFS服务器已经正确启动了,接下来就要在客户端设置了。
在客户端我们使用mount_nfs来将远程主机共享的目录mount到本地上,因为在本例中我们是希望将远程主机(dog)上的/home目录mount到客户端(cat)的/home目录以保证系统用户的数据同步,所以我们进行以下操作:

cat# mount_nfs dog:/home /home

现在远程的共享目录/home就已经mount到本地的/home目录中了,我们可以看到mount_nfs与其它mount命令不同,它不是使用设备名(如/dev/ad0s1)而是使用hostname:/sharedir的方式来表示mount源,其中hostname是远程主机的主机名或IP地址。
现在我们再次使用matthew这个帐号(该帐号在NIS服务器dog.mydomain.nis上存在),在cat.mydomain.nis登录:

FreeBSD (i386) <Power to Server :p>
Login: matthew
Passwd:
matthew $ pwd
/home/matthew

现在我们可以看到,我们在dog这台机器上的文件,现在在cat上全部可以看到了,当然以前的那个找不到用户HOME目录的错误信息现在也没有了。
可以看到,通过NIS和NFS可以使管理员管理UNIX网络中的用户帐号等信息非常方便,因为所有的修改都只需要在一台机器上进行,而其它机器自动的就会改变。同时对用户来说,他们可以只使用一个帐号而在任何一台主机上登录,而且不用再使用麻烦的FTP在不同的主机间传递文件,用户在每台机器上的文件都会自动保持更新。

2005年04月07日

在Google 上搜书的方法
一. 利用google突破各种封锁来下载你要的东西

可以搜索到一些意想不到的东西……
在搜索框上输入: "index of/ "  inurl:lib

再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍。

在搜索框上输入: index of /"  cnki
再按搜索你就可以找到许多图书馆的CNKI、VIP、超星等入口!

在搜索框上输入: "index of /"  ppt
再按搜索你就可以突破网站入口下载powerpint作品!

在搜索框上输入: "index of /"  mp3
再按搜索你就可以突破网站入口下载mp3、rm等影视作品!

在搜索框上输入: "index of /"  swf
再按搜索你就可以突破网站入口下载flash作品!

在搜索框上输入: "index of /"  要下载的软件名
再按搜索你就可以突破网站入口下载软件!

注意引号应是英文的!

再透露一下,如果你输入:

"index of /"  AVI
你会找到什么呢?同理,把AVI换为MPEG看看又会找到什么呢?呵呵!接下来不用我再教了吧?

其实,就是在你输入的检索关键词后面加上 " 冒号 文件格式" 就可以了。例如:

1,图像检索 df
2,基于内容的图像检索 pt

————————————————-

二. 免费200部以上的.net/java电子书下载
在互联网上面免费的电子书真多,关键就看你如何去发现。。。
下面介绍一个简单的方法,打开www.google.com
1、搜索asp相关书籍,关键词
inurl:asp filetype:chm
其中inurl表明下载地址中包含asp,filetype表明文件名是chm格式,你也可以指定pdf或者doc,ppt,zip,rar等

2、搜索dotnet相关书籍,关键词
inurl:dotnet filetype:chm

或者你也可以指定java方面,经测试,命中率95%以上,大都可以下载,不过大部分是E文喔。

2005年03月11日

剧院魅影

       310,剧院魅影的第100场,等了好多天,终于可以看到期待的魅影了,下班的时候正好赶上修路,出租车在崎岖的路面上艰难的前进着。最后我换到地铁,从人民广场的地铁站出来的时候,离开场已经不到10分钟了,我一路小跑向大剧院奔去,路边不时的有黄牛问我是否要票。

       进入大剧院后,定了定神,擦了擦身上的汗,看到好多人在大剧院的一些景点边上摄影留念。我缓步走近剧场,发现今天的人出奇的多,居说是因为有人包场。坐到座位上后,仔细看了看舞台,一大堆东西被幕布裹着,整个舞台好像阴森森的山洞,看上去是有一点鬼魅的感觉。

       灯光暗下来,音乐剧开幕。剧情很简单,一个相貌恐怖的音乐天才爱上了剧院合唱团中美丽的少女CHRISTINE,帮助她一步步的成为剧院的当家花旦,然而这个魅影钟爱的Angel最后喜欢上了英俊、潇洒的RAOUL子爵。最终魅影只好悲伤的离去。

       首先从拍卖一个猴子的音乐盒开始倒叙进入剧情,《剧院魅影》的舞台布置真是没得说,一层层如同变魔术般似的,没看到魅影就有了鬼魅般的感觉,仿佛这剧院真的是由魅影来控制的似的。只是乐队的规模明显不够,再加上我又坐在二楼,不能很好的烘托出氛围来。

       没过多久就到了CHRISTINE开始唱我最喜爱的Think of me,一听下来与CD上的相差甚远,声音一点也不温柔甜美。还不如第一夫人唱的好,不觉得有一点点失望。要不是第一夫人为了衬托出她来,要压着噪子,相信会唱得更好。当魅影把CHRISTINE带到自已的居处,深情的唱着The music of the night的时候,我一点点的进入佳境,觉着这舞台在演绎着一幅幅甜美的画面。当看到魅影因为CHRISTINE爱上的RAOUL一个人在思念着CHRISTINE,喊着她名字,不觉着眼圈有一些的湿润。无所不能的魅影是那么的无助,深爱着对方却不知如何是好,只能一个人默默哭泣。

       当唱到Point of No Return的时候,我已经深深的进去了。记得小时候疯狂的追求HIFI的时候,在商场听一张试音碟,听到后来犹如中毒了般,旋律和音色已经成为次要的了,喜欢听从那对音箱流趟出来的任何声音。今天又一次有了那种感觉,不觉得身体瘫软在座位上,痴痴的听着那鬼魅的声音。在来之前还想着哪首歌好听,是Angel of musicThe Phantom of the Opera还是现在才发现这精美的表演、美妙的音乐和甜美的歌声水乳交融的融合在一起才是最美的。

       最后魅影放掉了RAOULCHRISTINE,让他们一起离开。当人们赶到魅影的住处,只看到一个魅影的面具,整个舞台黑了下来,只有魅影的面具在闪闪发光。

       音乐剧结束,演员出来三谢幕,然后整个剧院里又响起All I Ask of You的主旋律。面对着渐渐的空荡起来的剧场,我想起来了那句话:

       如果一生只看一部音乐剧 那就是剧院魅影