关于作者

姓名:

性别:男

出生日期:1983-12-22

地区:中国-上海

联系电话:

QQ:--

婚否:保密
用户名:demonstrate
笔名:demonstrate
地区: 中国-上海
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



Linux Home

Blog 互联

TeXers

搜索

Google

搜索WWW 这里

访问统计:
文章个数:182
评论个数:173
留言条数:9




Powered by BlogDriver 2.1

demonstrate 的 blog

 

照片的链接来源于 http://demonstrate.photo.163.com/,如果你打不开有些图片,请右键点击该图片位置选择查看图片(View Image)。另外,这是我现在用的 GPG 公钥

文章

西江月 * 黄寅晓
旷野幽幽凝箫,书山累累尽晓。脚踩轮滑四处飚,孤月独鼠逍遥。
风城寅时寂寥,黄岩梦中凭吊?旦复旦兮渐缥缈,白楼人去花调。

- 作者: demonstrate 2007年02月22日, 星期四 22:24  回复(6) |  引用(1) 加入博采

望月怀远
by 张九龄
海上生明月,天涯共此时。
情人怨遥夜,竟夕起相思。
灭烛怜光满,披衣觉露滋。
不堪盈手赠,还寝梦佳期。

看月思人,远在两地的情人,烛光稀微而灭,情思至此不觉寒露上身...
多美的意境啊

- 作者: demonstrate 2006年11月25日, 星期六 17:23  回复(0) |  引用(1) 加入博采

GNU C library 笔记(2)
内容:Memory

1. 几个基本概念,page、frame、paging、segment。
进程分配内存的两种模式,一个使用 exec 系列函数,一个使用 programmatically(malloc 等函数)。
重要的 segment 有 text segment(存放代码等等,一般在进程的生命周期中不变)、data segment
(存放数据,可以用一些函数来调整大小,但是低位端位置不变)、stack segment(随着使用的堆栈
变大而变大,但不变小...)

2. 内存的静态分配和自动分配。前者是对于 static 变量或者全局变量,一旦开始就分配,即一直存在到最后。
后者是临时变量,如调用函数。值得注意的是:
In GNU C, the size of the automatic storage can be an expression that
varies. In other C implementations, it must be a constant.

3. 内存的动态分配不为 C 语言本身支持,不像 C++。基本方法是
void * malloc (size_t size)
分配到的内存没有初始化(calloc 会做清零,clear allocate),因此可以用 memset 来
进行初始化。分配后应检测返回指针是否为 NULL。malloc 返回的一个块多数情况下对齐
(这样可以存储任意类型的数据)过了,地址为 8 的倍数(64 位系统里面是 16 的倍数),
在一些特殊情况下(page 的边界)可以利用 memalign、posix_memalign、vlign 来返回
对齐(2 的幂次)的内存块。free 的内存很少被返还给操作系统,多数情况被留作后面
malloc 使用。如果需要调整已经 malloc 的块的大小,使用 realloc。glibc 不会将分配的块
对 2 的幂次进行向上取整。

4. 一次性分配很大的内存(大于一个 page)会使用向 2 的幂次取整的策略,使用 mmap
相关的函数 mallopt,这种分配得到的内存在 free 时会返回给操作系统。

5. 如何调整 malloc 的行为?使用 mallopt 调整一些参数的值(malloc.h),如
M_TRIM_THRESHOLD(返回给 OS 的内存的一个阈值)、M_MMAP_THRESHOLD
(大于此值的内存分配请求使用 mmap 系统调用)等等。

6. 分配的内存来自堆(heap),可以用
int mcheck (void (*abortfn) (enum mcheck_status status))
来检查分配内存的一致性,调用在 malloc 之前。
enum mcheck_status mprobe (void *pointer)
为特定的一块内存做检查。这都是 GNU extension。(mcheck.h)

