Rising Sun

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  148 随笔 :: 0 文章 :: 22 评论 :: 0 Trackbacks

2013年3月11日 #

     摘要: 看了网上的许多对于lucene 分词解析的文章一知半解且代码比较老旧,为透彻、系统、全面、深刻的了解分词是怎么一个过程,通过自定义一个分词器来分析理解。 其中分词部分利用ICTCLAS4j接口实现。结构如下所示:            要实现自定义的ICTCLAS4jAnalyzer必须继承Analy...  阅读全文
posted @ 2015-01-07 10:11 brock 阅读(1082) | 评论 (0)编辑 收藏

Lucene Directory类就像它的意思一样“目录”,如“目录”不存在,第一次启动被创建,一旦文件被创建,它只能打开阅读,或删除。允许读取和写入随机访问。Java I/O api 不能直接使用,只能通过这个API Directory的实现类可以分为文件目录,内存目录和目录的代理类及工具类。具体如下图所示:


一:文件目录

SimpleFSDirectory:FSDirectory的简单实现,并发能力有限,遇到多线程读同一个文件时会遇到瓶颈,通常用NIOFSDirectoryMMapDirectory代替。

NIOFSDirectory:通过java.nio's FileChannel实行定位读取,支持多线程读(默认情况下是线程安全的)。该类仅使用FileChannel进行读操作,写操作则是通过FSIndexOutput实现。

注意:NIOFSDirectory 不适用于Windows系统,另外如果一个访问该类的线程,在IO阻塞时被interruptcancel,将会导致底层的文件描述符被关闭,后续的线程再次访问NIOFSDirectory时将会出现ClosedChannelException异常,此种情况应用SimpleFSDirectory代替。

MMapDirectory:通过内存映射进行读,通过FSIndexOutput进行写的FSDirectory实现类。使用该类时要保证用足够的虚拟地址空间。另外当通过IndexInputclose方法进行关闭时并不会立即关闭底层的文件句柄,只有GC进行资源回收时才会关闭。

 

为了能适应各个操作系统选择最佳Directory方案,lucene 提供FSDirectory类的静态方法open()实现自适应。

 public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {

    if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX)

          && Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {

      return new MMapDirectory(path, lockFactory);

    } else if (Constants.WINDOWS) {

      return new SimpleFSDirectory(path, lockFactory);

    } else {

      return new NIOFSDirectory(path, lockFactory);

    }

  }

二:内存目录

RAMDirectory:常驻内存的Directory实现方式。默认通过SingleInstanceLockFactory(单实例锁工厂)进行锁的实现。该类不适合大量索引的情况另外也不适用于多线程的情况 在索引数据量大的情况下建议使用MMapDirectory代替。RAMDirectoryDirectory抽象类在使用内存最为文件存储的实现类,其主要是将所有的索引文件保存到内存中。这样可以提高效率。但是如果索引文件过大的话,则会导致内存不足,因此,小型的系统推荐使用,如果大型的,索引文件达到G级别上,推荐使用FSDirectory

NRTCachingDirectory:是对RAMDirectory的封装,适用于近乎时时(near-real-time)操作的环境。

三:Direcotry的代理类及工具类

FileSwitchDirectory:文件切换的Directory实现.针对lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory实现类的优点于一身
比如MMapDirectory,借助内存映射文件方式提高性能,但又要减少内存切换的可能 ,当索引太大的时候,内存映射也需要不断地切换,这样优点也可能变缺点,而之前的NIOFSDirectory实现java NIO的方式提高高并发性能,但又因高并发也会导致IO过多的影响,所以这次可以借助FileSwitchDirectory发挥他们两的优点。

RateLimitedDirectoryWrapper:通过IOContext来限制读写速率的Directory封装类。

CompoundFileDirectory:用于访问一个组合的数据流。仅适用于读操作。对于同一段内扩展名不同但文件名相同的所有文件合并到一个统一的.cfs文件和一个对应的.cfe文件内。
.cfs文件由HeaderFileDataFileCount组成。.cfe文件由HeaderFileCount,FileName,DataOffset,DataLength组成。.cfs文件中存储着索引的概要信息及组合文件
的数目(FileCount)。.cfe文件存储文件目录的条目内容,内容中包括文件数据扇区的起始位置,文件的长度及文件的名称。

TrackingDirectoryWrapperDirectory的代理类。用于记录哪些文件被写入和删除。

四:Direcotry读写对象的类图




 文章转载过来的!

posted @ 2015-01-07 10:09 brock 阅读(263) | 评论 (0)编辑 收藏

    本机已经安装了jdk1.6,而比较早期的项目需要依赖jdk1.5,于是同时在本机安装了jdk1.5和jdk1.6. 

 安装jdk1.5前,执行java -version得到

java version "1.6.0_38"
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)


安装完jdk1.5,并修改环境变量JAVA_HOME为D:\devSoftware\jdk1.5.再执行 java -version时,依然显示:

java version "1.6.0_38"
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)


看上去,新的环境变量JAVA_HOME=D:\devSoftware\jdk1.5并没有生效。 在网上找了很多资料才发现:

      在安装JDK1.6时(本机先安装jdk1.6再安装的jdk1.5),自动将java.exe、javaw.exe、javaws.exe三个可执行文件复制到了C:\Windows\System32目录,由于这个目录在WINDOWS环境变量中的优先级高于JAVA_HOME设置的环境变量优先级


解决方案:将java.exe,javaw.exe,javaws.exe删除即可。开启新的命令行窗口,再执行java -version时,就得到了期望中的结果

java version "1.5.0_17"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_17-b04, mixed mode)


posted @ 2015-01-06 11:45 brock 阅读(7006) | 评论 (0)编辑 收藏

在学lucene 之初看了许多书,都是走马观花,没有项目的驱动下,来一个用例demo感觉也不是很难,“我会了”这是我的第一感觉。

         2013年底公司接到一个项目用到lucene,这是我第一次正真接触Lucene,代码比较老3.6版本,不适合新项目的需求(空间查询)。于是下载了最新版本 4.51,有带“空间查询”模块。各大搜索引擎都没有找到像样例子,于是想到了lucene svn trunk目录测试用例中找到了测试例子,开始了一段lucene之旅。

 

写数据,创建IndexWriter,通过它的构造函数需要一个索引目录(Diectory)和索引写入配置项(InderWriterConfig,直接上代码:

//设置写入目录(好几种呵呵)

Directory d=FSDirectory.open(new File("D:/luceneTest"));

//设置分词 StandardAnalyzer(会把句子中的字单个分词)

Analyzer analyzer= new StandardAnalyzer(Version.LUCENE_45);

//设置索引写入配置

IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_45,analyzer);

//设置创建模式

//config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);

IndexWriter indexwriter= new IndexWriter(d,config);

 

    上面四行代码就创建好了indexwriter下面把数据填入就好了,写入有多种方式如下图:


         addDocment 举例代码如下:

Document doc=new Document(); 

        doc.add(new StringField("id", "1", Store.YES));

        doc.add(new StringField("name", "brockhong", Store.YES));

        doc.add(new TextField("content", "lucene 文档第一次写看着给分吧", Store.YES)); 

//写入数据

indexwriter.addDocument(doc);

//提交

indexwriter.commit();

Luke 工具查看Text列,这是标准分词惹的祸哦!写入成功。


         读数据查询,创建 IndexSearcher 构造函数设置indexReader ,输入查询条件,上面content字段数据设置了分词,所以必须通过查询解析类QueryParser设定分词字段、版本、分词模式,并通过parse方法得到查询条件。代码如下:       

 //读数据

 //创建 indexReader 这个已过时 IndexReader.open(d),里面的代码一样可能为了兼容老版本

 IndexReader indexReader = DirectoryReader.open(d);

 IndexSearcher indexSearcher = new IndexSearcher(indexReader);

//查询 设置分词字段

QueryParser queryParser = new QueryParser(Version.LUCENE_45, "content",

                   new StandardAnalyzer(Version.LUCENE_45));

 //or 关系 “给”、“分”

         queryParser.setDefaultOperator(QueryParser.OR_OPERATOR);

Query query = queryParser.parse("给分");

 

TopDocs results = indexSearcher.search(query, 100);

int numTotalHits = results.totalHits;

System.out.println(" " + numTotalHits + " 完全匹配的文档");

ScoreDoc[] hits = results.scoreDocs;

for (int i = 0; i < hits.length; i++) {

              Document document = indexSearcher.doc(hits[i].doc);

              System.out.println("content:" + document.get("content"));

}


pasting
posted @ 2014-12-31 17:07 brock 阅读(319) | 评论 (0)编辑 收藏

http://blog.csdn.net/ablipan/article/details/8198692

使用SAXReader的read(File file)方法时,如果xml文件异常会导致文件被服务器占用不能移动文件,建议不使用read(File file)方法而使用read(FileInputStream fis)等流的方式读取文件,异常时关闭流,这样就不会造成流未关闭,文件被锁的现象了。(在服务器中运行时会锁住文件,main方法却不会)。


1、以下方式xml文件异常时会导致文件被锁

  1.                    Document document = null;  
  2. File file = new File(xmlFilePath);  
  3. SAXReader saxReader = new SAXReader();  
  4. try  
  5. {  
  6.     document = saxReader.read(file);  
  7. } catch (DocumentException e)  
  8. {  
  9.     logger.error("将文件[" + xmlFilePath + "]转换成Document异常", e);  
  10. }  


2、以下方式xml文件异常时不会锁文件(也可以使用其他的流来读文件)

  1.                 Document document = null;  
  2. FileInputStream fis = null;  
  3. try  
  4. {  
  5.     fis = new FileInputStream(xmlFilePath);  
  6.     SAXReader reader = new SAXReader();  
  7.     document = reader.read(fis);  
  8. }   
  9. catch (Exception e)  
  10. {  
  11.     logger.error("将文件[" + xmlFilePath + "]转换成Document异常", e);  
  12. }   
  13. finally  
  14. {  
  15.     if(fis != null)  
  16.     {  
  17.         try  
  18.         {  
  19.             fis.close();  
  20.         } catch (IOException e)  
  21.         {  
  22.             logger.error("将文件[" + xmlFilePath + "]转换成Document,输入流关闭异常", e);  
  23.         }  
  24.     }  
  25. }  
posted @ 2014-09-02 14:00 brock 阅读(471) | 评论 (0)编辑 收藏

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>二次开发示例</title>
<link rel="stylesheet" href="../OpenLayers2.11/theme/default/style.css" type="text/css" />
    <script type="text/javascript" src="../OpenLayers2.11/OpenLayers.js"></script>
    <script type="text/javascript" src="../OpenLayers2.11/OpenLayersEx.js?random=8852c822-1ab8-4c0a-9717-b6f4c2b98115"></script>
 
    <!-- Import OpenLayers, reduced, wms read only version -->
    <!--<script src="../OpenLayers.js" type="text/javascript"></script>-->
<script type="text/javascript">
   var map;
var bounds = new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34);
function init() {
    var options = {
                       controls:[new OpenLayers.Control.XPanZoomBar(),new OpenLayers.Control.Navigation(),new OpenLayers.Control.MousePosition({numDigits:2})] ,
                        projection: 'EPSG:900913',
                        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                        maxResolution: 156543.0339,
                        units: 'm',
                        zoomLevel: 8
                    };
    map = new OpenLayers.Map('map',options);    
    
/*{
        div: "map",
        projection: "EPSG:900913",
        units: "m",
        maxExtent: new OpenLayers.Bounds(
            -20037508.34, -20037508.34, 20037508.34, 20037508.34
        ),
        maxResolution: 156543.0339,
zoomLevel: 8
    }*/
   // var osm = new OpenLayers.Layer.OSM();
    // If tile matrix identifiers differ from zoom levels (0, 1, 2, ...)
    // then they must be explicitly provided.
    var matrixIds = new Array(19);
    for (var i=0; i<16; ++i) {
        matrixIds[i] = i+"";
    }
var wmts2 = new OpenLayers.Layer.WMTS({
        name: "Medford Buildings",
        url: "http://t0.tianditu.com/cia_w/wmts",
        layer: "cia",
        matrixSet: "w",
        matrixIds: matrixIds,
        format: "tiles",
        style: "default",
        opacity: 0.7,
        isBaseLayer: false
    });       
    var wmts = new OpenLayers.Layer.WMTS({
        name: "vec",
        url: "http://t0.tianditu.com/vec_w/wmts",
        layer: "vec",
        matrixSet: "w",
        matrixIds: matrixIds,
        format: "tiles",
        style: "default",
        opacity:1,
        isBaseLayer: true
    });                
    map.addLayers( [wmts,wmts2]);
  //  map.addControl(new OpenLayers.Control.LayerSwitcher());
  //  map.setCenter(new OpenLayers.LonLat(13391734.740566667,3535411.228859166),7);
map.moveTo(new OpenLayers.LonLat(13391734.740566667,3535411.228859166),7);
}
</script>
</head>
 <body onload="init();">
        <h1 id="title">Web Map Tile Service (WMTS) Layer</h1>
        
    
        
        <div id="map" class="smallmap"></div>
        
       
    </body>
</html>
posted @ 2014-06-24 17:00 brock 阅读(816) | 评论 (0)编辑 收藏

arcgis

CGCS2000_3_Degree_GK_Zone_40

WKID: 4528 Authority: EPSG

 

Projection: Gauss_Kruger

False_Easting: 40500000.0

False_Northing: 0.0

Central_Meridian: 120.0

Scale_Factor: 1.0

Latitude_Of_Origin: 0.0

Linear Unit: Meter (1.0)

 

Geographic Coordinate System: GCS_China_Geodetic_Coordinate_System_2000

Angular Unit: Degree (0.0174532925199433)

Prime Meridian: Greenwich (0.0)

Datum: D_China_2000

  Spheroid: CGCS2000

    Semimajor Axis: 6378137.0

    Semiminor Axis: 6356752.314140356

Inverse Flattening: 298.257222101

 

Java 自定义

 

String [] proj4_w = new String [] { 

"+proj=tmerc", 
"+lat_0=0", 
"+lon_0=120", 
"+ellps=GRS80", 
"+units=m", 
"+x_0=40500000",
"+y_0=0",
"+k=1.0"
};

经纬度转换

       ///+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=GRS80 +units=m +no_defs

                Point2D.Double srcProjec = null;

                Point2D.Double dstProjec = null;

                Projection proj = ProjectionFactory.fromPROJ4Specification (proj4_w);

//  "epsg:4528" 数据从proj4 拷贝 nad

//      Point2D.Double srcProjec = null;

//      Point2D.Double dstProjec = null;

//      Projection proj = ProjectionFactory.getNamedPROJ4CoordinateSystem ("epsg:4528");

 

        srcProjec = new Point2D.Double (120.159,30.267);

        //40515348.2903 3349745.5395

       

        dstProjec = proj.transform (srcProjec, new Point2D.Double ());

        System.out.println ("TM:" + dstProjec);

    // TM: Point2D.Double [644904.399587292, 400717.8948938238]

 

        srcProjec = new Point2D.Double (40515348.2903 ,3349745.5395);

        dstProjec = proj.inverseTransform (srcProjec, new Point2D.Double ());

       

        System.out.println ("TM:" + dstProjec);

