highcharts使用

之前用Rapheal画图表,自己写,一个两个还好,这次要画六个图表就有点够呛了,发现highchart挺不错的。

这里是几个web图表比较:

http://socialcompare.com/en/comparison/javascript-graphs-and-charts-libraries

highchart还是蛮多人支持的,只不过商业用途需要收费:

http://shop.highsoft.com/highcharts.html

在线文档:

http://api.highcharts.com/highcharts

 

这个在线demo可以直接jsfiddle编辑

http://www.highcharts.com/demo/

 

 

 

数据的格式:

http://api.highcharts.com/highcharts#series.data

每个点附加自定义数据

如果你想传自定义数据,则应传对象,但要有y,(如果x轴不是category,则要传x)

这样如果每个point格式为{x:1,y:2,mydata:’abc’},则在tooltip的formatter回调中可这样this.point.mydata获得mydata(shared为false时,一般建议shared为false,除非每个tip里要获得所有此x坐标上y点,这时就是this.point[i].mydata。)

x,y轴都可以是datetime类型,但是传入的值应该是Date.getTime()的值。

tickInterval是定义间隔的,但是如果是负数则会显示不正常。

 

 

gauge chart

需要highharts-more.js,point.push方法如果传入的是{}则会改变指针颜色,可能是个bug,传数值就不会变。

相关示例:

http://jsfiddle.net/gh/get/jquery/1.7.2/highslide-software/highcharts.com/tree/master/samples/highcharts/plotoptions/gauge-dial/

http://jsfiddle.net/CVJLV/

但是这两个都不能解决update传入object问题,最后只好设置全局样式:

name="code" class="js">Highcharts.setOptions({

Continue reading highcharts使用

smartdraw2010 破解

网上说smartdraw  + EA 经典配置,但是smartdraw 我还没发现较好的破解。

 

这里有个2010的破解,可以用,但是有个问题,破解后启动时需要断网,否则运行不了。不过出现这种情况你可以重新破解,再断网运行。

 

具体见:

http://www.cnblogs.com/RuiLei/archive/2009/10/14/1583497.html

 

我这里补充一下2010下载地址:

http://download.cnet.com/SmartDraw-2010/3000-2075_4-10002466.html

Continue reading smartdraw2010 破解

【转】Visual_VM操作手册

资源来自互联网,原作者不知出处,如果你觉得此转载侵犯了你的权益,请于管理员联系: [email protected]

1 什么是 Visual VM

1.1 Visual VM简介

VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM) 上运行的 Java 应用程序的详细信息。在 VisualVM 的图形用户界面中,您可以方便、快捷地查看多个 Java 应用程序的相关信息。(摘自官方) 简单说来,VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力。所有这些都是免费的!它囊括的命令行工具包括jstat, JConsole, jstack, jmap jinfo,这些工具与JDK的标准版本是一致的。 可以使用VisualVM生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,同时它还支持在MBeans上进行浏览和操作。尽管VisualVM自身要在JDK6这个版本上运行,但是JDK1.4以上版本的程序它都能监控。

 

1.2 如何获取VisualVM

VisualVM的一个最大好处就是,它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本。点击一下jvisualvm.exe图标它就可以运行了。

这里是VisualVM 的官方网站:https://visualvm.dev.java.net,资料很全,同时提供VisualVM最近版本下载。


 

2 Visual VM实战

2.1 开启Visual VM之旅

如果你使用的是JDK1.6Update7之后的版本,那么Visual VM已经包含在bin目录下了,否则需要去官方下载。

2.1.1 启动问题

如果你在windows上使用Visual VM,需要做的只是点一下jvisualvm.exe,就能启动它;绿色,好用。但是Visual VM所在的分区如果是NTFS格式,那么第一个问题就出现了:sunNTFS格式的硬盘支持有问题!但可通过参数可避免,并完成启动。步骤如下:

      1. 创建一个visualvm.exe的快捷方式

      2. 目标中添加如下参数

-XX:+PerfBypassFileSystemCheck


clip_image002[4]

 

2.1.2 界面简介

Visual VM启动成功!可以看到Visual VM的界面了。通过Visual VM可以看到本机运行中的所有Java应用。你会发现根本不需要在VisualVM 里为Java应用程序注册,它们就会自动显示出来。甚至还可以在导航栏里查看到远程的Java应用。导航栏即为Applications,其中分为Local(本地Java应用)和Remote(远程Java应用)。

clip_image004[4]

2.1.3 安装插件

Visual VM有很多好用的插件,步骤如下:

      1. 点击Tools -> Plugins


      2. 推荐安装全部插件


clip_image006[4]

 

2.2 监控本地Java应用

Visual VM本身就是一个Java应用,所以打开Visual VM看到的第一个可监控应用就是Visual VM本身;可以用它热热身,小试下牛刀。在Visual VM可视化界面中可以监控到Visual VM本身的内存使用情况、线程情况、Jvm启动参数、cpu消耗情况、垃圾回收情况等很多参数。当然如果在本地启一个Tomcat一样可以看到这些参数,可以方便我们在本地对JVM进行调优。但是且接如果你是在windows下起应用,如果你的Java应用是在NTFS格式的盘附上,记得加参数:-XX:+PerfBypassFileSystemCheck

clip_image008[4]

 

2.2.1 使用Visual VM监测内存泄漏、解决内存溢出问题

2.2.1.1  内存泄露、溢出的异同

同:都会导致应用程序运行出现问题,性能下降或挂起。

异:

1) 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出。