7. 为了方便调试,glibc 为用户提供了 malloc 等等函数的钩子(hook),如 __malloc_hook
对应的是一个函数指针,
void *function (size_t size, const void *caller)
其中 caller 是调用 malloc 返回值的接受者(一个指针的地址)。另外有 __malloc_initialize_hook
函数指针,仅仅会调用一次(第一次分配动态内存时)。(malloc.h)

8. 一些使用 malloc 的统计量(SVID 扩展)可以用 struct mallinfo 储存,
可调用
struct mallinfo mallinfo (void)
获得。

9. 如何检测 memory leakage?glibc 提供了一个函数
void mtrace (void)
及其反作用
void muntrace (void)
这时会依赖于一个环境变量 MALLOC_TRACE 所指的文件,把一些信息记录在该文件中
用于侦测 memory leakage,其本质是安装了前面提到的 hook。一般将这些函数用
#ifdef DEBUGGING 包裹以便在非调试态下减少开销。产生的文件据说不建议自己去读,
而使用 mtrace 程序(perl 脚本来进行分析)。下面用一个简单的例子说明这个过程,这是
源程序:
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>

int
main( int argc, char *argv[] )
{
int *p, *q ;
#ifdef DEBUGGING
mtrace( ) ;
#endif
p = malloc( sizeof( int ) ) ;
q = malloc( sizeof( int ) ) ;
printf( "p = %p\nq = %p\n", p, q ) ;

*p = 1 ;
*q = 2 ;

free( p ) ;

return 0 ;
}
很简单的程序,其中 q 没有被释放。我们设置了环境变量后并且 touch 出该文件
执行结果如下:
p = 0x98c0378
q = 0x98c0388
该文件内容如下
= Start
@ ./test30:[0x8048446] + 0x98c0378 0x4
@ ./test30:[0x8048455] + 0x98c0388 0x4
@ ./test30:[0x804848f] - 0x98c0378
可以知道带有 + 的表示 malloc 了内存,而 - 表示释放,后面的 0x4 是分配的内存大小
可见正常情况 + - 数目应该一样多,现在不一样表明出现了 leakage。接着我们看看前面的
地址样的东西是啥,objdump 之得
08048424 <main>:
...
8048441: e8 d2 fe ff ff call 8048318
8048446: 89 45 f4 mov %eax,0xfffffff4(%ebp)
8048449: c7 04 24 04 00 00 00 movl {fckeditor}x4,(%esp)
8048450: e8 c3 fe ff ff call 8048318 <malloc@plt>;
8048455: 89 45 f8 mov %eax,0xfffffff8(%ebp)
8048458: 8b 45 f8 mov 0xfffffff8(%ebp),%eax
804845b: 89 44 24 08 mov %eax,0x8(%esp)
804845f: 8b 45 f4 mov 0xfffffff4(%ebp),%eax
8048462: 89 44 24 04 mov %eax,0x4(%esp)
8048466: c7 04 24 54 85 04 08 movl {fckeditor}x8048554,(%esp)
804846d: e8 c6 fe ff ff call 8048338 <printf@plt>
8048472: 8b 45 f4 mov 0xfffffff4(%ebp),%eax
8048475: c7 00 01 00 00 00 movl {fckeditor}x1,(%eax)
可见是调用函数开始地方的地址。下面使用 mtrace 命令行工具进行分析,其基本调用方式为
mtrace binary tracefile。当使用 gcc -DDEBUGGING -g 编译才能获得最好的效果,会报告出
哪一行上的没有被释放掉。

