posts - 167,  comments - 30,  trackbacks - 0
假设您今天要开发一个动画编辑程式,动画由影格(Frame)组成,数个影格组合为动画清单,动画清单也可以由其它已完成的动画清单组成,也可以在动画清单与清单之间加入个别影格。无论是影格或动画清单都可以播放,而动画清单负责的就是组合影格或动画清单,所以可以这么设计:




对于Frame而言,Playlist是一个容器,然而Playlist也实作Playable,所以它也可以播放,您可以进一步地将Playlist组合至另一个Playlist中,以形成更长的播放清单。以Java实现的话。
以Java實現的話。
import java.util.*;

interface Playable {
void play();
}

class Frame implements Playable {
private String image;
Frame(String image) {
this.image = image;
}
public void play() {
System.out.println("播放 " + image);
}
}

class Playlist implements Playable {
private List<Playable> list = new ArrayList<Playable>();
public void add(Playable playable) {
list.add(playable);
}
public void play() {
for(Playable playable : list) {
playable.play();
}
}
}

public class Main {
public static void main(String[] args) {
Frame logo = new Frame("片頭 LOGO");

Playlist playlist1 = new Playlist();
playlist1.add(new Frame("Duke 左揮手"));
playlist1.add(new Frame("Duke 右揮手"));

Playlist playlist2 = new Playlist();
playlist2.add(new Frame("Duke 走左腳"));
playlist2.add(new Frame("Duke 走右腳"));

Playlist all = new Playlist();
all.add(logo);
all.add(playlist1);
all.add(playlist2);

all.play();
}
}

以Python實現的話:
class Frame:
def __init__(self, image):
self.image = image
def play(self):
print("播放 " + self.image)

class Playlist:
def __init__(self):
self.list = []
def add(self, playable):
self.list.append(playable);
def play(self):
for playable in self.list:
playable.play()

logo = Frame("片頭 LOGO")

playlist1 = Playlist()
playlist1.add(Frame("Duke 左揮手"))
playlist1.add(Frame("Duke 右揮手"))

playlist2 = Playlist()
playlist2.add(Frame("Duke 走左腳"))
playlist2.add(Frame("Duke 走右腳"))

all = Playlist()
all.add(logo)
all.add(playlist1)
all.add(playlist2)

all.play();以UML来表示Composite模式的结构:



具有层次性或组合性的物件可以使用Composite模式,像是电路元件、视窗元件等,使用Composite模式可以大大减低这些元件设计的复杂度,以Java标准API中AWT视窗元件为例,
Component上有个paint()方法,可以进行元件的绘制,Container可以容纳Component(如Button、Label等),而Container继承Component,所以Container也可以容纳Container,这也是Composite模式的实际例子:
 

from : http://caterpillar.onlyfun.net/Gossip/index.html 



posted @ 2012-10-12 16:20 David1228 阅读(311) | 评论 (0)编辑 收藏

云计算用一个朋友的话来说:”做云计算最苦逼的就是得时时刻刻为一些可能一辈子都碰不到的事做好准备。更苦逼的就是刚以为一个问题不会遇到,立刻就发生了。。。“。这个还真的没有办法,谁让哥我是搞云计算的呢,简单一个虚拟化就搞的你蛋疼,你还能想其它的吗?一直纠结在做虚拟化使用什么镜像格式,刚刚开始用了raw的file,后来发现LVM的很多特性对于虚拟化还是有比较理想的能力,而且性能也很不错就用了LVM。后来被VMware骗了跑去搞Esxi接触了VMDK,最近研究openstack发现了qcow2格式,貌似现在很流行呀。也说不上分析这些镜像格式的能力,就简单说说自己的一些使用心得。

目前主要有那些格式来作为虚拟机的镜像:
raw
(default) the raw format is a plain binary image of the disc image, and is very portable. On filesystems that support sparse files, images in this format only use the space actually used by the data recorded in them.
老牌的格式了,用一个字来说就是裸,也就是赤裸裸,你随便dd一个file就模拟了一个raw格式的镜像。由于裸的彻底,性能上来说的话还是不错的。目前来看,KVM和XEN默认的格式好像还是这个格式。因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。
裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像磁盘,使用多少就是多少(du -h看到的大小就是使用大小),但如果你要把整块磁盘都拿走的话得全盘拿了(copy镜像的时候),会比较消耗网络带宽和I/O。接下来还有个有趣的问题,如果那天你的硬盘用着用着不够用了,你咋办,在买一块盘。但raw格式的就比较犀利了,可以在原来的盘上追加空间:
dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先创建4G的空间)
cat foresight.img zeros.raw > new-foresight.img(追加到原有的镜像之后)
当然,好东西是吹出来的,谁用谁知道,还是有挺多问题的。由于原生的裸格式,不支持snapshot也是很正常的。传说有朋友用版本管理软件对raw格式的文件做版本管理从而达到snapshot的能力,估计可行,但没试过,这里也不妄加评论。但如果你使用LVM的裸设备,那就另当别论。说到LVM还是十分的犀利的,当年用LVM做虚拟机的镜像,那性能杠杠的。而且现在好多兄弟用虚拟化都采用LVM来做的。在LVM上做了很多的优化,国外听说也有朋友在LVM增量备份方面做了很多的工作。目前来LVM的snapshot、性能、可扩展性方面都还是有相当的效果的。目前来看的话,备份的话也问题不大。就是在虚拟机迁移方面还是有很大的限制。但目前虚拟化的现状来看,真正需要热迁移的情况目前需求还不是是否的强烈。虽然使用LVM做虚拟机镜像的相关公开资料比较少,但目前来看牺牲一点灵活性,换取性能和便于管理还是不错的选择。