2) 内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

2.2.1.2  监测内存泄漏

  • 内存泄漏是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况,重启计算机可以解决,但也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。 
  • 内存泄漏可以分为4类:

1) 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2) 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3) 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4) 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

每隔一段时间给所监测的Java应用来一个heap dump,如下面三图所示:

clip_image010[4]

 

clip_image012[4]

 

clip_image014[4]

 

对比上面三个截图,发现似乎有个东西在急速飙升,仔细一看是这个对象:org.eclipse.swt.graphics.Image 在第一章图中这个还没排的上,第二次dump已经上升到5181个,第三次就是7845个了。涨速相当快,而且和任务管理器里面看到的GDI数量增涨一致,就是它了。

问题到这儿就比较清楚了,回到代码里面仔细一看可以发现,是某个地方反复的用图片来创建Image对象导致的,改掉以后搞定问题。

到这里其实我想说的是,Java使用起来其实要比C++更容易导致内存泄漏。对于C++来说,每一个申请的对象都必须明确释放,任何没有释放的对象都会导致memleak,这是不可饶恕的,而且这类问题已经有很多工具和方法来解决。但是到了Java里面情况就不同了,对于Java程序员来说对象都是不需要也无法主动销毁的,所以一般的思路是:随用随new,用完即丢。很多对象具体的生命周期可能连写代码的人自己也不清楚,或者不需要清楚,只知道某个时刻垃圾收集器会去做的,不用管。但很可能某个对象在用完即丢的时候在另一个不容易发现的地方被保存了一个引用,那么这个对象就永远不会被回收。更加糟糕的是整个程序从设计之初就没有考虑过对象回收的问题,对于C++程序员来说memleak必然是一个设计错误,但是对Java程序员来说这只是一个疏忽,而且似乎没有什么好的办法来避免。今天看到的这个问题是因为GDI泄漏会造成严重后果才被重视,但如果仅仅是造成内存泄漏,那这个程序可能得连续跑上个十天半个月才会发现问题。最后就是,对于c++,错误的代码在测试阶段就可以快速的侦测出哪怕一个bytememleak并加以改正,但是对于java程序,理论上没有哪个工具能够知道是不是有泄漏,因为除了作者自己以外没有人能够知道一个被引用的对象是不是应该被销毁,只有通过大量的,长期的压力测试才能发现问题,这是很危险的一件事情。

 

2.2.1.3  解决内存溢出问题

1java.lang.OutOfMemoryError: PermGen space

JVM管理两种类型的内存,堆和非堆。堆是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放ClassMeta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

 