10. obstack 是什么?
可以看做任意“对象”的 stack,用户可以建立多个 obstack,其使用类似于一个 stack
相关的定义在 obstack.h 中。使用一个 obstack 是通过一个结构 struct obstack 实现的。
obstack 中的东西放在 chunk 中,chunk 使用用户自定义的函数(其实是个 macro )分配
后来的东西是用一些接口函数放到 obstack 中,真是标准的 C 实现啊... 比较特别的是一种可以
grow 的对象的放入。建立一个 obstack 只需要弄一个结构,然后用
static struct obstack myobstack;
obstack_init (&myobstack);
当然,malloc 一个也行的。不过首先应该告诉编译器用什么分配 chunk -.-
#define obstack_chunk_alloc malloc
#define obstack_chunk_free free
分配的 chunk 大小是用下面的 macro 决定的
int obstack_chunk_size (struct obstack *obstack-ptr)
调用方式如下:
obstack_chunk_size (obstack_ptr) = new-chunk-size;
如果 trunk 分配失败,则会调用  obstack_alloc_failed_handler 对应的函数指针。
下面看看如何将一些东西放进去。最直接的就是通过分配一块地方
void * obstack_alloc (struct obstack *obstack-ptr, int size)
然后手动 memcpy 好了... 这样麻烦,因此有个
void * obstack_copy (struct obstack *obstack-ptr, void *address, int size)
减少工作量,对于字符串呢还有更简单的
void * obstack_copy0 (struct obstack *obstack-ptr, void *address, int size)
这样最后的 0x0 会自动被添加。如果想释放,可以调用
void obstack_free (struct obstack *obstack-ptr, void *object)
这时 obstack 中在此 object 之后添加的都会被释放掉(这才是 stack 嘛~)注意,如果 object == NULL,此时
就不仅仅释放了所有的 obstack 中的东西,obstack 自己也被恢复到未经初始化的状态了。

下面看看如何添加可以 grow 的对象,最基本的
void obstack_blank (struct obstack *obstack-ptr, int size)
分配空间,但不初始化,
void obstack_grow (struct obstack *obstack-ptr, void *data, int size)
让这部分空间变大(size 可以为负,那就是变小,但不会缩过头 @@),为了方便字符串等等数据类型
可以使用下面系列函数
void obstack_grow0 (struct obstack *obstack-ptr, void *data, int size)
void obstack_1grow (struct obstack *obstack-ptr, char c)
void obstack_ptr_grow (struct obstack *obstack-ptr, void *data)
void obstack_int_grow (struct obstack *obstack-ptr, int data)
grow 完了最后要 finish 一下
void * obstack_finish (struct obstack *obstack-ptr)
可以在 finish 之前测一下这个家伙有多大
int obstack_object_size (struct obstack *obstack-ptr)
不过因为这样做每 grow 一点都会检查是否需要分配新的 chunk 因此较慢,当有连续的
grow 产生而对 chunk 的把握正确的时候可以用对应的 fast grow 系列函数,如
void obstack_1grow_fast (struct obstack *obstack-ptr, char c)
void obstack_blank_fast (struct obstack *obstack-ptr, int size)
为了方便之前检查 chunk 剩余空间是否够用可以用
int obstack_room (struct obstack *obstack-ptr)

下面是一些其他的与 obstack 函数
void * obstack_base (struct obstack *obstack-ptr)
返回下一个 object 的地址(栈顶),如果有 growing object 则是该 object 地址。
如果需要进行对齐,下面的 macro 设置其掩膜
int obstack_alignment_mask (struct obstack *obstack-ptr)
使用类似设置 chunk size。

11. 一些 macro 调用的问题
obstack 是在老的 C 编译器上可能不好正常工作,特别是对利用 maco 产生了重定义的函数不能取址
但是遵循 ISO C 编译器可以,但是不保证在使用宏调用时参数会被多次利用产生的后果,如
obstack_alloc (get_obstack (), 4);
中 get_obstack () 或者 *obstack_list_ptr++ 这类参数。但是 GNU C 下这类参数不会被多次展开。