posted @ 2014-06-20 11:41 brock 阅读(3709) | 评论 (0)编辑 收藏

今天研究Oracle遇到了这个问题ora-01033:oracle initializationor shutdown in progress

ORA-01033:ORACLEinitialization or shutdown in progress

解决方法

1)开始-运行-cmd

2)命令行中输入SQLPLUS SYS/SYS AS SYSDBA

3)输入SHUTDOWN

4)输入STARTUP.注意这里是最重要的地方,在显示相关数据后,它还会显示为什么不能启动的错误所在.

 

C:\Users\lenovo>SQLPLUSSYS/SYS AS SYSDBA

SQL*Plus: Release 10.2.0.3.0 - Production on星期三 7月 3 11:43:32 2013

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 -Production

With the Partitioning, OLAPand Data Mining options

SQL> SHUTDOWN

ORA-01109:数据库未打开

已经卸载数据库。

ORACLE例程已经关闭。

SQL> STARTUP

ORACLE例程已经启动。

Total System Global Area 293601280 bytes

Fixed Size                 1290208 bytes

Variable Size            234881056 bytes

Database Buffers           50331648 bytes

Redo Buffers               7098368 bytes

数据库装载完毕。

ORA-01157:无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件

ORA-01110:数据文件 6: 'F:\DC\DB\SDRS\TS_SDRS.DBF'

SQL> alter databasedatafile'F:\DC\DB\SDRS\TS_SDRS.DBF'offline drop;

 

数据库已更改。

 

SQL> alter database open;

 

数据库已更改。

 

SQL> drop tablespaceTS_SDRS including contents;

 

表空间已删除。

SQL> create undo tablespace TS_SDRS

  2  datafile'CracleoradatasmsdbUNDOTBS01.DBF'size 2048M extent management local;

 

表空间已创建。

 

SQL> alter system setundo_tablespace=TS_SDRS;

 

系统已更改。

 

SQL> shutdown

数据库已经关闭。

已经卸载数据库。

ORACLE例程已经关闭。

SQL> startup

ORACLE例程已经启动。

 

Total System Global Area  293601280 bytes

Fixed Size                 1290208 bytes

Variable Size            243269664 bytes

Database Buffers          41943040 bytes

Redo Buffers               7098368 bytes

数据库装载完毕。

数据库已经打开。

SQL>


------------------
ORA-01245、ORA-01547错误的解决            

数据库rman restore database 之后,执行recover database的时候,报告ORA-01245错误,详细的错误信息如下:


SQL> recover database until cancel;
ORA-00279: change 575876 generated at 12/01/2009 08:19:49 needed for thread 1
ORA-00289: suggestion :
/oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc
ORA-00280: change 575876 for thread 1 is in sequence #2


Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log
'/oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3


ORA-00308: cannot open archived log
'/oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01245: offline file 2 will be lost if RESETLOGS is done
ORA-01110: data file 2: '/oracle/oradata/orcl/undotbs01.dbf'


SQL>

 

[@more@]

检查ORA-01245那一行,发现是datafile 2状态为offline,解决的方法就是首先将datafile 2 online,然后再recover database。

SQL> alter database datafile 2 online;

Database altered.

SQL> recover database until cancel;
ORA-00279: change 575876 generated at 12/01/2009 08:19:49 needed for thread 1
ORA-00289: suggestion :
/oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc
ORA-00280: change 575876 for thread 1 is in sequence #2