对于LVM相关的特性及使用可以参考如下链接:

http://www.ibm.com/developerworks/linux/library/l-lvm2/index.html

cow
copy-on-write format, supported for historical reasons only and not available to QEMU on Windows
曾经qemu的写时拷贝的镜像格式,目前由于历史遗留原因不支持窗口模式。从某种意义上来说是个弃婴,还没得它成熟就死在腹中,后来被qcow格式所取代。

qcow
the old QEMU copy-on-write format, supported for historical reasons and superseded by qcow2

一代的qemu的cow格式,刚刚出现的时候有比较好的特性,但其性能和raw格式对比还是有很大的差距,目前已经被新版本的qcow2取代。其性能可以查看如下链接:
http://www.linux-kvm.org/page/Qcow2

qcow2
QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots, smaller images on filesystems that don’t support sparse files, optional AES encryption, and optional zlib compression
现在比较主流的一种虚拟化镜像格式,经过一代的优化,目前qcow2的性能上接近raw裸格式的性能,这个也算是redhat的官方渠道了,哈哈,希望有朋友能拍他们砖:

https://fedoraproject.org/wiki/Features/KVM_qcow2_Performance

对于qcow2的格式,几点还是比较突出的,qcow2的snapshot,可以在镜像上做N多个快照:

  • 更小的存储空间,即使是不支持holes的文件系统也可以(这下du -h和ls -lh看到的就一样了)
  • Copy-on-write support, where the image only represents changes made to an underlying disk image(这个特性SUN ZFS表现的淋漓尽致)
  • 支持多个snapshot,对历史snapshot进行管理
  • 支持zlib的磁盘压缩
  • 支持AES的加密

vmdk 
VMware 3 & 4, or 6 image format, for exchanging images with that product
VMware的格式,这个格式说的蛋疼一点就有点牛X,原本VMware就是做虚拟化起家,自己做了一个集群的VMDK的pool,做了自己的虚拟机镜像格式。又拉着一些公司搞了一个OVF的统一封包。从性能和功能上来说,vmdk应该算最出色的,由于vmdk结合了VMware的很多能力,目前来看,KVM和XEN使用这种格式的情况不是太多。但就VMware的Esxi来看,它的稳定性和各方面的能力还是可圈可点。

vdi
VirtualBox 1.1 compatible image format, for exchanging images with VirtualBox.
SUN收购了VirtualBox,Oracle又收购了SUN,这么说呢,vdi也算虚拟化这方面的一朵奇葩,可惜的是入主的两家公司。SUN太专注于技术(可以说是IT技术最前端也不为过),Oracle又是开源杀手(mysql的没落)。单纯从能力上来说vdi在VirtualBox上的表现还是不错的。也是不错的workstation级别的产品。

说了这么多虚拟机镜像格式,这么多虚拟化,做云计算的伤不起呀,得为长期发展考虑,也有朋友对镜像的转换做了很多事情,简单看看几种镜像的转化:

VMDK–>qcow2:

kevin@kevin:~# qemu-img convert -f vmdk -O qcow2 SLES11SP1-single.vmdk SLES11SP1-single.img

http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html

qcow2–>raw:

kevin@kevin:~$ qemu-img convert -O qcow2 image-raw.raw image-raw-converted.qcow

转载自:http://www.prajnagarden.com/?p=248 
posted @ 2012-10-11 15:43 David1228 阅读(614) | 评论 (0)编辑 收藏
通过源码包安装、配置Mysql详细步骤:

1、上传mysql-5.5.8-linux2.6-x86_64.tar.gzWeb服务器的/usr/local/目录下

2、解压并重命名

# cd /usr/local

# tar –xvzf mysql-5.5.8-linux2.6-x86_64.tar.gz

# mv mysql-5.5.8-linux2.6-x86_64 mysql

3、配置/etc/my.cnf

1)安装操作系统时如果安装了MySql就会生成/etc/my.cnf,而系统自带的MySql版本较低,所以替换已有的/etc/my.cnf,替换之前可以备份my.cnf

#mv /etc/my.cnf  /etc/my.cnf_bak

# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

2)编辑/etc/my.cnf,配置IP连接,在mysqld中加入下边的红色字体

#vi /etc/my.cnf

