﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h2&gt;&lt;font color="green"&gt;生命科学领域的专业信息解决方案！&lt;/font&gt;&lt;/h2&gt;-随笔分类-Java</title><link>http://www.blogjava.net/rain1102/category/37642.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;化学结构搜索，化学信息学，生物信息学，实验室信息学等
。&lt;/font&gt;&lt;br/&gt;&lt;font color="#3C1435"&gt;以高科技的生物、化学信息技术实现生命科学领域中专业数据的计算和管理、提高研发能力、增强在科研和成本效率方面的国际竞争力，为生物、化学、医药和学术机构提供一流的解决方案和技术咨询。&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;&lt;br/&gt;
</description><language>zh-cn</language><lastBuildDate>Tue, 26 Jul 2011 01:49:12 GMT</lastBuildDate><pubDate>Tue, 26 Jul 2011 01:49:12 GMT</pubDate><ttl>60</ttl><item><title>利用JPG图片生成高质量的缩略图</title><link>http://www.blogjava.net/rain1102/archive/2011/07/26/355029.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 26 Jul 2011 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/07/26/355029.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/355029.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/07/26/355029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/355029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/355029.html</trackback:ping><description><![CDATA[<p><span style="color: #003300">如果给出缩略图的宽度和高度，那么就会根据给出的宽度和高度生产缩略图，如果只给出宽度或者高度值，那么就会根据比例生成缩略图。</span><br />package com.founder.common.utils;</p>
<p>import java.awt.image.BufferedImage;<br />import java.io.File;<br />import javax.imageio.ImageIO;</p>
<p>//生成等比例高质量缩略图<br />public class ThumbnailUtil {<br />&nbsp;private static int width;<br />&nbsp;private static int height;<br />&nbsp;private static int scaleWidth;<br />&nbsp;static double support = (double) 3.0;<br />&nbsp;static double PI = (double) 3.14159265358978;<br />&nbsp;static double[] contrib;<br />&nbsp;static double[] normContrib;<br />&nbsp;static double[] tmpContrib;<br />&nbsp;static int startContrib, stopContrib;<br />&nbsp;static int nDots;<br />&nbsp;static int nHalfDots;</p>
<p>&nbsp;public static void saveImage(String fromFileStr, String saveToFileStr, int formatWidth, int formatHeight) throws Exception {<br />&nbsp;&nbsp;File saveFile = new File(saveToFileStr);<br />&nbsp;&nbsp;File fromFile = new File(fromFileStr);<br />&nbsp;&nbsp;saveImage(fromFile, saveFile, formatWidth, formatHeight);<br />&nbsp;}<br />&nbsp;<br />&nbsp;public static void saveImage(File fromFile&nbsp; , File saveFile, int formatWidth, int formatHeight) throws Exception {<br />&nbsp;&nbsp;BufferedImage srcImage;<br />&nbsp;&nbsp;srcImage = javax.imageio.ImageIO.read(fromFile); // construct image<br />&nbsp;&nbsp;int imageWidth = srcImage.getWidth(null);<br />&nbsp;&nbsp;int imageHeight = srcImage.getHeight(null);<br />&nbsp;&nbsp;int changeToWidth = 0;<br />&nbsp;&nbsp;int changeToHeight = 0;<br />&nbsp;&nbsp;if (formatWidth &gt; 0 &amp;&amp; formatHeight &gt; 0) {<br />&nbsp;&nbsp;&nbsp;changeToWidth = formatWidth;<br />&nbsp;&nbsp;&nbsp;changeToHeight = formatHeight;<br />&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;if (imageWidth &gt; 0 &amp;&amp; imageHeight &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;if (imageWidth / imageHeight &gt;= formatWidth / formatHeight) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (imageWidth &gt; formatWidth) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToWidth = formatWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToHeight = (imageHeight * formatWidth) / imageWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToWidth = imageWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToHeight = imageHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (imageHeight &gt; formatHeight) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToHeight = formatHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToWidth = (imageWidth * formatHeight) / imageHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToWidth = imageWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeToHeight = imageHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;srcImage = imageZoomOut(srcImage, changeToWidth, changeToHeight);<br />&nbsp;&nbsp;ImageIO.write(srcImage, "JPEG", saveFile);<br />&nbsp;}</p>
<p>&nbsp;public static BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w, int h) {<br />&nbsp;&nbsp;width = srcBufferImage.getWidth();<br />&nbsp;&nbsp;height = srcBufferImage.getHeight();<br />&nbsp;&nbsp;scaleWidth = w;</p>
<p>&nbsp;&nbsp;if (DetermineResultSize(w, h) == 1) {<br />&nbsp;&nbsp;&nbsp;return srcBufferImage;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;CalContrib();<br />&nbsp;&nbsp;BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w);<br />&nbsp;&nbsp;BufferedImage pbFinalOut = VerticalFiltering(pbOut, h);<br />&nbsp;&nbsp;return pbFinalOut;<br />&nbsp;}</p>
<p>&nbsp;/**<br />&nbsp; * 决定图像尺寸<br />&nbsp; */<br />&nbsp;private static int DetermineResultSize(int w, int h) {<br />&nbsp;&nbsp;double scaleH, scaleV;<br />&nbsp;&nbsp;scaleH = (double) w / (double) width;<br />&nbsp;&nbsp;scaleV = (double) h / (double) height;<br />&nbsp;&nbsp;// 需要判断一下scaleH，scaleV，不做放大操作<br />&nbsp;&nbsp;if (scaleH &gt;= 1.0 &amp;&amp; scaleV &gt;= 1.0) {<br />&nbsp;&nbsp;&nbsp;return 1;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return 0;</p>
<p>&nbsp;}</p>
<p>&nbsp;private static double Lanczos(int i, int inWidth, int outWidth, double Support) {<br />&nbsp;&nbsp;double x;</p>
<p>&nbsp;&nbsp;x = (double) i * (double) outWidth / (double) inWidth;</p>
<p>&nbsp;&nbsp;return Math.sin(x * PI) / (x * PI) * Math.sin(x * PI / Support)<br />&nbsp;&nbsp;&nbsp;&nbsp;/ (x * PI / Support);</p>
<p>&nbsp;}</p>
<p>&nbsp;private static void CalContrib() {<br />&nbsp;&nbsp;nHalfDots = (int) ((double) width * support / (double) scaleWidth);<br />&nbsp;&nbsp;nDots = nHalfDots * 2 + 1;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;contrib = new double[nDots];<br />&nbsp;&nbsp;&nbsp;normContrib = new double[nDots];<br />&nbsp;&nbsp;&nbsp;tmpContrib = new double[nDots];<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;System.out.println("init contrib,normContrib,tmpContrib" + e);<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;int center = nHalfDots;<br />&nbsp;&nbsp;contrib[center] = 1.0;</p>
<p>&nbsp;&nbsp;double weight = 0.0;<br />&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;for (i = 1; i &lt;= center; i++) {<br />&nbsp;&nbsp;&nbsp;contrib[center + i] = Lanczos(i, width, scaleWidth, support);<br />&nbsp;&nbsp;&nbsp;weight += contrib[center + i];<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;for (i = center - 1; i &gt;= 0; i--) {<br />&nbsp;&nbsp;&nbsp;contrib[i] = contrib[center * 2 - i];<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;weight = weight * 2 + 1.0;</p>
<p>&nbsp;&nbsp;for (i = 0; i &lt;= center; i++) {<br />&nbsp;&nbsp;&nbsp;normContrib[i] = contrib[i] / weight;<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;for (i = center + 1; i &lt; nDots; i++) {<br />&nbsp;&nbsp;&nbsp;normContrib[i] = normContrib[center * 2 - i];<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>&nbsp;// 处理边缘<br />&nbsp;private static void CalTempContrib(int start, int stop) {<br />&nbsp;&nbsp;double weight = 0;</p>
<p>&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;for (i = start; i &lt;= stop; i++) {<br />&nbsp;&nbsp;&nbsp;weight += contrib[i];<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;for (i = start; i &lt;= stop; i++) {<br />&nbsp;&nbsp;&nbsp;tmpContrib[i] = contrib[i] / weight;<br />&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>&nbsp;private static int GetRedValue(int rgbValue) {<br />&nbsp;&nbsp;int temp = rgbValue &amp; 0x00ff0000;<br />&nbsp;&nbsp;return temp &gt;&gt; 16;<br />&nbsp;}</p>
<p>&nbsp;private static int GetGreenValue(int rgbValue) {<br />&nbsp;&nbsp;int temp = rgbValue &amp; 0x0000ff00;<br />&nbsp;&nbsp;return temp &gt;&gt; 8;<br />&nbsp;}</p>
<p>&nbsp;private static int GetBlueValue(int rgbValue) {<br />&nbsp;&nbsp;return rgbValue &amp; 0x000000ff;<br />&nbsp;}</p>
<p>&nbsp;private static int ComRGB(int redValue, int greenValue, int blueValue) {</p>
<p>&nbsp;&nbsp;return (redValue &lt;&lt; 16) + (greenValue &lt;&lt; 8) + blueValue;<br />&nbsp;}</p>
<p>&nbsp;// 行水平滤波<br />&nbsp;private static int HorizontalFilter(BufferedImage bufImg, int startX, int stopX,<br />&nbsp;&nbsp;&nbsp;int start, int stop, int y, double[] pContrib) {<br />&nbsp;&nbsp;double valueRed = 0.0;<br />&nbsp;&nbsp;double valueGreen = 0.0;<br />&nbsp;&nbsp;double valueBlue = 0.0;<br />&nbsp;&nbsp;int valueRGB = 0;<br />&nbsp;&nbsp;int i, j;</p>
<p>&nbsp;&nbsp;for (i = startX, j = start; i &lt;= stopX; i++, j++) {<br />&nbsp;&nbsp;&nbsp;valueRGB = bufImg.getRGB(i, y);</p>
<p>&nbsp;&nbsp;&nbsp;valueRed += GetRedValue(valueRGB) * pContrib[j];<br />&nbsp;&nbsp;&nbsp;valueGreen += GetGreenValue(valueRGB) * pContrib[j];<br />&nbsp;&nbsp;&nbsp;valueBlue += GetBlueValue(valueRGB) * pContrib[j];<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),<br />&nbsp;&nbsp;&nbsp;&nbsp;Clip((int) valueBlue));<br />&nbsp;&nbsp;return valueRGB;</p>
<p>&nbsp;}</p>
<p>&nbsp;// 图片水平滤波<br />&nbsp;private static BufferedImage HorizontalFiltering(BufferedImage bufImage, int iOutW) {<br />&nbsp;&nbsp;int dwInW = bufImage.getWidth();<br />&nbsp;&nbsp;int dwInH = bufImage.getHeight();<br />&nbsp;&nbsp;int value = 0;<br />&nbsp;&nbsp;BufferedImage pbOut = new BufferedImage(iOutW, dwInH,<br />&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_RGB);</p>
<p>&nbsp;&nbsp;for (int x = 0; x &lt; iOutW; x++) {</p>
<p>&nbsp;&nbsp;&nbsp;int startX;<br />&nbsp;&nbsp;&nbsp;int start;<br />&nbsp;&nbsp;&nbsp;int X = (int) (((double) x) * ((double) dwInW) / ((double) iOutW) + 0.5);<br />&nbsp;&nbsp;&nbsp;int y = 0;</p>
<p>&nbsp;&nbsp;&nbsp;startX = X - nHalfDots;<br />&nbsp;&nbsp;&nbsp;if (startX &lt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;startX = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;start = nHalfDots - X;<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;start = 0;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;int stop;<br />&nbsp;&nbsp;&nbsp;int stopX = X + nHalfDots;<br />&nbsp;&nbsp;&nbsp;if (stopX &gt; (dwInW - 1)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;stopX = dwInW - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;stop = nHalfDots + (dwInW - 1 - X);<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;stop = nHalfDots * 2;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;if (start &gt; 0 || stop &lt; nDots - 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;CalTempContrib(start, stop);<br />&nbsp;&nbsp;&nbsp;&nbsp;for (y = 0; y &lt; dwInH; y++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value = HorizontalFilter(bufImage, startX, stopX, start,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop, y, tmpContrib);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbOut.setRGB(x, y, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;for (y = 0; y &lt; dwInH; y++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value = HorizontalFilter(bufImage, startX, stopX, start,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop, y, normContrib);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbOut.setRGB(x, y, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return pbOut;</p>
<p>&nbsp;}</p>
<p>&nbsp;private static int VerticalFilter(BufferedImage pbInImage, int startY, int stopY,<br />&nbsp;&nbsp;&nbsp;int start, int stop, int x, double[] pContrib) {<br />&nbsp;&nbsp;double valueRed = 0.0;<br />&nbsp;&nbsp;double valueGreen = 0.0;<br />&nbsp;&nbsp;double valueBlue = 0.0;<br />&nbsp;&nbsp;int valueRGB = 0;<br />&nbsp;&nbsp;int i, j;</p>
<p>&nbsp;&nbsp;for (i = startY, j = start; i &lt;= stopY; i++, j++) {<br />&nbsp;&nbsp;&nbsp;valueRGB = pbInImage.getRGB(x, i);</p>
<p>&nbsp;&nbsp;&nbsp;valueRed += GetRedValue(valueRGB) * pContrib[j];<br />&nbsp;&nbsp;&nbsp;valueGreen += GetGreenValue(valueRGB) * pContrib[j];<br />&nbsp;&nbsp;&nbsp;valueBlue += GetBlueValue(valueRGB) * pContrib[j];<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen), Clip((int) valueBlue));<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return valueRGB;</p>
<p>&nbsp;} </p>
<p>&nbsp;private static BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) {<br />&nbsp;&nbsp;int iW = pbImage.getWidth();<br />&nbsp;&nbsp;int iH = pbImage.getHeight();<br />&nbsp;&nbsp;int value = 0;<br />&nbsp;&nbsp;BufferedImage pbOut = new BufferedImage(iW, iOutH,<br />&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_RGB);</p>
<p>&nbsp;&nbsp;for (int y = 0; y &lt; iOutH; y++) {</p>
<p>&nbsp;&nbsp;&nbsp;int startY;<br />&nbsp;&nbsp;&nbsp;int start;<br />&nbsp;&nbsp;&nbsp;int Y = (int) (((double) y) * ((double) iH) / ((double) iOutH) + 0.5);</p>
<p>&nbsp;&nbsp;&nbsp;startY = Y - nHalfDots;<br />&nbsp;&nbsp;&nbsp;if (startY &lt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;startY = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;start = nHalfDots - Y;<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;start = 0;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;int stop;<br />&nbsp;&nbsp;&nbsp;int stopY = Y + nHalfDots;<br />&nbsp;&nbsp;&nbsp;if (stopY &gt; (int) (iH - 1)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;stopY = iH - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;stop = nHalfDots + (iH - 1 - Y);<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;stop = nHalfDots * 2;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;if (start &gt; 0 || stop &lt; nDots - 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;CalTempContrib(start, stop);<br />&nbsp;&nbsp;&nbsp;&nbsp;for (int x = 0; x &lt; iW; x++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value = VerticalFilter(pbImage, startY, stopY, start, stop,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x, tmpContrib);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbOut.setRGB(x, y, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;for (int x = 0; x &lt; iW; x++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value = VerticalFilter(pbImage, startY, stopY, start, stop,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x, normContrib);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbOut.setRGB(x, y, value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return pbOut;</p>
<p>&nbsp;}</p>
<p>&nbsp;static int Clip(int x) {<br />&nbsp;&nbsp;if (x &lt; 0)<br />&nbsp;&nbsp;&nbsp;return 0;<br />&nbsp;&nbsp;if (x &gt; 255)<br />&nbsp;&nbsp;&nbsp;return 255;<br />&nbsp;&nbsp;return x;<br />&nbsp;}<br />}</p><img src ="http://www.blogjava.net/rain1102/aggbug/355029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-07-26 09:49 <a href="http://www.blogjava.net/rain1102/archive/2011/07/26/355029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在SQLPlus中执行用Java编写的Oracle存储过程[转载]</title><link>http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 22 Jun 2011 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/352799.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/352799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/352799.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #6f6f6f; font-family: Arial; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">首先在PL/Sql中分别执行：</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace and compile java source named TestJava1 as&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">public class TestJava1&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">{&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; public static void test()&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; {&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp; System.out.println("Hello");&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; }&nbsp;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">}</span></p><p style="line-height: normal; "><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace procedure testJava1 as language java name 'TestJava1.test()';</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">---------------------------------------------------------------------------------------------------------</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">在SQLPlus中</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">C:\Windows\System32&gt;sqlplus nc5520110105/nc5520110105@192.168.10.87</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 1 14:06:02 2011</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">Copyright (c) 1982, 2010, Oracle.&nbsp; All rights reserved.</span></p><p style="line-height: normal; "><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">Connected to:</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">With the Partitioning, OLAP and Data Mining options</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; set serveroutput on;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; show serveroutput;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; call dbms_java.set_output(2000);</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">Call completed.</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; show serveroutput;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; exec testJava1();</span><br style="line-height: normal; " /><strong style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">Hello</span></strong></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">PL/SQL procedure successfully completed.</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt;</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">---------------------------------------------------------------------------------------------------------</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">再看一个例子：</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">在PL/Sql中执行：</span></p><span style="line-height: normal; font-size: 24px; "><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">--用Java编写Oracle存储过程。</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace and compile java source named test as</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">public class MyTest</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">{</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; public static void myProc(int a,int b,int[] ret){</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret[0]=a+b;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; }</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; public static int myFunc(int a,int b){</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a+b;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp; }</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">}</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">--创建存储过程</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace procedure myProc(a in number, b in number, ret out number) as</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">language java name 'MyTest.myProc(int,int,int[])';</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">--创建函数</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">create or replace function myFunc(a in number, b in number) return number is</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">language java name 'MyTest.myFunc(int,int) return int';</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">然后在SqlPlus中测试存储过程&#8212;&#8212;</span></p><p style="line-height: normal; "></p></span><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; set serveroutput on</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; DECLARE a INTEGER;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 2&nbsp; BEGIN</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 3&nbsp; myProc(1, 2, a);</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 4&nbsp; DBMS_OUTPUT.PUT_LINE(a);</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 5&nbsp; END;</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp; 6&nbsp; /</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">3</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">PL/SQL procedure successfully completed.</span></p><p style="line-height: normal; ">&nbsp;</p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt; select myFunc(1,2) from dual;</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">MYFUNC(1,2)</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">-----------</span><br style="line-height: normal; " /><span style="line-height: normal; font-size: 12pt; color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span></p><p style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: #000000; ">SQL&gt;</span></p></span><img src ="http://www.blogjava.net/rain1102/aggbug/352799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-06-22 12:38 <a href="http://www.blogjava.net/rain1102/archive/2011/06/22/352799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu10.04中安装jdk-6u25</title><link>http://www.blogjava.net/rain1102/archive/2011/06/08/351911.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 08 Jun 2011 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/06/08/351911.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/351911.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/06/08/351911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/351911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/351911.html</trackback:ping><description><![CDATA[1. 下载jdk-6u25-linux-i586.bin放入/home/your_name/software<br />2. 进入/home/your_name/software下，执行chmod +x jdk-6u25-linux-i586.bin<br />3. 继续执行./jdk-6u25-linux-i586.bin<br />4. 到/usr/lib下执行sudo mkdir jvm，然后进入/usr/lib/jvm执行sudo mkdir java<br />5. 到/usr/lib/jvm/java下执行mv /home/your_name/software/jdk1.6.0_25/* .<br />6. 执行sudo gedit /etc/environment<br />7. 在PATH中添加"/usr/lib/jvm/java/bin", 添加CLASSPATH=.:/usr/lib/jvm/java/lib和JAVA_HOME=/usr/lib/jvm/java<br />8. 执行sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java/bin/java 300<br />9. 执行sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java/bin/javac 300<br />10. 执行sudo update-alternatives --config java<br />最后执行java -version<img src ="http://www.blogjava.net/rain1102/aggbug/351911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-06-08 14:05 <a href="http://www.blogjava.net/rain1102/archive/2011/06/08/351911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Ehcache对页面缓存</title><link>http://www.blogjava.net/rain1102/archive/2011/05/12/350097.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 12 May 2011 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/05/12/350097.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/350097.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/05/12/350097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/350097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/350097.html</trackback:ping><description><![CDATA[<p>There are no code changes required for this - your application server should support servlet filtering already. Simply update your web.xml file, re-deploy and you should see the speedup right away.</p>
<p>The basic steps you'll need to follow to configure Ehcache for web page caching are (note that these steps assume you already have Ehcache installed in your application):</p>
<ol style="list-style-type: decimal">
    <li style="margin: 0px">Configure a servlet page filter in web.xml</li>
    <li style="margin: 0px">Configure an appropriate cache in ehcache.xml</li>
    <li style="margin: 0px">Start (or re-start) your application</li>
</ol>
<p>The following settings should help you setup web caching for your application.</p>
<div class="section">
<h4>Step 1 - Add a filter to your web.xml<a name="Step_1_-_Add_a_filter_to_your_web.xml"></a></h4>
<p>The first thing you'll need to do is add a filter to enable page caching.</p>
<p>The following web.xml settings will enable a servlet filter for page caching:</p>
<div>
<pre>&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
version="2.5"&gt;
&lt;filter&gt;
&lt;filter-name&gt;SimplePageCachingFilter&lt;/filter-name&gt;
&lt;filter-class&gt;net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;!-- This is a filter chain. They are executed in the order below.
Do not change the order. --&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;SimplePageCachingFilter&lt;/filter-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;/web-app&gt;</pre>
</div>
</div>
<div class="section">
<h4>Step 2 - Configure an ehcache.xml<a name="Step_2_-_Configure_an_ehcache.xml"></a></h4>
<p>The second step to enabling web page caching is to configure ehcache with an appropriate ehcache.xml.</p>
<p>The following ehcache.xml file should configure a reasonable default ehcache:</p>
<div>
<pre>&lt;ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../main/config/ehcache.xsd"&gt;
&lt;cache name="SimplePageCachingFilter"
maxElementsInMemory="10000"
maxElementsOnDisk="1000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
/&gt;
&lt;/ehcache&gt;</pre>
</div>
</div>
<div class="section">
<h4>Step 3 - Start your application server<a name="Step_3_-_Start_your_application_server"></a></h4>
<p>Now start your application server. Pages should be cached.</p>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/350097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-05-12 16:11 <a href="http://www.blogjava.net/rain1102/archive/2011/05/12/350097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chemtoolkits上线啦</title><link>http://www.blogjava.net/rain1102/archive/2011/05/07/349748.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 07 May 2011 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/05/07/349748.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/349748.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/05/07/349748.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/349748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/349748.html</trackback:ping><description><![CDATA[chemtoolkits上线啦<br />
http://www.chemtoolkits.com<img src ="http://www.blogjava.net/rain1102/aggbug/349748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-05-07 19:02 <a href="http://www.blogjava.net/rain1102/archive/2011/05/07/349748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当@PathVariable遇上中文和点</title><link>http://www.blogjava.net/rain1102/archive/2011/05/05/349643.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 05 May 2011 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/05/05/349643.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/349643.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/05/05/349643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/349643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/349643.html</trackback:ping><description><![CDATA[<p>Spring MVC从3.0开始支持REST，而主要就是通过@PathVariable来处理请求参数和路径的映射。<br />
由于考虑到SEO的缘故，很多人喜欢把新闻的名称作为路径中的一部分去处理，这时候中文的名称就会遇到问题，没办法映射，这个是因为编码问题，只要到TOMCAT/conf下找到server.xml，添加URIEncoding="UTF-8"进行URL编码设置就可以解决中文问题。<br />
另外经常遇到路径中有点"."，而点是特殊字符，比如.html, .do等等，所以Spring MVC默认是把点后面的信息当作文件后缀，这时候我们就要修改这个默认值。</p>
&lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&gt; <br />
&nbsp;&nbsp;&lt;property name="interceptors" ref="localeChangeInterceptor"/&gt;<br />
&nbsp;&nbsp;<span style="color: red">&lt;property name="useDefaultSuffixPattern" value="false" /&gt;&nbsp;<br />
</span>&nbsp;&lt;/bean&gt; <br />
<br />
另外，这时候如果只设置这个，请求可以传递到对于的controller，但传过去的数据会有问题，只会传最后一个点前面的数据，除非你在最后加上&#8220;/&#8221;，比如/news/测试.点/&nbsp; 这样就会把&#8220;测试.点&#8221;当作整体，不然只会得到&#8220;测试&#8221;。这时候我们可以这样设置<span style="color: #000000"><span style="color: #ff0000">@RequestMapping("/news/{title:.*}")<br />
</span>这样就一切ok啦。</span><img src ="http://www.blogjava.net/rain1102/aggbug/349643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-05-05 23:03 <a href="http://www.blogjava.net/rain1102/archive/2011/05/05/349643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSRA让图片上的结构式活起来</title><link>http://www.blogjava.net/rain1102/archive/2011/04/22/348820.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 22 Apr 2011 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/22/348820.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/348820.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/22/348820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/348820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/348820.html</trackback:ping><description><![CDATA[<h1 id="pageTitle"><em>OSRA: </em>Optical Structure Recognition Application</h1>
地址：http://cactus.nci.nih.gov/osra/<br />
OSRA是一个很实用的工具，可以把图片上的结构转换为InChI，InChI-key，SMILES，SDF数据。目前一些商业的编辑化学结构式软件已经把该功能引入到了各家的产品中了，ChemAxon的Marvin Sketch就是其中一个，用户可以直接拷贝图片或者通过打开文件方式把图片上的结构式展现在编辑工具中。<br />
<br />
另外NCI提供了一个demo，地址<a href="http://cactus.nci.nih.gov/cgi-bin/osra/index.cgi"><font color="#000000">：</font>http://cactus.nci.nih.gov/cgi-bin/osra/index.cgi</a><br />
可以直接上传图片，然后会把图片中包含的化学结构式返回给你。非常强大!<br />
<br />
另外一个好消息，从1.3.8开始，java可以通过JNI去调用OSRA程序了，这样我们可以通过这个做很多有意思的事情，比如点击一个图片，直接去结构式搜索或者计算相关理化性质等等！<img src ="http://www.blogjava.net/rain1102/aggbug/348820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-22 17:49 <a href="http://www.blogjava.net/rain1102/archive/2011/04/22/348820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过使用Opsin进行IUPAC名称到结构转换</title><link>http://www.blogjava.net/rain1102/archive/2011/04/19/348596.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 19 Apr 2011 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/19/348596.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/348596.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/19/348596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/348596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/348596.html</trackback:ping><description><![CDATA[OPSIN - Open Parser for Systematic IUPAC Nomenclature (OPSIN) OPSIN takes an IUPAC chemical name and outputs a structure either as as CML (Chemical Markup Language), SMILES, or InChI. OPSIN's primary focus is organic chemical nomenclature，本来Opsin是OSCAR中的一个小模块。<br />
下载地址： http://bitbucket.org/dan2097/opsin/<br />
下面我们直接看代码吧，很简单！<br />
<p>package com.founder.opsin;</p>
<p>import nu.xom.Element;<br />
import uk.ac.cam.ch.wwmm.opsin.NameToInchi;<br />
import uk.ac.cam.ch.wwmm.opsin.NameToStructure;<br />
import uk.ac.cam.ch.wwmm.opsin.NameToStructureConfig;<br />
import uk.ac.cam.ch.wwmm.opsin.NameToStructureException;<br />
import uk.ac.cam.ch.wwmm.opsin.OpsinResult;</p>
<p>public class OpsinTest {</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; * @author Zhou Rui<br />
&nbsp; * @throws NameToStructureException <br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) throws NameToStructureException {<br />
<span style="color: #008000">&nbsp;&nbsp;NameToStructure n2s = NameToStructure.getInstance();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;NameToStructureConfig n2sconfig = new NameToStructureConfig();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;OpsinResult result = n2s.parseChemicalName("acetonitrile", n2sconfig);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;System.out.println(result.getStatus());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String smiles = result.getSmiles();<br />
&nbsp;&nbsp;String inchi = NameToInchi.convertResultToInChI(result);<br />
&nbsp;&nbsp;System.out.println(smiles);<br />
&nbsp;&nbsp;System.out.println(inchi);<br />
</span>&nbsp;}</p>
<p>}<br />
<br />
输出结果如下：<br />
SUCCESS<br />
C(C)#N<br />
InChI=1/C2H3N/c1-2-3/h1H3</p><img src ="http://www.blogjava.net/rain1102/aggbug/348596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-19 21:52 <a href="http://www.blogjava.net/rain1102/archive/2011/04/19/348596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Rsession在java中启动Rserve</title><link>http://www.blogjava.net/rain1102/archive/2011/04/13/348257.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 13 Apr 2011 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/13/348257.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/348257.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/13/348257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/348257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/348257.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Rsession，可以到http://code.google.com/p/rsession/downloads/list这里下载&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2011/04/13/348257.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/348257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-13 22:45 <a href="http://www.blogjava.net/rain1102/archive/2011/04/13/348257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chemtoolkits中分子描述符计算（molecular descriptor calculator）完成</title><link>http://www.blogjava.net/rain1102/archive/2011/04/12/348175.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 12 Apr 2011 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/12/348175.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/348175.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/12/348175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/348175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/348175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 参照Rajarshi Guha的CDKDescUI代码，已经把CDK的分子描述符计算（molecular descriptor calculator）集成到chemtoolkits中了，其中包含44个描述符。&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2011/04/12/348175.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/348175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-12 22:54 <a href="http://www.blogjava.net/rain1102/archive/2011/04/12/348175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chemtoolkits(CTK)部分功能和界面</title><link>http://www.blogjava.net/rain1102/archive/2011/04/09/347957.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 09 Apr 2011 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/09/347957.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/347957.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/09/347957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/347957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/347957.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Chemtoolkits(CTK)部分功能和界面已经完成，目前网站的主要辅助性的功能已经加入，比如新闻、文章、留言以及其他信息内容。化学信息学方面的目前只整合了里宾斯基五规则计算，以及比较流行的OSIRIS Property Explorer (LogP, 溶解度、成药可能性预测)小工具。&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2011/04/09/347957.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/347957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-09 17:16 <a href="http://www.blogjava.net/rain1102/archive/2011/04/09/347957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chemtoolkits.com国内免费化学信息学服务平台</title><link>http://www.blogjava.net/rain1102/archive/2011/04/06/347676.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 06 Apr 2011 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/06/347676.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/347676.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/06/347676.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/347676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/347676.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2011/04/06/347676.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/347676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-06 10:06 <a href="http://www.blogjava.net/rain1102/archive/2011/04/06/347676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Chemical Informatic tools development</title><link>http://www.blogjava.net/rain1102/archive/2011/04/02/347502.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 02 Apr 2011 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/04/02/347502.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/347502.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/04/02/347502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/347502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/347502.html</trackback:ping><description><![CDATA[<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>1. Property calculations (LogP/LogD, PSA, solubility, pKa, Lipinski rule)<br />
</p>
<p class="MsoNormal"><span style="font-family: 宋体; color: red; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;计算插件</span><span style="font-family: 宋体; color: #002060; font-size: 10pt">（脂水分配系数</span><span style="font-family: 'Arial', 'sans-serif'; color: #002060; font-size: 10pt">/</span><span style="font-family: 宋体; color: #002060; font-size: 10pt">考虑电解时的脂水分配系数、极性表面积、溶解性、电解常数、</span><span style="font-family: 'Arial', 'sans-serif'; color: #002060; font-size: 10pt">Lipinski</span><span style="font-family: 宋体; color: #002060; font-size: 10pt">五规则）</span></strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;All are supported except solubility, in JChemBase, Cartridge, Knime, Pipeline pilot, Instant JChem, Jchem for Excel and in Marvin. See full list of our <a href="http://www.chemaxon.com/products/calculator-plugins/">property predictors.</a>Calculating Lipinski rule of 5: </p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>2. Bulid and maintain project data viewer (SAR understanding)<br />
<span style="font-family: 'Arial', 'sans-serif'; color: #002060; font-size: 10pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">SAR: structure-activity relationship, </span><span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">结果与活性关系，简称构效关系</span><br />
</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;We have <a href="http://www.chemaxon.com/jchem/doc/user/RGroupDecomposition.html">R-group decomposition</a>, also a viewer in JChem for Excel, <a href="http://www.chemaxon.com/jchem/doc/user/LibMCS.html">LibMCS GUI</a>. That can be used for SAR understanding.</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>3. Library enumeration, cleanup, profile and analysis</strong></span></p>
<p><a href="http://www.chemaxon.com/products/reactor/">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reactor</a>, <a href="http://www.chemaxon.com/products/screen/">Screen</a>, <a href="http://www.chemaxon.com/products/calculator-plugins/">Calculator plugins</a>, <a href="http://www.chemaxon.com/products/calculator-plugins/markush-enumeration/">Markush Enumeration</a>, <a href="http://www.chemaxon.com/products/instant-jchem/">Instant JChem</a>, <a href="http://www.chemaxon.com/products/jchem-for-excel/">JChem for Excel</a>, KNIME, Pipeline pilot<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Some presentations on the topic:<br />
<a href="http://www.chemaxon.com/wp-content/uploads/2011/02/IS_CambridgeTechTalk.pdf">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Virtual Libraries and Virtual Screening in Drug Discovery Processes using KNIME</a><br />
<a href="http://www.chemaxon.com/wp-content/uploads/2011/01/Library-Compound-Design_TimeaPolgar.pdf">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Library Compound Design Methods for CustomLibrary Synthesis</a><br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>4. Customized Spotfire view</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Yes this is the TIBCO Spotfire tool. Marvin is integrated into Spotfire, I think even JChem Cartridge can communicate with Spotfire, our new project is Instant JChem Integration which is under development<br />
<br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>5.Similarity search</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Yes, JChemBase, Cartridge, Instant JChem, JChem for Excel <a href="http://www.chemaxon.com/jchem/doc/dev/search/#simil">Similarity search in databases</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For a more sophisticated approach of similarity, we provide <a href="http://www.chemaxon.com/product/screen.html">the Screen package</a>. <br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>6.Clustering</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JKlustor, LibMCS<br />
<br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>7.Generate SAR Tables<br />
<span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">生成构效关系表格</span><br />
</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;We do not support directly but we have Rgroup decomposition, Fragmentation toolkit that can be visualized and analysed later.<br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>8.Ligand binding Efficiency<br />
<span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">配体结合效果</span><br />
</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LE can be calculated if the database contains the activity value, heavy atom counts can be calculated in JChem for Excel, Instant Jchem<br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>9.Structure visualization<br />
<span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">结构可视化</span><br />
</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Marvin<br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>10.Overlay/Docking<br />
<span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">叠合</span><span style="font-family: 'Arial', 'sans-serif'; color: #002060; font-size: 10pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">/</span><span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">对接</span><br />
</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No, we do not support docking. <a href="http://www.chemaxon.com/products/calculator-plugins/3d-alignment/">Alignment</a> can be done in Marvin,<a href="http://www.chemaxon.com/products/screen/"> Screen3D</a>, and a standalone GUI for low throughput screening.<br />
</p>
<p style="margin-left: 21pt" class="MsoNormal"><span style="font-family: 'Arial', 'sans-serif'; font-size: 10pt"><strong>11.Build predictive ADMET models <br />
<span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">建立预测</span><span style="font-family: 'Arial', 'sans-serif'; color: #002060; font-size: 10pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">ADMET</span><span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">模型。</span><span style="font-family: 'Arial', 'sans-serif'; color: #002060; font-size: 10pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">ADMET</span><span style="font-family: 宋体; color: #002060; font-size: 10pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">分别代表吸收、分布、代谢、排泄和毒性。</span><br />
</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;We do not support directly, although we have some calculation plugins that can be further used for these property calculations such as pKa, logP/D, Atom counts, PSA.</p><img src ="http://www.blogjava.net/rain1102/aggbug/347502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-04-02 09:20 <a href="http://www.blogjava.net/rain1102/archive/2011/04/02/347502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java通过Rserve调研R函数</title><link>http://www.blogjava.net/rain1102/archive/2011/03/30/347261.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 30 Mar 2011 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/03/30/347261.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/347261.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/03/30/347261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/347261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/347261.html</trackback:ping><description><![CDATA[R是一个用于统计计算和统计制图的优秀工具。其功能包括：数据存储和处理系统；数组运算工具（其向量、矩阵运算方面功能尤其强大）；完整连贯的统计分析工具；优秀的统计制图功能；简便而强大的编程语言：可操纵数据的输入和输入，可实现分支、循环，用户可自定义功能&nbsp;。<br />
而Java语言是目前最流行的语言，当然对我自己来说也是最熟悉的语言了。所以今天尝试通过java来调用R函数为下面通过调用数学函数实现业务功能做基础。<br />
目前我在windows xp上做测试。<br />
1. 首先需要下载R的windows安装程序，地址为<a href="http://cran.r-project.org/">http://cran.r-project.org/</a>，选择base进行下载。然后安装就可以了。<br />
2. 安装Rserve，可以通过R界面中的命令行输入：install.packages("Rserve")或者在R界面上选择：程序包-&gt;安装程序包，然后找到Rserve进行安装。<br />
3. 启动Rserve, 在R界面中的命令行中输入：library(Rserve)来加载Rserve，然后输入Rserve()进行启动服务。<br />
到此Rserve已经配置并启动好，下面轮到Java程序调用了。<br />
1. 下载Rserve提供的jar包，打开<a href="http://www.rforge.net/Rserve/files/">http://www.rforge.net/Rserve/files/</a>，下载<a href="http://www.rforge.net/Rserve/files/REngine.jar">REngine.jar</a>和<a href="http://www.rforge.net/Rserve/files/RserveEngine.jar">RserveEngine.jar</a>，然后放到自己的项目中，并引入。<br />
2. 编辑代码如下：<br />
<p>&nbsp;</p>
<p><span style="color: #008000">import org.rosuda.REngine.REXP;<br />
import org.rosuda.REngine.REXPMismatchException;<br />
import org.rosuda.REngine.Rserve.RConnection;<br />
import org.rosuda.REngine.Rserve.RserveException;</span></p>
<p><span style="color: #008000">public class RTest {</span></p>
<p><span style="color: #008000">&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; * @author Zhou Rui<br />
&nbsp; * @throws RserveException <br />
&nbsp; * @throws REXPMismatchException <br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) throws RserveException, REXPMismatchException {<br />
&nbsp;&nbsp;RConnection c = new RConnection();<br />
&nbsp;&nbsp;REXP x = c.eval("R.version.string");<br />
&nbsp;&nbsp;System.out.println(x.asString());<br />
&nbsp;}</span></p>
<p><span style="color: #008000">}</span></p>
<br />
运行，输入结果：<br />
<span style="color: #008000">R version 2.12.2 (2011-02-25)</span><img src ="http://www.blogjava.net/rain1102/aggbug/347261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-03-30 10:57 <a href="http://www.blogjava.net/rain1102/archive/2011/03/30/347261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java导出csv文件处理逗号</title><link>http://www.blogjava.net/rain1102/archive/2011/03/29/347241.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 29 Mar 2011 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/03/29/347241.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/347241.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/03/29/347241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/347241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/347241.html</trackback:ping><description><![CDATA[比如某列数据存在逗号，只需要使用双引号把数据放在其中就可以了。<br />
sb.append<span style="color: #ff0000">("\""+document.getTitle() + "\"," </span>+ document.getNumber() + "," + document.getVersion() + "," + document.getApprovedDateString() + "," + document.getAuthor().getRealName() + "\n");<br /><img src ="http://www.blogjava.net/rain1102/aggbug/347241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-03-29 22:27 <a href="http://www.blogjava.net/rain1102/archive/2011/03/29/347241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Generating PDFs for Fun and Profit with Flying Saucer and iText</title><link>http://www.blogjava.net/rain1102/archive/2010/04/18/318651.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 18 Apr 2010 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/04/18/318651.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/318651.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/04/18/318651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/318651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/318651.html</trackback:ping><description><![CDATA[<a href="http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html" target="_blank">http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html</a><img src ="http://www.blogjava.net/rain1102/aggbug/318651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-04-18 11:29 <a href="http://www.blogjava.net/rain1102/archive/2010/04/18/318651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Enable the jre plugin in chrome and firefox in ubuntu 9.04</title><link>http://www.blogjava.net/rain1102/archive/2010/04/15/318392.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 15 Apr 2010 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/04/15/318392.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/318392.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/04/15/318392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/318392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/318392.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8" /><span  style="border-collapse: collapse; font-family: arial, 'san serif'; font-size: 13px; ">Guys, (Ubuntu 9.04)<br />
<br />
Before all this make sure that you have Java correctly installed. First I tried to installed java under my home directory, failed. I mean I though I have installed it, but it actually did not. (used exact same steps from www.java.com). Then I tried to install it under /usr/ directory, failed. Finally I tried to install it under /opt/, succeed.&nbsp;<br />
<br />
Then i followed the same routine "symbolic link" stuff for both of my web browsers (Firefox, Chrome), succeed. :)<br />
<br />
for Chrome:<br />
&nbsp; &gt;&nbsp; mkdir /opt/google/chrome/plugins<br />
&nbsp; &gt;&nbsp; cd /opt/google/chrome/plugins<br />
&nbsp; &gt;&nbsp; ln -s /opt/java/jre1.6.0_17/lib/i386/libnpjp2.so&nbsp;<br />
<br />
for Firefox:<br />
<br />
&gt;cd &lt;Firefox installation directory&gt;/plugins<br />
&gt;ln -s /opt/java/jre1.6.0_17/lib/i386/libnpjp2.so&nbsp;<br />
<br />
restart them!<br />
<br />
hope it works</span><img src ="http://www.blogjava.net/rain1102/aggbug/318392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2010-04-15 11:06 <a href="http://www.blogjava.net/rain1102/archive/2010/04/15/318392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jbpm4.2+tomcat6+oracle9i安装过程[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/12/03/304687.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 03 Dec 2009 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/12/03/304687.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/304687.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/12/03/304687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/304687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/304687.html</trackback:ping><description><![CDATA[原文地址：http://blog.chinaunix.net/u/21752/showart_2097331.html<br />
<span style="font-weight: bold; color: rgb(153,1,2)">1.软件清单</span><br />
&nbsp;&nbsp; jdk1.6<br />
&nbsp;&nbsp; jbpm4.2<br />
&nbsp;&nbsp; tomcat6<br />
&nbsp;&nbsp; oracle9i<br />
&nbsp;&nbsp; ant1.7<br />
&nbsp;&nbsp; eclipse-jee-galileo-win32<br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">2.配置JDK1.6</span><br />
&nbsp;&nbsp; 在系统路径上添加<br />
&nbsp;&nbsp; JAVA_HOME=c:\java\jdk16(我的JDK1.6安装目录)<br />
&nbsp;&nbsp; CLASS_PATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\jre\lib\rt.jar;<br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">3.配置ANT</span><br />
&nbsp;&nbsp; 在系统路径上添加<br />
&nbsp;&nbsp; ANT_HOME=c:\java\ant<br />
&nbsp;&nbsp; path=%ANT_HOME%\bin<br />
<br />
4.配置数据库(使用Oracle,默认使用的是hsqldb)<br />
&nbsp;&nbsp; (1)将class12.jar复制到jbpm-4.2\lib目录下，否则找不到驱动<br />
&nbsp;&nbsp; (2)进入c:\jbpm-4.2\install\jdbc目录修改文件oracle.properties文件，设置你自己的oracle数据库名、用户名和密码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意jbpm-4.2的根目录名称不能更改，否则无法运行ANT<br />
&nbsp;&nbsp; (3)修改c:\jbpm-4.2\install\build.xml,修改为&lt;property name="database" value="oracle" /&gt; &lt;!-- {hsqldb | mysql | oracle | postgresql} --&gt;<br />
&nbsp;&nbsp; (4)进入c:\jbpm-4.2\install， 运行 ant create.jbpm.schema,将创建数据库脚本并在指定数据库中创建表<br />
&nbsp;&nbsp; <br />
<span style="font-weight: bold; color: rgb(153,1,2)">4.配置Tomcat</span><br />
&nbsp;&nbsp; (1)复制apache-tomcat-6.0.20.zip文件到c:\jbpm-4.2\install\downloads目录中<br />
&nbsp;&nbsp; (2)进入c:\jbpm-4.2\install，运行ant&nbsp; install.tomcat.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完成后，在c:\jbpm-4.2目录下生成一个tomcat目录<br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">5.配置eclipse</span><br />
&nbsp;&nbsp; (1)复制eclipse-jee-galileo-win32.zip文件到c:\jbpm-4.2\install\downloads目录中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：eclipse的名称必须是eclipse-jee-galileo-win32<br />
&nbsp;&nbsp; (2)进入c:\jbpm-4.2\install，运行ant&nbsp; install.eclipse，运行时间较长<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完成后，在c:\jbpm-4.2目录下生成一个eclipse目录<br />
&nbsp;&nbsp; 注意：如果没有不用ant配置eclipse，安装下面的GPD时，提示出错，点击确定后，GPD依然可以使用，不知道为什么。<br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">6.配置流程设计器GPD</span><br />
&nbsp;&nbsp;&nbsp; 启动eclipse,在Eclipse里添加更新站点的方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 帮助 --&gt; 安装新软件...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击 添加...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 添加站点 对话框中，单击 压缩包...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到 install/src/gpd/jbpm-gpd-site.zip 并点击 '打开'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击 确定 在 添加站点 对话框中，会返回到 '安装'对话框<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择出现的 jPDL 4 GPD 更新站点，全部选中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击 下一步.. 然后点击 完成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接受协议<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当它询问的时候重启eclipse<br />
&nbsp;&nbsp; <br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">7.配置elcipse工程</span><br />
&nbsp;&nbsp; 配置jBPM：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击 Window --&gt; Preferences<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择 JBoss jBPM --&gt; jBPM-4.2 --&gt; Runtime Locations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击 Add...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 Add Location 对话框中，输入一个名字，比如&nbsp; jBPM-4.2 然后点击 Search...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 Browse For Folder 对话框中，选择你的jbpm-4.2根目录，然后点击 OK<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击 OK 在 Add Location 对话框中 <br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">8.定义一个用户库</span><br />
&nbsp; 用户库用来放置jBPM的库文件。 如果你创建一个新工程， 只需要将用户库全部添加到build path<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击窗口 --&gt; 属性（Windows --&gt; Preferences）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 选择Java --&gt; 创建路径 --&gt; 用户类库（Java --&gt; Build Path --&gt; User Libraries）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击新建（New）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型名字jBPM Libraries<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击添加JARs（Add JARs...）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 找到jBPM安装程序下的lib目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; 选择lib下的所有jar文件并点击打开（Open）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 选择jBPM Libraries作为入口<br />
&nbsp;&nbsp;&nbsp;&nbsp; 重新点击添加JARs（Add JARs）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在jBPM的安装程序的根目录下选择jbpm.jar文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击打开（Open）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在jbpm.jar下选择源码附件（Source attachment）作为入口<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击编辑（Edit）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在源码附件的配置（Source Attachment Configuration）对话框中，点击目录（External Folder...）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 找到jBPM安装程序下的src目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击选择（Choose）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 点击两次'确定'（Ok）会关闭所有对话框<br />
<br />
<span style="font-weight: bold; color: rgb(153,1,2)">9.创建一个jbpm demo</span><br />
创建一个例子，并将工作流程定义保存到数据库中<br />
(1)创建一个java Project，起名&#8220; myjbpm &#8221;，然后就可以单击&#8220;完成&#8221;了<br />
(2)将c:\jbpm-4.2\examples\src中的所有配置文件复制到myjbpm工程中的根目录下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbpm.cfg.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbpm.hibernate.cfg.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbpm.mail.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbpm.mail.templates.examples.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logging.properties<br />
<br />
(3)修改jbpm.hibernate.cfg.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibernate.cfg.xml 的默认设置是用 HSQL ，这是一个内存数据库，这种内存数据库用来代替项目实际所用的数据库来做单元测试挺不错的。不过我们这里是要试试用 MySQL 、 Oracle <br />
MySQL 的更改如下：<br />
&nbsp;&nbsp; &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.url"&gt;jdbc:mysql://localhost:3306/jbpm&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.username"&gt;root&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.password"&gt;123456&lt;/property&gt;<br />
<br />
Oracle 的更改如下：<br />
&nbsp;&nbsp; &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.OracleDialect&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.url"&gt;jdbc:oracle:thin:@192.168.123.10:1521:wxxrDB&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.username"&gt;xiong&lt;/property&gt;<br />
&nbsp;&nbsp; &lt;property name="hibernate.connection.password"&gt;xiong&lt;/property&gt;<br />
<br />
(4)定义流程<br />
&nbsp;&nbsp; 创建流程的定义文件是 pd.jpdl.xml，将下面代码复制到文件中<br />
------------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
<br />
&lt;process name="pd" xmlns="http://jbpm.org/4.0/jpdl"&gt;<br />
&nbsp;&nbsp; &lt;start name="start1" g="207,62,48,48"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="to state1" to="state1" g="-59,-17"/&gt;<br />
&nbsp;&nbsp; &lt;/start&gt;<br />
&nbsp;&nbsp; &lt;end name="end1" g="208,293,48,48"/&gt;<br />
&nbsp;&nbsp; &lt;state name="state1" g="185,155,92,52"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="to end1" to="end1" g="-47,-17"/&gt;<br />
&nbsp;&nbsp; &lt;/state&gt;<br />
&lt;/process&gt;<br />
------------------------------------------------------------------------------------------<br />
<br />
(5)布置jbpm<br />
<br />
import junit.framework.TestCase;<br />
import org.jbpm.api.Configuration;<br />
import org.jbpm.api.ExecutionService;<br />
import org.jbpm.api.HistoryService;<br />
import org.jbpm.api.ManagementService;<br />
import org.jbpm.api.ProcessEngine;<br />
import org.jbpm.api.RepositoryService;<br />
import org.jbpm.api.TaskService;<br />
<br />
public class ServicesTest extends TestCase {<br />
&nbsp;&nbsp; public void testObtainServicesAndDeployProcess() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; Configuration configuration = new Configuration();<br />
&nbsp;&nbsp;&nbsp;&nbsp; ProcessEngine processEngine = configuration.buildProcessEngine();<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; RepositoryService repositoryService = processEngine.getRepositoryService();<br />
&nbsp;&nbsp;&nbsp;&nbsp; ExecutionService executionService = processEngine.getExecutionService();<br />
&nbsp;&nbsp;&nbsp;&nbsp; TaskService taskService = processEngine.getTaskService();<br />
&nbsp;&nbsp;&nbsp;&nbsp; HistoryService historyService = processEngine.getHistoryService();<br />
&nbsp;&nbsp;&nbsp;&nbsp; ManagementService managementService = processEngine.getManagementService();<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; // 开始部署一个新的流程文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; String deploymentId = repositoryService.createDeployment().addResourceFromClasspath("pd.jpdl.xml").deploy();<br />
<br />
&nbsp;&nbsp; }<br />
}<br />
<br />
&nbsp;&nbsp; 无论是 MySQL 还是 Oracle ，<br />
&nbsp;&nbsp; jbpm4_deployment表，你会发现多了一条记录<br />
&nbsp;&nbsp; jbpm4_deployprop表会多了三条记录,对应id,key,version<br />
&nbsp;&nbsp; jbpm4_lob 表会多了一条记录,保存流程图<br />
<br />
<br />
参考文献：<br />
1.bestyanghui. JBPM4.1配置实用过程. http://blog.csdn.net/bestyanghui/archive/2009/10/12/4656914.aspx<br />
2.熊熊之家. jbpm4开发步骤. http://hi.baidu.com/freshman0502/blog/item/092bab19ea68a873dab4bd91.html<br /><img src ="http://www.blogjava.net/rain1102/aggbug/304687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-12-03 19:48 <a href="http://www.blogjava.net/rain1102/archive/2009/12/03/304687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装tomcat问题</title><link>http://www.blogjava.net/rain1102/archive/2009/11/20/303075.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 20 Nov 2009 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/20/303075.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/303075.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/20/303075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/303075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/303075.html</trackback:ping><description><![CDATA[给客户安装tomcat6时候遇到错误，信息为：
<h1 style="color: red">failed&nbsp;to&nbsp;install&nbsp;tomcat6&nbsp;service&nbsp;check&nbsp;your&nbsp;settings&nbsp;and&nbsp;permissions</h1>
经过查看得知客户的机器上原先装了一个，然后直接删掉了tomcat安装目录而不是卸载的，所以服务里面还有tomcat的服务。所以需要删掉该服务才可以安装。<br />
<br />
找到一个解压版本的tomcat放到任意目录，然后听过命令行进入到该目录下的bin目录里面，里面应该有个service.bat文件，执行<span style="color: #008000">service remove tomcat6</span>，这样就删除服务了。下面就可以安装！<img src ="http://www.blogjava.net/rain1102/aggbug/303075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-11-20 17:06 <a href="http://www.blogjava.net/rain1102/archive/2009/11/20/303075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail问题之Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream</title><link>http://www.blogjava.net/rain1102/archive/2009/11/17/302654.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 17 Nov 2009 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/17/302654.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/302654.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/17/302654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/302654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/302654.html</trackback:ping><description><![CDATA[<p><strong>Exception in thread "main" <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream</strong></p>
<p>解决方案:</p>
<p>&nbsp;&nbsp;&nbsp;JavaEE版本和JavaMail的版本不一致,请将sun公司上下载最新版本.http://java.sun.com/products/javamail/downloads/index.html<br />
&nbsp;&nbsp; 例如:javaMail 1.3以下的如果在javaEE5上就会出现上面的错误,<br />
&nbsp;&nbsp;&nbsp;如果还出现此问题，则是因为javaEE5中包含有javaMail的类但是却不全面,所以出本身的JavaMail<br />
&nbsp;&nbsp; 包冲突.用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_x.x.x.zmyeclipsexxxxxxxxx/data/libraryset/EE_5/javaee.jar<br />
,然后删除mail,一切就ok了.<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/302654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-11-17 11:05 <a href="http://www.blogjava.net/rain1102/archive/2009/11/17/302654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中主键增长步长为50的问题 Oracle</title><link>http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 11 Nov 2009 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/302019.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/302019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/302019.html</trackback:ping><description><![CDATA[<p>原文地址：http://jhyimu2005.javaeye.com/blog/514379<br />
先声明一下我用的框架是Spring + Hibernate + SpringMVC 数据库使用的是Oracle <br />
昨天遇到了一个特诡异的问题就是我使用Oracle序列，把主键的计数交给Hibernate处理，
Entity
@Table(name = "BIO_STUDY")
public class Study implements Serializable{
private static final long serialVersionUID = -5932941248053882057L;
private int id;
private Project project;
private String name;
private String description;
private Set&lt;Experiment&gt; experiments;
@Id
@Column(name = "ID")
@SequenceGenerator(name = "BIO_STUDY_SQ",
sequenceName = "BIO_STUDY_SQ" )
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BIO_STUDY_SQ")
public int getId() {
return id;
}

<p><br />
写完部署什么都没问题，可当我写了测试类进行测试时发现主键的初始值竟然是50，其步长亦是50，在同事的帮助下发现原来是Hibernate在做鬼，@SequenceGenerator中添加两个参数<span style="color: red">（allocationSize = 1, initialValue = 1）</span>就OK。通过查找Hibernate的资料发现原来是因为allocationSize的默认值是50.具体请参考http://www.oracle.com/technology/global/cn/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#SequenceGenerator <br />
<br />
<span style="color: red">只需要增加allocationSize = 1就可以</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/302019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-11-11 21:54 <a href="http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle调用java</title><link>http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 29 Oct 2009 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/300146.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/300146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/300146.html</trackback:ping><description><![CDATA[<p>前提是数据库上需要安装java虚拟机(JVM),使用下面的语句查看 </p>
<p><span style="color: #008000">select * from dba_registry where comp_id = 'JAVAVM'</span><br />
<br />
为空,则未安装,请执行 $ORACLE_HOME/javavm/install/initjvm.sql安装. <br />
创建函数 </p>
<p><span style="color: #008000">create or replace function fn_oraclecall(mArea in VARCHAR2,mDevID in Number,mPORT in Number)<br />
return varchar2<br />
as<br />
language <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> name 'Caller.call(java.lang.String,Integer,Integer) return <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String';</span><br />
</p>
<p>创建存储过程 </p>
<p><span style="color: #008000">create or replace procedure CHK_SETCAB_NUM<br />
(mArea in VARCHAR2,mDevID in Number,mPORT in Number,v_out out varchar2) is<br />
begin<br />
v_out := fn_oraclecall(mArea,mDevID,mPORT);<br />
end CHK_SETCAB_NUM;</span></p>
<p>loadjava </p>
<p><span style="color: #008000">loadjava -u sys/sys@sid&nbsp; -oci8 -verbose -grant user -synonym -resolve -schema user D:\Caller.jar<br />
</span><br />
--这里也可以是class文件,注意兼容oracle的jre版本</p>
<p><br />
注意编写的java文件里,即Caller.java的call()方法,需要是staic <br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/300146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-29 11:20 <a href="http://www.blogjava.net/rain1102/archive/2009/10/29/300146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CDK中根据smiles计算Fingerprinter值</title><link>http://www.blogjava.net/rain1102/archive/2009/10/26/299848.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 26 Oct 2009 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/26/299848.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/299848.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/26/299848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/299848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/299848.html</trackback:ping><description><![CDATA[<p>package com.founder.cdk;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.BitSet;</p>
<p>import org.openscience.cdk.DefaultChemObjectBuilder;<br />
import org.openscience.cdk.exception.CDKException;<br />
import org.openscience.cdk.exception.InvalidSmilesException;<br />
import org.openscience.cdk.fingerprint.ExtendedFingerprinter;<br />
import org.openscience.cdk.smiles.SmilesParser;</p>
<p>public class FingerprinterTest {</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; * @throws CDKException <br />
&nbsp; * @throws InvalidSmilesException <br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) throws InvalidSmilesException, CDKException {<br />
&nbsp;&nbsp;ExtendedFingerprinter fingerprinter = new ExtendedFingerprinter();<br />
&nbsp;&nbsp;SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance());<br />
&nbsp;&nbsp;BitSet bt = fingerprinter.getFingerprint(sp.parseSmiles("c2ccc1ccccc1c2"));<br />
&nbsp;}</p>
<p>}<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/299848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-26 22:24 <a href="http://www.blogjava.net/rain1102/archive/2009/10/26/299848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Python中使用openbabel</title><link>http://www.blogjava.net/rain1102/archive/2009/10/25/299655.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 25 Oct 2009 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/25/299655.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/299655.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/25/299655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/299655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/299655.html</trackback:ping><description><![CDATA[<p>如果你的环境还没准备好, 可以官方网站看如何配置环境:http://openbabel.org/wiki/Install_Python_bindings<br />
<strong>1. 通过使用OBMol, OBAtom和OBBond来创建原子和键</strong><br />
import openbabel<br />
<br />
mol = openbabel.OBMol()<br />
print 'Should print 0 (atoms)'<br />
print mol.NumAtoms()<br />
<br />
a = mol.NewAtom()<br />
a.SetAtomicNum(6)&nbsp;&nbsp; # carbon atom<br />
a.SetVector(0.0, 1.0, 2.0) # coordinates<br />
<br />
b = mol.NewAtom()<br />
mol.AddBond(1, 2, 1)&nbsp;&nbsp; # atoms indexed from 1<br />
print 'Should print 2 (atoms)'<br />
print mol.NumAtoms()<br />
print 'Should print 1 (bond)'<br />
print mol.NumBonds()<br />
<br />
mol.Clear();<br />
<br />
<strong>2. 通过OBConversion来读取分子, 并输出不同格式文件或字符串值</strong><br />
import openbabel<br />
<br />
obConversion = openbabel.OBConversion()<br />
obConversion.SetInAndOutFormats("smi", "mdl")&nbsp;&nbsp;&nbsp; //读取smiles值, 然后输出mdl值<br />
<br />
mol = openbabel.OBMol()<br />
obConversion.ReadString(mol, "C1=CC=CS1")<br />
<br />
print 'Should print 5 (atoms)'<br />
print mol.NumAtoms()<br />
<br />
mol.AddHydrogens()<br />
print 'Should print 9 (atoms) after adding hydrogens'<br />
print mol.NumAtoms()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出原子个数<br />
<br />
outMDL = obConversion.WriteString(mol)<br />
<br />
<strong>3. 计算fp值</strong><br />
import pybel<br />
smiles = ['CCCC', 'CCCN']<br />
mols = [pybel.readstring("smi", x) for x in smiles]&nbsp;&nbsp; # Create two molecules from the SMILES<br />
fps = [x.calcfp() for x in mols]&nbsp;&nbsp; # Calculate their fingerprints<br />
print fps[0].bits, fps[1].bits<br />
print fps[0].fp[0]<br />
<br />
mol2 = pybel.readstring('smi', 'c2ccc1ccccc1c2')<br />
fp2 = mol2.calcfp("FP4")<br />
print fp2<br />
print fp2.bits</p>
<br />
<p>mol3 = pybel.readstring('smi', 'C1CCCCC1')<br />
fp3 = mol3.calcfp()</p>
<p>print fp3.__or__(fp2)&nbsp; //计算相似度值<br />
<br />
<span style="color: #008000"><strong style="color: #000000">4. 读取sdf文件<br />
</strong></span>#encoding=utf-8<br />
import pybel<br />
for mymol in pybel.readfile("sdf", "structures_all.sdf"):<br />
&nbsp;&nbsp;&nbsp; fp = mymol.calcfp("FP2")<br />
&nbsp;&nbsp;&nbsp; print fp<br />
<br />
<strong>5. 输出txt文件和sdf文件</strong></p>
print mymol.write("smi")&nbsp;&nbsp;&nbsp; //'CCCC'<br />
mymol.write("smi", "outputfile.txt")<br />
largeSDfile = Outputfile("sdf", "multipleSD.sdf")<br />
largeSDfile.write(mymol)<br />
largeSDfile.write(myothermol)<br />
largeSDfile.close()<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/299655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-25 12:37 <a href="http://www.blogjava.net/rain1102/archive/2009/10/25/299655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CDK生成分子结构图</title><link>http://www.blogjava.net/rain1102/archive/2009/10/22/299271.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 22 Oct 2009 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/22/299271.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/299271.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/22/299271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/299271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/299271.html</trackback:ping><description><![CDATA[<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.awt.Dimension;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.awt.Graphics2D;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.awt.geom.Rectangle2D;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.awt.image.BufferedImage;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.OutputStream;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.StringReader;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Iterator;</p>
<p>import javax.servlet.http.HttpServletResponse;<br />
import javax.vecmath.Point2d;</p>
<p>import org.apache.log4j.Logger;<br />
import org.openscience.cdk.Molecule;<br />
import org.openscience.cdk.interfaces.IAtom;<br />
import org.openscience.cdk.interfaces.IMolecule;<br />
import org.openscience.cdk.io.MDLReader;<br />
import org.openscience.cdk.layout.StructureDiagramGenerator;<br />
import org.openscience.cdk.renderer.Renderer2DModel;<br />
import org.openscience.cdk.renderer.SimpleRenderer2D;</p>
<p>public class ImageTypeExporterUtil {<br />
&nbsp;private static final Logger logger = Logger.getLogger(ImageTypeExporterUtil.class);<br />
&nbsp;<br />
&nbsp;/**<br />
&nbsp; * show molecule structure to image type (png, jpeg)<br />
&nbsp; * <br />
&nbsp; * @param mol String molecule stucture<br />
&nbsp; * @param length width and height<br />
&nbsp; * @param response HttpServletResponse object<br />
&nbsp; * @throws Exception<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if occurred exception ,then throw Exception<br />
&nbsp; */<br />
&nbsp;public static void showAsImage(String stucture, Integer length, HttpServletResponse response) throws Exception {<br />
&nbsp;&nbsp;logger.debug("ImageTypeExporterUtil.showAsImage..");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;StringReader mdl = new StringReader(stucture);<br />
&nbsp;&nbsp;MDLReader cdkMDL = new MDLReader(mdl);<br />
&nbsp;&nbsp;Molecule mol = new Molecule();<br />
&nbsp;&nbsp;cdkMDL.read(mol);<br />
&nbsp;&nbsp;// null coordinates<br />
&nbsp;&nbsp;Iterator&lt;IAtom&gt; itatoms = mol.atoms();<br />
&nbsp;&nbsp;while (itatoms.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;IAtom atom = itatoms.next();<br />
&nbsp;&nbsp;&nbsp;atom.setPoint2d(null);<br />
&nbsp;&nbsp;&nbsp;atom.setPoint3d(null);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;// generate 2D coordinates<br />
&nbsp;&nbsp;StructureDiagramGenerator sdg = new StructureDiagramGenerator();<br />
&nbsp;&nbsp;sdg.setMolecule(mol);<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;sdg.generateCoordinates();<br />
&nbsp;&nbsp;} catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;IMolecule layedOutMol = sdg.getMolecule();<br />
&nbsp;&nbsp;// scale molecule<br />
&nbsp;&nbsp;final double UNDEF_POS = 100000;<br />
&nbsp;&nbsp;double minX = UNDEF_POS, minY = UNDEF_POS, maxX = UNDEF_POS, maxY = UNDEF_POS;<br />
&nbsp;&nbsp;itatoms = layedOutMol.atoms();<br />
&nbsp;&nbsp;while (itatoms.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;IAtom atom = itatoms.next();<br />
&nbsp;&nbsp;&nbsp;Point2d point2d = atom.getPoint2d();<br />
&nbsp;&nbsp;&nbsp;if (minX == UNDEF_POS || minX &gt; point2d.x)<br />
&nbsp;&nbsp;&nbsp;&nbsp;minX = point2d.x;<br />
&nbsp;&nbsp;&nbsp;if (minY == UNDEF_POS || minY &gt; point2d.y)<br />
&nbsp;&nbsp;&nbsp;&nbsp;minY = point2d.y;<br />
&nbsp;&nbsp;&nbsp;if (maxX == UNDEF_POS || maxX &lt; point2d.x)<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxX = point2d.x;<br />
&nbsp;&nbsp;&nbsp;if (maxY == UNDEF_POS || maxY &lt; point2d.y)<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxY = point2d.y;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;double scaleX = length / (maxX - minX + 1);<br />
&nbsp;&nbsp;double scaleY = length / (maxY - minY + 1);<br />
&nbsp;&nbsp;double scale = scaleX &gt; scaleY ? scaleY : scaleX;<br />
&nbsp;&nbsp;double centreX = scale * (maxX + minX) / 2.;<br />
&nbsp;&nbsp;double centreY = scale * (maxY + minY) / 2.;<br />
&nbsp;&nbsp;double offsetX = length / 2. - centreX;<br />
&nbsp;&nbsp;double offsetY = length / 2. - centreY;<br />
&nbsp;&nbsp;itatoms = layedOutMol.atoms();<br />
&nbsp;&nbsp;while (itatoms.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;IAtom atom = itatoms.next();<br />
&nbsp;&nbsp;&nbsp;Point2d a = atom.getPoint2d();<br />
&nbsp;&nbsp;&nbsp;Point2d b = new Point2d();<br />
&nbsp;&nbsp;&nbsp;b.x = a.x * scale + offsetX;<br />
&nbsp;&nbsp;&nbsp;b.y = a.y * scale + offsetY;<br />
&nbsp;&nbsp;&nbsp;atom.setPoint2d(b);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;// set rendering properties<br />
&nbsp;&nbsp;Renderer2DModel r2dm = new Renderer2DModel();<br />
&nbsp;&nbsp;r2dm.setDrawNumbers(false);<br />
&nbsp;&nbsp;r2dm.setUseAntiAliasing(true);<br />
&nbsp;&nbsp;r2dm.setColorAtomsByType(true);<br />
&nbsp;&nbsp;r2dm.setShowAtomTypeNames(false);<br />
&nbsp;&nbsp;r2dm.setShowAromaticity(true);<br />
&nbsp;&nbsp;r2dm.setShowImplicitHydrogens(false);<br />
&nbsp;&nbsp;r2dm.setShowReactionBoxes(false);<br />
&nbsp;&nbsp;r2dm.setKekuleStructure(false);<br />
&nbsp;&nbsp;Dimension dim = new Dimension();<br />
&nbsp;&nbsp;dim.setSize(length, length);<br />
&nbsp;&nbsp;r2dm.setBackgroundDimension(dim);<br />
&nbsp;&nbsp;r2dm.setBackColor(java.awt.Color.WHITE);<br />
&nbsp;&nbsp;// render the image<br />
&nbsp;&nbsp;SimpleRenderer2D renderer = new SimpleRenderer2D();<br />
&nbsp;&nbsp;renderer.setRenderer2DModel(r2dm);<br />
&nbsp;&nbsp;BufferedImage bufferedImage = new BufferedImage(length, length,<br />
&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;Graphics2D graphics = bufferedImage.createGraphics();<br />
&nbsp;&nbsp;graphics.setPaint(java.awt.Color.WHITE);<br />
&nbsp;&nbsp;Rectangle2D.Float rectangle = new Rectangle2D.Float(0, 0, length, length);<br />
&nbsp;&nbsp;graphics.fill(rectangle);<br />
&nbsp;&nbsp;renderer.paintMolecule(layedOutMol, graphics);<br />
&nbsp;&nbsp;// write the image to response<br />
&nbsp;&nbsp;response.setContentType("image/png");<br />
&nbsp;&nbsp;OutputStream out = response.getOutputStream();<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;javax.imageio.ImageIO.write(bufferedImage, "png", out);<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/299271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-22 08:51 <a href="http://www.blogjava.net/rain1102/archive/2009/10/22/299271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CDK进行子结构搜索</title><link>http://www.blogjava.net/rain1102/archive/2009/10/20/298919.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 20 Oct 2009 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/20/298919.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/298919.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/20/298919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/298919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/298919.html</trackback:ping><description><![CDATA[CDK提供了通过smiles值进行子结构搜索,&nbsp; org.openscience.cdk.smiles.smarts.SMARTSQueryTool<br />
<p>package com.founder.cdk;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.io.File;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.io.FileNotFoundException;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.io.FileReader;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.util.ArrayList;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.util.List;</p>
<p>import org.openscience.cdk.ChemFile;<br />
import org.openscience.cdk.ChemObject;<br />
import org.openscience.cdk.exception.CDKException;<br />
import org.openscience.cdk.interfaces.IAtomContainer;<br />
import org.openscience.cdk.io.MDLV2000Reader;<br />
import org.openscience.cdk.smiles.smarts.SMARTSQueryTool;<br />
import org.openscience.cdk.tools.manipulator.ChemFileManipulator;</p>
<p>public class SMARTSQueryToolTest {</p>
<p>&nbsp;static SMARTSQueryTool sqt;static {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqt = new <span style="color: #008000">SMARTSQueryTool</span>("c2ccc1ccccc1c2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (CDKException e) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;String filename = "H:\\molecules.sdf";<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MDLV2000Reader reader = new MDLV2000Reader(new FileReader(new File(filename)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ChemFile chemFile = (ChemFile) reader.read((ChemObject) new ChemFile());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;IAtomContainer&gt; containersList = ChemFileManipulator.getAllAtomContainers(chemFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;IAtomContainer&gt; substructureList = new ArrayList&lt;IAtomContainer&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">sqt.setSmarts("c1ccc3c(c1)ccc4c2ccccc2ccc34");&nbsp;</span> //重新设置匹配的smiles值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean matched = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (IAtomContainer molecule : containersList) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">matched = sqt.matches(molecule);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (matched){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;substructureList.add(molecule);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(substructureList.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (IAtomContainer molecule : substructureList) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(molecule.getProperty("ID"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (CDKException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>}<br />
<br />
通过测试, matches方法速度很慢, 一般一个结构需要200ms-1000ms左右.<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/298919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-20 08:33 <a href="http://www.blogjava.net/rain1102/archive/2009/10/20/298919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CDK解析SDF文件</title><link>http://www.blogjava.net/rain1102/archive/2009/10/19/298802.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 19 Oct 2009 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/19/298802.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/298802.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/19/298802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/298802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/298802.html</trackback:ping><description><![CDATA[<p>package com.founder.cdk;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.File;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.FileNotFoundException;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.FileReader;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.List;</p>
<p>import org.openscience.cdk.ChemFile;<br />
import org.openscience.cdk.ChemObject;<br />
import org.openscience.cdk.Molecule;<br />
import org.openscience.cdk.exception.CDKException;<br />
import org.openscience.cdk.interfaces.IAtomContainer;<br />
import org.openscience.cdk.io.MDLReader;<br />
import org.openscience.cdk.io.MDLV2000Reader;<br />
import org.openscience.cdk.tools.manipulator.ChemFileManipulator;</p>
<p>public class ReadSDFTest {</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; * @throws CDKException <br />
&nbsp; * @throws FileNotFoundException <br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) throws CDKException, FileNotFoundException {<br />
&nbsp;&nbsp;String filename = "H:\\molecules.sdf";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<span style="color: #008000">//&nbsp;&nbsp;InputStream ins = ReadSDFTest.class.getClassLoader().getResourceAsStream(filename);<br />
//&nbsp;&nbsp;MDLReader reader = new MDLReader(ins);</span></p>
<p>&nbsp;&nbsp; //alternatively, you can specify a file directly<br />
&nbsp;&nbsp; <span style="color: #008000">MDLV2000Reader reader = new MDLV2000Reader(new FileReader(new File(filename)));</span></p>
<p>&nbsp;&nbsp;<span style="color: #008000">ChemFile chemFile = (ChemFile)reader.read((ChemObject)new ChemFile());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;List&lt;IAtomContainer&gt; containersList = ChemFileManipulator.getAllAtomContainers(chemFile);<br />
</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;Molecule molecule = null;<br />
&nbsp;&nbsp;for (IAtomContainer mol : containersList) {<br />
&nbsp;&nbsp;&nbsp;molecule = (Molecule) mol;<br />
&nbsp;&nbsp;&nbsp;System.out.println(molecule.getProperties());<br />
&nbsp;&nbsp;&nbsp;System.out.println(molecule.getProperty("CD_MOLWEIGHT"));<br />
//&nbsp;&nbsp;&nbsp;Fingerprinter fp = new Fingerprinter();<br />
//&nbsp;&nbsp;&nbsp;BitSet bt = fp.getFingerprint(molecule);<br />
//&nbsp;&nbsp;&nbsp;System.out.println(bt);<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>}<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/298802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-19 09:45 <a href="http://www.blogjava.net/rain1102/archive/2009/10/19/298802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CDK进行相似度搜索</title><link>http://www.blogjava.net/rain1102/archive/2009/10/19/298801.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 19 Oct 2009 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/19/298801.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/298801.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/19/298801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/298801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/298801.html</trackback:ping><description><![CDATA[<p>package com.founder.cdk;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.io.StringReader;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.sql.Connection;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.sql.ResultSet;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.sql.SQLException;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.util.ArrayList;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.util.BitSet;<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.util.List;</p>
<p>import org.openscience.cdk.Molecule;<br />
import org.openscience.cdk.exception.CDKException;<br />
import org.openscience.cdk.fingerprint.Fingerprinter;<br />
import org.openscience.cdk.io.MDLReader;<br />
import org.openscience.cdk.similarity.Tanimoto;</p>
<p>public class CDKTest {</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;// MySQL<br />
&nbsp;&nbsp;long t1 = System.currentTimeMillis();<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver").newInstance();<br />
&nbsp;&nbsp;&nbsp;Connection con = <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.sql.DriverManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getConnection(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"jdbc:mysql://localhost/coocoo?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"root", "root");<br />
&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;ResultSet results = null;<br />
&nbsp;&nbsp;&nbsp;String querySQL = "select id, structure from structure ";<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;results = con.createStatement().executeQuery(querySQL);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;// dump out the results</p>
<p>&nbsp;&nbsp;&nbsp;List&lt;Molecule&gt; list = new ArrayList&lt;Molecule&gt;();<br />
&nbsp;&nbsp;&nbsp;Fingerprinter fp = new Fingerprinter();<br />
&nbsp;&nbsp;&nbsp;BitSet bt = null;<br />
&nbsp;&nbsp;&nbsp;while (results.next()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;Long id = results.getLong("id");<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//根据结构数据生成分子对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">StringReader mdl = new StringReader(results.getString("structure"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;MDLReader cdkMDL = new MDLReader(mdl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Molecule molecule = new Molecule();<br />
&nbsp;&nbsp;&nbsp;&nbsp;cdkMDL.read(molecule);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;if (id == 1220) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt = fp.getFingerprint(molecule);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;list.add(molecule);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;System.out.println("size:=" + list.size());<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;List&lt;Molecule&gt; resultList = new ArrayList&lt;Molecule&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long t2 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Thread: collection data in " + (t2 - t1) + " ms.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Molecule molecule : list) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">float coefficient = Tanimoto.calculate(fp.getFingerprint(molecule), bt);&nbsp; //计算相似度<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (coefficient &gt; 0.9) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;resultList.add(molecule);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (CDKException e) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long t3 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(resultList.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Thread: Search in " + (t3 - t2) + " ms.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;con.close();<br />
&nbsp;&nbsp;} catch (InstantiationException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (IllegalAccessException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (ClassNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (CDKException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;long t4 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Thread: all in " + (t4 - t1) + " ms.");<br />
&nbsp;}</p>
<p>}<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/298801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-19 09:37 <a href="http://www.blogjava.net/rain1102/archive/2009/10/19/298801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Faster Fingerprint Search with Java &amp; CDK</title><link>http://www.blogjava.net/rain1102/archive/2009/10/18/298745.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 18 Oct 2009 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/18/298745.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/298745.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/18/298745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/298745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/298745.html</trackback:ping><description><![CDATA[原文来自:http://chemhack.com/cn/2008/11/faster-fingerprint-search-with-java-cdk/<br />
<p><a href="http://depth-first.com/" jquery1255846148312="3">Rich Apodaca</a>&nbsp;wrote a great serious posts named <em>Fast Substructure Search Using Open Source Tools</em>&nbsp;providing details on substructure search with MySQL. But, however, poor binary data operation functions of MySQL limited the&nbsp;implementation&nbsp;of similar structure search which typically depends on the calculation of&nbsp;Tanimato&nbsp;coefficient. We are going to use <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a> &amp; CDK to add this feature.</p>
<p>As default output of CDK fingerprint, <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/BitSet.html" jquery1255846148312="4">java.util.BitSet</a>&nbsp;with&nbsp;<a title="interface in java.io" href="http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html" jquery1255846148312="5">Serializable</a>&nbsp;interface is perfect data format of fingerprint data storage. <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a> itself provides several collections such as <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html" jquery1255846148312="6">ArrayList</a>, <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html" jquery1255846148312="7">LinkedList</a>, <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Vector.html" jquery1255846148312="8">Vector</a> class in package <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.util. To provide web access to the search engine, thread unsafe ArrayList and LinkedList have to be kicked out. How about Vector? Once all the fingerprint data is well prepared, the&nbsp;collection &nbsp;function we need to do&nbsp;similarity search is just iteration. No add, no delete. So, a light weight array is enough.</p>
<p>Most of the molecule information is stored in MySQL database, so we are going to map fingerprint to&nbsp;corresponding&nbsp;row in&nbsp;data table. Here is the MolDFData class, we use a long variable to store&nbsp;corresponding primary key in data table.</p>
<pre lang="java"><span style="color: #008000">public class MolDFData implements Serializable {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long id;<br />
&nbsp;&nbsp;&nbsp;private BitSet fingerprint;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public MolDFData(long id, BitSet fingerprint) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.id = id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fingerprint = fingerprint;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;public long getId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setId(long id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.id = id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;public BitSet getFingerprint() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fingerprint;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setFingerprint(BitSet fingerprint) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fingerprint = fingerprint;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></pre>
<p>This is how we storage our fingerprints.</p>
<pre lang="java">private MolFPData[] arrayData;</pre>
<p>No big deal with similarity search. Just calculate the&nbsp;Tanimoto&nbsp;coefficient, if it&#8217;s bigger than&nbsp;minimal&nbsp;&nbsp;similarity you set, add this one into result.</p>
<pre lang="java">    <span style="color: #008000">public List searchTanimoto(BitSet bt, float minSimlarity) {<br />
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List resultList = new LinkedList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; arrayData.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MolDFData aListData = arrayData[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float coefficient = Tanimoto.calculate(aListData.getFingerprint(), bt);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (coefficient &gt; minSimlarity) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultList.add(new SearchResultData(aListData.getId(), coefficient));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (CDKException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collections.sort(resultList);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return resultList;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span>Pretty&nbsp;ugly&nbsp;code? &nbsp;Maybe. But it really works, at a acceptable speed.</p>
<p>Tests were done using the code blow on a macbook(Intel Core Due 1.83 GHz, 2G RAM).<span style="line-height: 18px; font-family: 'Courier New'; white-space: pre"> </span></p>
<pre lang="java">long t3 = System.currentTimeMillis();
List&lt;SearchResultData&gt; listResult = se.searchTanimoto(bs, 0.8f);
long t4 = System.currentTimeMillis();
System.out.println("Thread: Search done in " + (t4 - t3) + " ms.");</pre>
<p>In my database of&nbsp;87364&nbsp;commercial&nbsp;compounds, it takes 335 ms.</p><img src ="http://www.blogjava.net/rain1102/aggbug/298745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-18 14:09 <a href="http://www.blogjava.net/rain1102/archive/2009/10/18/298745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CDK中的相似度搜索</title><link>http://www.blogjava.net/rain1102/archive/2009/10/18/298744.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 18 Oct 2009 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/10/18/298744.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/298744.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/10/18/298744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/298744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/298744.html</trackback:ping><description><![CDATA[<p>/*&nbsp; $RCSfile$<br />
&nbsp;*&nbsp; $Author$<br />
&nbsp;*&nbsp; $Date$<br />
&nbsp;*&nbsp; $Revision$<br />
&nbsp;*<br />
&nbsp;*&nbsp; Copyright (C) 1997-2007&nbsp; The Chemistry Development Kit (CDK) project<br />
&nbsp;*<br />
&nbsp;*&nbsp; Contact: cdk-devel@lists.sourceforge.net<br />
&nbsp;*<br />
&nbsp;*&nbsp; This program is free software; you can redistribute it and/or<br />
&nbsp;*&nbsp; modify it under the terms of the GNU Lesser General Public License<br />
&nbsp;*&nbsp; as published by the Free Software Foundation; either version 2.1<br />
&nbsp;*&nbsp; of the License, or (at your option) any later version.<br />
&nbsp;*&nbsp; All we ask is that proper credit is given for our work, which includes<br />
&nbsp;*&nbsp; - but is not limited to - adding the above copyright notice to the beginning<br />
&nbsp;*&nbsp; of your source code files, and to any copyright notice that you may distribute<br />
&nbsp;*&nbsp; with programs based on this work.<br />
&nbsp;*<br />
&nbsp;*&nbsp; This program is distributed in the hope that it will be useful,<br />
&nbsp;*&nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of<br />
&nbsp;*&nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the<br />
&nbsp;*&nbsp; GNU Lesser General Public License for more details.<br />
&nbsp;*<br />
&nbsp;*&nbsp; You should have received a copy of the GNU Lesser General Public License<br />
&nbsp;*&nbsp; along with this program; if not, write to the Free Software<br />
&nbsp;*&nbsp; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.<br />
&nbsp;*<br />
&nbsp;*/<br />
package org.openscience.cdk.similarity;</p>
<p><br />
import org.openscience.cdk.annotations.TestClass;<br />
import org.openscience.cdk.annotations.TestMethod;<br />
import org.openscience.cdk.exception.CDKException;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.BitSet;</p>
<p>/**<br />
&nbsp;*&nbsp; Calculates the Tanimoto coefficient for a given pair of two <br />
&nbsp;*&nbsp; fingerprint bitsets or real valued feature vectors.<br />
&nbsp;*<br />
&nbsp;*&nbsp; The Tanimoto coefficient is one way to <br />
&nbsp;*&nbsp; quantitatively measure the "distance" or similarity of <br />
&nbsp;*&nbsp; two chemical structures. <br />
&nbsp;*<br />
&nbsp;*&nbsp; &lt;p&gt;You can use the FingerPrinter class to retrieve two fingerprint bitsets.<br />
&nbsp;*&nbsp; We assume that you have two structures stored in cdk.Molecule objects.<br />
&nbsp;*&nbsp; A tanimoto coefficient can then be calculated like:<br />
&nbsp;*&nbsp; &lt;pre&gt;<br />
&nbsp;*&nbsp;&nbsp; BitSet fingerprint1 = Fingerprinter.getFingerprint(molecule1);<br />
&nbsp;*&nbsp;&nbsp; BitSet fingerprint2 = Fingerprinter.getFingerprint(molecule2);<br />
&nbsp;*&nbsp;&nbsp; float tanimoto_coefficient = Tanimoto.calculate(fingerprint1, fingerprint2);<br />
&nbsp;*&nbsp; &lt;/pre&gt;<br />
&nbsp;*<br />
&nbsp;*&nbsp; &lt;p&gt;The FingerPrinter assumes that hydrogens are explicitely given, if this <br />
&nbsp;*&nbsp; is desired! <br />
&nbsp;*&nbsp; &lt;p&gt;Note that the continuous Tanimoto coefficient does not lead to a metric space<br />
&nbsp;*<br />
&nbsp;*@author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; steinbeck<br />
&nbsp;* @cdk.githash<br />
&nbsp;*@cdk.created&nbsp;&nbsp;&nbsp; 2005-10-19<br />
&nbsp;*@cdk.keyword&nbsp;&nbsp;&nbsp; jaccard<br />
&nbsp;*@cdk.keyword&nbsp;&nbsp;&nbsp; similarity, tanimoto<br />
&nbsp;* @cdk.module fingerprint<br />
&nbsp;*/<br />
@TestClass("org.openscience.cdk.similarity.TanimotoTest")<br />
public class Tanimoto <br />
{</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Evaluates Tanimoto coefficient for two bit sets.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param bitset1 A bitset (such as a fingerprint) for the first molecule<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param bitset2 A bitset (such as a fingerprint) for the second molecule<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return The Tanimoto coefficient<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws org.openscience.cdk.exception.CDKException&nbsp; if bitsets are not of the same length<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; @TestMethod("testTanimoto1,testTanimoto2")<br />
&nbsp;&nbsp;&nbsp; public static float <span style="color: red">calculate</span>(BitSet bitset1, BitSet bitset2) throws CDKException<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float _bitset1_cardinality = bitset1.cardinality();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float _bitset2_cardinality = bitset2.cardinality();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bitset1.size() != bitset2.size()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new CDKException("Bisets must have the same bit length");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BitSet one_and_two = (BitSet)bitset1.clone();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; one_and_two.and(bitset2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float _common_bit_count = one_and_two.cardinality();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _common_bit_count/(_bitset1_cardinality + _bitset2_cardinality - _common_bit_count);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Evaluates the continuous Tanimoto coefficient for two real valued vectors.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param features1 The first feature vector<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param features2 The second feature vector<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return The continuous Tanimoto coefficient<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws org.openscience.cdk.exception.CDKException&nbsp; if the features are not of the same length<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; @TestMethod("testTanimoto3")<br />
&nbsp;&nbsp;&nbsp; public static float <span style="color: red">calculate</span>(double[] features1, double[] features2) throws CDKException {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (features1.length != features2.length) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new CDKException("Features vectors must be of the same length");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = features1.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double ab = 0.0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double a2 = 0.0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double b2 = 0.0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; n; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ab += features1[i] * features2[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a2 += features1[i]*features1[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b2 += features2[i]*features2[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (float)ab/(float)(a2+b2-ab);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
通过源码可以看出<span style="color: red">calculate</span>(BitSet bitset1, BitSet bitset2)方法,是通过比较两个分子的fingerprint的位,来计算相似度.通过BitSet的and操作得到共同的个数,然后在除以总共为true的个数,这样就得到相似值.</p><img src ="http://www.blogjava.net/rain1102/aggbug/298744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-10-18 13:36 <a href="http://www.blogjava.net/rain1102/archive/2009/10/18/298744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>