Specify log: {=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
SQL> alter database open resetlogs;

Database altered.

SQL>

--------------------

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NOR


ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS
选项


SQL> alter database open 
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或
NORESETLOGS 选项

SQL> alter database open resetlogs;
alter database
open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110:
数据文件 1: 'E:\ORACLE\ORADATA\EYGLE\SYSTEM01.DBF'

SQL> recover database
using backup controlfile;
ORA-00279: 更改 1670743 (在 04/17/2008 14:13:16 生成)
对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORA92\RDBMS\ARC00030.001
ORA-00280:
更改 1670743 对于线程 1 是按序列 # 30 进行的

指定日志: {<RET>=suggested | filename |
AUTO | CANCEL}
E:\oracle\oradata\EYGLE\REDO01.LOG
ORA-00310: 存档日志包含序列
29;要求序列 30
ORA-00334: 归档日志:
'E:\ORACLE\ORADATA\EYGLE\REDO01.LOG'

SQL> recover database using
backup controlfile;
ORA-00279: 更改 1670743 (在 04/17/2008 14:13:16 生成) 对于线程 1
是必需的
ORA-00289: 建议: E:\ORACLE\ORA92\RDBMS\ARC00030.001
ORA-00280: 更改
1670743 对于线程 1 是按序列 # 30 进行的

指定日志: {<RET>=suggested | filename |
AUTO |
CANCEL}
E:\oracle\oradata\EYGLE\REDO02.LOG
已应用的日志。
完成介质恢复。
SQL>
alter database open resetlogs;
数据库已更改。


OK,搞定了!

posted @ 2014-04-30 14:38 brock 阅读(9079) | 评论 (0)编辑 收藏

首先来看问题,然后来看函数的定义,其实什么都在函数定义里面说明白了

1.正则表达式字符串问题

首先输入的regex是一个正则表达式,而不是一个普通的字符串,所以导致很多在正则表达式里面有特殊意义的比如 "." "|" "\" ,如果直接使用是不行的,另外一个方面我们输入的regex是以字符串形式传递的,对有些字符必须要转义,尤其是"\",下面请看例子

String[] aa = "aaa|bbb|ccc".split("|");//wrong
String[] aa = "aaa|bbb|ccc".split("\\|"); //

 

 String[] aa = "aaa*bbb*ccc".split("*");//wrong
 String[] aa = "aaa|bbb|ccc".split("\\*");

 

 String[] aa = "aaa*bbb*ccc".split(".");//wrong
 String[] aa = "aaa|bbb|ccc".split("\\.");

 

String[] aa = "aaa\\bbb\\bccc".split("\\");//wrong

String[] aa = "aaa\\bbb\\bccc".split("\\\\");

 

2.数组长度的问题

String a = "";
String[] b = a.split(",");
b.length为 1;
*
String a = "c";
String[] b = a.split(",");
b.length为 1;
**
String a = "c,,,";
String[] b = a.split(",");
b.length为 1;
***
String a = "c,,c";
String[] b = a.split(",");
b.length为 3;
****
String a = ",";
String[] b = a.split(",");
b.length为 0;

 

其实只要添加一个参数即可,例如

String str = "abcdef,ghijk,lmno,pqrst,,,";       

String[] array = str.split(",");
输出:abcdef,ghijk,lmno,pqrst,

 

String str = "abcdef,ghijk,lmno,pqrst,,,";
String[] array 
= str.split(",",-1);

输出:abcdef,ghijk,lmno,pqrst,,,,

 

public String [] split (String  regex, int limit) 

最后一个参数limit是影响返回数组的长度的

=========================请关注红色字体(括号内为注释)==========================================

public String[] split(String regex)

根据给定的正则表达式的匹配来拆分此字符串。

该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,结果数组中不包括结尾空字符串(直接使用会造成数组大小问题)

例如,字符串 "boo:and:foo" 产生带有下面这些表达式的结果:

Regex结果
:{ "boo", "and", "foo" }
o{ "b", "", ":and:f" }

 

参数:
regex - 定界正则表达式
返回:
字符串数组,根据给定正则表达式的匹配来拆分此字符串,从而生成此数组。

public String[] split(String regex,
                      int limit)

根据匹配给定的正则表达式来拆分此字符串。

此方法返回的数组包含此字符串的每个子字符串,这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止。数组中的子字符串按它们在此字符串中的顺序排列。如果表达式不匹配输入的任何部分,则结果数组只具有一个元素,即此字符串。

limit 参数控制模式应用的次数,因此影响结果数组的长度如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后项将包含超出最后匹配的定界符的所有输入。如果 n 为非正,则模式将被应用尽可能多的次数,而且数组可以是任意长度。如果 n 为零,则模式将被应用尽可能多的次数,数组可有任何长度,并且结尾空字符串将被丢弃

例如,字符串 "boo:and:foo" 使用这些参数可生成下列结果:

RegexLimit结果
:2{ "boo", "and:foo" }
:5{ "boo", "and", "foo" }
:-2{ "boo", "and", "foo" }
o5{ "b", "", ":and:f", "", "" }
o-2{ "b", "", ":and:f", "", "" }
o0{ "b", "", ":and:f" }

这种形式的方法调用 str.split(regex, n) 产生与以下表达式完全相同的结果:

Pattern.compile(regex).split(str, n)

 

参数:
regex - 定界正则表达式
limit - 结果阈值,如上所述
返回:
字符串数组,根据给定正则表达式的匹配来拆分此字符串,从而生成此数组

 

posted @ 2014-04-28 10:15 brock 阅读(237) | 评论 (0)编辑 收藏

  List<Calendar> l = new ArrayList<Calendar>(); 
while (true) {
l.add(Calendar.getInstance());
System.out.println(l.size());
}
605473
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Calendar.<init>(Unknown Source)
at java.util.GregorianCalendar.<init>(Unknown Source)
at java.util.Calendar.createCalendar(Unknown Source)
at java.util.Calendar.getInstance(Unknown Source)
at jodatestmemory.Main.main(Main.java:25)
posted @ 2014-01-08 11:26 brock 阅读(357) | 评论 (0)编辑 收藏

头文件
#ifndef CLASS_GEOMETRYTOSTRING
#define CLASS_GEOMETRYTOSTRING
 
#include <iostream>
#include <FileGDBAPI.h>
using namespace std;
class GeometryToString
{
public:
static  bool getGeometryStr( FileGDBAPI::ShapeBuffer &geometry,string srid,string &geometrystr); 
private:
static void getPointGML(FileGDBAPI::PointShapeBuffer *&pbuffer,string srid,string dimension, string &xml);
static void getLineGML(FileGDBAPI::MultiPartShapeBuffer *&lineGeometry,string srid,string dimension, string &xml);
static void getMultipointGML(FileGDBAPI::MultiPointShapeBuffer *&multipointGeometry,string srid,string dimension, string &xml);
static void getPolygonGML(FileGDBAPI::MultiPartShapeBuffer *&polygonGeometry,string srid,string dimension, string &xml);
};
#endif
--------------------------------
#include <jni.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>
#include <time.h>
#include <sstream> 
#include <FileGDBAPI.h>
#include "GeometryToString.h"
using namespace FileGDBAPI;
using namespace std;
/**
ShapeBuffer geometry format to gml
*/
bool GeometryToString::getGeometryStr( ShapeBuffer &geometry,string srid,string &geometrystr)     
{
ShapeType pType;
string dimension("2");
try{
geometry.GetShapeType(pType);
if(pType==shapeNull){
return false;
}
if(geometry.HasMs(pType) || geometry.HasZs(pType)){
dimension.assign("3");
}
//点
if(pType==shapePoint){
PointShapeBuffer *pPoint = static_cast<PointShapeBuffer*>(&geometry);
getPointGML(pPoint, srid, dimension, geometrystr);
}
//复杂点 shapeMultipoint         =  8, shapeMultipointM        = 28,  shapeMultipointZM       = 18, shapeMultipointZ        = 20,
else if(pType==shapeMultipoint||pType==shapeMultipointZ){
MultiPointShapeBuffer *pPoint = static_cast<MultiPointShapeBuffer*>(&geometry);
getMultipointGML(pPoint, srid, dimension, geometrystr);
}
//线
else if(pType==shapePolyline||pType==shapePolylineZ){
MultiPartShapeBuffer *pPoint = static_cast<MultiPartShapeBuffer*>(&geometry);
getLineGML(pPoint, srid, dimension, geometrystr);
}
//面 shapePolygon            =  5, shapePolygonM           = 25,  shapePolygonZM          = 15,  shapePolygonZ           = 19,
else if(pType==shapePolygon||pType==shapePolygonZ){
MultiPartShapeBuffer *pPoint = static_cast<MultiPartShapeBuffer*>(&geometry);
getPolygonGML(pPoint, srid, dimension, geometrystr);
}
//geometrystr = xml;
}catch(exception& e){
cout <<"格式化gml出错"<< e.what() << '\n';
return false;
}
return true;
}
/**
<gml:Polygon srsName="SDO:4269" xmlns:gml="http://www.opengis.net/gml">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2">-73.2580598287651 42.7460586400617 -73.0196951738303 42.740396678634 -72.9229974292253 42.7373644761786 -72.4557700038866 42.7258525290856 -72.4621713056891 42.7468405310805 -72.4793225257782 42.7615879021406 -72.507269529053 42.768732690401 -72.513068008801 42.7892594013537 -72.5389169708409 42.8077338159122 -72.5534284639708 42.8606431711071 -72.5248100213574 42.912614176111 -72.5202170578447 42.951672527189 -72.5042636319544 42.9655846501007 -72.4733411974969 42.9761435837694 -72.4571590376321 42.9996036974295 -72.461752087004 43.0465044640799 -72.4434642578885 43.0790393128302 -72.4376049020671 43.1162700005077 -72.4523985528512 43.1560221784821 -72.4355986440692 43.2322535514026 -72.4024188454006 43.3073827061476 -72.4102315830492 43.3234041461304 -72.3976280543775 43.3510068532968 -72.4121395531362 43.3771255999364 -72.3962478080998 43.4101565518933 -72.3825156946812 43.4846296935806 -72.3949977682121 43.5175538931663 -72.3734983899535 43.5723746289273 -72.3330851941569 43.597364792188 -72.3040399378543 43.6985301192074 -72.2600555952028 43.7353001230665 -72.219122921336 43.7506925284353 -72.2060918209679 43.7646350589214 -72.1848363730122 43.80169046066 -72.1700895247441 43.8789176964692 -72.1216496397887 43.9092173247051 -72.1132040793556 43.9391659598858 -72.0917117306645 43.9579911279466 -72.1128078470402 43.9765149671878 -72.109908766997 43.9892291134735 -72.0852043813773 44.0089239861752 -72.0769190441221 44.0320405986229 -72.0347283650035 44.0833740182692 -72.0324473746587 44.0960996192242 -72.0495148341973 44.1004520944913 -72.034919852375 44.1207459288225 -72.0447245537617 44.1564355666161 -72.0592822460624 44.1821766291117 -72.0443903804218 44.2343798441307 -72.0595660047421 44.2614940911533 -72.0354953753776 44.2994343131499 -71.9944335108703 44.327548202346 -71.9389056579791 44.3257860034125 -71.9283617527138 44.3361121851129 -71.8348159803514 44.3441994129005 -71.821197308355 44.3503600453548 -71.7977291908463 44.3841728130012 -71.7665702593917 44.3982488046659 -71.6768843632127 44.4213427403399 -71.6563990024127 44.4401373612433 -71.6477091613881 44.4691741459765 -71.6365547217831 44.4767309013869 -71.6142227691161 44.4745070427354 -71.5866189807601 44.4945375694191 -71.5752435447921 44.5258056891543 -71.5914413886211 44.5388744007984 -71.5922884113102 44.5512031068491 -71.5367908177936 44.578931263059 -71.554102635183 44.5965889130363 -71.5680271516494 44.6374468081651 -71.588749347522 44.6505994869911 -71.6076787297883 44.6778622938611 -71.6311328527304 44.741710760694 -71.583501209059 44.779196995866 -71.5751009123659 44.8160197976273 -71.5063649605901 44.8996711859762 -71.5169776077168 44.9436961331566 -71.5409270967342 44.9765632062274 -71.5053723006288 45.0133517163227 -71.9018687560566 45.0073398737601 -72.547231170846 45.0053701041526 -73.1885457846918 45.0084861445147 -73.3447234868808 45.0061387945908 -73.3507583871194 44.9819729513452 -73.336414678892 44.9326039308501 -73.3823067594393 44.847933618761 -73.3690541280725 44.8191179021752 -73.3267863194035 44.7992935709543 -73.3731585750219 44.7242364367472 -73.3581509561493 44.6803685644813 -73.3730971364166 44.661276356252 -73.3701366913554 44.6343490646186 -73.3818251037205 44.619807725515 -73.3712960298211 44.5791669569445 -73.3478119840265 44.5539715457203 -73.3344524939974 44.5443282463014 -73.2933197444992 44.4328535783628 -73.2999951630005 44.4055331645411 -73.329788093029 44.3673904680867 -73.3053256664728 44.2601422576288 -73.3773326255291 44.2012475171298 -73.3820623364064 44.1721076120789 -73.4078648304615 44.1362270392698 -73.408756830709 44.1066103535608 -73.4352152780239 44.0638978024284 -73.4360007112789 44.0456791904392 -73.4082513023357 44.0182219013789 -73.4174061301201 43.9881969457531 -73.4053345287368 43.9148075869024 -73.3751207851313 43.8859769501208 -73.3847399017653 43.8045079717314 -73.35899716813 43.7784275686935 -73.3566696765928 43.7565583405993 -73.3709893845573 43.7142811167279 -73.4229598542952 43.6321147289768 -73.4183198417113 43.5824793859982 -73.38811421923 43.569143658301 -73.3636855615672 43.6149988679746 -73.303534516911 43.6247148128503 -73.2941043006646 43.6196528756939 -73.2817362682322 43.593187249577 -73.2914024969012 43.5750335705379 -73.2599837938072 43.5593823395161 -73.2383913589494 43.5128328494146 -73.2500714436228 43.3108539907423 -73.2760052890117 42.9402941192892 -73.2795831999318 42.8371033274803 -73.2961697572314 42.8035493647592 -73.2692753169001 42.7474814329983 -73.2580598287651 42.7460586400617 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
-----------------------------------------
<gml:MultiSurface srsName="SDO:4269" xmlns:gml="http://www.opengis.net/gml">
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2">-71.7901942031213 41.6013068793251 -71.8027434308056 41.415829054006 -71.8459956537022 41.403854541649 -71.8368696812943 41.3419614666217 -71.8477722040922 41.3253484832966 -71.866678442895 41.3227696452717 -71.7222643227053 41.327264312184 -71.4898880400564 41.3920853196253 -71.427318519639 41.4866893796324 -71.4192468515382 41.6522122329241 -71.3690125475301 41.7032911019032 -71.3935805976545 41.7611558353254 -71.3673874451962 41.7413502009834 -71.2840016520154 41.6795489704365 -71.2289761591777 41.7076939683675 -71.2666285816006 41.7497430522049 -71.3193277902704 41.7721958646079 -71.33979862314 41.784425562696 -71.3454831662469 41.8131613833438 -71.3345427095385 41.8579036075386 -71.3424931202155 41.875782891498 -71.3330859502879 41.8960311596525 -71.3839531547034 41.8884397544728 -71.3824052822434 41.9792630768654 -71.3786442228911 42.0137133195164 -71.4974303691298 42.0092535031424 -71.7978316087618 42.0042748046853 -71.7882488621949 41.721603395324 -71.7926052182918 41.6417579304639 -71.7901942031213 41.6013068793251 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2">-71.1988086806703 41.6785003452844 -71.1999371652607 41.4633184834308 -71.1171327154704 41.4930619563069 -71.1412126344661 41.6552730544526 -71.1988086806703 41.6785003452844 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2">-71.2691694549114 41.6212683171835 -71.3495250332551 41.445857741455 -71.288007152861 41.4836193369167 -71.2386732340455 41.4748497781273 -71.2194468005559 41.6356423127122 -71.2691694549114 41.6212683171835 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
*/
void GeometryToString::getPolygonGML(FileGDBAPI::MultiPartShapeBuffer *&polygonGeometry,string srid,string dimension, string &xml){
int numPts;
polygonGeometry->GetNumPoints(numPts);
int numParts;
polygonGeometry->GetNumParts(numParts);
int* parts;
polygonGeometry->GetParts(parts);
Point* points;
polygonGeometry->GetPoints(points);
string gmlSub("");
if(numParts==1){
xml= "<gml:Polygon srsName=\"SDO:"+srid+"\" xmlns:gml=\"http://www.opengis.net/gml\"> \
<gml:exterior> \
<gml:LinearRing> \
<gml:posList srsDimension=\""+dimension+"\">";
for (int i = 0; i < numPts; i++)
{
char buffer[32];
sprintf(buffer, "%1.14g", points[i].x);
gmlSub.append(buffer).append(" ");
sprintf(buffer, "%1.14g", points[i].y);
gmlSub.append(buffer).append(" ");
}  
xml.append(gmlSub);
xml.append("</gml:posList></gml:LinearRing>\
  </gml:exterior>\
  </gml:Polygon>");
return;
}
if(numParts>1){
xml="<gml:MultiSurface srsName=\"SDO:"+srid+"\" xmlns:gml=\"http://www.opengis.net/gml\">";
for(int i=0;i<numParts;i++){
gmlSub.append("<gml:surfaceMember>\
 <gml:Polygon>\
 <gml:exterior>\
 <gml:LinearRing>\
 <gml:posList srsDimension=\"").append(dimension).append("\">");
int gt=0;
if( i==(numParts-1)){
gt=numPts;
}else{
gt=parts[i+1];
}
for (int j= parts[i]; j < gt; j++){
char buffer[32];
sprintf(buffer, "%1.14g", points[j].x);
gmlSub.append(buffer).append(" ");
sprintf(buffer, "%1.14g", points[j].y);
gmlSub.append(buffer).append(" ");
}
gmlSub.append("</gml:posList>\
 </gml:LinearRing>\
 </gml:exterior>\
 </gml:Polygon>\
 </gml:surfaceMember>");
}
xml.append(gmlSub);
xml.append("</gml:MultiSurface>");
return;
}
}
/**
<gml:MultiPoint srsName="SDO:2230" xmlns:gml="http://www.opengis.net/gml">
<gml:pointMember>
<gml:Point>
<gml:posList srsDimension="3">6301153.87493073 1913012.75794829 435.0 </gml:posList>
</gml:Point>
</gml:pointMember>
<gml:pointMember>
<gml:Point>
<gml:posList srsDimension="3">6301172.62522131 1913331.50796697 424.0 </gml:posList>
</gml:Point>
</gml:pointMember>
</gml:MultiPoint>
*/
void GeometryToString::getMultipointGML(FileGDBAPI::MultiPointShapeBuffer *&multipointGeometry,string srid,string dimension, string &xml){
int numPts;
multipointGeometry->GetNumPoints(numPts);
wcout << "Multipoint test:" << endl;
wcout << "Points: " << numPts << endl;
Point* points;
multipointGeometry->GetPoints(points);
double* zArray;
multipointGeometry->GetZs(zArray);
xml= "<gml:MultiPoint srsName=\"SDO:"+srid+"\" xmlns:gml=\"http://www.opengis.net/gml\"> ";
string gmlSub("");
for (int i = 0; i < numPts; i++)
{
gmlSub.append("<gml:pointMember><gml:Point><gml:posList srsDimension=\""+dimension+"\">");
char buffer[32];
sprintf(buffer, "%1.14g", points[i].x);
gmlSub.append(buffer).append(" ");
sprintf(buffer, "%1.14g", points[i].y);
gmlSub.append(buffer).append(" ");
sprintf(buffer, "%1.14g", zArray[i]);
gmlSub.append(buffer).append(" ");
gmlSub.append("</gml:posList></gml:Point></gml:pointMember>");
}
xml.append(gmlSub);
xml.append("</gml:MultiPoint>");
}
/**
<gml:Curve srsName="SDO:4269" xmlns:gml="http://www.opengis.net/gml">
<gml:segments>
<gml:LineStringSegment>
<gml:posList srsDimension="2">-91.3082592401631 40.0073363232732 -91.3055891069314 39.995346341049 -91.3139124547158 39.9690362798168 -91.3254189367963 39.9469572142013 -91.3246098997585 39.9350861975012 -91.32260281264 39.9251371873939 -91.3238158572038 39.896847138931 -91.3220157795743 39.8891571322064 -91.3241598689896 39.8853761196319 -91.3383584637069 39.873997056967 -91.3394875098243 39.8690760451917 -91.3354593387828 39.8630950480564 -91.3031399738825 39.8280070993682 -91.3022619338156 39.8090860744066 -91.2985697775187 39.7987370721841 -91.3005688605598 39.7949870596141 -91.3073361425165 39.7886050259611 -91.3117993281738 39.783596002295 -91.3119823326406 39.7676969773468 -91.3108232836762 39.7648359772821 -91.3049330369361 39.7602849923819 -91.2990957929273 39.7579610108158 -91.1947826970924 39.7164273102698 </gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
<gml:MultiCurve srsName="SDO:4269" xmlns:gml="http://www.opengis.net/gml">
<gml:curveMember>
<gml:Curve>
<gml:segments>
<gml:LineStringSegment>
<gml:posList srsDimension="2"> sssss</gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
</gml:curveMember>
<gml:curveMember>
<gml:Curve>
<gml:segments>
<gml:LineStringSegment>
<gml:posList srsDimension="2">sssss </gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
</gml:curveMember>
</gml:MultiCurve>
*/
void GeometryToString::getLineGML(MultiPartShapeBuffer *&lineGeometry,string srid,string dimension, string &xml)
{
int numPts,numParts;
lineGeometry->GetNumPoints(numPts);
lineGeometry->GetNumParts(numParts);
int* parts;
lineGeometry->GetParts(parts);
Point* points;
lineGeometry->GetPoints(points);
string gmlSub("");
if(numParts==1){
xml= "<gml:Curve srsName=\"SDO:"+srid+"\" xmlns:gml=\"http://www.opengis.net/gml\"> \
 <gml:segments> \
 <gml:LineStringSegment> \
 <gml:posList srsDimension=\""+dimension+"\">";
for (int i = 0; i < numPts; i++)
{
char buffer[32];
sprintf(buffer, "%1.14g", points[i].x);
gmlSub.append(buffer).append(" ");
sprintf(buffer, "%1.14g", points[i].y);
gmlSub.append(buffer).append(" ");
}  
xml.append(gmlSub);
xml.append("</gml:posList> \
  </gml:LineStringSegment>\
  </gml:segments> \
  </gml:Curve>");
return;
}
if(numParts>1){
xml="<gml:MultiCurve srsName=\"SDO:"+srid+"\" xmlns:gml=\"http://www.opengis.net/gml\">";
for(int i=0;i<numParts;i++){
gmlSub.append("<gml:curveMember>\
 <gml:Curve>\
 <gml:segments>\
 <gml:LineStringSegment>\
 <gml:posList srsDimension=\"").append(dimension).append("\">");
int gt=0;
if( i==(numParts-1)){
gt=numPts;
}else{
gt=parts[i+1];
}
for (int j= parts[i]; j < gt; j++){
char buffer[32];
sprintf(buffer, "%1.14g", points[j].x);
gmlSub.append(buffer).append(" ");
sprintf(buffer, "%1.14g", points[j].y);
gmlSub.append(buffer).append(" ");
}
gmlSub.append("</gml:posList>\
 </gml:LineStringSegment>\
 </gml:segments>\
 </gml:Curve>\
 </gml:curveMember>");
}
xml.append(gmlSub);
xml.append("</gml:MultiCurve>");
return;
}
}
/*
<gml:Point srsName="SDO:4269" xmlns:gml="http://www.opengis.net/gml">
<gml:posList srsDimension="2">-88.0261499418109 44.4722440557492 </gml:posList>
</gml:Point>
*/
void GeometryToString::getPointGML( PointShapeBuffer *&pbuffer,string srid,string dimension, string &xml)
{
xml= "<gml:Point srsName=\"SDO:"+srid+"\" xmlns:gml=\"http://www.opengis.net/gml\"><gml:posList srsDimension=\""+dimension+"\">";
Point* points;
pbuffer->GetPoint(points);
char buffer[32];
sprintf(buffer, "%1.14g", points[0].x);
xml.append(buffer).append(" ");
sprintf(buffer, "%1.14g", points[0].y);
xml.append(buffer).append(" ");
xml.append("</gml:posList></gml:Point>");
}
posted @ 2014-01-02 10:19 brock 阅读(325) | 评论 (0)编辑 收藏

写给自己看看
java --HelloJNI ---
import java.io.UnsupportedEncodingException;
public class HelloJNI {
static {
     System.loadLibrary("HelloJNI"); // hello.dll (Windows) or libhello.so (Unixes)
  
  }
  // A native method that receives nothing and returns void
  private native void sayHello();
  
  private native double sayOK(String dd);
  
  private native void getFileGdb(String path);
  
  private native String getFileGdbStr(String path);
  
  private native GeodbEntity getGdbTable(GeodbEntity geo);
 
  /**
* @param args
* @throws UnsupportedEncodingException
*/
/**  
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
//   System.out.println( System.getProperty("java.library.path"));
  HelloJNI hello =  new HelloJNI();
//   hello.sayHello();  // invoke the native method
  
//   System.out.println(hello.sayOK("Apple"));
//   
  //hello.getFileGdb("D:/cpp/FileGDB_API_VS2012_1_3/samples/data/ExecuteSQL.gdb");
  //GeodbEntity dd= hello.getGdbTable("D:/cpp/FileGDB_API_VS2012_1_3/samples/data/ExecuteSQL.gdb","dd");
  GeodbEntity dd= new GeodbEntity();
  dd.setTable("D:/cpp/FileGDB_API_VS2012_1_3/samples/data/ExecuteSQL.gdb 阿切尔");
  
  hello.getGdbTable(dd);
 
 System.out.println("java"+dd.getSrid());
 for(int i=0;i<dd.getFieldValues().size();i++){
 System.out.println(dd.getFieldValues().get(i));
 
 }
 // System.out.println(hello.getFileGdbStr("D:/cpp/FileGDB_API_VS2012_1_3/samples/data/ExecuteSQL.gdb"));
  
  }
}
-----GeodbEntity ----
import java.util.List;
import java.util.ArrayList;
public class GeodbEntity {
//输入
private String table;
private String eodbPath;
//输出
/**列字段##隔开*/
private String Fields;
/**数据表##隔开*/
private ArrayList<String> FieldValues=new ArrayList<String>();
/**空间参考标识符*/
private String srid;
/**维度*/
private String dimension;
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public String getEodbPath() {
return eodbPath;
}
public void setEodbPath(String eodbPath) {
this.eodbPath = eodbPath;
}
public String getSrid() {
return srid;
}
public void setSrid(String srid) {
this.srid = srid;
}
public String getDimension() {
return dimension;
}
public void setDimension(String dimension) {
this.dimension = dimension;
}
public String getFields() {
return Fields;
}
public void setFields(String fields) {
Fields = fields;
}
public ArrayList<String> getFieldValues() {
return FieldValues;
}
public void setFieldValues(ArrayList<String> fieldValues) {
FieldValues = fieldValues;
}
public String toString() {
        return Fields;
    }
}
--c++
hellojni.h
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject);
/*
 * Class:     HelloJNI
 * Method:    sayOK
 * Signature: (Ljava/lang/String;)D
 */