[mysqld]

port            = 3306

socket          = /tmp/mysql.sock

skip-name-resolve

skip-external-locking

3)保存,退出。

4、添加mysql用户和用户组

如果系统已经安装了mysql,则在添加mysql用户和用户组的时候会提示mysql用户(或用户组)已经存在,这种提示是正常的。

# groupadd mysql

# useradd -g mysql mysql

5、修改mysql目录权限

1)设定root用户可以访问

# chown -R root /usr/local/mysql

2)设定mysql组和mysql用户能访问/usr/local/mysql/usr/local/mysql/data

# chgrp -R mysql /usr/local/mysql

#chown -R mysql /usr/local/mysql/data

6、创建mysql系统数据库

# cd /usr/local/mysql

#./scripts/mysql_install_db --user=mysql&

7、使用mysql用户启动mysqld

#/usr/local/mysql/bin/mysqld_safe  -user=mysql&

8、设定MySqlroot用户的密码

假设root用户的密码为123456,根据实际环境自行设定

#/usr/local/mysql/bin/mysqladmin -u root password 123456

9、使用root用户登录MySql

根据步骤8设定的用户密码登录mysql

# cd /usr/local/mysql/bin

#./mysql -u root -p     

Enter password:

10、开启mysql远程访问

1)赋予root用户远程访问权限

# grant all privileges on *.* to root @"%" identified by "123456";

#flush privileges;

2)参数说明

a)   grant all privileges:赋予所有权限,all可以替换为相关操作;

b)   *.*:说明数据库和表名,*代表所有;

c)   root:说明是给root用户设定权限,可以替换为其他用户;

d)   %:这里是Host名称,允许所有的就用%;

e)   123456:是root用户的密码;

f)   flush privileges:是把新赋权限表刷新加载到内存,可以理解为即时生效。

11、配置MySql自动启动

编辑/etc/rc.d/rc.local文件,在文件最底端加入启动语句

# vi /etc/rc.d/rc.local

……

/usr/local/mysql/bin/mysqld_safe -user=mysql&

通过rpm包安装、配置及卸载mysql的详细过程.

  以MySQL-server-4.0.14-0.i386.rpm为例,放在/data目录下

  cd /data

  rpm -ivh MySQL-server-4.0.14-0.i386.rpm

  安装完成后在/usr/share/mysql目录中会有一个mysql的启动脚本mysql.server及示例配置文件等(如my-huge.cnf、my-large.cnf、my-medium.cnf)

  拷贝一个示例配置文件作为mysql的配置文件:

  cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

  rpm包安装完后自动将mysql安装成系统服务,所以可以使用下面命令启动、停止mysql

  启动mysql

  /etc/init.d/mysql start 或 service mysql start

  停止mysql

  /etc/init.d/mysql stop 或 service mysql stop

  到此,mysql服务就安装配置完成。

  安装mysql客户端

  rpm -ivh MySQL-client-4.0.14-0.i386.rpm

  mysql安装好后目录结构如下:

  工具程序在/usr/bin目录中---ls /usr/bin/mysql*

  服务器程序/usr/sbin/mysqld

  数据目录/var/lib/mysql

  默认情况下mysql将错误日志文件、二进制日志文件及进程文件写在/var/lib/mysql目录中,如localhost.err、localhost.pid、localhost-bin.001等

  要改变这些情况可以修改/etc/my.cnf文件

  如将日志文件写在/var/log目录中,可以在my.cnf文件中加入下面两行:

  [mysqld_safe]

  err-log = /var/log/mysqld.log

  有个实用程序/usr/bin/mysql_install_db,该程序可以用来初始化 mysql数据库,即创建/var/log/mysql目录,及创建mysql数据库(mysql授权表等信息)及test数据库(空库),如果不小心删 除了/var/log/mysql目录可以通过该程序来初始化.

  卸载mysql

  rpm -qa|grep -i mysql

  rpm -ev MySQL-server-4.0.14-0 MySQL-client-4.0.14-0

  卸载后/var/lib/mysql中的数据及/etc/my.cnf不会删除,如果确定没用后就手工删除

  rm -f /etc/my.cnf

  rm -rf /var/lib/mysql

posted @ 2012-10-11 15:21 David1228 阅读(314) | 评论 (0)编辑 收藏

一、命令行方式

关闭要调整的虚拟机,编辑虚拟机配置文件

#virsh edit 'your vm name'

找到配置文件中的以下字段:

<graphics type='vnc' port='-1'/>

加入键盘的语言布局后如下:

<graphics type='vnc' port='-1' keymap='en-us'/>

保存退出后,重新载入虚拟机配置文件

#virsh create /etc/libvirt/qemu/'your vm name'.xml

如果要避免这种情况,在使用virt-install安装的时候,就加入键盘布局的字段

--keymap=en-us 

二、virt-manager方式

在虚拟关闭的状态下,通过virt-manager界面选中相应的虚拟机:

open-->Details-->Display VNC-->keymap-->en-us

