eclipse上一次没有正确关闭,导致启动的时候卡死错误解决方法
错误日志为:
!ENTRY org.eclipse.core.resources 2 10035 2011-05-01 17:22:09.964!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.
解决方法:
到
删除文件 .snap
老是因为svn的问题,我会强制干掉eclipse。唉…
原文地址:http://www.cnblogs.com/wordadobe/archive/2011/05/01/2033964.html
使用jforum注意细节
创建数据库时用以下语句:CREATE DATABASE jforum DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
jforum-custom.conf文件database.connection.string…后面加上&useUnicode=true&characterEncoding=utf-8
2011年换域名
换成了:1msky.com…mark
/dev/null 的用途
/dev/null ,从名称上可以很显然看出是一个空文件(写入到/dev/null时全部丢失,读取/dev/null时自己返回EOF),那么你会很疑惑,他到底有什么用途呢,请看下文听我讲解,可能你在很多脚本里看过 /dev/null,具体总结下几种常见用途.
一、禁止标准输出.
eg:
cat $filename >/dev/null
# 文件内容丢失,不会输出到标准输出,.
二、禁止标准错误
eg:
rm $badname 2>/dev/null
#删除文件错误时,不会再有提示到终端,都丢到/dev/null里去了
三、禁止标准输出和标准错误的输出.
eg1:
cat $filename 2>/dev/null >/dev/null
# 如果”$filename”不存在,将不会有任何错误信息提示.
# 如果”$filename”存在, 文件的内容不会打印到标准输出.
# 因此, 上面的代码根本不会输出任何信息.
# 当只想测试命令的退出码而不想有任何输出时非常有用。
eg2:
#———–测试命令的退出 begin ———————-#
ls dddd 2>/dev/null 8
echo $? //输出命令退出代码:0为命令正常执行,1-255为有出错。
#———–测试命令的退出 end———–#
cat $filename &>/dev/null
四、清除日志文件内容
eg:
cat /dev/null > /var/log/messages
# : > /var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)
cat /dev/null > /var/log/wtmp
五、 隐藏cookie而不再使用
eg:
if [ -f ~/.netscape/cookies ] # 如果存在则删除.
then
rm -f ~/.netscape/cookies
fi
ln -s /dev/null ~/.netscape/cookies
# 现在所有的cookies都会丢弃而不会保存在磁盘上了.
osgi之 pax新增bundle
以创建sp-mod-db这个bundle为例,第一步,打开cmd,进入workspace,
如cmd命令:
C:\Documents and Settings\user1>d:
D:\>cd d:/workspace
1.输入创建bundle命令
格式为:
Mvn -N %PAX_PLUGIN%:create-bundle -Dpackage=%_PACKAGE_% -DbundleName=%_BUNDLENAME_% -DbundleGroupId=%_BUNDLEGROUPID_% -Dversion=%_VERSION_% %_EXTRA_%
创建sp-mod-db的命令:
mvn -N org.ops4j:maven-pax-plugin:1.4:create-bundle -Dpackage=com.overwisdom.sms.osgi.db -DbundleName=sp-mod-db -DbundleGroupId=com.overwisdom.sms.osgi -Dversion=1.0.0
说明:
Dpackage:此bundle的classpath package。所有db这个bundle的package都要是这个package的子package。
DbundleName:bundle名称,也是作为maven配置中的artifactId.
DbundleGroupId:maven配置中的groupId。
Dversion:此bundle的初始版本。
短信项目,不管是自建bundle,还是第三方jar封装成的bundle,都以com.overwisdom.sms.osgi作为groupId。
自建的bundle,其DbundleName名以”sp-mod-“开头。
2.修改d:/workspace/sp-mod-db下的pom文件
其中增加parent配置为:
<parent>
<groupId>com.overwisdom.sms.osgi</groupId>
<artifactId>sp-mod-parent</artifactId>
<version>1.0.0</version>
</parent>
说明:sp-mod-parent是自建bundle所要集成的parent pom。里面包含了自建bundle基础的pom配置。
3.编辑pom.xml
删除sp-mod-db的pom.xml文件中的以下标签:
Build, plugins等。只留下基本的parent,properties,name,url,modelVersion, groupId, artifactId, version,package。
Ps:build, plugins等标签配置,已在sp-parent,sp-mod-parent中配置,自建的bundle不需要再配置这些标签。
4.转换为eclipse工程
在cmd模式下,进入d:/workspace/sp-mod-db.输入转换命令:
mvn org.ops4j:maven-pax-plugin:1.4:eclipse –DdownloadSources
若pom文件没改错的话,执行应该就会成功,项目将转换为eclipse项目。
5.导入项目到eclipse,开启maven支持
目录结构应该如下所示:
说明:
pom.xml:maven配置文件
osgi.bnd:osgi扩展MF文件配置,打包时由bundle插件负责解析。
src/main/java:bundle的java代码
src/main/resources:bundle的资源文件,默认加载到classpath中。这些配置已在sp-parent和sp-mod-parent中。
META-INF:在使用pax和bundle插件下,暂失效。
src:暂无效。
target:打包后的文件位置
build.properties:构建属性文件,不用维护。因为是pom文件和osgi.bnd生成。
6.配置spring bean文件
在src/main/resources下META-INF文件夹,创建子文件夹spring。新建spring-content.xml和spring-content-osgi.xml文件。
两个xml文件由spring dm自动解析,不需要sp-mod-db本身实现或配置其他的xml。Spring dm会在当前sp-mod-db加载时,解析META-INF/spring文件下的xml,两个文件可以再切分成多个,也可以合并为一个。
Spring-content.xml配置bundle内部使用的bean配置,主要与bundle内部的实现代码关联,如下图所示:
在此引用了:
com.mchange.v2.c3p0.ComboPooledDataSource, org.springframework.jdbc.datasource.DataSourceTransactionManager,
oracle.jdbc.driver.OracleDriver
三个类,这三个类分别是oracle.bundle;c3p0.bundle,spring-jdbc.bundle提供。而这几个类都没有在sp-mod-db中的实现代码中引用,就算在sp-mod-db的pom文件中加了此三个bundle的依赖,pax和bundle插件也不能解析到sp-mod-db依赖这几个类,从来不能在MF文件中定义,会导致sp-mod-db在加载时报:
ClassNotFound.Exception。
如何办捏?
看下面7. 修改osgi.bnd文件。
7.修改osgi.bnd和pom.xml
步骤6中配置了spring bean,而依赖的三个类分别由三个bundle提供,所以最好要在pom文件中加上此三个bundle的依赖。
如下加入c3p0的依赖:
<dependency>
<groupId>com.overwisdom.sms.osgi</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1</version>
</dependency>
因为是在引用了spring dm相关,所以需要加载相关的spring包,以及基础的spring-content,spring-tx,spring-jdbc等,这些包都已有封装好的bundle。(如果自己实现的代码里面依赖了其他bundle提供的类,那么一定要在pom.xml中引入其他bundle依赖。而在spring bean定义的类,此不需要强制需要,因为在解析osgi.bnd时会加载相应的依赖。如sp-mod-db就可以不用pom.xml中配置c3p0和oracle的依赖。)
如上所述,在spring-content中配置了bean信息,依赖了其他bundle提供的类,就算在pom.xml中已经配置了bundle依赖,还必须修改osgi.bnd文件以支持MF中import-package的支持,如此才能引入其他bundle的package服务于spring-content.xml文件。
配置如下所示:
Bundle-Activator: ${bundle.namespace}.internal.ExampleActivator
Import-Package:\
com.mchange.v2.c3p0;version=”0.9.1″;resolution:=optional,\
org.springframework.jdbc.datasource;version=”3.0.0.RELEASE”;resolution:=optional,\
com.mchange.v2.resourcepool;version=”0.9.1″;resolution:=optional,\
com.mchange.v2.beans;version=”0.9.1″;resolution:=optional,\
javax.sql;resolution:=optional,\
*
每一行用”\”分割,通过pax和bundle插件解析成MF文件后,这些属性才会显示在不同的行。像Import-Package中引入了c3p0,jdbc的部分package,而引入的c3p0的package不仅仅是包含com.mchange.v2.c3p0.ComboPooledDataSource的package。
注意:之所以会这样配置,是因为com.mchange.v2.c3p0.ComboPooledDataSource会引用到c3p0其他的两个package,在bundle设计中,就必须把com.mchange.v2.c3p0.ComboPooledDataSource所引用的其他类所在的package引入,否则就会导致“类访问权限”或“找不到类”的异常。
此时osgi.xml和pom.xml配置好后,可以执行4的步骤,执行成功后,可以看到通过pax和bundle插件解析后的MF文件。
Ps:如要增加MF文件中的某一个属性的配置,如classpath的增加,则也是在osgi.bnd中配置,再由pax+bundle插件解析。
如sp-mod-ibatis中,因为引用了ibatis文件,所以要配置其可以访问,通过配置ibatis文件为classpath下可以满足此要求,如下:
8.配置spring osgi文件
Spring-content-osgi.xml配置了spring dm和osgi相关的bean,从外部引入对象和提供对象给其他bundle,都是在此xml中配置。
如sp-mod-db中,配置了dataSource bean。这个bean就是提供给其他使用db的bundle调用,如sp-mod-ibatis。
sp-mod-db中导出对象给其他bundle使用的配置如下:
<osgi:service id=”dataSourceOsgi” ref=”dataSource”
interface=”javax.sql.DataSource”>
</osgi:service>
Id区别与当前bundle中的其他bundle的名称,ref则是引用spring-content.xml配置的id为dataSource的bean。Interface则是bundle之间互相交互的接口名称。dataSource必须是interface的一个接口实现。
sp-mod-ibatis中的spring-content-osgi.xml中,引入javax.sql.DataSource 实现对象的配置如下:
<osgi:reference id=”dataSource”
interface=” javax.sql.DataSource ” cardinality=”1..1″>
</osgi:reference>
其中id为引入的对象的名称,可被spring-content.xml中的bean所引用。
ps:当加载sp-mod-ibatis时,此bundle会在解析osgi:reference时判断依赖的接口所对应的对象是否存在,即是有有其他bundle提供,若有则加载进当前bundle,若无此bundle就会等待,直到超时后就会报错。
9.打包和发布
使用命令:mvn clean install 可以安装在本地;
Mvn clean package 打包
Mvn clean deploy 发布到远程maven库。
Ps:在执行这些命令时,可加入 –Dmaven.test.skip=ture跳过test环节的验证。
maven-pax-plugin和maven-bundle-plugin插件配置简介
org.ops4j. maven-pax-plugin插件主要用于新建bundle,打包第三方jar为bundle,如下引入pax插件即可:
<plugin>
<groupId>org.ops4j</groupId>
<artifactId>maven-pax-plugin</artifactId>
<extensions>true</extensions>
</plugin>
org.apache.felix. maven-bundle-plugin插件用于解析osgi.bnd,配置MF文件相关的属性。如下所示的为sp-mod-parent中bundle插件配置:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName>
<Bundle-Version>${pom.version}</Bundle-Version>
<Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version=”${pom.version}”</Export-Package>
<Private-Package>${bundle.namespace}.internal.*</Private-Package>
<_include>-osgi.bnd</_include>
</instructions>
</configuration>
</plugin>
如上所示。
bundle-version:配置MF文件中bundle-version属性;
Export-Package:配置MF文件中相关导出packages;
Private-package:配置此bundle内私有的package,这里配置的package不会再MF文件Export-package中出现。
_include:指定扩展MF的bnd文件。
自建的bundle如sp-mod-db等,都是继承于sp-mod-parent的配置。
如下所示为sp-3th-wrapper中的bundle配置:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName>
<Bundle-Version>${wrapped.version}</Bundle-Version>
<_exportcontents>*;version=”${wrapped.version}”</_exportcontents>
<Private-Package>!*</Private-Package>
<_include>-osgi.bnd</_include>
</instructions>
</configuration>
</plugin>
其中bundle-version,_include,private-package与sp-mod-parent中的配置一致。
_ exportcontents:配置需要导出的packages,对应于MF文件中的export-package属性。
其配置规则:
包名1;version=”版本1”,包名2;version=”版本2”。
一般封装第三方jar,采用通配符配置:
*;version”第三方jar包的版本号”
Ps: wrapped.version是其中定义的属性。
InputStream 和 Reader 的read区别
InputStream.read()
返回int ,且范围为0到255间int值 ,从输入流读取下一个数据字节(它是以字节为单位来读的,即每次只读取一个字节内容 )。如果因已到达流末尾而没有可用的字节,则返回值-1 。因此该方式不能读取非字符文件(二进制文件),如声音、图片文件等,比如编码为-1的字节内容,通过该方法读取出来后变成了255,因为该方法返回的是一个整型,在读取一个字节后,本来byte型的变量就可以接收该编码了,但它是用的int型变量来存储接收的,所以int型前三字节会以零来补,所以最后本来编码为-1的,最后变成了255。
从上面来看,如果我们读取的是二进制文件,如图片声音文件时,我们应该使用如下两种方式来读取:
第一种 :还是使用InputStream.read(),方法来读取,只不过我们把int型强制转换byte型即可,这样在转换的过程中,会丢弃前三个字节所补的零,最终得到从流中读取的真实的编码:
第二种 :使用InputStream.read(byte[] b)来接收,因为这样不会有byte到int提升的过程,byte数组b里存储的就是真实的编码。
OutputStream.write(int b)
将指定的字节写入此输出流。write 的规定是:向输出流写入一个字节。要写入的字节是参数b的八个低位。b 的24个高位将被忽略。此方法能向文件中写入负数编码,即可写入二进制流的文件,如声音、图片等文件。
我们再来看看Reader与Writer字符流相应方法:
Reader.read
Reader.read:读取单个字符。在有可用字符、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。范围在 0 到 65535 之间 (0×00-0xffff),实质上读取出来的就是一个char型,即为Unicode编码了。如果已到达流的末尾,则返回 -1
Writer. write(int c)
Writer. write(int c):写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
由以上区别,可用InputStream.read处理字节流,用Reader.read处理字符流相对比较方便。
5.拳皇类连招题
题目:
玩过KOF(拳皇)的人都知道,玩的时候会连招是比较强的。题目的大概意思是:每招用一个大写字母表 示,如ABC…Z,现给定n个连招公式:S→T,其中S长度为m,T的长度为1。在前m招的时候可以随便连,但m+1招后就必须遵循连招公式。现在要 写一个算法,计算最长连招的长度;如果可以无限连招,则返回def。1≤n,m≤100给了一个例子:n=4,m=3,连招公式为:ABC→C,ABC→D,CCA→A,BCC→A。连招公式的意思是:A、B、C可以连出C,也可连出D,C、C、A可以连出A,B、C、C可以连出A。这时候可以得到最长连 招公式:ABC→C→A→A,即最长连招公式长度为6。题目要求给出算法思想并结合一定的伪码。
4.多项式求值
题目:对多项式f(x)=a(0)+a(1)*x+a(2)*x^2+a(3)*x^3+…+a(n)*x^n,其中n已知,当给定一个x,求解f(x)的值。
3.查找满足f(n)=x的数
题目:f(n)=x表示从1到n出现1的个数为x。例如f(1)=1, f(13)=6,f(19)=12.求10,0000,0000以内所有满足f(n)=n的数.
如下是一个时间复杂度为O(logN)的算法:
分析如下:
假设N表示为a[n]a[n-1]…a[1],其中a[i](1<=i<=n)表示N的各位数上的数字。
c[i]表示从整数1到整数a[i]…a[1]中包含数字1的个数。
x[i]表示从整数1到10^i – 1中包含数字1的个数,例如,x[1]表示从1到9的个数,结果为1;x[2]表示从1到99的个数,结果为20;
当a[1]=0时,c[1] = 0;
当a[1]=1时,c[1] = 1;
当a[1]>1时,c[1] = 1;
当a[2]=1时,c[2] = a[1] +1+ c[1] + x[1];
当a[2]>1时,c[2] = a[2]*x[1]+c[1]+10;
当a[3]=1时,c[3] = a[2]*a[1] +1+ c[2] + x[2];
当a[3]>1时,c[3] = a[3]*x[2]+c[2]+10^2;
……
以此类推
当a[i]=1时,c[i] = a[i-1]*…*a[1] +1+ c[i-1]+x[i-1];
当a[i]>1时,c[i] = a[i]x[i-1]+c[i-1]+10^(i-1);
实现的代码如下:
public class Test{
public static int search(int _n){
int N = _n/10;
int a1 = _n%10,a2;
int x = 1;
int ten = 10;
int c = a1 == 0?0:1;
while(N > 0)
{
a2 = N%10;
if(a2 == 0);
else if(a2 == 1)c = a1 + 1 + x + c;
else c = a2*x + c + ten;
a1 = 10*a1 + a2;
N /=10;
x = 10*x + ten;
ten *= 10;
}
return c;
}
public static void main(String args[]){
for(int i=1;i< 50;i++){
System.out.println("f("+i+")="+search(i));
}
}
}
最初想到的从位数上入手相合,还有循环的做法,则时间复杂度较高.