
2010年2月1日星期一
2010年1月21日星期四
慎用 "./configure"
运行 ./configure后,ns的makefile文件会恢复到默认状态(将你添加的makefile中的语句删除)。
如果你添加过新的协议,在makefile中做了修改,当你运行./configure后,重新make ns就会报错:
“This should work unless it involves constant data structures referencing symbols
from auto-imported DLLs.trace/cmu-trace.o:cmu-trace.cc:(.text$_ZN12hdr_smcr_pkt
6accessEPK6Packet[hdr_smcr_pkt::access(Packet const*)]+0x7): undefined reference
to `hdr_smcr_pkt::offset_'
trace/cmu-trace.o:cmu-trace.cc:(.text$_ZN9hdr_wcett6accessEPK6Packet[hdr_wcett::
access(Packet const*)]+0x7): undefined reference to `hdr_wcett::offset_'
Info: resolving __timezone by linking to __imp___timezone (auto-import)
collect2: ld returned 1 exit status
make: *** [ns] Error 1”
因为smcr和wcett是后来添加的路由协议,都在makefile中添加了相关语句;当运行./configure后相关语句被删除,新协议未被编译,从而找不到 “xx::offset”
因此,如果需要使用./configure,记得运行后新修改makefile;通常,重新编译时,不运行./configure应该也可以正确重新编译ns
如果你添加过新的协议,在makefile中做了修改,当你运行./configure后,重新make ns就会报错:
“This should work unless it involves constant data structures referencing symbols
from auto-imported DLLs.trace/cmu-trace.o:cmu-trace.cc:(.text$_ZN12hdr_smcr_pkt
6accessEPK6Packet[hdr_smcr_pkt::access(Packet const*)]+0x7): undefined reference
to `hdr_smcr_pkt::offset_'
trace/cmu-trace.o:cmu-trace.cc:(.text$_ZN9hdr_wcett6accessEPK6Packet[hdr_wcett::
access(Packet const*)]+0x7): undefined reference to `hdr_wcett::offset_'
Info: resolving __timezone by linking to __imp___timezone (auto-import)
collect2: ld returned 1 exit status
make: *** [ns] Error 1”
因为smcr和wcett是后来添加的路由协议,都在makefile中添加了相关语句;当运行./configure后相关语句被删除,新协议未被编译,从而找不到 “xx::offset”
因此,如果需要使用./configure,记得运行后新修改makefile;通常,重新编译时,不运行./configure应该也可以正确重新编译ns
ns2问题解决经验(转)
ns2问题解决经验(转)
1) ns2的安装
i: 一般安装,进入 ns-allinone-2.xx目录后,执行: ./install 即可
ii: 安装完毕后,要设置环境变量,在.bashrc的文件末尾(ubuntu 版本中在用户目录下,如/home/weizai)增加以下语句(假设在/home/weizai/ns2work 下安装了ns-allinone-2.30):
export NS_HOME=/home/weizai/ns2work/ns-allinone-2.30
export PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/bin:$PATH
export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/otcl-1.12:$NS_HOME/lib:$LD_LIBRARY_PATH
export TCL_LIBRARY=$NS_HOME/tcl8.4.13/library
保存文件退出,重新打开终端,这时在终端键入 ns,应该出现%,可用./validate检查安装是否成功。
iii: 要记得安装tk和tcl, ns-allinone-2.26(含2.26)以前对应的版本是8.3,以后是8.4
以ubuntu为例,在新立德软件包管理器中就可以选择,强烈建议上网不方便或网速不快的用户使用ubuntu DVD进行安装,不少基本软件在DVD中都有,安装方便快捷。
iv: nam安装不上
* 要安装libxmu-dev包,不然无法编译通过nam-1.11,会报“没有X11/Xmu/WinUtil.h”的错误。
在ubuntu中选择安装libxmu-dev包时,libxt-dev包会关联安装。(libxt-dev 这个包也是必须的。)
* 在ubuntu8.x版本的dvd光盘中希望安装libxmu-dev,但会提示不能安装。
解决方法1:到网上下载libxmu-dev包,按照一般软件包安装步骤-configure, make, sudo make install 安装。
解决方法2: 尝试用低版本的ubuntu DVD,比如用ubuntu7.0,在新立得中添加此光盘源,而后在终端用sudo apt-get install libxmu-dev安装
v: 解决因为reldi'`,安装ns2,提示Syntax error: Unterminated quoted string,导致tcl,tk,otcl不能安装的问题(这个问题是因gcc对语法要求更加严格):
分别进入以下3个文件夹:
*/ns-allinone-2.29/tcl8.4.11/unix/
*/ns-allinone-2.29/tcl8.4.11/tk8.4.11/unix/
*/ns-allinone-2.29/otcl-1.11/
执行命令: cp configure{,.orig} && sed "s/relid'/relid/" configure.orig > configure
更直接的该发,例如安装中提示如下错误
checking system version (for dynamic loading)... ./configure: 1: Syntax error: Unterminated quoted string
tcl8.3.2 configuration failed! Exiting
这时,进入 ns-allinone/tcl8.3/unix ,打开 configure文件,查找relid字符,会找到如下语句:
if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
system=MP-RAS-`awk '{print }' /etc/.relid'`
.........................................................
if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
system=MP-RAS-`awk '{print }' /etc/.relid'`
把 relid'`中的 '符号去掉即可,tk和otcl安装也会遇到类似问题,方法同上
补充说明:
关于2.26和2.27版本中的configure文件中“relid”字符问题,
只有tcl和tk文件夹下的unix文件夹里configure文件,以及otcl文件夹的configure有relid后面多一个单引号’的问题,去掉单引号即可
即搜索到relid'`,而后改成relid`
2) ns-allinone有一些软件包可以单独安装,比如nam-1.x等,进入相应目录后安装命令如下:
./configure;
make
sudo make install
3) 关于gcc, g++版本修改(ubuntu)
gcc -v-显示现在实用gcc版本;
gcc 按tab键,显示现在系统中已有gcc;
* 可以改变现在系统使用gcc的版本(假设原来是 gcc-4.1);
首先,先删除原有的gcc连接,假设原来是 gcc-4.1,则进入安装gcc的目录后,假设安装在 /usr/bin下
(查看原来的gcc所在的路径:% which gcc)
cd /usr/bin
/usr/bin sudo rm gcc (这只是删除快捷方式)
第二,建立新的gcc连接 (建立新的快捷方式)
/usr/bin sudo ln -s gcc-3.4 gcc (ln -s 表示建立符号链接)
(注:分别使用gcc34、g++34、gcj34来调用GCC 3.4.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了)
相当于建立到各种gcc版本的快捷方式
g++版本修改同上
4) 关于gcc和g++安装
如果用ubuntu live cd 安装,这两个东东实际上都没有装,需要上网装或者用live dvd通过dvd安装光盘安装
5) 如果nam不能直接启动(但是在ubuntu8.x下我没有遇到这个问题,这个问题不是必然出现的)
sudo ln -s /home/wei/nsallione-2.30/ns-2.30/nam-1.12 nam /usr/bin nam
即在/usr/bin下建立一个名位nam的快捷方式指向可执行文件nam
6) 关于不同版本ns2的安装,特别是关于编译起gcc的选择
6.1)ns-2.26安装
用gcc 3.3,g++-3.3
6.2)ns-2.27安装
用gcc-3.3 和g++-3.0,在ubuntu下安装ok
6.3)ns-2.29 安装
用gcc-3.3和gcc-3.4编译不能通过,在遇到wpan模块时出错
-----------------------------
用gcc-3.4,gcc-4.1,编译不能通过,“./sctp/sctp.h:705:错误,有多余的限定'SctpAgent::'
在成员'DumpSendBuffer’'上make:***[trace/trace.o]错误1.
-----------------------------
用gcc-4.3编译不能通过,
“./sctp/sctp.h:705:错误,有多余的限定'SctpAgent::'
在成员'DumpSendBuffer’'上...
/trace/trace.cc:185警告:不建议使用从字符串常量到"char*"的转换make:***[trace/trace.o]错误1
6.4)ns-2.30安装
用gcc-3.4编译不能通过,在遇到wpan模块时出错
用gcc 4.3,g++-4.3可安装,但安装过程中显示若干警告条目,不知会有什么具体影响;
6.5)ns-2.31安装
用gcc 4.1,g++-4.1可安装,安装过程中警告条目不如用gcc4.3装ns2.30时多
6.6)ns-2.33安装
用gcc 4.3,g++-4.3可安装,但安装过程中显示若干警告条目,不知会有什么具体影响;
7)关于wpan(802.15.4模块)
ns2.30和ns2.31中均有此模块,用gcc3.3编译会出错,用gcc4则不会
出错提示如下
tag.o diffusion3/filters/rmst/rmst.o diffusion3/filters/rmst/rmst_filter.o gen/version.o gen/ns_tcl.o gen/ptypes.o common/win32.o -L/root/nsroot/ns-allinone-2.27/tclcl-1.15 -ltclcl -L/root/nsroot/ns-allinone-2.27/otcl-1.8 -lotcl -L/root/nsroot/ns-allinone-2.27/lib -ltk8.4 -L/root/nsroot/ns-allinone-2.27/lib -ltcl8.4 -lXext -lX11 -lnsl -ldl -lm
`.gnu.linkonce.t._ZN11taskPending10taskStatusEh' referenced in section `.rodata' of wpan/p802_15_4mac.o: defined in discarded section `.gnu.linkonce.t._ZN11taskPending10taskStatusEh' of wpan/p802_15_4mac.o
collect2: ld returned 1 exit status
make: *** [ns] 错误 1
8) 关于ubuntu 源
i: 源文件位置
/etc/apt/sources.list ,在这个文件里可以手工添加各种源
ii: 如何选择源
一种方法是把网上别人提供的源,添加到sources.list 文件中
二(推荐),在“软件源”,选择 “下载自”- “其他...”,点击“选择最佳服务器”,这时系统会帮你搜索最快的服务器(建议国家选择中国,如果你装的是英文界面,默认是美国)。
9) 在ns2中修改或添加文件后
i:修改.cc文件后
修改.cc文件后,重新make即可
i::修改.h文件后,或者默认的tcl文件(这里不是指自己写的仿真脚本)
修改.h文件后,整个ns-2.xx要重新编译,命令如下
make clean
./configure
make
sudo make install
或者以下过程更妥当
./configure
make clean
./configure
make
sudo make install
111) 其他问题描述
i:我新增完一個C++和OTCL的鏈結變數後,跑模擬都會出現warning: no class variable xx:variable_。
解決方案:
在~ns2/tcl/lib中的ns-default.tcl加入預設值後,重新編譯ns2。
1) ns2的安装
i: 一般安装,进入 ns-allinone-2.xx目录后,执行: ./install 即可
ii: 安装完毕后,要设置环境变量,在.bashrc的文件末尾(ubuntu 版本中在用户目录下,如/home/weizai)增加以下语句(假设在/home/weizai/ns2work 下安装了ns-allinone-2.30):
export NS_HOME=/home/weizai/ns2work/ns-allinone-2.30
export PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/bin:$PATH
export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/otcl-1.12:$NS_HOME/lib:$LD_LIBRARY_PATH
export TCL_LIBRARY=$NS_HOME/tcl8.4.13/library
保存文件退出,重新打开终端,这时在终端键入 ns,应该出现%,可用./validate检查安装是否成功。
iii: 要记得安装tk和tcl, ns-allinone-2.26(含2.26)以前对应的版本是8.3,以后是8.4
以ubuntu为例,在新立德软件包管理器中就可以选择,强烈建议上网不方便或网速不快的用户使用ubuntu DVD进行安装,不少基本软件在DVD中都有,安装方便快捷。
iv: nam安装不上
* 要安装libxmu-dev包,不然无法编译通过nam-1.11,会报“没有X11/Xmu/WinUtil.h”的错误。
在ubuntu中选择安装libxmu-dev包时,libxt-dev包会关联安装。(libxt-dev 这个包也是必须的。)
* 在ubuntu8.x版本的dvd光盘中希望安装libxmu-dev,但会提示不能安装。
解决方法1:到网上下载libxmu-dev包,按照一般软件包安装步骤-configure, make, sudo make install 安装。
解决方法2: 尝试用低版本的ubuntu DVD,比如用ubuntu7.0,在新立得中添加此光盘源,而后在终端用sudo apt-get install libxmu-dev安装
v: 解决因为reldi'`,安装ns2,提示Syntax error: Unterminated quoted string,导致tcl,tk,otcl不能安装的问题(这个问题是因gcc对语法要求更加严格):
分别进入以下3个文件夹:
*/ns-allinone-2.29/tcl8.4.11/unix/
*/ns-allinone-2.29/tcl8.4.11/tk8.4.11/unix/
*/ns-allinone-2.29/otcl-1.11/
执行命令: cp configure{,.orig} && sed "s/relid'/relid/" configure.orig > configure
更直接的该发,例如安装中提示如下错误
checking system version (for dynamic loading)... ./configure: 1: Syntax error: Unterminated quoted string
tcl8.3.2 configuration failed! Exiting
这时,进入 ns-allinone/tcl8.3/unix ,打开 configure文件,查找relid字符,会找到如下语句:
if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
system=MP-RAS-`awk '{print }' /etc/.relid'`
.........................................................
if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
system=MP-RAS-`awk '{print }' /etc/.relid'`
把 relid'`中的 '符号去掉即可,tk和otcl安装也会遇到类似问题,方法同上
补充说明:
关于2.26和2.27版本中的configure文件中“relid”字符问题,
只有tcl和tk文件夹下的unix文件夹里configure文件,以及otcl文件夹的configure有relid后面多一个单引号’的问题,去掉单引号即可
即搜索到relid'`,而后改成relid`
2) ns-allinone有一些软件包可以单独安装,比如nam-1.x等,进入相应目录后安装命令如下:
./configure;
make
sudo make install
3) 关于gcc, g++版本修改(ubuntu)
gcc -v-显示现在实用gcc版本;
gcc 按tab键,显示现在系统中已有gcc;
* 可以改变现在系统使用gcc的版本(假设原来是 gcc-4.1);
首先,先删除原有的gcc连接,假设原来是 gcc-4.1,则进入安装gcc的目录后,假设安装在 /usr/bin下
(查看原来的gcc所在的路径:% which gcc)
cd /usr/bin
/usr/bin sudo rm gcc (这只是删除快捷方式)
第二,建立新的gcc连接 (建立新的快捷方式)
/usr/bin sudo ln -s gcc-3.4 gcc (ln -s 表示建立符号链接)
(注:分别使用gcc34、g++34、gcj34来调用GCC 3.4.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了)
相当于建立到各种gcc版本的快捷方式
g++版本修改同上
4) 关于gcc和g++安装
如果用ubuntu live cd 安装,这两个东东实际上都没有装,需要上网装或者用live dvd通过dvd安装光盘安装
5) 如果nam不能直接启动(但是在ubuntu8.x下我没有遇到这个问题,这个问题不是必然出现的)
sudo ln -s /home/wei/nsallione-2.30/ns-2.30/nam-1.12 nam /usr/bin nam
即在/usr/bin下建立一个名位nam的快捷方式指向可执行文件nam
6) 关于不同版本ns2的安装,特别是关于编译起gcc的选择
6.1)ns-2.26安装
用gcc 3.3,g++-3.3
6.2)ns-2.27安装
用gcc-3.3 和g++-3.0,在ubuntu下安装ok
6.3)ns-2.29 安装
用gcc-3.3和gcc-3.4编译不能通过,在遇到wpan模块时出错
-----------------------------
用gcc-3.4,gcc-4.1,编译不能通过,“./sctp/sctp.h:705:错误,有多余的限定'SctpAgent::'
在成员'DumpSendBuffer’'上make:***[trace/trace.o]错误1.
-----------------------------
用gcc-4.3编译不能通过,
“./sctp/sctp.h:705:错误,有多余的限定'SctpAgent::'
在成员'DumpSendBuffer’'上...
/trace/trace.cc:185警告:不建议使用从字符串常量到"char*"的转换make:***[trace/trace.o]错误1
6.4)ns-2.30安装
用gcc-3.4编译不能通过,在遇到wpan模块时出错
用gcc 4.3,g++-4.3可安装,但安装过程中显示若干警告条目,不知会有什么具体影响;
6.5)ns-2.31安装
用gcc 4.1,g++-4.1可安装,安装过程中警告条目不如用gcc4.3装ns2.30时多
6.6)ns-2.33安装
用gcc 4.3,g++-4.3可安装,但安装过程中显示若干警告条目,不知会有什么具体影响;
7)关于wpan(802.15.4模块)
ns2.30和ns2.31中均有此模块,用gcc3.3编译会出错,用gcc4则不会
出错提示如下
tag.o diffusion3/filters/rmst/rmst.o diffusion3/filters/rmst/rmst_filter.o gen/version.o gen/ns_tcl.o gen/ptypes.o common/win32.o -L/root/nsroot/ns-allinone-2.27/tclcl-1.15 -ltclcl -L/root/nsroot/ns-allinone-2.27/otcl-1.8 -lotcl -L/root/nsroot/ns-allinone-2.27/lib -ltk8.4 -L/root/nsroot/ns-allinone-2.27/lib -ltcl8.4 -lXext -lX11 -lnsl -ldl -lm
`.gnu.linkonce.t._ZN11taskPending10taskStatusEh' referenced in section `.rodata' of wpan/p802_15_4mac.o: defined in discarded section `.gnu.linkonce.t._ZN11taskPending10taskStatusEh' of wpan/p802_15_4mac.o
collect2: ld returned 1 exit status
make: *** [ns] 错误 1
8) 关于ubuntu 源
i: 源文件位置
/etc/apt/sources.list ,在这个文件里可以手工添加各种源
ii: 如何选择源
一种方法是把网上别人提供的源,添加到sources.list 文件中
二(推荐),在“软件源”,选择 “下载自”- “其他...”,点击“选择最佳服务器”,这时系统会帮你搜索最快的服务器(建议国家选择中国,如果你装的是英文界面,默认是美国)。
9) 在ns2中修改或添加文件后
i:修改.cc文件后
修改.cc文件后,重新make即可
i::修改.h文件后,或者默认的tcl文件(这里不是指自己写的仿真脚本)
修改.h文件后,整个ns-2.xx要重新编译,命令如下
make clean
./configure
make
sudo make install
或者以下过程更妥当
./configure
make clean
./configure
make
sudo make install
111) 其他问题描述
i:我新增完一個C++和OTCL的鏈結變數後,跑模擬都會出現warning: no class variable xx:variable_。
解決方案:
在~ns2/tcl/lib中的ns-default.tcl加入預設值後,重新編譯ns2。
2010年1月14日星期四
2010年1月13日星期三
Range of nodes that affected on WirelessChannel
distCST_=550.0
radius=distCST+/*safety*/5=555.0
xmin = mn->X() - radius;
xmax = mn->X() + radius;
ymin = mn->Y() - radius;
ymax = mn->Y() + radius;
radius=distCST+/*safety*/5=555.0
xmin = mn->X() - radius;
xmax = mn->X() + radius;
ymin = mn->Y() - radius;
ymax = mn->Y() + radius;
2010年1月12日星期二
2010年1月6日星期三
struct if_head?
[ns] What's ifhead_.lh_first mean?
Hi,
> When I read ns source codes, in file channel.cc, I cannot understand
> the variable ifhead_.lh_first, what is it defined as?
> I know ifhead_ is a structor in c++, but can you tell me what's the
> detail of the structor? and what's ifhead_.lh_first ?
The if_head structure is defined in mac/phy.h (which is included by mac/channel.h)
as below.
--------------
58 LIST_HEAD(if_head, Phy);
LIST_HEAD macro is defined in lib/bsd-list.h as below.
--------------
92 /*
93 * List definitions.
94 */
95 #define LIST_HEAD(name, type) \
96 struct name { \
97 type *lh_first; /* first element */ \
98 }
So, if_head structure is defined as below.
--------------
struct if_head {
Phy *lh_first; /* first element */
}
So, ifhead.lh_first means "the firstly-added PHY element on this Channel."
A phy is added onto a channel by executing "addif" instance procedure of
the channel at TCL level. Below is the C++ code which is executed when
"addif" instance procedure is executed.
mac/channel.cc
--------------
98 int Channel::command(int argc, const char*const* argv)
99 {
100
101 if (argc == 3) {
102 TclObject *obj;
103
104 if( (obj = TclObject::lookup(argv[2])) == 0) {
105 fprintf(stderr, "%s lookup failed\n", argv[1]);
106 return TCL_ERROR;
107 }
108 if (strcmp(argv[1], "trace-target") == 0) {
109 trace_ = (Trace*) obj;
110 return (TCL_OK);
111 }
112 else if(strcmp(argv[1], "addif") == 0) {
113 ((Phy*) obj)->insertchnl(&ifhead_);
114 ((Phy*) obj)->setchnl(this);
115 return TCL_OK;
116 }
mac/phy.h
------------
87 // list of all network interfaces on a channel
88 Phy* nextchnl(void) const { return chnl_link_.le_next; }
89 inline void insertchnl(struct if_head *head) {
90 LIST_INSERT_HEAD(head, this, chnl_link_);
91 //channel_ = chnl;
92 }
lib/bsd-list.h
--------------
128 #define LIST_INSERT_HEAD(head, elm, field) { \
129 if (((elm)->field.le_next = (head)->lh_first) != NULL) \
130 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
131 (head)->lh_first = (elm); \
132 (elm)->field.le_prev = &(head)->lh_first; \
133 }
Could this be answer for your question?
Regards,
masuto
Hi,
> When I read ns source codes, in file channel.cc, I cannot understand
> the variable ifhead_.lh_first, what is it defined as?
> I know ifhead_ is a structor in c++, but can you tell me what's the
> detail of the structor? and what's ifhead_.lh_first ?
The if_head structure is defined in mac/phy.h (which is included by mac/channel.h)
as below.
--------------
58 LIST_HEAD(if_head, Phy);
LIST_HEAD macro is defined in lib/bsd-list.h as below.
--------------
92 /*
93 * List definitions.
94 */
95 #define LIST_HEAD(name, type) \
96 struct name { \
97 type *lh_first; /* first element */ \
98 }
So, if_head structure is defined as below.
--------------
struct if_head {
Phy *lh_first; /* first element */
}
So, ifhead.lh_first means "the firstly-added PHY element on this Channel."
A phy is added onto a channel by executing "addif" instance procedure of
the channel at TCL level. Below is the C++ code which is executed when
"addif" instance procedure is executed.
mac/channel.cc
--------------
98 int Channel::command(int argc, const char*const* argv)
99 {
100
101 if (argc == 3) {
102 TclObject *obj;
103
104 if( (obj = TclObject::lookup(argv[2])) == 0) {
105 fprintf(stderr, "%s lookup failed\n", argv[1]);
106 return TCL_ERROR;
107 }
108 if (strcmp(argv[1], "trace-target") == 0) {
109 trace_ = (Trace*) obj;
110 return (TCL_OK);
111 }
112 else if(strcmp(argv[1], "addif") == 0) {
113 ((Phy*) obj)->insertchnl(&ifhead_);
114 ((Phy*) obj)->setchnl(this);
115 return TCL_OK;
116 }
mac/phy.h
------------
87 // list of all network interfaces on a channel
88 Phy* nextchnl(void) const { return chnl_link_.le_next; }
89 inline void insertchnl(struct if_head *head) {
90 LIST_INSERT_HEAD(head, this, chnl_link_);
91 //channel_ = chnl;
92 }
lib/bsd-list.h
--------------
128 #define LIST_INSERT_HEAD(head, elm, field) { \
129 if (((elm)->field.le_next = (head)->lh_first) != NULL) \
130 (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
131 (head)->lh_first = (elm); \
132 (elm)->field.le_prev = &(head)->lh_first; \
133 }
Could this be answer for your question?
Regards,
masuto
订阅:
博文 (Atom)