保存后再启动虚拟机就可以了
转载自:http://cncto.blog.51cto.com/blog/235831/886946

posted @ 2012-08-06 12:10 David1228 阅读(3083) | 评论 (0)编辑 收藏

【简介】

Python(蟒蛇)是一种动态解释型的编程语言。Python可以在Windows、UNIX、MAC等多种操作系统上使用,也可以在Java、.NET开发平台上使用。

python logo

python logo

 

【特点】

1 Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型。

2 Python具有很强的面向对象特性,而且简化了面向对象的实现。它消除了保护类型、抽象类、接口等面向对象的元素。

3 Python代码块使用空格或制表符缩进的方式分隔代码。

4 Python仅有31个保留字,而且没有分号、begin、end等标记。

5 Python是强类型语言,变量创建后会对应一种数据类型,出现在统一表达式中的不同类型的变量需要做类型转换。

python_book

python book

【搭建开发环境】

1 可以到www.python.org下载安装包,然后通过configure、make、make install进行安装。

2 也可以到www.activestate.com去下载ActivePython组件包。(ActivePython是对Python核心和常用模块的二进制包装,它是ActiveState公司发布的Python开发环境。ActivePython使得Python的安装更加容易,并且可以应用在各种操作系统上。ActivePython包含了一些常用的Python扩展,以及Windows环境的编程接口)。对ActivePython来说,如果你是windows用户,下载msi包安装即可;如果你是Unix用户,下载tar.gz包直接解压即可。

3 Python的IDE,包括PythonWin、Eclipse+PyDev插件、Komodo、EditPlus

【版本】

python2与python3是目前主要的两个版本。

如下两种情况下,建议使用python2:

1 你无法完全控制你即将部署的环境时;

2 你需要使用一些特定的第三方包或扩展时;

python3是官方推荐的且是未来全力支持的版本,目前很多功能提升仅在python3版本上进行。

【hello world】

1 创建hello.py

2 编写程序:

  1. if __name__ == '__main__':  
  2. print "hello word" 

3 运行程序:

  1. python ./hello.py 

【注释】

1 无论是行注释还是段注释,均以#加一个空格来注释。

2 如果需要在代码中使用中文注释,必须在python文件的最前面加上如下注释说明:

  1. # -* - coding: UTF-8 -* - 

3 如下注释用于指定解释器

  1. #! /usr/bin/python 

【文件类型】

1 Python的文件类型分为3种,即源代码、字节代码和优化代码。这些都可以直接运行,不需要进行编译或连接。

2 源代码以.py为扩展名,由python来负责解释;

3 源文件经过编译后生成扩展名为.pyc的文件,即编译过的字节文件。这种文件不能使用文本编辑器修改。pyc文件是和平台无关的,可以在大部分操作系统上运行。如下语句可以用来产生pyc文件:

  1. import py_compile  
  2. py_compile.compile(‘hello.py’) 

4 经过优化的源文件会以.pyo为后缀,即优化代码。它也不能直接用文本编辑器修改,如下命令可用来生成pyo文件:

  1. python -O -m py_complie hello.py 

【变量】

1 python中的变量不需要声明,变量的赋值操作即使变量声明和定义的过程。

2 python中一次新的赋值,将创建一个新的变量。即使变量的名称相同,变量的标识并不相同。用id()函数可以获取变量标识:

  1. x = 1 
  2. print id(x)  
  3. x = 2 
  4. print id(x) 

3 如果变量没有赋值,则python认为该变量不存在

4 在函数之外定义的变量都可以称为全局变量。全局变量可以被文件内部的任何函数和外部文件访问。

5 全局变量建议在文件的开头定义。

6 也可以把全局变量放到一个专门的文件中,然后通过import来引用:

gl.py文件中内容如下:

  1. _a = 1 
  2. _b = 2 

use_global.py中引用全局变量:

  1. import gl  
  2. def fun():  
  3. print gl._a  
  4. print gl._b  
  5. fun() 

【常量】

python中没有提供定义常量的保留字。可以自己定义一个常量类来实现常量的功能。

  1. class _const:  
  2. class ConstError(TypeError): pass 
  3. def __setattr__(self,name,vlaue):  
  4. if self.__dict__.has_key(name):  
  5. raise self.ConstError, “Can’t rebind const(%s)”%name  
  6. self.__dict__[name]=value  
  7. import sys  
  8. sys.modules[__name__]=_const() 

【数据类型】

1 python的数字类型分为整型、长整型、浮点型、布尔型、复数类型。

2 python没有字符类型

3 python内部没有普通类型,任何类型都是对象。

4 如果需要查看变量的类型,可以使用type类,该类可以返回变量的类型或创建一个新的类型。

5 python有3种表示字符串类型的方式,即单引号、双引号、三引号。单引号和双引号的作用是相同的。python程序员更喜欢用单引号,C/Java程序员则习惯使用双引号表示字符串。三引号中可以输入单引号、双引号或换行等字符。

