qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

Javascript单元测试Unit Testing之QUnit

QUnit是一个基于JQuery的单元测试Unit Testing 框架。虽然是基于JQuery但用来测试纯Javascript代码。
  用来运行Javascript单元测试用例的html页面是这样的:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QUnit test runner</title>
<link rel="stylesheet" href="lib/qunit-1.10.0.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="lib/qunit-1.10.0.js"></script>
<!--test code goes here-->
</body>
</html>
  假设我们有如下简单的javascript代码simpleMath.js,实现基本的数学操作,阶乘,平均数。
SimpleMath = function() {
};
SimpleMath.prototype.getFactorial = function (number) {
if (number < 0) {
throw new Error("There is no factorial for negative numbers");
}
else if (number == 1 || number == 0) {
// If number <= 1 then number! = 1.
return 1;
} else {
// If number > 1 then number! = number * (number-1)!
return number * this.getFactorial(number-1);
}
}
SimpleMath.prototype.signum = function (number) {
if (number > 0)  {
return 1;
} else if (number == 0) {
return 0;
} else {
return -1;
}
}
SimpleMath.prototype.average = function (number1, number2) {
return (number1 + number2) / 2;
}
  如对getFactorial函数,我们可以编写以下3种测试用例:
  正数,零,负数
// Factorial testing module
module("Factorial", {
setup: function() {
this.simpleMath = new SimpleMath();
}, teardown: function() {
delete this.simpleMath;
}
});
test("calculating factorial for a positive number", function() {
equal(this.simpleMath.getFactorial(3), 6, "Factorial of three must equal six");
});
test("calculating factorial for zero", function() {
equal(this.simpleMath.getFactorial(0), 1, "Factorial of zero must equal one");
});
test("throwing an error when calculating the factorial for a negative number", function() {
raises(function() {
this.simpleMath.getFactorial(-10)
}, "There is no factorial for negative numbers ...");
});
  上面的代码中,module中有setup, teardown可以让我们事前事后做一些操作,使用断言equal期望3的阶乘结果是6,如果您有接触过Java或C#平台的单元测试,应该不能理解。然后我们把2个js脚本文件引入到上面html中
  <script src="src/simpleMath.js"></script>
  <script src="tests/simpleMathTest.js"></script>
  最终我们在浏览器中打开这个html,结果也就是显示出来了。
  如上图,我们看到7个测试用例,全部有通过了,点击前2个用例,显示出断言的结果。常见的断言还有ok( truthy [, message ] ), deepEqual( actual, expected [, message ] ),如下是ok:
  ok(true, "true passes");
  ok(4==4, "4 must equal 4");
  ok("some string", "Non-empty string passes");
  QUnit也有支持异步ajax的测试方法asyncTest,由于篇幅有限,在这儿不多介绍了。写这篇文章的时候,QUnit是v1.14.0版本了。未来可能还有新版本。更多内容,请可以参考API文档。
  希望对您软件开发有帮助。

posted @ 2014-06-30 18:40 顺其自然EVO 阅读(198) | 评论 (0)编辑 收藏