12. 可变大小自动释放类型,一个是 BSD extension,在 stdlib.h 中定义,使用 alloca 分配的
int
open2 (char *str1, char *str2, int flags, int mode)
{
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
stpcpy (stpcpy (name, str1), str2);
return open (name, flags, mode);
}
这样一个好处在于 longjmp() 时不需要再手工释放这部分内存。并且使用 alloca 分配的内存是
统一管理,不会造成内存碎片化。但是非 GNU 系统可能不支持,如果分配的内存太大会使程序崩溃
另外,还可以用 GCC 的方式:
int open2 (char *str1, char *str2, int flags, int mode)
{
char name[strlen (str1) + strlen (str2) + 1];
stpcpy (stpcpy (name, str1), str2);
return open (name, flags, mode);
}
两种方式并不相同,后者可能仍然在栈内分配的内存,因此作用域结束即释放,而前者在程序结束
才释放。前者可用于循环体内,后者不可。

13. brk() 和 sbrk() 用于调整 data segment 的 high end,有什么用?
int brk (void *addr)
int sbrk (ptrdiff_t delta)
名字由来是原来进程里面 data segment 和 stack 对着干,一个从上向下长,一个从下向上长
中间隔开它们的是 break -.-b

14. root 可以调用一些相关函数将某个 page 锁住,这样不能被 paged out,目的是避免交换出去
造成再读入的开销。相关函数在 sys/mmem.h
int mlock (const void *addr, size_t len)
int munlock (const void *addr, size_t len)
int mlockall (int flags)
int munlockall (void)
这些是 POSIX.1b 的标准。

- 作者: demonstrate 2006年11月25日, 星期六 17:16  回复(0) |  引用(1) 加入博采

感遇(其一)
by 张九龄
兰叶春葳蕤,桂华秋皎洁。
欣欣此生意,自尔为佳节。
谁知林栖者,闻风坐相悦。
草木有本心,何求美人折?

前两句描写兰、桂,末了对此景象感慨为佳节。
颈联表明自己悦之的态度,尾联反问直抒胸臆。
这种孤芳自赏的心态让人佩服~

- 作者: demonstrate 2006年11月18日, 星期六 22:11  回复(0) |  引用(1) 加入博采

GNU C library 笔记(1)
内容:Introduction 和 Error Reporting
1. glibc 所实现全部或者部分规范下的功能有
  • ISO C: The international standard for the C programming language.
  • POSIX: The ISO/IEC 9945 (aka IEEE 1003) standards for operating systems.
  • Berkeley Unix: BSD and SunOS.
  • SVID: The System V Interface Description.
  • XPG: The X/Open Portability Guide.
如果只需要 ISO C 的功能,可以在编译时使用 -ansi 选项。glibc 实现了全部的 ISO C 功能。POSIX 是 ISO C 的超集,它额外的包括了 file system interface primitives、device-specific terminal control functions、process control functions。Berkeley Unix 实现了前两者多数功能,源于 4.2 BSD、4.3 BSD, and 4.4 BSD Unix 系统(一般称为 Berkeley Unix)以及 SunOS (基于 4.2 BSD 但是又实现了 System V 的部分功能),它额外的包括了 symbolic links、the select function、BSD signal functions、sockets。SVID 是 System V Interface Description,也就是描述 AT&T Unix System V operating system 的一份文档,某种意义上是 POSIX 的超集,但是没有已有的 Unix 实现了其全部功能,glibc 也仅仅实现了其部分功能。它额外实现的功能包括 the methods for inter-process communication(IPC)、shared memory、hsearch、drand48 系列函数、fmtmsg、一些其他的数学函数。XPG(The X/Open Portability Guide)描述了什么样的系统满足类 Unix 系统的基本需要,glibc 服从该要求。

2. 头文件里面某些函数的实现使用 macro 做到的,理由是一般这样会更快。但是不需要区别他们,因为一般定义了同名的函数,如 abs(int) 既有函数定义也有 macro 定义,使用 & 操作时,由于 macro 调用时不能匹配到 () 因此仍然能取到函数的地址。如果需要显式的调用函数可以用 () 将函数名包围,如 (abs)(3),又或者使用 #undef abs 将定义过的 macro 取消。