JNIEXPORT jdouble JNICALL Java_HelloJNI_sayOK
  (JNIEnv *, jobject, jstring);
/*
 * Class:     HelloJNI
 * Method:    getFileGdb
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloJNI_getFileGdb
  (JNIEnv *, jobject, jstring);
/*
 * Class:     HelloJNI
 * Method:    getFileGdbStr
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_HelloJNI_getFileGdbStr
  (JNIEnv *, jobject, jstring);
/*
 * Class:     HelloJNI
 * Method:    getGdbTable
 * Signature: (LGeodbEntity;)LGeodbEntity;
 */
JNIEXPORT jobject JNICALL Java_HelloJNI_getGdbTable
  (JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
----------hello c++------

#include <jni.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include "HelloJNI.h"
#include <fstream>
#include <time.h>
#include <FileGDBAPI.h>
using namespace std;
using namespace FileGDBAPI;
using namespace std;
 
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
JNIEXPORT jdouble JNICALL Java_HelloJNI_sayOK
(JNIEnv* env, jobject obj, jstring name){
const char* pname=env->GetStringUTFChars(name,NULL);
if(strcmp(pname,"Apple")==0){
env->ReleaseStringUTFChars(name,pname);
cout<<"After release:"<<pname<<endl;
return 1.2;
}
else{
env->ReleaseStringUTFChars(name,pname);
cout<<"After release:"<<pname<<endl;
return 2.1;
}
}
JNIEXPORT jstring JNICALL Java_HelloJNI_getFileGdbStr
(JNIEnv *env, jobject thisObj, jstring path){
/* fgdbError hr;
wstring errorText;
Geodatabase geodatabase;
std::wstring value;
const jchar* raw = env->GetStringChars(path, NULL);
if (raw != NULL) {
jsize len = env->GetStringLength(path);
value.assign(raw, raw + len);
env->ReleaseStringChars(path, raw);
}
if ((hr = OpenGeodatabase(value, geodatabase)) != S_OK)
{
wcout << "An error occurred while opening the geodatabase." << endl;
ErrorInfo::GetErrorDescription(hr, errorText);
wcout << errorText << "(" << hr << ")." << endl;
return (env)->NewStringUTF("7");
}
Row     attrQueryRow;
EnumRows attrQueryRows;
wstring sqlStatement(L"SELECT * FROM Cities WHERE TYPE = 'city' AND OBJECTID < 10");
if ((hr = geodatabase.ExecuteSQL(sqlStatement, true, attrQueryRows)) != S_OK)
{
wcout << "An error occurred while performing the attribute query." << endl;
ErrorInfo::GetErrorDescription(hr, errorText);
wcout << errorText << "(" << hr << ")." << endl;
return (env)->NewStringUTF("7");
}
FieldInfo fieldInfo;
attrQueryRows.GetFieldInformation(fieldInfo);
int       fieldCount;
FieldType fieldType;
wstring   fieldName;
// Iterate through the returned rows printing out all field values.
short     shortField;
int32     longField;
float     floatField;
double    doubleField;
string    stringField;
wstring   wstringField;
tm        dateTimeField;
char      datetime[80];
Guid      globalIDField;
Guid      guidField;
wstring   strGuid;
wstring   strGlobalID;
bool      isNull;
byte * shapeBufferBytes ;
ShapeBuffer geometry;
ByteArray  bss;
while (attrQueryRows.Next(attrQueryRow) == S_OK)
{
fieldInfo.GetFieldCount(fieldCount);
for (long fieldNumber = 0; fieldNumber < fieldCount; fieldNumber++)
{
fieldInfo.GetFieldType(fieldNumber, fieldType);
fieldInfo.GetFieldName(fieldNumber, fieldName);
attrQueryRow.IsNull(fieldName, isNull);
if (!isNull)
{
switch (fieldType)
{
case fieldTypeSmallInteger:
attrQueryRow.GetShort(fieldName, shortField);
wcout <<  shortField << endl;
break;
case fieldTypeInteger:
attrQueryRow.GetInteger(fieldName, longField);
wcout << longField << '\t';
break;
case fieldTypeSingle:
attrQueryRow.GetFloat(fieldName, floatField);
wcout << floatField << '\t';
break;
case fieldTypeDouble:
attrQueryRow.GetDouble(fieldName, doubleField);
wcout << doubleField << '\t';
break;
case fieldTypeString:
attrQueryRow.GetString(fieldName, wstringField);
wcout << wstringField << '\t';
break;
case fieldTypeDate:
attrQueryRow.GetDate(fieldName, dateTimeField);
strftime(datetime,80,"%a %b %d %I:%M:%S%p %Y", &dateTimeField);
wcout << datetime << '\t';
break;
case fieldTypeOID:
attrQueryRow.GetOID(longField);
wcout << longField << '\t';
break;
case fieldTypeGeometry:{
attrQueryRow.GetGeometry(geometry);
// attrQueryRow.GetBinary(fieldName, bss);
double x, y;
shapeBufferBytes = geometry.shapeBuffer;
wcout << "d::x::"<< x<<"y:"<<y<< '\t';;
wcout <<shapeBufferBytes<< "Geometry" << '\t';}
break;
case fieldTypeBlob:
wcout << "Blob" << '\t';
break;
case fieldTypeGUID:
attrQueryRow.GetGUID(fieldName, guidField);
guidField.ToString(strGuid);
wcout << strGuid << '\t';
break;
case fieldTypeGlobalID:
attrQueryRow.GetGlobalID(globalIDField);
globalIDField.ToString(strGlobalID);
wcout << strGlobalID << '\t';
break;
default:
break;
}
}
else
{
wcout << "null" << '\t';
}
}
wcout << endl;
}
attrQueryRows.Close(); // Close the EnumRows
*/
const char * pat="zhy好棒呀 第一个东东出来了";
//定义java String类 strClass  
jclass strClass = (env)->FindClass("Ljava/lang/String;");  
//获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String  
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");  
//建立byte数组  
jbyteArray bytes = (env)->NewByteArray(strlen(pat));  
//将char* 转换为byte数组  
(env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);  
// 设置String, 保存语言类型,用于byte数组转换至String时的参数  
jstring encoding = (env)->NewStringUTF("GB2312");   
//将byte数组转换为java String,并输出  
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);  
//return path;
}
JNIEXPORT void JNICALL Java_HelloJNI_getFileGdb(JNIEnv *env, jobject thisObj, jstring path) {
fgdbError hr;
wstring errorText;
Geodatabase geodatabase;
// const wchar_t * szStr =(wchar_t * )env->GetStringChars(path, NULL);
std::wstring value;
const jchar* raw = env->GetStringChars(path, NULL);
if (raw != NULL) {
jsize len = env->GetStringLength(path);
value.assign(raw, raw + len);
env->ReleaseStringChars(path, raw);
}
if ((hr = OpenGeodatabase(value, geodatabase)) != S_OK)
{
wcout << "An error occurred while opening the geodatabase." << endl;
ErrorInfo::GetErrorDescription(hr, errorText);
wcout << errorText << "(" << hr << ")." << endl;
return;
}
wstring sqlStatement(L"SELECT CITY_NAME, POP1990 FROM Cities WHERE TYPE = 'city' AND OBJECTID < 10");
EnumRows attrQueryRows;
if ((hr = geodatabase.ExecuteSQL(sqlStatement, true, attrQueryRows)) != S_OK)
{
wcout << "An error occurred while performing the attribute query." << endl;
ErrorInfo::GetErrorDescription(hr, errorText);
wcout << errorText << "(" << hr << ")." << endl;
return ;
}
// Iterate through the returned rows.
Row     attrQueryRow;
int32   cityPop;
wstring cityName;
while (attrQueryRows.Next(attrQueryRow) == S_OK)
{
attrQueryRow.GetInteger(L"POP1990", cityPop);
attrQueryRow.GetString(L"CITY_NAME", cityName);
wcout << cityName << '\t' << cityPop << endl;
}
// SELECT * - Return all fields.
sqlStatement.assign(L"SELECT * FROM Cities WHERE TYPE = 'city' AND OBJECTID < 10");
if ((hr = geodatabase.ExecuteSQL(sqlStatement, true, attrQueryRows)) != S_OK)
{
wcout << "An error occurred while performing the attribute query." << endl;
ErrorInfo::GetErrorDescription(hr, errorText);
wcout << errorText << "(" << hr << ")." << endl;
return;
}
// Get the field type and name from the row enumerator.
FieldInfo fieldInfo;
attrQueryRows.GetFieldInformation(fieldInfo);
int       fieldCount;
FieldType fieldType;
wstring   fieldName;
// Iterate through the returned rows printing out all field values.
short     shortField;
int32     longField;
float     floatField;
double    doubleField;
string    stringField;
wstring   wstringField;
tm        dateTimeField;
char      datetime[80];
Guid      globalIDField;
Guid      guidField;
wstring   strGuid;
wstring   strGlobalID;
bool      isNull;
byte * shapeBufferBytes ;
ShapeBuffer geometry;
while (attrQueryRows.Next(attrQueryRow) == S_OK)
{
fieldInfo.GetFieldCount(fieldCount);
for (long fieldNumber = 0; fieldNumber < fieldCount; fieldNumber++)
{
fieldInfo.GetFieldType(fieldNumber, fieldType);
fieldInfo.GetFieldName(fieldNumber, fieldName);
attrQueryRow.IsNull(fieldName, isNull);
if (!isNull)
{
switch (fieldType)
{
case fieldTypeSmallInteger:
attrQueryRow.GetShort(fieldName, shortField);
wcout <<  shortField << endl;
break;
case fieldTypeInteger:
attrQueryRow.GetInteger(fieldName, longField);
wcout << longField << '\t';
break;
case fieldTypeSingle:
attrQueryRow.GetFloat(fieldName, floatField);
wcout << floatField << '\t';
break;
case fieldTypeDouble:
attrQueryRow.GetDouble(fieldName, doubleField);
wcout << doubleField << '\t';
break;
case fieldTypeString:
attrQueryRow.GetString(fieldName, wstringField);
wcout << wstringField << '\t';
break;
case fieldTypeDate:
attrQueryRow.GetDate(fieldName, dateTimeField);
strftime(datetime,80,"%a %b %d %I:%M:%S%p %Y", &dateTimeField);
wcout << datetime << '\t';
break;
case fieldTypeOID:
attrQueryRow.GetOID(longField);
wcout << longField << '\t';
break;
case fieldTypeGeometry:{
attrQueryRow.GetGeometry(geometry);
// attrQueryRow.GetBinary(fieldName, bss);
double x, y;
shapeBufferBytes = geometry.shapeBuffer;
memcpy(&x, geometry.shapeBuffer + 4, sizeof(x));
memcpy(&y, geometry.shapeBuffer + 12, sizeof(y));
//std::string *str3 = new std::string((char *)shapeBufferBytes);
wcout << "d::x::"<< x<<"y:"<<y<< '\t';;
wcout <<shapeBufferBytes<< "Geometry" << '\t';}
  break;
case fieldTypeBlob:
wcout << "Blob" << '\t';
break;
case fieldTypeGUID:
attrQueryRow.GetGUID(fieldName, guidField);
guidField.ToString(strGuid);
wcout << strGuid << '\t';
break;
case fieldTypeGlobalID:
attrQueryRow.GetGlobalID(globalIDField);
globalIDField.ToString(strGlobalID);
wcout << strGlobalID << '\t';
break;
default:
break;
}
}
else
{
wcout << "null" << '\t';
}
}
wcout << endl;
}
attrQueryRows.Close(); // Close the EnumRows
// Close the geodatabase
if ((hr = CloseGeodatabase(geodatabase)) != S_OK)
{
wcout << "An error occurred while closing the geodatabase." << endl;
ErrorInfo::GetErrorDescription(hr, errorText);
wcout << errorText << "(" << hr << ")." << endl;
return ;
}
printf("Hello World  geodatebase!\n");
return;
}
std::string jstring2str(JNIEnv* env, jstring jstr)  
{     
    char*   rtn   =   NULL;     
    jclass   clsstring   =   env->FindClass("java/lang/String");     
    jstring   strencode   =   env->NewStringUTF("GB2312");     
    jmethodID   mid   =   env->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");     
    jbyteArray   barr=   (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);     
    jsize   alen   =   env->GetArrayLength(barr);     
    jbyte*   ba   =   env->GetByteArrayElements(barr,JNI_FALSE);     
    if(alen   >   0)     
    {     
        rtn   =   (char*)malloc(alen+1);           
        memcpy(rtn,ba,alen);     
        rtn[alen]=0;     
    }     
    env->ReleaseByteArrayElements(barr,ba,0);     
    std::string stemp(rtn);  
    free(rtn);  
    return   stemp;     
}  
jstring str2jstring(JNIEnv* env,const char* pat)  
{  
    //定义java String类 strClass  
    jclass strClass = (env)->FindClass("Ljava/lang/String;");  
    //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String  
    jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");  
    //建立byte数组  
    jbyteArray bytes = (env)->NewByteArray(strlen(pat));  
    //将char* 转换为byte数组  
    (env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);  
    // 设置String, 保存语言类型,用于byte数组转换至String时的参数  
    jstring encoding = (env)->NewStringUTF("GB2312");   
    //将byte数组转换为java String,并输出  
    return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);  
}  
JNIEXPORT jobject JNICALL Java_HelloJNI_getGdbTable(JNIEnv *env, jobject obj,jobject _GeodbEntity){
const char * dd="4096";
//jclass userClass = env->FindClass("GeodbEntity");  
jclass userClass=env->GetObjectClass(_GeodbEntity); 
//jmethodID userMethod = env->GetMethodID(userClass,"<init>","()V"); 
//jobject userObject = env->NewObject(userClass,userMethod);  
//jmethodID construction_id = env->GetMethodID(userClass, "<init>", "()V"); 
//得到构造方法的ID
    //jobject userObject = env->NewObject(userClass, construction_id); 
//jobject   userObject = env->AllocObject(userClass);     
//
//jmethodID setName_method=env->GetMethodID(userClass,"setSrid","(Ljava/lang/String;)V");
//env->CallVoidMethod(userObject,setName_method,dd);
   //jclass objectClass = (env)->FindClass("GeodbEntity
     jmethodID methodId=env->GetMethodID(userClass,"getTable","()Ljava/lang/String;");
 //调用customer对象的特定方法getName
       jstring js_name=(jstring)env->CallObjectMethod(_GeodbEntity,methodId,NULL);
   //jfieldID table = (env)->GetFieldID(userClass,"table","Ljava/lang/String;");
//jchar dd=(env)->GetCharField(userClass,table);
   //std::string value;
//const jchar* raw = env->GetStringChars(js_name, NULL);
//if (raw != NULL) {
//jsize len = env->GetStringLength(js_name);
//value.assign(raw, raw + len);
//env->ReleaseStringChars(js_name, raw);
//}
cout<<jstring2str(env,js_name)<<endl;
   jfieldID str = (env)->GetFieldID(userClass,"srid","Ljava/lang/String;");
  (env)->SetObjectField(_GeodbEntity,str,(env)->NewStringUTF(dd));
   //获取arraylist 类
   jclass cls_ArrayList = env->FindClass("java/util/ArrayList");
//获得arraylist id
        jmethodID construct = env->GetMethodID(cls_ArrayList,"<init>","()V");  
//创建arraylist
        jobject obj_ArrayList = env->NewObject(cls_ArrayList,construct); 
//获取 arraylist 的add 方法
        jmethodID arrayList_add = env->GetMethodID(cls_ArrayList,"add","(Ljava/lang/Object;)Z");  
for(int i=0;i<10;i++){
jobject alistadd = (env)->NewStringUTF("my name is D:"+i); 
//通过 add 方法 添加数据到 arraylist中
env->CallObjectMethod(obj_ArrayList,arrayList_add,alistadd);  
}
jfieldID str1 = (env)->GetFieldID(userClass,"FieldValues","Ljava/util/ArrayList;");
  (env)->SetObjectField(_GeodbEntity,str1,obj_ArrayList);
return _GeodbEntity;
}