使用jasmine来对js进行单元测试

  互联网的快速发展,给web开发人员带来了前所未有的挑战。对于前端开发,前端开发er所需要编写的js早已不是那些寥寥几行的视觉效果代码。代码量的大增,多人协同,人员素质悬殊不齐,这都需要一个标准,来对代码的规范性进行控制。Jasmine作为一个前端团队使用的测试框架,便运应而生。
  1、jasmine简介
  jasmine是一个用来编写Javascript测试的框架,它不依赖于任何其它的javascript框架。它有拥有灵巧而明确的语法可以让你轻松的编写测试代码。目前最新的版本为2.0.0。
  在jasmine中,一个典型的单元测试起始于一个全局函数describe,describe包含了N个it函数,一个it函数包含N个断言。
  一个基本的测试代码如下:
  复制代码
  describe("A suite", function() {
  it("contains spec with an expectation", function() {
  expect(true).toBe(true);
  });
  });
  复制代码
  2、下载jasmine
  大家可以点击下面的链接进行下载:
  https://github.com/pivotal/jasmine/tree/master/dist
  推荐下载2.0.0版本的压缩包。
  解压之后,我们进入文件目录下的lib\jasmine-2.0.0,这下面通常包括以下这些文件。
  这些文件是我们进行js测试所需要的。
  3、jasmine的依赖
  jasmine的运行依赖4个部分:
  1) 运行环境
  浏览器(ie,Firefox,chrome)
  2) 源文件
  开发人员编写的js脚步
  3) 测试文件
  符合jasmineAPI的测试脚本
  4) 输出结果
  基于网页输出或控制台输出
  4、jasmine的使用
  我们在项目中新建test.html文件,主体代码如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>jasmine-js单元测试框架</title>
<link rel="stylesheet" href="jasmine/jasmine.css">
<script src="jasmine/jasmine.js"></script>
<script src="jasmine/jasmine-html.js"></script>
<script src="jasmine/boot.js"></script>
</head>
<body>
<div>
<p>js单元测试</p>
</div>
<script src="src.js"></script>
<script src="test.js"></script>
</body>
</html>
在页面中我们引入了5个js文件和1个css文件。
  jasmine.js : jasmine框架的核心文件。
  jasmine-html.js : 用于网页结果输出的js文件。
  boot.js : jasmine框架的的启动脚本。值得注意的是,这个脚本的执行应该在jasmine.js加载完成之后。
  src.js : 我们的业务逻辑脚本。
  test.js : jasmine测试脚本。
  jasmine.css :控制网页结果输出的样式文件。
  我们来看看src.js文件,我们定义了一个showName的函数
  function showName(name){
  return 'my name is '+name;
  }
  我们在test.js内进行测试脚本的编写:
describe('just a test',function(){
it('test showName',function(){
var a='ck';
var exp='my name is ck';
expect(exp).toEqual(showName(a));
});
});
  浏览器端运行test.html文件,输出如下:
  这表明我们的脚本顺利通过了测试。
  我们修改test.js文件
  var exp='my name is mm';
  再次运行test.html文件,输入如下:
  可以看到jasmine把错误信息都打印了出来。
  通过这个简单例子,我们可以看到,使用jasmine来进行单元测试是非常方便的。
  5、API
  describe(string,function)
  全局函数,接收两个参数
  string:函数的描述
  function:测试组函数
  It(string,function)
  一个测试specs,接收两个参数
  string:spces的名称
  function:spces函数
  beforeEach(function)
  定义在一个describe的所有it执行前做的操作
  afterEach(function)
  定义在一个describe的所有it执行后做的操作
  toBe
  等同于===,比较变量
  toEqual
  处理变量,数组,对象等等
  toMatch
  使用正则式进行匹配
  toBeDefined
  是否已声明且赋值
  toBeUndefined
  是否未声明
  toBeNull
  是否null
  toBeTruthy
  如果转换为布尔值,是否为true
  toBeFalsy
  如果转换为布尔值,是否为false
  toContain
  数组中是否包含元素(值)。只能用于数组,不能用于对象
  toBeLessThan
  数值比较,小于
  toBeGreaterThan
  数值比较,大于
  toBeCloseTo
  数值比较时定义精度,先四舍五入后再比较
  toThrow
  检验一个函数是否会抛出一个错误
it("toThrow检验一个函数是否会抛出一个错误", function() {
var foo = function() {
return 1 + 2;
};
var bar = function() {
return a + 1;
};
expect(foo).not.toThrow();
expect(bar).toThrow();
});
  jasmine中还有一个强大的spy函数,用它可以监控函数的调用情况,因为涉及的内容比较多且文章只是起到抛砖引玉的作用,所以我就不一一列举了,大家感兴趣可以到官网进行深入了解。