3. ISO C 允许重复 #include 头文件,但是 glibc 使用了 #define #ifndef 等预处理器命令避免了同一头文件重复装载,因此可以放心的 #include glibc 的头文件。

4. 除了 ISO C 定义的一些保留字,由于 glibc 实现了一些额外的功能,建议不要使用可能与之冲突的一些命名方式。

5. 如何开启某种标准下 glibc 的功能。前面提到可以利用 -ansi 仅仅使用 ISO C 以内的功能。其他的通过定义 macro 实现条件编联,实现方式分两种,可以在 .c 里面 #define,或者用 -D 把这个 macro 传递给 gcc。为了实现 POSIX 的功能,应定义 _POSIX_SOURCE (_POSIX_C_SOURCE 决定实现的 POSIX 标准类型,如 1、2、>3 实现的功能逐步增多)。类似的有 _BSD_SOURCE、_SVID_SOURCE、_XOPEN_SOURCE。为了处理大文件产生的问题,应定义 _LARGEFILE_SOURCE,又比如 64 位文件系统应定义 _LARGEFILE64_SOURCE。_ISOC99_SOURCE 允许使用 ISO C 99 的标准。_GNU_SOURCE 将允许使用全部的 glibc 的功能。
#define _GNU_SOURCE
#include <stdio.h>
#include <errno.h>

int
main( int argc, char *argv[] )
{
printf( "%s\n%s\n%s\n", argv[0],
program_invocation_short_name,
program_invocation_name ) ;

return 0 ;
}
该例子给出了如何使用非 ISO C 的 program_invocation_(short_)name 变量(程序名带或者不带路径)的例子。使用 _REENTRANT 和 _THREAD_SAFE 时保证使用对应的函数。

6. error handling 模型,这种依赖于全局变量 errno 的做法 ms 被 BS bs 了 -.-b 指责的原因是不能处理多线程倒是文档中解释了如何处理 signal handling 时 errno 的处理(先备份,再修改以免丢失),但是如果忘了这样做可能会把一些潜在的错误覆盖掉,其错误的定义在 errno.h 文件中。可使用 string.h 里面的 strerror( int errno ) 获得该 errno 下的一个字符串解释,但是有更简单的函数,如 perror( const char * ) 输出指定字符串后加上一个冒号和空格再输出错误解释(errno.h)。有一些功能更强大的函数 strerror_r 将字符串写入指定的缓存(多线程时需要),另外为了使得输出更统一(符合 GNU Coding Standard),在 error.h 中定义了一些更加方便的函数,如 error 系列 err 系列,在解析文件时可以用到的 error_at_line 系列、warn 系列。注意 error 函数可以指定一个调用 exit 的值,
这样就不会返回了,但是可以让其返回增大 error_message_count。

- 作者: demonstrate 2006年11月12日, 星期日 16:04  回复(0) |  引用(1) 加入博采

长安古意
借问吹箫向紫烟,曾经学舞度芳年。
得成比目何辞死,愿作鸳鸯不羡仙。
这句以比目、鸳鸯做喻,表明少女(吹箫)的心迹。

节侯风光不相待,桑田碧海须臾改。
昔时金阶白玉堂,即今惟见青松在。
寂寂寥寥扬子居,年年岁岁一床书。
独有南山桂花发,飞来飞去袭人裾。
读到此处,特别是“惟见青松在”和“年年岁岁一床书”颇有
感触,偶的陋室中,估计也就这么一床书了。

此诗为卢照邻所做。

- 作者: demonstrate 2006年11月12日, 星期日 15:59  回复(0) |  引用(1) 加入博采

AUCTeX 使用手记
TeXer 们一直寻找的编辑 TeX 源文件的利器,AUCTeX 相信就是其中一个。结合在强大的编辑器 Emacs 中,AUCTeX 为我们展示了另一种风格的简洁与易用。

AUCTeX 的安装