clip_image016[4]

 

如上图所示,PermGen在程序运行一段时间后超出了我们指定的128MB,通过Classes视图看到,Java在运行的同时加载了大量的类到内存中。PermGen会存储Jar或者Class的描述信息;所以在class大量增加的同时PermGen超出了我们指定的范围。为了让应用稳定,我们需要探寻新的PermGen范围。检测时段时候后(如下图)发现PermGen145MB左右稳定,那么我们就得到了稳定的新参数;这样PermGen内存溢出的问题得到解决。

clip_image018[4]

 

2java.lang.OutOfMemoryError: Java heap space

第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的XmxXms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g3g之间,而64位的就不会有限制了。

注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。

 

垃圾回收GC的角色,JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:

一个是当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。

根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。

为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收。一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。

 

clip_image020[4]


 

如上图所示,used heap的折线图呈峰状,说明垃圾对象及时被回收了,内存得以释放。如果used heap的值只增不减说明存在内存泄漏了,如果超过heap size的值,会报内存溢出的错误。

 

2.2.1.4  如何避免内存泄漏、溢出

1) 尽早释放无用对象的引用。

          好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。

2) 程序进行字符串处理时,尽量避免使用String,而应使用StringBuffer

          因为每一个String对象都会独立占用内存一块区域,如:

  1. String str = "aaa";   
  2. String str2 = "bbb";   
  3. String str3 = str + str2;   
  4. // 假如执行此次之后str , str2再不被调用,那么它们就会在内存中等待GC回收;   
  5. // 假如程序中存在过多的类似情况就会出现内存错误;  

String str = "aaa";

String str2 = "bbb";

String str3 = str + str2;

// 假如执行此次之后str , str2再不被调用,那么它们就会在内存中等待GC回收;

// 假如程序中存在过多的类似情况就会出现内存错误;

 

3) 尽量少用静态变量。

         因为静态变量是全局的,GC不会回收。

4) 避免集中创建对象尤其是大对象,如果可以的话尽量使用流操作。

         JVM会突然需要大量内存,这时会触发GC优化系统内存环境; 一个案例如下: 

  1. // 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,   
  2. // 检查之后发现问题:组件里的代码   
  3. m_totalBytes = m_request.getContentLength();   
  4. m_binArray = new byte[m_totalBytes];   
  5. // totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。   
  6. // 解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。   
  7. // 参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747  

// 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,

// 检查之后发现问题:组件里的代码

m_totalBytes = m_request.getContentLength();

m_binArray = new byte[m_totalBytes];

// totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。

// 解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。

// 参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747

  

5) 尽量运用对象池技术以提高系统性能。

         生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。

6) 不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。

         可以适当的使用hashtablevector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃。

7) 优化配置。

         1 设置-Xms-Xmx相等;

         2、 设置NewSizeMaxNewSize相等;

         3、 设置Heap size, PermGen space:

             Tomcat 的配置示例:修改 %TOMCAT_HOME%/bin/catalina.bat or catalina.sh

             “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 

Continue reading 【转】Visual_VM操作手册

bootstrap的dialog

一个常用的dialog,在botstrap里面就特别别扭了,它本身带的只有模式对话框,而且有bug,

http://stackoverflow.com/questions/13649459/twitter-bootstrap-multiple-modal-error

当使用多个modal方法时,就会出现此问题,火狐直接是假死,chrome还好报了个错,这个问题搅了我一下午,让人火大。

 

那个替代的plugin也不是很好用,只是没报错,这些都是模式对话框,不能拖动,这就是boottrap的风格,你奈它何?

 

默认的是,当用户点击任意除模式dialog上按钮的其他地方,对话框就会消失,不触发按钮事件,这让我觉得设计者是不是脑子被驴踢了?要修改这样的默认方式需要:

$(e).modal({
					backdrop: 'static',
  					keyboard: false
				}).modal('show');

这样就会出现动画提示用户点击按钮,但是如果你想去掉后面的那个黑色遮罩,backdrop必须是false,这怎么解决呢,多次尝试后发现解决方法:

