<< 十月 2013 | 首页 | 十二月 2013 >>

JVM 内存管理机制构成 及物理内存和虚拟内存

 

Better performance in production servers is possible with proper configuration of JVM parameters, particularily those related to memory usage and garbage collection.

unix&gt; bin/httpd.sh -Xmn100M -Xms500M -Xmx500M win&gt; bin/httpd.exe -Xmn100M -Xms500M -Xmx500M install win service&gt; bin/httpd.exe -Xmn100M -Xms500M -Xmx500M -install

 

It is good practice with server-side Java applications like Resin to set the minimum -Xms and maximum -Xmx heap sizes to the same value.

For efficient garbage collection, the -Xmn value should be lower than the -Xmx value.

 

If you monitor your java process with an OS tool like top or taskmanager, you may see the amount of memory you use exceed the amount you have specified for -Xmx. -Xmx limits the java heap size, java will allocate memory for other things, including a stack for each thread. It is not unusual for the total memory consumption of the VM to exceed the value of -Xmx.

(thanks to Rob Lockstone for his comments)

There are essentially two GC threads running. One is a very lightweight thread which does "little" collections primarily on the Eden (a.k.a. Young) generation of the heap. The other is the Full GC thread which traverses the entire heap when there is not enough memory left to allocate space for objects which get promoted from the Eden to the older generation(s).

If there is a memory leak or inadequate heap allocated, eventually the older generation will start to run out of room causing the Full GC thread to run (nearly) continuously. Since this process "stops the world", Resin won't be able to respond to requests and they'll start to back up.

The amount allocated for the Eden generation is the value specified with -Xmn. The amount allocated for the older generation is the value of -Xmx minus the -Xmn. Generally, you don't want the Eden to be too big or it will take too long for the GC to look through it for space that can be reclaimed.

See also:

Each thread in the VM get's a stack. The stack size will limit the number of threads that you can have, too big of a stack size and you will run out of memory as each thread is allocated more memory than it needs.

The Resin startup scripts (httpd.exe on Windows, wrapper.pl on Unix) will set the stack size to 2048k, unless it is specified explicity. 2048k is an appropriate value for most situations.

 

-Xss determines the size of the stack: -Xss1024k. If the stack space is too small, eventually you will see an exception .

Some people have reported that it is necessary to change stack size settings at the OS level for Linux. A call to ulimit may be necessary, and is usually done with a command in /etc/profile:

ulimit -s 2048

JDK 5 includes a number of tools that are useful for monitoring the JVM. Documentation for these tools is available from the Sun website. For JDK's prior to 5, Sun provides the jvmstat tools.

The most useful tool is jconsole. Details on using jconsole are provided in the Administration section of the Resin documentation.

win> ./httpd.exe -Dcom.sun.management.jmxremote unix> bin/httpd.sh -Dcom.sun.management.jmxremote ... in another shell window ... win> jconsole.exe unix> jconsole Choose Resin's JVM from the "Local" list.

jps and jstack are also useful, providing a quick command line method for obtaining stack traces of all current threads. Details on obtaining and interpreting stack traces is in the Troubleshooting section of the Resin documentation.

# jps 12903 Jps 20087 Resin # jstack 20087 Attaching to process ID 20087, please wait... Debugger attached successfully. Client compiler detected. JVM version is 1.5.0-beta2-b51 Thread 12691: (state = BLOCKED) - java.lang.Object.wait(long) (Compiled frame; information may be imprecise) - com.caucho.util.ThreadPool.runTasks() @bci=111, line=474 (Compiled frame) - com.caucho.util.ThreadPool.run() @bci=85, line=423 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=595 (Interpreted frame) Thread 12689: (state = BLOCKED) - java.lang.Object.wait(long) (Compiled frame; information may be imprecise) - com.caucho.util.ThreadPool.runTasks() @bci=111, line=474 (Compiled frame) - com.caucho.util.ThreadPool.run() @bci=85, line=423 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=595 (Interpreted frame) ...

 

阅读全文……

标签 : ,

程序员浪费生命的几种方式

程序员应该要爱惜生命,做有用有意义的事情。做有用的事情,有两种方式,一、做一个对用户真正有价值的项目,这个项目是真正有意义有用的;二、朝正确的方向以正确的方式做项目。但是程序员会遇到很多失败的项目,这些系统要么是没有人用没有真正价值,要么是以不正确的方式做项目,使用不当的技术,例如,用报表工具代替查询、用ESB企业总线当作海量数据传输用,或者做一些没有实际用途的功能,如做一个万能的用户自定义查询系统、做用户自定义工作流工具、做用户自定义报表工具,这些项目无疑在浪费程序员的生命。笔者试图总结程序员浪费生命的几种方式,如下。

1、开发一个质量和性能很差的系统

程序员经常会碰到这样的项目,做出来的系统质量很差,操作无反馈,失败无提示,而且速度很慢,操作时不时要等一会儿。然而,关键是程序员没有机会或者不想参与实施和维护,失去了学习和诊断问题的机会。

2、花费大量人力财力开发一个一次性的项目

这是从事应用开发程序员经常碰到的情况,为某个客户定制化开发一个一次性的项目,然而这个项目要花费巨大的人力成本,最终开发维护周期很长,以巨大亏本收尾或无法收尾。

3、开发一个很漂亮花哨的无人用的系统

这也是当前常见的情况,客户要做一个亮点政绩工程,要做一个界面漂亮花哨“很炫”的系统,各种图表,各种交互方式、各种监控分析全部堆上,但最终这样的系统是没有人用的。这只是给领导或客人参观用的。