在 Linux 中,有 tetex 的套装,有 Emacs,无论是 FC 还是 debian 里面都有现成的软件包可以方便的安装配制好。然后,AUCTeX 呢?其实也有配制好的软件包。这里就简单说明一下 Win32 里面需要的一些东西。当然,如果愿意,AUCTeX 的官方网站上提供了打包好的 Emacs。

首先我们先到 sourceforge 上拖一个 NTEmacs 回来,为了较好的支持中文,建议用 Emacs 23 吧,尽管还是测试阶段,N 多的 bugs,但是为了中文,呵呵,冒冒险还是值得的。然后去 Sourceforge 的另一个项目 mingw 里面拖一个 msys 。最后下载 AUCTeX 的 tar ball(现在的版本好像把 preview-latex 集成了)。Emacs 展开就可以用了,为 runemacs.exe 创立一个快捷方式,并把工作目录设为自己用作 home directory 的地方,.emacs 文件放于其中。安装 msys,进入到它的 shell 中,并展开 AUCTeX 的包,cd 到对应的目录中,参考 INSTALL.windows 文件,首先 configure
$ configure --prefix='D:/emacs' --with-texmf='D:/CTeX/localtexmf' \
--with-texmf-dir='D:/CTeX/texmf'
其中最后一项是因为我的 MikTeX 不能使用 kpsewhich 等命令定位路径,倒是 tetex 可以不用这项 -,-b。只要没错误,就可以 make 和 make install 了。