posted @ 2014-06-30 18:39 顺其自然EVO 阅读(4446) | 评论 (1)编辑 收藏

Eclipse中Android单元测试

  说说正常的代码吧
  1)
  1:java测试
<span style="font-size:14px;">package com.medivh.app;
public class Person
{
public String sub(String username)
{
String sub = username.substring(3);
return sub;
}
public int add(int a,int b)
{
return a+b;
}
}</span>
  2:
<span style="font-size:14px;">package com.medivh.app;
import org.junit.Test;
import junit.framework.Assert;
import android.test.AndroidTestCase;
public class PersonTest extends AndroidTestCase
{
@Test
public void testSub() throws Exception
{
Person p = new Person();
p.sub(null);
}
public void testAdd() throws Exception
{
Person p = new Person();
int result = p.add(1, 4);
Assert.assertEquals(result, 6);
}
}
</span>
 2)AndroidManifest.xml
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.medivh.app"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<span style="color:#FF0000;"><uses-library android:name="android.test.runner" /></span>
</application>
<uses-sdk android:minSdkVersion="8" />
<span style="color:#FF0000;"><instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.medivh.app" android:label="Tests for My App" /></span>
</manifest> </span>
  3)测试
  右键项目Run as.. Android Junit Test 就会出结果
  开始的时候犯迷糊结果各种出错:
  No instrumentation runner found for the launch, using android.test.InstrumentationTestRunner
  First does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml
  is not configured correctly for running tests
  到网上各种查,发现配置没错啊。最后才发现问题出在我居然眼睛进沙子一般修改了bin下面的AndroidManifest.xml,可能是我前面打开了这个目录,结果就随意打开了它修改了它。希望大家以后小心行事。

posted @ 2014-06-30 18:38 顺其自然EVO 阅读(972) | 评论 (0)编辑 收藏

Junit实现Android单元测试

  编写android业务代码的时候,我们需要测试其正确性,那就用进行各种测试,很多时候,我们都是用的 System.out.println("XXXXX") 来进行验证,但有时候,我们肉眼也不一定就能判断的准确,所以可以考虑用下junit
  JUnit是个自动化单元测试工具,能够根据你需要测试的类及其接口自动生成该类的单元测试案例,你只要根据你的需要,就输入必要的测试数据就行了,系统运行后自动判断运行是否成功。
  下面我来介绍下如何使用JUnit来测试android项目。
  由于android系统已经集成了JUnit框架,所以我们无需导入JUnit的jar包。
  1、在AndroidManifest.xml文件中声明使用JUnit测试的包名 及加载JUnit类库代码,如下
  如上图,<uses-library>标签 作用是指定该应用程序必须链接的共享类库。这个元素告诉系统该应用程序包的类装载器中所包含的类库代码。
  <instrumentation> 可以理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。任何想成为Instrumentation的类必须继承android.app.Instrumentation。
  我们需要测试的就是项目 net.thinkeye.junitest 包下的类。
  2、写好的业务类:src/net/thinkeye/junitest/PersonService.java
package net.thinkeye.junitest;
/**
* 业务类,代码很简单
* @author Johnny
*/
public class PersonService {
/**
* 取Person的方法
* 因为使用了String的substring方法,当传入字段为空时即报异常
* @param name
*/
public void getPerson(String name){
name = name.substring(8);
}
/**
* 添加Person方法
* 可以使用Assert.assertEquals来测试其返回值的正确性
* @param a
* @param b
* @return
*/
public int addPerson(int a,int b){
return a+b;
}
}
 3、测试类,src/net/thinkeye/test/JTest.java 需继承 android.test.AndroidTestCase 类