【运算符和表达式】

1 python不支持自增运算符和自减运算符。例如i++/i–是错误的,但i+=1是可以的。

2 1/2在python2.5之前会等于0.5,在python2.5之后会等于0。

3 不等于为!=或<>

4 等于用==表示

5 逻辑表达式中and表示逻辑与,or表示逻辑或,not表示逻辑非

【控制语句】

1 条件语句:

  1. if (表达式) :  
  2. 语句1  
  3. else :  
  4. 语句2 

2 条件语句:
 

  1. if (表达式) :  
  2. 语句1  
  3. elif (表达式) :  
  4. 语句2  
  5. …  
  6. elif (表达式) :  
  7. 语句n  
  8. else :  
  9. 语句m 

3 条件嵌套:

  1. if (表达式1) :  
  2. if (表达式2) :  
  3. 语句1  
  4. elif (表达式3) :  
  5. 语句2  
  6. …  
  7. else:  
  8. 语句3  
  9. elif (表达式n) :  
  10. …  
  11. else :  
  12. … 

4 python本身没有switch语句。

5 循环语句:

  1. while(表达式) :  
  2. …  
  3. else :  
  4. … 

6 循环语句:

  1. for 变量 in 集合 :  
  2. …  
  3. else :  
  4. … 

7 python不支持类似c的for(i=0;i<5;i++)这样的循环语句,但可以借助range模拟:

  1. for x in range(0,5,2):  
  2. print x 

【数组相关】

1 元组(tuple):python中一种内置的数据结构。元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串、数字甚至元素。元组是写保护的,即元组创建之后不能再修改。元组往往代表一行数据,而元组中的元素代表不同的数据项。可以把元组看做不可修改的数组。创建元组示例如下:

  1. tuple_name=(“apple”,”banana”,”grape”,”orange”) 

2 列表(list):列表和元组相似,也由一组元素组成,列表可以实现添加、删除和查找操作,元素的值可以被修改。列表是传统意义上的数组。列表创建示例如下:

  1. list=[“apple”,”banana”,”grage”,”orange”] 

可以使用append方法来在尾部追加元素,使用remove来删除元素。

3 字典(dictionary):由键-值对组成的集合,字典中的值通过键来引用。键和值之间用冒号隔开,键-值对之间用逗号隔开,并且被包含在一对花括号中。创建示例如下:

  1. dict={“a”:”apple”, “b”:”banana”, “g”:”grage”, “o”:”orange”} 

4 序列:序列是具有索引和切片能力的集合。元组、列表和字符串都属于序列。

【函数相关】

1 python程序由包(package)、模块(module)和函数组成。包是由一系列模块组成的集合。模块是处理某一类问题的函数和类的集合。

2 包就是一个完成特定任务的工具箱。

3 包必须含有一个__init__.py文件,它用于标识当前文件夹是一个包。

4 python的程序是由一个个模块组成的。模块把一组相关的函数或代码组织到一个文件中,一个文件即是一个模块。模块由代码、函数和类组成。导入模块使用import语句。

5 包的作用是实现程序的重用。