4、全新开发一个原有遗留的系统

程序员的领导要基于原有的系统重新做一个产品,大幅提升可维护性可扩展性,增加系统的稳定性,减少系统故障。领导决定召集人马,重新进行需求调研,需求分析,架构设计、编码开发测试。但是,这样的事情一再重复,同样类似的需求给不同的客户做了一套又一套新的系统,而且每个系统过一段时间后故障不稳定的情况依旧。各种版本、各种代码库留给了程序员......程序员需要持续给不同客户维护不同版本的系统。

5、开发一个项目范围不确定的系统

程序员所在的项目,没有人管理项目范围,没有WBS,用户提一点做一点,项目完全没有合同或契约约束,用户要做的越来越多,系统做得越来越大,最终无法控制,客户不满意,程序员也累得半死,试图讨好客户争取更大项目的计划失败。

6、开发一个没有系统角色或涉众的系统

程序员做的这个项目,虽然都有需求、有功能、有界面,但是奇怪的是,需求没有提到,也没有人知道这些功能是什么人用的。需求没有定义出系统的角色,以及角色所要参与的业务活动。然而这样的项目也不少见,

7、开发一个使用环境不确定的项目

程序员做的企业应用项目,不知道是给电脑用的还是给移动设备用的,不知道是给IE用的还是其他浏览器用的,不知道是给IE6用的还是IE10用的,不能确定浏览器平台版本。移动设备不知道是iOS还是Android,Android不知道是2.3的还是4.0的,也不能确定手机或平板电脑型号。我们知道,中等规模的企业应用都会比互联网应用要复杂很多,几乎不可能覆盖所有用户的使用终端平台,要做一个优秀系统必须有约束条件,有使用的目标平台。

针对以上各种情况,程序员经常是没办法干预的,因为,要么这是客户明知故犯的行为,要么是公司部门的战略行为,要么是由于项目经理基本的技能职责缺乏。当然程序员可以假设自己是项目经理,考虑该如何做好这些项目并适时适当的提出问题或解决办法,以免浪费自己的生命。转载请保留 IT瘾原文链接。

 

SQL执行计划 Execution plan with Derby

CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(1);

select * from EDW_BPM_OBJECT;

call SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(0);

VALUES SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS();

 

标签 : ,

Nginx安装 – 运维与架构

2.安装PCRE库
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:

cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar -zxvf pcre-8.21.tar.gz
cd pcre-8.21
./configure
make
make install

3.安装zlib库
http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:

cd /usr/local/src
 
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make
make install

4.安装ssl(某些vps默认没装ssl)

cd /usr/local/src
wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar -zxvf openssl-1.0.1c.tar.gz

5.安装nginx

Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤:

cd /usr/local/src
wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar -zxvf nginx-1.4.2.tar.gz
cd nginx-1.4.2
 
./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.21 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-openssl=/usr/local/src/openssl-1.0.1c
 
make
make install

--with-pcre=/usr/src/pcre-8.21 指的是pcre-8.21 的源码路径。
--with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源码路径。

 

阅读全文……

标签 : ,

利用光盘在 centos5.4 上安装gcc步骤 - 石林博客 - 51CTO技术博客

CentOS5.4系统安装在虚拟机上,编译gcc. 
挂载CentOS的DVD系统光盘,然后进入CentOS目录内,安装顺序如下:
rpm -ivh cpp-4.1.2-42.el5.i386.rpm
rpm -ihv kernel-headers-2.6.18-92.el5.i386.rpm
rpm -ivh glibc-headers-2.5-24.i386.rpm 
rpm -ivh glibc-devel-2.5-24.i386.rpm 
rpm -ivh libgomp-4.1.2-42.el5.i386.rpm 
rpm -ivh gcc-4.1.2-42.el5.i386.rpm

注意:必须安装: kernel-headers-2.6.18-92.el5.i386.rpm 这个包,否则报错:
warning: glibc-headers-2.5-24.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
error: Failed dependencies:
kernel-headers is needed by glibc-headers-2.5-24.i386
kernel-headers >= 2.2.1 is needed by glibc-headers-2.5-24.i386
安装:g++

rpm -ihv libstdc++-devel-4.1.2-42.el5.i386.rpm
rpm -ihv gcc-c++-4.1.2-42.el5.i386.rpm

阅读全文……

标签 : ,

Redhat Linux 光盘安装gcc

Here is the Document which states how to install GCC with dependencies,
 

Problem:
————————————————————————————
[[email protected] Packages]# rpm -ivh gcc-4.4.4-13.el6.x86_64.rpm
warning: gcc-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
 cloog-ppl >= 0.15 is needed by gcc-4.4.4-13.el6.x86_64
 cpp = 4.4.4-13.el6 is needed by gcc-4.4.4-13.el6.x86_64
------------------------------------------------------------------------

Solution:
Run these commands:
1) First, let’s get glibc header:
[[email protected] Packages]# rpm -ivh glibc-headers-2.12-1.7.el6.x86_64.rpm
warning: glibc-headers-2.12-1.7.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:glibc-headers          ########################################### [100%]

2) Now, glibc devel:
[[email protected] Packages]# rpm -ivh glibc-devel-2.12-1.7.el6.x86_64.rpm
warning: glibc-devel-2.12-1.7.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:glibc-devel            ########################################### [100%]

3) Let's see if cpp installation works now:
[[email protected] Packages]# rpm -ivh cpp-4.4.4-13.el6.x86_64.rpm
warning: cpp-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
 libmpfr.so.1()(64bit) is needed by cpp-4.4.4-13.el6.x86_64