package net.thinkeye.test;
import junit.framework.Assert;
import net.thinkeye.junitest.PersonService;
import android.test.AndroidTestCase;
/**
* 测试类,需继承android.test.AndroidTestCase类
* @author Johnny
*
*/
public class JTest extends AndroidTestCase{
/**
* 测试getPerson方法
* @throws Exception
*/
public void testGetPerson() throws Exception{
PersonService ps = new PersonService();
ps.getPerson(null);
}
/**
* 测试addPerson方法
* @throws Exception
*/
public void testAddPerson()throws Exception{
PersonService ps = new PersonService();
int t = ps.addPerson(2, 4);
System.out.println(t);
Assert.assertEquals(6, t);//junit.framework.Assert的作用判断t值是否等于6
}
}
  4、完成以上的步骤就可以开始测试了,如下图
  当传入null时报异常
  输入的字符串正确时通过了测试!
  addPerson方法的测试
  上面就是简单的测试例子,附上代码:

posted @ 2014-06-30 18:37 顺其自然EVO 阅读(176) | 评论 (0)编辑 收藏

网络配置——Linux运维基础

 今天把Linux的网络配置总结了一下,虽然并不难但是是个比较重要的基础。然后我也不知到自己以后是否会做运维,但是我知道自己比较喜欢刨根问底。还有就是我非常珍惜我曾经掌握过的这些运维的技能。今天突然间问自己,Linux网络配置的那个文件路径是什么。突然间小心脏又绷紧了,我发现记忆已经开始模糊了。虽然陆续有把之前运维的笔记整理上来,但是每次都有种写遗书的淡淡地忧伤在里面。突然间又想暴粗口了。。。。。
  一、网络基本配置
  首先就是/etc/sysconfig/network-scripts/ifcfg-eth0这个配置文件。这里的eth0就是我们的网卡名字,也是默认的名字。我们先来看看这个配置文件,如下(以我自己机子为例子):
  DEVICE="eth0"
  BOOTPROTO="dhcp"
  HWADDR="60:EB:69:BA:19:03"
  NM_CONTROLLED="yes"
  ONBOOT="yes"
  TYPE="Ethernet"
  UUID="10372dbd-9192-405d-b567-6cb32642acfa"
  由于是自家用的小电脑,配置比较简单。我们来一个一个介绍一下先:
  DEVICE:这个是网卡的名字,不是特别重要
  BOOTPROTO:这个一共有4个值分别是none、static、bootp、dhcp。none值主要是在网卡绑定的时候用到的,一般不使用。static值配置静态ip,一般我们在配服务器的时候就使用static(毕竟服务器要是经常ip变动,我相信腾讯肯定会被劳资们拆了)。bootp值也不常用,它是指通过bootp协议获取ip。bootp是一种udp/ip的协议,具体可以再去了解一下。dhcp值这个一般自家用,就是通过dhcp获取ip。
  HWADDR:这个是网卡MAC地址
  NM_CONTROLLED:这里的前缀NM是指NetworkManager,是一款Linux自带的网络管理工具。yes就是说这个网卡受到NM的控制,no就是不受它控制。一般做服务器配静态ip都会把这里设成no,然后NM的开机启动也要用chkconfigoff掉。
  ONBOOT:这个是指开机的时候是否启动这个网卡,yes就是开机启动,no就是不启动。
  TYPE:网卡类型
  UUID:这个是全球唯一标识,没有用的东西。
  由于我电脑用的是dhcp,所以补充一些简单的配置字段:
  IPADDR=192.168.1.10//ip地址
  NETMASK=255.255.255.0//子网掩码
  GATEWAY=192.168.1.1//默认网关
  PEERDNS:是否指定DNS。如果使用DHCP协议,默认为yes。
  yes:如果DNS设置,修改/etc/resolv.conf中的DNS
  no:不修改/etc/resolv.conf中的DNS
  DNS{1,2}:DNS地址。当PEERDNS为yes时会被写入/etc/resolv.conf中
  USERCTL:用户权限控制
  yes:非root用户允许控制该网络接口
  no:非root用户不运行控制该网络接口
  IPV6INIT:是否执行IPv6
  yes:支持IPv6
  no:不支持IPv6
  IPV6ADDR:IPv6地址/前缀长度
 二、献给那些windows运维人员
  在我实习的时候,我看到有很多运维window的员工适应不了windows运维到Linux运维的转变。毕竟也上了一些年纪,然后确实转变挺大的。所以我这里给上一个setup命令,可以在Linux下面提供window的图形化界面配置。希望可以帮助到一些人:
  非常棒吧,(*^__^*)。除了Networkconfiguration之后,还可以对防火墙、开机启动等各方面的配置。配置完之后,会自动在对应的配置文件中进行修改。具体的使用不难,大家自己摸索一下吧。
  三、网络配置进阶——网卡绑定
  这个绑定分为2种:单网卡绑定多个ip和多网卡绑定单个ip
  单网卡绑定多个ip
  使用情景:
  比如公司使用不同的运营商。为了提高系统稳定性,会为网卡绑定两个ip。或者像一台服务器运行多个小型网站站点,也会需要绑定多个ip地址。
  具体配置(非常简单):
  首先因为我环境比较特殊,先进行下面的配置:
  1、把ifcfg-eth0配置为静态ip地址(192.168.11.10)
  2、serviceNetworkManagerstop关闭掉NM
  然后我们在当前的配置目录下执行cpifcfg-eth0ifcfg-eth0:0利用原来的配置,创建新的子网卡文件各个配置文件如下:
  ifcfg-eth0
  DEVICE="eth0"
  BOOTPROTO="static"
  IPADDR="192.168.11.10"
  HWADDR="60:EB:69:BA:19:03"
  NM_CONTROLLED="yes"
  ONBOOT="yes"
  TYPE="Ethernet"
  UUID="10372dbd-9192-405d-b567-6cb32642acfa"
  ifcfg-eth0:0
  DEVICE="eth0:0"
  BOOTPROTO="static"
  IPADDR="192.168.11.11"
  HWADDR="60:EB:69:BA:19:03"
  NM_CONTROLLED="yes"
  ONBOOT="yes"
  TYPE="Ethernet"
  UUID="10372dbd-9192-405d-b567-6cb32642acfa"
 最后重启一下网络,查看一下效果:
  多网卡绑定单个ip
  使用情景:
  这个一般是提高网络的高可用性,当一块网卡出现问题的时候使用第二快网卡。虽然听起来好像很夸张,但是像思科的路由器也会装有备用电源或者CPU(不是我们电脑的cpu,是路由器的)
  具体配置:
  1、第一步先给两个网卡配置文档加上SLAVE=yes,把它变成奴隶。然后设置MASTER=bond0,告诉它你的主人是bond0。但是这里注意每个网卡都要设置BOOTPROTO=none。
  范例:
  DEVICE=eth0
  ONBOOT=yes
  BOOTPROTO=none
  MASTER=bond0
  SLAVE=yes
  2、创建他们的主人bond0(ifcfg-bond0)。
  范例:
  DEVICE=bond0
  BOOTPROTO=static
  IPADDR=10.1.3.210
  NETMASK=255.255.255.0
  GATEWAY=10.1.3.254
  ONBOOT=yes
  3、修改/etc/modprobe.d/dist.conf加入下面内容:
  aliasbond0bonding
  optionsbond0miimon=100mode=1
  mode=0:表示loadbalancing(round-robin)为负载均衡方式,两块网卡都在工作。
  mode=1:表示fault-tolerance(active-backup)提供冗余功能,工作方式是主备的工作方式,其中一块网卡在工作(若eth0断掉),则自动切换到另一个块网卡(eth1做备份)。
  最后servicenetworkrestart验证一下吧。