.modal-backdrop.fade.in{
	z-index: -20000 !important;
}

这个样式将遮罩层放到最低层,就看不到了。

注意不能用display:none,这个方法在chrome下面有问题。

 

反正是不好用,你想使用jqueryui的dialog,对不起,bootstrap的样式将其整的惨不忍睹,用不了……

Continue reading bootstrap的dialog

outlook 与 pop3,imap设置

imap的特点是所有操作都与服务器同步,因此你本地的改动例如已读邮件,文件夹等都在所有imap客户端同步了,但是对于outlook又有个问题,imap你无法指定数据文件夹,它默认都是放在c盘下面,无法改。所以基于这一点我还是用pop。

 

这里讲的比较详细:

http://blog.csdn.net/dududu01/article/details/6175662

Continue reading outlook 与 pop3,imap设置

微波炉做盐水花生

好吃佬我今天成功用微波炉做出了盐水花生,以后这个零食就不用愁了哈哈。

 

做法:

1:将花生米用流水洗干净。

2:放在碗里加入水,水不要太多,刚没过花生米即可。

3:依据自己的喜好加入盐(要多放点),花椒粉,辣椒,大蒜(蒜香花生,大蒜少量即可,切碎末),搅拌

4:放置八个小时以上,一般头天晚上拌好,第二天再加工

5:放置八个小时以上后,去掉水,将花生摊平放在盘子里,或直接放在微波炉的转盘上,中火2分半后拿出来搅拌一下,再摊平再中火2分半。

6:将花生放置一段时间让其自然冷却,这样就做好了。

 

味道不错哦。

Continue reading 微波炉做盐水花生

Failed to create the Java Virtual Machine.问题

突然的eclipse(indigo)启动报错

Failed to create the Java Virtual Machine.
 
网上搜了一下:
http://www.thecarneyeffect.co.uk/eclipse-and-failed-create-java-virtual-machine
http://www.eclipsezone.com/eclipse/forums/t61618.html
 
需要从eclipse.ini里面找配置原因,我的问题是

-XX:PermSize=64M
-XX:MaxPermSize=512M

把这两句删掉就没问题了,但是之前都是运行得好好的,我的4G内存还不够?

 

这个问题还不知道实际原因。

Continue reading Failed to create the Java Virtual Machine.问题

如何启动多个skype

skype不能同时运行多个,这个很不方便,不知道为什么要这样限制。

 

以前可以用imo.im来登陆,这几天imo宣布由于连不上skype服务器,无法提供skype服务了,而且小道消息说微软要推web skype了,估计是被屏蔽了。

 

找半天终于发现有个软件可以用于启动多个skype ttp://multi-skype-launcher.com/

 

下载安装后就可以登录多个了,但是这个安装包捆绑了两个其他软件,我的毛豆和小A都报警了,它虽然有个选项不安装其他软件,但是我及时设置了不安装还是给我安装了,有非常大的流氓嫌疑。不过它的文件其实就一个可执行文件,不需要安装,这里建议不要使用这个软件。

 

后来发现竟然有这么个办法:

 

从Skype版本4.0起,可以很方便的在一台计算机中运行多个Skype程序,登录不同的Skype帐户了。
方法很简单,只需在运行Skype时带参数“secondary”即可。操作如下:

  1. 点击计算机左下角“开始”--“运行”
  2. 在输入框中输入:
    "C:\Program Files\Skype\Phone\skype.exe" /secondary (双引号不能少)

你也可以把上面的内容做成“快捷方式”放到桌面,想运行多个Skype时双击一次运行一个。
注意:不同的计算机机可能文件路径不同,只要找到“skype.exe”所在位置就可以了。

 

简便的方法就是,把你的skype快捷方式修改为 "C:\Program Files\Skype\Phone\skype.exe" /secondary

 

Mac下 sudo /Applications/Skype.app/Contents/MacOS/Skype /secondary

 

测试通过,我的神呀,咋不早说呢!

Continue reading 如何启动多个skype

【链】关于 Java 性能方面的 9 个谬论