4) Let's sort out above error:
[[email protected] Packages]# rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm
warning: mpfr-2.4.1-6.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:mpfr                   ########################################### [100%]

5) Try if cloog is working for you:
[[email protected] Packages]# rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm
warning: cloog-ppl-0.15.7-1.2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
 libppl.so.7()(64bit) is needed by cloog-ppl-0.15.7-1.2.el6.x86_64
 libppl_c.so.2()(64bit) is needed by cloog-ppl-0.15.7-1.2.el6.x86_64

6) Install ppl:
[[email protected] Packages]# rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm
warning: ppl-0.10.2-11.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:ppl                    ########################################### [100%]

7) Try again, if gloog is working:
[[email protected] Packages]# rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm
warning: cloog-ppl-0.15.7-1.2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:cloog-ppl              ########################################### [100%]

8) Install cpp:
[[email protected] Packages]# rpm -ivh cpp-4.4.4-13.el6.x86_64.rpm
warning: cpp-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:cpp                    ########################################### [100%]

9) Finally, install gcc:
[[email protected] Packages]# rpm -ivh gcc-4.4.4-13.el6.x86_64.rpm
warning: gcc-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing… ########################################### [100%]
1:gcc ########################################### [100%]
 
 
10) Alternatively instead of step 9, you can use YUM,
[[email protected] Packages]# sudo yum install gcc-4.4.6-3.el6.x86_64.rpm 

 

 

 

 

另外一次安装记录:

 

[root@oel6test Packages]# rpm -ivh gcc-4.4.4-13.el6.x86_64.rpm 
warning: gcc-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
cloog-ppl >= 0.15 is needed by gcc-4.4.4-13.el6.x86_64
cpp = 4.4.4-13.el6 is needed by gcc-4.4.4-13.el6.x86_64

First up:

[root@oel6test Packages]# rpm -ivh glibc-headers-2.12-1.7.el6.x86_64.rpm 
warning: glibc-headers-2.12-1.7.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:glibc-headers ########################################### [100%]

Now I can load the devel files for glibc.

[root@oel6test Packages]# rpm -ivh glibc-devel-2.12-1.7.el6.x86_64.rpm 
warning: glibc-devel-2.12-1.7.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:glibc-devel ########################################### [100%]

What else?

[root@oel6test Packages]# rpm -ivh cpp-4.4.4-13.el6.x86_64.rpm 
warning: cpp-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
libmpfr.so.1()(64bit) is needed by cpp-4.4.4-13.el6.x86_64

Seriously. Since this isn't the first time today, I know what package that so file is from.

[root@oel6test Packages]# rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm 
warning: mpfr-2.4.1-6.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:mpfr ########################################### [100%]

Now cloog-ppl.

[root@oel6test Packages]# rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm 
warning: cloog-ppl-0.15.7-1.2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
libppl.so.7()(64bit) is needed by cloog-ppl-0.15.7-1.2.el6.x86_64
libppl_c.so.2()(64bit) is needed by cloog-ppl-0.15.7-1.2.el6.x86_64

What about a ppl* package?

[root@oel6test Packages]# rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm 
warning: ppl-0.10.2-11.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:ppl ########################################### [100%]

Almost there. Back to cloog.

[root@oel6test Packages]# rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm 
warning: cloog-ppl-0.15.7-1.2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:cloog-ppl ########################################### [100%]

cpp

[root@oel6test Packages]# rpm -ivh cpp-4.4.4-13.el6.x86_64.rpm 
warning: cpp-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:cpp ########################################### [100%]

gcc?


[root@oel6test Packages]# rpm -ivh gcc-4.4.4-13.el6.x86_64.rpm 
warning: gcc-4.4.4-13.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ########################################### [100%]
1:gcc ########################################### [100%]

 

 

再一次gcc安装记录,另加C++

#gcc

rpm -ivh kernel-headers*

rpm -ivh glibc-headers*

rpm -ivh mpfr*

rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm

rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm

rpm -ivh cpp*

rpm -ivh glibc-devel-2.12-1.7.el6.x86_64.rpm

 

#c++

rpm -ivh libstdc++-devel-4.4.4-13.el6.x86_64.rpm

rpm -ivh gcc-c++-4.4.4-13.el6.x86_64.rpm

标签 : ,

澳门一日游

澳门一日游

  澳门---澳门氹仔临时客运码头
香港---香港港澳码头(上环)上环干诺道中20号信德中心三楼

在上环港澳码头坐船去澳门,出了码头大厅,乘坐新葡京的免费巴士(新普京的车,去程是免费上车的,回码头就需要出示票了,这个票呢,跟赌场里的荷官要就行了),新葡京门口到大三巴的行走路线图。途中会路过民政总署,一路试吃到饱的街。在前走就是大三巴了,大三巴到此一游后,原路返回,去新普京坐免费的巴士回码头,下车直接去坐威尼斯人的免费巴士去威尼斯人.出威尼斯人坐车去码头回香港。

大家过关的时候建议坐车直接到新葡京或者葡京,其中,永利到新葡京的距离是500米左右,新葡京到玛嘉烈葡挞也只是200米左右。玛嘉烈再走一小会就到新马路区域。

玛嘉烈蛋挞(澳门)从普京出来,右拐,沿着马路走,看到周大福的照片那个路口拐进去,第一个路口再拐进去,就看到了
普京赌场(从外港客运码头直接坐免费巴士)-正确的应该是出了新葡京,在面对它的左手边那条路一直往前走-步行至大三巴--炮台--澳门博物馆(这三个景点在一起的,大家一线就可以玩完)--步行回葡京赌场去赌场要免费去外港客运码头的车票--从码头再坐免费大巴去威尼斯人酒店--免费巴士返回码头