posted @ 2014-06-30 18:33 顺其自然EVO 阅读(211) | 评论 (0)编辑 收藏

AIX 操作系统查看文件夹及文件大小的命令

1、df -sg
  说明:查看各分区的使用情况
  2、du /local/notesdata/ | sort -nr | more
  说明:按占用空间大小降序列出/local/notesdata文件夹下所有目录的空间占用情况
  3、du -a /local/notesdata/ | sort -nr | more
  说明:按占用空间大小降序列出/local/notesdata文件夹下所有目录和文件的空间占用情况
  用du -sg 可看出当前文件夹的大小(以G为单位);
  用du -sg filename 可看出当前文件夹下所有文件或文件夹的大小(以G为单位);
  du -sk ,du -sm 则分别以KB,MB为单位。
  例子:
  root# ls -l
  total 8
  -rwxr-xr-x    1 root     system           42  7月28 19时54 test.sh
  -rw-r--r--    1 root     system            0  7月28 19时44 test_date
  drwxrwxrwx    3 root     system          256  7月27 08时47 webalizer-2.21-02-src
  用 ls -l 查看时, 是以byte为单位显示的, 如42 表示 test.sh的实际大小,256表示 webalizer-2.21-02-src 该目录的大小为256byte(注意,不是指该目录下文件的大小)
  用du -sk 查看结果:
  root# du -sk
  3748    .
  用du -sk * 查看结果:
  root# du -sk *
  4       test.sh
  0       test_date
  3744    webalizer-2.21-02-src