原文 http://www.infoq.com/articles/9_Fallacies_Java_Performance

翻译 http://www.oschina.net/translate/9_fallacies_java_performance  [凑合]

 

 

看这篇文章,原文要看,评论也要看。文章总结了9点谬误:

1: Java运行慢

提到了对比测试 web performance benchmarks

Snap1

头两个都是netty相关,netty是基于java的,去看了一下,基于nio,与mina是同一个作者(韩国李)。

这里也扯一下netty和mina, http://stackoverflow.com/questions/1637752/netty-vs-apache-mina

上面链接看看韩国李的评论,netty就是为了解决mina开发中出现的问题而重新设计的,它的文档更好,构建速度更快,去掉了可能不是用的很多的东西从而简单化,提高性能。mina3将会是完全的重构,意味着api兼容性将会破坏(说到这你也懂韩国李自己都在黑mina了。) 只是对于UDP,mina提供更高层的抽象(稳定连接),而netty更接近UDP本意。

里面还有人拿netty和ngix做测试对比,竟然etty表现和ngix不相上下甚至更好……

 

 

 

之所以说是框架而不是服务器,是因为它是嵌入到程序里面作为服务端框架,就像嵌入的tomcat或jetty,而不是一个web容器。

回到上面提到的性能比较表,php竟然比spring还慢。php完全排在java平台之后了。nodejs还在tapestry之后。

这个结果与直觉相比,似乎不是很靠谱得呢。

 

2. A single line of Java means anything in isolation 一行代码是孤立处理的

意思是说,其实java 虚拟机和即时编译器是有上下文来优化的,所以不要试图过早的优化。

 

 

3. A microbenchmark means what you think it does

意思是说没必要一开始就设计微基准测试(小范围基准测试?),当确实发现需要基准测试时,应该从系统整体和最关键部分考虑。

 

4.算法慢是性能问题的最普遍原因

应该依靠经验和产品数据来找到引起性能问题的真正原因。要动手采集数据而不是凭空猜测。--算法往往不是问题

 

5.缓存能解决一切问题

意思是说,往往重构更能简化系统提高性能,缓存作用有时不是很大.--作者认为重构比利用缓存更简单.

 

6. All apps need to be concerned about Stop-The-World 所有的程序都要注意jvm的Stop-The-World问题

意思是说虽然STW问题确实存在,但是对于大部分程序来说,这个问题的影响可以忽略或忍受。

在决定是否需要考虑这个问题之前,首先利用GC日志分析,到底是否STW是根本原因。

 

7. Hand-rolled Object Pooling is appropriate for a wide range of apps

 

意思是说对象池并不能很好地解决STW问题,它起作用,但是起不了很大的作用。反而使代码更复杂。

 

8. CMS is always a better choice of GC than Parallel Old -- CMS机制总是比Parallel Old机制好

 

意思是说CMS也有弊端,只在Parallel Old机制确实无法忍受的情况下再来考虑CMS

 

9. 增加堆内存会解决你内存溢出的问题

这个是老生长谈,如果是程序问题,再大的内存也不管用

 

 

评论中还是有相当怀疑意见的:

有人认为C++还是比java要性能高,作者解释说从内联(intrinsics)和单态区分(monomorphic dispatch) 这两点上,JIT要比C++编译器强很多。

 

还有人需要作者指明很多java程序与c++一样快这句话缺少例子,我也这么认为,因为java里面太多这样类似的暗示却没有实证。

 

 

文章看过,没什么比较震撼的信息,仍不能解决我对java性能的保留意见,从实际来看,无论知名大应用还是商业小应用,例证最多的还是php。

 

而且,相比php,java出现性能问题的几率是多了无数倍,你需要花时间解决这个问题的花费也是无数倍,因为php是外面的框子限制了性能问题(启动->运行->终止),而java则留了许多坑让你踩,一个不留神你就中招了。

 

不好意思,又这里黑java了,但是我用的最多的还是java,lol.

Continue reading 【链】关于 Java 性能方面的 9 个谬论

Pagination


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1