贡多拉:【换票地点】:威尼斯人酒店大运河购物中心3楼,贡多拉礼品及售票廊(铺号2301及2660)换票

澳门公共免费WIFI 
在议事亭前地利斯大厦的旅游谘询处、公共图书馆、一些酒店和网吧内都能上网。 
“WiFi任我行”是澳门免费提供的WiFi热点服务,贴有该标志的区域都覆盖有无线网络,游客可以在每天8:00-次日1:00连接使用,每次连接限时45分钟,断开后可再次连接。网络名称为“wifigo”(非加密)和“wifigo-s”(加密),加密网络的登录名称和密码同为“wifigo”。
1、威尼斯人度假村 
亚洲最大的赌场度假村综合建筑。以意大利水都威尼斯为主题,酒店周围内充满威尼斯特色拱桥、小运河及石板路。充满威尼斯人浪漫狂放享受生活之异国风情。
拥有世界一流的设施,其规模更超越美国拉斯维加斯,其中包括超过六十平方米的豪华客房、近十万平方米并汇集世界名牌的大运河购物区、八千平方米的水疗中心,以及驻场表演的太阳马戏团等。预计威尼斯人度假村的开幕,除了能吸引赌客外,亦会吸引不少商务会议及展览活动转到澳门举行,度假村期望可以吸引到一批高消费的商务旅客到澳门消费。 

地址:路氹 氹仔金光大道 望德圣母湾大马路开放时间:24小时开放到达方式:酒店在澳门门机场/港澳码头/氹仔码头都设有免费巴士直达酒店。

2)大三巴牌坊(Ruins of St. Paul's Cathedral ) 
是澳门代表性的建筑,为天主之母教堂前壁遗址。教堂于1835年失火被毁,仅剩正面前壁、大部分地基以及教堂前的石阶。 本地人因教堂前壁形似中国传统牌坊,将之称为大三巴牌坊。大三巴牌坊作为澳门历史城区的一部分成为世界文化遗产。 大三巴牌坊右侧有一座供奉哪咤的哪吒庙(Na Tcha Temple),是小型的中式建筑,为澳门历史城区的一部份。
地址:澳门岛大三巴斜巷 门票:免费参观交通:乘坐8A、18、18A、19、26路到白鸽巢前地站,或17路白鸽巢总站南行花王堂街、大三巴街到达;乘坐2、3、3A、 3X、5、7、10、10A、11、18、21A、26A、33到新马路,沿大街北行。
3)玫瑰圣母堂 (St. Dominic's Church) 
澳门最漂亮的教堂之一,因教堂供奉玫瑰圣母,所以称为玫瑰堂。教堂主体建筑富丽堂皇,外观米黄色与白色相间,配以绿色的门窗,墙体刻着细小的花纹,巴洛克风格的祭坛典雅精致。教堂旁的“圣物宝库”收藏有三百多件澳门天主教的珍贵文物。 
地址:澳门大堂前地 门票:免费 开放时间:10:00-18:00 到达方式:乘坐2、3、3A、3X、5、7、10、10A、11、18、21A、26A、33路公车到新马路/营地大街(西行);乘坐3、4、6、 8A、18A、19、26A、33路公车到新马路(东行)。
4)妈阁庙 (A-Ma Temple) 
妈阁庙的正式名称是妈祖阁,是澳门最古老的庙宇之一。妈阁庙建筑本身面积不大,但却是很多澳门人和游客必去的地方。2005年作为澳门历史城区的一部分被列入世界文化遗产。 
位于妈阁山西面山腰上,主要由入口大门、牌坊、正殿、弘仁殿、观音殿及正觉禅林组成,各建筑规模虽然细小简陋,但却能充分融合自然,布局错落有致。每年春节和农历3月23日娘妈诞,妈阁庙香火至为鼎盛。除夕午夜开始,不少善男信女都会前来拜神祈福。
地址:澳门岛妈阁上街 门票:免费 开放时间:每天 07:00-18:00 到达方式:搭乘1、2、5、6、7、10、10A、11、18、21A、26、28B、MT4路公车到妈阁庙站;或乘坐1、2、5、7、9、 10、10A、11、18、21A、26、MT4路公车到妈阁庙前街。
5)渔人码头(Macau Fisherman\'s Wharf)
是澳门首个主题公园和仿欧美渔人码头的购物中心。建于外港新填海区海岸,邻近港澳码头。占地超过111,500平方米,集娱乐、购物、饮食、酒店、游艇码头及会展设施于一体,结合不同建筑特色及中西文化。“渔人码头”的概念源自欧美,代表的是一种欧陆怀旧式的休闲,它不是单一的娱乐场所,更是一个综合性的逍遥宫。像一座小城市。单是逛逛,一两小时也嫌不够。
地址:半岛新口岸友谊大马路(近孙逸仙大马路)
交通:每天都有专线巴士来往于澳门渔人码头。1、澳门路线和氹仔路线每小时发一班,每天10:00至22:00结束。2、港澳码头循环线每30分钟一班,每天10:00至22:00结束。3、公交1A、3、3A、8、10、10A、10B、17、28A、28B、28BX、28C、32可达。

6)龙环葡韵 
“龙环”是氹仔的旧称,“葡韵”是指葡萄牙的建筑风格,又指氹仔 海边马路一带的景致。龙环葡韵整体包括海边马路的五幢葡式别墅、嘉模教堂、前嘉模图书馆和两个小公园,是澳门极有代表性的景观。五幢葡式住宅建筑其中三幢被改建为博物馆,分别为“土生葡人之家”、“海岛之家”及“葡萄牙地区之家”。 
地址:澳门氹仔海边马路 门票:成人票5澳门元,学生及团体票2澳门元,12岁以下及65岁以上免费。 开放时间:10:00-18:00,17:30后停止入场。周一休馆,周日免费 
到达方式:乘坐11、15、22、28A、30、33、34路公车可到。