posted @ 2013-12-30 14:18 brock 阅读(215) | 评论 (0)编辑 收藏

-环境的搭建,下载与安装LIBXML2和ICONV

          Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。Libxml2的下载地址是http://xmlsoft.org/downloads.html,完全版的库是开源的,并且带有例子程序和说明文档。完全版的文件名为:libxml2-2.7.8.tar.gz。

          Libxml2中默认的内码是UTF-8,所有使用libxml2进行处理的xml文件,必须首先显式或者默认的转换为UTF-8编码才能被处理。
要在xml中使用中文,就必须能够在UTF-8和GB2312内码(较常用的一种简体中文编码)之间进行转换。Libxml2提供了默认的内码转换机制,并且在libxml2的Tutorial中有一个例子,事实证明这个例子并不适合用来转换中文。所以需要我们显式的使用ICONV来进行内码转换,libxml2本身也是ICONV使用进行转换的。ICONV是一个专门用来进行编码转换的库,基本上支持目前所有常用的编码。它是glibc库的一个部分,常常被用于UNIX系统中。当然,在windows下面使用也没有任何问题。

其下载地址是http://gnuwin32.sourceforge.net/packages/libiconv.htm,文件名为libiconv-1.9.2-1-lib.zip。

          将libiconv-1.9.2-1-lib.zip解压,将其中的iconv.h放入C:\opt\include目录中,将其中的libiconv.lib放入C:\opt\lib中,并改名为iconv.lib.(没有opt目录就新建一个)。

          解压libxml2-2.7.8.tar.gz文件到C盘根目录,在c:\libxml2-2.7.8\libxml2-2.7.8\win32目录中存放了多个Windows平台编译器的Makefile文件,我们使用vs2008,所以待会会用Makefile.msvc文件。

1.进入Visual Studio 2008 Command Prompt;

2.cd c:\libxml2-2.7.8\libxml2-2.7.8\win32

3.输入cscript configure.js compiler=msvc prefix=c:\opt  include=c:\opt\include lib=c:\opt\lib debug=yes,回车执行。

4.最后使用nmake命令进行编译,输入nmake /f Makefile.msvc并回车。

此时会出现一下错误提示,

Makefile.msvc(465) : fatal error U1020: end-of-file found before next directive
Stop.

网上找了下原因,原来是Makefile.msvc中存在错误。

+!if "$(WITH_ICU)" == "1"
+LIBS = $(LIBS) icu.lib
+!endif

将以上三行前面的+号都删掉,重新执行nmake即可。

在当前win32目录中生成了一个bin.msvc目录,其中就有开发需要的libxml2.lib和libxml2.dll文件。

posted @ 2013-12-25 14:49 brock 阅读(220) | 评论 (0)编辑 收藏

Visual Studio Ultimate 2012Visual Studio Ultimate 2012 静态激活密钥,有兴趣的可以试一下。

RBCXF-CVBGR-382MK-DFHJ4-C69G8
posted @ 2013-12-17 11:07 brock 阅读(175) | 评论 (0)编辑 收藏

1、创建索引   
-------------------------------------------------------------------------------------------
GeohashPrefixTree grid = new GeohashPrefixTree(ctx, 12);//< 1 meter == 11 maxLevels
        this.strategy = new RecursivePrefixTreeStrategy(grid, "shape");
        ((RecursivePrefixTreeStrategy) this.strategy).setDistErrPct(LUCENE_4464_distErrPct);//1% radius (small!)

 String wktstr = clobtoString(map.get("wkt"));//图形信息
                String objectid = map.get("objectid").toString();//对象id
                String name = map.get("name").toString();//对象名称
                Shape shape = wktGeoRect(wktstr);
                Document doc = new Document();
                doc.add(new StringField("objectidtable", objectid + tableName, Field.Store.YES));
                doc.add(new StringField("objectid", objectid, Field.Store.YES));
                doc.add(new StringField("tableName", tableName, Field.Store.YES));
                doc.add(new StringField("metadataid", mid.toString(), Field.Store.YES));
                doc.add(new TextField ("title", name, Field.Store.YES));
                if (shape != null) {
                    for (Field f : strategy.createIndexableFields(shape)) {
                        doc.add(f);
                    }
                    doc.add(new StoredField(strategy.getFieldName(), ctx.toString(shape)));
                }
  indexWriter.addDocument(doc);
---------------------------------------------------------------
    public Shape wktGeoRect(String wktStr) {
        JtsGeometry jtsGeom = null;
        try {
            if (StringUtils.trim(wktStr.substring(0, wktStr.indexOf("("))).equalsIgnoreCase("POINT")) {
                wktStr = wktStr.substring(wktStr.indexOf("(") + 1, wktStr.lastIndexOf(")"));
                String[] point = wktStr.split(" ");
                return ctx.makePoint(Double.parseDouble(point[0]), Double.parseDouble(point[1]));
            } else {
                jtsGeom = (JtsGeometry) ctx.readShape(wktStr);
            }
        } catch (Exception e) {
        }
        return jtsGeom;
    }
2、查询空间索引

   @Test
    public void testshape() throws Exception {
                JtsSpatialContext ctx = JtsSpatialContext.GEO;
        Directory directory = new SimpleFSDirectory(new File("D:/platform/spatiallucence"));
        IndexReader[] indexReaders1 = new IndexReader[]{IndexReader.open(directory)};
        MultiReader multiReader = new MultiReader(indexReaders1);
        indexSearcher = new IndexSearcher(multiReader);
        indexSearcher.setSimilarity(new NoScoreSimilarity());
        GeohashPrefixTree grid = new GeohashPrefixTree(ctx, 12);//< 1 meter == 11 maxLevels
        strategy = new RecursivePrefixTreeStrategy(grid, "shape");
        ((RecursivePrefixTreeStrategy) strategy).setDistErrPct(0.025);//1% radius (small!)
        //POINT (121.591953019118 28.7566972164043)
        //Shape shape = ctx.readShape("POINT (121.454715099823 28.860595871703)");
        Shape shape = ctx.readShape("POLYGON(" +
                "(121.10836126349 28.84450508816,\n" +
                "121.12569906256 28.84450508816,\n" +
                "121.12569906256 28.856950537989,\n" +
                "121.10836126349 28.856950537989,\n" +
                "121.10836126349 28.84450508816))");
        shape = ctx.makeRectangle(121.10836126349d ,121.12569906256d, 28.84450508816d ,28.856950537989d);
        SpatialArgs args = new SpatialArgs(SpatialOperation.Intersects, shape);
        args.setDistErrPct(0.025);
        Query query = strategy.makeQuery(args);
        TopDocs results = indexSearcher.search(query, 1000);
        int numTotalHits = results.totalHits;
        System.out.println("共 " + numTotalHits + " 完全匹配的文档");
        ScoreDoc[] hits = results.scoreDocs;
        for (int i = 0; i < hits.length; i++) {
            Document document = indexSearcher.doc(hits[i].doc);
            System.out.println("Id: " + document);
        }
    }

posted @ 2013-11-29 16:15 brock 阅读(694) | 评论 (0)编辑 收藏

ext grid 删除最后一行数据后还是显示

grid删除最后一行数据后,store reload ,因为数据库中已经没有数据了,所以返回null .

但是ext不认这个东西,所以在service中进行判断。如果数据为null ,则返回

"{total:0,gridData:[]}" ;

重新编译,运行后,删除最后一行数据,就会看不到了。

posted @ 2013-10-24 10:40 brock 阅读(248) | 评论 (0)编辑 收藏


一.问题的提出

/usr/local/webserver/mysql/bin/mysql -u root -h 172.29.141.112  -p -S /tmp/mysql.sock
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on '172.29.141.112' (113)

二.问题的分析

 

出现上述问题,可能有以下几种可能

 

1. my.cnf 配置文件中 skip-networking 被配置

skip-networking 这个参数,导致所有TCP/IP端口没有被监听,也就是说出了本机,其他客户端都无法用网络连接到本mysql服务器

所以需要把这个参数注释掉。

 

2.my.cnf配置文件中 bindaddress 的参数配置

bindaddress,有的是bind-address  ,这个参数是指定哪些ip地址被配置,使得mysql服务器只回应哪些ip地址的请求,所以需要把这个参数注释掉。

 

3.防火墙的原因

通过 /etc/init.d/iptables  stop  关闭防火墙

我的问题,就是因为这个原因引起的。关闭mysql 服务器的防火墙就可以使用了。

 

三.问题的解决

1.  如果是上述第一个原因,那么 找到 my.cnf  ,注释掉 skip-networking 这个参数

sed -i  's%skip-networking%#skip-networking%g'  my.cnf

 

2. 如果是上述第二个原因,那么  找到 my.cnf  ,注释掉 bind-address  这个参数

sed -i  's%bind-address%#bind-address%g'    my.cnf

sed -i  's%bindaddress%#bindaddress%g'      my.cnf

 

最好修改完查看一下,这个参数。

 

3.如果是上述第三个原因,那么 把防火墙关闭,或者进行相应配置

 

/etc/init.d/iptables stop

 

四.参考

http://hi.baidu.com/vbkan/blog/item/cd5035030cefee793812bb56.html

http://dev.firnow.com/course/7_databases/mysql/myxl/20090820/169010.html

http://www.dnbcw.com/biancheng/sql/lojz182597.html

