一、为什么不能用kill -9 :

项目中需要一个死循环不断从队列中获取消息存入数据库,但是,当项目需要重启时, 操作人员往往会用kill -9 直接关闭java进程。导致数据丢失。为了解决这个问题, 用到下面技术,

1. 一个是 java的hook ,钩子函数,在虚拟机启动时注册一个钩子函数,
   当执行kill时,java虚拟机会对钩子函数中资源进行回收。

2. 多线程,用线程启动死循环,然后钩子函数接收到关闭命令时传递死循环标志位。
   示例代码如下:

二、线程方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class MyRunnable implements Runnable {
	private volatile boolean quit =false;

	public boolean isQuit() {
		return quit;
	}

	public void setQuit(boolean quit) {
		this.quit = quit;
	}

	public void run() {
		int i = 0;
		while (!quit) {
			doStuff(i++);
		}
	}

	private void doStuff(int n) {

		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("----->" + n);
	}

}


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThread {

	public static void main(String[] args) {

		final MyRunnable test = new MyRunnable();
		

		final ExecutorService executorService = Executors.newCachedThreadPool();
		executorService.execute(test);

		Runtime.getRuntime().addShutdownHook(new Thread() {
			public void run() {
				test.setQuit(true);
				sleep(5);
					while (test.isQuit()&&!executorService.isShutdown()) {
						System.out.println("thread is closed, now ,close executorService!"); // optional

						executorService.shutdown();
					}

			}

			private void sleep(int n) {
				try {
					Thread.sleep(1000*n);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});

	}

}

增加pages步骤:

git add .
git commit -m "first post"
git push origin master
jekyll serve
rake post title="Hello World"

增加到本地库。

  1. 参考资料 : windows7下基于github搭建jekyll博客
  2. 官方资料:Generating SSH Keys
  3. 三分钟搭建jekyll :Zero to Hosted Jekyll Blog in 3 Minutes

Centos6.4默认的python环境是2.6.6。我们可以自己安装Python 2.7.3。但是值得注意的是,我们必须不能破坏系统的环境。 因为几个关键的实用应用程序依赖于Python2.6.6。如果替换了系统的python环境就会发生很多难以预见的错误,导致要重装系统。 在没有破坏系统的python环境的情况下安装Python 2.7.3。执行以下命令,请使 用root的身份登录或者使用sudo命令 安装开发工具 为了编辑Python,你必须要先安装开发工具盒一些额外的库。这些额外的库并不严格的需要,但是如果不安装,新版本的python编译器可能没法工作。所以建议 先安装。

# yum groupinstall "Development tools"
# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

下载和安装Python 下面有个一个非常重要的步骤是我们使用的是make altinstall。如果使用make install,你将会看到在系统中有两个不同版本的Python在/usr/bin/目录中。这将会导致很多问题,而且不好处理。

# wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
# tar xf Python-2.7.3.tar.bz2
# cd Python-2.7.3
# ./configure --prefix=/usr/local
# make && make altinstall
运行以上命令后,你可以在目录/usr/local/bin/python2.7 看到新编译的环境。系统的环境python 2.6.6是在/usr/bin/python目录 和 /usr/bin/python2.6目录 .

下载和安装Distribute Distribute提供一个安装python模块的框架。你系统的每一个python解释器都需要它自己的Distribute。你可以自己找到最新版本的Distribute,在这里https://pypi.python.org/pypi/distribute

# wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.35.tar.gz
# tar xf distribute-0.6.35.tar.gz
# cd distribute-0.6.35
# python2.7 setup.py install
这将产生一个脚本/usr/local/bin/easy_install-2.7 ,你可以使用它来安装python 2.7模块。它将安装的模块放到 /usr/local/lib/python2.7/site-packages/目录中。

VirtualEnv构建Python虚拟机工作环境 virtualenv是Python开发常用的工具之一,它可以帮助开发者建立一个独立的虚拟的环境,开发者可以将自己需要用的pythonpackage装入到这个虚拟环境中,这样就和系统全局的其他package隔离了,不会影响系统的package布局,要使用这些安装在虚拟环境中的模块,只需要activate进行该环境就OK了,不activate的话就不能使用那些在虚拟环境中的模块,就像从没安装过一样。

# easy_install-2.7 virtualenv
# virtualenv-2.7 --distribute someproject
New python executable in someproject/bin/python2.7
Also creating executable in someproject/bin/python
Installing distribute...................done.
Installing pip................done.
# source someproject/bin/activate
(someproject)# python --version
Python 2.7.3
(someproject)#

使用方法:

转载

1:使用vim -d file1 file2 直接打开两个文件对比
   或:使用vim file1打开第一个文件,然后使用vert diffsplit file2打开第二个文件进行对比;
       (vert表示垂直分割窗口,默认为水平分割窗口)
2:直接对比两个文件的不同:使用diffthis分别在两个窗口输入;
3:其他技巧:
    3.1:定位不同点:[c、]c 分别跳到前一个、后一个不同点;
    3.2:窗口跳转:ctrl-w w 跳到下一个窗口
            ctrl-w h/l 跳到左侧(右侧)窗口
            ctrl-w j/k 跳到上方(下方)窗口
    3.3:文档合并:dp将差异点的当前文档内容合并到另外一个文档(diff put)
            do 将差异点的另一个文档内容拷贝到当前文档
    3.4:打开文件折叠:(文本默认将部分内容折叠,扩大视野)
            zo 临时展开被折叠的相同内容
            zc 重新折叠

  1. 使用vim的比较模式打开两个文件

             vim -d file1 file2
             或
             vimdiff file1 file2
    
  2. 如果已经打开了文件file1,再打开另一个文件file2进行比较:

         :vert diffsplit file2
         如果没有用vert命令,diffsplit则会分上下两个窗口。
    
  3. 如果已经用split方式打开了两个文件file1,file2,又想比较两文件的不同。

         分别在两个窗口里面输入命令:
         :diffthis
    
  4. 如果更改了某个窗口的内容,vim又没有自动更新diff检查,可以使用如下命令更新:

         :diffupdate
    
  5. 定位到不同点:

         [c     跳到前一个不同点
         ]c     跳到后一个不同点
    
  6. 在窗口间跳转:

         ctrl-w w    跳到下一个窗口
         ctrl-w h    跳到左侧窗口
         ctrl-w l    跳到右侧窗口
         ctrl-w j    跳到下方的窗口
         ctrl-w k    跳到上方的窗口
    
  7. 合并文档:

         dp          将差异点的当前文档内容应用到另一文档(diff put)
         do          将差异点的另一文档的内容拷贝到当前文档(diff get)
    
  8. 上下文的展开和查看

         比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以这样设置:
         :set diffopt=context:3
         可以用简单的折叠命令来临时展开被折叠的相同的文本行:
         zo          (folding open, z这个字母看上去比较像折叠的纸)
    
         然后可以用下列命令来重新折叠:
         zc          (folding close)