只需要在/etc/apache2/sites-available下仿照default建立一个virtualhost文件即可,
最后不要忘了在sites-enabled下建立ln -s到sites-available
如果使用的是端口, 一定要修改/etc/apache2下的ports.conf打开对应端口监听
如果是域名解析, 则要在/etc/hosts 中增加对应说明
比如
127.0.0.1 jjnncc.de localhost
127.0.0.1 Keesburg
127.0.0.1 jane.jjnncc.de
127.0.0.1 gosynthetic.jjnncc.de
同时虚拟主机的设置中要增加一行ServerName jane.jjnncc.de, 比如
<VirtualHost *:80>
ServerAdmin liang@biozentrum.uni-wuerzburg.de
ServerName jane.jjnncc.de
DocumentRoot /home/binf027/public_html/jane/htdocs
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/binf027/public_html/jane/htdocs>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /home/binf027/public_html/jane/cgi-bin/
<Directory "/home/binf027/public_html/jane/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/home/binf027/public_html/jane/doc/"
<Directory "/home/binf027/public_html/jane/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
PBS 环境下运行
PBS 是公开源代码的作业管理系统,在此环境下运行,用户不需要指定程序在哪些节点上运行,程序
所需的硬件资源由PBS 管理和分配。
1、PBS 命令
PBS 提供4 条命令用于作业管理。
(1) qsub 命令—用于提交作业脚本
命令格式:
qsub [-a date_time] [-c interval] [-C directive_prefix]
[-e path] [-I] [-j join] [-k keep] [-l resource_list] [-m mail_options]
[-M user_list][-N name] [-o path] [-p priority] [-q destination] [-r c]
[-S path_list] [-u user_list][-v variable_list] [-V]
[-W additional_attributes] [-z]
[script]
参数说明:因为所采用的选项一般放在pbs 脚本中提交,所以具体见PBS 脚本选项。
例:# qsub aaa.pbs 提交某作业,系统将产生一个作业号
(2) qstat 命令—用于查询作业状态信息
命令格式:qatat [-f][-a][-i] [-n][-s] [-R] [-Q][-q][-B][-u]
参数说明:
-f jobid 列出指定作业的信息
-a 列出系统所有作业
-i 列出不在运行的作业
-n 列出分配给此作业的结点
-s 列出队列管理员与scheduler 所提供的建议
-R 列出磁盘预留信息
-Q 操作符是destination id,指明请求的是队列状态
-q 列出队列状态,并以alternative 形式显示
-au userid 列出指定用户的所有作业
-B 列出PBS Server 信息
-r 列出所有正在运行的作业
-Qf queue 列出指定队列的信息
-u 若操作符为作业号,则列出其状态。
若操作符为destination id,则列出运行在其上的属于user_list 中用户的作业状态。
例:# qstat -f 211 查询作业号为211 的作业的具体信息。
(3) qdel 命令—用于删除已提交的作业
命令格式:qdel [-W 间隔时间] 作业号
命令行参数:
例:# qdel -W 15 211 15 秒后删除作业号为211 的作业
(4) qmgr 命令—用于队列管理
qmgr -c "create queue batch queue_type=execution"
qmgr -c "set queue batch started=true"
qmgr -c "set queue batch enabled=true"
qmgr -c "set queue batch resources_default.nodes=1"
qmgr -c "set queue batch resources_default.walltime=3600"
qmgr -c "set server default_queue=batch"
2、PBS 脚本文件
PBS 脚本文件由脚本选项和运行脚本两部分组成。
(1) PBS 作业脚本选项 (若无-C 选项,则每项前面加‘#PBS’)
-a date_time : date_time 格式为:[[[[CC]YY]MM]DD]hhmm[.SS]
表示经过date_time 时间后作业才可以运行。
-c interval : 定义作业的检查点间隔,如果机器不支持检查点,则忽略此选项。
-C directive_prefix :在脚本文件中以directive_prefix 开头的行解释为qsub 的命
令选项。(若无此选项,则默认为’#PBS’ )
-e path :将标准错误信息重定向到path
-I :以交互方式运行
-j join :将标准输出信息与标准错误信息合并到一个文件join 中去。
-k keep :定义在执行结点上保留标准输出和标准错误信息中的哪个文件。
keep 为o 表示保留前者,e 表示后者,oe 或eo 表示二者都保留,
n 表示皆不保留。若忽略此选项,二者都不保留。
-l resource_list : 定义资源列表。以下为几个常用的资源种类。
cput=N : 请求N 秒的CPU 时间; N 也可以是hh:mm:ss 的形式。
mem=N[K|M|G][B|W]:请求N {kilo|mega|giga}{bytes|words} 大小的内存。
nodes=N:ppn=M :请求N 个结点,每个结点M 个处理器。
-m mail_options :mail_option 为a:作业abort 时给用户发信;为b:作业开始运行发信;为e:
作业结束运行时发信。若无此选项,默认为a。
-M user_list : 定义有关此作业的mail 发给哪些用户。
-N name : 作业名,限15 个字符,首字符为字母,无空格。
-o path : 重定向标准输出到path。
-p priority : 任务优先级,整数,[-1024,1023],若无定义则为0.
-q destination : destination 有三种形式: queue , @server,queue@server。
-r y|n : 指明作业是否可运行,y 为可运行,n 为不可运行。
-S shell : 指明执行运行脚本所用的shell,须包含全路径。
-u user_list : 定义作业将在运行结点上以哪个用户名来运行。
-v variable_list : 定义export 到本作业的环境变量的扩展列表。
-V : 表明qsub 命令的所有环境变量都export 到此作业。
-W additional_attributes : 作业的其它属性。
-z : 指明qsub 命令提交作业后,不在终端显示作业号。
(2) 运行脚本同LINUX 下一般的运行脚本文件。
[注]:脚本文件中的mpirun_rsh 命令行中的节点列表文件要用环境变量表示
$PBS_NODEFILE,这个环境变量表示由pbs 自动分配给作业的节点列表;
节点数为命令行中指定的进程数。
格式如下:
mpirun_rsh –np 进程数 –hostfile $PBS_NODEFILE 可执行程序名
3、PBS 环境下运行示例
(1)脚本文件编辑示例
实例1:运行mpi 程序
命令行:#vi aaa.pbs
编辑的内容:
#PBS -N myjob
#PBS -o /home/jz/my.out
#PBS -e /home/jz/my.err
#PBS –l nodes=2:ppn=2
cd 目录(你们原来直接在节点上运行时所在的目录)
mpirun_rsh –np 4 –hostfile $PBS_NODEFILE /home/jz/helloworld
解释:原先大家都是在中断输入 mpirun_rsh…..这些命令执行程序的,现在只要把这些提交命令放
在.pbs 配置文件的最后,由PBS 来调度执行(自动分配节点和其它资源)。
Myjob 是为你此次要运行的程序起的任务名,可以改成你自己想要的名字
原先输出信息都是直接在屏幕上显示的,现在屏幕上的显示全部输出到文件中,上例中输出文
件是/home/jz/my.out 文件,大家可以根据自己的需要修改(目录,文件名)。程序运行时遇到的一些错误会
记录在.err 文件中。好处:因为对每个任务都设定了不同的输出文件,所以看结果只要打开相应文件看就可
以了,不需要开多个终端,而且里面有任务的详细信息,比如实际分配的是哪些节点计算,运行时间等。
#PBS –l nodes=2:ppn=2,你们程序需要几个节点只要修改nodes 后的数字就可以了,ppn=2 保持
不变,因为我们的机器每个节点都是双cpu 的。
mpirun_rsh –np 4 –hostfile $PBS_NODEFILE /home/jz/helloworld
此例中-np 后的4 是并行数(2 × 2 = 4 个cpu ), –hostfile $PBS_NODEFILE 不需要改变。
/home/jz/helloworld 是你编译好的可执行文件名,需修改。
对于每个你要运行的mpi 程序都需要这样一个.pbs 配置文件
也就是说大家原来的操作是:mpirun…………
现在改成2 步走:1)写个pbs 配置文件(比如xxx.pbs);2)向pbs 提交(qsub xxx.pbs)
实例2:运行非mpi 程序
有些用户并不是自己编写mpi 程序,同样也可以用pbs 提交。
比如物理系运行程序时一般输入的命令是 RunDMol3.sh TiFeCp2-pbe-dspp-m=1-opt ,那么配置文件可以
这样写:
命令行:#vi job.pbs
编辑的内容:
#PBS -N physics_job
#PBS -o /home/physics/physics_job.out
#PBS -e /home/physics/physics_job.err
#PBS -l nodes=1:ppn=2
#PBS -r y
cd 目录(你们原来直接在节点上运行时所在的目录)
RunDMol3.sh TiFeCp2-pbe-dspp-m=1-opt
解释:也就是说把原来在终端直接输入的命令RunDMol3.sh TiFeCp2-pbe-dspp-m=1-opt 放到pbs 配置
文件中,因为你们只要一个节点,所以nodes=1,至于用哪个节点系统自动分配,你们肯定很关心是分配
了哪个节点给你们,那么可以用qstat 命令查询(比如qstat -n)。
(2) 提交作业示例
命令行:#qsub aaa.pbs
显示结果:
(3) 作业状态查询示例
Qstat 后加不同参数可以查看不同的信息(各参数的意思,上面有详细的说明,你们可以一个个试验一
下,以后就知道查看哪些信息,需要哪些参数)
实例:
命令行:#qstat –a (查看作业的状态)
显示结果:
解释:Job id 211 是给你提交的任务分配的任务号,S(任务状态,R 表示正在运行,Q 表示正在排
队等候调度)
8
命令行:#qstat –n (查看作业使用的节点)
显示结果:
解释:blade32 就是分给你这个任务的节点
命令行:#qstat –f 211 (查看有关作业运行具体信息)
显示结果:
解释:exec_host 显示的是实际执行该任务的节点
一、MPI 编程
1、MPI 编程函数介绍
MPI 实际上是一个提供并行程序消息传递机制的函数库,有40 多个函数,常用的有6 个基本函数。下
面以C 语言为例简单介绍这些函数。
(1)MPI_Init 函数
定义:int MPI_Init(int *argc, char ***argv)
功能:用命令行参数初始化MPI 环境
输入:argc、argv—表示命令行参数,同C 语言的main()函数参数格式,argv 中包含欲并行运行的进程
数
输出:返回值—非零/零表示初始化是否成功
说明:该函数必须为程序中第一个调用的MPI 函数
示例:MPI_Init(&argc, &argv); // argc、argv 引用的是mian()函数的参数
(2)MPI_Finalize 函数
定义:int MPI_Finalize (void)
功能:结束MPI 程序的运行,指结束MPI 环境的使用
输入:无
输出:返回值—非零/零表示结束MPI 环境是否成功
说明:该函数必须为程序中最后一个调用的MPI 函数
示例:MPI_ Finalize ();
(3)MPI_Comm_size 函数
定义:int MPI_Comm_size(MPI_Comm comm, int *size)
功能:得到总进程数
输入:comm 通信域句柄(系统默认的为MPI_COMM_WORLD,也可自己定义)
输出:size,即通信域comm 内包括的进程数整数
(4)MPI_Comm_rank 函数
定义:int MPI_Comm_rank(MPI_Comm comm, int *rank)
功能:得到本进程的进程号
输入:comm,该进程所在的通信域句柄
输出:rank,调用进程在comm 中的标识号
(5)MPI_Send 函数
定义:int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
功能:发送消息给特定的进程
输入:buf 发送缓冲区的起始地址(可选类型)
count 将发送的数据的个数(非负整数)
datatype 发送数据的数据类型(句柄)
dest 目的进程标识号(整型)
tag 消息标志(整型)
comm 通信域(句柄)
输出:无
(6)MPI_Recv 函数
定义:int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag,MPI_Comm comm,
MPI_Status *status)
功能:接受别的进程发过来的消息
输入:count 最多可接收的数据的个数(整型)
datatype 接收数据的数据类型(句柄)
source 接收数据的来源即发送数据的进程的进程标识号(整型)
tag 消息标识与相应的发送操作的表示相匹配相同(整型)
comm 本进程和发送进程所在的通信域(句柄)
输出:buf 接收缓冲区的起始地址(可选数据类型)
status 返回状态 (状态类型MPI_Status)
2、MPI 程序示例
MPI 程序中必须包含MPI 库的头文件,C 语言头文件名为mpi.h,FORTRAN 语言头文件名为mpif.h。
/* helloworld.c 程序清单*/
#include “mpi.h”
main(int argc, char **argv)
{
int numprocs,myrank,i,j,k;
MPI_Status status;
char msg[20];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs); //
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
if(myrank == 0)
{
strcpy(msg,”Hello World”);
MPI_Send(msg,strlen(msg)+1, MPI_CHAR,1,99, MPI_COMM_WORLD);
}
else if(myrank ==1)
{
MPI_Recv(msg,20,MPI_CHAR,0,99,MPI_COMM_WORLD,&status);
printf(“Receive message = %s\n”,msg);
}
MPI_Finalize();
}
二、MPICH 下编译和运行
1、编译
MPICH 环境下,程序的编译采用命令行方式,即在Linux 命令行下用mpicc 命令进行编译。
编译命令格式:mpicc –o 可执行文件名 源程序文件名
命令参数说明:(1) 源程序文件经过mpicc 编译连接以后得到可执行文件;
(2) 此处的mpicc 命令就是/usr/local/topspin/mpi/mpich/bin/mpicc , 下文中的
mpirun_rsh 也是在此目录下。
程序编译示例:mpicc –o helloworld helloworld.c
2、运行
MPICH 环境下,程序的运行亦采用命令行方式,即在Linux 命令行下用mpirun_rsh 命令运行程序。
运行命令格式:mpirun_rsh –np 进程数 –hostfile 节点列表文件 ./可执行文件名
命令参数说明:节点列表文件(如:hosts)为手工建立的一个文本文档,内容为:
iblade01
iblade02
iblade03
iblade04
…
有多少个进程就需要写多少行,因节点为双CPU,故节点名可重复一次。(下例只需这
四行即可)
程序运行示例:mpirun_rsh –np 4 –hostfile hosts ./helloworld
运行结果:
Hello World!Process 0 of 4 on blade01.cluster.seu.edu.cn
Hello World!Process 1 of 4 on blade02.cluster.seu.edu.cn
Hello World!Process 2 of 4 on blade03.cluster.seu.edu.cn
Hello World!Process 3 of 4 on blade04.cluster.seu.edu.cn
强烈建议:不采用该方式,而采用PBS 环境下运行方式,因为所列节点可能有故障。
1. 当 column 为 serial 时(auto_increment :mysql),
<id name="id">
<generator class="native" />
</id>
出错出现缺少hibernate_sequence,
需要psql下 : create sequence hibernate_sequence;
原因:
Hibernate sequence generator for postgresql takes a parameter that is the sequence name:
<generator class="sequence">
<param name="sequence">sequence_name</param>
</generator>
2. hibernate.hbm.xml建在eclipse workspace/project/src目录下, 其中可以加入mapping文件的链接。
Hibernate加载其数据库配置
Hibernate加载其配置文件hibernate.properties和hibernate.cfg.xml,常用xml文件比较直观,方便管理, Hibernate 是一个流行的开源对象关系映射工具,方便连接不同数据库,更换数据库,只要修改Hibernate配置文件,大度减少项目的维护。
完整的配置如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://localhost/test</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping resource="../*.hbm.xml"/>
</session-factory>
</hibernate-configuration>
常用数据库连接
MySql 3/4/5:
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
Microsoft SQLServer (via jTDS):
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="connection.url">jdbc:jtds:sqlserver://localhost:1433/test;useCursors=true</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
IBM DB2:
<property name="dialect">org.hibernate.dialect.DB2Dialect</property>
<property name="connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
<property name="connection.url">jdbc:db2://localhost:50000/test</property>
<property name="connection.username">db2inst1</property>
<property name="connection.password"></property>
Oracle:
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:test</property>
<property name="connection.username">ora</property>
<property name="connection.password"></property>
Informix:
<property name="dialect">org.hibernate.dialect.InformixDialect</property>
<property name="connection.driver_class">com.informix.jdbc.IfxDriver</property>
<property name="connection.url">jdbc:informix-sqli://localhost:1526/test:informixserver=server1</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.encoding">true</property>
Sybase (via jTDS):
<property name="dialect">org.hibernate.dialect.SybaseDialect</property>
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="connection.url">jdbc:jtds:sybase://localhost:7100/test;useCursors=true</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
PostgreSQL:
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://localhost:5432/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
MaxDB(SAPDB):
<property name="dialect">org.hibernate.dialect.SAPDBDialect</property>
<property name="connection.driver_class">com.sap.dbtech.jdbc.DriverSapDB</property>
<property name="connection.url">jdbc:sapdb://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
Microsoft SQL Server series (6.5, 7.x and 2000) and Sybase 10
JDBC Name: jTDS
URL: http://jtds.sourceforge.net/
Version: 0.5.1
Download URL: http://sourceforge.net/project/showfiles.php?group_id=33291
语法:
Class.forName("net.sourceforge.jtds.jdbc.Driver ");
Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password");
or
Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password");
MySQL
JDBC Name: Connector/J 3.0
URL: http://www.mysql.com/
Version: 3.0.8-stable
Download URL: http://www.mysql.com/downloads/api-jdbc-stable.html
语法:
Download URL: http://www.mysql.com/downloads/api-jdbc-stable.html
语法:
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");
Oracle
JDBC Name: Connector/J 3.0
URL: http://otn.oracle.com/
Version: 3.0.8-stable
Download URL: http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html
语法:
Download URL: http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html
语法:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:port:databse","user","password");
Sybase
Driver: jConnect 4.5/5.5 (JDBC 2.0 请使用5.5)
语法:
Class.forName("com.sybase.jdbc2.jdbc.SybDriver").newInstance();
DriverManager.getConnection("jdbc:sybase:Tds:IP地址:2638?ServiceName="+数据库名称,"账号","密码");
Postgresql
JDBC Name: PostgreSQL JDBC
URL: http://jdbc.postgresql.org/
Version: 7.3.3 build 110
Download URL: http://jdbc.postgresql.org/download.html
语法:
Download URL: http://jdbc.postgresql.org/download.html
语法:
Class.forName("org.postgresql.Driver");
Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password");
IBM AS400主机在用的JDBC语法
有装V4R4以上版本的Client Access Express
可以在C:Program FilesIBMClient Accessjt400lib
找到 driver 档案 jt400.zip,并更改扩展名成为 jt400.jar
语法语法:
Class.forName("net.sourceforge.jtds.jdbc.Driver ");
Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password");
or
Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password");
MySQL
JDBC Name: Connector/J 3.0
URL: http://www.mysql.com/
Version: 3.0.8-stable
Download URL: http://www.mysql.com/downloads/api-jdbc-stable.html
语法:
Download URL: http://www.mysql.com/downloads/api-jdbc-stable.html
语法:
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");
Oracle
JDBC Name: Connector/J 3.0
URL: http://otn.oracle.com/
Version: 3.0.8-stable
Download URL: http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html
语法:
Download URL: http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html
语法:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:port:databse","user","password");
Sybase
Driver: jConnect 4.5/5.5 (JDBC 2.0 请使用5.5)
语法:
Class.forName("com.sybase.jdbc2.jdbc.SybDriver").newInstance();
DriverManager.getConnection("jdbc:sybase:Tds:IP地址:2638?ServiceName="+数据库名称,"账号","密码");
Postgresql
JDBC Name: PostgreSQL JDBC
URL: http://jdbc.postgresql.org/
Version: 7.3.3 build 110
Download URL: http://jdbc.postgresql.org/download.html
语法:
Download URL: http://jdbc.postgresql.org/download.html
语法:
Class.forName("org.postgresql.Driver");
Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password");
IBM AS400主机在用的JDBC语法
有装V4R4以上版本的Client Access Express
可以在C:Program FilesIBMClient Accessjt400lib
找到 driver 档案 jt400.zip,并更改扩展名成为 jt400.jar
语法
java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver ());
Class.forName("com.ibm.as400.access.AS400JDBCConnection");
con = DriverManager.getConnection("jdbc:as400://IP","user","passwor");
1.Oracle8/8i/9i数据库(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2.DB2数据库
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
3.Sql Server7.0/2000数据库
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
4.Sybase数据库
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5.Informix数据库
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库名
Connection conn= DriverManager.getConnection(url);
6.MySQL数据库
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库名
Connection conn= DriverManager.getConnection(url);
7.PostgreSQL数据库
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
8.access数据库直连用ODBC的
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;
local all postgres ident sameuser
local biosql biosql trust
local all all trust
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all ident sameuser
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
phpPgAdmin is a web based GUI for administrating a PostgreSQL database server.
Here’s some quick notes on getting it installed easily on Ubuntu 7.10…
In the terminal enter the following:
$ sudo apt-get install phppgadmin
This will set up and install all of the phpPgAdmin packages. It will also set-up and configure Apache and php5 for you too if you haven’t installed these already.
Next we need to create a symlink to phpPgAdmin so that Apache can find it:
$ sudo ln -s /etc/phppgadmin/apache.conf /etc/apache2/conf.d/phppgadmin.conf
Now if you navigate to http://localhost/phppgadmin you should be greeted with the phpPgAdmin screen. If your user account has a PostgreSQL account however, you will be logged in automagically.
Optionally, if you would like to be able to use the phpPgAdmin interface as the default ‘postgres’ administration account,1 you will need to do the following2…
$ sudo gedit /usr/share/phppgadmin/conf/config.inc.php
Now find and change the following line
$conf['extra_login_security'] = true;
to
$conf['extra_login_security'] = false;
Save and close gedit. Now all you need to do is restart Apache.
$ sudo /etc/init.d/apache2 reload
Now if you head on over to http://localhost/phppgadmin all should be ready for you
第一,谈谈final, finally, finalize的区别。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以
implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
第四,&和&&的区别。
第五,HashMap和Hashtable的区别。
第六,Collection 和 Collections的区别。
第七,什么时候用assert。
第八,GC是什么? 为什么要有GC?
第九,String s = new String("xyz");创建了几个String Object?
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
第十二,sleep() 和 wait() 有什么区别?
第十三,Java有没有goto?
第十四,数组有没有length()这个方法? String有没有length()这个方法?
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还
是equals()? 它们有何区别?
第十七,给我一个你最常见到的runtime exception。
第十八,error和exception有什么区别?
第十九,List, Set, Map是否继承自Collection接口?
第二十,abstract class和interface有什么区别?
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时
是synchronized?
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否
可继承实体类(concrete class)?
第二十三,启动一个线程是用run()还是start()?
第二十四,构造器Constructor是否可被override?
第二十五,是否可以继承String类?
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进
入此对象的其它方法?
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code
会不会被执行,什么时候被执行,在return前还是后?
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回
变化后的结果,那么这里到底是值传递还是引用传递?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,编程题: 写一个Singleton出来。
变态级JAVA程序员面试32答
发表于: 2007-7-17 上午10:16 回复
第一,谈谈final, finally, finalize的区别。
final —修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?匿名的内部类是没有名字的内部类。不能 extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
第五,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
第六,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
第七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
第八,GC是什么? 为什么要有GC? (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
第十三,Java有没有goto?
Goto—java中的保留字,现在没有在java中使用。
第十四,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
第十七,给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
第十八,error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
第十九,List, Set, Map是否继承自Collection接口?
List,Set是
Map不是
第二十,abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
第二十三,启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
第二十四,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
第二十五,是否可以继承String类?
String类是final类故不可以继承。
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
有C背景的程序员特别喜欢问这种问题。
2 << 3
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
第三十三 Hashtable和HashMap
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
创建一个~/.inputrc文件,加入如下内容:
set convert-meta off
set meta-flag on
set output-meta on
1 安装jas 10.4.8
2 升级到10.4.11 方法见另一篇文章
3 安装补丁, 注意千万不要安装speedstep, 这个需要sse3, 否则系统崩溃!
可安装
qt75, perian, qtcodecs, , powermanagement补丁, cpupowermanagement.kext remover (使风扇降速), insommia(防止休眠死机).
java, 还有其他的一些必备软件, Dictionary和QuartzSimple
如果出现about this mac崩溃, 补上2个补丁 1 loginwindow 2 system profiler patch.
如果要用photoshop cs2, 需先安装cs2patch.
用ati显卡开qe/ci的朋友,让你的鼠标拒绝拉屎吧~~~
用ati显卡的本友,开启了qe/ci,虽然很爽,但是随之而来的问题是,鼠标有了拉屎的现象,满屏幕时不时的就会有块残留的痕迹。。。实在影响观瞻。。。尤其是在看满网页都是e文的帖子的时候,更是大煞风景,不仅不美观,还影响阅读 。。
以前就听说mousepose这个软件可以轻松解决这个问题。。。但是,我安装了这个软件一运行,就出现unexpect error,quit。。。汗。。。又试了好几遍,还以为是我的rpwt呢,最后问了好几个朋友,都说不能用,呵呵,只好继续忍着。。
最近一个无意间看到个帖子,介绍mouselocator这个小软件,才231k,使用起来特别方便,功能和mousepose一样,呵呵,兴奋之余赶紧下下来,用了下,终于,鼠标拉屎现象在我面前消失了,哈哈
不敢独想,赶紧写出方法,供大家参考~~~
1。下载下面的mouse locator软件
MouseLocator.dmg.zip (314.55 KB)
2. 下载下面的鼠标指针方案(其实就是两个png图片,呵呵)
MouseLocator_images.zip (11.2 KB)
3. 将第2步的文件解压缩,你就可以看到下面的两个png图片

第一个名字叫做MouseLocator-Blank.png的图片,如果使用它作为鼠标的指针的配置形式的话,会得到想mousepose的样式(其实mousepose的样式我没见过)应该是像下面的图的样子,鼠标周围有个醒目的标示
第二个名字叫MouseLocator-ShadowMouse.png的图片,如果使用它作为鼠标的指针的配置形式的话,会得到原来的鼠标的样子,只是阴影加大了一点,不仔细看还真看不出来,个人觉得这样的鼠标好看些 呵呵,推荐使用这个
4.将上面两个图片中的你所喜欢的一个改名为MouseLocator.png,然后把这个图片复制到图片文件夹(在你的finder的左边栏最下面就是图片文件夹)
5.打开mouselocator.dmg,挂载镜像,双击里边的mouse locator v1.1 installer
6.打开系统预设,就可以看到mouselocator的图标,点开属性,在active mouse locator和 always on前面打上对号,就ok了
至次,你可以对鼠标拉屎说bye bye了 哈哈
1. 删除文件 % _3 R. [/ A& b, d% P6 t
~/Library/Preferences/Microsoft/Office 2008/Microsoft Office 2008 Settings.plist
! p! h3 |9 U$ M- ]# l/Applications/Microsoft Office 2008/Office/OfficePID.plist, o8 S; C. }1 q) v
# @) N. ~3 Z( t$ c& ~/ v. I( e
2. 启动任何一个Office程序,word,excel都可以
5 O& O3 M& v! d" X/ `
3 \) G7 Y2 w+ s6 [1 X3. 会被提示输入名字和注册码(自己在KCN里找)
KCNcrew Pack 07-01-08
http://rapidshare.com/files/126305890/KCNcrew_Pack_07-01-08.zip
$ _' C7 P, Q+ ~5 z9 e: t
7 q z9 [% z4 [, i) Y9 o4. 输入后完成
8 S1 q" y+ U, L3 d* H. n0 N: Y9 P; `" P9 o
另外看到一则给Office启动提速的trick z. B+ X6 r$ p& t$ ]( b6 b l5 c, X
进入preference,在general 里取消WYSIWYG font and style menus那个打钩选项,(帮助你所见即所得的选择字体以及样式!让你有直观的感受该字体或样式是什么样子的!special thanks to zlex!).
方法如下:
准备材料:
1、Windows XP SP2或Vista安装光盘(Windows 2003等其实也可以用,只是之后安装驱动需要手工)
2、空白光盘1张(或者刻好Mac driver for windows的光盘)
3、BootCamp软件(2007年3月底是BootCamp1.2.dmg)
4、Mac OS X的DVD光盘(不是必需的,防止如果安装过程失败,用于恢复苹果Mac系统)
安装过程:
1、在Mac系统下安装双系统:Mac OS X+Windows XP(包括安装好驱动)。参见在Macbook上快速安装Windows XP SP2;
注意:如果你要给Windows分配两个分区C和D,比如C盘20G,则此处给Windows分区留的大小就是20G,是不包含D盘的大小的,D盘我们随后是从Mac分区的尾部再划分出来的。
2、修改Windows启动盘的boot.ini文件。
windows 盘的boot.ini里记录了windows目录所在位置(该文件属性为隐藏的系统文件,因此缺省下是看不到的),正常 bootcamp分区之后,windows目录在multi(0)disk(0)rdisk(0)partition(3)\WINDOWS。如果我们随 后要做第二个Windows分区,则需要编辑该文件,将此处的partition(3)改为partition(4)——这个3改4在boot.ini中 有两处。改好之后,在没分第二个windows分区之前,该windows盘已经无法正常启动了;等第二个windows分区划分好之后,这里的 partition(4)正好可以启动了。
修改boot.ini的方法为:
2.1 进入DOS:点击开始,所有程序->附件->命令提示符;
2.2 到根目录:cd \
2.3 修改boot.ini的属性:attrib -h -s boot.ini
2.4 编辑boot.ini:edit boot.ini,在编辑器中,将该文件的两处partition(3)改为partition(4),保存并退出
2.5 恢复boot.ini的属性:attrib +h +s boot.ini
2.6 重启机器,进入Mac系统(此时windows系统已无法进入)
3、创建第二个windows分区
这里利用了Mac OS X里面的diskutil工具,命令行格式的,再次提醒一旦依照本文分出第二个windows分区之后,bootcamp软件就不能使用了。
3.1 进入Mac OS X
3.2 运行终端程序:菜单条,转到->实用程序->终端
3.3 察看现有分区情况:在终端程序的命令行输入diskutil list并回车
这时你一般会看到disk0(这是机器内置硬盘啦)和以下几个分区,disk0s1(EFI,200.0MB,Mac OS X的引导部分),disk0s2(Apple_HFS,这是Mac的分区),disk0s3(Microsoft Basic,这是第一步装双系统分出来的windows分区,在整个硬盘的最尾部,也就是windows的C盘)。
diskutil --help或者man diskutil都可以看到关于diskutil的帮助
3.4 在Mac分区(disk0s2)的尾部划分出第二个windows分区
假设disk0s2的容量size为60G(实际为3.3察看到的disk0s2的大小),您需要从中再划分出一个20G的windows分区来(也就是Mac留下40G),那么您需要输入命令行
sudo diskutil resizeVolume disk0s2 40G "MS-DOS FAT32" windisk 20G
以上命令行windisk可以随便写,40G+20G等于3.3步骤看到的disk0s2的容量,即使今后你要将windows第二分区格式化成 NTFS,此处也应该写"MS-DOS FAT32"。此步要求你输入超级用户密码(如果你一开始设有密码)。如果此步正确,会提示verifying... (之后会提示需要重启机器),这里不应该提示有错误信息。
3.5 再次察看分区,以确认已经分好第二个windows分区:diskutil list
这时应该比3.3步多看到disk0s4,disk0s4为原来的disk0s3,新的disk0s2和disk0s3分别为3.4中设定的两个值
4、格式化第二个windows分区
重启计算机,进入windows,这时就会看到两个windows分区了(可能一个是C盘,一个是E盘,D盘盘符被光驱所用,你可以通过调整磁盘符号来修 改它),点击第二个windows分区,选择格式化。如果这个分区很大,格式化有可能失败,那么解决办法可以用一种叫做ERD Commander Boot CD的光盘启动,然后格式化那个顽固的分区;当然,也可以用windows安装光盘试图往这个新分区安装系统,让它完成格式化后中断安装。
再备注:
1、由于划分两个windows分区之后,全新安装windows可能会无法安装,因此,需要将做好的windows启动盘备份起来,做法之一可以用前面 提及的ERD Commander Boot CD启动,然后用其系统备份System Restore中的ghost工具将windows启动盘(C盘)备份到D盘中,以备以后恢复;当然也可以用DOS启动光盘+DOS的ghost来备份, 但是DOS下有可能不识别macbook/pro的键盘,需要外接一个usb键盘。
2、完全可以划分出第三个、第四个windows分区,只需要注意2.4中修改partition(3)指向windows所在的分区,比如三个windows分区,则这里的3需要改为5,以此类推;另外就是3.4步骤中,需要相应多划分几个分区。
3、如果过程中出错导致Mac OS X无法启动,则在启动时按住Option键,出现磁盘界面后,把Mac OS X的光盘放入驱动器,并点击光盘启动,重新安装Mac OS X,在安装Mac OS X中,在第二还是第三个界面时,左下角有个选项按钮要点开,然后选择全新安装。
1 First thing to do is download the driver and put it onto your Desktop, them do the following steps (all inside the Terminal)
We need to set the password for the 'Superuser' aka. 'Administrator' on windows. The accout is called 'root' in the world of unix. If you have done this previously, you can skip this step.
2 sudo passwd root
or sudo /bin/bash
3 su -m
This will change your user-id in order to become the super-user. You'll have to type in the password you just set in order to gain the previliges. If it was successfull the username from the end of the commandline will change from your username to root.
Once you've become root we can start to install the drivers. Type the following:
4
rm -rf /System/Library/Extensions/ATI*
rm -rf /System/Library/Frameworks/OpenGL.framework
rm /System/Libary/Extensions.*
mv Desktop/10.4.8-ATI9600Mobility.tar.gz /
cd /
tar xvfz 10.4.8-ATI9600Mobility.tar.gz
Alternatively, you might want to move (mv) the files above in order to save them in a backup folder of your choice, instead of deleting (rm) them.
Once you have done this, restart your Notebook. When it comes back you should have full QE/CI support and you're now able to change your resolution in the 'System Preferences' -> 'Displays' applet.
5 refresh
chown -R root:wheel /System/Library/Extensions
chmod -R 755 /System/Library/Extensions
kextcache -k /System/Library/Extensions
网址:http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html
算法:Viterbi algorithm 和 Forward-Backward Algorithm。
小实验程序:http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/s3_pg3.html
隐马尔科夫模型HMM自学 (1)
介绍
崔晓源 翻译
我们通常都习惯寻找一个事物在一段时间里的变化规律。在很多领域我们都希望找到这个规律,比如计算机中的指令顺序,句子中的词顺序和语音中的词顺序等等。一个最适用的例子就是天气的预测。
首先,本文会介绍声称概率模式的系统,用来预测天气的变化
然后,我们会分析这样一个系统,我们希望预测的状态是隐藏在表象之后的,并不是我们观察到的现象。比如,我们会根据观察到的植物海藻的表象来预测天气的状态变化。
最后,我们会利用已经建立的模型解决一些实际的问题,比如根据一些列海藻的观察记录,分析出这几天的天气状态。
Generating Patterns
有两种生成模式:确定性的和非确定性的。
确定性的生成模式:就好比日常生活中的红绿灯,我们知道每个灯的变化规律是固定的。我们可以轻松的根据当前的灯的状态,判断出下一状态。

非确定性的生成模式:比如说天气晴、多云、和雨。与红绿灯不同,我们不能确 定下一时刻的天气状态,但是我们希望能够生成一个模式来得出天气的变化规律。我们可以简单的假设当前的天气只与以前的天气情况有关,这被称为马尔科夫假 设。虽然这是一个大概的估计,会丢失一些信息。但是这个方法非常适于分析。
马尔科夫过程就是当前的状态只与前n个状态有关。这被称作n阶马尔科夫模型。最简单的模型就当n=1时的一阶模型。就当前的状态只与前一状态有关。(这里要注意它和确定性生成模式的区别,这里我们得到的是一个概率模型)。下图是所有可能的天气转变情况:

对于有M个状态的一阶马尔科夫模型,共有M*M个状态转移。每一个状态转移都有其一定的概率,我们叫做转移概率,所有的转移概率可以用一个矩阵表示。在整个建模的过程中,我们假设这个转移矩阵是不变的。

该矩阵的意义是:如果昨天是晴,那么今天是晴的概率为0.5,多云的概率是0.25,雨的概率是0.25。注意每一行和每一列的概率之和为1。
另外,在一个系统开始的时候,我们需要知道一个初始概率,称为
向量。

到现在,我们定义了一个一阶马尔科夫模型,包括如下概念:
状态:晴、多云、雨
状态转移概率
初始概率
隐马尔科夫模型HMM自学 (2)
马尔科夫模型也需要改进!
崔晓源 翻译
当一个隐士不能通过直接观察天气状态来预测天气时,但他有一些水藻。民间的传说告诉我们水藻的状态与天气有一定的概率关系。也就是说,水藻 的状态与天气时紧密相关的。此时,我们就有两组状态:观察状态(水藻的状态)和隐含状态(天气状态)。因此,我们希望得到一个算法可以为隐士通过水藻和马 尔科夫过程,在没有直接观察天气的情况下得到天气的变化情况。
更容易理解的一个应用就是语音识别,我们的问题定义就是如何通过给出的语音信号预测出原来的文字信息。在这里,语音信号就是观察状态,识别出的文字就是隐含状态。
这里需要注意的是,在任何一种应用中,观察状态的个数与隐含状态的个数有可能不一样的。下面我们就用隐马尔科夫模型HMM来解决这类问题。
HMM
下图是天气例子中两类状态的转移图,我们假设隐状态是由一阶马尔科夫过程描述,因此他们相互连接。


隐马尔科夫模型HMM自学 (3)
HMM 定义
崔晓源 翻译
HMM是一个三元组 (
,A,B).
the vector of the initial state probabilities;
the state transition matrix; ![]()
the confusion matrix; ![]()
这其中,所有的状态转移概率和混淆概率在整个系统中都是一成不变的。这也是HMM中最不切实际的假设。
HMM的应用
有三个主要的应用:前两个是模式识别后一个作为参数估计
(1) 评估
根据已知的HMM找出一个观察序列的概率。
这类问题是假设我们有一系列的HMM模型,来描述不同的系统(比如夏天的天气变化规律和冬天的天气变化规律), 我们想知道哪个系统生成观察状态序列的概率最大。反过来说,把不同季节的天气系统应用到一个给定的观察状态序列上,得到概率最大的哪个系统所对应的季节就 是最有可能出现的季节。(也就是根据观察状态序列,如何判断季节)。在语音识别中也有同样的应用。
我们会用forward algorithm 算法来得到观察状态序列对应于一个HMM的概率。
(2) 解码
根据观察序列找到最有可能出现的隐状态序列
回想水藻和天气的例子,一个盲人隐士只能通过感受水藻的状态来判断天气状况,这就显得尤为重要。我们使用viterbi algorithm来解决这类问题。
viterbi算法也被广泛的应用在自然语言处理领域。比如词性标注。字面上的文字信息就是观察状态,而词性就是隐状态。通过HMM我们就可以找到一句话上下文中最有可能出现的句法结构。
(3) 学习
从观察序列中得出HMM
这是最难的HMM应用。也就是根据观察序列和其代表的隐状态,生成一个三元组HMM (
,A,B)。使这个三元组能够最好的描述我们所见的一个现象规律。
我们用forward-backward algorithm来解决在现实中经常出现的问题--转移矩阵和混淆矩阵不能直接得到的情况。
总结 HMM可以解决的三类问题
- Matching the most likely system to a sequence of observations -evaluation, solved using the forward algorithm;
- determining the hidden sequence most likely to have generated a sequence of observations - decoding, solved using the Viterbi algorithm;
- determining the model parameters most likely to have generated a sequence of observations - learning, solved using the forward-backward algorithm.
隐马尔科夫模型HMM自学 (4-1)Forward Algorithm
找到观察序列的概率
崔晓源 翻译
Finding the probability of an observed sequence
1、穷举搜索方法
对于水藻和天气的关系,我们可以用穷举搜索方法的到下面的状态转移图(trellis):

Pr(dry,damp,soggy | HMM) = Pr(dry,damp,soggy | sunny,sunny,sunny) + Pr(dry,damp,soggy | sunny,sunny ,cloudy) + Pr(dry,damp,soggy | sunny,sunny ,rainy) + . . . . Pr(dry,damp,soggy | rainy,rainy ,rainy)



隐马尔科夫模型HMM自学 (4-2)Forward Algorithm
崔晓源 翻译
书接上文,前一话我们讲到了Forward Algorithm中初始状态的部分概率的计算方法。这次我们继续介绍。
2c.如何计算t>1时刻的部分概率
回忆一下我们如何计算部分概率:
t ( j )= Pr( observation | hidden state is j ) * Pr(all paths to state j at time t)
我们可知(通过递归)乘积中第一项是可用的。那么如何得到Pr(all paths to state j at time t) 呢?
为了计算到达一个状态的所有路径的概率,就等于每一个到达这个状态的路径之和:

![[Formula]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/forward_algorithm/graphics/5.1.2.3_1.gif)
![]()
where each of the y is one of the observable set. Intermediate probabilities (
's) are calculated recursively by first calculating
for all states at t=1.
![]()
Then for each time step, t = 2, ..., T, the partial probability
is calculated for each state; ![[Formula]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/forward_algorithm/graphics/5.2_3.gif)
that is, the product of the appropriate observation probability and the sum over all possible routes to that state, exploiting recursion by knowing these values already for the previous time step. Finally the sum of all partial probabilities gives the probability of the observation, given the HMM,
.
=======================================================
隐马尔科夫模型HMM自学 (5-1)Viterbi Algorithm
本来想明天再把后面的部分写好,可是睡觉今天是节日呢?一时情不自禁就有打开电脑..........
找到可能性最大的隐含状态序列
崔晓源 翻译
多数情况下,我们都希望能够根据一个给定的HMM模型,根据观察状态序列找到产生这一序列的潜在的隐含状态序列。
1、穷举搜索方法

我们可以通过穷举的方式列出所有可能隐含状态序列,并算出每一种隐状态序列组合对应的观察状态序列的概率。概率最大的那个组合对应的就是最可能的隐状态序列组合。
Pr(observed sequence | hidden state combination).
比如说上图中的trellis中,最有可能的隐状态序列是使得概率:
Pr(dry,damp,soggy | sunny,sunny,sunny), Pr(dry,damp,soggy | sunny,sunny,cloudy), Pr(dry,damp,soggy | sunny,sunny,rainy), . . . . Pr(dry,damp,soggy | rainy,rainy,rainy)
得到最大值的序列。
同样这种穷举法的计算量太大了。为了解决这个问题,我们可以利用和Forward algorithm一样的原理--概率的时间不变性来减少计算量。
2.用递归方式减少复杂度
在给定的观察序列和HMM模型下,我们用一种递归的方式找到最有可能的隐状态序列。同样我们滴定部分概率,即在trellis中到达某一中间状态的概率。然后介绍如何在初始时刻t=1和t>1的时刻分别求解这个部分概率。但要注意,这里的部分概率是到达某一中间状态的概率最大的路径而不是所有概率之和。
2.1部分概率和部分最优路径
看如下trellis
![[Picture of trellis]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/trellis.1.gif)
对于trellis中的每个中间状态和结束状态,都存在一条到达它的最优路径。他可能是下图这样:
![[Picture]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/paths.for.t_3.gif)
我们这些路径为部分最优路径,每一条 部分最优路径都对应一个关联概率--部分概率
。与Forward algorithm不同
是最有可能到达该状态的一条路径的概率。
(i,t)是所有序列中在t时刻以状态i终止的最大概率。当然它所对应那条路径就是部分最优路径。
(i,t)对于每个i,t都是存在的。这样我们就可以在时间T(序列的最后一个状态)找到整个序列的最优路径。
2b. 计算
's 在t = 1的初始值
由于在t=1不存在任何部分最优路径,因此可以用初始状态
向量协助计算。
![]()
这一点与Forward Algorithm相同
2c. 计算
's 在t > 1 的部分概率
同样我们只用t-1时刻的信息来得到t时刻的部分概率。
![[Picture]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/abcxtrellis.gif)
由此图可以看出到达X的最优路径是下面中的一条:
(sequence of states), . . ., A, X (sequence of states), . . ., B, X or (sequence of states), . . ., C, X
我们希望找到一条概率最大的。回想马尔科夫一阶模型的假设,一个状态之和它前一时刻的状态有关。
Pr (most probable path to A) . Pr (X | A) . Pr (observation | X)
因此到达X的最大概率就是:
![[Formula]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/6.1.2.3_a.gif)
其中第一部分由t-1时刻的部分概率得到,第二部分是状态转移概率,第三部分是混淆矩阵中对应的概率。
隐马尔科夫模型HMM自学 (5-2)Viterbi Algorithm
书接前文,viterbi算法已经基本成形......
崔晓源 翻译
一般化上一篇最后得到的公式我们可以把概率的求解写成:
![]()
2d. 反向指针,
's
考虑下面trellis
![[Trellis]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/trellis.1.gif)
现在我们可以得到到达每一个中间或者终点状态的概率最大的路径。但是我们需要采取一些方法来记录这条路径。这就需要在每个状态记录得到该状态最优路径的前一状态。记为:
![]()
这样argmax操作符就会选择使得括号中式子最大的索引j。
如果有人问,为什么没有乘以混淆矩阵中的观察概率因子。这是因为我们关心的是在到达当前状态的最优路径中,前一状态的信息,而与他对应的观察状态无关。
2e. viterbi算法的两个优点
1)与Forward算法一样,它极大的降低了计算复杂度
2)viterbi会根据输入的观察序列,“自左向右”的根据上下文给出最优的理解。由于viterbi会在给出最终选择前考虑所有的观察序列因素,这样就避免了由于突然的噪声使得决策原理正确答案。这种情况在真实的数据中经常出现。
==================================================
下面给出viterbi算法完整的定义
The algorithm may be summarised formally as:
For each i,, i = 1, ... , n, let :
![]()
- this intialises the probability calculations by taking the product of the intitial hidden state probabilities with the associated observation probabilities.
For t = 2, ..., T, and i = 1, ... , n let :
![[Formula]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/6.2.1_b.gif)
- thus determining the most probable route to the next state, and remembering how to get there. This is done by considering all products of transition probabilities with the maximal probabilities already derived for the preceding step. The largest such is remembered, together with what provoked it.
Let :
![]()
- thus determining which state at system completion (t=T) is the most probable.
For t = T - 1, ..., 1
Let :
![]()
- thus backtracking through the trellis, following the most probable route. On completion, the sequence i1 ... iT will hold the most probable sequence of hidden states for the observation sequence in hand.
==================================================
我们还用天气的例子来说明如何计算状态CLOUDY的部分概率,注意它与Forward算法的区别
![[Picture]](http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/graphics/example.viterbi.gif)
隐马尔科夫模型HMM自学 (6)尾声
崔晓源 翻译
HMM的第三个应用就是learning,这个算法就不再这里详述了,并不是因为他难于理解,而是它比前两个算法要复杂很多。这个方向在语 音处理数据库上有重要的地位。因为它可以帮助我们在状态空间很大,观察序列很长的环境下找到合适HMM模型参数:初始状态、转移概率、混淆矩阵等。