我的 AUCTeX 版本为 11.83。
配置 AUCTeX
安装好后 Emacs 在打开 tex 文件时如果正常会自动进入对应的模式,否则编辑 .emacs 文件,加上
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)
另外,AUCTeX 还带有 RefTeX 等模式,也可以在 .emacs 文件里面把这些模式预先打开,如
(add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
(add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
有一些宏包提供了对应 Emacs 的模式支持,可以在 .emacs 里面加入
(setq TeX-auto-save t)
(setq TeX-parse-self t)
从而让 Emacs 自动的调用对应的文件,比如 beamer 自己带的 beamer.el。

- 作者: demonstrate 2006年07月26日, 星期三 10:56  回复(2) |  引用(1) 加入博采

使用 yum 升级和 yum 使用简介
摘要:介绍如何使用 yum 查看全文

- 作者: demonstrate 2006年07月18日, 星期二 16:03  回复(0) |  引用(1) 加入博采

研究生一年回顾
这样的一年,我都不知道怎么来描述,发生的事情太多,而我却没有总结。
随着朋友的走远,我又将进入那个未知的黑洞中,我不知道前方有多远,我奋力想向前走,却摸索不到任何的光明。孤独,往往在和朋友的离别之后,往往在爱人生离死别瞬间。我不知道我能坚持多久,我不知道我是否能像某些人那样习惯这种一个人的生活,即便爱过,即便拥有过。我很佩服莉香的一点就是她最后能轻易的对以往的爱人说:我已经习惯了一个人的生活。
但是,我真想问问她,难道就看着那天上的星星能解决一辈子的孤独吗?
我觉得我现在还不能,我觉得这样我会活的太辛苦,没准什么时候就会崩溃。但是这是一种十分自私的想法,我却从来没有能想出一种方法摆脱这种自私。
一年的学习,成果不多,但是现在至少知道自己需要学什么,知道自己能做什么,差什么。我想这也是我真正开始了解自己能力的一年,我感到更多的压力,我甚至暑假不敢回家... 我想找一个地方大叫,想找一个地方大哭,想找一个没人的地方在悲伤中睡去,睡前能够看见天上的星星,睡着能看见想看见的人,睡醒了忘掉一切痛苦,继续完成一件我都不知道将会是什么的事情。
我想记住一切感动我的事情,我找到了照相机,因为一个一个的瞬间将被铭刻在硬盘上,当记忆被时间的漫长磨掉清晰的轮廓时,我还能通过照片看见一个一个生动活泼的过去,重新雕塑那一个一个的形象。
我想留住每句话的感动,我想重新玩味我曾经感受到的冲动,可是说过的话泼出去的水,一起唱过的歌最后只剩下谱子,一个人唱孤独的曲子不如吹奏出来,让旋律持久下去,当有机会能让故人重新回忆起那时的一切时,用这些旋律(也许并不优美)作为催化剂。
难道这也是不该有的野心么...
人不能活在过去,可是记忆也是错误么?
我很矛盾,却又无法找到答案,可是没有答案又怎么能生活的释然?

去年这时一曲再回首,今年却又听见了... 我不愿意再回首,我要前进!

- 作者: demonstrate 2006年07月2日, 星期日 21:25  回复(2) |  引用(1) 加入博采

六月最后一天的留恋
记得当我第一次走到她的身边
俯身仔细看那双迷惑的眼
不知何来勇气将一切实现

跑在操场上面
她说她会坚持跑完十二圈
即便明天她会疲倦

偶然拾起她的画片
好奇美丽如何在她笔下成为曲线
正如那开心无邪她的笑脸

寂静的夜晚无人的校园
一车二人尽情聊着天
长路漫漫渐行渐远

曾经以为还有充分的时间
到现在却不可能说出再见
虽无情谊缱绻,亦不谈誓言
可是总归有些依恋
握手,道别,挥手,呆立,闭眼
害怕转身之后不能承担再回首的梦魇
只有那只口琴伴我走过剩下的 2006 年

- 作者: demonstrate 2006年06月30日, 星期五 01:49  回复(0) |  引用(1) 加入博采

明月何皎皎
明月何皎皎,照我罗床帷。
忧愁不能寐,揽衣起徘徊。
客行虽云乐,不如早旋归。
出户独彷徨,愁思当告谁?
引领还入房,泪下沾裳衣。

游子心理的矛盾,归不归?
至此,19 首全部完成~

- 作者: demonstrate 2006年06月29日, 星期四 01:04  回复(0) |  引用(4) 加入博采

客从远方来
客从远方来,遗我一端绮。
相去万余里,故人心尚尔。
文采双鸳鸯,裁为合欢被。
著以长相思,缘以结不解。
以胶投漆中,谁能别离此。

思妇的思念的确细腻而悠远~
本诗不着忧伤的情绪,但却是想象中的欢乐

- 作者: demonstrate 2006年06月28日, 星期三 02:40  回复(0) |  引用(1) 加入博采

孟冬寒气至
孟冬寒气至,北风何惨慄。
愁多知夜长,仰观众星列。
三五明月满,四五蟾兔缺。
客从远方来,遗我一书札。
上言长相思,下言久离别。
置书怀袖中,三岁字不灭。
一心抱区区,惧君不识察。

一心一意,赞之。

- 作者: demonstrate 2006年06月27日, 星期二 01:25  回复(0) |  引用(1) 加入博采

凛凛岁云暮
凛凛岁云暮,蝼蛄夕鸣悲。
凉风率已厉,游子无寒衣。
锦衾遗洛浦,同袍与我违。
独宿累长夜,梦想见荣辉。
良人惟古欢,枉驾惠前绥。
愿得常巧笑,携手同车归。
既来不须臾,又不处重闱。
亮无晨风翼,焉能凌风飞。
眄睐以适宜,引领遥相睎。
徙倚怀感伤,垂涕沾双扉。

思妇 again,可能现在的我更能为某些勇敢的行为感动...

- 作者: demonstrate 2006年06月26日, 星期一 01:36  回复(0) |  引用(1) 加入博采

生年不满百
生年不满百,常怀千岁忧。
昼短夜苦长,何不秉烛游?
为乐当及时,何能待来兹?
愚者爱惜费,但为后世嗤。
仙人王子乔,难可与等期。

虽不赞同过分的及时行乐,但是亦不能“愚者爱惜费”啊!!!

- 作者: demonstrate 2006年06月25日, 星期日 00:29  回复(0) |  引用(61) 加入博采