7) 大炮台 Fortaleza do Monte 
大炮台的正式名称为圣保禄炮台,位于大三巴牌坊附近,是中国现存最古老的西式炮台建筑群之一。澳门炮台众多,大炮台是当时澳门防御系统的核心,占地约一万平方米。 
大炮台附近有澳门博物馆 (15澳门元,周二-周日10:00-18:00),从历史和文化角度展示澳门数百年间的变迁。 门票:免费 开放时间:7:00-19:00 到达方式:乘坐8A、18、18A、19、26路到白鸽巢前地或乘17路到白鸽巢总站南行花王堂街、大三巴街;乘坐2、3、3A、3X、5、 7、10、10A、11、18、21A、26A、33路到新马路,沿大街北行。
经典路线:从大三巴牌坊出来,想参观澳门博物馆和大炮台的话就从左边向上走。走不太远就会有两条路,最好选择选先去看澳门博物馆,因为去博物馆可以一路乘坐电梯,而看完博物馆出来就是大炮台。如果选择另一条路先看大炮台就要自己爬上山,比较辛苦且浪费时间。

8)黑沙海滩(Praia de Hac sa)
黑沙海滩长约1350米,是澳门地区最大的天然海滩,来这里以本地人居多,大部分都是私家车停在海边上,专门乘坐公交来这里看海的好像不多,这里的沙子是黑色的,风干的沙子是金黄色的,初看会觉得很脏,据澳门本地居民说,这是自然形成的,从开始到现在都是这样的,这下可以放心地和海洋亲密接触了。
地址:澳门路环岛南侧
9)澳门旅游塔(Macau Tower)
338米的旅游塔是澳门的标志性建筑,也是世界高塔联盟成员之一。旅游塔的地下一楼有些商铺,数量不多,主要出售电子产品、化妆品等,不过当地人一般不在此购买。四楼有个电影院,在澳门的银河影院开业以前,这里是学生和当地居民看电影的主要去处,电影的售票中心在一楼。除售票中心之外,一楼还有一个玩具反斗城,每逢双休或者节假日,这里总是会有许多小孩。

  观景点从57楼一直向上延伸到61楼,可坐观光电梯上下。57楼是著名的“空中漫步”可以行走在塔顶高空的外围,周围没有扶手。58楼是室内主要观景台,这里可以俯瞰澳门全景,这一层的地面是由特殊玻璃制成的,可以透过玻璃向下俯瞰。59楼是“180°空中酒吧”,60楼是“360°旋转餐厅”,在这两层俯瞰风景的同时饮酒用膳。61楼是室外观光走廊。
号称世界最高蹦极,勇敢者的游戏,爱刺激的番友,可试试「笨猪跳」、「高飞跳」、「空中漫步X版」及「百步登天」等冒险活动

地址:Largo da Torre de Macau
门票:蹦极跳 (包括证书、会员证及限量版蹦极跳T恤) 2488澳门币。360度旋转餐厅 三百多澳门币。
交通:可以选择打的到旅游塔,起步价13澳门元,或搭乘巴士9A, 18, 21, 23, 32抵达。

10) 议事亭前地(Senado Square) 
议事亭前地是澳门的中心,这里铺设有黑白色碎石波浪形状地面,在周边历史建筑的映衬下,颇有南欧风格。这里是澳门美食和洋房最为集中的地方之一,附近有民政总署、仁慈堂大楼等众多建筑。民政总署房子虽小但内有乾坤,后花园也有东西可看。 

到达方式:乘坐2、3、3A、3X、5、7、10、10A、11、18、21A、26A、33路公车到新马路/营地大街(西行);乘坐3、4、6、8A、18A、19、26A、33路公车到新马路(东行);乘坐2、3A、5、7、10、10A、11、21A到金碧文娱中心(东行)。

玛嘉烈蛋挞
从新普京出来右边直走,过一个街口看到周大福,隔壁的小巷进去就是大名鼎鼎的玛嘉烈蛋挞了,巷口有个招牌,没有标志估计就错过了,玛嘉烈再走一小会就到新马路区域。蛋挞价格7元一个,不便宜哦,不过来澳门的不吃个把个蛋挞那就真的像是没来过一样了。吃的人很多,大家都是一杯饮料加蛋挞,几乎都是刚出炉,因为每天派对的人也都很多啦
地址:马统领街金利来大厦17B地舖(近周大福)
营业时间:星期一至日: 06:30-20:00,逢星期三休息
2)经典行程(香港- 新葡京-大三巴-威尼斯人酒店-香港?)
在上环港澳码头坐船去澳门,出了码头大厅,乘坐新葡京的免费巴士(新普京的车,去程是免费上车的,回码头就需要出示票了,这个票呢,就像番友大大们说的,跟赌场里的荷官要就行了~~),新葡京门口到大三巴的行走路线图。途中会路过民政总署,还有传说中的一路试吃到饱的街。在望前走就是大三巴了,大三巴到此一游后,原路返回,去新普京坐免费的巴士回码头,下车直接去坐威尼斯人的费巴士去威尼斯人.出威尼斯人坐车去码头回香港。
回复 举报