posted @ 2014-06-30 18:32 顺其自然EVO 阅读(686) | 评论 (0)编辑 收藏

Linux的OOM终结者

 现在是早晨6点钟。已经醒来的我正在总结到底是什么事情使得我的起床闹铃提前了这么多。故事刚开始的时候,手机铃声恰好停止。又困又烦躁的我看了下手机,看看是不是我自己疯了把闹钟调得这么早,居然是早晨5点。然而不是,而是我们的监控系统显示,Plumbr服务出故障了。
  作为这个领域的经验丰富的老鸟,我打开了咖啡机,这是正确解决问题的第一步。一杯咖啡在手之后,现在我可以开始处理故障了。首先要怀疑的是应用程序本身,因为它在崩溃之前一点异常也没有。应用程序日志中没有错误,没有警告,也没有任何可疑的信息。
  我们部署的监控系统发现进程已经挂掉了并重启了服务。由于现在咖啡因已经流淌在我的血液中了,我开始变得信心十足。果然在30分钟后,我在/var/log/kern.log日志中发现了下面的信息:
  Jun  4 07:41:59 plumbr kernel: [70667120.897649] Out of memory: Kill process 29957 (java) score 366 or sacrifice child
  Jun  4 07:41:59 plumbr kernel: [70667120.897701] Killed process 29957 (java) total-vm:2532680kB, anon-rss:1416508kB, filers:0kB
  很明显我们被Linux内核给坑了。你知道的,Linux里面有许多邪恶的怪物(也叫作守护进程)。这些守护进程是由几个内核作业所看管的,其中的一个犹为恶毒。所有的现代Linux内核中都会有一个内存不足终结者(Out of memory Killer, OOM Killer)的内建机制,在内存过低的情况下,它会杀掉你的进程。当探测到这一情况时,这个终结者会被激活,然后挑选出一个进程去终结掉。选择目标进程使用的是一套启发式算法,它会计算所有进程的分数,然后选出那个分数最低的进程。
  理解”Out of memory killer“
  默认情况下,Linux内核会允许进程请求的内存超出实际可用内存的大小。这在现实世界中是有意义的,因为大多数进程其实并不会用到所有分配给它的内存(注:同一时间内不会全用到)。和这个问题最类似的就是运营商了。他们承诺卖给用户的都是100Mb的带宽,这实际上远远超出了他们的网络容量。他们赌的就是用户实际上并不会同时用完分配给他们的下载上限。一个10Gb的连接可以很轻松地承载100个以上的用户,这里的100是通过简单的数学运算得出的(10G/100M)。
  这个做法的一个很明显的副作用就是,万一有一个程序正走上了一条耗尽内存的不归路怎么办。这会导致低可用内存的情况,也就是没有内存页能够再分配给进程了。你可能也碰到过这种情况,没有root帐户你是杀不掉这种顽固的进程的。为了解决这一情况,终结者被激活了,并找出了要终结的进程。
  关于"Out of memory killer"参数的调整,可以参考下这篇文章
  是谁触发了Out of memory killer?
  虽然现在已经知道发生了什么,但还是搞不清楚到底是谁触发了这个终结者,然后在早晨5点钟把我吵醒。进一步的分析后找到了答案:
  [*] /proc/sys/vm/overcommit_memory中的配置允许内存的超量使用——该值设置为1,这意味着每个malloc()请求都会成功。
  [*] 应用程序运行在一台EC2 m1.small的实例上。EC2的实例默认是禁用了交换分区的。
  这两个因素正好又赶上了我们服务的突然的流量高峰,最终导致应用程序为了支持这些额外的用户而不断请求更多的内存。内存超量使用的配置允许这个贪心的进程不停地申请内存,最后会触发这个内存不足的终结者,它就是来履行它的使命的。去杀掉了我们的程序,然后在大半夜把我给叫醒。

 示例
  当我把这个情况描述给工程师的时候,有一位工程师觉得很有意思,因此写了个小的测试用例来重现了这个问题。你可以在Linux下编译并运行下面这个代码片段(我是在最新的稳定版Ubuntu上运行的)。