posted @ 2013-10-08 10:34 brock 阅读(211) | 评论 (0)编辑 收藏

  private static double getCpuRateForLinux(){
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader brStat = null;
        StringTokenizer tokenStat = null;
        try{
            System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);
            Process process = Runtime.getRuntime().exec("top -b -n 1");
            is = process.getInputStream();
            isr = new InputStreamReader(is);
            brStat = new BufferedReader(isr);
            if(linuxVersion.equals("2.4")){
                brStat.readLine();
                brStat.readLine();
                brStat.readLine();
                brStat.readLine();
                tokenStat = new StringTokenizer(brStat.readLine());
                tokenStat.nextToken();
                tokenStat.nextToken();
                String user = tokenStat.nextToken();
                tokenStat.nextToken();
                String system = tokenStat.nextToken();
                tokenStat.nextToken();
                String nice = tokenStat.nextToken();
                System.out.println(user+" , "+system+" , "+nice);
                user = user.substring(0,user.indexOf("%"));
                system = system.substring(0,system.indexOf("%"));
                nice = nice.substring(0,nice.indexOf("%"));
                float userUsage = new Float(user).floatValue();
                float systemUsage = new Float(system).floatValue();
                float niceUsage = new Float(nice).floatValue();
                return (userUsage+systemUsage+niceUsage)/100;
            }else{
                brStat.readLine();
                brStat.readLine();
                tokenStat = new StringTokenizer(brStat.readLine());
                tokenStat.nextToken();
                tokenStat.nextToken();
                tokenStat.nextToken();
                tokenStat.nextToken();
                tokenStat.nextToken();
                tokenStat.nextToken();
                tokenStat.nextToken();
                String cpuUsage = tokenStat.nextToken();
                System.out.println("CPU idle : "+cpuUsage);
                Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));
                return (1-usage.floatValue()/100);
            }
        } catch(IOException ioe){
            System.out.println(ioe.getMessage());
            freeResource(is, isr, brStat);
            return 1;
        } finally{
            freeResource(is, isr, brStat);
        }
    }
    private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){
        try{
            if(is!=null)
                is.close();
            if(isr!=null)
                isr.close();
            if(br!=null)
                br.close();
        }catch(IOException ioe){
            System.out.println(ioe.getMessage());
        }
    }
    /**
     * 获得CPU使用率.   
     * @return 返回cpu使用率
     * @author GuoHuang
     */
    private double getCpuRatioForWindows() {
        try {
            String procCmd = System.getenv("windir")
                    + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"
                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
            // 取进程信息    
            long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));
            Thread.sleep(CPUTIME);
            long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));
            if (c0 != null && c1 != null) {
                long idletime = c1[0] - c0[0];
                long busytime = c1[1] - c0[1];
                return Double.valueOf(
                        PERCENT * (busytime) / (busytime + idletime))
                        .doubleValue();
            } else {
                return 0.0;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return 0.0;
        }
    }
    /**
     * 读取CPU信息.
     * @param proc
     * @return
     * @author GuoHuang
     */
    private long[] readCpu(final Process proc) {
        long[] retn = new long[2];
        try {
            proc.getOutputStream().close();
            InputStreamReader ir = new InputStreamReader(proc.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
            String line = input.readLine();
            if (line == null || line.length() < FAULTLENGTH) {
                return null;
            }
            int capidx = line.indexOf("Caption");
            int cmdidx = line.indexOf("CommandLine");
            int rocidx = line.indexOf("ReadOperationCount");
            int umtidx = line.indexOf("UserModeTime");
            int kmtidx = line.indexOf("KernelModeTime");
            int wocidx = line.indexOf("WriteOperationCount");
            long idletime = 0;
            long kneltime = 0;
            long usertime = 0;
            while ((line = input.readLine()) != null) {
                if (line.length() < wocidx) {
                    continue;
                }
                // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,    
                // ThreadCount,UserModeTime,WriteOperation    
                String caption = Bytes.substring(line, capidx, cmdidx - 1)
                        .trim();
                String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();
                if (cmd.indexOf("wmic.exe") >= 0) {
                    continue;
                }
                // log.info("line="+line);    
                if (caption.equals("System Idle Process")
                        || caption.equals("System")) {
                    idletime += Long.valueOf(
                            Bytes.substring(line, kmtidx, rocidx - 1).trim())
                            .longValue();
                    idletime += Long.valueOf(
                            Bytes.substring(line, umtidx, wocidx - 1).trim())
                            .longValue();
                    continue;
                }
                kneltime += Long.valueOf(
                        Bytes.substring(line, kmtidx, rocidx - 1).trim())
                        .longValue();
                usertime += Long.valueOf(
                        Bytes.substring(line, umtidx, wocidx - 1).trim())
                        .longValue();
            }
            retn[0] = idletime;
            retn[1] = kneltime + usertime;
            return retn;
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                proc.getInputStream().close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
上面方法不行,下面的可以
  String result = "";
        try {
            File file = File.createTempFile("tmp", ".vbs");
            file.deleteOnExit();
            FileWriter fw = new java.io.FileWriter(file);
            String vbs ="Set objProc = GetObject(\"winmgmts:\\\\.\\root\\cimv2:win32_processor='cpu0'\")\n" +
                    "WScript.Echo  \"CPU Load Percentage: \"& chr(13) & chr(10) & Round(objProc.LoadPercentage,2) & \"%\"";
            fw.write(vbs);
            fw.close();
            Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                result += line;
            }
            input.close();
            file.delete();
        } catch (Exception e) {
            e.fillInStackTrace();
        }
        if (result.trim().length() < 1 || result == null) {
        }else{
            System.out.println(result.trim());
        }




posted @ 2013-08-19 10:40 brock 阅读(714) | 评论 (0)编辑 收藏

#encoding=UTF-8
# Configuration files must begin with a line specifying the encoding
#  of the the file.
#********************************************************************
# Wrapper License Properties (Ignored by Community Edition)
#********************************************************************
# Professional and Standard Editions of the Wrapper require a valid
#  License Key to start.  Licenses can be purchased or a trial license
#  requested on the following pages:
# http://wrapper.tanukisoftware.com/purchase
# http://wrapper.tanukisoftware.com/trial
# Include file problems can be debugged by removing the first '#'
#  from the following line:
##include.debug
# The Wrapper will look for either of the following optional files for a
#  valid License Key.  License Key properties can optionally be included
#  directly in this configuration file.
#include ../conf/wrapper-license.conf
#include ../conf/wrapper-license-%WRAPPER_HOST_NAME%.conf
# The following property will output information about which License Key(s)
#  are being found, and can aid in resolving any licensing problems.
#wrapper.license.debug=TRUE
#********************************************************************
# Wrapper Localization
#********************************************************************
# Specify the locale which the Wrapper should use.  By default the system
#  locale is used.
#wrapper.lang=en_US # en_US or ja_JP
# Specify the location of the Wrapper's language resources.  If these are
#  missing, the Wrapper will default to the en_US locale.
wrapper.lang.folder=../lang
#********************************************************************
# Wrapper Java Properties
#********************************************************************
# Java Application
#  Locate the java binary on the system PATH:
wrapper.java.command=java
#  Specify a specific java binary:
#set.JAVA_HOME=/java/path
set.LIB=D:/MonitorApp/lib
#wrapper.java.command=%JAVA_HOME%/bin/java
# Tell the Wrapper to log the full generated Java command line.
#wrapper.java.command.loglevel=INFO
# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.  Helper
#  classes are provided to do this for you.  See the Integration section
#  of the documentation for details.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
echo %LIB%
wrapper.java.classpath.1=%LIB%/wrapper.jar
wrapper.java.classpath.2=%LIB%/commons-beanutils-1.8.3.jar
wrapper.java.classpath.3=%LIB%/commons-codec-1.4.jar
wrapper.java.classpath.4=%LIB%/commons-collections-3.1.jar
wrapper.java.classpath.5=%LIB%/commons-collections-3.2.1.jar
wrapper.java.classpath.6=%LIB%/commons-dbcp-1.3.jar
wrapper.java.classpath.7=%LIB%/commons-dbcp-1.4.jar
wrapper.java.classpath.8=%LIB%/commons-fileupload-1.2.1.jar
wrapper.java.classpath.9=%LIB%/commons-httpclient-3.0.1.jar
wrapper.java.classpath.10=%LIB%/commons-io-1.4.jar
wrapper.java.classpath.11=%LIB%/commons-io-2.0.1.jar
wrapper.java.classpath.12=%LIB%/commons-jexl-1.1.jar
wrapper.java.classpath.13=%LIB%/commons-lang-2.5.jar
wrapper.java.classpath.14=%LIB%/commons-logging-1.1.1.jar
wrapper.java.classpath.15=%LIB%/commons-logging-api-1.1.jar
wrapper.java.classpath.16=%LIB%/commons-management-1.0.jar
wrapper.java.classpath.17=%LIB%/commons-pool-1.5.4.jar
wrapper.java.classpath.18=%LIB%/jedis-2.0.0.jar
wrapper.java.classpath.19=%LIB%/log4j-1.2.14.jar
wrapper.java.classpath.20=%LIB%/quartz-all-1.6.3.jar
wrapper.java.classpath.21=%LIB%/spring-aop-3.0.2.RELEASE.jar
wrapper.java.classpath.22=%LIB%/spring-asm-3.0.2.RELEASE.jar
wrapper.java.classpath.23=%LIB%/spring-beans-3.0.2.RELEASE.jar
wrapper.java.classpath.24=%LIB%/spring-binding-2.0.8.RELEASE.jar
wrapper.java.classpath.25=%LIB%/spring-context-3.0.2.RELEASE.jar
wrapper.java.classpath.26=%LIB%/spring-context-support-3.0.2.RELEASE.jar
wrapper.java.classpath.27=%LIB%/spring-core-3.0.2.RELEASE.jar
wrapper.java.classpath.28=%LIB%/spring-expression-3.0.2.RELEASE.jar
wrapper.java.classpath.29=%LIB%/springside-3.3.2.jar
wrapper.java.classpath.30=%LIB%/spring-test-3.0.2.RELEASE.jar
wrapper.java.classpath.31=%LIB%/spring-tx-3.0.2.RELEASE.jar
wrapper.java.classpath.32=%LIB%/slf4j-api-1.5.8.jar
wrapper.java.classpath.33=%LIB%/slf4j-log4j12-1.5.8.jar
wrapper.java.classpath.34=%LIB%/monitor.jar
wrapper.java.classpath.35=%LIB%   #可以读到这里的文件 xml pro 等       
# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=../bin
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Java Additional Parameters
wrapper.java.additional.1=-Dlog4j.configuration=file:%LIB%/log4j.xml
wrapper.java.additional.2=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=TRUE
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512
# Application parameters.  Add parameters as needed starting from 1
wrapper.app.parameter.1=com.zjasm.tomcat.TomcatStat
#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Enables Debug output from the Wrapper.
#wrapper.debug=TRUE
# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM
# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO
# Log file to use for wrapper output logging.
wrapper.logfile=../logs/wrapper.log
# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM
# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO
# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=0
# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=0
# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE
#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE
# Do not start if the pid file already exists.
wrapper.pidfile.strict=TRUE
# Title to use when running as a console
wrapper.console.title=Test Wrapper Sample Application
#********************************************************************
# Wrapper JVM Checks
#********************************************************************
# Detect DeadLocked Threads in the JVM. (Requires Standard Edition)
wrapper.check.deadlock=TRUE
wrapper.check.deadlock.interval=10
wrapper.check.deadlock.action=RESTART
wrapper.check.deadlock.output=FULL
# Out Of Memory detection.
# (Ignore output from dumping the configuration to the console.  This is only needed by the TestWrapper sample application.)
wrapper.filter.trigger.999=wrapper.filter.trigger.*java.lang.OutOfMemoryError
wrapper.filter.allow_wildcards.999=TRUE
wrapper.filter.action.999=NONE
#  Ignore -verbose:class output to avoid false positives.
wrapper.filter.trigger.1000=[Loaded java.lang.OutOfMemoryError
wrapper.filter.action.1000=NONE
# (Simple match)
wrapper.filter.trigger.1001=java.lang.OutOfMemoryError
# (Only match text in stack traces if -XX:+PrintClassHistogram is being used.)
#wrapper.filter.trigger.1001=Exception in thread "*" java.lang.OutOfMemoryError
#wrapper.filter.allow_wildcards.1001=TRUE
wrapper.filter.action.1001=RESTART
wrapper.filter.message.1001=The JVM has run out of memory.
#********************************************************************
# Wrapper Email Notifications. (Requires Professional Edition)
#********************************************************************
# Common Event Email settings.
#wrapper.event.default.email.debug=TRUE
#wrapper.event.default.email.smtp.host=<SMTP_Host>
#wrapper.event.default.email.smtp.port=25
#wrapper.event.default.email.subject=[%WRAPPER_HOSTNAME%:%WRAPPER_NAME%:%WRAPPER_EVENT_NAME%] Event Notification
#wrapper.event.default.email.sender=<Sender email>
#wrapper.event.default.email.recipient=<Recipient email>
# Configure the log attached to event emails.
#wrapper.event.default.email.attach_log=TRUE
#wrapper.event.default.email.maillog.lines=50
#wrapper.event.default.email.maillog.format=LPTM
#wrapper.event.default.email.maillog.loglevel=INFO
# Enable specific event emails.
#wrapper.event.wrapper_start.email=TRUE
#wrapper.event.jvm_prelaunch.email=TRUE
#wrapper.event.jvm_start.email=TRUE
#wrapper.event.jvm_started.email=TRUE
#wrapper.event.jvm_deadlock.email=TRUE
#wrapper.event.jvm_stop.email=TRUE
#wrapper.event.jvm_stopped.email=TRUE
#wrapper.event.jvm_restart.email=TRUE
#wrapper.event.jvm_failed_invocation.email=TRUE
#wrapper.event.jvm_max_failed_invocations.email=TRUE
#wrapper.event.jvm_kill.email=TRUE
#wrapper.event.jvm_killed.email=TRUE
#wrapper.event.jvm_unexpected_exit.email=TRUE
#wrapper.event.wrapper_stop.email=TRUE
# Specify custom mail content
wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.
# Name of the service
wrapper.name=testwrapper
# Display name of the service
wrapper.displayname=Test Wrapper Sample Application
# Description of the service
wrapper.description=Test Wrapper Sample Application Description
# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=
# Mode in which the service is installed.  AUTO_START, DELAY_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false
posted @ 2013-08-09 14:20 brock 阅读(264) | 评论 (0)编辑 收藏

步骤1、配置/etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
HWADDR="00:0C:29:FD:FF:2A"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=192.168.1.31
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
BOOTPROTO=static

前面三行是系统睚带的,后面就是手动添加的。
这样设置扣,记得重启网卡:
[root@localhost ~]# /etc/init.d/network stop
[root@localhost ~]# /etc/init.d/network start

行了,现在就可以PING得通网关了,如果还得上网,不必须设置DNS。设置DNS就详见步骤2

步骤2、修改dns
[root@localhost ~]# vi /etc/resolv.conf 
在里面添加二个dns:
nameserver 202.96.134.133
nameserver 8.8.8.8

ok,大攻告成,即可上网了!!!!

posted @ 2013-07-31 18:42 brock 阅读(219) | 评论 (0)编辑 收藏

 The VMware vSphere Web Services SDK includes all the components necessary to work with the VMware vSphere API, including WSDL files, sample code, and libraries. The vSphere Web Services SDK facilitates development of client applications that target the VMware vSphere API. With the vSphere Web Services SDK, developers can create client applications to manage, monitor, and maintain VMware vSphere components, as deployed on VMware®VMware vSphere®ESX®, ESXi™, and VMware®vCenter™ Server systems.

这是官方对vSphere Web Services SDK的介绍,简单来说就是提供了管理vcenter,ESXi的程序接口,目前支持JAVA和.NET平台,下面以windows 7平台为例,介绍JAVA开发环境的部署过程

一、开发环境准备

1、安装JAVA开发环境 J2SE 1.6 b22

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u22-oth-JPR

安装到c:\java下,不要安装到C:\program files下,目录中有空格,执行脚本的时候会报错

 

2、安装SOAP工具JAX-WS2.1

http://jax-ws.java.net/2.1.1/index.html

双击安装即可

 

3、下载vSphere Web Services SDK 5.1

http://communities.vmware.com/community/vmtn/developer/downloads

解压到c:\devprojects下

 

二、开发环境配置

1、设置系统变量

JAVA_HOME=C:\java\jdk1.6.0_22

JAVAHOME=C:\java\jdk1.6.0_22

SDKHOME=C:\devprojects

VMKEYSTORE=C:\VMware-Certs\vmware.keystore(稍后介绍安装过程)

WEBHOME=C:\devprojects\vsphere-ws\java\Axis\lib\wbem.jar

WS_SDK_HOME=C:\devprojects\SDK\vsphere-ws

CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\devprojects\SDK\vsphere-ws\java\JAXWS\lib\samples.jar;C:\devprojects\SDK\vsphere-ws\java\JAXWS\lib\vim25.jar(这个变量很重要)

 

2、服务器认证

2.1、将ESX Server或Vcenter的证书导入本机,ESXi的证书在/etc/vmware/ssl/rui.crt;Vcenter的证书在C:/Documents and Settings/All Users/Application Data/VMware/VMware VitualCenter/SSL/rui.crt

2.2、证书拷贝到本机的C:/VMware-Certs目录下,打开windows7的命令行界面,切换到C:/VMware-Certs目录下,使用jdk的keytool工具导入证书:

keytool -import -file <certificate-filename> -alias <server-name> -keystore vmware.keystore

其中certificate-filename为rui.crt,service-name可以为服务器的机器名或IP地址,运行成功后会在C:/VMware-Certs目录下生成vmware.keystore文件。

 

3、重新编译JAX-WS

如果你的安装的版本不是JDK 1.6 b22或者SOAP不是用 JAX-WS2.1,就需要重新编译

打开CMD,切换到C:\devprojects\SDK\vsphere-ws\java\JAXWS\

运行build.bat

运行成功会出现会出现

Generating stubs from wsdl
 
Compiling stubs.
...
Done
 
三、运行简单的客户端脚本以验证安装成功
 
打开CMD,切换到C:\devprojects\SDK\vsphere-ws\java\JAXWS\
 
run.bat com.vmware.general.SimpleClient --urlhttps://yourFQDNservername/sdk --username  username --password password,如下输出表示配置SDK成功
 
 
 
四、错误调试
1、如果出现找不到类的错误,ClassNotFoundException:........,可以这样
 
打开CMD,切换到C:\devprojects\SDK\vsphere-ws\java\JAXWS\
 
java -Djavax.net.ssl.trustStore=%VMKEYSTORE% com.vmware.general.SimpleClient--url https://example.com/sdk --username pubs --password ***
 
2、如果提示JAVA虚拟机的内存不够,可以这样
 
java -Djavax.net.ssl.trustStore=%VMKEYSTORE% -Xms 512M -XMx1024M com.vmware.general.SimpleClient--url https://example.com/sdk --username pubs --password ***
posted @ 2013-07-31 18:41 brock 阅读(881) | 评论 (0)编辑 收藏

BIND-DLZ实验:http://bind-dlz.sourceforge.net/
实验环境:RHEL4,BIND-9.5.0-P2.tar.gz(9.4.0以上版本都已含DLZ补丁),Mysql-5.0.56.tar.gz
1、安装mysql(先安装gcc等相关软件包)
   #tar zxvf mysql-5.0.56.tar.gz 
   #cd mysql-5.0.56
   #./configure --prefix=/usr/local/mysql --localstatedir=/usr/loal/mysql/data --   libexecdir=/usr/local/mysql/lib --disable-shared
   #make
   #make install
   #cd /usr/local/mysql/
   #groupadd -g 1003 mysql
   #useradd -g 1003 mysql
   #chown -R mysql .
   #chgrp -R mysql .
   #chown -R mysql lib
   #./bin/mysql_install_db --user=mysql //以mysql的用户身份安装
   #chown -R root .
   #./bin/mysqld_safe --user=mysql & //在后台启动mysql

# cd /root/mysql-5.0.56
# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod 700 !$
# chkconfig --add mysqld
# chkconfig --list mysqld
  mysqld 1:off 2:on 3:on 4:on 5:on 6:off
# service mysqld start[restart/reload/stop]
# vi /etc/my.cnf
 add this:(
防止mysql服务器无查询后8小时自动重连)
wait_timeout = 86400

interactive_timeout = 86400

   #/usr/local/mysql/bin/mysqladmin -uroot password 'aptech'
   #./bin/mysql -uroot -paptech
   #echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
   #. !$
  
2、安装bind
   #tar zxvf bind-9.5.0-P2.tar.gz 
   #cd bind-9.5.0-P2
   #./configure --prefix=/usr/local/bind9 --with-dlz-mysql=/usr/local/mysql --enable-threads=no
   //--with-dlz-mysql=/usr/local/mysql 要求bind安装中支持DLZ
   //--enable-threads=no 关闭多线程 
   //--disable-openssl-version-check 禁止openssl版本的检查
   #make
   #make install

3、创建database,table
   create database mydata;
   use mydata;
   create table other_dns_records(
   zone varchar(255),
   host varchar(255),
   type varchar(255),
   data varchar(255),
   ttl int(11),
   mx_priority varchar(255), 
   refresh int(11),
   retry int(11),
   expire int(11),
   minimum int(11),
   serial bigint(11),
   resp_person varchar(255), 
   primary_ns varchar(255));
 
   create table cnc_dns_records(
   host varchar(255),
   type varchar(255),
   data varchar(255),
   ttl int(11),
   mx_priority varchar(255), 
   refresh int(11),
   retry int(11),
   expire int(11),
   minimum int(11),
   serial bigint(11),
   resp_person varchar(255), 
   primary_ns varchar(255));
  
   insert other_dns_records(zone,host,type,data,ttl,retry)
   values('aaa.com','www','A','192.168.199.2','86400','13');
   insert cnc_dns_records(zone,host,type,data,ttl,retry)
   values('bbb.com','www','A','192.55.199.199','86400','13');
4、编辑/usr/local/bind9/etc/named.conf
   #cd /usr/local/bind9/etc
   #../sbin/rndc-confgen -a
   #../sbin/rndc-confgen > named.conf
   #vi !$   //vi named.conf
   #less named.conf
 # Use with the following in named.conf, adjusting the allow list as needed:
 key "rndc-key" {
        algorithm hmac-md5;
        secret "c4aUV+N7GbOF773V+/LnAA==";
 };
 
 controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
 };
# End of named.conf
options {
directory "/usr/local/bind9/etc/";
pid-file "/usr/local/bind9/var/run/named.pid";
allow-query { any; };
recursion no;
version "gaint-d1";
};
include "/usr/local/bind9/etc/cnc.cl";
include "/usr/local/bind9/etc/other.cl";
view "cnc-user" {
match-clients { cnc; };
dlz "Mysql zone" {
database "mysql
{host=localhost dbname=mydata ssl=false port=3306 user=root pass=aptech}
{select zone from cnc_dns_records where zone = '%zone%'}
{select ttl, type, mx_priority, case when lower(type)='txt' then concat('/"', data, 
'/"')
when lower(type) = 'soa' then concat_ws('
', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from
cnc_dns_records where zone = '%zone%' and host = '%record%'}";
};
};
view "other-user" {
match-clients { other; };
dlz "Mysql zone" {
database "mysql
{host=localhost dbname=mydata ssl=false port=3306 user=root pass=aptech}
{select zone from other_dns_records where zone='%zone%'}
{select ttl, type, mx_priority, case when lower(type) = 'txt' then concat('/"', data, 
'/"')
when lower(type)='soa' then concat_ws('
', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from
other_dns_records where zone = '%zone%' and host = '%record%'}";
};
};
[root@dlz etc]# less cnc.cl 
acl "cnc"{
192.168.9.0/24;
};
[root@dlz etc]# less other.cl 
acl "other" {
127.0.0.0/18;
};
 
5、启动&测试
[root@dlz ~]# /usr/local/bind9/sbin/named -gc  /usr/local/bind9/etc/named.conf
06-Mar-2009 22:23:02.569 starting BIND 9.5.0-P2 -gc /usr/local/bind9/etc/named.conf
06-Mar-2009 22:23:02.579 loading configuration from '/usr/local/bind9/etc/named.conf'
06-Mar-2009 22:23:02.583 listening on IPv4 interface lo, 127.0.0.1#53
06-Mar-2009 22:23:02.586 listening on IPv4 interface eth0, 192.168.1.5#53
06-Mar-2009 22:23:02.588 Loading 'Mysql zone' using driver mysql
06-Mar-2009 22:23:02.604 default max-cache-size (33554432) applies: view cnc-user
06-Mar-2009 22:23:02.609 Loading 'Mysql zone' using driver mysql
06-Mar-2009 22:23:02.612 default max-cache-size (33554432) applies: view other-user
06-Mar-2009 22:23:02.616 default max-cache-size (33554432) applies: view _bind
06-Mar-2009 22:23:02.621 command channel listening on 127.0.0.1#953
06-Mar-2009 22:23:02.621 ignoring config file logging statement due to -g option
06-Mar-2009 22:23:02.623 running
posted @ 2013-07-31 18:40 brock 阅读(335) | 评论 (0)编辑 收藏

     摘要: Spring的事务管理难点剖析(7):数据连接泄漏底层连接资源的访问问题    对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇。只要你开发的应用存在数据连接泄漏的问题,应用程序最终都将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的崩溃。数据连接泄漏像一个黑洞那样让开发者避之唯恐不及。    Spring DAO对所有支持的数据访...  阅读全文
posted @ 2013-05-29 09:53 brock 阅读(1004) | 评论 (0)编辑 收藏

症状:系统运行了一段时间报错:java.sql.SQLException: ORA-01000: 超出打开游标的最大数

step 1:
    查看数据库当前的游标数配置slqplus:show parameter open_cursors;

step 2:
    查看游标使用情况:
select o.sid, osuser, machine, count(*) num_curs
from v$open_cursor o, v$session s
where user_name = 'user' and o.sid=s.sid
group by o.sid, osuser, machine
order by  num_curs desc;
此处的user_name='user'中,user代表占用数据库资源的数据库用户名.

step 3:
    查看游标执行的sql情况:

select o.sid q.sql_text
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid = 123;

step 4:
    根据游标占用情况分析访问数据库的程序在资源释放上是否正常,如果程序释放资源没有问题,则加大游标数。
    alter system set open_cursors=2000 scope=both;
    
    补充:在java代码中,执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
     一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭,调用close()方法。

posted @ 2013-05-29 09:53 brock 阅读(183) | 评论 (0)编辑 收藏

     摘要: http://vc.hsly0559.cn/c/20111216_957.html首先,马云坑到了很多钱。。。所以确实有一批大神在为他干活  其次,现在阿里系出来又是出书又是演讲跳大神装B。。不是牛人。。给我的感觉。。跳梁小丑一样,给后端的牛人抹黑,我实在看不习惯  第三,最近关于Tengine的讨论很火,简单看了下,在大流量下确实表现不错,而且据说可以过滤掉一些攻击或类似攻击流量,这是其宣称的特...  阅读全文
posted @ 2013-05-16 16:54 brock 阅读(315) | 评论 (0)编辑 收藏

1 做产品经理,而不是功能经理;

2 做产品需求,而不是用户需求;

要锦上添花,而不是画蛇添足;

追求人性化,而不是追求完美。

 

产品经理是个很奇怪的岗位,好像大多数人都能做,因为每个人对某个产品都有自己的看法,都能提出一些意见和想法,甚至能设计实现原理;也好像大多数人都做不好产品经理,因为互联网上成千上万个产品,大部分是垃圾,没几个产品是用户真心觉得很不错的。

 

我做产品经理,还不到两年,以前十来年一直在做技术。之前做技术的时候,我很看不上产品经理。当时想:产品经理自己什么都实现不了,每天就是提点想法,而且想法还经常不靠谱,如果哪天裁员,产品经理的位置最危险了;但等我转来做了产品经理,想法发生了根本的变化:嗯,产品经理太重要的,一个产品的未来就决定在产品经理身上。

 

你问我现在如何看待技术人员?嘿嘿,我现在觉得,技术就是一把刀,让它杀谁就杀谁!当然,这只是开玩笑。一个好的技术团队对于产品经理来说,那是相当重要。

 

对如何做产品经理,我还真的是小学生,自己负责的淘宝搜索最近两年也没什么大提升。特别是看了周鸿祎、张小龙关于对产品的一些访谈以后,我更发现自己在这方面的差距。

 

不过我有个优点,就是善于学习、思考、总结并分享。而且作为一个外行进入到这个领域,观察的角度也会不一样。这一年多下来,也找到一些感觉,发现周围的一些产品经理,容易走入一些误区,分享给大家。

 

做产品经理,而不是功能经理。

 

这句话我最早是听天猫总裁逍遥子说的,当时没有感觉,现在发现非常有道理,因为周围太多的产品经理实际上是在做一名功能经理。

 

他们只是不停的在接产品功能需求,然后不停实现产品功能。缺登录,设计一个登录框;没有数据,找某个平台打通一下;管理不方便,设计一个工具来管理;页面不美观,重新规划一下页面结构……

 

功能经理,每天都很忙,关注还有多少需求在后面排队,需求方是否得到满足。而用户体验到底如何,功能是否真的真有价值,是否可以更加完美,功能经理很少关心。当有人抱怨某个功能不爽的时候,他会说:

这个功能我已经有了啊,你说体验不太好?没办法,工程师资源太紧张啊,你说为啥设计的这么别扭?kao,想起来就来气,大老板非要求这样啊,我们也只能这样设计,没办法!

 

他经常表达的语气是他也不得已而为之,把责任都推到其他人身上。

 

然而做一个合格的产品经理,需要关注用户的体验,真正关注用户的反馈,关注数据的质量,关注每一个细节。就像买一双鞋一样,不只是能穿,还要考虑是否合脚,是否舒服,款式是否漂亮。

 

有一次开会,淘宝的总裁语嫣姐姐说了一句很朴素但很有道理的一句话:产品能用和好用完全不是一回事!

 

(大家不用批评淘宝搜索啊,我知道很多地方还不好用。大家再给我点时间,我也认识到这个问题不是......)

 

实现产品需求,而不是用户需求。

 

这个话题很有意思。当你问用户需要什么的时候,他会回答他需要一匹更快的马。乔布斯说,永远不要问用户想要什么!因为用户都是傻瓜,不知道自己想要什么。

 

这其实是产品经理经常把用户需求当成产品需求。对所有用户说的,他们没错,提的都是自己的期望,不是一个产品需求。前些天有张小龙的采访,张小龙说他不看用户的数据。其实张小龙很关心用户的需求,我和张小龙在一个群里,如果有人在群里提一些微信使用不爽的功能,张小龙会很快给出反馈。

 

这些产品大神们,背后的意思是,不应该简单满足用户需求,而应该思考把用户需求提炼成产品需求。当一个产品的用户有上百万上千万的时候,产品需求的理解和提炼,就相当重要。

 

这个道理比较容易理解,不做多解释。

 

要锦上添花,而不是画蛇添足。

 

互联网的发展,让很多互联网产品经理有个惯性:做产品迭代要快。快速上线,快速修改。这里也有误区,对于一些基本功能,确实要快速上线,快速迭代。因为有市场竞争,需要快速切入市场,获得用户。然而大部分的产品经理,没有机会从零开始设计一个新产品,大部分时候在现有的产品上做升级或优化。这时设计的很多功能,都是锦上添花的功能,还真不能太快。

 

锦上添花的功能,同样重要,会让产品更好玩,更有意思,更有特点。例如微信最早设计的摇一摇功能、朋友圈功能。微博的微刊功能、之前的送礼物的功能。

 

问题在于,锦上添花,添上去的一定是一朵花,说得俗一点,不能添上去是一坨屎。如果是后者,那么就有点画蛇添足了,或者成了鸡肋功能。

 

什么是一朵花?就是功能添加上去以后,会让用户眼前一亮。给人有“哇!!!”的感觉……

 

遗憾的是淘宝搜索之前的很多功能添上去的都不是一朵花,上线了太多的画蛇添足的功能。这些功能一旦上线,就很难下线。因为当你产品的用户群有上亿的时候,再烂的一个功能,每天也会有几十万用户在使用。一旦你下线,会有很多人很不爽。

 

淘宝搜索的同店购就有点这个味道。技术实现成本高,体验一般,用的人也不多。有一段时间我们把这个功能隐藏起来了,有人在微博上说:

妈的,我现在最想做的事情,就是找把刀杀个淘宝搜索的产品经理来解解恨,我居然死活找不到我最常用的同店购了!

 

画蛇添足的功能越多,让产品背负的垃圾就越多,造成好的功能没有资源做,差的功能又无法下线。

 

追求人性化,而不是追求完美。

 

很多产品经理,追求完美。这是作为产品经理很好的品质,然而,有一点却经常被产品经理忽视,产品的人性化。

 

永远没有完美的产品,特别是当一个产品的用户量到达上百万上千万的时候。用户的喜好千差万别。如何让用户能喜欢产品的优点的同时能容忍产品的缺点?

 

大家看选美大赛获胜的美女,经常会有感叹,为什么这么丑还能得前三啊!是因为评委的口味太特别?当然有一部分评委原因,但更多原因在于,大家每个人的审美观不一样。大家是把选美冠军作为一个完美的人来评判。

 

实际上,无论选出谁是冠军,都会有人觉得难看。任何一个产品,无论产品经理推出多么好用的功能,都会有人不喜欢!

 

然而,大家对待周围的朋友,就不会用选美的标准要求他们,他们有明显的缺点,但也有很多值得欣赏的地方。大家订阅鬼脚七的微信,绝大部分人不会期望,鬼脚七每天的文章都会符合自己的口味。有人不看文章,只看看【7哥闲谈】也会觉得很有意思。为什么?因为大家不会期待鬼脚七这个账号是个完美的账号,把鬼脚七作为一个朋友在看待。鬼脚七有缺点,也有优点。

 

如果能让用户把我们的产品当成周围的朋友来看待呢?感觉会完全不一样。

 

淘宝有个做运营的同事有一天跟我感叹说:我忽然觉得攻城狮们离我好近,每个攻城狮内心都住着个诗人!我问为什么会忽然有这种感觉?她说有一天晚上,发现在淘宝内部一个TMS系统的标题栏上忽然多了一句话:

每个人的压力,少部分来自生存,大部分来自攀比。

 

就这一句话,让用户感觉到了产品背后的那位工程师。还记得微信有个版本的欢迎页面上的文字吗:

少发微信,多和朋友见见面!

 

就这一句话,让我感觉到产品背后的那群人的心理活动。微信的一些小瑕疵,我也能容忍。

 

就是这句话,我喜欢上了微信。

 

人性化,是不是让产品开始具有了灵魂?

 

如何让产品更加人性化?如何让淘宝搜索更加人性化?是我最近一直在思考的问题。我定义2013年搜索的关键词:专业和有趣。希望2013年能让更多的人把淘宝搜索当成一个朋友,而不是一个工具。

 

写了这么多,回头看看我这篇文章,好像没有什么产品设计方法,只是一些思考,仅此而已。

 

作者介绍:

鬼脚七,一个简单的人,分享电商资讯、搜索变化、淘宝动态、产品设计、管理心得、生活感悟;偶尔文艺,偶尔深沉。做一个有思想的人!微信账号: taobaoguijiaoqi 加为好友后回复 m 可以看到作者之前的所有文章。

posted @ 2013-03-22 11:16 brock| 编辑 收藏

1、匿名函数

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。

1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式

第一种:这也是最常规的一种

function double(x){     return 2 * x;    } 

第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。

var double = new Function('x', 'return 2 * x;'); 

第三种:

var double = function(x) {
return 2* x;
}

注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量square。

1.2 匿名函数的创建

第一种方式:就是上面所讲的定义square函数,这也是最常用的方式之一。

第二种方式:

(function(x, y){
alert(x + y);
})(2, 3);

这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。

2、闭包

闭包的英文单词是closure,这是JavaScript中非常重要的一部分知识,因为使用闭包可以大大减少我们的代码量,使我们的代码看上去更加清晰等等,总之功能十分强大。

闭包的含义:闭包说白了就是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕(这点涉及JavaScript作用域链)。

示例一

function checkClosure(){     var str = 'rain-man';     setTimeout(         function(){ alert(str); } //这是一个匿名函数     , 2000); } checkClosure(); 

这个例子看上去十分的简单,仔细分析下它的执行过程还是有许多知识点的:checkClosure函数的执行是瞬间的(也许用时只是0.00001毫秒),在checkClosure的函数体内创建了一个变量str,在checkClosure执行完毕之后str并没有被释放,这是因为setTimeout内的匿名函数存在这对str的引用。待到2秒后函数体内的匿名函数被执行完毕,str才被释放。

示例二,优化代码

function forTimeout(x, y){
alert(x + y); } function delay(x , y , time){
setTimeout('forTimeout(' + x + ',' + y + ')' , time);
} /** * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰 *
function delay(x , y , time){ *
setTimeout( *
function(){ *
forTimeout(x , y) *
} * , time);
* }
*/

3、举例

匿名函数最大的用途是创建闭包(这是JavaScript语言的特性之一),并且还可以构建命名空间,以减少全局变量的使用。

示例三:

var oEvent = {}; (function(){      var addEvent = function(){ /*代码的实现省略了*/ };     function removeEvent(){}      oEvent.addEvent = addEvent;     oEvent.removeEvent = removeEvent; })(); 

在这段代码中函数addEvent和removeEvent都是局部变量,但我们可以通过全局变量oEvent使用它,这就大大减少了全局变量的使用,增强了网页的安全性。 我们要想使用此段代码:oEvent.addEvent(document.getElementById('box') , 'click' , function(){});

示例四:

var rainman = (function(x , y){     return x + y; })(2 , 3); /**  * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。  * var rainman = function(x , y){  *    return x + y;  * }(2 , 3);  */ 

在这里我们创建了一个变量rainman,并通过直接调用匿名函数初始化为5,这种小技巧有时十分实用。

示例五:

var outer = null;  (function(){     var one = 1;     function inner (){         one += 1;         alert(one);     }     outer = inner; })();  outer();    //2 outer();    //3 outer();    //4 

这段代码中的变量one是一个局部变量(因为它被定义在一个函数之内),因此外部是不可以访问的。但是这里我们创建了inner函数,inner函数是可以访问变量one的;又将全局变量outer引用了inner,所以三次调用outer会弹出递增的结果。

4、注意

4.1 闭包允许内层函数引用父函数中的变量,但是该变量是最终值

示例六:

/**  * <body>  * <ul>  *     <li>one</li>  *     <li>two</li>  *     <li>three</li>  *     <li>one</li>  * </ul>  */  var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){     lists[ i ].onmouseover = function(){         alert(i);         }; } 

你会发现当鼠标移过每一个<li&rt;元素时,总是弹出4,而不是我们期待的元素下标。这是为什么呢?注意事项里已经讲了(最终值)。显然这种解释过于简单,当mouseover事件调用监听函数时,首先在匿名函数( function(){ alert(i); })内部查找是否定义了 i,结果是没有定义;因此它会向上查找,查找结果是已经定义了,并且i的值是4(循环后的i值);所以,最终每次弹出的都是4。

解决方法一:

var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){     (function(index){         lists[ index ].onmouseover = function(){             alert(index);             };                         })(i); } 

解决方法二:

var lists = document.getElementsByTagName('li'); for(var i = 0, len = lists.length; i < len; i++){     lists[ i ].$$index = i;    //通过在Dom元素上绑定$$index属性记录下标     lists[ i ].onmouseover = function(){         alert(this.$$index);         }; } 

解决方法三:

function eventListener(list, index){     list.onmouseover = function(){         alert(index);     }; } var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){     eventListener(lists[ i ] , i); } 

4.2 内存泄露

使用闭包十分容易造成浏览器的内存泄露,严重情况下会是浏览器挂死,感兴趣的的话可以参考:http://www.cnblogs.com/rainman/archive/2009/03/07/1405624.html

http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html

posted @ 2013-03-20 10:00 brock 阅读(215) | 评论 (0)编辑 收藏

基本规范

语义

使用符合语义的标签书写 HTML 文档, 选择恰当的元素表达所需的含义;

<!-- 不推荐 --> <div onclick="goToRecommendations();">All recommendations</div> 
<!-- 推荐 --> <a href="recommendations/">All recommendations</a> 

大小写

元素的标签和属性名必须小写, 属性值必须加双引号; 例如

<!-- 不推荐 --> <A HREF='/'>Home</A> 
<!-- 推荐 --> <a href="/">Home</a> 

缩进

  • 使用四个空格来表示缩进,不要使用 tab 键;
  • 在块状元素,列表,表格元素后面使用新行,并且对它的子元素进行缩进.

例如

<ul>     <li>         1     </li> </ul> 

空格

去除比不必要的空格; 例如

<!-- 不推荐 --> <p>test                  </p> 
<!-- 推荐 --> <p>test</p> 

嵌套

  • 元素嵌套遵循 (X)HTML Strict 嵌套规则, 推荐使用Firefox插件 HTML Validator 进行检查;
  • 正确区分自闭合元素和非自闭合元素. 非法闭合包括:<br>..</br>、<script />、<iframe />, 非法闭合会导致页面嵌套错误问题;
<!-- 不推荐 --> <title>Test</title> <article>This is only a test. 
<!-- 推荐 --> <!DOCTYPE html> <meta charset="utf-8"> <title>Test</title> <article>This is only a test.</article> 

引号

使用双引号来标识 html 的属性; 例如

<!-- 不推荐 --> <a class='maia-button maia-button-secondary'>Sign in</a> 
<!-- 推荐 --> <a class="maia-button maia-button-secondary">Sign in</a> 

自定义属性

通过给元素设置自定义属性来存放与 JavaScript 交互的数据, 属性名格式为 data-xx (例如:data-lazyload-url)

DOCTYPE

页面文档类型统一使用HTML5 DOCTYPE. 代码如下:

<!doctype html> 

编码

声明方法遵循HTML5的规范.推荐使用 utf-8 编码.

<meta charset="utf-8" /> 

注释

建议对超过10行的页面模块进行注释, 以降低开发人员的嵌套成本和后期的维护成本. 例如:

<div id="sample">     ... </div> <!-- #sample END --> 
<div class="sample">     ... </div> <!-- .sample END --> 

协议

如果链接和当前页面一致则忽略链接的协议部分,例如

<!-- 不推荐 --> <script src="http://www.taobao.com/fp.js"></script> 
<!-- 推荐 --> <script src="//www.taobao.com/fp.js"></script> 
/* 不推荐 */ .example {   background: url(http://www.taobao.com/fp.css); } 
/* 推荐 */ .example {   background: url(//www.taobao.com/fp.css); } 

TODO

  • 使用 TODO 来标记待做事情,便于后期搜索.
  • 在 TODO 后添加 (姓名或邮件) 来表示分类.

例如

<!-- TODO(yiminghe): remove duplicate tag --> <p><span>2</span></p> 

焦点分离

  • 将表现,行为和结构分离:不要在 html 和模板中加入除了结构以外的东西.
  • 在文档中引入尽可能少的样式和脚本
<!-- 不推荐 --> <!DOCTYPE html> <title>HTML sucks</title> <link rel="stylesheet" href="base.css" media="screen"> <link rel="stylesheet" href="grid.css" media="screen"> <link rel="stylesheet" href="print.css" media="print"> <h1 style="font-size: 1em;">HTML sucks</h1> <p>I’ve read about this on a few sites but now I’m sure:   <u>HTML is stupid!!1</u> <center>I can’t believe there’s no way to control the styling of   my website without doing everything all over again!</center> 
<!-- 推荐 --> <!DOCTYPE html> <title>My first CSS-only redesign</title> <link rel="stylesheet" href="default.css"> <h1>My first CSS-only redesign</h1> <p>I’ve read about this on a few sites but today I’m actually   doing it: separating concerns and avoiding anything in the HTML of   my website that is presentational. <p>It’s awesome! 

元素

结构性元素

  • p 表示段落. 只能包含内联元素, 不能包含块级元素;
  • div 本身无特殊含义, 可用于布局. 几乎可以包含任何元素;
  • br 表示换行符;
  • hr 表示水平分割线;
  • h1-h6 表示标题. 其中 h1 用于表示当前页面最重要的内容的标题;
  • blockquote 表示引用, 可以包含多个段落. 请勿纯粹为了缩进而使用 blockquote, 大部分浏览器默认将 blockquote 渲染为带有左右缩进;
  • pre 表示一段格式化好的文本;

头部元素

  • title 每个页面必须有且仅有一个 title 元素;
  • base 可用场景:首页、频道等大部分链接都为新窗口打开的页面;
  • link link 用于引入 css 资源时, 可省去 media(默认为all) 和 type(默认为text/css) 属性;
  • style type 默认为 text/css, 可以省去;
  • script type 属性可以省去; 不赞成使用lang属性; 不要使用古老的<!– //–>这种hack脚本, 它用于阻止第一代浏览器(Netscape 1和Mosaic)将脚本显示成文字;
<!-- 不推荐 --> <link rel="stylesheet" href="//www.google.com/css/maia.css"   type="text/css">  <!-- 不推荐 --> <script src="//www.google.com/js/gweb/analytics/autotrack.js"   type="text/javascript"></script> 
<!-- 推荐 --> <link rel="stylesheet" href="//www.google.com/css/maia.css">  <!-- 推荐 --> <script src="//www.google.com/js/gweb/analytics/autotrack.js"></script> 
  • noscript 在用户代理不支持 JavaScript 的情况下提供说明;

文本元素

  • a a 存在 href 属性时表示链接, 无 href 属性但有 name 属性表示锚点;
  • em,strong em 表示句意强调, 加与不加会引起语义变化, 可用于表示不同的心情或语调; strong 表示重要性强调, 可用于局部或全局, strong强调的是重要性, 不会改变句意;
  • abbr 表示缩写;
  • sub,sup 主要用于数学和化学公式, sup还可用于脚注;
  • span 本身无特殊含义;
  • ins,del 分别表示从文档中增加(插入)和删除

媒体元素

  • img 请勿将img元素作为定位布局的工具, 不要用他显示空白图片; 给img元素增加alt属性;例如
<!-- 不推荐 --> <img src="spreadsheet.png"> 
<!-- 推荐 --> <img src="spreadsheet.png" alt="Spreadsheet screenshot."> 
  • object 可以用来插入Flash;

列表元素

  • dl 表示关联列表, dd是对dt的解释; dt和dd的对应关系比较随意: 一个dt对应多个dd、多个dt对应一个dd、多个dt对应多个dd, 都合法; 可用于名词/单词解释、日程列表、站点目录;
  • ul 表示无序列表;
  • ol 表示有序列表, 可用于排行榜等;
  • li 表示列表项, 必须是ul/ol的子元素;

表单元素

  • 推荐使用 button 代替 input, 但必须声明 type;
  • 推荐使用 fieldset, legend 组织表单
  • 表单元素的 name 不能设定为 action, enctype, method, novalidate, target, submit 会导致表单提交混乱

文档模板

<!doctype html> <html>     <head>         <meta charset="utf-8" />         <title>Sample page</title>         <link rel="stylesheet" href="css_example_url" />     </head>     <body>         <div id="page">             <div id="header">                 页头             </div>             <div id="content">                 主体             </div>             <div id="footer">                 页尾             </div>         </div>         <script src="js_example_url"></script>         <script>         // 你的代码         </script>     </body> </html> 
posted @ 2013-03-11 17:31 brock 阅读(2446) | 评论 (0)编辑 收藏

     摘要: Google JavaScript 编码规范指南修订版: 2.9Aaron WhyteBob JervisDan PupiusEric ArvidssonFritz SchneiderRobby Walker每个条目都有概述信息, 点击 ▽ 查看详细的内容. 你也可以点击下面的按钮▽ 展开全部目录JavaScript 语言规范变量 常...  阅读全文
posted @ 2013-03-11 15:24 brock 阅读(3052) | 评论 (0)编辑 收藏