6 函数是一段可以重复多次调用的代码,函数定义示例如下:

  1. def arithmetic(x,y,operator):  
  2. result={  
  3. “+”:x+y,  
  4. “-“:x-y,  
  5. “*”:x*y,  
  6. “/”:x/y  

7 函数返回值可以用return来控制。

【字符串相关】

1 格式化输出:

  1. format=”%s%d” % (str1,num)  
  2. print format 

2 用+进行字符串的合并:

  1. str1=”hello”  
  2. str2=”world”  
  3. result=str1+str2 

3 字符串截取可以通过索引/切片,也可以通过split函数。

4 通过切片截取字符串:

  1. word=”world”  
  2. print word[0:3] 

5 python使用==和!=来进行字符串比较。如果比较的两个变量的类型不相同,那么结果必然为不同。

【文件处理】

1 简单处理文件:

  1. context=”hello,world”  
  2. f=file(“hello.txt”,’w’)  
  3. f.write(context);  
  4. f.close() 

2 读取文件可以使用readline()函数、readlines()函数和read函数。

3 写入文件可以使用write()、writelines()函数

【对象和类】

1 python用class保留字来定义一个类,类名的首字符要大写。当程序员需要创建的类型不能用简单类型来表示时,就需要定义类,然后利用定义的类创建对象。定义类示例:

  1. class Fruit:  
  2. def grow(self):  
  3. print “Fruit grow” 

2 当一个对象被创建后,包含了三方面的特性,即对象的句柄、属性和方法。创建对象的方法:

  1. fruit = Fruit()  
  2. fruit.grow() 

3 python没有保护类型的修饰符

4 类的方法也分为公有方法和私有方法。私有函数不能被该类之外的函数调用,私有的方法也不能被外部的类或函数调用。

5 python使用函数”staticmethod()“或”@ staticmethod“指令的方法把普通的函数转换为静态方法。静态方法相当于全局函数。

6 python的构造函数名为__init__,析构函数名为__del__

7 继承的使用方法:

  1. class Apple(Fruit):  
  2. def … 

【连接mysql】

1 用MySQLdb模块操作MySQL数据库非常方便。示例代码如下:

  1. import os, sys  
  2. import MySQLdb  
  3. try:  
  4. conn MySQLdb.connect(host=’localhost’,user=’root’,passwd=’’,db=’address’  
  5. except Exception,e:  
  6. print e  
  7. sys.exit()  
  8. cursor=conn.cursor()  
  9. sql=’insert into address(name, address) values(%s, %s)’  
  10. value=((“zhangsan”,”haidian”),(“lisi”,”haidian”))  
  11. try 
  12. cursor.executemany(sql,values)  
  13. except Exception, e:  
  14. print e  
  15. sql=”select * from address”  
  16. cursor.execute(sql)  
  17. data=cursor.fetchall()  
  18. if data  
  19. for x in data:  
  20. print x[0],x[1]  
  21. cursor.close()  
  22. conn.close() 

谢谢!

原文链接: http://roclinux.cn/?p=2338


 

posted @ 2012-07-10 09:35 David1228 阅读(290) | 评论 (0)编辑 收藏
一、问题描述
    根据CentOS-6.0-x86_64-bin-DVD1.iso制作虚拟机镜像后,使用该镜像创建的虚

拟机都是网卡eth1,虽然能设置上ip但是虚拟网关并不能设置成功。
    并且随着镜像->虚拟机->镜像->虚拟机类似流程迭代,网卡ethx会递增。总结一

句话:就是eth0不起作用。
    
二、解决问题如下:

    1、在grub里增加biosdevname=0的启动参数,形如

    kernel /vmlinuz-2.6.32-131.21.1.el6.i686 ro root=/dev/mapper/vg_test-

lv_root rd_LVM_LV=vg_test/lv_root rd_LVM_LV=vg_test/lv_swap rd_NO_LUKS rd_NO_MD 

rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latar
    cyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet 

biosdevname=0

    2、删除udev的配置文件rm -f /etc/udev/rules.d/70-persistent-net.rules。

(我的做法比较彪悍,直接把rules.d干掉了。)

    第3、4、5步是针对单个主机或者虚拟机而言的,我们保证镜像中的eth0网卡配置

文件存在,名字为ifcfg-eth0文件中DEVICE=eth0。
    
    3、把网卡配置文件改名

        mv ifcfg-em1 ifcfg-eth0

    4、把网卡配置文件内容修正,把em1的全部改成eth0

        perl -p -i -e ‘s/em1/eth0/g’ ifcfg-eth0 

    5、重启系统即可

    6、配置ssh
        6.1:/etc/ssh/sshd_config   配置文件中修改或加入UseDNS=no,将

#UseDNS=yes 改成:UseDNS=no
        6.2:/etc/ssh/sshd_config   配置文件中将#GSSAPIAuthentication 

no 的#号去掉,更改成GSSAPIAuthentication no
        6.3:/etc/ssh/sshd_config   配置文件中将PermitRootLogin no修改

为yes 
        6.4:   
        6.5:/etc/ssh/sshd_config   配置文件中将PasswordAuthentication 

no修改为yes就可以了
        6.6:/etc/nsswitch.conf     配置文件中,将hosts:files dns  改

成:hosts:files
        6.7:/etc/init.d/sshd restart         重启sshd进程使配置生效
        
        其中6.1、6.2、6.6都是处于性能方面考虑
    
    7、镜像中存在bcec提供的setIp、rc.local等脚本。
    
    经过在39.4环境测试,操作过程从原始镜像 -> 新虚拟机 -> 制作镜像镜像 -> 

新镜像虚拟机,网卡都没有问题,都是eth0。

 Centos6.0制作镜像网卡问题总结-zhgp 
posted @ 2012-06-15 11:07 David1228 阅读(970) | 评论 (0)编辑 收藏

禁用 SSH 远程主机的公钥检查

SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。

首先看看什么是 SSH 公钥检查

SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机:
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f. Are you sure you want to continue connecting (yes/no)? 
当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 如果因为某种原因(服务器系统重装,服务器间IP地址交换,DHCP,虚拟机重建,中间人劫持),该IP地址的公钥改变了,当使用 SSH 连接的时候,会报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Please contact your system administrator. Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message. Offending key in /home/jiangxin/.ssh/known_hosts:81 RSA host key for 192.168.0.110 has changed and you have requested strict checking. Host key verification failed. 
上面的警告信息说的是:
  • 服务器公钥已经改变,新的公钥的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
  • 该服务器原来的公钥记录在文件 ~/.ssh/known_hosts 中第 81 行。
如果确认不是中间人劫持,需要连接到该服务器,怎么办呢?最简单的就是用 vi 打开 ~/.ssh/known_hosts 文件,定位到 81 行,将该行删除。之后就可以使用 ssh 连接了。

如何让连接新主机时,不进行公钥确认?

在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。或者由于  ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:
Host *  StrictHostKeyChecking no 
或者在 ssh 命令行中用 -o 参数
$ ssh  -o StrictHostKeyChecking=no  192.168.0.110

如何防止远程主机公钥改变导致 SSH 连接失败

当确认中间人劫持攻击风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。 SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。那么将 known_hosts 指向不同的文件,不就不会造成公钥冲突导致的中断了么?
$ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110 The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Are you sure you want to continue connecting (yes/no)? 
看,提示信息由公钥改变中断警告,变成了首次连接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,则不再有任何警告出现了:
$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110 Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts. jiangxin@192.168.0.110's password: 
如果设置了无口令 SSH 登录(即通过客户端公钥认证),就可以直接连接到远程主机。这是基于 SSH 协议的自动化任务常用的手段。

转自: http://www.worldhello.net/2010/04/08/1026.html 
可参考资料:http://www.symantec.com/connect/articles/ssh-host-key-protection
posted @ 2012-06-15 09:30 David1228 阅读(405) | 评论 (0)编辑 收藏

在Set中有一个排序的集合SortedSet,用来保存按照自然顺序排列的对象。Queue中同样引入了一个支持排序的FIFO模型。

并发队列与Queue简介 中介绍了,PriorityQueue和PriorityBlockingQueue就是支持排序的Queue。显然一个支持阻塞的排序Queue要比一 个非线程安全的Queue实现起来要复杂的多,因此下面只介绍PriorityBlockingQueue,至于PriorityQueue只需要去掉 Blocking功能就基本相同了。

 转自: http://www.blogjava.net/xylz/archive/2010/07/30/327582.htm

排序的BlockingQueue — PriorityBlockingQueue

先简单介绍下PriorityQueue,因为PriorityBlockingQueue内部就是通过PriorityQueue适配实现的,只不过通过锁进行同步和阻塞而已。

PriorityQueue是一个数组实现的,是一个二叉树的实现,这个二叉树的任意一个节点都比其子节点要小,这样顶点就是最小的节点。每一个元 素或者节点要么本身是可比较的(Comparable),或者队列本身带有一个比较器(Comparator<? super E>),所有元素就是靠比较自身的大小来确定顺序的。而数组中顶点就是数组的第0个元素,因此出队列的话总是取第0个元素。对于第0个元素,其子节 点是第1个元素和第2个元素,对于第1个元素,其子元素又是第3/4个元素,以此类推,第i个元素的父节点就是(i-1)/2。这样任意一个元素加入队列 就从其父节点(i-1)/2开始比较,一旦新节点比父节点小就交换两个节点,然后继续比较新节点与其新的父节点。知道所有节点都是按照父节点一定比子节点 小的顺序排列。这是一个有点复杂的算法,此处不再讨论更多的细节。不管是删除还是查找,我们只需要了解的顶点(索引为0的元素)总是最小的。

特别需要说明的是PriorityQueue是一个无界的队列,也就是说一旦元素的个数达到了数组的大小,那么就将数组扩大50%,这样这个数组就是无穷大的。当然了如果达到了整数的最大值就会得到一个OutOfMemoryError,这个是由逻辑保证的。

 

对于PriorityBlockingQueue而言,由于是无界的,因此就只有非空的信号,也就是说只有take()才能阻塞,put是永远不会阻塞(除非达到Integer.MAX_VALUE直到抛出一个OutOfMemoryError异常)。

只有take()操作的时候才可能因为队列为空而挂起。同时其它需要操作队列变化和大小的只需要使用独占锁ReentrantLock就可以了,非常方便。需要说明的是PriorityBlockingQueue采用了一个公平的锁。

 

总的来说PriorityBlockingQueue 不是一个FIFO的队列,而是一个有序的队列,这个队列总是取“自然顺序”最小的对象,同时又是一个只能出队列阻塞的BlockingQueue,对于入队列却不是阻塞的。所有操作都是线程安全的。

 

直接交换的BlockingQueue — SynchronousQueue

 

这是一个很有意思的阻塞队列,其中每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。因此此队列内部其 实没有任何一个元素,或者说容量是0,严格说并不是一种容器。由于队列没有容量,因此不能调用peek操作,因为只有移除元素时才有元素。

一个没有容量的并发队列有什么用了?或者说存在的意义是什么?

SynchronousQueue 的实现非常复杂,当然了如果真要去分析还是能够得到一些经验的,但是前面分析了过多的结构后,发现越来越陷于数据结构与算法里面了。我的初衷是通过研究并 发实现的原理来更好的利用并发来最大限度的利用可用资源。所以在后面的章节中尽可能的少研究数据结构和算法,但是为了弄清楚里面的原理,必不可免的会涉及 到一些这方面的知识,希望后面能够适可而止。

再回到话题。SynchronousQueue 内部没有容量,但是由于一个插入操作总是对应一个移除操作,反过来同样需要满足。那么一个元素就不会再SynchronousQueue 里面长时间停留,一旦有了插入线程和移除线程,元素很快就从插入线程移交给移除线程。也就是说这更像是一种信道(管道),资源从一个方向快速传递到另一方 向。

需要特别说明的是,尽管元素在SynchronousQueue 内部不会“停留”,但是并不意味之SynchronousQueue 内部没有队列。实际上SynchronousQueue 维护者线程队列,也就是插入线程或者移除线程在不同时存在的时候就会有线程队列。既然有队列,同样就有公平性和非公平性特性,公平性保证正在等待的插入线 程或者移除线程以FIFO的顺序传递资源。

显然这是一种快速传递元素的方式,也就是说在这种情况下元素总是以最快的方式从插入着(生产者)传递给移除着(消费者),这在多任务队列中是最快处理任务的方式。在线程池的相关章节中还会更多的提到此特性。

 

事实上在《并发队列与Queue简介》 中介绍了还有一种BlockingQueue的实现DelayQueue,它描述的是一种延时队列。这个队列的特性是,队列中的元素都要延迟时间(超时时 间),只有一个元素达到了延时时间才能出队列,也就是说每次从队列中获取的元素总是最先到达延时的元素。这种队列的场景就是计划任务。比如以前要完成计划 任务,很有可能是使用Timer/TimerTask,这是一种循环检测的方式,也就是在循环里面遍历所有元素总是检测元素是否满足条件,一旦满足条件就 执行相关任务。显然这中方式浪费了很多的检测工作,因为大多数时间总是在进行无谓的检测。而DelayQueue 却能避免这种无谓的检测。在线程池的计划任务部分还有更加详细的讨论此队列实现。

 

下面就对常见的BlockingQueue进行小节下,这里不包括双向的队列,尽管ConcurrentLinkedQueue不是可阻塞的Queue,但是这里还是将其放在一起进行对比。

 

并发队列比较

如果不需要阻塞队列,优先选择ConcurrentLinkedQueue;如果需要阻塞队列,队列大小固定优先选择 ArrayBlockingQueue,队列大小不固定优先选择LinkedBlockingQueue;如果需要对队列进行排序,选择 PriorityBlockingQueue;如果需要一个快速交换的队列,选择SynchronousQueue;如果需要对队列中的元素进行延时操 作,则选择DelayQueue。

posted @ 2012-03-19 14:45 David1228 阅读(379) | 评论 (0)编辑 收藏

2012-01-08 18:14:40     我来说两句 
收藏
以前从来没有使用过ruby,这两天刚好要使用GitHub上的离线wiki系统gollum,所以要在偶的ubuntu下安装ruby和ruby-gems。其中遇到一些问题:
 
 
 
如果使用apt-get install ruby 和apt-get install rubygems1.8
 
当使用gem install 命令时报以下错误:
 
 
 
ERROR: While executing gem ... (TypeError) instance of Date needs to have method `marshal_load
 
 
 
可能是Ubuntu环境的原因,那么就改用rvm安装,参考了http://beginrescueend.com/rvm/install/
 
若以非root模式安装:
 
 
 
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
 
 
 
 
 添加rvm scripts路径变量到bash:
 
 
 
     echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile
 
  
 
 让新的bash生效:
 
 
 
     source ~/.bash_profile
 
 
 
安装ruby1.9.2:
 
    rvm install 1.9.2
 
 
 
让系统默认使用1.92:
 
    rvm use 1.9.2 --default
 
 
 
 
 
 
检查安装是否OK:
 
    ruby  -v
 
--------------------------------------------
 
接下来安装rubygems
 
先到官网下载安装包http://rubygems.org/pages/download
 
 
 
 
然后安装
 
ruby setup.rb
 
 
 
 
默认采用淘宝的Gem镜像站点
 
 
 
 
gem source http://ruby.taobao.org/
 
 
 
 
接下来就可以使用gem install xxx命令了,just enjoy it!
 
 
 
 
PS:如过使用gem install报错,可能是Ubuntu本身少一些依赖,比如我安装gollum时缺少依赖libxml2,libxslt,
 
缺少啥就install 啥:
 
 
 
apt-get install libxml2
 
apt-get install libxslt
 
转自:
http://www.2cto.com/os/201201/116337.html
posted @ 2012-03-14 10:08 David1228 阅读(963) | 评论 (0)编辑 收藏
 rpm --erase --allmatches --nodeps xmlrpc-c-devel-1.16.24-1206.1840.el5_7.4
posted @ 2012-02-14 17:31 David1228 阅读(421) | 评论 (0)编辑 收藏
仅列出标题
共16页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last 

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

新闻分类

新闻档案

相册

收藏夹

Java

Linux知识相关

Spring相关

云计算/Linux/虚拟化技术/

友情博客

多线程并发编程

开源技术

持久层技术相关

搜索

  •  

积分与排名

  • 积分 - 354559
  • 排名 - 155

最新评论

阅读排行榜

评论排行榜