番友3级
4楼
藤原小姐 发表于 3 天前 |只看该作者
第①步(激活卡片):按*109# 呼出,收到短信“你的one2free储值卡储值额是$98元”;
第②步(申请上网):按 *101*832*4# 呼出,收到短信“你已成功申请并启动7.2Mbps 7日通行证”;
第③步(开启网络):重启手机,关闭wifi,开启移动网络iphone:启用3G、蜂窝数据;
等待流量图标点亮(H、3G或E)后即可正常上网,H、3G表示高速3G网络覆盖,E表示普通3G网络覆盖。
如果流量图标很久未点亮,无法上网,请检查接入点:
第④步(检查接入点):
IPHONE:设置→通用→网络→启用3G→蜂窝数据→蜂窝数据网络→APN输入:HKCSL
特别提醒
★开通7天上网(78元)后剩余话费为20元左右,可以用来打电话。系统可能提示充值,请勿担心。即使是话费用完也可以继续上网的,只是不能打电话了。
★开通步骤中,是拨打代码,不是发短信。有少数买家因为误操作发了短信,导致话费减少。同时也建议尽量不要发短信,因为香港短信收费贵,直接打电话更划算。

致电国家(地区) 拨打手机 拨打固话
中国大陆 001+86+大陆手机号码
例如:001 86 15812345678 001+86+区号(去掉0)+大陆固话号码
例如:拨打上海固话 001 86 21 12345678
香港 直拨香港手机号码
例如:6666 8888 直拨香港固话号码
例如:6666 8888
发短信:+86+大陆手机号码(例如:+86 15812345678)
部分智能手机有ip拨号软件,拨打长途电话会自动加ip(如 17951),请注意去掉!

 

阅读全文……

标签 : ,

十个免费简洁的响应式网页框架模板

页面的设计与开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行相应的响应和调整。具体的实践方式由多方面组成,包括弹性网格和布局、图片、CSS media query的使用等。无论用户正在使用笔记本还是iPad,我们的页面都应该能够自动切换分辨率、图片尺寸及相关脚本功能等,以适应不同设备;换句话说,页面应该有能力去自动响应用户的设备环境。响应式网页设计就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这样,我们就可以不必为不断到来的新设备做专门的版本设计和开发了。

 

http://themes.simplethemes.com/skeleton/

http://catchthemes.com/demo/catchbox/

http://responsivetwentyten.com/

http://wp-themes.com/ifeature/?TB_iframe=true&width=905&height=603

http://demo.athemes.com/hiero/

http://demo.mythemeshop.com/bloggie/

http://demo.mythemeshop.com/greenchilli/

http://demo.presscoders.com/designfolio/blog/

http://demo.mythemeshop.com/groovy/

http://demo.mythemeshop.com/accentbox/

 

 

标签 : , ,

Jmeter参数化的4种方法_雅俗共赏_新浪博客

用Jmeter测试时包含两种情况的参数,一种是在url中,一种是请求中需要发送的参数。

 1.URL中的参数,如:http://blog.da-fang.com/index.php/2010/06/01/jmeter参数/,其中“2010/06/01/jmeter参数”为url参数。
2. 请求中的参数,此处只能举例get请求,如:http://blog.da-fang.com/?category=Web,其中“category”是参数名,“Web”是它的值。
对于post请求,用jmeter录制后,可以在请求的“同请求一起发送参数”和“同请求一起发送文件”中找到。

参数化Jmeter脚本时,使用参数的地方书写格式为${参数名}
对于URL“http://blog.da-fang.com/index.php/2010/06/01/jmeter参数/”,在Jmeter的http请求中blog.da-fang.com填写在“服务器名称或IP”中;/index.php/${url_parameter}/填写在“路径”中。
对于请求中的参数http://blog.da-fang.com/?category=Web,在Jmeter的http请求中blog.da-fang.com填写在“服务器名称或IP”中;/填写在“路径”中;参数名称category填写在“同请求一起发送参数”的“名称”中,参数值${category_name}填写在对应的“值”中。

设置参数值的方法有如下几种:

1. 用Jmeter中的函数获取参数值

  __Random,__threadNum,__CSVRead,__StringFromFile,具体调用方法如下

${__Random(,,)},${__threadNum},${__CSVRead(,)},${__StringFromFile(,,,)}。
参看Jmeter函数的使用,通过菜单“选项”->“函数助手对话框”,即可在“函数助手”弹出框上找到Jmeter的函数。
其中${__Random(,,)}方法的第一个参数为随机数的下限,第二个参数为随机数的上限,第三个参数为储存随机数的变量名;${__CSVRead(,)}方法中第一个参数是文件名,第二个参数是文件中的列(列数从0开始);${__StringFromFile(,,,)}方法中第一个参数是文件名,${__StringFromFile(,,,)}方法中没有指定读取文件中的哪一列的参数,所以${__StringFromFile(,,,)}只能读取包含一列的文件。