package eu.plumbr.demo;
public class OOM {
public static void main(String[] args){
java.util.List l = new java.util.ArrayList();
for (int i = 10000; i < 100000; i++) {
try {
l.add(new int[100_000_000]);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
}
  然后你就会发现同样的一个 Out of memory: Kill process <PID> (java) score <SCORE> or sacrifice child信息。
  注意的是,你可能得调整下交换分区以及堆的大小,在我这个测试用例中,我通过-Xm2g设置了2G大小的堆,同时交换内存使用的是如下的配置:
  swapoff -a
  dd if=/dev/zero of=swapfile bs=1024 count=655360
  mkswap swapfile
  swapon swapfile
  解决方案?
  这种情况有好几种解决方案。在我们这个例子中,我们只是把系统迁移到了一台内存更大的机器上(裤子都脱了就让我看这个?)我也考虑过激活交换分区,不过咨询了工程师之后我想起来JVM上的GC进程在交换分区下的表现并不是很理想,因此这个选项就作罢了。
  还有别的一些方法比如OOM killer的调优,或者将负载水平分布到数个小的实例上,又或者减少应用程序的内存占用量。

posted @ 2014-06-30 18:32 顺其自然EVO 阅读(227) | 评论 (0)编辑 收藏

使用Oradim恢复Windows上的数据库

Windows上如果系统崩溃了,数据文件、控制文件、日志文件等都还在,怎样来恢复Oracle数据库?
  前几天重新安装了系统,正好需要恢复一下数据库。
  如果软件也损失了,那么需要重新安装一下数据库软件。
  很多人抱怨我的新书很少关于Windows的内容,实际上,Windows和Linux/Unix上的操作没有什么不同,Windows本身就是一个仿Unix的系统。
  那么好吧,我还是用一个系列的文章介绍一下我所使用的Windows系统,以及我所认为的数据库系统无关性。
  大家可以跟随我看一下这样一个过程。
  首先开启一个cmd命令行窗口。
  开始->运行->cmd
  我的Oracle软件备份在D:/oracle :
  D:/>dir oracle
  驱动器 D 中的卷是 PRIVAT
  卷的序列号是 94B0-FD3B
  D:/oracle 的目录
  2006-08-16  14:14    <DIR>          .
  2006-08-16  14:14    <DIR>          ..
  2006-08-16  14:14    <DIR>          ora10gR2
  0 个文件              0 字节
  3 个目录    941,744,128 可用字节
  我的数据文件位于D:/oradata下:
  D:/>dir d:/oradata
  驱动器 D 中的卷是 PRIVAT
  卷的序列号是 94B0-FD3B
  d:/oradata 的目录
  2006-08-16  14:25    <DIR>          .
  2006-08-16  14:25    <DIR>          ..
  2005-09-12  16:40    <DIR>          flash_recovery_area
  2005-09-12  16:40    <DIR>          EYGLE
  0 个文件              0 字节
  4 个目录    941,744,128 可用字节
  现在让我们用oradim创建一个实例,实际上也就是创建一个Windows服务:
  C:/>oradim -new -sid eygle
  实例已创建。
  我们用net命令可以查看系统启动了哪些服务,我们看到Oracle的服务已经启动:
  C:/>net start
已经启动以下 Windows 服务:
  ...............
  O&O Defrag
  OracleServiceeygle
  Plug and Play
  Print Spooler
  ...............
  命令成功完成。
  如果你的系统装了一些Unix增强工具,那么可以通过grep过滤一下:
  C:/>net start |grep Oracle
  OracleServiceeygle
  此时我们就可以通过启动实例,挂接原有数据库,启动Oracle数据库了。当然你可能还有一些其他工作需要完成,比如重建口令文件等。
  如果你想删除这个服务,那么也很简单:
  C:/>oradim -delete -sid eygle
  实例已删除。
  当然做好备份仍然是最重要的,我见过有的企业将文件分散在很多逻辑分区上,结果随系统崩溃丢失了部分文件,损失也是相当惨重的。
  在Linux/Unix上不需要服务来启动实例,也就不存在这样类似的操作。不过在命令行操作,一切都是类似的。

posted @ 2014-06-30 18:31 顺其自然EVO 阅读(132) | 评论 (0)编辑 收藏

Linux下最好用的中文输入法 scim

SCIM应该是最好的中文输入法了,它与搜狗差不多,下面介绍它的安装方法:
  1)终端输入:sudo apt-get remove scim
  这一步是删除安装系统的时候装的那个scim,实际是个假的,我这里不可以用
  2)sudo apt-get install scim
  这一步安装scim输入法。完了系统会自己装上,中间会有提示,直接y就行了
  3)sudo apt-get install scim-chinese
  这一步是安装中文输入法,前面那一步只是下载一个可以运行输入法的平台,现在是在这个具体平台上安装中文输入
  4) sudo gedit /etc/X11/Xsession.d /95xinput
  这个步骤是新建一个95xinput的文件,该文件的具体内容如下:
/usr/bin/scim -d
XMODIFIERS="@im=SCIM"
export XMODIFIERS
export GTK_IM_MODULE=scim
  把以上内容复制到新建的95xinput文件中,然后,确定无误后,保存,退出gedit编辑器
  5)exit 退出终端
  6)Logout,重新登录,然后用Ctrl+Space就可以激活中文输入法啦

posted @ 2014-06-30 18:31 顺其自然EVO 阅读(193) | 评论 (0)编辑 收藏

Ubuntu下配置Mysql的远程管理

1.进入mysql,修改 mysql这个database下的user数据表
  将root用户对应的记录只保留一条host为localhost的记录;
  然后将root用户对应的host属性由localhost改为%
  再执行命令 flush privileges;
  2.修改/etc/mysql/my.cnf
  老的版本中
  >skip-networking => # skip-networking
  新的版本中
  >bind-address=127.0.0.1 => bind-address= 你机器的IP
  这样就可以允许其他机器访问MySQL了。

posted @ 2014-06-30 18:30 顺其自然EVO 阅读(138) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 92 93 94 95 96 97 98 99 100 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