ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

#

正常的网络连接中很少会出现多个包丢失的现象,每成功接收或转发100,000个数据包最多只会有几个包丢失(如图1)。在Linux虚拟机中,通过ifconfig命令可以很轻松地监控到这种状态。

  图1. 通常以太网卡是不会丢包的

  当虚拟机的网络在突发大量访问的情况下,可能会发生多个包丢失,这样就需要调整虚拟机的网络设置。首先,确认虚拟机使用了VMXNET3虚拟网 卡驱动。这样,在Linux宿主机的特定情况下,当大数据文件在高带宽的网络上传输时会发生多数据包丢失。关闭接收和转发校验总和可以解决这种情况。因为 校验总和的作用是停止错误包的发送,这样做会增加风险。考虑到以太网卡的错误率通常低于百万分之一,风险的级别并不高。

  使用Linux ethtool工具来关闭VMware网络设置中的接收和转发校验总和,在命令行窗口中以root账户登录ethtool。例如关闭网卡eth0的校验总 和命令如下:readethtool --offload eth0 rx off tx off;

  命令生效后,打开相应网卡的配置文件:

  /etc/sysconfig/network/ifcfg-eth0 ( SUSE) 或 /etc/sysconfig/network-scripts/ifcfg-eth0 (Red Hat )

  同时把ETHTOOL_OPTIONS参数变为ETHTOOL_OPTIONS='--offload eth0 rx off tx off'

  如果依然存在丢包问题,尝试用ethtool工具增加接收队列的缓冲区大小。默认情况下,缓存设为256,可以设置的最大值为4096。重新设置缓存大小为512,使用命令ethtool -G eth0 512。如果结果不理想,尝试更大的值。

  遇到Windows虚拟机的高丢包率就需要调整VMXNET3驱动的网络设置。在Device Manager中右键单击VMXNET3驱动并选择Properties。在Advanced页中有两个参数:Small RX Buffers和RX Ring #1 Size。适当增加这些参数的值然后测试能否有改善。逐步加大该值直到问题解决。

  多数情况下,这些设置可以降低虚拟机的丢包率。如果调整网络参数失败,或许就需要解决虚拟机其它的一些性能相关问题,而不是虚拟机和ESXi平 台之间的VMware网络设置。咨询宿主机OS 的相关专家,应该有很多可以调整性能的相关参数。当心更改了错误的参数可能会对虚拟机带来明显的负面影响。

posted @ 2014-07-15 22:53 ivaneeo 阅读(453) | 评论 (0)编辑 收藏

http://code4app.net/category/cocos2d
http://www.cocos2d-x.org/hub/all?category=5
http://blog.makeapp.co/
posted @ 2014-06-04 17:09 ivaneeo 阅读(285) | 评论 (0)编辑 收藏

http://ricston.com/blog/mule-image-hosting-raml-mulerequester/
posted @ 2014-05-28 23:32 ivaneeo 阅读(323) | 评论 (0)编辑 收藏

什么东西可以监控OpenStack呢?OpenStack对监控的需求起码有以下这些:

 

  • 不仅要能监控物理机,也能监控虚机
  • 监控信息也必须是tenant隔离的
  • 监控项的收集应该是自动地
  • 监控工具应该一般化以监控任何设备
  • 监控工具必须提供API

下面是监控工具的一般架构:

 

zhjk

 

网上搜索了一下,现在主流的监控工具有:Nagios, cacti, Zabbix, Muni, Zenoss。我不是做运维的对这些工具都不熟,以前不熟,现在也不熟。下面是一些理解,不一定准。

Nagios,最老牌了,比较通用的监控工具。特大的特点是报警。图形化功能一般般。一般要安装Agent,配置起来看网上的说法是比较复杂的,没用过,没实际发言权。

cacti,图形化功能不错,所以Nagios一般结合它来使用。

Zabbix,监控和图形化功能都还可以了,尤其有一本电子书 zabbix 1.8 network monitoring