2.用户定义的变量
2.1 添加“配置元件”->“用户定义的变量”
2.2 “名称”中输入变量名称,此处以登录为例,定义两个变量username和password。“值”中可以直接输入值,也可以通过Jmeter的函数 __CSVRead,__StringFromFile从csv或dat文件中读取,还可以通过前缀加随机数的方法设置参数。
当参数值是某个前缀加一个数字时,可以用前缀名加${__Random(,,)}或${__threadNum}的方法设置参数值。如进行登录测试之前, 先准备了用户名为perf_0到perf_1000的用户,那么用户名就可以设为perf_{__Random(0,1000,)}。
当参数值没有规律的且量不太大时,可以通过${__CSVRead(,)},${__StringFromFile(,,,)}从文件中读取,如将用户名和密码保存在user.csv文件中,user.csv的内容如下:
oriana,123456
admin,admin
dandan,123456
因为user.csv文件中有两列数据,所以只能用${__CSVRead(,)}函数,username参数后的值设为${__CSVRead(user.csv,0)},password参数后的值设为${__CSVRead(user.csv,1)}。

3. 从csv文件中读取
当参数的值没有规律且量不太大时,可以用这种方法。
具体做法如下:
3.1 创建一个csv文件,内容为参数的值集,每一个参数占一列,第一行就开始写参数值,不要写参数名
3.2 在测试计划或线程组中添加一个“配置元件”->“CSV Data Set Config”
3.3 Filename中填写步骤2.1中csv文件的完整路径(当csv文件在bin目录下时,只需给出文件名即可)
3.4 Virable Names中填写变量名,如果csv文件中有多个变量,则用逗号隔开
4.从数据库中获取
当参数的值没有规律且量比较大时,可以选用这种方法。
具体做法如下:
4.1 下载MySQL JDBC “http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.12.zip/from/http://ftp.jaist.ac.jp/pub/mysql/
4.2 解压下载的zip包后,将其中的mysql-connector-java-5.1.12-bin.jar放到Jmeter的lib目录下
4.3 添加“配置元件”->“JDBC Connection Configuration”,设置下列参数:
Database URL:jdbc:mysql://host:port/db(如jdbc:mysql://localhost:3306/testlink
JDBC Driver class:com.mysql.jdbc.Driver
username:连接数据库的用户名(如root)
password:连接数据库的密码
4.4 添加“Sampler”->“JDBC Request”,在SQL Query中输入查询语句,如下:
SELECT CONCAT (“[",
GROUP_CONCAT(
CONCAT("{username:'",login,"'"),
CONCAT("{password:'",password),"'}"),"]“) AS json FROM users
4.5 在4.4中的JDBC请求中添加“后置处理器”->“正则表达式提取器”

阅读全文……

标签 : ,

Spring 的优秀工具类盘点,第 2 部分: 特殊字符转义和方法入参检测工具类

特殊字符转义

由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题。下面是 Web 开发者最常面对需要转义的特殊字符类型:

  • HTML 特殊字符;
  • JavaScript 特殊字符;
  • SQL 特殊字符;

如果不对这些特殊字符进行转义处理,则不但可能破坏文档结构,还可以引发潜在的安全问题。Spring 为 HTML 和 JavaScript 特殊字符提供了转义操作工具类,它们分别是 HtmlUtils 和 JavaScriptUtils。

HTML 特殊字符转义

HTML 中 <,>,& 等字符有特殊含义,它们是 HTML 语言的保留字,因此不能直接使用。使用这些个字符时,应使用它们的转义序列:

  • &:&amp;
  • " :&quot;
  • < :&lt;
  • > :&gt;

由于 HTML 网页本身就是一个文本型结构化文档,如果直接将这些包含了 HTML 特殊字符的内容输出到网页中,极有可能破坏整个 HTML 文档的结构。所以,一般情况下需要对动态数据进行转义处理,使用转义序列表示 HTML 特殊字符。下面的 JSP 网页将一些变量动态输出到 HTML 网页中:

清单 1. 未进行 HTML 特殊字符转义处理网页
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%!
   String userName = "</td><tr></table>";
   String address = " \" type=\"button";
 %>
<table border="1">
   <tr>
     <td>姓名:</td><td><%=userName%></td> ①
   </tr>
   <tr>
     <td>年龄:</td><td>28</td>
   </tr>
</table>
 <input value="<%=address%>"  type="text" /> ②

在 ① 和 ② 处,我们未经任何转义处理就直接将变量输出到 HTML 网页中,由于这些变量可能包含一些特殊的 HTML 的字符,它们将可能破坏整个 HTML 文档的结构。我们可以从以上 JSP 页面的一个具体输出中了解这一问题:

<table border="1">
   <tr>
     <td>姓名:</td><td></td><tr></table></td> 
     ① 破坏了 <table> 的结构
   </tr>
   <tr>
     <td>年龄:</td><td>28</td>
   </tr>
</table>
 <input value=" " type="button"  type="text" /> 
 ② 将本来是输入框组件偷梁换柱为按钮组件

融合动态数据后的 HTML 网页已经面目全非,首先 ① 处的 <table> 结构被包含 HTML 特殊字符的 userName 变量截断了,造成其后的 <table> 代码变成无效的内容;其次,② 处 <input> 被动态数据改换为按钮类型的组件(type="button")。为了避免这一问题,我们需要事先对可能破坏 HTML 文档结构的动态数据进行转义处理。Spring 为我们提供了一个简单适用的 HTML 特殊字符转义工具类,它就是 HtmlUtils。下面,我们通过一个简单的例子了解 HtmlUtils 的具体用法:

清单 2. HtmpEscapeExample
package com.baobaotao.escape;
import org.springframework.web.util.HtmlUtils;
public class HtmpEscapeExample {
    public static void main(String[] args) {
        String specialStr = "<div id=\"testDiv\">test1;test2</div>";
        String str1 = HtmlUtils.htmlEscape(specialStr); ①转换为HTML转义字符表示
        System.out.println(str1);
       
        String str2 = HtmlUtils.htmlEscapeDecimal(specialStr); ②转换为数据转义表示
        System.out.println(str2);
       
        String str3 = HtmlUtils.htmlEscapeHex(specialStr); ③转换为十六进制数据转义表示
        System.out.println(str3);
       
        ④下面对转义后字符串进行反向操作
        System.out.println(HtmlUtils.htmlUnescape(str1));
        System.out.println(HtmlUtils.htmlUnescape(str2));
        System.out.println(HtmlUtils.htmlUnescape(str3));
    }
}

HTML 不但可以使用通用的转义序列表示 HTML 特殊字符,还可以使用以 # 为前缀的数字序列表示 HTML 特殊字符,它们在最终的显示效果上是一样的。HtmlUtils 提供了三个转义方法:

方法 说明
static String htmlEscape(String input) 将 HTML 特殊字符转义为 HTML 通用转义序列;
static String htmlEscapeDecimal(String input) 将 HTML 特殊字符转义为带 # 的十进制数据转义序列;
static String htmlEscapeHex(String input) 将 HTML 特殊字符转义为带 # 的十六进制数据转义序列;

此外,HtmlUtils 还提供了一个能够将经过转义内容还原的方法:htmlUnescape(String input),它可以还原以上三种转义序列的内容。运行以上代码,您将可以看到以下的输出:

str1:&lt;div id=&quot;testDiv&quot;&gt;test1;test2&lt;/div&gt;
str2:&#60;div id=&#34;testDiv&#34;&#62;test1;test2&#60;/div&#62;
str3:&#x3c;div id=&#x22;testDiv&#x22;&#x3e;test1;test2&#x3c;/div&#x3e;
<div id="testDiv">test1;test2</div>
<div id="testDiv">test1;test2</div>
<div id="testDiv">test1;test2</div>

您只要使用 HtmlUtils 对代码 清单 1 的 userName 和 address 进行转义处理,最终输出的 HTML 页面就不会遭受破坏了。

阅读全文……

标签 : , ,

Weblogic部署报com.ctc.wstx.stax.WstxInputFactory cannot be cast to javax.xml.stream.XMLInputFactory

Weblogic部署Web应用时报com.ctc.wstx.stax.WstxInputFactory cannot be cast to javax.xml.stream.XMLInputFactory,weblogic.xml配置为:

  <container-descriptor>  

  <servlet-reload-check-secs>-1</servlet-reload-check-secs>

  <prefer-web-inf-classes>true</prefer-web-inf-classes>

  </container-descriptor>  

改为:
  <container-descriptor>  
  <servlet-reload-check-secs>-1</servlet-reload-check-secs>
  <prefer-web-inf-classes>false</prefer-web-inf-classes>
  </container-descriptor>  
可以解决。
 
原因是Xerces是一个开放源代码的XML语法分析器 与weblogic不兼容 删除 xerces *.jar xml-apis*.jar 文件试一试

 

标签 :

一个httpcomponents-client-4.3 httpclient的例子

Apache的httpclient项目一直在升级,从httpclient3.1 项目到httpcomponents-client 4.0再到4.3都不是太稳定,现在处于4.3版本,终于基本稳定下来。现在httpclient3.1已经中止,官方强烈推荐升级到httpcomponents-client 。

其实开发一个功能完整强大的httpclient客户端还是不容易的。这里只是贴出一个使用httpcomponents-client里CloseableHttpClient进行http请求的例子,但是就这几行代码已经内置对Cookie和SSL的处理。谈不上很安全,但至少对使用Cookie对Https的URL是可以处理取回内容的。

 

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;

 

import org.apache.http.HttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

 

public class HttpComponentTest {

public CloseableHttpClient createHttpsClient() {

  X509TrustManager x509mgr = new X509TrustManager() {

  @Override

public void checkClientTrusted(X509Certificate[] xcs, String string) {

  }

  @Override

public void checkServerTrusted(X509Certificate[] xcs, String string) {

  }

  @Override

public X509Certificate[] getAcceptedIssuers() {

return null;

}

};

 

SSLContext sslContext = null;

try {

sslContext = SSLContext.getInstance("TLS");

} catch (NoSuchAlgorithmException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

 

try {

sslContext.init(null, new TrustManager[] { x509mgr }, null);

} catch (KeyManagementException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(

sslContext,

SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

  return HttpClients.custom().setSSLSocketFactory(sslsf).build();

  }

 

/**

* @param args

*/

public static void main(String[] args) throws Exception{

        // CloseableHttpClient httpclient = HttpClients.createDefault();

HttpComponentTest t=new HttpComponentTest();

CloseableHttpClient httpclient = t.createHttpsClient();

 

// HttpGet httpGet = new HttpGet("http://www.google.com.hk/search?hl=zh&ie=utf-8&num=30&output=rss&q=java+%7C+hibernate+%7C+spring&tbm=blg");

HttpGet httpGet = new HttpGet("https://www.google.com.hk/search?hl=zh&ie=utf-8&num=30&output=rss&q=java+%7C+hibernate+%7C+spring&tbm=blg");

// HttpGet httpGet = new HttpGet("http://itindex.net/");

 

try {

  HttpResponse httpResp = httpclient.execute(httpGet);

int statusCode = httpResp.getStatusLine().getStatusCode();

  if (statusCode == 200) {

System.out.println(EntityUtils.toString(httpResp.getEntity()));

}

  } catch (Exception e) {

e.printStackTrace();

} finally {

httpGet.releaseConnection();

}

  }

 }

 

 

标签 : ,