Zenoss, 监控新贵,它使用无Agent的通用技术如SNMP和SSL来监控,部署起来会比较方便。尤其是Zenoss公司有人现在也加入OpenStack社区了,专门开发了一个OpenStack特有的扩展(

https://github.com/zenoss/ZenPacks.zenoss.OpenStack)不幸的是,目前只支持Nova API 1.1,且它只能收集单个tenant的数据,不利于rating和billing。

OpenStack Ceilometer工程主要监控的是tenant下虚机的数据,用来做billing的,物理机的监控支持不大好。

比较来比较去,如果是我,可能会做如下选型决定,不一定正确 :

Nagios 或者 Zenoss (视情况)

 

下面内容来自:http://docs.openstack.org/developer/ceilometer/, 我们看一下Ceilometer工程的现状, 架构如下:

 

zhjk2

 

运行OpenStack各组件的节点上一般有Agent来收集信息,收集后发给MQ,Ceilometer的Collector进程监控到数据之后存储到DB之中。从http://docs.openstack.org/developer/ceilometer/measurements.html 这页显示的监控项来看,目前Ceilometer监控来的数据主要来只是用来做billing的

 

文章来源:http://blog.csdn.net/quqi99/article/details/9400747
文章作者:张华 http://blog.csdn.net/quqi99

posted @ 2014-05-28 01:01 ivaneeo 阅读(431) | 评论 (0)编辑 收藏

使用truelicense实现用于JAVA工程license机制(包括license生成和验,有需要的朋友可以参考下。


开发的软件产品在交付使用的时候,往往会授权一段时间的试用期,这个时候license就派上用场了。不同于在代码中直接加上时间约束,需要重新授权的时候使用license可以避免修改源码,改动部署,授权方直接生成一个新的license发送给使用方替换掉原来的license文件即可。下面将讲述使用truelicense来实现license的生成和使用。Truelicense是一个开源的证书管理引擎,详细介绍见https://truelicense.java.net/

一、首先介绍下license授权机制的原理:

1、 生成密钥对,方法有很多。

2、 授权者保留私钥,使用私钥对包含授权信息(如使用截止日期,MAC地址等)的license进行数字签名。

3、 公钥给使用者(放在验证的代码中使用),用于验证license是否符合使用条件。

接下来是本例制作license的具体步骤:

二、第一步:使用keytool生成密钥对

以下命令在dos命令行执行,注意当前执行目录,最后生成的密钥对即在该目录下:

1、首先要用KeyTool工具来生成私匙库:(-alias别名 –validity 3650表示10年有效)

keytool -genkey -alias privatekey -keystoreprivateKeys.store -validity 3650

2、然后把私匙库内的公匙导出到一个文件当中:

keytool -export -alias privatekey -file certfile.cer -keystore privateKeys.store

3、然后再把这个证书文件导入到公匙库:

keytool -import -alias publiccert -file certfile.cer -keystore publicCerts.store

最后生成文件privateKeys.store、publicCerts.store拷贝出来备用。

三、第二步:生成证书(该部分代码由授权者独立保管执行)

1、 首先LicenseManagerHolder.java类:

package cn.melina.license; import de.schlichtherle.license.LicenseManager; import de.schlichtherle.license.LicenseParam;  /**  * LicenseManager??????  * @author melina  */ public class LicenseManagerHolder { 	 	private static LicenseManager licenseManager;   	public static synchronized LicenseManager getLicenseManager(LicenseParam licenseParams) {     	if (licenseManager == null) {     		licenseManager = new LicenseManager(licenseParams);     	}     	return licenseManager;     } } 

2、 然后是主要生成license的代码CreateLicense.java:

package cn.melina.license;  import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Properties; import java.util.prefs.Preferences; import javax.security.auth.x500.X500Principal; import de.schlichtherle.license.CipherParam; import de.schlichtherle.license.DefaultCipherParam; import de.schlichtherle.license.DefaultKeyStoreParam; import de.schlichtherle.license.DefaultLicenseParam; import de.schlichtherle.license.KeyStoreParam; import de.schlichtherle.license.LicenseContent; import de.schlichtherle.license.LicenseParam; import de.schlichtherle.license.LicenseManager;  /**  * CreateLicense  * @author melina  */ public class CreateLicense { 	//common param 	private static String PRIVATEALIAS = ""; 	private static String KEYPWD = ""; 	private static String STOREPWD = ""; 	private static String SUBJECT = ""; 	private static String licPath = ""; 	private static String priPath = ""; 	//license content 	private static String issuedTime = ""; 	private static String notBefore = ""; 	private static String notAfter = ""; 	private static String consumerType = ""; 	private static int consumerAmount = 0; 	private static String info = ""; 	// 为了方便直接用的API里的例子 	// X500Princal是一个证书文件的固有格式,详见API 	private final static X500Principal DEFAULTHOLDERANDISSUER = new X500Principal( 			"CN=Duke、OU=JavaSoft、O=Sun Microsystems、C=US"); 	 	public void setParam(String propertiesPath) { 		// 获取参数 		Properties prop = new Properties(); 		InputStream in = getClass().getResourceAsStream(propertiesPath); 		try { 			prop.load(in); 		} catch (IOException e) { 			// TODO Auto-generated catch block 			e.printStackTrace(); 		} 		PRIVATEALIAS = prop.getProperty("PRIVATEALIAS"); 		KEYPWD = prop.getProperty("KEYPWD"); 		STOREPWD = prop.getProperty("STOREPWD"); 		SUBJECT = prop.getProperty("SUBJECT"); 		KEYPWD = prop.getProperty("KEYPWD"); 		licPath = prop.getProperty("licPath"); 		priPath = prop.getProperty("priPath"); 		//license content 		issuedTime = prop.getProperty("issuedTime"); 		notBefore = prop.getProperty("notBefore"); 		notAfter = prop.getProperty("notAfter"); 		consumerType = prop.getProperty("consumerType"); 		consumerAmount = Integer.valueOf(prop.getProperty("consumerAmount")); 		info = prop.getProperty("info"); 		 	}  	public boolean create() {		 		try { 			/************** 证书发布者端执行 ******************/ 			LicenseManager licenseManager = LicenseManagerHolder 					.getLicenseManager(initLicenseParams0()); 			licenseManager.store((createLicenseContent()), new File(licPath));	 		} catch (Exception e) { 			e.printStackTrace(); 			System.out.println("客户端证书生成失败!"); 			return false; 		} 		System.out.println("服务器端生成证书成功!"); 		return true; 	}  	// 返回生成证书时需要的参数 	private static LicenseParam initLicenseParams0() { 		Preferences preference = Preferences 				.userNodeForPackage(CreateLicense.class); 		// 设置对证书内容加密的对称密码 		CipherParam cipherParam = new DefaultCipherParam(STOREPWD); 		// 参数1,2从哪个Class.getResource()获得密钥库;参数3密钥库的别名;参数4密钥库存储密码;参数5密钥库密码 		KeyStoreParam privateStoreParam = new DefaultKeyStoreParam( 				CreateLicense.class, priPath, PRIVATEALIAS, STOREPWD, KEYPWD); 		LicenseParam licenseParams = new DefaultLicenseParam(SUBJECT, 				preference, privateStoreParam, cipherParam); 		return licenseParams; 	}  	// 从外部表单拿到证书的内容 		public final static LicenseContent createLicenseContent() { 			DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 			LicenseContent content = null; 			content = new LicenseContent(); 			content.setSubject(SUBJECT); 			content.setHolder(DEFAULTHOLDERANDISSUER); 			content.setIssuer(DEFAULTHOLDERANDISSUER); 			try { 				content.setIssued(format.parse(issuedTime)); 				content.setNotBefore(format.parse(notBefore)); 				content.setNotAfter(format.parse(notAfter)); 			} catch (ParseException e) { 				// TODO Auto-generated catch block 				e.printStackTrace(); 			} 			content.setConsumerType(consumerType); 			content.setConsumerAmount(consumerAmount); 			content.setInfo(info); 			// 扩展 			content.setExtra(new Object()); 			return content; 		} } 

3、 测试程序licenseCreateTest.java:

package cn.melina.license; import cn.melina.license.CreateLicense; public class licenseCreateTest { 	public static void main(String[] args){ 		CreateLicense cLicense = new CreateLicense(); 		//获取参数 		cLicense.setParam("./param.properties"); 		//生成证书 		cLicense.create(); 	} } 

4、 生成时使用到的param.properties文件如下:

##########common parameters########### #alias PRIVATEALIAS=privatekey #key(该密码生成密钥对的密码,需要妥善保管,不能让使用者知道) KEYPWD=bigdata123456 #STOREPWD(该密码是在使用keytool生成密钥对时设置的密钥库的访问密码) STOREPWD=abc123456 #SUBJECT SUBJECT=bigdata #licPath licPath=bigdata.lic #priPath priPath=privateKeys.store ##########license content########### #issuedTime issuedTime=2014-04-01 #notBeforeTime notBefore=2014-04-01 #notAfterTime notAfter=2014-05-01 #consumerType consumerType=user #ConsumerAmount consumerAmount=1 #info info=this is a license 

根据properties文件可以看出,这里只简单设置了使用时间的限制,当然可以自定义添加更多限制。该文件中表示授权者拥有私钥,并且知道生成密钥对的密码。并且设置license的内容。

四、第三步:验证证书(使用证书)(该部分代码结合需要授权的程序使用)

1、 首先LicenseManagerHolder.java类,同上。

2、 然后是主要验证license的代码VerifyLicense.java:

package cn.melina.license;  import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.prefs.Preferences;  import de.schlichtherle.license.CipherParam; import de.schlichtherle.license.DefaultCipherParam; import de.schlichtherle.license.DefaultKeyStoreParam; import de.schlichtherle.license.DefaultLicenseParam; import de.schlichtherle.license.KeyStoreParam; import de.schlichtherle.license.LicenseParam; import de.schlichtherle.license.LicenseManager;  /**  * VerifyLicense  * @author melina  */ public class VerifyLicense { 	//common param 	private static String PUBLICALIAS = ""; 	private static String STOREPWD = ""; 	private static String SUBJECT = ""; 	private static String licPath = ""; 	private static String pubPath = ""; 	 	public void setParam(String propertiesPath) { 		// 获取参数 		Properties prop = new Properties(); 		InputStream in = getClass().getResourceAsStream(propertiesPath); 		try { 			prop.load(in); 		} catch (IOException e) { 			// TODO Auto-generated catch block 			e.printStackTrace(); 		} 		PUBLICALIAS = prop.getProperty("PUBLICALIAS"); 		STOREPWD = prop.getProperty("STOREPWD"); 		SUBJECT = prop.getProperty("SUBJECT"); 		licPath = prop.getProperty("licPath"); 		pubPath = prop.getProperty("pubPath"); 	}  	public boolean verify() {		 		/************** 证书使用者端执行 ******************/  		LicenseManager licenseManager = LicenseManagerHolder 				.getLicenseManager(initLicenseParams()); 		// 安装证书 		try { 			licenseManager.install(new File(licPath)); 			System.out.println("客户端安装证书成功!"); 		} catch (Exception e) { 			e.printStackTrace(); 			System.out.println("客户端证书安装失败!"); 			return false; 		} 		// 验证证书 		try { 			licenseManager.verify(); 			System.out.println("客户端验证证书成功!"); 		} catch (Exception e) { 			e.printStackTrace(); 			System.out.println("客户端证书验证失效!"); 			return false; 		} 		return true; 	}  	// 返回验证证书需要的参数 	private static LicenseParam initLicenseParams() { 		Preferences preference = Preferences 				.userNodeForPackage(VerifyLicense.class); 		CipherParam cipherParam = new DefaultCipherParam(STOREPWD);  		KeyStoreParam privateStoreParam = new DefaultKeyStoreParam( 				VerifyLicense.class, pubPath, PUBLICALIAS, STOREPWD, null); 		LicenseParam licenseParams = new DefaultLicenseParam(SUBJECT, 				preference, privateStoreParam, cipherParam); 		return licenseParams; 	} } 

3、 测试程序licenseVerifyTest.java:

package cn.melina.license;  public class licenseVerifyTest { 	public static void main(String[] args){ 		VerifyLicense vLicense = new VerifyLicense(); 		//获取参数 		vLicense.setParam("./param.properties"); 		//验证证书 		vLicense.verify(); 	} } 

4、 验证时使用到的Properties文件如下:

##########common parameters########### #alias PUBLICALIAS=publiccert #STOREPWD(该密码是在使用keytool生成密钥对时设置的密钥库的访问密码) STOREPWD=abc123456 #SUBJECT SUBJECT=bigdata #licPath licPath=bigdata.lic #pubPath pubPath=publicCerts.store 

根据该验证的properties可以看出,使用者只拥有公钥,没有私钥,并且也只知道访问密钥库的密码,而不能知道生成密钥对的密码。

五、说明:

注意实际操作中,公钥、私钥、证书等文件的存放路径。

以上代码需要用到truelicense的一些包,可以自行网上搜,也可以下载我的完整工程,里面附带了所需的jar包。

以上两个完整工程提供下载:http://download.csdn.net/detail/luckymelina/7141131

GOOD LUCK!小伙伴们加油!欢迎与我交流。

posted @ 2014-04-30 03:32 ivaneeo 阅读(6564) | 评论 (0)编辑 收藏

     摘要: 之前做了一个web项目的时候,好好的网站第二天总是会提示using the Connector/J connection property 'autoReconnect=true' to avoid this problem.  这样的错误1com.mysql.jdbc.CommunicationsException: The last packet successfully recei...  阅读全文
posted @ 2014-04-28 13:32 ivaneeo 阅读(475) | 评论 (0)编辑 收藏

/etc/rabbitmq.conf:

[
    {rabbit, [{loopback_users, []}]}
].
posted @ 2014-04-04 21:28 ivaneeo 阅读(1651) | 评论 (0)编辑 收藏

http://outofmemory.cn/code-snippet/4079/java-usage-Xuggler-get-video-shichang-fen-bianlv-high-kuan-kind-information
posted @ 2014-04-01 00:44 ivaneeo 阅读(1204) | 评论 (0)编辑 收藏

Canvas里的globalCompositeOperation是个很少用到的函数,不太熟悉程序绘图的同学们估计压根都不知道这玩意是干什么的.

简单来说,Composite(组合),就是对你在绘图中,后绘制的图形与先绘制的图形之间的组合显示效果,比如在国画中,你先画一笔红色,再来一笔绿色,相交的部分是一种混色,而在油画中,绿色就会覆盖掉相交部分的红色,这在程序绘图中的处理就是Composite,Canvas API中对应的函数就是globalCompositeOperation,跟globalAlpha一样,这个属性是全局的,所以在使用的时候要注意save和restore.

我在练习这个函数的时候,用的是chrome浏览器,但是测试结果却跟实际应该出现的结果不太一致,开始我以为是写错了,检查数遍却没有问题,疑惑之下换了各种浏览器来测试,真是囧啊,每个浏览器居然都不一样,连同核心的chrome和safari都不一样...下面是测试结果.


chrome


firefox


opera


safari


firefox官方网站给的实际效果图

下面是每一个选项的说明(我表达的可能不太明白,看图吧):

source-over 默认,相交部分由后绘制图形的填充(颜色,渐变,纹理)覆盖,全部浏览器通过

source-in 只绘制相交部分,由后绘制图形的填充覆盖,其余部分透明,webkit两兄弟没有通过

source-out 只绘制后绘制图形不相交的部分,由后绘制图形的填充覆盖,其余部分透明,webkit两兄弟没有通过

source-atop 后绘制图形不相交的部分透明,相交部分由后绘制图形的填充覆盖,全部浏览器通过

destination-over 相交部分由先绘制图形的填充(颜色,渐变,纹理)覆盖,全部浏览器通过

destination-in 只绘制相交部分,由先绘制图形的填充覆盖,其余部分透明,webkit两兄弟没有通过

destination-out 只绘制先绘制图形不相交的部分,由先绘制图形的填充覆盖,其余部分透明,全部浏览器通过

destination-atop 先绘制图形不相交的部分透明,相交部分由先绘制图形的填充覆盖,webkit两兄弟没有通过

lighter 相交部分由根据先后图形填充来增加亮度,全部浏览器通过

darker 相交部分由根据先后图形填充来降低亮度,chrome通过,firefox官方说Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0以后版本移除这个效果-0-,why?safari看似可以,但是无论你什么颜色,它都给填充成黑色,opera无效果

copy 只绘制后绘制图形,只有opera通过

xor 相交部分透明,全部浏览器通过

结果太令人无语了,特别是firefox那个新版本移除,我靠,为嘛啊?chrome和safari难兄难弟,成绩一塌糊涂,难道是webkit核心的问题?safari那个填充黑色很有IE6-中png透明问题的风范...opera表现很抢眼,只有一个效果未实现,继续努力!

评分及浏览器版本:
Chrome dev 7.0.503.0 : 7/12
Firefox 3.6.6 : 10/12
Opera 10.53 : 11/12
Safari 4.0.3(531.9.1) : 6/12
posted @ 2014-03-28 15:48 ivaneeo 阅读(267) | 评论 (0)编辑 收藏

 Logging In to Guacamole

You can access the web login screen for Guacamole from the server at http://127.0.0.1:8080/guacamole

The default user is "guacadmin", with the default password of "guacadmin". You can change your password by editing your own user in the administration screen.

With everything configured correctly you should be able to access the web login screen through Amahi at http://guacamole.yourhdaname.com:8080/guacamole/

posted @ 2014-03-25 18:36 ivaneeo 阅读(594) | 评论 (0)编辑 收藏

仅列出标题
共67页: First 上一页 4 5 6 7 8 9 10 11 12 下一页 Last